ZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGVsZXBob255L3JpbC5oIGIvaW5jbHVkZS90ZWxlcGhvbnkvcmlsLmgKaW5kZXggOWNiYjc1YS4uZTdlMmZiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90ZWxlcGhvbnkvcmlsLmgKKysrIGIvaW5jbHVkZS90ZWxlcGhvbnkvcmlsLmgKQEAgLTE0LDIwICsxNCw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0gLyogSVNTVUVTOgotICogLSBTTVMgcmV0cmFuc21pdCAoc3BlY2lmeWluZyBUUC1NZXNzYWdlLUlEKQotICoKLSAqLwotCi0vKioKLSAqIFRPRE8KLSAqCi0gKiBTdXBwIFNlcnZpY2UgTm90aWZpY2F0aW9uICgrQ1NTTikKLSAqIEdQUlMgUERQIGNvbnRleHQgZGVhY3RpdmF0ZSBub3RpZmljYXRpb24KLSAqCi0gKi8KLQotCiAjaWZuZGVmIEFORFJPSURfUklMX0gKICNkZWZpbmUgQU5EUk9JRF9SSUxfSCAxCiAKQEAgLTQwLDcgKzI2LDggQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNkZWZpbmUgUklMX1ZFUlNJT04gNAorI2RlZmluZSBSSUxfVkVSU0lPTiA2ICAgICAvKiBDdXJyZW50IHZlcnNpb24gKi8KKyNkZWZpbmUgUklMX1ZFUlNJT05fTUlOIDIgLyogTWluaW11bSBSSUxfVkVSU0lPTiBzdXBwb3J0ZWQgKi8KIAogI2RlZmluZSBDRE1BX0FMUEhBX0lORk9fQlVGRkVSX0xFTkdUSCA2NAogI2RlZmluZSBDRE1BX05VTUJFUl9JTkZPX0JVRkZFUl9MRU5HVEggODEKQEAgLTk2LDYgKzgzLDQ4IEBACiAgICAgUkFESU9fU1RBVEVfTlZfUkVBRFkgPSA5ICAgICAgICAgICAgICAgLyogUmFkaW8gaXMgb24gYW5kIHRoZSBOViBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlICovCiB9IFJJTF9SYWRpb1N0YXRlOwogCit0eXBlZGVmIGVudW0geworICAgIFJBRElPX1RFQ0hfVU5LTk9XTiA9IDAsCisgICAgUkFESU9fVEVDSF9HUFJTID0gMSwKKyAgICBSQURJT19URUNIX0VER0UgPSAyLAorICAgIFJBRElPX1RFQ0hfVU1UUyA9IDMsCisgICAgUkFESU9fVEVDSF9JUzk1QSA9IDQsCisgICAgUkFESU9fVEVDSF9JUzk1QiA9IDUsCisgICAgUkFESU9fVEVDSF8xeFJUVCA9ICA2LAorICAgIFJBRElPX1RFQ0hfRVZET18wID0gNywKKyAgICBSQURJT19URUNIX0VWRE9fQSA9IDgsCisgICAgUkFESU9fVEVDSF9IU0RQQSA9IDksCisgICAgUkFESU9fVEVDSF9IU1VQQSA9IDEwLAorICAgIFJBRElPX1RFQ0hfSFNQQSA9IDExLAorICAgIFJBRElPX1RFQ0hfRVZET19CID0gMTIsCisgICAgUkFESU9fVEVDSF9FSFJQRCA9IDEzLAorICAgIFJBRElPX1RFQ0hfTFRFID0gMTQsCisgICAgUkFESU9fVEVDSF9IU1BBUCA9IDE1IC8vIEhTUEErCit9IFJJTF9SYWRpb1RlY2hub2xvZ3k7CisKKy8vIERvIHdlIHdhbnQgdG8gc3BsaXQgRGF0YSBmcm9tIFZvaWNlIGFuZCB0aGUgdXNlCisvLyBSSUxfUmFkaW9UZWNobm9sb2d5IGZvciBnZXQvc2V0UHJlZmVycmVkVm9pY2UvRGF0YSA/Cit0eXBlZGVmIGVudW0geworICAgIFBSRUZfTkVUX1RZUEVfR1NNX1dDRE1BICAgICAgICAgICAgICAgID0gMCwgLyogR1NNL1dDRE1BIChXQ0RNQSBwcmVmZXJyZWQpICovCisgICAgUFJFRl9ORVRfVFlQRV9HU01fT05MWSAgICAgICAgICAgICAgICAgPSAxLCAvKiBHU00gb25seSAqLworICAgIFBSRUZfTkVUX1RZUEVfV0NETUEgICAgICAgICAgICAgICAgICAgID0gMiwgLyogV0NETUEgICovCisgICAgUFJFRl9ORVRfVFlQRV9HU01fV0NETUFfQVVUTyAgICAgICAgICAgPSAzLCAvKiBHU00vV0NETUEgKGF1dG8gbW9kZSwgYWNjb3JkaW5nIHRvIFBSTCkgKi8KKyAgICBQUkVGX05FVF9UWVBFX0NETUFfRVZET19BVVRPICAgICAgICAgICA9IDQsIC8qIENETUEgYW5kIEV2RG8gKGF1dG8gbW9kZSwgYWNjb3JkaW5nIHRvIFBSTCkgKi8KKyAgICBQUkVGX05FVF9UWVBFX0NETUFfT05MWSAgICAgICAgICAgICAgICA9IDUsIC8qIENETUEgb25seSAqLworICAgIFBSRUZfTkVUX1RZUEVfRVZET19PTkxZICAgICAgICAgICAgICAgID0gNiwgLyogRXZEbyBvbmx5ICovCisgICAgUFJFRl9ORVRfVFlQRV9HU01fV0NETUFfQ0RNQV9FVkRPX0FVVE8gPSA3LCAvKiBHU00vV0NETUEsIENETUEsIGFuZCBFdkRvIChhdXRvIG1vZGUsIGFjY29yZGluZyB0byBQUkwpICovCisgICAgUFJFRl9ORVRfVFlQRV9MVEVfQ0RNQV9FVkRPICAgICAgICAgICAgPSA4LCAvKiBMVEUsIENETUEgYW5kIEV2RG8gKi8KKyAgICBQUkVGX05FVF9UWVBFX0xURV9HU01fV0NETUEgICAgICAgICAgICA9IDksIC8qIExURSwgR1NNL1dDRE1BICovCisgICAgUFJFRl9ORVRfVFlQRV9MVEVfQ01EQV9FVkRPX0dTTV9XQ0RNQSAgPSAxMCwgLyogTFRFLCBDRE1BLCBFdkRvLCBHU00vV0NETUEgKi8KKyAgICBQUkVGX05FVF9UWVBFX0xURV9PTkxZICAgICAgICAgICAgICAgICA9IDExICAvKiBMVEUgb25seSAqLworfSBSSUxfUHJlZmVycmVkTmV0d29ya1R5cGU7CisKKy8qIFNvdXJjZSBmb3IgY2RtYSBzdWJzY3JpcHRpb24gKi8KK3R5cGVkZWYgZW51bSB7CisgICBDRE1BX1NVQlNDUklQVElPTl9TT1VSQ0VfUlVJTV9TSU0gPSAwLAorICAgQ0RNQV9TVUJTQ1JJUFRJT05fU09VUkNFX05WID0gMQorfSBSSUxfQ2RtYVN1YnNjcmlwdGlvblNvdXJjZTsKKwogLyogVXNlci10by1Vc2VyIHNpZ25hbGluZyBJbmZvIGFjdGl2YXRpb24gdHlwZXMgZGVyaXZlZCBmcm9tIDNHUFAgMjMuMDg3IHY4LjAgKi8KIHR5cGVkZWYgZW51bSB7CiAgICAgUklMX1VVU19UWVBFMV9JTVBMSUNJVCA9IDAsCkBAIC0xNTQsMTUgKzE4Myw0MyBAQAogICAgIFJJTF9VVVNfSW5mbyAqICB1dXNJbmZvOyAgICAvKiBOVUxMIG9yIFBvaW50ZXIgdG8gVXNlci1Vc2VyIFNpZ25hbGluZyBJbmZvcm1hdGlvbiAqLwogfSBSSUxfQ2FsbDsKIAorLyogRGVwcmVjYXRlZCwgdXNlIFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjYgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgICAgICAgICAgICAgY2lkOyAgICAgICAgLyogQ29udGV4dCBJRCAqLworICAgIGludCAgICAgICAgICAgICBjaWQ7ICAgICAgICAvKiBDb250ZXh0IElELCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2FsbCAqLwogICAgIGludCAgICAgICAgICAgICBhY3RpdmU7ICAgICAvKiAwPWluYWN0aXZlLCAxPWFjdGl2ZS9waHlzaWNhbCBsaW5rIGRvd24sIDI9YWN0aXZlL3BoeXNpY2FsIGxpbmsgdXAgKi8KICAgICBjaGFyICogICAgICAgICAgdHlwZTsgICAgICAgLyogT25lIG9mIHRoZSBQRFBfdHlwZSB2YWx1ZXMgaW4gVFMgMjcuMDA3IHNlY3Rpb24gMTAuMS4xLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgIklQIiwgIklQVjYiLCAiSVBWNFY2Iiwgb3IgIlBQUCIuICovCi0gICAgY2hhciAqICAgICAgICAgIGFwbjsKLSAgICBjaGFyICogICAgICAgICAgYWRkcmVzczsgICAgLyogVGhlIElQdjQgb3IgSVB2NiBhZGRyZXNzIGFzc2lnbmVkIHRvIHRoZSBjYWxsLCBlLmcuLCAiMTkyLjAuMS4zIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAiMjAwMTpkYjg6OjEiLiAqLwotfSBSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlOworICAgIGNoYXIgKiAgICAgICAgICBhcG47ICAgICAgICAvKiBpZ25vcmVkICovCisgICAgY2hhciAqICAgICAgICAgIGFkZHJlc3M7ICAgIC8qIEFuIGFkZHJlc3MsIGUuZy4sICIxOTIuMC4xLjMiIG9yICIyMDAxOmRiODo6MSIuICovCit9IFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjQ7CisKKy8qCisgKiBSZXR1cm5lZCBieSBSSUxfUkVRVUVTVF9TRVRVUF9EQVRBX0NBTEwsIFJJTF9SRVFVRVNUX0RBVEFfQ0FMTF9MSVNUCisgKiBhbmQgUklMX1VOU09MX0RBVEFfQ0FMTF9MSVNUX0NIQU5HRUQsIG9uIGVycm9yIHN0YXR1cyAhPSAwLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgIHN0YXR1czsgICAgIC8qIEEgUklMX0RhdGFDYWxsRmFpbENhdXNlLCAwIHdoaWNoIGlzIFBEUF9GQUlMX05PTkUgaWYgbm8gZXJyb3IgKi8KKyAgICBpbnQgICAgICAgICAgICAgY2lkOyAgICAgICAgLyogQ29udGV4dCBJRCwgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNhbGwgKi8KKyAgICBpbnQgICAgICAgICAgICAgYWN0aXZlOyAgICAgLyogMD1pbmFjdGl2ZSwgMT1hY3RpdmUvcGh5c2ljYWwgbGluayBkb3duLCAyPWFjdGl2ZS9waHlzaWNhbCBsaW5rIHVwICovCisgICAgY2hhciAqICAgICAgICAgIHR5cGU7ICAgICAgIC8qIE9uZSBvZiB0aGUgUERQX3R5cGUgdmFsdWVzIGluIFRTIDI3LjAwNyBzZWN0aW9uIDEwLjEuMS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsICJJUCIsICJJUFY2IiwgIklQVjRWNiIsIG9yICJQUFAiLiBJZiBzdGF0dXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERQX0ZBSUxfT05MWV9TSU5HTEVfQkVBUkVSX0FMTE9XRUQgdGhpcyBpcyB0aGUgdHlwZSBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyAiSVAiIG9yICJJUFY2IiAqLworICAgIGNoYXIgKiAgICAgICAgICBpZm5hbWU7ICAgICAvKiBUaGUgbmV0d29yayBpbnRlcmZhY2UgbmFtZSAqLworICAgIGNoYXIgKiAgICAgICAgICBhZGRyZXNzZXM7ICAvKiBBIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIGFkZHJlc3NlcyB3aXRoIG9wdGlvbmFsICIvIiBwcmVmaXggbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuLCAiMTkyLjAuMS4zIiBvciAiMTkyLjAuMS4xMS8xNiAyMDAxOmRiODo6MS82NCIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heSBub3QgYmUgZW1wdHksIHR5cGljYWxseSAxIElQdjQgb3IgMSBJUHY2IG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBvZiBlYWNoLiBJZiB0aGUgcHJlZml4IGxlbmd0aCBpcyBhYnNlbnQgdGhlIGFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXNzdW1lZCB0byBiZSBwb2ludCB0byBwb2ludCB3aXRoIElQdjQgaGF2aW5nIGEgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBvZiAzMiBhbmQgSVB2NiAxMjguICovCisgICAgY2hhciAqICAgICAgICAgIGRuc2VzOyAgICAgIC8qIEEgc3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgRE5TIHNlcnZlciBhZGRyZXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4sICIxOTIuMC4xLjMiIG9yICIxOTIuMC4xLjExIDIwMDE6ZGI4OjoxIi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF5IGJlIGVtcHR5LiAqLworICAgIGNoYXIgKiAgICAgICAgICBnYXRld2F5czsgICAvKiBBIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIGRlZmF1bHQgZ2F0ZXdheSBhZGRyZXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4sICIxOTIuMC4xLjMiIG9yICIxOTIuMC4xLjExIDIwMDE6ZGI4OjoxIi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF5IGJlIGVtcHR5IGluIHdoaWNoIGNhc2UgdGhlIGFkZHJlc3NlcyByZXByZXNlbnQgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcG9pbnQgY29ubmVjdGlvbnMuICovCit9IFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjY7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBpbnQgbWVzc2FnZVJlZjsgICAvKiBUUC1NZXNzYWdlLVJlZmVyZW5jZSBmb3IgR1NNLApAQCAtMjExLDcgKzI2OCwyMiBAQAogICAgIGludCBwMzsKICAgICBjaGFyICpkYXRhOyAgICAgLyogTWF5IGJlIE5VTEwqLwogICAgIGNoYXIgKnBpbjI7ICAgICAvKiBNYXkgYmUgTlVMTCovCi19IFJJTF9TSU1fSU87Cit9IFJJTF9TSU1fSU9fdjU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY29tbWFuZDsgICAgLyogb25lIG9mIHRoZSBjb21tYW5kcyBsaXN0ZWQgZm9yIFRTIDI3LjAwNyArQ1JTTSovCisgICAgaW50IGZpbGVpZDsgICAgIC8qIEVGIGlkICovCisgICAgY2hhciAqcGF0aDsgICAgIC8qICJwYXRoaWQiIGZyb20gVFMgMjcuMDA3ICtDUlNNIGNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgICAgIFBhdGggaXMgaW4gaGV4IGFzY2lpaSBmb3JtYXQgZWcgIjdmMjA1ZjcwIgorICAgICAgICAgICAgICAgICAgICAgICBQYXRoIG11c3QgYWx3YXlzIGJlIHByb3ZpZGVkLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgcDE7CisgICAgaW50IHAyOworICAgIGludCBwMzsKKyAgICBjaGFyICpkYXRhOyAgICAgLyogTWF5IGJlIE5VTEwqLworICAgIGNoYXIgKnBpbjI7ICAgICAvKiBNYXkgYmUgTlVMTCovCisgICAgY2hhciAqYWlkUHRyOyAgIC8qIEFJRCB2YWx1ZSwgU2VlIEVUU0kgMTAyLjIyMSA4LjEgYW5kIDEwMS4yMjAgNCwgTlVMTCBpZiBubyB2YWx1ZS4gKi8KK30gUklMX1NJTV9JT192NjsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGludCBzdzE7CkBAIC0yODUsNiArMzU3LDE0IEBACiAKIC8qIFNlZSBSSUxfUkVRVUVTVF9MQVNUX0RBVEFfQ0FMTF9GQUlMX0NBVVNFICovCiB0eXBlZGVmIGVudW0geworICAgIFBEUF9GQUlMX05PTkUgPSAwLCAvKiBObyBlcnJvciwgY29ubmVjdGlvbiBvayAqLworCisgICAgLyogYW4gaW50ZWdlciBjYXVzZSBjb2RlIGRlZmluZWQgaW4gVFMgMjQuMDA4CisgICAgICAgc2VjdGlvbiA2LjEuMy4xLjMgb3IgVFMgMjQuMzAxIFJlbGVhc2UgOCsgQW5uZXggQi4KKyAgICAgICBJZiB0aGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGV4YWN0IGNhdXNlIGNvZGVzLAorICAgICAgIHRoZW4gaXQgc2hvdWxkIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMsCisgICAgICAgYXMgdGhlIFVJIGxheWVyIG5lZWRzIHRvIGRpc3Rpbmd1aXNoIHRoZXNlCisgICAgICAgY2FzZXMgZm9yIGVycm9yIG5vdGlmaWNhdGlvbiBhbmQgcG90ZW50aWFsIHJldHJpZXMuICovCiAgICAgUERQX0ZBSUxfT1BFUkFUT1JfQkFSUkVEID0gMHgwOCwgICAgICAgICAgICAgICAvKiBubyByZXRyeSAqLwogICAgIFBEUF9GQUlMX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgPSAweDFBLAogICAgIFBEUF9GQUlMX01JU1NJTkdfVUtOT1dOX0FQTiA9IDB4MUIsICAgICAgICAgICAgLyogbm8gcmV0cnkgKi8KQEAgLTI5NSwxMyArMzc1LDI4IEBACiAgICAgUERQX0ZBSUxfU0VSVklDRV9PUFRJT05fTk9UX1NVUFBPUlRFRCA9IDB4MjAsICAvKiBubyByZXRyeSAqLwogICAgIFBEUF9GQUlMX1NFUlZJQ0VfT1BUSU9OX05PVF9TVUJTQ1JJQkVEID0gMHgyMSwgLyogbm8gcmV0cnkgKi8KICAgICBQRFBfRkFJTF9TRVJWSUNFX09QVElPTl9PVVRfT0ZfT1JERVIgPSAweDIyLAotICAgIFBEUF9GQUlMX05TQVBJX0lOX1VTRSAgICAgID0gMHgyMywgICAgICAgICAgICAgLyogbm8gcmV0cnkgKi8KKyAgICBQRFBfRkFJTF9OU0FQSV9JTl9VU0UgPSAweDIzLCAgICAgICAgICAgICAgICAgIC8qIG5vIHJldHJ5ICovCisgICAgUERQX0ZBSUxfT05MWV9JUFY0X0FMTE9XRUQgPSAweDMyLCAgICAgICAgICAgICAvKiBubyByZXRyeSAqLworICAgIFBEUF9GQUlMX09OTFlfSVBWNl9BTExPV0VEID0gMHgzMywgICAgICAgICAgICAgLyogbm8gcmV0cnkgKi8KKyAgICBQRFBfRkFJTF9PTkxZX1NJTkdMRV9CRUFSRVJfQUxMT1dFRCA9IDB4MzQsCiAgICAgUERQX0ZBSUxfUFJPVE9DT0xfRVJST1JTICAgPSAweDZGLCAgICAgICAgICAgICAvKiBubyByZXRyeSAqLwotICAgIFBEUF9GQUlMX0VSUk9SX1VOU1BFQ0lGSUVEID0gMHhmZmZmLCAgLyogVGhpcyBhbmQgYWxsIG90aGVyIGNhc2VzOiByZXRyeSBzaWxlbnRseSAqLworCiAgICAgLyogTm90IG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiAqLwotICAgIFBEUF9GQUlMX1JFR0lTVFJBVElPTl9GQUlMID0gLTEsCi0gICAgUERQX0ZBSUxfR1BSU19SRUdJU1RSQVRJT05fRkFJTCA9IC0yLAotfSBSSUxfTGFzdERhdGFDYWxsQWN0aXZhdGVGYWlsQ2F1c2U7CisgICAgUERQX0ZBSUxfVk9JQ0VfUkVHSVNUUkFUSU9OX0ZBSUwgPSAtMSwKKyAgICBQRFBfRkFJTF9EQVRBX1JFR0lTVFJBVElPTl9GQUlMID0gLTIsCisKKyAgIC8qIHJlYXNvbnMgZm9yIGRhdGEgY2FsbCBkcm9wIC0gbmV0d29yay9tb2RlbSBkaXNjb25uZWN0ICovCisgICAgUERQX0ZBSUxfU0lHTkFMX0xPU1QgPSAtMywgICAgICAgICAgICAvKiBubyByZXRyeSAqLworICAgIFBEUF9GQUlMX1BSRUZfUkFESU9fVEVDSF9DSEFOR0VEID0gLTQsLyogcHJlZmVycmVkIHRlY2hub2xvZ3kgaGFzIGNoYW5nZWQsIHNob3VsZCByZXRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBwYXJhbWV0ZXJzIGFwcHJvcHJpYXRlIGZvciBuZXcgdGVjaG5vbG9neSAqLworICAgIFBEUF9GQUlMX1JBRElPX1BPV0VSX09GRiA9IC01LCAgICAgICAgLyogZGF0YSBjYWxsIHdhcyBkaXNjb25uZWN0ZWQgYmVjYXVzZSByYWRpbyB3YXMgcmVzZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJlZCBvZmYgLSBubyByZXRyeSAqLworICAgIFBEUF9GQUlMX1RFVEhFUkVEX0NBTExfQUNUSVZFID0gLTYsICAgLyogZGF0YSBjYWxsIHdhcyBkaXNjb25uZWN0ZWQgYnkgbW9kZW0gYmVjYXVzZSB0ZXRoZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB3YXMgdXAgb24gc2FtZSBBUE4vZGF0YSBwcm9maWxlIC0gbm8gcmV0cnkgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRldGhlcmVkIGNhbGwgaXMgb2ZmICovCisKKyAgICBQRFBfRkFJTF9FUlJPUl9VTlNQRUNJRklFRCA9IDB4ZmZmZiwgIC8qIHJldHJ5IHNpbGVudGx5ICovCit9IFJJTF9EYXRhQ2FsbEZhaWxDYXVzZTsKIAogLyogU2VlIFJJTF9SRVFVRVNUX1NFVFVQX0RBVEFfQ0FMTCAqLwogdHlwZWRlZiBlbnVtIHsKQEAgLTM4Nyw3ICs0ODIsOCBAQAogICBSSUxfQVBQVFlQRV9TSU0gICAgID0gMSwKICAgUklMX0FQUFRZUEVfVVNJTSAgICA9IDIsCiAgIFJJTF9BUFBUWVBFX1JVSU0gICAgPSAzLAotICBSSUxfQVBQVFlQRV9DU0lNICAgID0gNAorICBSSUxfQVBQVFlQRV9DU0lNICAgID0gNCwKKyAgUklMX0FQUFRZUEVfSVNJTSAgICA9IDUKIH0gUklMX0FwcFR5cGU7CiAKIHR5cGVkZWYgc3RydWN0CkBAIC0zOTksMzcgKzQ5NSw2MSBAQAogICBjaGFyICAgICAgICAgICAgICphaWRfcHRyOyAgICAgICAgLyogbnVsbCB0ZXJtaW5hdGVkIHN0cmluZywgZS5nLiwgZnJvbSAweEEwLCAweDAwIC0+IDB4NDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwLCAweDMwLCAweDMwICovCiAgIGNoYXIgICAgICAgICAgICAgKmFwcF9sYWJlbF9wdHI7ICAvKiBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nICovCi0gIGludCAgICAgICAgICAgICAgcGluMV9yZXBsYWNlZDsgICAvKiBhcHBsaWNhYmxlIHRvIFVTSU0gYW5kIENTSU0gKi8KKyAgaW50ICAgICAgICAgICAgICBwaW4xX3JlcGxhY2VkOyAgIC8qIGFwcGxpY2FibGUgdG8gVVNJTSwgQ1NJTSAmIElTSU0gKi8KICAgUklMX1BpblN0YXRlICAgICBwaW4xOwogICBSSUxfUGluU3RhdGUgICAgIHBpbjI7CiB9IFJJTF9BcHBTdGF0dXM7CiAKKy8qIERlcHJlY2F0ZWQsIHVzZSBSSUxfQ2FyZFN0YXR1c192NiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgUklMX0NhcmRTdGF0ZSBjYXJkX3N0YXRlOworICBSSUxfUGluU3RhdGUgIHVuaXZlcnNhbF9waW5fc3RhdGU7ICAgICAgICAgICAgIC8qIGFwcGxpY2FibGUgdG8gVVNJTSBhbmQgQ1NJTTogUklMX1BJTlNUQVRFX3h4eCAqLworICBpbnQgICAgICAgICAgIGdzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXg7IC8qIHZhbHVlIDwgUklMX0NBUkRfTUFYX0FQUFMsIC0xIGlmIG5vbmUgKi8KKyAgaW50ICAgICAgICAgICBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXg7ICAgICAvKiB2YWx1ZSA8IFJJTF9DQVJEX01BWF9BUFBTLCAtMSBpZiBub25lICovCisgIGludCAgICAgICAgICAgbnVtX2FwcGxpY2F0aW9uczsgICAgICAgICAgICAgICAgLyogdmFsdWUgPD0gUklMX0NBUkRfTUFYX0FQUFMgKi8KKyAgUklMX0FwcFN0YXR1cyBhcHBsaWNhdGlvbnNbUklMX0NBUkRfTUFYX0FQUFNdOworfSBSSUxfQ2FyZFN0YXR1c192NTsKKwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgUklMX0NhcmRTdGF0ZSBjYXJkX3N0YXRlOwogICBSSUxfUGluU3RhdGUgIHVuaXZlcnNhbF9waW5fc3RhdGU7ICAgICAgICAgICAgIC8qIGFwcGxpY2FibGUgdG8gVVNJTSBhbmQgQ1NJTTogUklMX1BJTlNUQVRFX3h4eCAqLwotICBpbnQgICAgICAgICAgIGdzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXg7IC8qIHZhbHVlIDwgUklMX0NBUkRfTUFYX0FQUFMgKi8KLSAgaW50ICAgICAgICAgICBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXg7ICAgICAvKiB2YWx1ZSA8IFJJTF9DQVJEX01BWF9BUFBTICovCisgIGludCAgICAgICAgICAgZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleDsgLyogdmFsdWUgPCBSSUxfQ0FSRF9NQVhfQVBQUywgLTEgaWYgbm9uZSAqLworICBpbnQgICAgICAgICAgIGNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleDsgICAgIC8qIHZhbHVlIDwgUklMX0NBUkRfTUFYX0FQUFMsIC0xIGlmIG5vbmUgKi8KKyAgaW50ICAgICAgICAgICBpbXNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleDsgICAgICAvKiB2YWx1ZSA8IFJJTF9DQVJEX01BWF9BUFBTLCAtMSBpZiBub25lICovCiAgIGludCAgICAgICAgICAgbnVtX2FwcGxpY2F0aW9uczsgICAgICAgICAgICAgICAgLyogdmFsdWUgPD0gUklMX0NBUkRfTUFYX0FQUFMgKi8KICAgUklMX0FwcFN0YXR1cyBhcHBsaWNhdGlvbnNbUklMX0NBUkRfTUFYX0FQUFNdOwotfSBSSUxfQ2FyZFN0YXR1czsKK30gUklMX0NhcmRTdGF0dXNfdjY7CiAKIC8qIFRoZSByZXN1bHQgb2YgYSBTSU0gcmVmcmVzaCwgcmV0dXJuZWQgaW4gZGF0YVswXSBvZiBSSUxfVU5TT0xfU0lNX1JFRlJFU0ggKi8KIHR5cGVkZWYgZW51bSB7CiAgICAgLyogQSBmaWxlIG9uIFNJTSBoYXMgYmVlbiB1cGRhdGVkLiAgZGF0YVsxXSBjb250YWlucyB0aGUgRUZJRC4gKi8KICAgICBTSU1fRklMRV9VUERBVEUgPSAwLAotICAgIC8qIFNJTSBpbml0aWFsaXplZC4gIEFsbCBmaWxlcyBzaG91bGQgYmUgcmUtcmVhZC4gKi8KKyAgICAvKiBTSU0gaW5pdGlhbGl6ZWQuICBBbGwgZmlsZXMgc2hvdWxkIGJlIHJlLXJlYWQuIGRhdGFbMV0gY29udGFpbnMgQUlEIHRoYXQgY2F1c2VkIFJFRlJFU0ggKi8KICAgICBTSU1fSU5JVCA9IDEsCiAgICAgLyogU0lNIHJlc2V0LiAgU0lNIHBvd2VyIHJlcXVpcmVkLCBTSU0gbWF5IGJlIGxvY2tlZCBhbmQgYWxsIGZpbGVzIHNob3VsZCBiZSByZS1yZWFkLiAqLwogICAgIFNJTV9SRVNFVCA9IDIKIH0gUklMX1NpbVJlZnJlc2hSZXN1bHQ7CiAKKy8qIERlcHJlY2F0ZWQsIHVzZSBSSUxfQ0RNQV9DYWxsV2FpdGluZ192NiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgKiAgICAgICAgICBudW1iZXI7ICAgICAgICAgICAgIC8qIFJlbW90ZSBwYXJ0eSBudW1iZXIgKi8KKyAgICBpbnQgICAgICAgICAgICAgbnVtYmVyUHJlc2VudGF0aW9uOyAvKiAwPUFsbG93ZWQsIDE9UmVzdHJpY3RlZCwgMj1Ob3QgU3BlY2lmaWVkL1Vua25vd24gKi8KKyAgICBjaGFyICogICAgICAgICAgbmFtZTsgICAgICAgICAgICAgICAvKiBSZW1vdGUgcGFydHkgbmFtZSAqLworICAgIFJJTF9DRE1BX1NpZ25hbEluZm9SZWNvcmQgc2lnbmFsSW5mb1JlY29yZDsKK30gUklMX0NETUFfQ2FsbFdhaXRpbmdfdjU7CisKIHR5cGVkZWYgc3RydWN0IHsKICAgICBjaGFyICogICAgICAgICAgbnVtYmVyOyAgICAgICAgICAgICAvKiBSZW1vdGUgcGFydHkgbnVtYmVyICovCiAgICAgaW50ICAgICAgICAgICAgIG51bWJlclByZXNlbnRhdGlvbjsgLyogMD1BbGxvd2VkLCAxPVJlc3RyaWN0ZWQsIDI9Tm90IFNwZWNpZmllZC9Vbmtub3duICovCiAgICAgY2hhciAqICAgICAgICAgIG5hbWU7ICAgICAgICAgICAgICAgLyogUmVtb3RlIHBhcnR5IG5hbWUgKi8KICAgICBSSUxfQ0RNQV9TaWduYWxJbmZvUmVjb3JkIHNpZ25hbEluZm9SZWNvcmQ7Ci19IFJJTF9DRE1BX0NhbGxXYWl0aW5nOworICAgIC8qIE51bWJlciB0eXBlL051bWJlciBwbGFuIHJlcXVpcmVkIHRvIHN1cHBvcnQgSW50ZXJuYXRpb25hbCBDYWxsIFdhaXRpbmcgKi8KKyAgICBpbnQgICAgICAgICAgICAgbnVtYmVyX3R5cGU7ICAgICAgICAvKiAwPVVua25vd24sIDE9SW50ZXJuYXRpb25hbCwgMj1OYXRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzPU5ldHdvcmsgc3BlY2lmaWMsIDQ9c3Vic2NyaWJlciAqLworICAgIGludCAgICAgICAgICAgICBudW1iZXJfcGxhbjsgICAgICAgIC8qIDA9VW5rbm93biwgMT1JU0ROLCAzPURhdGEsIDQ9VGVsZXgsIDg9TmF0J2wsIDk9UHJpdmF0ZSAqLworfSBSSUxfQ0RNQV9DYWxsV2FpdGluZ192NjsKIAogLyoqCiAgKiBXaGljaCB0eXBlcyBvZiBDZWxsIEJyb2FkY2FzdCBNZXNzYWdlIChDQk0pIGFyZSB0byBiZSByZWNlaXZlZCBieSB0aGUgTUUKQEAgLTUxNSwxMiArNjM1LDI5IEBACiAgICAgaW50IHNpZ25hbE5vaXNlUmF0aW87IC8qIFZhbGlkIHZhbHVlcyBhcmUgMC04LiAgOCBpcyB0aGUgaGlnaGVzdCBzaWduYWwgdG8gbm9pc2UgcmF0aW8uICovCiB9IFJJTF9FVkRPX1NpZ25hbFN0cmVuZ3RoOwogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHNpZ25hbFN0cmVuZ3RoOyAgLyogVmFsaWQgdmFsdWVzIGFyZSAoMC0zMSwgOTkpIGFzIGRlZmluZWQgaW4gVFMgMjcuMDA3IDguNSAqLworICAgIGludCByc3JwOyAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IFJlZmVyZW5jZSBTaWduYWwgUmVjZWl2ZSBQb3dlciBpbiBkQm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtdWx0aXBsZWQgYnkgLTEuIFJhbmdlOiA0NCB0byAxNDAgZEJtLCBUT0RPOiBkb2MgcmVmZXJlbmNlICovCisgICAgaW50IHJzcnE7ICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgUmVmZXJlbmNlIFNpZ25hbCBSZWNlaXZlIFF1YWxpdHkgaW4gZEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtdWx0aXBsaWVkIGJ5IC0xLiBSYW5nZTogMjAgdG8gMyBkQi4gVE9ETzogZG9jIHJlZmVyZW5jZSAqLworICAgIGludCByc3NucjsgICAgICAgICAgIC8qIFRPRE86IE5lZWQgZG9jdW1lbnRhdGlvbiBhbmQgZG9jIHJlZmVyZW5jZSAqLworICAgIGludCBjcWk7ICAgICAgICAgICAgIC8qIFRPRE86IE5lZWQgZG9jdW1lbnRhdGlvbiBhbmQgZG9jIHJlZmVyZW5jZSAqLworfSBSSUxfTFRFX1NpZ25hbFN0cmVuZ3RoOworCisvKiBEZXByZWNhdGVkLCB1c2UgUklMX1NpZ25hbFN0cmVuZ3RoX3Y2ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUklMX0dXX1NpZ25hbFN0cmVuZ3RoICAgR1dfU2lnbmFsU3RyZW5ndGg7CisgICAgUklMX0NETUFfU2lnbmFsU3RyZW5ndGggQ0RNQV9TaWduYWxTdHJlbmd0aDsKKyAgICBSSUxfRVZET19TaWduYWxTdHJlbmd0aCBFVkRPX1NpZ25hbFN0cmVuZ3RoOworfSBSSUxfU2lnbmFsU3RyZW5ndGhfdjU7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBSSUxfR1dfU2lnbmFsU3RyZW5ndGggICBHV19TaWduYWxTdHJlbmd0aDsKICAgICBSSUxfQ0RNQV9TaWduYWxTdHJlbmd0aCBDRE1BX1NpZ25hbFN0cmVuZ3RoOwogICAgIFJJTF9FVkRPX1NpZ25hbFN0cmVuZ3RoIEVWRE9fU2lnbmFsU3RyZW5ndGg7Ci19IFJJTF9TaWduYWxTdHJlbmd0aDsKKyAgICBSSUxfTFRFX1NpZ25hbFN0cmVuZ3RoICBMVEVfU2lnbmFsU3RyZW5ndGg7Cit9IFJJTF9TaWduYWxTdHJlbmd0aF92NjsKIAogLyogTmFtZXMgb2YgdGhlIENETUEgaW5mbyByZWNvcmRzIChDLlMwMDA1IHNlY3Rpb24gMy43LjUpICovCiB0eXBlZGVmIGVudW0gewpAQCAtNjQzLDcgKzc4MCw3IEBACiAgKgogICogImRhdGEiIGlzIE5VTEwKICAqCi0gKiAicmVzcG9uc2UiIGlzIGNvbnN0IFJJTF9DYXJkU3RhdHVzICoKKyAqICJyZXNwb25zZSIgaXMgY29uc3QgUklMX0NhcmRTdGF0dXNfdjYgKgogICoKICAqIFZhbGlkIGVycm9yczoKICAqICBNdXN0IG5ldmVyIGZhaWwKQEAgLTY1Nyw2ICs3OTQsNyBAQAogICoKICAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMF0gaXMgUElOIHZhbHVlCisgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMV0gaXMgQUlEIHZhbHVlLCBTZWUgRVRTSSAxMDIuMjIxIDguMSBhbmQgMTAxLjIyMCA0LCBOVUxMIGlmIG5vIHZhbHVlLgogICoKICAqICJyZXNwb25zZSIgaXMgaW50ICoKICAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzIHRoZSBudW1iZXIgb2YgcmV0cmllcyByZW1haW5pbmcsIG9yIC0xIGlmIHVua25vd24KQEAgLTY4MCw2ICs4MTgsNyBAQAogICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKioKICAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSBpcyBQVUsgdmFsdWUKICAqICgoY29uc3QgY2hhciAqKilkYXRhKVsxXSBpcyBuZXcgUElOIHZhbHVlCisgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMl0gaXMgQUlEIHZhbHVlLCBTZWUgRVRTSSAxMDIuMjIxIDguMSBhbmQgMTAxLjIyMCA0LCBOVUxMIGlmIG5vIHZhbHVlLgogICoKICAqICJyZXNwb25zZSIgaXMgaW50ICoKICAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzIHRoZSBudW1iZXIgb2YgcmV0cmllcyByZW1haW5pbmcsIG9yIC0xIGlmIHVua25vd24KQEAgLTcwMyw2ICs4NDIsNyBAQAogICoKICAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMF0gaXMgUElOMiB2YWx1ZQorICogKChjb25zdCBjaGFyICoqKWRhdGEpWzFdIGlzIEFJRCB2YWx1ZSwgU2VlIEVUU0kgMTAyLjIyMSA4LjEgYW5kIDEwMS4yMjAgNCwgTlVMTCBpZiBubyB2YWx1ZS4KICAqCiAgKiAicmVzcG9uc2UiIGlzIGludCAqCiAgKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyB0aGUgbnVtYmVyIG9mIHJldHJpZXMgcmVtYWluaW5nLCBvciAtMSBpZiB1bmtub3duCkBAIC03MjUsNiArODY1LDcgQEAKICAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMF0gaXMgUFVLMiB2YWx1ZQogICogKChjb25zdCBjaGFyICoqKWRhdGEpWzFdIGlzIG5ldyBQSU4yIHZhbHVlCisgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMl0gaXMgQUlEIHZhbHVlLCBTZWUgRVRTSSAxMDIuMjIxIDguMSBhbmQgMTAxLjIyMCA0LCBOVUxMIGlmIG5vIHZhbHVlLgogICoKICAqICJyZXNwb25zZSIgaXMgaW50ICoKICAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzIHRoZSBudW1iZXIgb2YgcmV0cmllcyByZW1haW5pbmcsIG9yIC0xIGlmIHVua25vd24KQEAgLTc0OCw2ICs4ODksNyBAQAogICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKioKICAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSBpcyBvbGQgUElOIHZhbHVlCiAgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMV0gaXMgbmV3IFBJTiB2YWx1ZQorICogKChjb25zdCBjaGFyICoqKWRhdGEpWzJdIGlzIEFJRCB2YWx1ZSwgU2VlIEVUU0kgMTAyLjIyMSA4LjEgYW5kIDEwMS4yMjAgNCwgTlVMTCBpZiBubyB2YWx1ZS4KICAqCiAgKiAicmVzcG9uc2UiIGlzIGludCAqCiAgKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyB0aGUgbnVtYmVyIG9mIHJldHJpZXMgcmVtYWluaW5nLCBvciAtMSBpZiB1bmtub3duCkBAIC03NzMsNiArOTE1LDcgQEAKICAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMF0gaXMgb2xkIFBJTjIgdmFsdWUKICAqICgoY29uc3QgY2hhciAqKilkYXRhKVsxXSBpcyBuZXcgUElOMiB2YWx1ZQorICogKChjb25zdCBjaGFyICoqKWRhdGEpWzJdIGlzIEFJRCB2YWx1ZSwgU2VlIEVUU0kgMTAyLjIyMSA4LjEgYW5kIDEwMS4yMjAgNCwgTlVMTCBpZiBubyB2YWx1ZS4KICAqCiAgKiAicmVzcG9uc2UiIGlzIGludCAqCiAgKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyB0aGUgbnVtYmVyIG9mIHJldHJpZXMgcmVtYWluaW5nLCBvciAtMSBpZiB1bmtub3duCkBAIC04NTUsNyArOTk4LDggQEAKICAqCiAgKiBPbmx5IHZhbGlkIHdoZW4gcmFkaW8gc3RhdGUgaXMgIlJBRElPX1NUQVRFX1NJTV9SRUFEWSIKICAqCi0gKiAiZGF0YSIgaXMgTlVMTAorICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKioKKyAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSBpcyBBSUQgdmFsdWUsIFNlZSBFVFNJIDEwMi4yMjEgOC4xIGFuZCAxMDEuMjIwIDQsIE5VTEwgaWYgbm8gdmFsdWUuCiAgKiAicmVzcG9uc2UiIGlzIGEgY29uc3QgY2hhciAqIGNvbnRhaW5pbmcgdGhlIElNU0kKICAqCiAgKiBWYWxpZCBlcnJvcnM6CkBAIC0xMDMyLDcgKzExNzYsNyBAQAogI2RlZmluZSBSSUxfUkVRVUVTVF9TSUdOQUxfU1RSRU5HVEggMTkKIAogLyoqCi0gKiBSSUxfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVEUKKyAqIFJJTF9SRVFVRVNUX1ZPSUNFX1JFR0lTVFJBVElPTl9TVEFURQogICoKICAqIFJlcXVlc3QgY3VycmVudCByZWdpc3RyYXRpb24gc3RhdGUKICAqCkBAIC0xMDY1LDEyICsxMjA5LDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiAxNiBiaXRzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIFVNVFMsIENJRCBpcyBVTVRTIENlbGwgSWRlbnRpdHkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBUUyAyNS4zMzEpIGluIDI4IGJpdHMKLSAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbM10gaW5kaWNhdGVzIHRoZSBhdmFpbGFibGUgcmFkaW8gdGVjaG5vbG9neSAwLTcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gVW5rbm93biwgMSAtIEdQUlMsIDIgLSBFREdFLCAzIC0gVU1UUywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgLSBJUzk1QSwgNSAtIElTOTVCLCA2IC0gMXhSVFQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3IC0gRXZEbyBSZXYuIDAsIDggLSBFdkRvIFJldi4gQSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgLSBIU0RQQSwgMTAgLSBIU1VQQSwgMTEgLSBIU1BBLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgLSBFVkRPIFJldiBCCisgKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzNdIGluZGljYXRlcyB0aGUgYXZhaWxhYmxlIHZvaWNlIHJhZGlvIHRlY2hub2xvZ3ksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIHZhbHVlcyBhcyBkZWZpbmVkIGJ5IFJJTF9SYWRpb1RlY2hub2xvZ3kuCiAgKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzRdIGlzIEJhc2UgU3RhdGlvbiBJRCBpZiByZWdpc3RlcmVkIG9uIGEgQ0RNQQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gb3IgTlVMTCBpZiBub3QuICBCYXNlIFN0YXRpb24gSUQgaW4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbCBmb3JtYXQKQEAgLTEwODAsMTQgKzEyMjAsMTQgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM0dQUDIgQy5TMDAwNS1BIHY2LjAuIEl0IGlzIHJlcHJlc2VudGVkIGluCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzIG9mIDAuMjUgc2Vjb25kcyBhbmQgcmFuZ2VzIGZyb20gLTEyOTYwMDAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gMTI5NjAwMCwgYm90aCB2YWx1ZXMgaW5jbHVzaXZlIChjb3JyZXNwb25kaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgcmFuZ2Ugb2YgLTkwsCB0byArOTCwKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSByYW5nZSBvZiAtOTAgdG8gKzkwIGRlZ3JlZXMpLgogICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVs2XSBpcyBCYXNlIFN0YXRpb24gbG9uZ2l0dWRlIGlmIHJlZ2lzdGVyZWQgb24gYQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRE1BIHN5c3RlbSBvciBOVUxMIGlmIG5vdC4gQmFzZSBTdGF0aW9uCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZSBpcyBhIGRlY2ltYWwgbnVtYmVyIGFzIHNwZWNpZmllZCBpbgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzR1BQMiBDLlMwMDA1LUEgdjYuMC4gSXQgaXMgcmVwcmVzZW50ZWQgaW4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMgb2YgMC4yNSBzZWNvbmRzIGFuZCByYW5nZXMgZnJvbSAtMjU5MjAwMAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAyNTkyMDAwLCBib3RoIHZhbHVlcyBpbmNsdXNpdmUgKGNvcnJlc3BvbmRpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSByYW5nZSBvZiAtMTgwsCB0byArMTgwsCkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgcmFuZ2Ugb2YgLTE4MCB0byArMTgwIGRlZ3JlZXMpLgogICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVs3XSBpcyBjb25jdXJyZW50IHNlcnZpY2VzIHN1cHBvcnQgaW5kaWNhdG9yIGlmCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgb24gYSBDRE1BIHN5c3RlbSAwLTEuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIENvbmN1cnJlbnQgc2VydmljZXMgbm90IHN1cHBvcnRlZCwKQEAgLTExMjAsNiArMTI2MCwyOSBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IC0gTm8gU3VpdGFibGUgQ2VsbHMgaW4gdGhpcyBMb2NhdGlvbiBBcmVhCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgLSBOZXR3b3JrIGZhaWx1cmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAtIFBlcnNpc3RlbnQgbG9jYXRpb24gdXBkYXRlIHJlamVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExIC0gUExNTiBub3QgYWxsb3dlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIC0gTG9jYXRpb24gYXJlYSBub3QgYWxsb3dlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzIC0gUm9hbWluZyBub3QgYWxsb3dlZCBpbiB0aGlzIExvY2F0aW9uIEFyZWEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSAtIE5vIFN1aXRhYmxlIENlbGxzIGluIHRoaXMgTG9jYXRpb24gQXJlYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3IC0gTmV0d29yayBGYWlsdXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgLSBNQUMgRmFpbHVyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxIC0gU3luYyBGYWlsdXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIgLSBDb25nZXN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMgLSBHU00gQXV0aGVudGljYXRpb24gdW5hY2NlcHRhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUgLSBOb3QgQXV0aG9yaXplZCBmb3IgdGhpcyBDU0cKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAtIFNlcnZpY2Ugb3B0aW9uIG5vdCBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMyAtIFJlcXVlc3RlZCBzZXJ2aWNlIG9wdGlvbiBub3Qgc3Vic2NyaWJlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0IC0gU2VydmljZSBvcHRpb24gdGVtcG9yYXJpbHkgb3V0IG9mIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzggLSBDYWxsIGNhbm5vdCBiZSBpZGVudGlmaWVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgtNjMgLSBSZXRyeSB1cG9uIGVudHJ5IGludG8gYSBuZXcgY2VsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1IC0gU2VtYW50aWNhbGx5IGluY29ycmVjdCBtZXNzYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYgLSBJbnZhbGlkIG1hbmRhdG9yeSBpbmZvcm1hdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk3IC0gTWVzc2FnZSB0eXBlIG5vbi1leGlzdGVudCBvciBub3QgaW1wbGVtZW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OCAtIE1lc3NhZ2Ugbm90IGNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5IC0gSW5mb3JtYXRpb24gZWxlbWVudCBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgLSBDb25kaXRpb25hbCBJRSBlcnJvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxIC0gTWVzc2FnZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTEgLSBQcm90b2NvbCBlcnJvciwgdW5zcGVjaWZpZWQKICAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbMTRdIGlzIHRoZSBQcmltYXJ5IFNjcmFtYmxpbmcgQ29kZSBvZiB0aGUgY3VycmVudAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbCBhcyBkZXNjcmliZWQgaW4gVFMgMjUuMzMxLCBpbiBoZXhhZGVjaW1hbAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBvciBOVUxMIGlmIHVua25vd24gb3Igbm90IHJlZ2lzdGVyZWQKQEAgLTExMzcsMjYgKzEzMDAsMzMgQEAKICAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAgKiAgR0VORVJJQ19GQUlMVVJFCiAgKi8KLSNkZWZpbmUgUklMX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRFIDIwCisjZGVmaW5lIFJJTF9SRVFVRVNUX1ZPSUNFX1JFR0lTVFJBVElPTl9TVEFURSAyMAogCiAvKioKLSAqIFJJTF9SRVFVRVNUX0dQUlNfUkVHSVNUUkFUSU9OX1NUQVRFCisgKiBSSUxfUkVRVUVTVF9EQVRBX1JFR0lTVFJBVElPTl9TVEFURQogICoKLSAqIFJlcXVlc3QgY3VycmVudCBHUFJTIHJlZ2lzdHJhdGlvbiBzdGF0ZQorICogUmVxdWVzdCBjdXJyZW50IERBVEEgcmVnaXN0cmF0aW9uIHN0YXRlCiAgKgogICogImRhdGEiIGlzIE5VTEwKICAqICJyZXNwb25zZSIgaXMgYSAiY2hhciAqKiIKICAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbMF0gaXMgcmVnaXN0cmF0aW9uIHN0YXRlIDAtNSBmcm9tIFRTIDI3LjAwNyAxMC4xLjIwIEFUK0NHUkVHCiAgKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzFdIGlzIExBQyBpZiByZWdpc3RlcmVkIG9yIE5VTEwgaWYgbm90CiAgKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzJdIGlzIENJRCBpZiByZWdpc3RlcmVkIG9yIE5VTEwgaWYgbm90Ci0gKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzNdIGluZGljYXRlcyB0aGUgYXZhaWxhYmxlIHJhZGlvIHRlY2hub2xvZ3ksIHdoZXJlOgotICogICAgICAwID09IHVua25vd24KLSAqICAgICAgMSA9PSBHUFJTIG9ubHkKLSAqICAgICAgMiA9PSBFREdFCi0gKiAgICAgIDMgPT0gVU1UUwotICogICAgICA5ID09IEhTRFBBCi0gKiAgICAgIDEwID09IEhTVVBBCi0gKiAgICAgIDExID09IEhTUEEKKyAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbM10gaW5kaWNhdGVzIHRoZSBhdmFpbGFibGUgZGF0YSByYWRpbyB0ZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCB2YWx1ZXMgYXMgZGVmaW5lZCBieSBSSUxfUmFkaW9UZWNobm9sb2d5LgorICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVs0XSBpZiByZWdpc3RyYXRpb24gc3RhdGUgaXMgMyAoUmVnaXN0cmF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5pZWQpIHRoaXMgaXMgYW4gZW51bWVyYXRlZCByZWFzb24gd2h5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24gd2FzIGRlbmllZC4gIFNlZSAzR1BQIFRTIDI0LjAwOCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubmV4IEcuNiAiQWRkaXRvbmFsIGNhdXNlIGNvZGVzIGZvciBHTU0iLgorICogICAgICA3ID09IEdQUlMgc2VydmljZXMgbm90IGFsbG93ZWQKKyAqICAgICAgOCA9PSBHUFJTIHNlcnZpY2VzIGFuZCBub24tR1BSUyBzZXJ2aWNlcyBub3QgYWxsb3dlZAorICogICAgICA5ID09IE1TIGlkZW50aXR5IGNhbm5vdCBiZSBkZXJpdmVkIGJ5IHRoZSBuZXR3b3JrCisgKiAgICAgIDEwID09IEltcGxpY2l0bHkgZGV0YWNoZWQKKyAqICAgICAgMTQgPT0gR1BSUyBzZXJ2aWNlcyBub3QgYWxsb3dlZCBpbiB0aGlzIFBMTU4KKyAqICAgICAgMTYgPT0gTVNDIHRlbXBvcmFyaWx5IG5vdCByZWFjaGFibGUKKyAqICAgICAgNDAgPT0gTm8gUERQIGNvbnRleHQgYWN0aXZhdGVkCisgKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzVdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgRGF0YSBDYWxscyB0aGF0IGNhbiBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RhYmxpc2hlZCB1c2luZyBSSUxfUkVRVUVTVF9TRVRVUF9EQVRBX0NBTEwuCiAgKgogICogTEFDIGFuZCBDSUQgYXJlIGluIGhleGFkZWNpbWFsIGZvcm1hdC4KICAqIHZhbGlkIExBQyBhcmUgMHgwMDAwIC0gMHhmZmZmCkBAIC0xMTcwLDcgKzEzNDAsNyBAQAogICogIFJBRElPX05PVF9BVkFJTEFCTEUKICAqICBHRU5FUklDX0ZBSUxVUkUKICAqLwotI2RlZmluZSBSSUxfUkVRVUVTVF9HUFJTX1JFR0lTVFJBVElPTl9TVEFURSAyMQorI2RlZmluZSBSSUxfUkVRVUVTVF9EQVRBX1JFR0lTVFJBVElPTl9TVEFURSAyMQogCiAvKioKICAqIFJJTF9SRVFVRVNUX09QRVJBVE9SCkBAIC0xMTk4LDYgKzEzNjgsMTEgQEAKICAqIFJJTF9SRVFVRVNUX1JBRElPX1BPV0VSCiAgKgogICogVG9nZ2xlIHJhZGlvIG9uIGFuZCBvZmYgKGZvciAiYWlycGxhbmUiIG1vZGUpCisgKiBJZiB0aGUgcmFkaW8gaXMgaXMgdHVybmVkIG9mZi9vbiB0aGUgcmFkaW8gbW9kZW0gc3Vic3lzdGVtCisgKiBpcyBleHBlY3RlZCByZXR1cm4gdG8gYW4gaW5pdGlhbGl6ZWQgc3RhdGUuIEZvciBpbnN0YW5jZSwKKyAqIGFueSB2b2ljZSBhbmQgZGF0YSBjYWxscyB3aWxsIGJlIHRlcm1pbmF0ZWQgYW5kIGFsbCBhc3NvY2lhdGVkCisgKiBsaXN0cyBlbXB0aWVkLgorICoKICAqICJkYXRhIiBpcyBpbnQgKgogICogKChpbnQgKilkYXRhKVswXSBpcyA+IDAgZm9yICJSYWRpbyBPbiIKICAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMCBmb3IgIlJhZGlvIE9mZiIKQEAgLTEzMDIsMTIgKzE0NzcsMjcgQEAKIC8qKgogICogUklMX1JFUVVFU1RfU0VUVVBfREFUQV9DQUxMCiAgKgotICogU2V0dXAgYSBwYWNrZXQgZGF0YSBjb25uZWN0aW9uCisgKiBTZXR1cCBhIHBhY2tldCBkYXRhIGNvbm5lY3Rpb24uIElmIFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjYuc3RhdHVzCisgKiByZXR1cm4gc3VjY2VzcyBpdCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiBkYXRhIGNhbGxzIGFuZCBhCisgKiBSSUxfVU5TT0xfREFUQV9DQUxMX0xJU1RfQ0hBTkdFRCBpcyBzZW50LiBUaGUgY2FsbCByZW1haW5zIGluIHRoZQorICogbGlzdCB1bnRpbCBSSUxfUkVRVUVTVF9ERUFDVElWQVRFX0RBVEFfQ0FMTCBpcyBpc3N1ZWQgb3IgdGhlCisgKiByYWRpbyBpcyBwb3dlcmVkIG9mZi9vbi4gVGhpcyBsaXN0IGlzIHJldHVybmVkIGJ5IFJJTF9SRVFVRVNUX0RBVEFfQ0FMTF9MSVNUCisgKiBhbmQgUklMX1VOU09MX0RBVEFfQ0FMTF9MSVNUX0NIQU5HRUQuCisgKgorICogVGhlIFJJTCBpcyBleHBlY3RlZCB0bzoKKyAqICAtIENyZWF0ZSBvbmUgZGF0YSBjYWxsIGNvbnRleHQuCisgKiAgLSBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIGRlZGljYXRlZCBpbnRlcmZhY2UgZm9yIHRoZSBjb250ZXh0CisgKiAgLSBUaGUgaW50ZXJmYWNlIG11c3QgYmUgcG9pbnQgdG8gcG9pbnQuCisgKiAgLSBUaGUgaW50ZXJmYWNlIGlzIGNvbmZpZ3VyZWQgd2l0aCBvbmUgb3IgbW9yZSBhZGRyZXNzZXMgYW5kCisgKiAgICBpcyBjYXBhYmxlIG9mIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBwYWNrZXRzLiBUaGUgcHJlZml4IGxlbmd0aAorICogICAgb2YgdGhlIGFkZHJlc3NlcyBtdXN0IGJlIC8zMiBmb3IgSVB2NCBhbmQgLzEyOCBmb3IgSVB2Ni4KKyAqICAtIE11c3QgTk9UIGNoYW5nZSB0aGUgbGludXggcm91dGluZyB0YWJsZS4KKyAqICAtIFN1cHBvcnQgdXAgdG8gUklMX1JFUVVFU1RfREFUQV9SRUdJU1RSQVRJT05fU1RBVEUgcmVzcG9uc2VbNV0KKyAqICAgIG51bWJlciBvZiBzaW11bHRhbmVvdXMgZGF0YSBjYWxsIGNvbnRleHRzLgogICoKICAqICJkYXRhIiBpcyBhIGNvbnN0IGNoYXIgKioKLSAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSBpbmRpY2F0ZXMgd2hldGhlciB0byBzZXR1cCBjb25uZWN0aW9uIG9uIHJhZGlvIHRlY2hub2xvZ3kgQ0RNQQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBHU00vVU1UUywgMC0xLiAwIC0gQ0RNQSwgMS1HU00vVU1UUwotICoKKyAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSBSYWRpbyB0ZWNobm9sb2d5IHRvIHVzZTogMC1DRE1BLCAxLUdTTS9VTVRTLCAyLi4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHZhbHVlcyBhYm92ZSAyIHRoaXMgaXMgUklMX1JhZGlvVGVjaG5vbG9neSArIDIuCiAgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMV0gaXMgYSBSSUxfRGF0YVByb2ZpbGUgKHN1cHBvcnQgaXMgb3B0aW9uYWwpCiAgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMl0gaXMgdGhlIEFQTiB0byBjb25uZWN0IHRvIGlmIHJhZGlvIHRlY2hub2xvZ3kgaXMgR1NNL1VNVFMuIFRoaXMgQVBOIHdpbGwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZSB0aGUgb25lIGluIHRoZSBwcm9maWxlLiBOVUxMIGluZGljYXRlcyBubyBBUE4gb3ZlcnJyaWRlLgpAQCAtMTMxOCwzNiArMTUwOCwyOSBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gUEFQIG1heSBiZSBwZXJmb3JtZWQ7IENIQVAgaXMgbmV2ZXIgcGVyZm9ybWVkLgogICogICAgICAgICAgICAgICAgICAgICAgICAgIDIgPT4gQ0hBUCBtYXkgYmUgcGVyZm9ybWVkOyBQQVAgaXMgbmV2ZXIgcGVyZm9ybWVkLgogICogICAgICAgICAgICAgICAgICAgICAgICAgIDMgPT4gUEFQIC8gQ0hBUCBtYXkgYmUgcGVyZm9ybWVkIC0gYmFzZWJhbmQgZGVwZW5kZW50LgotICogKChjb25zdCBjaGFyICoqKWRhdGEpWzZdIGlzIHRoZSBQRFAgdHlwZSB0byByZXF1ZXN0IGlmIHRoZSByYWRpbyB0ZWNobm9sb2d5IGlzIEdTTS9VTVRTLgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgb25lIG9mIHRoZSBQRFBfdHlwZSB2YWx1ZXMgaW4gVFMgMjcuMDA3IHNlY3Rpb24gMTAuMS4xLgorICogKChjb25zdCBjaGFyICoqKWRhdGEpWzZdIGlzIHRoZSBjb25uZWN0aW9uIHR5cGUgdG8gcmVxdWVzdCBtdXN0IGJlIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBQRFBfdHlwZSB2YWx1ZXMgaW4gVFMgMjcuMDA3IHNlY3Rpb24gMTAuMS4xLgogICogICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCAiSVAiLCAiSVBWNiIsICJJUFY0VjYiLCBvciAiUFBQIi4KKyAqICgoY29uc3QgY2hhciAqKilkYXRhKVs3XSBPcHRpb25hbCBjb25uZWN0aW9uIHByb3BlcnR5IHBhcmFtZXRlcnMsIGZvcm1hdCB0byBiZSBkZWZpbmVkLgogICoKLSAqICJyZXNwb25zZSIgaXMgYSBjaGFyICoqCi0gKiAoKGNoYXIgKiopcmVzcG9uc2UpWzBdIHRoZSBDb25uZWN0aW9uIElELCBDSUQsIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBSSUwuCi0gKiAoKGNoYXIgKiopcmVzcG9uc2UpWzFdIHRoZSBuZXR3b3JrIGludGVyZmFjZSBuYW1lLgotICogKChjaGFyICoqKXJlc3BvbnNlKVsyXSBhIG51bWVyaWMgSVB2NCBvciBJUHY2IGFkZHJlc3MgdGhhdCBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGUgaW50ZXJmYWNlLgotICogKChjaGFyICoqKXJlc3BvbnNlKVszXSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIG51bWVyaWMgSVB2NCBvciBJUHY2IEROUyBhZGRyZXNzZXMuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgb24gQW5kcm9pZCBwbGF0Zm9ybXMgYmVmb3JlIDMuMCBhbmQgaW5zdGVhZCB0d28gRE5TIElQIGFkZHJlc3NlcwotICogICAgICAgICAgICAgICAgICAgICAgICBhcmUgcmV0cmlldmVkIGZyb20gc3lzdGVtIHByb3BlcnRpZXMgIm5ldC4kSU4uZG5zMSIgYW5kICJuZXQuJElOLmRuczIiLgotICogKChjaGFyICoqKXJlc3BvbnNlKVs0XSB0aGUgbnVtZXJpYyBJUHY0IG9yIElQdjYgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdCBnYXRld2F5LgotICogICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVkIG9uIEFuZHJvaWQgcGxhdGZvcm1zIGJlZm9yZSAzLjAgYW5kIGluc3RlYWQgYW4gSVAgYWRkcmVzcwotICogICAgICAgICAgICAgICAgICAgICAgICBpcyByZXRyaWV2ZWQgZnJvbSBzeXN0ZW0gcHJvcGVydHkgIm5ldC4kSU4uZ3ciLgorICogInJlc3BvbnNlIiBpcyBhIFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjYKICAqCi0gKiBOb3RlczoKLSAqICAgMSkgTnVtZXJpYyBhZGRyZXNzZXMgbXVzdCBiZSBpbiB0aGUgSmF2YSBJbmV0QWRkcmVzcyBwYXJzYWJsZSByZXByZXNlbnRhdGlvbi4KLSAqICAgMikgJElOIGluIHRoZSBhYm92ZSBjb21tZW50cyBpcyB0aGUgaW50ZXJmYWNlIG5hbWUgZnJvbSByZXNwb25zZVsxXS4KKyAqIEZJWE1FIG1heSBuZWVkIHdheSB0byBjb25maWd1cmUgUW9TIHNldHRpbmdzCiAgKgogICogVmFsaWQgZXJyb3JzOgotICogIFNVQ0NFU1MKLSAqICBSQURJT19OT1RfQVZBSUxBQkxFCi0gKiAgR0VORVJJQ19GQUlMVVJFCisgKiAgU1VDQ0VTUyBzaG91bGQgYmUgcmV0dXJuZWQgb24gYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlIG9mIHNldHVwIHdpdGgKKyAqICB0aGUgUklMX0RhdGFfQ2FsbF9SZXNwb25zZV92Ni5zdGF0dXMgY29udGFpbmluZyB0aGUgYWN0dWFsIHN0YXR1cy4KKyAqICBGb3IgYWxsIG90aGVyIGVycm9ycyB0aGUgUklMX0RhdGFfQ2FsbF9SZXNvbnNlX3Y2IGlzIGlnbm9yZWQuCisgKgorICogIE90aGVyIGVycm9ycyBjb3VsZCBpbmNsdWRlOgorICogICAgUkFESU9fTk9UX0FWQUlMQUJMRSwgR0VORVJJQ19GQUlMVVJFLCBPUF9OT1RfQUxMT1dFRF9CRUZPUkVfUkVHX1RPX05XLAorICogICAgT1BfTk9UX0FMTE9XRURfRFVSSU5HX1ZPSUNFX0NBTEwgYW5kIFJFUVVFU1RfTk9UX1NVUFBPUlRFRC4KICAqCiAgKiBTZWUgYWxzbzogUklMX1JFUVVFU1RfREVBQ1RJVkFURV9EQVRBX0NBTEwKICAqLwogI2RlZmluZSBSSUxfUkVRVUVTVF9TRVRVUF9EQVRBX0NBTEwgMjcKIAogCi0KIC8qKgogICogUklMX1JFUVVFU1RfU0lNX0lPCiAgKgpAQCAtMTM1Niw3ICsxNTM5LDcgQEAKICAqIHdoZXJlIGl0IGFzc3VtZXMgYWxsIG9mIHRoZSBFRiBzZWxlY3Rpb24gd2lsbCBiZSBkb25lIGJ5IHRoZQogICogY2FsbGVlLgogICoKLSAqICJkYXRhIiBpcyBhIGNvbnN0IFJJTF9TSU1fSU8gKgorICogImRhdGEiIGlzIGEgY29uc3QgUklMX1NJTV9JT192NiAqCiAgKiBQbGVhc2Ugbm90ZSB0aGF0IFJJTF9TSU1fSU8gaGFzIGEgIlBJTjIiIGZpZWxkIHdoaWNoIG1heSBiZSBOVUxMLAogICogb3IgbWF5IHNwZWNpZnkgYSBQSU4yIGZvciBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBhIFBJTjIgKGVnCiAgKiB1cGRhdGluZyBGRE4gcmVjb3JkcykKQEAgLTE2MjUsOCArMTgwOCwxMyBAQAogLyoqCiAgKiBSSUxfUkVRVUVTVF9ERUFDVElWQVRFX0RBVEFfQ0FMTAogICoKLSAqIERlYWN0aXZhdGUgcGFja2V0IGRhdGEgY29ubmVjdGlvbgotICogcmVwbGFjZXMgUklMX1JFUVVFU1RfREVBQ1RJVkFURV9ERUZBVUxUX1BEUAorICogRGVhY3RpdmF0ZSBwYWNrZXQgZGF0YSBjb25uZWN0aW9uIGFuZCByZW1vdmUgZnJvbSB0aGUKKyAqIGRhdGEgY2FsbCBsaXN0IGlmIFNVQ0NFU1MgaXMgcmV0dXJuZWQuIEFueSBvdGhlciByZXR1cm4KKyAqIHZhbHVlcyBzaG91bGQgYWxzbyB0cnkgdG8gcmVtb3ZlIHRoZSBjYWxsIGZyb20gdGhlIGxpc3QsCisgKiBidXQgdGhhdCBtYXkgbm90IGJlIHBvc3NpYmxlLiBJbiBhbnkgZXZlbnQgYQorICogUklMX1JFUVVFU1RfUkFESU9fUE9XRVIgb2ZmL29uIG11c3QgY2xlYXIgdGhlIGxpc3QuIEFuCisgKiBSSUxfVU5TT0xfREFUQV9DQUxMX0xJU1RfQ0hBTkdFRCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUKKyAqIGlzc3VlZCBiZWNhdXNlIG9mIGFuIFJJTF9SRVFVRVNUX0RFQUNUSVZBVEVfREFUQV9DQUxMLgogICoKICAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAgKiAoKGNoYXIqKilkYXRhKVswXSBpbmRpY2F0aW5nIENJRApAQCAtMTY1Niw2ICsxODQ0LDkgQEAKICAqICgoY29uc3QgY2hhciAqKilkYXRhKVsxXSBpcyB0aGUgcGFzc3dvcmQsIG9yICIiIGlmIG5vdCByZXF1aXJlZAogICogKChjb25zdCBjaGFyICoqKWRhdGEpWzJdIGlzIHRoZSBUUyAyNy4wMDcgc2VydmljZSBjbGFzcyBiaXQgdmVjdG9yIG9mCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzIHRvIHF1ZXJ5CisgKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbM10gaXMgQUlEIHZhbHVlLCBTZWUgRVRTSSAxMDIuMjIxIDguMSBhbmQgMTAxLjIyMCA0LCBOVUxMIGlmIG5vIHZhbHVlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgaW4gdGhlIGNhc2Ugb2YgRml4ZWQgRGlhbGluZyBOdW1iZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRkROKSByZXF1ZXN0cy4KICAqCiAgKiAicmVzcG9uc2UiIGlzIGFuIGludCAqCiAgKiAoKGNvbnN0IGludCAqKXJlc3BvbnNlKSAwIGlzIHRoZSBUUyAyNy4wMDcgc2VydmljZSBjbGFzcyBiaXQgdmVjdG9yIG9mCkBAIC0xNjg1LDYgKzE4NzYsOSBAQAogICogKChjb25zdCBjaGFyICoqKWRhdGEpWzNdID0gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGRlY2ltYWwgVFMgMjcuMDA3CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIGNsYXNzIGJpdCB2ZWN0b3IuIEVnLCB0aGUgc3RyaW5nCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSIgbWVhbnMgInNldCB0aGlzIGZhY2lsaXR5IGZvciB2b2ljZSBzZXJ2aWNlcyIKKyAqICgoY29uc3QgY2hhciAqKilkYXRhKVs0XSA9IEFJRCB2YWx1ZSwgU2VlIEVUU0kgMTAyLjIyMSA4LjEgYW5kIDEwMS4yMjAgNCwgTlVMTCBpZiBubyB2YWx1ZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGluIHRoZSBjYXNlIG9mIEZpeGVkIERpYWxpbmcgTnVtYmVycworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZETikgcmVxdWVzdHMuCiAgKgogICogInJlc3BvbnNlIiBpcyBpbnQgKgogICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgdGhlIG51bWJlciBvZiByZXRyaWVzIHJlbWFpbmluZywgb3IgLTEgaWYgdW5rbm93bgpAQCAtMTk2MSw3ICsyMTU1LDggQEAKICNkZWZpbmUgUklMX1JFUVVFU1RfUVVFUllfQ0xJUCA1NQogCiAvKioKLSAqIFJJTF9SRVFVRVNUX0xBU1RfREFUQV9DQUxMX0ZBSUxfQ0FVU0UKKyAqIFJJTF9SRVFVRVNUX0xBU1RfREFUQV9DQUxMX0ZBSUxfQ0FVU0UgLSBEZXByZWNhdGVkIHVzZSB0aGUgc3RhdHVzCisgKiBmaWVsZCBpbiBSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlX3Y2LgogICoKICAqIFJlcXVlc3RzIHRoZSBmYWlsdXJlIGNhdXNlIGNvZGUgZm9yIHRoZSBtb3N0IHJlY2VudGx5IGZhaWxlZCBQRFAKICAqIGNvbnRleHQgb3IgQ0RNQSBkYXRhIGNvbm5lY3Rpb24gYWN0aXZlCkBAIC0xOTc1LDcgKzIxNzAsNyBAQAogICoKICAqIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgZXhhY3QgY2F1c2UgY29kZXMsCiAgKiB0aGVuIGl0IHNob3VsZCByZXR1cm4gb25lIG9mIHRoZSB2YWx1ZXMgbGlzdGVkIGluCi0gKiBSSUxfTGFzdERhdGFDYWxsQWN0aXZhdGVGYWlsQ2F1c2UsIGFzIHRoZSBVSSBsYXllciBuZWVkcyB0byBkaXN0aW5ndWlzaCB0aGVzZQorICogUklMX0RhdGFDYWxsRmFpbENhdXNlLCBhcyB0aGUgVUkgbGF5ZXIgbmVlZHMgdG8gZGlzdGluZ3Vpc2ggdGhlc2UKICAqIGNhc2VzIGZvciBlcnJvciBub3RpZmljYXRpb24KICAqIGFuZCBwb3RlbnRpYWwgcmV0cmllcy4KICAqCkBAIC0xOTg2LDYgKzIxODEsNyBAQAogICoKICAqIFNlZSBhbHNvOiBSSUxfUkVRVUVTVF9MQVNUX0NBTExfRkFJTF9DQVVTRQogICoKKyAqIERlcHJlY2F0ZWQgdXNlIHRoZSBzdGF0dXMgZmllbGQgaW4gUklMX0RhdGFfQ2FsbF9SZXNwb25zZV92Ni4KICAqLwogCiAjZGVmaW5lIFJJTF9SRVFVRVNUX0xBU1RfREFUQV9DQUxMX0ZBSUxfQ0FVU0UgNTYKQEAgLTE5OTMsMTggKzIxODksMjAgQEAKIC8qKgogICogUklMX1JFUVVFU1RfREFUQV9DQUxMX0xJU1QKICAqCi0gKiBRdWVyaWVzIHRoZSBzdGF0dXMgb2YgUERQIGNvbnRleHRzLCByZXR1cm5pbmcgZm9yIGVhY2gKLSAqIGl0cyBDSUQsIHdoZXRoZXIgb3Igbm90IGl0IGlzIGFjdGl2ZSwgYW5kIGl0cyBQRFAgdHlwZSwKLSAqIEFQTiwgYW5kIFBEUCBhZGRkcmVzcy4KLSAqIHJlcGxhY2VzIFJJTF9SRVFVRVNUX1BEUF9DT05URVhUX0xJU1QKKyAqIFJldHVybnMgdGhlIGRhdGEgY2FsbCBsaXN0LiBBbiBlbnRyeSBpcyBhZGRlZCB3aGVuIGEKKyAqIFJJTF9SRVFVRVNUX1NFVFVQX0RBVEFfQ0FMTCBpcyBpc3N1ZWQgYW5kIHJlbW92ZWQgb24gYQorICogUklMX1JFUVVFU1RfREVBQ1RJVkFURV9EQVRBX0NBTEwuIFRoZSBsaXN0IGlzIGVtcHRpZWQKKyAqIHdoZW4gUklMX1JFUVVFU1RfUkFESU9fUE9XRVIgb2ZmL29uIGlzIGlzc3VlZC4KICAqCiAgKiAiZGF0YSIgaXMgTlVMTAotICogInJlc3BvbnNlIiBpcyBhbiBhcnJheSBvZiBSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlCisgKiAicmVzcG9uc2UiIGlzIGFuIGFycmF5IG9mIFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjYKICAqCiAgKiBWYWxpZCBlcnJvcnM6CiAgKiAgU1VDQ0VTUwogICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICAqICBHRU5FUklDX0ZBSUxVUkUKKyAqCisgKiBTZWUgYWxzbzogUklMX1VOU09MX0RBVEFfQ0FMTF9MSVNUX0NIQU5HRUQKICAqLwogCiAjZGVmaW5lIFJJTF9SRVFVRVNUX0RBVEFfQ0FMTF9MSVNUIDU3CkBAIC0yMzU1LDE2ICsyNTUzLDcgQEAKICAqIFJlcXVlc3RzIHRvIHNldCB0aGUgcHJlZmVycmVkIG5ldHdvcmsgdHlwZSBmb3Igc2VhcmNoaW5nIGFuZCByZWdpc3RlcmluZwogICogKENTL1BTIGRvbWFpbiwgUkFULCBhbmQgb3BlcmF0aW9uIG1vZGUpCiAgKgotICogImRhdGEiIGlzIGludCAqCi0gKgotICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAwIGZvciBHU00vV0NETUEgKFdDRE1BIHByZWZlcnJlZCkKLSAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMSBmb3IgR1NNIG9ubHkKLSAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMiBmb3IgV0NETUEgb25seQotICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAzIGZvciBHU00vV0NETUEgKGF1dG8gbW9kZSwgYWNjb3JkaW5nIHRvIFBSTCkKLSAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gNCBmb3IgQ0RNQSBhbmQgRXZEbyAoYXV0byBtb2RlLCBhY2NvcmRpbmcgdG8gUFJMKQotICogKChpbnQgKilkYXRhKVswXSBpcyA9PSA1IGZvciBDRE1BIG9ubHkKLSAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gNiBmb3IgRXZEbyBvbmx5Ci0gKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDcgZm9yIEdTTS9XQ0RNQSwgQ0RNQSwgYW5kIEV2RG8gKGF1dG8gbW9kZSwgYWNjb3JkaW5nIHRvIFBSTCkKKyAqICJkYXRhIiBpcyBpbnQgKiB3aGljaCBpcyBSSUxfUHJlZmVycmVkTmV0d29ya1R5cGUKICAqCiAgKiAicmVzcG9uc2UiIGlzIE5VTEwKICAqCkBAIC0yMzg1LDE0ICsyNTc0LDcgQEAKICAqICJkYXRhIiBpcyBOVUxMCiAgKgogICogInJlc3BvbnNlIiBpcyBpbnQgKgotICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gMCBmb3IgR1NNL1dDRE1BIChXQ0RNQSBwcmVmZXJyZWQpCi0gKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyA9PSAxIGZvciBHU00gb25seQotICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gMiBmb3IgV0NETUEgb25seQotICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gMyBmb3IgR1NNL1dDRE1BIChhdXRvIG1vZGUsIGFjY29yZGluZyB0byBQUkwpCi0gKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyA9PSA0IGZvciBDRE1BIGFuZCBFdkRvIChhdXRvIG1vZGUsIGFjY29yZGluZyB0byBQUkwpCi0gKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyA9PSA1IGZvciBDRE1BIG9ubHkKLSAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzID09IDYgZm9yIEV2RG8gb25seQotICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gNyBmb3IgR1NNL1dDRE1BLCBDRE1BLCBhbmQgRXZEbyAoYXV0byBtb2RlLCBhY2NvcmRpbmcgdG8gUFJMKQorICogKChpbnQgKilyZXBvbnNlKVswXSBpcyA9PSBSSUxfUHJlZmVycmVkTmV0d29ya1R5cGUKICAqCiAgKiBWYWxpZCBlcnJvcnM6CiAgKiAgU1VDQ0VTUwpAQCAtMjQ0NCwxNCArMjYyNiwxMyBAQAogI2RlZmluZSBSSUxfUkVRVUVTVF9TRVRfTE9DQVRJT05fVVBEQVRFUyA3NgogCiAvKioKLSAqIFJJTF9SRVFVRVNUX0NETUFfU0VUX1NVQlNDUklQVElPTgorICogUklMX1JFUVVFU1RfQ0RNQV9TRVRfU1VCU0NSSVBUSU9OX1NPVVJDRQogICoKICAqIFJlcXVlc3QgdG8gc2V0IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgQ0RNQSBzdWJzY3JpcHRpb24gc2hhbGwKICAqIGJlIHJldHJpZXZlZAogICoKICAqICJkYXRhIiBpcyBpbnQgKgotICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAwIGZyb20gUlVJTS9TSU0gKGRlZmF1bHQpCi0gKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDEgZnJvbSBOVgorICogKChpbnQgKilkYXRhKVswXSBpcyA9PSBSSUxfQ2RtYVN1YnNjcmlwdGlvblNvdXJjZQogICoKICAqICJyZXNwb25zZSIgaXMgTlVMTAogICoKQEAgLTI0NjEsOCArMjY0MiwxMCBAQAogICogIEdFTkVSSUNfRkFJTFVSRQogICogIFNJTV9BQlNFTlQKICAqICBTVUJTQ1JJUFRJT05fTk9UX0FWQUlMQUJMRQorICoKKyAqIFNlZSBhbHNvOiBSSUxfUkVRVUVTVF9DRE1BX0dFVF9TVUJTQ1JJUFRJT05fU09VUkNFCiAgKi8KLSNkZWZpbmUgUklMX1JFUVVFU1RfQ0RNQV9TRVRfU1VCU0NSSVBUSU9OIDc3CisjZGVmaW5lIFJJTF9SRVFVRVNUX0NETUFfU0VUX1NVQlNDUklQVElPTl9TT1VSQ0UgNzcKIAogLyoqCiAgKiBSSUxfUkVRVUVTVF9DRE1BX1NFVF9ST0FNSU5HX1BSRUZFUkVOQ0UKQEAgLTI5ODQsNiArMzE2NywyNyBAQAogICovCiAjZGVmaW5lIFJJTF9SRVFVRVNUX1JFUE9SVF9TVEtfU0VSVklDRV9JU19SVU5OSU5HIDEwMwogCisvKioKKyAqIFJJTF9SRVFVRVNUX0NETUFfR0VUX1NVQlNDUklQVElPTl9TT1VSQ0UKKyAqCisgKiBSZXF1ZXN0IHRvIHF1ZXJ5IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgQ0RNQSBzdWJzY3JpcHRpb24gc2hhbGwKKyAqIGJlIHJldHJpZXZlZAorICoKKyAqICJkYXRhIiBpcyBOVUxMCisgKgorICogInJlc3BvbnNlIiBpcyBpbnQgKgorICogKChpbnQgKilkYXRhKVswXSBpcyA9PSBSSUxfQ2RtYVN1YnNjcmlwdGlvblNvdXJjZQorICoKKyAqIFZhbGlkIGVycm9yczoKKyAqICBTVUNDRVNTCisgKiAgUkFESU9fTk9UX0FWQUlMQUJMRQorICogIEdFTkVSSUNfRkFJTFVSRQorICogIFNVQlNDUklQVElPTl9OT1RfQVZBSUxBQkxFCisgKgorICogU2VlIGFsc286IFJJTF9SRVFVRVNUX0NETUFfU0VUX1NVQlNDUklQVElPTl9TT1VSQ0UKKyAqLworI2RlZmluZSBSSUxfUkVRVUVTVF9DRE1BX0dFVF9TVUJTQ1JJUFRJT05fU09VUkNFIDEwNAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIApAQCAtMzAyMSwxNSArMzIyNSwxMyBAQAogCiAKIC8qKgotICogUklMX1VOU09MX1JFU1BPTlNFX05FVFdPUktfU1RBVEVfQ0hBTkdFRAorICogUklMX1VOU09MX1JFU1BPTlNFX1ZPSUNFX05FVFdPUktfU1RBVEVfQ0hBTkdFRAogICoKLSAqIENhbGxlZCB3aGVuIG5ldHdvcmsgc3RhdGUsIG9wZXJhdG9yIG5hbWUsIG9yIEdQUlMgc3RhdGUgaGFzIGNoYW5nZWQKLSAqIEJhc2ljYWxseSBvbiwgK0NSRUcgYW5kICtDR1JFRworICogQ2FsbGVkIHdoZW4gdGhlIHZvaWNlIG5ldHdvcmsgc3RhdGUgY2hhbmdlZAogICoKICAqIENhbGxlZSB3aWxsIGludm9rZSB0aGUgZm9sbG93aW5nIHJlcXVlc3RzIG9uIG1haW4gdGhyZWFkOgogICoKLSAqIFJJTF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFURQotICogUklMX1JFUVVFU1RfR1BSU19SRUdJU1RSQVRJT05fU1RBVEUKKyAqIFJJTF9SRVFVRVNUX1ZPSUNFX1JFR0lTVFJBVElPTl9TVEFURQogICogUklMX1JFUVVFU1RfT1BFUkFUT1IKICAqCiAgKiAiZGF0YSIgaXMgTlVMTApAQCAtMzAzNyw3ICszMjM5LDcgQEAKICAqIEZJWE1FIHNob3VsZCB0aGlzIGhhcHBlbiB3aGVuIFNJTSByZWNvcmRzIGFyZSBsb2FkZWQ/IChlZywgZm9yCiAgKiBFT05TKQogICovCi0jZGVmaW5lIFJJTF9VTlNPTF9SRVNQT05TRV9ORVRXT1JLX1NUQVRFX0NIQU5HRUQgMTAwMgorI2RlZmluZSBSSUxfVU5TT0xfUkVTUE9OU0VfVk9JQ0VfTkVUV09SS19TVEFURV9DSEFOR0VEIDEwMDIKIAogLyoqCiAgKiBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNUwpAQCAtMzE0NiwxMiArMzM0OCwxMiBAQAogLyoqCiAgKiBSSUxfVU5TT0xfREFUQV9DQUxMX0xJU1RfQ0hBTkdFRAogICoKLSAqIEluZGljYXRlIGEgUERQIGNvbnRleHQgc3RhdGUgaGFzIGNoYW5nZWQsIG9yIGEgbmV3IGNvbnRleHQKLSAqIGhhcyBiZWVuIGFjdGl2YXRlZCBvciBkZWFjdGl2YXRlZAotICogcmVwbGFjZXMgUklMX1VOU09MX1BEUF9DT05URVhUX0xJU1RfQ0hBTkdFRAotICoKLSAqICJkYXRhIiBpcyBhbiBhcnJheSBvZiBSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlIGlkZW50aWNhbCB0byB0aGF0Ci0gKiByZXR1cm5lZCBieSBSSUxfUkVRVUVTVF9EQVRBX0NBTExfTElTVAorICogImRhdGEiIGlzIGFuIGFycmF5IG9mIFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjYgaWRlbnRpY2FsIHRvIHRoYXQKKyAqIHJldHVybmVkIGJ5IFJJTF9SRVFVRVNUX0RBVEFfQ0FMTF9MSVNULiBJdCBpcyB0aGUgY29tcGxldGUgbGlzdAorICogb2YgY3VycmVudCBkYXRhIGNvbnRleHRzIGluY2x1ZGluZyBuZXcgY29udGV4dHMgdGhhdCBoYXZlIGJlZW4KKyAqIGFjdGl2YXRlZC4gQSBkYXRhIGNhbGwgaXMgb25seSByZW1vdmVkIGZyb20gdGhpcyBsaXN0IHdoZW4gdGhlCisgKiBmcmFtZXdvcmsgc2VuZHMgYSBSSUxfUkVRVUVTVF9ERUFDVElWQVRFX0RBVEFfQ0FMTCBvciB0aGUgcmFkaW8KKyAqIGlzIHBvd2VyZWQgb2ZmL29uLgogICoKICAqIFNlZSBhbHNvOiBSSUxfUkVRVUVTVF9EQVRBX0NBTExfTElTVAogICovCkBAIC0zMjM1LDcgKzM0MzcsOCBAQAogICogImRhdGEiIGlzIGFuIGludCAqCiAgKiAoKGludCAqKWRhdGEpWzBdIGlzIGEgUklMX1NpbVJlZnJlc2hSZXN1bHQuCiAgKiAoKGludCAqKWRhdGEpWzFdIGlzIHRoZSBFRklEIG9mIHRoZSB1cGRhdGVkIGZpbGUgaWYgdGhlIHJlc3VsdCBpcwotICogU0lNX0ZJTEVfVVBEQVRFIG9yIE5VTEwgZm9yIGFueSBvdGhlciByZXN1bHQuCisgKiBTSU1fRklMRV9VUERBVEUsIEFJRChhcHBsaWNhdGlvbiBJRCkgb2YgdGhlIGNhcmQgYXBwbGljYXRpb24KKyAqIHRyaWdnZXJpbmcgdGhlIFJFRlJFU0ggaWYgdGhlIHJlc3VsdCBpcyBTSU1fSU5JVCwgb3IgTlVMTCBmb3IgYW55IG90aGVyIHJlc3VsdC4KICAqCiAgKiBOb3RlOiBJZiB0aGUgcmFkaW8gc3RhdGUgY2hhbmdlcyBhcyBhIHJlc3VsdCBvZiB0aGUgU0lNIHJlZnJlc2ggKGVnLAogICogU0lNX1JFQURZIC0+IFNJTV9MT0NLRURfT1JfQUJTRU5UKSwgUklMX1VOU09MX1JFU1BPTlNFX1JBRElPX1NUQVRFX0NIQU5HRUQKQEAgLTM0MDQsNiArMzYwNyw1MCBAQAogICogImRhdGEiIGlzIG51bGwKICAqLwogI2RlZmluZSBSSUxfVU5TT0xfUkVTRU5EX0lOQ0FMTF9NVVRFIDEwMzAKKworLyoqCisgKiBSSUxfVU5TT0xfQ0RNQV9TVUJTQ1JJUFRJT05fU09VUkNFX0NIQU5HRUQKKyAqCisgKiBDYWxsZWQgd2hlbiBDRE1BIHN1YnNjcmlwdGlvbiBzb3VyY2UgY2hhbmdlZC4KKyAqCisgKiAiZGF0YSIgaXMgaW50ICoKKyAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gUklMX0NkbWFTdWJzY3JpcHRpb25Tb3VyY2UKKyAqLworI2RlZmluZSBSSUxfVU5TT0xfQ0RNQV9TVUJTQ1JJUFRJT05fU09VUkNFX0NIQU5HRUQgMTAzMQorCisvKioKKyAqIFJJTF9VTlNPTF9DRE1BX1BSTF9DSEFOR0VECisgKgorICogQ2FsbGVkIHdoZW4gUFJMIChwcmVmZXJyZWQgcm9hbWluZyBsaXN0KSBjaGFuZ2VzLgorICoKKyAqICJkYXRhIiBpcyBpbnQgKgorICogKChpbnQgKilkYXRhKVswXSBpcyBQUkxfVkVSU0lPTiBhcyB3b3VsZCBiZSByZXR1cm5lZCBieSBSSUxfUkVRVUVTVF9DRE1BX1NVQlNDUklQVElPTgorICovCisjZGVmaW5lIFJJTF9VTlNPTF9DRE1BX1BSTF9DSEFOR0VEIDEwMzIKKworLyoqCisgKiBSSUxfVU5TT0xfRVhJVF9FTUVSR0VOQ1lfQ0FMTEJBQ0tfTU9ERQorICoKKyAqIENhbGxlZCB3aGVuIEVtZXJnZW5jeSBDYWxsYmFjayBNb2RlIEVuZHMKKyAqCisgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmFkaW8gc3lzdGVtIHNlbGVjdGlvbiBtb2R1bGUgaGFzCisgKiBwcm9hY3RpdmVseSBleGl0ZWQgZW1lcmdlbmN5IGNhbGxiYWNrIG1vZGUuCisgKgorICogImRhdGEiIGlzIE5VTEwKKyAqCisgKi8KKyNkZWZpbmUgUklMX1VOU09MX0VYSVRfRU1FUkdFTkNZX0NBTExCQUNLX01PREUgMTAzMworCisvKioKKyAqIFJJTF9VTlNPTF9SSUxfQ09OTkVDVEVECisgKgorICogQ2FsbGVkIHRoZSByaWwgY29ubmVjdHMgYW5kIHJldHVybnMgdGhlIHZlcnNpb24KKyAqCisgKiAiZGF0YSIgaXMgaW50ICoKKyAqICgoaW50ICopZGF0YSlbMF0gaXMgUklMX1ZFUlNJT04KKyAqLworI2RlZmluZSBSSUxfVU5TT0xfUklMX0NPTk5FQ1RFRCAxMDM0CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCmRpZmYgLS1naXQgYS9saWJyaWwvcmlsLmNwcCBiL2xpYnJpbC9yaWwuY3BwCmluZGV4IGNhMTlkN2MuLjMxNmJjZDQgMTAwNjQ0Ci0tLSBhL2xpYnJpbC9yaWwuY3BwCisrKyBiL2xpYnJpbC9yaWwuY3BwCkBAIC0yMTcsNiArMjE3LDcgQEAKIHN0YXRpYyBpbnQgcmVzcG9uc2VTSU1fSU8oUGFyY2VsICZwLCB2b2lkICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlbGVuKTsKIHN0YXRpYyBpbnQgcmVzcG9uc2VDYWxsRm9yd2FyZHMoUGFyY2VsICZwLCB2b2lkICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlbGVuKTsKIHN0YXRpYyBpbnQgcmVzcG9uc2VEYXRhQ2FsbExpc3QoUGFyY2VsICZwLCB2b2lkICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlbGVuKTsKK3N0YXRpYyBpbnQgcmVzcG9uc2VTZXR1cERhdGFDYWxsKFBhcmNlbCAmcCwgdm9pZCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZWxlbik7CiBzdGF0aWMgaW50IHJlc3BvbnNlUmF3KFBhcmNlbCAmcCwgdm9pZCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZWxlbik7CiBzdGF0aWMgaW50IHJlc3BvbnNlU3NuKFBhcmNlbCAmcCwgdm9pZCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZWxlbik7CiBzdGF0aWMgaW50IHJlc3BvbnNlU2ltU3RhdHVzKFBhcmNlbCAmcCwgdm9pZCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZWxlbik7CkBAIC02NjgsMTEgKzY2OSwxNyBAQAogICogICBpbnQzMl90IHAxLCBwMiwgcDMKICAqICAgU3RyaW5nIGRhdGEKICAqICAgU3RyaW5nIHBpbjIKKyAqICAgU3RyaW5nIGFpZFB0cgogICovCiBzdGF0aWMgdm9pZAogZGlzcGF0Y2hTSU1fSU8gKFBhcmNlbCAmcCwgUmVxdWVzdEluZm8gKnBSSSkgewotICAgIFJJTF9TSU1fSU8gc2ltSU87CisgICAgdW5pb24gUklMX1NJTV9JTyB7CisgICAgICAgIFJJTF9TSU1fSU9fdjYgdjY7CisgICAgICAgIFJJTF9TSU1fSU9fdjUgdjU7CisgICAgfSBzaW1JTzsKKwogICAgIGludDMyX3QgdDsKKyAgICBpbnQgc2l6ZTsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAKICAgICBtZW1zZXQgKCZzaW1JTywgMCwgc2l6ZW9mKHNpbUlPKSk7CkBAIC02ODAsMzAgKzY4NywzMSBAQAogICAgIC8vIG5vdGUgd2Ugb25seSBjaGVjayBzdGF0dXMgYXQgdGhlIGVuZAogCiAgICAgc3RhdHVzID0gcC5yZWFkSW50MzIoJnQpOwotICAgIHNpbUlPLmNvbW1hbmQgPSAoaW50KXQ7CisgICAgc2ltSU8udjYuY29tbWFuZCA9IChpbnQpdDsKIAogICAgIHN0YXR1cyA9IHAucmVhZEludDMyKCZ0KTsKLSAgICBzaW1JTy5maWxlaWQgPSAoaW50KXQ7CisgICAgc2ltSU8udjYuZmlsZWlkID0gKGludCl0OwogCi0gICAgc2ltSU8ucGF0aCA9IHN0cmR1cFJlYWRTdHJpbmcocCk7CisgICAgc2ltSU8udjYucGF0aCA9IHN0cmR1cFJlYWRTdHJpbmcocCk7CiAKICAgICBzdGF0dXMgPSBwLnJlYWRJbnQzMigmdCk7Ci0gICAgc2ltSU8ucDEgPSAoaW50KXQ7CisgICAgc2ltSU8udjYucDEgPSAoaW50KXQ7CiAKICAgICBzdGF0dXMgPSBwLnJlYWRJbnQzMigmdCk7Ci0gICAgc2ltSU8ucDIgPSAoaW50KXQ7CisgICAgc2ltSU8udjYucDIgPSAoaW50KXQ7CiAKICAgICBzdGF0dXMgPSBwLnJlYWRJbnQzMigmdCk7Ci0gICAgc2ltSU8ucDMgPSAoaW50KXQ7CisgICAgc2ltSU8udjYucDMgPSAoaW50KXQ7CiAKLSAgICBzaW1JTy5kYXRhID0gc3RyZHVwUmVhZFN0cmluZyhwKTsKLSAgICBzaW1JTy5waW4yID0gc3RyZHVwUmVhZFN0cmluZyhwKTsKKyAgICBzaW1JTy52Ni5kYXRhID0gc3RyZHVwUmVhZFN0cmluZyhwKTsKKyAgICBzaW1JTy52Ni5waW4yID0gc3RyZHVwUmVhZFN0cmluZyhwKTsKKyAgICBzaW1JTy52Ni5haWRQdHIgPSBzdHJkdXBSZWFkU3RyaW5nKHApOwogCiAgICAgc3RhcnRSZXF1ZXN0OwotICAgIGFwcGVuZFByaW50QnVmKCIlc2NtZD0weCVYLGVmaWQ9MHglWCxwYXRoPSVzLCVkLCVkLCVkLCVzLHBpbjI9JXMiLCBwcmludEJ1ZiwKLSAgICAgICAgc2ltSU8uY29tbWFuZCwgc2ltSU8uZmlsZWlkLCAoY2hhciopc2ltSU8ucGF0aCwKLSAgICAgICAgc2ltSU8ucDEsIHNpbUlPLnAyLCBzaW1JTy5wMywKLSAgICAgICAgKGNoYXIqKXNpbUlPLmRhdGEsICAoY2hhciopc2ltSU8ucGluMik7CisgICAgYXBwZW5kUHJpbnRCdWYoIiVzY21kPTB4JVgsZWZpZD0weCVYLHBhdGg9JXMsJWQsJWQsJWQsJXMscGluMj0lcyxhaWQ9JXMiLCBwcmludEJ1ZiwKKyAgICAgICAgc2ltSU8udjYuY29tbWFuZCwgc2ltSU8udjYuZmlsZWlkLCAoY2hhciopc2ltSU8udjYucGF0aCwKKyAgICAgICAgc2ltSU8udjYucDEsIHNpbUlPLnY2LnAyLCBzaW1JTy52Ni5wMywKKyAgICAgICAgKGNoYXIqKXNpbUlPLnY2LmRhdGEsICAoY2hhciopc2ltSU8udjYucGluMiwgc2ltSU8udjYuYWlkUHRyKTsKICAgICBjbG9zZVJlcXVlc3Q7CiAgICAgcHJpbnRSZXF1ZXN0KHBSSS0+dG9rZW4sIHBSSS0+cENJLT5yZXF1ZXN0TnVtYmVyKTsKIApAQCAtNzExLDE3ICs3MTksMjAgQEAKICAgICAgICAgZ290byBpbnZhbGlkOwogICAgIH0KIAotICAgICAgIHNfY2FsbGJhY2tzLm9uUmVxdWVzdChwUkktPnBDSS0+cmVxdWVzdE51bWJlciwgJnNpbUlPLCBzaXplb2Yoc2ltSU8pLCBwUkkpOworICAgIHNpemUgPSAoc19jYWxsYmFja3MudmVyc2lvbiA8IDYpID8gc2l6ZW9mKHNpbUlPLnY1KSA6IHNpemVvZihzaW1JTy52Nik7CisgICAgc19jYWxsYmFja3Mub25SZXF1ZXN0KHBSSS0+cENJLT5yZXF1ZXN0TnVtYmVyLCAmc2ltSU8sIHNpemUsIHBSSSk7CiAKICNpZmRlZiBNRU1TRVRfRlJFRUQKLSAgICBtZW1zZXRTdHJpbmcgKHNpbUlPLnBhdGgpOwotICAgIG1lbXNldFN0cmluZyAoc2ltSU8uZGF0YSk7Ci0gICAgbWVtc2V0U3RyaW5nIChzaW1JTy5waW4yKTsKKyAgICBtZW1zZXRTdHJpbmcgKHNpbUlPLnY2LnBhdGgpOworICAgIG1lbXNldFN0cmluZyAoc2ltSU8udjYuZGF0YSk7CisgICAgbWVtc2V0U3RyaW5nIChzaW1JTy52Ni5waW4yKTsKKyAgICBtZW1zZXRTdHJpbmcgKHNpbUlPLnY2LmFpZFB0cik7CiAjZW5kaWYKIAotICAgIGZyZWUgKHNpbUlPLnBhdGgpOwotICAgIGZyZWUgKHNpbUlPLmRhdGEpOwotICAgIGZyZWUgKHNpbUlPLnBpbjIpOworICAgIGZyZWUgKHNpbUlPLnY2LnBhdGgpOworICAgIGZyZWUgKHNpbUlPLnY2LmRhdGEpOworICAgIGZyZWUgKHNpbUlPLnY2LnBpbjIpOworICAgIGZyZWUgKHNpbUlPLnY2LmFpZFB0cik7CiAKICNpZmRlZiBNRU1TRVRfRlJFRUQKICAgICBtZW1zZXQoJnNpbUlPLCAwLCBzaXplb2Yoc2ltSU8pKTsKQEAgLTEzMTMsNiArMTMyNCwxMyBAQAogICAgIHJldHVybiAwOwogfQogCisvKiogcmVzcG9uc2UgaXMgYSBjaGFyICoqLCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBjaGFyIConcworICAgIFRoZSBwYXJjZWwgd2lsbCBiZWdpbiB3aXRoIHRoZSB2ZXJzaW9uICovCitzdGF0aWMgaW50IHJlc3BvbnNlU3RyaW5nc1dpdGhWZXJzaW9uKGludCB2ZXJzaW9uLCBQYXJjZWwgJnAsIHZvaWQgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VsZW4pIHsKKyAgICBwLndyaXRlSW50MzIodmVyc2lvbik7CisgICAgcmV0dXJuIHJlc3BvbnNlU3RyaW5ncyhwLCByZXNwb25zZSwgcmVzcG9uc2VsZW4pOworfQorCiAvKiogcmVzcG9uc2UgaXMgYSBjaGFyICoqLCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBjaGFyIConcyAqLwogc3RhdGljIGludCByZXNwb25zZVN0cmluZ3MoUGFyY2VsICZwLCB2b2lkICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlbGVuKSB7CiAgICAgaW50IG51bVN0cmluZ3M7CkBAIC0xNDY1LDM2ICsxNDgzLDM1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVzcG9uc2VEYXRhQ2FsbExpc3QoUGFyY2VsICZwLCB2b2lkICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlbGVuKQorc3RhdGljIGludCByZXNwb25zZURhdGFDYWxsTGlzdFY0KFBhcmNlbCAmcCwgdm9pZCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZWxlbikKIHsKICAgICBpZiAocmVzcG9uc2UgPT0gTlVMTCAmJiByZXNwb25zZWxlbiAhPSAwKSB7CiAgICAgICAgIExPR0UoImludmFsaWQgcmVzcG9uc2U6IE5VTEwiKTsKICAgICAgICAgcmV0dXJuIFJJTF9FUlJOT19JTlZBTElEX1JFU1BPTlNFOwogICAgIH0KIAotICAgIGlmIChyZXNwb25zZWxlbiAlIHNpemVvZihSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlKSAhPSAwKSB7CisgICAgaWYgKHJlc3BvbnNlbGVuICUgc2l6ZW9mKFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjQpICE9IDApIHsKICAgICAgICAgTE9HRSgiaW52YWxpZCByZXNwb25zZSBsZW5ndGggJWQgZXhwZWN0ZWQgbXVsdGlwbGUgb2YgJWQiLAotICAgICAgICAgICAgICAgIChpbnQpcmVzcG9uc2VsZW4sIChpbnQpc2l6ZW9mKFJJTF9EYXRhX0NhbGxfUmVzcG9uc2UpKTsKKyAgICAgICAgICAgICAgICAoaW50KXJlc3BvbnNlbGVuLCAoaW50KXNpemVvZihSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlX3Y0KSk7CiAgICAgICAgIHJldHVybiBSSUxfRVJSTk9fSU5WQUxJRF9SRVNQT05TRTsKICAgICB9CiAKLSAgICBpbnQgbnVtID0gcmVzcG9uc2VsZW4gLyBzaXplb2YoUklMX0RhdGFfQ2FsbF9SZXNwb25zZSk7CisgICAgaW50IG51bSA9IHJlc3BvbnNlbGVuIC8gc2l6ZW9mKFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjQpOwogICAgIHAud3JpdGVJbnQzMihudW0pOwogCi0gICAgUklMX0RhdGFfQ2FsbF9SZXNwb25zZSAqcF9jdXIgPSAoUklMX0RhdGFfQ2FsbF9SZXNwb25zZSAqKSByZXNwb25zZTsKKyAgICBSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlX3Y0ICpwX2N1ciA9IChSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlX3Y0ICopIHJlc3BvbnNlOwogICAgIHN0YXJ0UmVzcG9uc2U7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAgICAgICAgIHAud3JpdGVJbnQzMihwX2N1cltpXS5jaWQpOwogICAgICAgICBwLndyaXRlSW50MzIocF9jdXJbaV0uYWN0aXZlKTsKICAgICAgICAgd3JpdGVTdHJpbmdUb1BhcmNlbChwLCBwX2N1cltpXS50eXBlKTsKLSAgICAgICAgd3JpdGVTdHJpbmdUb1BhcmNlbChwLCBwX2N1cltpXS5hcG4pOworICAgICAgICAvLyBhcG4gaXMgbm90IHVzZWQsIHNvIGRvbid0IHNlbmQuCiAgICAgICAgIHdyaXRlU3RyaW5nVG9QYXJjZWwocCwgcF9jdXJbaV0uYWRkcmVzcyk7Ci0gICAgICAgIGFwcGVuZFByaW50QnVmKCIlc1tjaWQ9JWQsJXMsJXMsJXMsJXNdLCIsIHByaW50QnVmLAorICAgICAgICBhcHBlbmRQcmludEJ1ZigiJXNbY2lkPSVkLCVzLCVzLCVzXSwiLCBwcmludEJ1ZiwKICAgICAgICAgICAgIHBfY3VyW2ldLmNpZCwKICAgICAgICAgICAgIChwX2N1cltpXS5hY3RpdmU9PTApPyJkb3duIjoidXAiLAogICAgICAgICAgICAgKGNoYXIqKXBfY3VyW2ldLnR5cGUsCi0gICAgICAgICAgICAoY2hhciopcF9jdXJbaV0uYXBuLAogICAgICAgICAgICAgKGNoYXIqKXBfY3VyW2ldLmFkZHJlc3MpOwogICAgIH0KICAgICByZW1vdmVMYXN0Q2hhcjsKQEAgLTE1MDMsNiArMTUyMCw2NSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHJlc3BvbnNlRGF0YUNhbGxMaXN0KFBhcmNlbCAmcCwgdm9pZCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZWxlbikKK3sKKyAgICAvLyBXcml0ZSB2ZXJzaW9uCisgICAgcC53cml0ZUludDMyKHNfY2FsbGJhY2tzLnZlcnNpb24pOworCisgICAgaWYgKHNfY2FsbGJhY2tzLnZlcnNpb24gPCA1KSB7CisgICAgICAgIHJldHVybiByZXNwb25zZURhdGFDYWxsTGlzdFY0KHAsIHJlc3BvbnNlLCByZXNwb25zZWxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IE5VTEwgJiYgcmVzcG9uc2VsZW4gIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiaW52YWxpZCByZXNwb25zZTogTlVMTCIpOworICAgICAgICAgICAgcmV0dXJuIFJJTF9FUlJOT19JTlZBTElEX1JFU1BPTlNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3BvbnNlbGVuICUgc2l6ZW9mKFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjYpICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoImludmFsaWQgcmVzcG9uc2UgbGVuZ3RoICVkIGV4cGVjdGVkIG11bHRpcGxlIG9mICVkIiwKKyAgICAgICAgICAgICAgICAgICAgKGludClyZXNwb25zZWxlbiwgKGludClzaXplb2YoUklMX0RhdGFfQ2FsbF9SZXNwb25zZV92NikpOworICAgICAgICAgICAgcmV0dXJuIFJJTF9FUlJOT19JTlZBTElEX1JFU1BPTlNFOworICAgICAgICB9CisKKyAgICAgICAgaW50IG51bSA9IHJlc3BvbnNlbGVuIC8gc2l6ZW9mKFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjYpOworICAgICAgICBwLndyaXRlSW50MzIobnVtKTsKKworICAgICAgICBSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlX3Y2ICpwX2N1ciA9IChSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlX3Y2ICopIHJlc3BvbnNlOworICAgICAgICBzdGFydFJlc3BvbnNlOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgICAgICBwLndyaXRlSW50MzIoKGludClwX2N1cltpXS5zdGF0dXMpOworICAgICAgICAgICAgcC53cml0ZUludDMyKHBfY3VyW2ldLmNpZCk7CisgICAgICAgICAgICBwLndyaXRlSW50MzIocF9jdXJbaV0uYWN0aXZlKTsKKyAgICAgICAgICAgIHdyaXRlU3RyaW5nVG9QYXJjZWwocCwgcF9jdXJbaV0udHlwZSk7CisgICAgICAgICAgICB3cml0ZVN0cmluZ1RvUGFyY2VsKHAsIHBfY3VyW2ldLmlmbmFtZSk7CisgICAgICAgICAgICB3cml0ZVN0cmluZ1RvUGFyY2VsKHAsIHBfY3VyW2ldLmFkZHJlc3Nlcyk7CisgICAgICAgICAgICB3cml0ZVN0cmluZ1RvUGFyY2VsKHAsIHBfY3VyW2ldLmRuc2VzKTsKKyAgICAgICAgICAgIHdyaXRlU3RyaW5nVG9QYXJjZWwocCwgcF9jdXJbaV0uZ2F0ZXdheXMpOworICAgICAgICAgICAgYXBwZW5kUHJpbnRCdWYoIiVzW3N0YXR1cz0lZCxjaWQ9JWQsJXMsJWQsJXMsJXMsJXNdLCIsIHByaW50QnVmLAorICAgICAgICAgICAgICAgIHBfY3VyW2ldLnN0YXR1cywKKyAgICAgICAgICAgICAgICBwX2N1cltpXS5jaWQsCisgICAgICAgICAgICAgICAgKHBfY3VyW2ldLmFjdGl2ZT09MCk/ImRvd24iOiJ1cCIsCisgICAgICAgICAgICAgICAgKGNoYXIqKXBfY3VyW2ldLmlmbmFtZSwKKyAgICAgICAgICAgICAgICAoY2hhciopcF9jdXJbaV0uYWRkcmVzc2VzLAorICAgICAgICAgICAgICAgIChjaGFyKilwX2N1cltpXS5kbnNlcywKKyAgICAgICAgICAgICAgICAoY2hhciopcF9jdXJbaV0uZ2F0ZXdheXMpOworICAgICAgICB9CisgICAgICAgIHJlbW92ZUxhc3RDaGFyOworICAgICAgICBjbG9zZVJlc3BvbnNlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlc3BvbnNlU2V0dXBEYXRhQ2FsbChQYXJjZWwgJnAsIHZvaWQgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VsZW4pCit7CisgICAgaWYgKHNfY2FsbGJhY2tzLnZlcnNpb24gPCA1KSB7CisgICAgICAgIHJldHVybiByZXNwb25zZVN0cmluZ3NXaXRoVmVyc2lvbihzX2NhbGxiYWNrcy52ZXJzaW9uLCBwLCByZXNwb25zZSwgcmVzcG9uc2VsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiByZXNwb25zZURhdGFDYWxsTGlzdChwLCByZXNwb25zZSwgcmVzcG9uc2VsZW4pOworICAgIH0KK30KKwogc3RhdGljIGludCByZXNwb25zZVJhdyhQYXJjZWwgJnAsIHZvaWQgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VsZW4pIHsKICAgICBpZiAocmVzcG9uc2UgPT0gTlVMTCAmJiByZXNwb25zZWxlbiAhPSAwKSB7CiAgICAgICAgIExPR0UoImludmFsaWQgcmVzcG9uc2U6IE5VTEwgd2l0aCByZXNwb25zZWxlbiAhPSAwIik7CkBAIC0xNzA1LDcgKzE3ODEsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGluZm9SZWMtPnJlYy5kaXNwbGF5LmFscGhhX2xlbiA7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBzdHJpbmc4W2ldID0gaW5mb1JlYy0+cmVjLmRpc3BsYXkuYWxwaGFfYnVmW2ldOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJpbmc4W2luZm9SZWMtPnJlYy5kaXNwbGF5LmFscGhhX2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIHN0cmluZzhbKGludClpbmZvUmVjLT5yZWMuZGlzcGxheS5hbHBoYV9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZ1RvUGFyY2VsKHAsIChjb25zdCBjaGFyKilzdHJpbmc4KTsKICAgICAgICAgICAgICAgICBmcmVlKHN0cmluZzgpOwogICAgICAgICAgICAgICAgIHN0cmluZzggPSBOVUxMOwpAQCAtMTcyNSw3ICsxODAxLDcgQEAKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpbmZvUmVjLT5yZWMubnVtYmVyLmxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0cmluZzhbaV0gPSBpbmZvUmVjLT5yZWMubnVtYmVyLmJ1ZltpXTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyaW5nOFtpbmZvUmVjLT5yZWMubnVtYmVyLmxlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIHN0cmluZzhbKGludClpbmZvUmVjLT5yZWMubnVtYmVyLmxlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nVG9QYXJjZWwocCwgKGNvbnN0IGNoYXIqKXN0cmluZzgpOwogICAgICAgICAgICAgICAgIGZyZWUoc3RyaW5nOCk7CiAgICAgICAgICAgICAgICAgc3RyaW5nOCA9IE5VTEw7CkBAIC0xNzY0LDcgKzE4NDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGkrKykgewogICAgICAgICAgICAgICAgICAgICBzdHJpbmc4W2ldID0gaW5mb1JlYy0+cmVjLnJlZGlyLnJlZGlyZWN0aW5nTnVtYmVyLmJ1ZltpXTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyaW5nOFtpbmZvUmVjLT5yZWMucmVkaXIucmVkaXJlY3RpbmdOdW1iZXIubGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgc3RyaW5nOFsoaW50KWluZm9SZWMtPnJlYy5yZWRpci5yZWRpcmVjdGluZ051bWJlci5sZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZ1RvUGFyY2VsKHAsIChjb25zdCBjaGFyKilzdHJpbmc4KTsKICAgICAgICAgICAgICAgICBmcmVlKHN0cmluZzgpOwogICAgICAgICAgICAgICAgIHN0cmluZzggPSBOVUxMOwpAQCAtMTgyNSw5ICsxOTAxLDggQEAKICAgICAgICAgcmV0dXJuIFJJTF9FUlJOT19JTlZBTElEX1JFU1BPTlNFOwogICAgIH0KIAotICAgIGlmIChyZXNwb25zZWxlbiA9PSBzaXplb2YgKFJJTF9TaWduYWxTdHJlbmd0aCkpIHsKLSAgICAgICAgLy8gTmV3IFJJTAotICAgICAgICBSSUxfU2lnbmFsU3RyZW5ndGggKnBfY3VyID0gKChSSUxfU2lnbmFsU3RyZW5ndGggKikgcmVzcG9uc2UpOworICAgIGlmIChyZXNwb25zZWxlbiA+PSBzaXplb2YgKFJJTF9TaWduYWxTdHJlbmd0aF92NSkpIHsKKyAgICAgICAgUklMX1NpZ25hbFN0cmVuZ3RoX3Y2ICpwX2N1ciA9ICgoUklMX1NpZ25hbFN0cmVuZ3RoX3Y2ICopIHJlc3BvbnNlKTsKIAogICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPkdXX1NpZ25hbFN0cmVuZ3RoLnNpZ25hbFN0cmVuZ3RoKTsKICAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT5HV19TaWduYWxTdHJlbmd0aC5iaXRFcnJvclJhdGUpOwpAQCAtMTgzNiwxMiArMTkxMSwyMyBAQAogICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPkVWRE9fU2lnbmFsU3RyZW5ndGguZGJtKTsKICAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT5FVkRPX1NpZ25hbFN0cmVuZ3RoLmVjaW8pOwogICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPkVWRE9fU2lnbmFsU3RyZW5ndGguc2lnbmFsTm9pc2VSYXRpbyk7CisgICAgICAgIGlmIChyZXNwb25zZWxlbiA+PSBzaXplb2YgKFJJTF9TaWduYWxTdHJlbmd0aF92NikpIHsKKyAgICAgICAgICAgIHAud3JpdGVJbnQzMihwX2N1ci0+TFRFX1NpZ25hbFN0cmVuZ3RoLnNpZ25hbFN0cmVuZ3RoKTsKKyAgICAgICAgICAgIHAud3JpdGVJbnQzMihwX2N1ci0+TFRFX1NpZ25hbFN0cmVuZ3RoLnJzcnApOworICAgICAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT5MVEVfU2lnbmFsU3RyZW5ndGgucnNycSk7CisgICAgICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPkxURV9TaWduYWxTdHJlbmd0aC5yc3Nucik7CisgICAgICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPkxURV9TaWduYWxTdHJlbmd0aC5jcWkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KCZwX2N1ci0+TFRFX1NpZ25hbFN0cmVuZ3RoLCBzaXplb2YgKFJJTF9MVEVfU2lnbmFsU3RyZW5ndGgpLCAwKTsKKyAgICAgICAgfQogCiAgICAgICAgIHN0YXJ0UmVzcG9uc2U7CiAgICAgICAgIGFwcGVuZFByaW50QnVmKCIlc1tzaWduYWxTdHJlbmd0aD0lZCxiaXRFcnJvclJhdGU9JWQsXAotICAgICAgICAgICAgICAgIENETUFfU2lnbmFsU3RyZW5ndGguZGJtPSVkLENETUFfU2lnbmFsU3RyZW5ndGguZWNpbz0lZCxcCi0gICAgICAgICAgICAgICAgRVZET19TaWduYWxTdHJlbmd0aC5kYm0gPSVkLEVWRE9fU2lnbmFsU3RyZW5ndGguZWNpbz0lZCxcCi0gICAgICAgICAgICAgICAgRVZET19TaWduYWxTdHJlbmd0aC5zaWduYWxOb2lzZVJhdGlvPSVkXSIsCisgICAgICAgICAgICAgICAgQ0RNQV9TUy5kYm09JWQsQ0RNQV9TU2VjaW89JWQsXAorICAgICAgICAgICAgICAgIEVWRE9fU1MuZGJtPSVkLEVWRE9fU1MuZWNpbz0lZCxcCisgICAgICAgICAgICAgICAgRVZET19TUy5zaWduYWxOb2lzZVJhdGlvPSVkLFwKKyAgICAgICAgICAgICAgICBMVEVfU1Muc2lnbmFsU3RyZW5ndGg9JWQsTFRFX1NTLnJzcnA9JWQsTFRFX1NTLnJzcnE9JWQsXAorICAgICAgICAgICAgICAgIExURV9TUy5yc3Nucj0lZCxMVEVfU1MuY3FpPSVkXSIsCiAgICAgICAgICAgICAgICAgcHJpbnRCdWYsCiAgICAgICAgICAgICAgICAgcF9jdXItPkdXX1NpZ25hbFN0cmVuZ3RoLnNpZ25hbFN0cmVuZ3RoLAogICAgICAgICAgICAgICAgIHBfY3VyLT5HV19TaWduYWxTdHJlbmd0aC5iaXRFcnJvclJhdGUsCkBAIC0xODQ5LDM0ICsxOTM1LDE0IEBACiAgICAgICAgICAgICAgICAgcF9jdXItPkNETUFfU2lnbmFsU3RyZW5ndGguZWNpbywKICAgICAgICAgICAgICAgICBwX2N1ci0+RVZET19TaWduYWxTdHJlbmd0aC5kYm0sCiAgICAgICAgICAgICAgICAgcF9jdXItPkVWRE9fU2lnbmFsU3RyZW5ndGguZWNpbywKLSAgICAgICAgICAgICAgICBwX2N1ci0+RVZET19TaWduYWxTdHJlbmd0aC5zaWduYWxOb2lzZVJhdGlvKTsKLQorICAgICAgICAgICAgICAgIHBfY3VyLT5FVkRPX1NpZ25hbFN0cmVuZ3RoLnNpZ25hbE5vaXNlUmF0aW8sCisgICAgICAgICAgICAgICAgcF9jdXItPkxURV9TaWduYWxTdHJlbmd0aC5zaWduYWxTdHJlbmd0aCwKKyAgICAgICAgICAgICAgICBwX2N1ci0+TFRFX1NpZ25hbFN0cmVuZ3RoLnJzcnAsCisgICAgICAgICAgICAgICAgcF9jdXItPkxURV9TaWduYWxTdHJlbmd0aC5yc3JxLAorICAgICAgICAgICAgICAgIHBfY3VyLT5MVEVfU2lnbmFsU3RyZW5ndGgucnNzbnIsCisgICAgICAgICAgICAgICAgcF9jdXItPkxURV9TaWduYWxTdHJlbmd0aC5jcWkpOwogICAgICAgICBjbG9zZVJlc3BvbnNlOwogCi0gICAgfSBlbHNlIGlmIChyZXNwb25zZWxlbiAlIHNpemVvZiAoaW50KSA9PSAwKSB7Ci0gICAgICAgIC8vIE9sZCBSSUwgZGVwcmVjYXRlZAotICAgICAgICBpbnQgKnBfY3VyID0gKGludCAqKSByZXNwb25zZTsKLQotICAgICAgICBzdGFydFJlc3BvbnNlOwotCi0gICAgICAgIC8vIFdpdGggdGhlIE9sZCBSSUwgd2Ugc2VlIG9uZSBvciAyIGludGVnZXJzLgotICAgICAgICBzaXplX3QgbnVtID0gcmVzcG9uc2VsZW4gLyBzaXplb2YgKGludCk7IC8vIE51bWJlciBvZiBpbnRlZ2VycyBmcm9tIHJpbAotICAgICAgICBzaXplX3QgdG90YWxJbnRlZ2VycyA9IDc7IC8vIE51bWJlciBvZiBpbnRlZ2VycyBpbiBSSUxfU2lnbmFsU3RyZW5ndGgKLSAgICAgICAgc2l6ZV90IGk7Ci0KLSAgICAgICAgYXBwZW5kUHJpbnRCdWYoIiVzWyIsIHByaW50QnVmKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0gICAgICAgICAgICBhcHBlbmRQcmludEJ1ZigiJXMgJWQiLCBwcmludEJ1ZiwgKnBfY3VyKTsKLSAgICAgICAgICAgIHAud3JpdGVJbnQzMigqcF9jdXIrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgYXBwZW5kUHJpbnRCdWYoIiVzXSIsIHByaW50QnVmKTsKLQotICAgICAgICAvLyBGaWxsIHRoZSByZW1haW5kZXIgd2l0aCB6ZXJvJ3MuCi0gICAgICAgIGZvciAoOyBpIDwgdG90YWxJbnRlZ2VyczsgaSsrKSB7Ci0gICAgICAgICAgICBwLndyaXRlSW50MzIoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjbG9zZVJlc3BvbnNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR0UoImludmFsaWQgcmVzcG9uc2UgbGVuZ3RoIik7CiAgICAgICAgIHJldHVybiBSSUxfRVJSTk9fSU5WQUxJRF9SRVNQT05TRTsKQEAgLTE5MjksMjMgKzE5OTUsMjkgQEAKICAgICAgICAgcmV0dXJuIFJJTF9FUlJOT19JTlZBTElEX1JFU1BPTlNFOwogICAgIH0KIAotICAgIGlmIChyZXNwb25zZWxlbiAhPSBzaXplb2YoUklMX0NETUFfQ2FsbFdhaXRpbmcpKSB7Ci0gICAgICAgIExPR0UoImludmFsaWQgcmVzcG9uc2UgbGVuZ3RoICVkIGV4cGVjdGVkICVkXG4iLAotICAgICAgICAgICAgKGludClyZXNwb25zZWxlbiwgKGludClzaXplb2YoUklMX0NETUFfQ2FsbFdhaXRpbmcpKTsKLSAgICAgICAgcmV0dXJuIFJJTF9FUlJOT19JTlZBTElEX1JFU1BPTlNFOworICAgIGlmIChyZXNwb25zZWxlbiA8IHNpemVvZihSSUxfQ0RNQV9DYWxsV2FpdGluZ192NikpIHsKKyAgICAgICAgTE9HVygiVXBncmFkZSB0byByaWwgdmVyc2lvbiAlZFxuIiwgUklMX1ZFUlNJT04pOworICAgIH0KKworICAgIFJJTF9DRE1BX0NhbGxXYWl0aW5nX3Y2ICpwX2N1ciA9ICgoUklMX0NETUFfQ2FsbFdhaXRpbmdfdjYgKikgcmVzcG9uc2UpOworCisgICAgd3JpdGVTdHJpbmdUb1BhcmNlbChwLCBwX2N1ci0+bnVtYmVyKTsKKyAgICBwLndyaXRlSW50MzIocF9jdXItPm51bWJlclByZXNlbnRhdGlvbik7CisgICAgd3JpdGVTdHJpbmdUb1BhcmNlbChwLCBwX2N1ci0+bmFtZSk7CisgICAgbWFyc2hhbGxTaWduYWxJbmZvUmVjb3JkKHAsIHBfY3VyLT5zaWduYWxJbmZvUmVjb3JkKTsKKworICAgIGlmIChyZXNwb25zZWxlbiA+PSBzaXplb2YoUklMX0NETUFfQ2FsbFdhaXRpbmdfdjYpKSB7CisgICAgICAgIHAud3JpdGVJbnQzMihwX2N1ci0+bnVtYmVyX3R5cGUpOworICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPm51bWJlcl9wbGFuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwLndyaXRlSW50MzIoMCk7CisgICAgICAgIHAud3JpdGVJbnQzMigwKTsKICAgICB9CiAKICAgICBzdGFydFJlc3BvbnNlOwotICAgIFJJTF9DRE1BX0NhbGxXYWl0aW5nICpwX2N1ciA9ICgoUklMX0NETUFfQ2FsbFdhaXRpbmcgKikgcmVzcG9uc2UpOwotCi0gICAgd3JpdGVTdHJpbmdUb1BhcmNlbCAocCwgcF9jdXItPm51bWJlcik7Ci0gICAgcC53cml0ZUludDMyKHBfY3VyLT5udW1iZXJQcmVzZW50YXRpb24pOwotICAgIHdyaXRlU3RyaW5nVG9QYXJjZWwgKHAsIHBfY3VyLT5uYW1lKTsKLSAgICBtYXJzaGFsbFNpZ25hbEluZm9SZWNvcmQocCwgcF9jdXItPnNpZ25hbEluZm9SZWNvcmQpOwotCiAgICAgYXBwZW5kUHJpbnRCdWYoIiVzbnVtYmVyPSVzLG51bWJlclByZXNlbnRhdGlvbj0lZCwgbmFtZT0lcyxcCiAgICAgICAgICAgICBzaWduYWxJbmZvUmVjb3JkW2lzUHJlc2VudD0lZCxzaWduYWxUeXBlPSVkLGFsZXJ0UGl0Y2g9JWRcCi0gICAgICAgICAgICBzaWduYWw9JWRdIiwKKyAgICAgICAgICAgIHNpZ25hbD0lZCxudW1iZXJfdHlwZT0lZCxudW1iZXJfcGxhbj0lZF0iLAogICAgICAgICAgICAgcHJpbnRCdWYsCiAgICAgICAgICAgICBwX2N1ci0+bnVtYmVyLAogICAgICAgICAgICAgcF9jdXItPm51bWJlclByZXNlbnRhdGlvbiwKQEAgLTE5NTMsOCArMjAyNSw5IEBACiAgICAgICAgICAgICBwX2N1ci0+c2lnbmFsSW5mb1JlY29yZC5pc1ByZXNlbnQsCiAgICAgICAgICAgICBwX2N1ci0+c2lnbmFsSW5mb1JlY29yZC5zaWduYWxUeXBlLAogICAgICAgICAgICAgcF9jdXItPnNpZ25hbEluZm9SZWNvcmQuYWxlcnRQaXRjaCwKLSAgICAgICAgICAgIHBfY3VyLT5zaWduYWxJbmZvUmVjb3JkLnNpZ25hbCk7Ci0KKyAgICAgICAgICAgIHBfY3VyLT5zaWduYWxJbmZvUmVjb3JkLnNpZ25hbCwKKyAgICAgICAgICAgIHBfY3VyLT5udW1iZXJfdHlwZSwKKyAgICAgICAgICAgIHBfY3VyLT5udW1iZXJfcGxhbik7CiAgICAgY2xvc2VSZXNwb25zZTsKIAogICAgIHJldHVybiAwOwpAQCAtMTk3Niw2ICsyMDQ5LDM0IEBACiAgICAgdHJpZ2dlckV2TG9vcCgpOwogfQogCitzdGF0aWMgdm9pZCBzZW5kU2ltU3RhdHVzQXBwSW5mbyhQYXJjZWwgJnAsIGludCBudW1fYXBwcywgUklMX0FwcFN0YXR1cyBhcHBTdGF0dXNbXSkgeworICAgICAgICBwLndyaXRlSW50MzIobnVtX2FwcHMpOworICAgICAgICBzdGFydFJlc3BvbnNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hcHBzOyBpKyspIHsKKyAgICAgICAgICAgIHAud3JpdGVJbnQzMihhcHBTdGF0dXNbaV0uYXBwX3R5cGUpOworICAgICAgICAgICAgcC53cml0ZUludDMyKGFwcFN0YXR1c1tpXS5hcHBfc3RhdGUpOworICAgICAgICAgICAgcC53cml0ZUludDMyKGFwcFN0YXR1c1tpXS5wZXJzb19zdWJzdGF0ZSk7CisgICAgICAgICAgICB3cml0ZVN0cmluZ1RvUGFyY2VsKHAsIChjb25zdCBjaGFyKikoYXBwU3RhdHVzW2ldLmFpZF9wdHIpKTsKKyAgICAgICAgICAgIHdyaXRlU3RyaW5nVG9QYXJjZWwocCwgKGNvbnN0IGNoYXIqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwcFN0YXR1c1tpXS5hcHBfbGFiZWxfcHRyKSk7CisgICAgICAgICAgICBwLndyaXRlSW50MzIoYXBwU3RhdHVzW2ldLnBpbjFfcmVwbGFjZWQpOworICAgICAgICAgICAgcC53cml0ZUludDMyKGFwcFN0YXR1c1tpXS5waW4xKTsKKyAgICAgICAgICAgIHAud3JpdGVJbnQzMihhcHBTdGF0dXNbaV0ucGluMik7CisgICAgICAgICAgICBhcHBlbmRQcmludEJ1ZigiJXNbYXBwX3R5cGU9JWQsYXBwX3N0YXRlPSVkLHBlcnNvX3N1YnN0YXRlPSVkLFwKKyAgICAgICAgICAgICAgICAgICAgYWlkX3B0cj0lcyxhcHBfbGFiZWxfcHRyPSVzLHBpbjFfcmVwbGFjZWQ9JWQscGluMT0lZCxwaW4yPSVkXSwiLAorICAgICAgICAgICAgICAgICAgICBwcmludEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgYXBwU3RhdHVzW2ldLmFwcF90eXBlLAorICAgICAgICAgICAgICAgICAgICBhcHBTdGF0dXNbaV0uYXBwX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICBhcHBTdGF0dXNbaV0ucGVyc29fc3Vic3RhdGUsCisgICAgICAgICAgICAgICAgICAgIGFwcFN0YXR1c1tpXS5haWRfcHRyLAorICAgICAgICAgICAgICAgICAgICBhcHBTdGF0dXNbaV0uYXBwX2xhYmVsX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgYXBwU3RhdHVzW2ldLnBpbjFfcmVwbGFjZWQsCisgICAgICAgICAgICAgICAgICAgIGFwcFN0YXR1c1tpXS5waW4xLAorICAgICAgICAgICAgICAgICAgICBhcHBTdGF0dXNbaV0ucGluMik7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2VSZXNwb25zZTsKK30KKwogc3RhdGljIGludCByZXNwb25zZVNpbVN0YXR1cyhQYXJjZWwgJnAsIHZvaWQgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VsZW4pIHsKICAgICBpbnQgaTsKIApAQCAtMTk4NCw0NSArMjA4NSwzMSBAQAogICAgICAgICByZXR1cm4gUklMX0VSUk5PX0lOVkFMSURfUkVTUE9OU0U7CiAgICAgfQogCi0gICAgaWYgKHJlc3BvbnNlbGVuICUgc2l6ZW9mIChSSUxfQ2FyZFN0YXR1cyAqKSAhPSAwKSB7Ci0gICAgICAgIExPR0UoImludmFsaWQgcmVzcG9uc2UgbGVuZ3RoICVkIGV4cGVjdGVkIG11bHRpcGxlIG9mICVkXG4iLAotICAgICAgICAgICAgKGludClyZXNwb25zZWxlbiwgKGludClzaXplb2YgKFJJTF9DYXJkU3RhdHVzICopKTsKKyAgICBpZiAocmVzcG9uc2VsZW4gPT0gc2l6ZW9mIChSSUxfQ2FyZFN0YXR1c192NikpIHsKKyAgICAgICAgUklMX0NhcmRTdGF0dXNfdjYgKnBfY3VyID0gKChSSUxfQ2FyZFN0YXR1c192NiAqKSByZXNwb25zZSk7CisKKyAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT5jYXJkX3N0YXRlKTsKKyAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT51bml2ZXJzYWxfcGluX3N0YXRlKTsKKyAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT5nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4KTsKKyAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT5jZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgpOworICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPmltc19zdWJzY3JpcHRpb25fYXBwX2luZGV4KTsKKworICAgICAgICBzZW5kU2ltU3RhdHVzQXBwSW5mbyhwLCBwX2N1ci0+bnVtX2FwcGxpY2F0aW9ucywgcF9jdXItPmFwcGxpY2F0aW9ucyk7CisgICAgfSBlbHNlIGlmIChyZXNwb25zZWxlbiA9PSBzaXplb2YgKFJJTF9DYXJkU3RhdHVzX3Y1KSkgeworICAgICAgICBSSUxfQ2FyZFN0YXR1c192NSAqcF9jdXIgPSAoKFJJTF9DYXJkU3RhdHVzX3Y1ICopIHJlc3BvbnNlKTsKKworICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPmNhcmRfc3RhdGUpOworICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPnVuaXZlcnNhbF9waW5fc3RhdGUpOworICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPmdzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgpOworICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPmNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCk7CisgICAgICAgIHAud3JpdGVJbnQzMigtMSk7CisKKyAgICAgICAgc2VuZFNpbVN0YXR1c0FwcEluZm8ocCwgcF9jdXItPm51bV9hcHBsaWNhdGlvbnMsIHBfY3VyLT5hcHBsaWNhdGlvbnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoInJlc3BvbnNlU2ltU3RhdHVzOiBBIFJpbENhcmRTdGF0dXNfdjYgb3IgX3Y1IGV4cGVjdGVkXG4iKTsKICAgICAgICAgcmV0dXJuIFJJTF9FUlJOT19JTlZBTElEX1JFU1BPTlNFOwogICAgIH0KIAotICAgIFJJTF9DYXJkU3RhdHVzICpwX2N1ciA9ICgoUklMX0NhcmRTdGF0dXMgKikgcmVzcG9uc2UpOwotCi0gICAgcC53cml0ZUludDMyKHBfY3VyLT5jYXJkX3N0YXRlKTsKLSAgICBwLndyaXRlSW50MzIocF9jdXItPnVuaXZlcnNhbF9waW5fc3RhdGUpOwotICAgIHAud3JpdGVJbnQzMihwX2N1ci0+Z3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCk7Ci0gICAgcC53cml0ZUludDMyKHBfY3VyLT5jZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgpOwotICAgIHAud3JpdGVJbnQzMihwX2N1ci0+bnVtX2FwcGxpY2F0aW9ucyk7Ci0KLSAgICBzdGFydFJlc3BvbnNlOwotICAgIGZvciAoaSA9IDA7IGkgPCBwX2N1ci0+bnVtX2FwcGxpY2F0aW9uczsgaSsrKSB7Ci0gICAgICAgIHAud3JpdGVJbnQzMihwX2N1ci0+YXBwbGljYXRpb25zW2ldLmFwcF90eXBlKTsKLSAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT5hcHBsaWNhdGlvbnNbaV0uYXBwX3N0YXRlKTsKLSAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT5hcHBsaWNhdGlvbnNbaV0ucGVyc29fc3Vic3RhdGUpOwotICAgICAgICB3cml0ZVN0cmluZ1RvUGFyY2VsKHAsIChjb25zdCBjaGFyKikocF9jdXItPmFwcGxpY2F0aW9uc1tpXS5haWRfcHRyKSk7Ci0gICAgICAgIHdyaXRlU3RyaW5nVG9QYXJjZWwocCwgKGNvbnN0IGNoYXIqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9jdXItPmFwcGxpY2F0aW9uc1tpXS5hcHBfbGFiZWxfcHRyKSk7Ci0gICAgICAgIHAud3JpdGVJbnQzMihwX2N1ci0+YXBwbGljYXRpb25zW2ldLnBpbjFfcmVwbGFjZWQpOwotICAgICAgICBwLndyaXRlSW50MzIocF9jdXItPmFwcGxpY2F0aW9uc1tpXS5waW4xKTsKLSAgICAgICAgcC53cml0ZUludDMyKHBfY3VyLT5hcHBsaWNhdGlvbnNbaV0ucGluMik7Ci0gICAgICAgIGFwcGVuZFByaW50QnVmKCIlc1thcHBfdHlwZT0lZCxhcHBfc3RhdGU9JWQscGVyc29fc3Vic3RhdGU9JWQsXAotICAgICAgICAgICAgICAgIGFpZF9wdHI9JXMsYXBwX2xhYmVsX3B0cj0lcyxwaW4xX3JlcGxhY2VkPSVkLHBpbjE9JWQscGluMj0lZF0sIiwKLSAgICAgICAgICAgICAgICBwcmludEJ1ZiwKLSAgICAgICAgICAgICAgICBwX2N1ci0+YXBwbGljYXRpb25zW2ldLmFwcF90eXBlLAotICAgICAgICAgICAgICAgIHBfY3VyLT5hcHBsaWNhdGlvbnNbaV0uYXBwX3N0YXRlLAotICAgICAgICAgICAgICAgIHBfY3VyLT5hcHBsaWNhdGlvbnNbaV0ucGVyc29fc3Vic3RhdGUsCi0gICAgICAgICAgICAgICAgcF9jdXItPmFwcGxpY2F0aW9uc1tpXS5haWRfcHRyLAotICAgICAgICAgICAgICAgIHBfY3VyLT5hcHBsaWNhdGlvbnNbaV0uYXBwX2xhYmVsX3B0ciwKLSAgICAgICAgICAgICAgICBwX2N1ci0+YXBwbGljYXRpb25zW2ldLnBpbjFfcmVwbGFjZWQsCi0gICAgICAgICAgICAgICAgcF9jdXItPmFwcGxpY2F0aW9uc1tpXS5waW4xLAotICAgICAgICAgICAgICAgIHBfY3VyLT5hcHBsaWNhdGlvbnNbaV0ucGluMik7Ci0gICAgfQotICAgIGNsb3NlUmVzcG9uc2U7Ci0KICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjIxOSw2ICsyMzA2LDExIEBACiAKIAogc3RhdGljIHZvaWQgb25OZXdDb21tYW5kQ29ubmVjdCgpIHsKKyAgICAvLyBJbmZvcm0gd2UgYXJlIGNvbm5lY3RlZCBhbmQgdGhlIHJpbCB2ZXJzaW9uCisgICAgaW50IHJpbFZlciA9IHNfY2FsbGJhY2tzLnZlcnNpb247CisgICAgUklMX29uVW5zb2xpY2l0ZWRSZXNwb25zZShSSUxfVU5TT0xfUklMX0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWxWZXIsIHNpemVvZihyaWxWZXIpKTsKKwogICAgIC8vIGltcGxpY2l0IHJhZGlvIHN0YXRlIGNoYW5nZWQKICAgICBSSUxfb25VbnNvbGljaXRlZFJlc3BvbnNlKFJJTF9VTlNPTF9SRVNQT05TRV9SQURJT19TVEFURV9DSEFOR0VELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7CkBAIC0yMzk1LDggKzI0ODcsOCBAQAogICAgICAgICAgICAgc19mZENvbW1hbmQgPSAtMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBMT0dJICgiRGVidWcgcG9ydDogaXNzdWluZyB1bnNvbGljaXRlZCBuZXR3b3JrIGNoYW5nZS4iKTsKLSAgICAgICAgICAgIFJJTF9vblVuc29saWNpdGVkUmVzcG9uc2UoUklMX1VOU09MX1JFU1BPTlNFX05FVFdPUktfU1RBVEVfQ0hBTkdFRCwKKyAgICAgICAgICAgIExPR0kgKCJEZWJ1ZyBwb3J0OiBpc3N1aW5nIHVuc29saWNpdGVkIHZvaWNlIG5ldHdvcmsgY2hhbmdlLiIpOworICAgICAgICAgICAgUklMX29uVW5zb2xpY2l0ZWRSZXNwb25zZShSSUxfVU5TT0xfUkVTUE9OU0VfVk9JQ0VfTkVUV09SS19TVEFURV9DSEFOR0VELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM6CkBAIC0yNTU0LDE3ICsyNjQ2LDIxIEBACiAgICAgaW50IHJldDsKICAgICBpbnQgZmxhZ3M7CiAKLSAgICBpZiAoY2FsbGJhY2tzID09IE5VTEwgfHwgKChjYWxsYmFja3MtPnZlcnNpb24gIT0gUklMX1ZFUlNJT04pCi0gICAgICAgICAgICAgICAgJiYgKGNhbGxiYWNrcy0+dmVyc2lvbiA8IDIpKSkgeyAvLyBSZW1vdmUgd2hlbiBwYXJ0bmVycyB1cGdyYWRlIHRvIHZlcnNpb24gMwotICAgICAgICBMT0dFKAotICAgICAgICAgICAgIlJJTF9yZWdpc3RlcjogUklMX1JhZGlvRnVuY3Rpb25zICogbnVsbCBvciBpbnZhbGlkIHZlcnNpb24iCi0gICAgICAgICAgICAiIChleHBlY3RlZCAlZCkiLCBSSUxfVkVSU0lPTik7CisgICAgaWYgKGNhbGxiYWNrcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlJJTF9yZWdpc3RlcjogUklMX1JhZGlvRnVuY3Rpb25zICogbnVsbCIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmIChjYWxsYmFja3MtPnZlcnNpb24gPCBSSUxfVkVSU0lPTikgewotICAgICAgICBMT0dFICgiUklMX3JlZ2lzdGVyOiB1cGdyYWRlIFJJTCB0byB2ZXJzaW9uICVkIGN1cnJlbnQgdmVyc2lvbj0lZCIsCi0gICAgICAgICAgICAgIFJJTF9WRVJTSU9OLCBjYWxsYmFja3MtPnZlcnNpb24pOworICAgIGlmIChjYWxsYmFja3MtPnZlcnNpb24gPCBSSUxfVkVSU0lPTl9NSU4pIHsKKyAgICAgICAgTE9HRSgiUklMX3JlZ2lzdGVyOiB2ZXJzaW9uICVkIGlzIHRvIG9sZCwgbWluIHZlcnNpb24gaXMgJWQiLAorICAgICAgICAgICAgIGNhbGxiYWNrcy0+dmVyc2lvbiwgUklMX1ZFUlNJT05fTUlOKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBpZiAoY2FsbGJhY2tzLT52ZXJzaW9uID4gUklMX1ZFUlNJT04pIHsKKyAgICAgICAgTE9HRSgiUklMX3JlZ2lzdGVyOiB2ZXJzaW9uICVkIGlzIHRvbyBuZXcsIG1heCB2ZXJzaW9uIGlzICVkIiwKKyAgICAgICAgICAgICBjYWxsYmFja3MtPnZlcnNpb24sIFJJTF9WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMT0dFKCJSSUxfcmVnaXN0ZXI6IFJJTCB2ZXJzaW9uICVkIiwgY2FsbGJhY2tzLT52ZXJzaW9uKTsKIAogICAgIGlmIChzX3JlZ2lzdGVyQ2FsbGVkID4gMCkgewogICAgICAgICBMT0dFKCJSSUxfcmVnaXN0ZXIgaGFzIGJlZW4gY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiAiCkBAIC0zMDEyLDggKzMxMDgsOCBAQAogICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX1VEVUI6IHJldHVybiAiVURVQiI7CiAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfTEFTVF9DQUxMX0ZBSUxfQ0FVU0U6IHJldHVybiAiTEFTVF9DQUxMX0ZBSUxfQ0FVU0UiOwogICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX1NJR05BTF9TVFJFTkdUSDogcmV0dXJuICJTSUdOQUxfU1RSRU5HVEgiOwotICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFURTogcmV0dXJuICJSRUdJU1RSQVRJT05fU1RBVEUiOwotICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX0dQUlNfUkVHSVNUUkFUSU9OX1NUQVRFOiByZXR1cm4gIkdQUlNfUkVHSVNUUkFUSU9OX1NUQVRFIjsKKyAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9WT0lDRV9SRUdJU1RSQVRJT05fU1RBVEU6IHJldHVybiAiVk9JQ0VfUkVHSVNUUkFUSU9OX1NUQVRFIjsKKyAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9EQVRBX1JFR0lTVFJBVElPTl9TVEFURTogcmV0dXJuICJEQVRBX1JFR0lTVFJBVElPTl9TVEFURSI7CiAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfT1BFUkFUT1I6IHJldHVybiAiT1BFUkFUT1IiOwogICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX1JBRElPX1BPV0VSOiByZXR1cm4gIlJBRElPX1BPV0VSIjsKICAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9EVE1GOiByZXR1cm4gIkRUTUYiOwpAQCAtMzA2Niw3ICszMTYyLDcgQEAKICAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9TQ1JFRU5fU1RBVEU6IHJldHVybiAiU0NSRUVOX1NUQVRFIjsKICAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9FWFBMSUNJVF9DQUxMX1RSQU5TRkVSOiByZXR1cm4gIkVYUExJQ0lUX0NBTExfVFJBTlNGRVIiOwogICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX1NFVF9MT0NBVElPTl9VUERBVEVTOiByZXR1cm4gIlNFVF9MT0NBVElPTl9VUERBVEVTIjsKLSAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9DRE1BX1NFVF9TVUJTQ1JJUFRJT046cmV0dXJuIkNETUFfU0VUX1NVQlNDUklQVElPTiI7CisgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfQ0RNQV9TRVRfU1VCU0NSSVBUSU9OX1NPVVJDRTpyZXR1cm4iQ0RNQV9TRVRfU1VCU0NSSVBUSU9OX1NPVVJDRSI7CiAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfQ0RNQV9TRVRfUk9BTUlOR19QUkVGRVJFTkNFOnJldHVybiJDRE1BX1NFVF9ST0FNSU5HX1BSRUZFUkVOQ0UiOwogICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX0NETUFfUVVFUllfUk9BTUlOR19QUkVGRVJFTkNFOnJldHVybiJDRE1BX1FVRVJZX1JPQU1JTkdfUFJFRkVSRU5DRSI7CiAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfU0VUX1RUWV9NT0RFOnJldHVybiJTRVRfVFRZX01PREUiOwpAQCAtMzA5Miw5ICszMTg4LDEwIEBACiAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfU0VUX1NNU0NfQUREUkVTUzogcmV0dXJuICJTRVRfU01TQ19BRERSRVNTIjsKICAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9SRVBPUlRfU01TX01FTU9SWV9TVEFUVVM6IHJldHVybiAiUkVQT1JUX1NNU19NRU1PUllfU1RBVFVTIjsKICAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9SRVBPUlRfU1RLX1NFUlZJQ0VfSVNfUlVOTklORzogcmV0dXJuICJSRVBPUlRfU1RLX1NFUlZJQ0VfSVNfUlVOTklORyI7CisgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfQ0RNQV9HRVRfU1VCU0NSSVBUSU9OX1NPVVJDRTogcmV0dXJuICJDRE1BX0dFVF9TVUJTQ1JJUFRJT05fU09VUkNFIjsKICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUkVTUE9OU0VfUkFESU9fU1RBVEVfQ0hBTkdFRDogcmV0dXJuICJVTlNPTF9SRVNQT05TRV9SQURJT19TVEFURV9DSEFOR0VEIjsKICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUkVTUE9OU0VfQ0FMTF9TVEFURV9DSEFOR0VEOiByZXR1cm4gIlVOU09MX1JFU1BPTlNFX0NBTExfU1RBVEVfQ0hBTkdFRCI7Ci0gICAgICAgIGNhc2UgUklMX1VOU09MX1JFU1BPTlNFX05FVFdPUktfU1RBVEVfQ0hBTkdFRDogcmV0dXJuICJVTlNPTF9SRVNQT05TRV9ORVRXT1JLX1NUQVRFX0NIQU5HRUQiOworICAgICAgICBjYXNlIFJJTF9VTlNPTF9SRVNQT05TRV9WT0lDRV9ORVRXT1JLX1NUQVRFX0NIQU5HRUQ6IHJldHVybiAiVU5TT0xfUkVTUE9OU0VfVk9JQ0VfTkVUV09SS19TVEFURV9DSEFOR0VEIjsKICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNUzogcmV0dXJuICJVTlNPTF9SRVNQT05TRV9ORVdfU01TIjsKICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNU19TVEFUVVNfUkVQT1JUOiByZXR1cm4gIlVOU09MX1JFU1BPTlNFX05FV19TTVNfU1RBVFVTX1JFUE9SVCI7CiAgICAgICAgIGNhc2UgUklMX1VOU09MX1JFU1BPTlNFX05FV19TTVNfT05fU0lNOiByZXR1cm4gIlVOU09MX1JFU1BPTlNFX05FV19TTVNfT05fU0lNIjsKQEAgLTMxMjIsNiArMzIxOSwxMCBAQAogICAgICAgICBjYXNlIFJJTF9VTlNPTF9PRU1fSE9PS19SQVc6IHJldHVybiAiVU5TT0xfT0VNX0hPT0tfUkFXIjsKICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUklOR0JBQ0tfVE9ORTogcmV0dXJuICJVTlNPTF9SSU5HQkFDS19UT05FIjsKICAgICAgICAgY2FzZSBSSUxfVU5TT0xfUkVTRU5EX0lOQ0FMTF9NVVRFOiByZXR1cm4gIlVOU09MX1JFU0VORF9JTkNBTExfTVVURSI7CisgICAgICAgIGNhc2UgUklMX1VOU09MX0NETUFfU1VCU0NSSVBUSU9OX1NPVVJDRV9DSEFOR0VEOiByZXR1cm4gIlVOU09MX0NETUFfU1VCU0NSSVBUSU9OX1NPVVJDRV9DSEFOR0VEIjsKKyAgICAgICAgY2FzZSBSSUxfVU5TT0xfQ0RNQV9QUkxfQ0hBTkdFRDogcmV0dXJuICJVTlNPTF9DRE1BX1BSTF9DSEFOR0VEIjsKKyAgICAgICAgY2FzZSBSSUxfVU5TT0xfRVhJVF9FTUVSR0VOQ1lfQ0FMTEJBQ0tfTU9ERTogcmV0dXJuICJVTlNPTF9FWElUX0VNRVJHRU5DWV9DQUxMQkFDS19NT0RFIjsKKyAgICAgICAgY2FzZSBSSUxfVU5TT0xfUklMX0NPTk5FQ1RFRDogcmV0dXJuICJVTlNPTF9SSUxfQ09OTkVDVEVEIjsKICAgICAgICAgZGVmYXVsdDogcmV0dXJuICI8dW5rbm93biByZXF1ZXN0PiI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicmlsL3JpbF9jb21tYW5kcy5oIGIvbGlicmlsL3JpbF9jb21tYW5kcy5oCmluZGV4IGUwN2RkNDMuLmZiZDJhNjkgMTAwNjQ0Ci0tLSBhL2xpYnJpbC9yaWxfY29tbWFuZHMuaAorKysgYi9saWJyaWwvcmlsX2NvbW1hbmRzLmgKQEAgLTM0LDE0ICszNCwxNCBAQAogICAgIHtSSUxfUkVRVUVTVF9VRFVCLCBkaXNwYXRjaFZvaWQsIHJlc3BvbnNlVm9pZH0sCiAgICAge1JJTF9SRVFVRVNUX0xBU1RfQ0FMTF9GQUlMX0NBVVNFLCBkaXNwYXRjaFZvaWQsIHJlc3BvbnNlSW50c30sCiAgICAge1JJTF9SRVFVRVNUX1NJR05BTF9TVFJFTkdUSCwgZGlzcGF0Y2hWb2lkLCByZXNwb25zZVJpbFNpZ25hbFN0cmVuZ3RofSwKLSAgICB7UklMX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRFLCBkaXNwYXRjaFZvaWQsIHJlc3BvbnNlU3RyaW5nc30sCi0gICAge1JJTF9SRVFVRVNUX0dQUlNfUkVHSVNUUkFUSU9OX1NUQVRFLCBkaXNwYXRjaFZvaWQsIHJlc3BvbnNlU3RyaW5nc30sCisgICAge1JJTF9SRVFVRVNUX1ZPSUNFX1JFR0lTVFJBVElPTl9TVEFURSwgZGlzcGF0Y2hWb2lkLCByZXNwb25zZVN0cmluZ3N9LAorICAgIHtSSUxfUkVRVUVTVF9EQVRBX1JFR0lTVFJBVElPTl9TVEFURSwgZGlzcGF0Y2hWb2lkLCByZXNwb25zZVN0cmluZ3N9LAogICAgIHtSSUxfUkVRVUVTVF9PUEVSQVRPUiwgZGlzcGF0Y2hWb2lkLCByZXNwb25zZVN0cmluZ3N9LAogICAgIHtSSUxfUkVRVUVTVF9SQURJT19QT1dFUiwgZGlzcGF0Y2hJbnRzLCByZXNwb25zZVZvaWR9LAogICAgIHtSSUxfUkVRVUVTVF9EVE1GLCBkaXNwYXRjaFN0cmluZywgcmVzcG9uc2VWb2lkfSwKICAgICB7UklMX1JFUVVFU1RfU0VORF9TTVMsIGRpc3BhdGNoU3RyaW5ncywgcmVzcG9uc2VTTVN9LAogICAgIHtSSUxfUkVRVUVTVF9TRU5EX1NNU19FWFBFQ1RfTU9SRSwgZGlzcGF0Y2hTdHJpbmdzLCByZXNwb25zZVNNU30sCi0gICAge1JJTF9SRVFVRVNUX1NFVFVQX0RBVEFfQ0FMTCwgZGlzcGF0Y2hTdHJpbmdzLCByZXNwb25zZVN0cmluZ3N9LAorICAgIHtSSUxfUkVRVUVTVF9TRVRVUF9EQVRBX0NBTEwsIGRpc3BhdGNoRGF0YUNhbGwsIHJlc3BvbnNlU2V0dXBEYXRhQ2FsbH0sCiAgICAge1JJTF9SRVFVRVNUX1NJTV9JTywgZGlzcGF0Y2hTSU1fSU8sIHJlc3BvbnNlU0lNX0lPfSwKICAgICB7UklMX1JFUVVFU1RfU0VORF9VU1NELCBkaXNwYXRjaFN0cmluZywgcmVzcG9uc2VWb2lkfSwKICAgICB7UklMX1JFUVVFU1RfQ0FOQ0VMX1VTU0QsIGRpc3BhdGNoVm9pZCwgcmVzcG9uc2VWb2lkfSwKQEAgLTkxLDcgKzkxLDcgQEAKICAgICB7UklMX1JFUVVFU1RfR0VUX1BSRUZFUlJFRF9ORVRXT1JLX1RZUEUsIGRpc3BhdGNoVm9pZCwgcmVzcG9uc2VJbnRzfSwKICAgICB7UklMX1JFUVVFU1RfR0VUX05FSUdIQk9SSU5HX0NFTExfSURTLCBkaXNwYXRjaFZvaWQsIHJlc3BvbnNlQ2VsbExpc3R9LAogICAgIHtSSUxfUkVRVUVTVF9TRVRfTE9DQVRJT05fVVBEQVRFUywgZGlzcGF0Y2hJbnRzLCByZXNwb25zZVZvaWR9LAotICAgIHtSSUxfUkVRVUVTVF9DRE1BX1NFVF9TVUJTQ1JJUFRJT04sIGRpc3BhdGNoSW50cywgcmVzcG9uc2VWb2lkfSwKKyAgICB7UklMX1JFUVVFU1RfQ0RNQV9TRVRfU1VCU0NSSVBUSU9OX1NPVVJDRSwgZGlzcGF0Y2hJbnRzLCByZXNwb25zZVZvaWR9LAogICAgIHtSSUxfUkVRVUVTVF9DRE1BX1NFVF9ST0FNSU5HX1BSRUZFUkVOQ0UsIGRpc3BhdGNoSW50cywgcmVzcG9uc2VWb2lkfSwKICAgICB7UklMX1JFUVVFU1RfQ0RNQV9RVUVSWV9ST0FNSU5HX1BSRUZFUkVOQ0UsIGRpc3BhdGNoVm9pZCwgcmVzcG9uc2VJbnRzfSwKICAgICB7UklMX1JFUVVFU1RfU0VUX1RUWV9NT0RFLCBkaXNwYXRjaEludHMsIHJlc3BvbnNlVm9pZH0sCkBAIC0xMTcsNCArMTE3LDUgQEAKICAgICB7UklMX1JFUVVFU1RfR0VUX1NNU0NfQUREUkVTUywgZGlzcGF0Y2hWb2lkLCByZXNwb25zZVN0cmluZ30sCiAgICAge1JJTF9SRVFVRVNUX1NFVF9TTVNDX0FERFJFU1MsIGRpc3BhdGNoU3RyaW5nLCByZXNwb25zZVZvaWR9LAogICAgIHtSSUxfUkVRVUVTVF9SRVBPUlRfU01TX01FTU9SWV9TVEFUVVMsIGRpc3BhdGNoSW50cywgcmVzcG9uc2VWb2lkfSwKLSAgICB7UklMX1JFUVVFU1RfUkVQT1JUX1NUS19TRVJWSUNFX0lTX1JVTk5JTkcsIGRpc3BhdGNoVm9pZCwgcmVzcG9uc2VWb2lkfQorICAgIHtSSUxfUkVRVUVTVF9SRVBPUlRfU1RLX1NFUlZJQ0VfSVNfUlVOTklORywgZGlzcGF0Y2hWb2lkLCByZXNwb25zZVZvaWR9LAorICAgIHtSSUxfUkVRVUVTVF9DRE1BX0dFVF9TVUJTQ1JJUFRJT05fU09VUkNFLCBkaXNwYXRjaFZvaWQsIHJlc3BvbnNlSW50c30KZGlmZiAtLWdpdCBhL2xpYnJpbC9yaWxfdW5zb2xfY29tbWFuZHMuaCBiL2xpYnJpbC9yaWxfdW5zb2xfY29tbWFuZHMuaAppbmRleCA2ZWRkZDBmLi5jZTNlZjIwIDEwMDY0NAotLS0gYS9saWJyaWwvcmlsX3Vuc29sX2NvbW1hbmRzLmgKKysrIGIvbGlicmlsL3JpbF91bnNvbF9jb21tYW5kcy5oCkBAIC0xNiw3ICsxNiw3IEBACiAqLwogICAgIHtSSUxfVU5TT0xfUkVTUE9OU0VfUkFESU9fU1RBVEVfQ0hBTkdFRCwgcmVzcG9uc2VWb2lkLCBXQUtFX1BBUlRJQUx9LAogICAgIHtSSUxfVU5TT0xfUkVTUE9OU0VfQ0FMTF9TVEFURV9DSEFOR0VELCByZXNwb25zZVZvaWQsIFdBS0VfUEFSVElBTH0sCi0gICAge1JJTF9VTlNPTF9SRVNQT05TRV9ORVRXT1JLX1NUQVRFX0NIQU5HRUQsIHJlc3BvbnNlVm9pZCwgV0FLRV9QQVJUSUFMfSwKKyAgICB7UklMX1VOU09MX1JFU1BPTlNFX1ZPSUNFX05FVFdPUktfU1RBVEVfQ0hBTkdFRCwgcmVzcG9uc2VWb2lkLCBXQUtFX1BBUlRJQUx9LAogICAgIHtSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNUywgcmVzcG9uc2VTdHJpbmcsIFdBS0VfUEFSVElBTH0sCiAgICAge1JJTF9VTlNPTF9SRVNQT05TRV9ORVdfU01TX1NUQVRVU19SRVBPUlQsIHJlc3BvbnNlU3RyaW5nLCBXQUtFX1BBUlRJQUx9LAogICAgIHtSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNU19PTl9TSU0sIHJlc3BvbnNlSW50cywgV0FLRV9QQVJUSUFMfSwKQEAgLTQ0LDQgKzQ0LDkgQEAKICAgICB7UklMX1VOU09MX0NETUFfSU5GT19SRUMsIHJlc3BvbnNlQ2RtYUluZm9ybWF0aW9uUmVjb3JkcywgV0FLRV9QQVJUSUFMfSwKICAgICB7UklMX1VOU09MX09FTV9IT09LX1JBVywgcmVzcG9uc2VSYXcsIFdBS0VfUEFSVElBTH0sCiAgICAge1JJTF9VTlNPTF9SSU5HQkFDS19UT05FLCByZXNwb25zZUludHMsIFdBS0VfUEFSVElBTH0sCi0gICAge1JJTF9VTlNPTF9SRVNFTkRfSU5DQUxMX01VVEUsIHJlc3BvbnNlVm9pZCwgV0FLRV9QQVJUSUFMfQorICAgIHtSSUxfVU5TT0xfUkVTRU5EX0lOQ0FMTF9NVVRFLCByZXNwb25zZVZvaWQsIFdBS0VfUEFSVElBTH0sCisgICAge1JJTF9VTlNPTF9DRE1BX1NVQlNDUklQVElPTl9TT1VSQ0VfQ0hBTkdFRCwgcmVzcG9uc2VJbnRzLCBXQUtFX1BBUlRJQUx9LAorICAgIHtSSUxfVU5TT0xfQ0RNQV9QUkxfQ0hBTkdFRCwgcmVzcG9uc2VJbnRzLCBXQUtFX1BBUlRJQUx9LAorICAgIHtSSUxfVU5TT0xfRVhJVF9FTUVSR0VOQ1lfQ0FMTEJBQ0tfTU9ERSwgcmVzcG9uc2VWb2lkLCBXQUtFX1BBUlRJQUx9LAorICAgIHtSSUxfVU5TT0xfUklMX0NPTk5FQ1RFRCwgcmVzcG9uc2VJbnRzLCBXQUtFX1BBUlRJQUx9CisKZGlmZiAtLWdpdCBhL21vY2stcmlsL0FuZHJvaWQubWsgYi9tb2NrLXJpbC9BbmRyb2lkLm1rCmluZGV4IDhmOTAyZTQuLmU5OWEwYWEgMTAwNjQ0Ci0tLSBhL21vY2stcmlsL0FuZHJvaWQubWsKKysrIGIvbW9jay1yaWwvQW5kcm9pZC5tawpAQCAtMTAsMTMgKzEwLDYgQEAKIHNyY19weSA6PSBzcmMvcHkKIHNyY19qcyA6PSBzcmMvanMKIHNyY19wcm90byA6PSBzcmMvcHJvdG8KLXNyY19nZW5lcmF0ZWQgOj0gc3JjL2dlbmVyYXRlZAotCi0jIERpcmVjdG9yaWVzIG9mIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMKLWdlbl9zcmNfY3BwIDo9ICQoc3JjX2dlbmVyYXRlZCkvY3BwCi1nZW5fc3JjX2phdmEgOj0gJChzcmNfZ2VuZXJhdGVkKS9qYXZhCi1nZW5fc3JjX3B5IDo9ICQoc3JjX2dlbmVyYXRlZCkvcHl0aG9uCi1nZW5fc3JjX2Rlc2MgOj0gJChzcmNfZ2VuZXJhdGVkKS9kZXNjCiAKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKICMgTW9jay1yaWwgb25seSBidWlkIGZvciBkZWJ1ZyB2YXJpYW50cwpAQCAtMzYsMjIgKzI5LDE4IEBACiAgICAgJChzcmNfY3BwKS91dGlsLmNwcCBcCiAgICAgJChzcmNfY3BwKS93b3JrZXIuY3BwIFwKICAgICAkKHNyY19jcHApL3dvcmtlcl92OC5jcHAgXAotICAgICQoZ2VuX3NyY19jcHApL3JpbC5wYi5jcHAgXAotICAgICQoZ2VuX3NyY19jcHApL2N0cmwucGIuY3BwIFwKLSAgICAkKGdlbl9zcmNfY3BwKS9tc2doZWFkZXIucGIuY3BwCisgICAgJChjYWxsIGFsbC1wcm90by1maWxlcy11bmRlciwgJChzcmNfcHJvdG8pKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJ6IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJyaWwKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlicHJvdG9idWYtY3BwLTIuMy4wLWZ1bGwgbGlidjgKKyAgICBsaWJ2OAogCi1MT0NBTF9DRkxBR1MgOj0gLURfR05VX1NPVVJDRSAtVU5ERUJVRyAtREdPT0dMRV9QUk9UT0JVRl9OT19SVFRJIC1EUklMX1NITElCCitMT0NBTF9DRkxBR1MgOj0gLURfR05VX1NPVVJDRSAtVU5ERUJVRyAtRFJJTF9TSExJQgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKExPQ0FMX1BBVEgpLyQoc3JjX2NwcCkgXAotICAgICQoTE9DQUxfUEFUSCkvJChnZW5fc3JjX2NwcCkgXAotICAgIGV4dGVybmFsL3Byb3RvYnVmL3NyYyBcCiAgICAgZXh0ZXJuYWwvdjgvaW5jbHVkZSBcCiAgICAgYmlvbmljIFwKICAgICAkKEtFUk5FTF9IRUFERVJTKQpAQCAtNjgsNyArNTcsOCBAQAogTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKIExPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQKIExPQ0FMX0NGTEFHUyArPSAtRE1PQ0tfUklMIC1EX19CU0RfVklTSUJMRQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gZGVidWcKK0xPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFIDo9IGZ1bGwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEU6PSBsaWJtb2NrX3JpbAogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCkBAIC04MCwxMiArNzAsMTggQEAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCiBMT0NBTF9NT0RVTEUgOj0gbGlicmlscHJvdG8tamF2YQogCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gbGlicHJvdG9idWYtamF2YS0yLjMuMC1taWNybworTE9DQUxfUFJPVE9DX09QVElNSVpFX1RZUEUgOj0gbWljcm8KIAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgJChzcmNfamF2YSkgJChnZW5fc3JjX2phdmEpKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgJChzcmNfamF2YSkpIFwKKwkkKGNhbGwgYWxsLXByb3RvLWZpbGVzLXVuZGVyLCAkKHNyY19wcm90bykpCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3NyY19jcHAgOj0KK3NyY19qYXZhIDo9CitzcmNfcHkgOj0KK3NyY19qcyA6PQorc3JjX3Byb3RvIDo9CmRpZmYgLS1naXQgYS9tb2NrLXJpbC9NYWtlZmlsZSBiL21vY2stcmlsL01ha2VmaWxlCmluZGV4IGMwM2U3NjUuLmQ4NWMyY2YgMTAwNjQ0Ci0tLSBhL21vY2stcmlsL01ha2VmaWxlCisrKyBiL21vY2stcmlsL01ha2VmaWxlCkBAIC03LDI3ICs3LDMxIEBACiAjIHBvaW50IHRvIHRoZSB0b3Agb2YgdGhlIGFuZHJvaWQgc291cmNlIHRyZWUKIHRvcD0uLi8uLi8uLi8KIAorUFJPVE9DPSQod2lsZGNhcmQgJCh0b3Apb3V0L2hvc3QvKi9iaW4vYXByb3RvYykKKyNpZiAoKCgkKHdvcmRzICQoUFJPVE8pKSAhPSAxKSkpCitpZm5lcSAoJCh3b3JkcyAkKFBST1RPQykpLDEpCiskKGVycm9yIGV4cGVjdGluZyAxIHByb3RvYyB3ZSBoYXZlICQod29yZHMgJChQUk9UT0MpKSwgUFJPVE9DPSckKFBST1RPQyknKQorZW5kaWYKKworaWZlcSAoIiQoQU5EUk9JRF9ERVZJQ0UpIiwiIikKKyQod2FybmluZyBEZWZhdWx0IHRvIEFORFJPSURfREVWSUNFPXBhc3Npb24iKQorQU5EUk9JRF9ERVZJQ0U9cGFzc2lvbgorZW5kaWYKKwogIyBEaXJlY3RvcmllcyBvZiBzb3VyY2UgZmlsZXMKLXNyY19qYXZhPXNyYy9qYXZhCi1zcmNfY3BwPXNyYy9jcHAKLXNyY19weT1zcmMvcHkKK2RldmljZT0kKEFORFJPSURfREVWSUNFKQogc3JjX2pzPXNyYy9qcwogc3JjX3Byb3RvPXNyYy9wcm90bwotc3JjX2dlbmVyYXRlZD1zcmMvZ2VuZXJhdGVkCitzcmNfZ2VuZXJhdGVkPSQodG9wKW91dC90YXJnZXQvcHJvZHVjdC8kKGRldmljZSkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGlibW9ja19yaWxfaW50ZXJtZWRpYXRlcy9wcm90by9oYXJkd2FyZS9yaWwvbW9jay1yaWwvc3JjL3Byb3RvCiAKICMgRGlyZWN0b3JpZXMgb2YgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcwotZ2VuX3NyY19jcHA9JChzcmNfZ2VuZXJhdGVkKS9jcHAKLWdlbl9zcmNfamF2YT0kKHNyY19nZW5lcmF0ZWQpL2phdmEKIGdlbl9zcmNfcHk9JChzcmNfZ2VuZXJhdGVkKS9weXRob24KIGdlbl9zcmNfZGVzYz0kKHNyY19nZW5lcmF0ZWQpL2Rlc2MKIAogIyBHZW5lcmF0ZWQgZmlsZXMKLWdlbmVyYXRlZD0kKGdlbl9zcmNfY3BwKS9tc2doZWFkZXIucGIuY3BwICQoZ2VuX3NyY19jcHApL21zZ2hlYWRlci5wYi5oICQoZ2VuX3NyY19kZXNjKS9tc2doZWFkZXIuZGVzYyBcCi0gICAgICAkKGdlbl9zcmNfcHkpL21zZ2hlYWRlcl9wYjIucHkgJChnZW5fc3JjX2phdmEpL2NvbS9hbmRyb2lkL2ludGVybmFsL2NvbW11bmljYXRpb24vTXNnSGVhZGVyLmphdmEgXAotICAgICAgJChnZW5fc3JjX2NwcCkvcmlsLnBiLmNwcCAkKGdlbl9zcmNfY3BwKS9yaWwucGIuaCAkKGdlbl9zcmNfZGVzYykvcmlsLmRlc2MgXAotICAgICAgJChnZW5fc3JjX3B5KS9yaWxfcGIyLnB5ICQoZ2VuX3NyY19qYXZhKS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvcmlsX3Byb3RvL1JpbENtZHMuamF2YSBcCi0gICAgICAkKGdlbl9zcmNfY3BwKS9jdHJsLnBiLmNwcCAkKGdlbl9zcmNfY3BwKS9jdHJsLnBiLmggJChnZW5fc3JjX2Rlc2MpL2N0cmwuZGVzYyBcCi0gICAgICAkKGdlbl9zcmNfcHkpL2N0cmxfcGIyLnB5ICQoZ2VuX3NyY19qYXZhKS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvcmlsX3Byb3RvL1JpbEN0cmxDbWRzLmphdmEKK2dlbmVyYXRlZD0kKGdlbl9zcmNfZGVzYykvbXNnaGVhZGVyLmRlc2MgJChnZW5fc3JjX3B5KS9tc2doZWFkZXJfcGIyLnB5IFwKKyAgICAgICQoZ2VuX3NyY19kZXNjKS9yaWwuZGVzYyAkKGdlbl9zcmNfcHkpL3JpbF9wYjIucHkgXAorICAgICAgJChnZW5fc3JjX2Rlc2MpL2N0cmwuZGVzYyAkKGdlbl9zcmNfcHkpL2N0cmxfcGIyLnB5CiAKICMgQSBNYWtlZmlsZSB0byBydW4gcHJvdG9jIGFuZCBzaW1wbGlmeSB0ZXN0aW5nLgogLlBIT05ZIDogYWxsCkBAIC0zOSw3MiArNDMsMzkgQEAKIC5QSE9OWSA6IHV0CiB1dCA6CiAJc291cmNlICQodG9wKWJ1aWxkL2VudnNldHVwLnNoIDsgbW1tICQodG9wKWZyYW1ld29ya3MvYmFzZS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMKLQlhZGIgaW5zdGFsbCAtciAkKHRvcClvdXQvdGFyZ2V0L3Byb2R1Y3QvcGFzc2lvbi9kYXRhL2FwcC9GcmFtZXdvcmtzVGVsZXBob255VGVzdHMuYXBrCisJYWRiIGluc3RhbGwgLXIgJCh0b3Apb3V0L3RhcmdldC9wcm9kdWN0LyQoZGV2aWNlKS9kYXRhL2FwcC9GcmFtZXdvcmtzVGVsZXBob255VGVzdHMuYXBrCiAKLXQgOiAkKGdlbl9zcmNfY3BwKS9tc2doZWFkZXIucGIuY3BwICQoZ2VuX3NyY19kZXNjKS9tc2doZWFkZXIuZGVzYyAkKGdlbl9zcmNfcHkpL21zZ2hlYWRlcl9wYjIucHkgJChnZW5fc3JjX2phdmEpL2NvbS9hbmRyb2lkL2ludGVybmFsL2NvbW11bmljYXRpb24vTXNnSGVhZGVyLmphdmEKK3QgOiAkKGdlbl9zcmNfZGVzYykvbXNnaGVhZGVyLmRlc2MgJChnZW5fc3JjX3B5KS9tc2doZWFkZXJfcGIyLnB5CiAKLSMgUnVuIHByb3RvYyB0byBjcmVhdGUgdGhlIGMrKyBmaWxlcyBmb3IgbXNnaGVhZGVyCi0kKGdlbl9zcmNfY3BwKS9tc2doZWFkZXIucGIuY3BwICQoZ2VuX3NyY19jcHApL21zZ2hlYWRlci5wYi5oIDogJChzcmNfcHJvdG8pL21zZ2hlYWRlci5wcm90bwotCW1rZGlyIC1wICQoZ2VuX3NyY19jcHApCi0JcHJvdG9jIC0tY3BwX291dD0kKGdlbl9zcmNfY3BwKSAtLXByb3RvX3BhdGg9JChzcmNfcHJvdG8pICQ8Ci0JbXYgJChnZW5fc3JjX2NwcCkvbXNnaGVhZGVyLnBiLmNjICQoZ2VuX3NyY19jcHApL21zZ2hlYWRlci5wYi5jcHAKLQotIyBSdW4gcHJvdG9jIHRvIGNyZWF0ZSB0aGUgcHl0aG9uIGZpbGVzIGZvciBtc2doZWFkZXIKKyMgUnVuIHByb3RvYyB0byBjcmVhdGUgdGhlIGRlc2NyaXB0b3IgZmlsZXMgZm9yIG1zZ2hlYWRlcgogJChnZW5fc3JjX2Rlc2MpL21zZ2hlYWRlci5kZXNjIDogJChzcmNfcHJvdG8pL21zZ2hlYWRlci5wcm90bwogCW1rZGlyIC1wICQoZ2VuX3NyY19kZXNjKQotCXByb3RvYyAtLWRlc2NyaXB0b3Jfc2V0X291dD0kQCAtLXByb3RvX3BhdGg9JChzcmNfcHJvdG8pIC0taW5jbHVkZV9pbXBvcnRzICQ8CisJJChQUk9UT0MpIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSRAIC0tcHJvdG9fcGF0aD0kKHNyY19wcm90bykgLS1pbmNsdWRlX2ltcG9ydHMgJDwKIAotIyBSdW4gcHJvdG9jIHRvIGNyZWF0ZSB0aGUgcHlodG9uIGZpbGVzIGZvciBtc2doZWFkZXIKKyMgUnVuIHByb3RvYyB0byBjcmVhdGUgdGhlIHB5dGhvbiBmaWxlcyBmb3IgbXNnaGVhZGVyCiAkKGdlbl9zcmNfcHkpL21zZ2hlYWRlcl9wYjIucHkgOiAkKHNyY19wcm90bykvbXNnaGVhZGVyLnByb3RvCiAJbWtkaXIgLXAgJChnZW5fc3JjX3B5KQotCXByb3RvYyAtLXB5dGhvbl9vdXQ9JChnZW5fc3JjX3B5KSAtLXByb3RvX3BhdGg9JChzcmNfcHJvdG8pICQ8Ci0KLSMgUnVuIHByb3RvYyB0byBjcmVhdGUgdGhlIGphdmEgZmlsZXMgZm9yIHJpbAotJChnZW5fc3JjX2phdmEpL2NvbS9hbmRyb2lkL2ludGVybmFsL2NvbW11bmljYXRpb24vTXNnSGVhZGVyLmphdmEgOiAkKHNyY19wcm90bykvbXNnaGVhZGVyLnByb3RvCi0JbWtkaXIgLXAgJChnZW5fc3JjX2phdmEpCi0JcHJvdG9jIC0tamF2YW1pY3JvX291dD0kKGdlbl9zcmNfamF2YSkgLS1wcm90b19wYXRoPSQoc3JjX3Byb3RvKSAkPAotCi0jIFJ1biBwcm90b2MgdG8gY3JlYXRlIHRoZSBjKysgZmlsZXMgZm9yIHJpbAotJChnZW5fc3JjX2NwcCkvcmlsLnBiLmNwcCAkKGdlbl9zcmNfY3BwKS9yaWwucGIuaCA6ICQoc3JjX3Byb3RvKS9yaWwucHJvdG8KLQlta2RpciAtcCAkKGdlbl9zcmNfY3BwKQotCXByb3RvYyAtLWNwcF9vdXQ9JChnZW5fc3JjX2NwcCkgLS1wcm90b19wYXRoPSQoc3JjX3Byb3RvKSAkPAotCW12ICQoZ2VuX3NyY19jcHApL3JpbC5wYi5jYyAkKGdlbl9zcmNfY3BwKS9yaWwucGIuY3BwCisJJChQUk9UT0MpIC0tcHl0aG9uX291dD0kKGdlbl9zcmNfcHkpIC0tcHJvdG9fcGF0aD0kKHNyY19wcm90bykgJDwKIAogIyBSdW4gcHJvdG9jIHRvIGNyZWF0ZSB0aGUgcmlsIGRlc2NyaXB0b3IgZmlsZSBmb3IgcmlsCiAkKGdlbl9zcmNfZGVzYykvcmlsLmRlc2MgOiAkKHNyY19wcm90bykvcmlsLnByb3RvCiAJbWtkaXIgLXAgJChnZW5fc3JjX2Rlc2MpCi0JcHJvdG9jIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSRAIC0tcHJvdG9fcGF0aD0kKHNyY19wcm90bykgLS1pbmNsdWRlX2ltcG9ydHMgJDwKKwkkKFBST1RPQykgLS1kZXNjcmlwdG9yX3NldF9vdXQ9JEAgLS1wcm90b19wYXRoPSQoc3JjX3Byb3RvKSAtLWluY2x1ZGVfaW1wb3J0cyAkPAogCi0jIFJ1biBwcm90b2MgdG8gY3JlYXRlIHRoZSBweWh0b24gZmlsZXMgZm9yIHJpbAorIyBSdW4gcHJvdG9jIHRvIGNyZWF0ZSB0aGUgcHl0aG9uIGZpbGVzIGZvciByaWwKICQoZ2VuX3NyY19weSkvcmlsX3BiMi5weSA6ICQoc3JjX3Byb3RvKS9yaWwucHJvdG8KIAlta2RpciAtcCAkKGdlbl9zcmNfcHkpCi0JcHJvdG9jIC0tcHl0aG9uX291dD0kKGdlbl9zcmNfcHkpIC0tcHJvdG9fcGF0aD0kKHNyY19wcm90bykgJDwKKwkkKFBST1RPQykgLS1weXRob25fb3V0PSQoZ2VuX3NyY19weSkgLS1wcm90b19wYXRoPSQoc3JjX3Byb3RvKSAkPAogCi0jIFJ1biBwcm90b2MgdG8gY3JlYXRlIHRoZSBqYXZhIGZpbGVzIGZvciByaWwKLSQoZ2VuX3NyY19qYXZhKS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvcmlsX3Byb3RvL1JpbENtZHMuamF2YSA6ICQoc3JjX3Byb3RvKS9yaWwucHJvdG8KLQlta2RpciAtcCAkKGdlbl9zcmNfamF2YSkKLQlwcm90b2MgLS1qYXZhbWljcm9fb3V0PSQoZ2VuX3NyY19qYXZhKSAtLXByb3RvX3BhdGg9JChzcmNfcHJvdG8pICQ8Ci0KLSMgUnVuIHByb3RvYyB0byBjcmVhdGUgdGhlIGMrKyBmaWxlcyBmb3IgY29udHJvbAotJChnZW5fc3JjX2NwcCkvY3RybC5wYi5jcHAgJChnZW5fc3JjX2NwcCkvY3RybC5wYi5oIDogJChzcmNfcHJvdG8pL2N0cmwucHJvdG8KLQlta2RpciAtcCAkKGdlbl9zcmNfY3BwKQotCXByb3RvYyAtLWNwcF9vdXQ9JChnZW5fc3JjX2NwcCkgLS1wcm90b19wYXRoPSQoc3JjX3Byb3RvKSAkPAotCW12ICQoZ2VuX3NyY19jcHApL2N0cmwucGIuY2MgJChnZW5fc3JjX2NwcCkvY3RybC5wYi5jcHAKLQotIyBSdW4gcHJvdG9jIHRvIGNyZWF0ZSB0aGUgcHlodG9uIGZpbGVzIGZvciBjb250cm9sCisjIFJ1biBwcm90b2MgdG8gY3JlYXRlIHRoZSBweXRob24gZmlsZXMgZm9yIGNvbnRyb2wKICQoZ2VuX3NyY19weSkvY3RybF9wYjIucHkgOiAkKHNyY19wcm90bykvY3RybC5wcm90bwogCW1rZGlyIC1wICQoZ2VuX3NyY19weSkKLQlwcm90b2MgLS1weXRob25fb3V0PSQoZ2VuX3NyY19weSkgLS1wcm90b19wYXRoPSQoc3JjX3Byb3RvKSAkPAorCSQoUFJPVE9DKSAtLXB5dGhvbl9vdXQ9JChnZW5fc3JjX3B5KSAtLXByb3RvX3BhdGg9JCh0b3ApIC0tcHJvdG9fcGF0aD0kKHNyY19wcm90bykgJDwKIAogIyBSdW4gcHJvdG9jIHRvIGNyZWF0ZSB0aGUgY3RybCBkZXNjcmlwdG9yIGZpbGUgZm9yIGNvbnRyb2wKICQoZ2VuX3NyY19kZXNjKS9jdHJsLmRlc2MgOiAkKHNyY19wcm90bykvY3RybC5wcm90bwogCW1rZGlyIC1wICQoZ2VuX3NyY19kZXNjKQotCXByb3RvYyAtLWRlc2NyaXB0b3Jfc2V0X291dD0kQCAtLXByb3RvX3BhdGg9JChzcmNfcHJvdG8pIC0taW5jbHVkZV9pbXBvcnRzICQ8Ci0KLSMgUnVuIHByb3RvYyB0byBjcmVhdGUgdGhlIGphdmEgZmlsZXMgZm9yIHJpbAotJChnZW5fc3JjX2phdmEpL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9yaWxfcHJvdG8vUmlsQ3RybENtZHMuamF2YSA6ICQoc3JjX3Byb3RvKS9jdHJsLnByb3RvCi0JbWtkaXIgLXAgJChnZW5fc3JjX2phdmEpCi0JcHJvdG9jIC0tamF2YW1pY3JvX291dD0kKGdlbl9zcmNfamF2YSkgLS1wcm90b19wYXRoPSQoc3JjX3Byb3RvKSAkPAorCSQoUFJPVE9DKSAtLWRlc2NyaXB0b3Jfc2V0X291dD0kQCAtLXByb3RvX3BhdGg9JCh0b3ApIC0tcHJvdG9fcGF0aD0kKHNyY19wcm90bykgLS1pbmNsdWRlX2ltcG9ydHMgJDwKIAogIyBBZnRlciBzdGFydGluZyBwaG9uZSBkbyB0aGlzIGZpcnN0IHRvIGdldCBsYXN0ZXN0IHJpbC5kZXNjL3Byb3RvIGFuZCBzZXR1cCByaWxkCiAuUEhPTlkgOiBmaXJzdApAQCAtMTIxLDcgKzkyLDcgQEAKICMgUmVzdGFydCByaWxkCiAuUEhPTlkgOiByZXN0YXJ0X3JpbGQKIHJlc3RhcnRfcmlsZCA6Ci0JYWRiIHNoZWxsIHBzIHwgYXdrICcvcmlsZC8geyBwcmludCAkJDIgfScgfCB4YXJncyBhZGIgc2hlbGwga2lsbAorCWFkYiBzaGVsbCBzZXRwcm9wIGN0bC5yZXN0YXJ0IHJpbC1kYWVtb24KIAogIyBVcGRhdGUgb25seSB0aGUganMvY29weSBhbmQgcmVzdGFydCByaWxkCiAuUEhPTlkgOiB0anMKQEAgLTE2NywxNCArMTM4LDE1IEBACiAJYWRiIHB1c2ggJChnZW5fc3JjX2Rlc2MpL2N0cmwuZGVzYyAvc2RjYXJkL2RhdGEvCiAJYWRiIGZvcndhcmQgdGNwOjExMTExIHRjcDo1NDMxMgogCisKICMgQ29weSB0aGUgbW9jayByaWwgbGlicmFyeQogLlBIT05ZIDogY29weV9tb2NrcmlsCiBjb3B5X21vY2tyaWwgOgotCWFkYiBwdXNoICQodG9wKW91dC90YXJnZXQvcHJvZHVjdC9wYXNzaW9uL3N5c3RlbS9saWIvbGlibW9ja19yaWwuc28gL2RhdGEvbGliLworCWFkYiBwdXNoICQodG9wKW91dC90YXJnZXQvcHJvZHVjdC8kKGRldmljZSkvc3lzdGVtL2xpYi9saWJtb2NrX3JpbC5zbyAvZGF0YS9saWIvCiAKIC5QSE9OWSA6IGluc3RhbGxfbW9ja3JpbF90ZXN0cwogaW5zdGFsbF9tb2NrcmlsX3Rlc3RzIDoKLQlhZGIgaW5zdGFsbCAtciAkKHRvcClvdXQvdGFyZ2V0L3Byb2R1Y3QvcGFzc2lvbi9kYXRhL2FwcC9GcmFtZXdvcmtzVGVsZXBob255VGVzdHMuYXBrCisJYWRiIGluc3RhbGwgLXIgJCh0b3Apb3V0L3RhcmdldC9wcm9kdWN0LyQoZGV2aWNlKS9kYXRhL2FwcC9GcmFtZXdvcmtzVGVsZXBob255VGVzdHMuYXBrCiAKICMgUmVtb3ZlIGdlbmVyYXRlZCBmaWxlcwogLlBIT05ZIDogY2xlYW4KZGlmZiAtLWdpdCBhL21vY2stcmlsL1JFQURNRS50eHQgYi9tb2NrLXJpbC9SRUFETUUudHh0CmluZGV4IDMyYWJkZDguLjBiN2JlZjYgMTAwNjQ0Ci0tLSBhL21vY2stcmlsL1JFQURNRS50eHQKKysrIGIvbW9jay1yaWwvUkVBRE1FLnR4dApAQCAtMiwxOSArMiwxMyBAQAogCiBJbnN0YWxsOgogCi1JbnN0YWxsIHByb3RvYyBzZWUgdGhlIGV4dGVybmFsL3Byb3RvYnVmL0lOU1RBTEwudHh0IGFuZAotZXh0ZXJuYWwvcHJvdG9idWYvcHl0aG9uL1JFQURNRS50eHQuIFRoZSBzaG9ydCBhbnN3ZXIgaXM6Ci0KLSAgICAkIGNkIGV4dGVybmFsL3Byb3RvYnVmCi0gICAgJCAuL2NvbmZpZ3VyZQotICAgICQgbWFrZQotICAgICQgbWFrZSBjaGVjawotICAgICQgbWFrZSBpbnN0YWxsCi0gICAgJCBjZCBweXRob24KLSAgICAkIHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsCi0KLUlmIHlvdSBnZXQgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB4eHh4IiBzdGF0ZW1lbnRzCi10aGF0IGdvb2dsZS5wcm90b2J1ZiBpcyBub3QgZm91bmQgeW91IGRpZG4ndCBpbnN0YWxsIHRoZQorVGhlIHByb3RvYyBpcyBub3cgcGFydCBvZiB0aGUgQW5kcm9pZCBidWlsZCBidXQgaXRzCitjYWxsZWQgImFwcm90b2MiIHNvIGl0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCB2ZXJzaW9ucworYWxyZWFkeSBpbnN0YWxsZWQuIElmIHlvdSB3aXNoIHRvIGluc3RhbGwgaXQgcGVybWFuZXRseQorc2VlIGV4dGVybmFsL3Byb3RvYnVmL0lOU1RBTEwudHh0IGFuZAorZXh0ZXJuYWwvcHJvdG9idWYvcHl0aG9uL1JFQURNRS50eHQuICBJZiB5b3UgZ2V0CisiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHh4eHgiIHN0YXRlbWVudHMgdGhhdAorZ29vZ2xlLnByb3RvYnVmIGlzIG5vdCBmb3VuZCwgeW91IGRpZG4ndCBpbnN0YWxsIHRoZQogcHl0aG9uIHN1cHBvcnQgZm9yIHByb3RvYnVmLiBBbHNvIG9uIE1hYyBPU1ggSSBnb3QgYW4KIGVycm9yIHJ1bm5pbmcgdGhlIHByb3RvYyB0ZXN0cyBidXQgaW5zdGFsbGluZyB3YXMgZmluZS4KIApAQCAtMjIsNyArMTYsMTYgQEAKIAogU2VlICJUZXN0aW5nIGEgbmV3IHJpbDoiIGJlbG93IGZvciBnZW5lcmFsIGluc3RydWN0aW9ucyBidXQKIGZvciB0aGUgbW9jay1yaWwgSSd2ZSBhZGRlZCBzb21lIHRhcmdldHMgdG8gdGhlIE1ha2VmaWxlIHRvCi1lYXNlIHRlc3RpbmcuCitlYXNlIHRlc3RpbmcuIEFsc28gTWFrZWZpbGUgbmVlZHMgdG8ga25vdyB0aGUgZGV2aWNlIGJlaW5nCit1c2VkIGFzIHRoaXMgZGV0ZXJtaW5lcyB0aGUgZGlyZWN0b3J5IHdoZXJlIGZpbGVzIGFyZSBmb3VuZAorYW5kIHN0b3JlZC4gQU5EUk9JRF9ERVZJQ0UgaXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kCittYXliZSBlaXRoZXIgZXhwb3J0ZWQ6CisgICAkIGV4cG9ydCBBTkRST0lEX0RFVklDRT1zdGluZ3JheQorCitvciBpdCBjYW4gYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmU6CisgICAkIG1ha2UgY2xlYW4gQU5EUk9JRF9ERVZJQ0U9c3RpbmdyYXkKKworSWYgaXQncyBub3Qgc2V0ICJwYXNzaW9uIiBpcyB0aGUgZGVmYXVsdC4KIAogRXhlY3V0ZSB0aGUgImZpcnN0IiB0YXJnZXQgZmlyc3QgdG8gc2V0dXAgYXBwcm9wcmlhdGUKIGVudmlyb25tZW50OgpAQCAtOTIsNyArOTUsNyBAQAogVGVzdGluZyBhIG5ldyByaWw6CiAKIFRoZSBNYWtlZmlsZSBpcyB1c2VkIHRvIGdlbmVyYXRlIGZpbGVzIGFuZCBtYWtlIHRlc3RpbmcgZWFzaWVyLgotSSBoYXMgc2V2ZXJhbCB0YXJnZXRzOgorYW5kIHRoZXJlIGFyZSBoYXMgc2V2ZXJhbCB0YXJnZXRzOgogCiBhbGwgICAgICAgICBydW5zIHByb3RvYyBhbmQgZ2VuZXJhdGVzIGZpbGVzLCByaWwuZGVzYyByaWwucGIuKgogCkBAIC0xMzAsNCArMTMzLDggQEAKIAogICAgICAkIGFkYiBzaGVsbCBraWxsIDMyMTIKIAorICAgb3IKKworICAgICAkIGFkYiBzaGVsbCBzZXRwcm9wIGN0bC5yZXN0YXJ0IHJpbC1kYWVtb24KKwogNSkgTWFrZSBtb2RpZmljYXRpb25zLCBnbyB0byBzdGVwIDMuCmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvY3BwL2N0cmxfc2VydmVyLmNwcCBiL21vY2stcmlsL3NyYy9jcHAvY3RybF9zZXJ2ZXIuY3BwCmluZGV4IDJkYzk2MzQuLjkwYjZkNGMgMTAwNjQ0Ci0tLSBhL21vY2stcmlsL3NyYy9jcHAvY3RybF9zZXJ2ZXIuY3BwCisrKyBiL21vY2stcmlsL3NyYy9jcHAvY3RybF9zZXJ2ZXIuY3BwCkBAIC0zMSw5ICszMSw5IEBACiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgIndvcmtlci5oIgogCi0jaW5jbHVkZSAibXNnaGVhZGVyLnBiLmgiCisjaW5jbHVkZSAiaGFyZHdhcmUvcmlsL21vY2stcmlsL3NyYy9wcm90by9tc2doZWFkZXIucGIuaCIKIAotI2luY2x1ZGUgImN0cmwucGIuaCIKKyNpbmNsdWRlICJoYXJkd2FyZS9yaWwvbW9jay1yaWwvc3JjL3Byb3RvL2N0cmwucGIuaCIKICNpbmNsdWRlICJjdHJsX3NlcnZlci5oIgogCiAvLyNkZWZpbmUgQ09OVFJPTF9TRVJWRVJfREVCVUcKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9jcHAvZXhwZXJpbWVudHMuY3BwIGIvbW9jay1yaWwvc3JjL2NwcC9leHBlcmltZW50cy5jcHAKaW5kZXggMzE3ZmQ5ZC4uNWZhNmZlYyAxMDA2NDQKLS0tIGEvbW9jay1yaWwvc3JjL2NwcC9leHBlcmltZW50cy5jcHAKKysrIGIvbW9jay1yaWwvc3JjL2NwcC9leHBlcmltZW50cy5jcHAKQEAgLTE1LDE0ICsxNSwxNCBAQAogICovCiAKICNpbmNsdWRlIDx2OC5oPgotI2luY2x1ZGUgPHRlbGVwaG9ueS9yaWwuaD4KKyNpbmNsdWRlICJyaWwuaCIKIAogI2luY2x1ZGUgImxvZ2dpbmcuaCIKICNpbmNsdWRlICJzdGF0dXMuaCIKICNpbmNsdWRlICJ3b3JrZXIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKLSNpbmNsdWRlICJyaWwucGIuaCIKKyNpbmNsdWRlICJoYXJkd2FyZS9yaWwvbW9jay1yaWwvc3JjL3Byb3RvL3JpbC5wYi5oIgogCiAjaW5jbHVkZSAibG9nZ2luZy5oIgogI2luY2x1ZGUgImpzX3N1cHBvcnQuaCIKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9jcHAvanNfc3VwcG9ydC5jcHAgYi9tb2NrLXJpbC9zcmMvY3BwL2pzX3N1cHBvcnQuY3BwCmluZGV4IDk0OTcxNzYuLmEyY2U5YzUgMTAwNjQ0Ci0tLSBhL21vY2stcmlsL3NyYy9jcHAvanNfc3VwcG9ydC5jcHAKKysrIGIvbW9jay1yaWwvc3JjL2NwcC9qc19zdXBwb3J0LmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDx2OC5oPgotI2luY2x1ZGUgPHRlbGVwaG9ueS9yaWwuaD4KKyNpbmNsdWRlICJyaWwuaCIKIAogI2luY2x1ZGUgImN0cmxfc2VydmVyLmgiCiAjaW5jbHVkZSAibG9nZ2luZy5oIgpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2NwcC9qc19zdXBwb3J0LmggYi9tb2NrLXJpbC9zcmMvY3BwL2pzX3N1cHBvcnQuaAppbmRleCA2YzcwYjgyLi4zMTE2ZjFkIDEwMDY0NAotLS0gYS9tb2NrLXJpbC9zcmMvY3BwL2pzX3N1cHBvcnQuaAorKysgYi9tb2NrLXJpbC9zcmMvY3BwL2pzX3N1cHBvcnQuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBNT0NLX1JJTF9KU19TVVBQT1JUX0hfCiAKICNpbmNsdWRlIDx2OC5oPgotI2luY2x1ZGUgPHRlbGVwaG9ueS9yaWwuaD4KKyNpbmNsdWRlICJyaWwuaCIKIAogLy8gVGhlIGdsb2JhbCB2YWx1ZSBvZiByYWRpbyBzdGF0ZSBzaGFyZWQgYmV0d2VlbiBjcHAgYW5kIGpzIGNvZGUuCiBleHRlcm4gUklMX1JhZGlvU3RhdGUgZ1JhZGlvU3RhdGU7CmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvY3BwL21vY2tfcmlsLmNwcCBiL21vY2stcmlsL3NyYy9jcHAvbW9ja19yaWwuY3BwCmluZGV4IDg4ZGE1NDYuLmY2YjY4MDcgMTAwNjQ0Ci0tLSBhL21vY2stcmlsL3NyYy9jcHAvbW9ja19yaWwuY3BwCisrKyBiL21vY2stcmlsL3NyYy9jcHAvbW9ja19yaWwuY3BwCkBAIC0xNCw3ICsxNCw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8dGVsZXBob255L3JpbC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0zMSw4ICszMCw5IEBACiAjaW5jbHVkZSA8dGVybWlvcy5oPgogCiAjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlICJyaWwuaCIKIAotI2luY2x1ZGUgInJpbC5wYi5oIgorI2luY2x1ZGUgImhhcmR3YXJlL3JpbC9tb2NrLXJpbC9zcmMvcHJvdG8vcmlsLnBiLmgiCiAKICNpbmNsdWRlICJjdHJsX3NlcnZlci5oIgogI2luY2x1ZGUgImxvZ2dpbmcuaCIKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9jcHAvbW9ja19yaWwuaCBiL21vY2stcmlsL3NyYy9jcHAvbW9ja19yaWwuaAppbmRleCBjMjliNWVkLi4zODc0NWQ2IDEwMDY0NAotLS0gYS9tb2NrLXJpbC9zcmMvY3BwL21vY2tfcmlsLmgKKysrIGIvbW9jay1yaWwvc3JjL2NwcC9tb2NrX3JpbC5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIE1PQ0tfUklMX01PQ0tfUklMX0hfCiAjZGVmaW5lIE1PQ0tfUklMX01PQ0tfUklMX0hfCiAKLSNpbmNsdWRlIDx0ZWxlcGhvbnkvcmlsLmg+CisjaW5jbHVkZSAicmlsLmgiCiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgUklMX0VudiAqc19yaWxlbnY7CiAKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9jcHAvbXNnaGVhZGVyLnBiLmNwcCBiL21vY2stcmlsL3NyYy9jcHAvbXNnaGVhZGVyLnBiLmNwcAppbmRleCBiNGJkMWE1Li5kZDEwYzk0IDEwMDY0NAotLS0gYS9tb2NrLXJpbC9zcmMvY3BwL21zZ2hlYWRlci5wYi5jcHAKKysrIGIvbW9jay1yaWwvc3JjL2NwcC9tc2doZWFkZXIucGIuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKIAogI2RlZmluZSBJTlRFUk5BTF9TVVBQUkVTU19QUk9UT0JVRl9GSUVMRF9ERVBSRUNBVElPTgotI2luY2x1ZGUgIm1zZ2hlYWRlci5wYi5oIgorI2luY2x1ZGUgImhhcmR3YXJlL3JpbC9tb2NrLXJpbC9zcmMvcHJvdG8vbXNnaGVhZGVyLnBiLmgiCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvY3BwL25vZGVfYnVmZmVyLmNwcCBiL21vY2stcmlsL3NyYy9jcHAvbm9kZV9idWZmZXIuY3BwCmluZGV4IDNiNGFmNWUuLmQ3MmUxOWUgMTAwNjQ0Ci0tLSBhL21vY2stcmlsL3NyYy9jcHAvbm9kZV9idWZmZXIuY3BwCisrKyBiL21vY2stcmlsL3NyYy9jcHAvbm9kZV9idWZmZXIuY3BwCkBAIC0xODcsMTAgKzE4Nyw4IEBACiAgICAgTG9jYWw8QXJyYXk+IGEgPSBMb2NhbDxBcnJheT46OkNhc3QoYXJnc1swXSk7CiAgICAgYnVmZmVyID0gbmV3IEJ1ZmZlcihhLT5MZW5ndGgoKSk7CiAgICAgY2hhciAqcCA9IGJ1ZmZlci0+ZGF0YSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS0+TGVuZ3RoKCk7IGkrKykgewotICAgICAgSGFuZGxlPFZhbHVlPiBpbmRleCA9IHY4OjpOdW1iZXI6Ok5ldyhpKTsKLSAgICAgIHBbaV0gPSBhLT5HZXQoaW5kZXgpLT5VaW50MzJWYWx1ZSgpOwotICAgICAgLy9wW2ldID0gYS0+R2V0KGkpLT5VaW50MzJWYWx1ZSgpOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYS0+TGVuZ3RoKCk7IGkrKykgeworICAgICAgcFtpXSA9IGEtPkdldChpKS0+VWludDMyVmFsdWUoKTsKICAgICB9CiAgIH0gZWxzZSBpZiAoYXJnc1swXS0+SXNTdHJpbmcoKSkgewogICAgIExvY2FsPFN0cmluZz4gcyA9IGFyZ3NbMF0tPlRvU3RyaW5nKCk7CkBAIC00NDMsMTIgKzQ0MSwxMiBAQAogICBpbnQgY2hhcl93cml0dGVuOwogCiAgIGludCB3cml0dGVuID0gcy0+V3JpdGVVdGY4KChjaGFyKilwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPmxlbmd0aF8gLSBvZmZzZXQpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyX3dyaXR0ZW4sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpISU5UX01BTllfV1JJVEVTX0VYUEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5sZW5ndGhfIC0gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcl93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc6OkhJTlRfTUFOWV9XUklURVNfRVhQRUNURUQpOwogCiAgIGNvbnN0cnVjdG9yX3RlbXBsYXRlLT5HZXRGdW5jdGlvbigpLT5TZXQoY2hhcnNfd3JpdHRlbl9zeW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlcjo6TmV3KHdyaXR0ZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyOjpOZXcoY2hhcl93cml0dGVuKSk7CiAKICAgaWYgKHdyaXR0ZW4gPiAwICYmIHBbd3JpdHRlbi0xXSA9PSAnXDAnKSB3cml0dGVuLS07CiAKQEAgLTQ4NCw3ICs0ODIsNyBAQAogCiAgIHNpemVfdCB0b3dyaXRlID0gTUlOKCh1bnNpZ25lZCBsb25nKSBzLT5MZW5ndGgoKSwgYnVmZmVyLT5sZW5ndGhfIC0gb2Zmc2V0KTsKIAotICBpbnQgd3JpdHRlbiA9IHMtPldyaXRlQXNjaWkoKGNoYXIqKXAsIDAsIHRvd3JpdGUpOworICBpbnQgd3JpdHRlbiA9IHMtPldyaXRlQXNjaWkoKGNoYXIqKXAsIDAsIHRvd3JpdGUsIFN0cmluZzo6SElOVF9NQU5ZX1dSSVRFU19FWFBFQ1RFRCk7CiAgIERCRygiQnVmZmVyOjpBc2NpaVdyaXRlKGFyZ3MpIFgiKTsKICAgcmV0dXJuIHNjb3BlLkNsb3NlKEludGVnZXI6Ok5ldyh3cml0dGVuKSk7CiB9CmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvY3BwL25vZGVfdXRpbC5jcHAgYi9tb2NrLXJpbC9zcmMvY3BwL25vZGVfdXRpbC5jcHAKaW5kZXggODM2ODg0OC4uNTA0OGU1MyAxMDA2NDQKLS0tIGEvbW9jay1yaWwvc3JjL2NwcC9ub2RlX3V0aWwuY3BwCisrKyBiL21vY2stcmlsL3NyYy9jcHAvbm9kZV91dGlsLmNwcApAQCAtMTE1LDEyICsxMTUsMTIgQEAKICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHN0ciA9IHZhbC0+VG9TdHJpbmcoKTsKIAogICBpZiAoZW5jb2RpbmcgPT0gVVRGOCkgewotICAgIHN0ci0+V3JpdGVVdGY4KGJ1ZiwgYnVmbGVuKTsKKyAgICBzdHItPldyaXRlVXRmOChidWYsIGJ1ZmxlbiwgTlVMTCwgdjg6OlN0cmluZzo6SElOVF9NQU5ZX1dSSVRFU19FWFBFQ1RFRCk7CiAgICAgcmV0dXJuIGJ1ZmxlbjsKICAgfQogCiAgIGlmIChlbmNvZGluZyA9PSBBU0NJSSkgewotICAgIHN0ci0+V3JpdGVBc2NpaShidWYsIDAsIGJ1Zmxlbik7CisgICAgc3RyLT5Xcml0ZUFzY2lpKGJ1ZiwgMCwgYnVmbGVuLCB2ODo6U3RyaW5nOjpISU5UX01BTllfV1JJVEVTX0VYUEVDVEVEKTsKICAgICByZXR1cm4gYnVmbGVuOwogICB9CiAKQEAgLTEzMCw3ICsxMzAsNyBAQAogCiAgIHVpbnQxNl90ICogdHdvYnl0ZWJ1ZiA9IG5ldyB1aW50MTZfdFtidWZsZW5dOwogCi0gIHN0ci0+V3JpdGUodHdvYnl0ZWJ1ZiwgMCwgYnVmbGVuKTsKKyAgc3RyLT5Xcml0ZSh0d29ieXRlYnVmLCAwLCBidWZsZW4sIHY4OjpTdHJpbmc6OkhJTlRfTUFOWV9XUklURVNfRVhQRUNURUQpOwogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmbGVuOyBpKyspIHsKICAgICB1bnNpZ25lZCBjaGFyICpiID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oJnR3b2J5dGVidWZbaV0pOwpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2NwcC9wcm90b2J1Zl92OC5jcHAgYi9tb2NrLXJpbC9zcmMvY3BwL3Byb3RvYnVmX3Y4LmNwcAppbmRleCBjNGFjYjBhLi4xNjIyYmE1IDEwMDY0NAotLS0gYS9tb2NrLXJpbC9zcmMvY3BwL3Byb3RvYnVmX3Y4LmNwcAorKysgYi9tb2NrLXJpbC9zcmMvY3BwL3Byb3RvYnVmX3Y4LmNwcApAQCAtMTI2LDcgKzEyNiw3IEBACiAKICAgICAgIEhhbmRsZTxGdW5jdGlvbj4gQ29uc3RydWN0b3IoKSBjb25zdCB7CiAgICAgICAgIERCRygiVHlwZTo6Q29uc3Ryb2N1dG9yKCkgRVg6Iik7Ci0gICAgICAgIHJldHVybiBIYW5kbGU8RnVuY3Rpb24+OjpDYXN0KGhhbmRsZV8tPkdldEludGVybmFsRmllbGQoMikpOworICAgICAgICByZXR1cm4gaGFuZGxlXy0+R2V0SW50ZXJuYWxGaWVsZCgyKS5BczxGdW5jdGlvbj4oKTsKICAgICAgIH0KIAogICAgICAgTG9jYWw8T2JqZWN0PiBOZXdPYmplY3QoSGFuZGxlPFZhbHVlPiBwcm9wZXJ0aWVzKSBjb25zdCB7CkBAIC0xNjQsMTggKzE2NCwxOCBAQAogICAgICAgICAvLyBtYW5hZ2VkIHR5cGUtPnNjaGVtYSBsaW5rCiAgICAgICAgIHNlbGYtPlNldEludGVybmFsRmllbGQoMSwgc2NoZW1hXy0+aGFuZGxlXyk7CiAKLSAgICAgICAgSGFuZGxlPEZ1bmN0aW9uPiBjb25zdHJ1Y3RvciA9IEhhbmRsZTxGdW5jdGlvbj46OkNhc3QoCi0gICAgICAgICAgU2NyaXB0OjpDb21waWxlKFN0cmluZzo6TmV3KGZyb20uc3RyKCkuY19zdHIoKSkpLT5SdW4oKSk7CisgICAgICAgIEhhbmRsZTxGdW5jdGlvbj4gY29uc3RydWN0b3IgPQorICAgICAgICAgIFNjcmlwdDo6Q29tcGlsZShTdHJpbmc6Ok5ldyhmcm9tLnN0cigpLmNfc3RyKCkpKS0+UnVuKCkuQXM8RnVuY3Rpb24+KCk7CiAgICAgICAgIGNvbnN0cnVjdG9yLT5TZXRIaWRkZW5WYWx1ZShTdHJpbmc6Ok5ldygidHlwZSIpLCBzZWxmKTsKIAotICAgICAgICBIYW5kbGU8RnVuY3Rpb24+IGJpbmQgPSBIYW5kbGU8RnVuY3Rpb24+OjpDYXN0KAorICAgICAgICBIYW5kbGU8RnVuY3Rpb24+IGJpbmQgPQogICAgICAgICAgIFNjcmlwdDo6Q29tcGlsZShTdHJpbmc6Ok5ldygKICAgICAgICAgICAgICAgIihmdW5jdGlvbihzZWxmKSB7IgogICAgICAgICAgICAgICAiICB2YXIgZiA9IHRoaXM7IgogICAgICAgICAgICAgICAiICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7IgogICAgICAgICAgICAgICAiICAgIHJldHVybiBmLmNhbGwoc2VsZiwgYXJnKTsiCiAgICAgICAgICAgICAgICIgIH07IgotICAgICAgICAgICAgICAifSkiKSktPlJ1bigpKTsKKyAgICAgICAgICAgICAgIn0pIikpLT5SdW4oKS5BczxGdW5jdGlvbj4oKTsKICAgICAgICAgSGFuZGxlPFZhbHVlPiBhcmcgPSBzZWxmOwogICAgICAgICBjb25zdHJ1Y3Rvci0+U2V0KFN0cmluZzo6TmV3KCJwYXJzZSIpLCBiaW5kLT5DYWxsKFBhcnNlVGVtcGxhdGUtPkdldEZ1bmN0aW9uKCksIDEsICZhcmcpKTsKICAgICAgICAgY29uc3RydWN0b3ItPlNldChTdHJpbmc6Ok5ldygic2VyaWFsaXplIiksIGJpbmQtPkNhbGwoU2VyaWFsaXplVGVtcGxhdGUtPkdldEZ1bmN0aW9uKCksIDEsICZhcmcpKTsKQEAgLTI2NSw4ICsyNjUsNyBAQAogICAgICAgICAgICAgaW50IHNpemUgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUoaW5zdGFuY2UsIGZpZWxkKTsKICAgICAgICAgICAgIEhhbmRsZTxBcnJheT4gYXJyYXkgPSBBcnJheTo6TmV3KHNpemUpOwogICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLSAgICAgICAgICAgICAgSGFuZGxlPFZhbHVlPiBpbmRleCA9IE51bWJlcjo6TmV3KGkpOwotICAgICAgICAgICAgICBhcnJheS0+U2V0KGluZGV4LCBUb0pzKGluc3RhbmNlLCByZWZsZWN0aW9uLCBmaWVsZCwgY2hpbGRfdHlwZSwgaikpOworICAgICAgICAgICAgICBhcnJheS0+U2V0KGosIFRvSnMoaW5zdGFuY2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBjaGlsZF90eXBlLCBqKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB2YWx1ZSA9IGFycmF5OwogICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNzQsOCArMjczLDcgQEAKICAgICAgICAgICB9CiAKICAgICAgICAgICBEQkcoIlR5cGU6OlRvSnM6IHNldCBwcm9wZXJ0eVslZF09JXMiLCBpLCBUb0NTdHJpbmcodmFsdWUpKTsKLSAgICAgICAgICBIYW5kbGU8VmFsdWU+IGtleSA9IE51bWJlcjo6TmV3KGkpOwotICAgICAgICAgIHByb3BlcnRpZXMtPlNldChrZXksIHZhbHVlKTsKKyAgICAgICAgICBwcm9wZXJ0aWVzLT5TZXQoaSwgdmFsdWUpOwogICAgICAgICB9CiAKICAgICAgICAgREJHKCJUeXBlOjpUb0pzKE1lc3NhZ2UpIFg6Iik7CkBAIC0zMTcsNyArMzE1LDcgQEAKICAgICAgICAgICBvayA9IHR5cGUtPlRvUHJvdG8ocmVwZWF0ZWQgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKGluc3RhbmNlLCBmaWVsZCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShpbnN0YW5jZSwgZmllbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlPE9iamVjdD46OkNhc3QodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLkFzPE9iamVjdD4oKSk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogewogICAgICAgICAgIERCRygiVHlwZTo6VG9Qcm90byBDUFBUWVBFX1NUUklORyIpOwpAQCAtNDAyLDExICs0MDAsMTEgQEAKICAgICAgIGJvb2wgVG9Qcm90byhNZXNzYWdlKiBpbnN0YW5jZSwgSGFuZGxlPE9iamVjdD4gc3JjKSBjb25zdCB7CiAgICAgICAgIERCRygiVG9Qcm90byhNZXNzYWdlICosIEhhbmRsZTxPYmplY3Q+KSBFOiIpOwogCi0gICAgICAgIEhhbmRsZTxGdW5jdGlvbj4gdG9fYXJyYXkgPSBIYW5kbGU8RnVuY3Rpb24+OjpDYXN0KGhhbmRsZV8tPkdldEludGVybmFsRmllbGQoMykpOwotICAgICAgICBIYW5kbGU8QXJyYXk+IHByb3BlcnRpZXMgPSBIYW5kbGU8QXJyYXk+OjpDYXN0KHRvX2FycmF5LT5DYWxsKHNyYywgMCwgTlVMTCkpOworICAgICAgICBIYW5kbGU8RnVuY3Rpb24+IHRvX2FycmF5ID0gaGFuZGxlXy0+R2V0SW50ZXJuYWxGaWVsZCgzKS5BczxGdW5jdGlvbj4oKTsKKyAgICAgICAgSGFuZGxlPEFycmF5PiBwcm9wZXJ0aWVzID0gdG9fYXJyYXktPkNhbGwoc3JjLCAwLCBOVUxMKS5BczxBcnJheT4oKTsKICAgICAgICAgYm9vbCBvayA9IHRydWU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBvayAmJiAoaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKTsgaSsrKSB7Ci0gICAgICAgICAgSGFuZGxlPFZhbHVlPiB2YWx1ZSA9IHByb3BlcnRpZXMtPkdldChOdW1iZXI6Ok5ldyhpKSk7CisgICAgICAgICAgSGFuZGxlPFZhbHVlPiB2YWx1ZSA9IHByb3BlcnRpZXMtPkdldChpKTsKICAgICAgICAgICBpZiAodmFsdWUtPklzVW5kZWZpbmVkKCkpIGNvbnRpbnVlOwogCiAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKQEAgLTQxNywxMCArNDE1LDEwIEBACiAgICAgICAgICAgICBpZighdmFsdWUtPklzQXJyYXkoKSkgewogICAgICAgICAgICAgICBvayA9IFRvUHJvdG8oaW5zdGFuY2UsIGZpZWxkLCB2YWx1ZSwgY2hpbGRfdHlwZSwgdHJ1ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBIYW5kbGU8QXJyYXk+IGFycmF5ID0gSGFuZGxlPEFycmF5Pjo6Q2FzdCh2YWx1ZSk7CisgICAgICAgICAgICAgIEhhbmRsZTxBcnJheT4gYXJyYXkgPSB2YWx1ZS5BczxBcnJheT4oKTsKICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IGFycmF5LT5MZW5ndGgoKTsKICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IG9rICYmIChqIDwgbGVuZ3RoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgb2sgPSBUb1Byb3RvKGluc3RhbmNlLCBmaWVsZCwgYXJyYXktPkdldChOdW1iZXI6Ok5ldyhqKSksIGNoaWxkX3R5cGUsIHRydWUpOworICAgICAgICAgICAgICAgIG9rID0gVG9Qcm90byhpbnN0YW5jZSwgZmllbGQsIGFycmF5LT5HZXQoaiksIGNoaWxkX3R5cGUsIHRydWUpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ0MSw3ICs0MzksNyBAQAogCiAgICAgICAgIFR5cGUqIHR5cGUgPSBVbndyYXBUaGlzPFR5cGU+KGFyZ3MpOwogICAgICAgICBNZXNzYWdlKiBtZXNzYWdlID0gdHlwZS0+TmV3TWVzc2FnZSgpOwotICAgICAgICBpZiAodHlwZS0+VG9Qcm90byhtZXNzYWdlLCBIYW5kbGU8T2JqZWN0Pjo6Q2FzdChhcmdzWzBdKSkpIHsKKyAgICAgICAgaWYgKHR5cGUtPlRvUHJvdG8obWVzc2FnZSwgYXJnc1swXS5BczxPYmplY3Q+KCkpKSB7CiAgICAgICAgICAgaW50IGxlbmd0aCA9IG1lc3NhZ2UtPkJ5dGVTaXplKCk7CiAgICAgICAgICAgQnVmZmVyKiBidWZmZXIgPSBCdWZmZXI6Ok5ldyhsZW5ndGgpOwogICAgICAgICAgIG1lc3NhZ2UtPlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoKGdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KilidWZmZXItPmRhdGEoKSk7CkBAIC00NzQsOSArNDcyLDggQEAKICAgICAgICAgbmV3IFR5cGUodGhpcywgZGVzY3JpcHRvciwgVHlwZVRlbXBsYXRlLT5HZXRGdW5jdGlvbigpLT5OZXdJbnN0YW5jZSgpKTsKIAogICAgICAgLy8gbWFuYWdlZCBzY2hlbWEtPlt0eXBlXSBsaW5rCi0gICAgICBIYW5kbGU8QXJyYXk+IHR5cGVzID0gSGFuZGxlPEFycmF5Pjo6Q2FzdChoYW5kbGVfLT5HZXRJbnRlcm5hbEZpZWxkKDEpKTsKLSAgICAgIEhhbmRsZTxWYWx1ZT4ga2V5ID0gTnVtYmVyOjpOZXcodHlwZXMtPkxlbmd0aCgpKTsKLSAgICAgIHR5cGVzLT5TZXQoa2V5LCByZXN1bHQtPmhhbmRsZV8pOworICAgICAgSGFuZGxlPEFycmF5PiB0eXBlcyA9IGhhbmRsZV8tPkdldEludGVybmFsRmllbGQoMSkuQXM8QXJyYXk+KCk7CisgICAgICB0eXBlcy0+U2V0KHR5cGVzLT5MZW5ndGgoKSwgcmVzdWx0LT5oYW5kbGVfKTsKICAgICAgIERCRygiU2NoZW1hOjpHZXRUeXBlKGRlc2NyaXB0b3IpIFg6Iik7CiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9jcHAvcmVxdWVzdHMuY3BwIGIvbW9jay1yaWwvc3JjL2NwcC9yZXF1ZXN0cy5jcHAKaW5kZXggM2U5NjdhZi4uMzY2YmEzMCAxMDA2NDQKLS0tIGEvbW9jay1yaWwvc3JjL2NwcC9yZXF1ZXN0cy5jcHAKKysrIGIvbW9jay1yaWwvc3JjL2NwcC9yZXF1ZXN0cy5jcHAKQEAgLTE3LDEwICsxNywxMCBAQAogI2luY2x1ZGUgPG1hcD4KIAogI2luY2x1ZGUgPHY4Lmg+Ci0jaW5jbHVkZSA8dGVsZXBob255L3JpbC5oPgorI2luY2x1ZGUgInJpbC5oIgogCiAKLSNpbmNsdWRlICJyaWwucGIuaCIKKyNpbmNsdWRlICJoYXJkd2FyZS9yaWwvbW9jay1yaWwvc3JjL3Byb3RvL3JpbC5wYi5oIgogCiAjaW5jbHVkZSAibG9nZ2luZy5oIgogI2luY2x1ZGUgImpzX3N1cHBvcnQuaCIKQEAgLTQxNyw4ICs0MTcsOCBAQAogICAgIHJpbFJlcUNvbnZlcnNpb25NYXBbUklMX1JFUVVFU1RfQ09ORkVSRU5DRV0gPSBSZXFXaXRoTm9EYXRhOyAgLy8gMTYKICAgICByaWxSZXFDb252ZXJzaW9uTWFwW1JJTF9SRVFVRVNUX0xBU1RfQ0FMTF9GQUlMX0NBVVNFXSA9IFJlcVdpdGhOb0RhdGE7ICAvLyAxOAogICAgIHJpbFJlcUNvbnZlcnNpb25NYXBbUklMX1JFUVVFU1RfU0lHTkFMX1NUUkVOR1RIXSA9IFJlcVdpdGhOb0RhdGE7IC8vIDE5Ci0gICAgcmlsUmVxQ29udmVyc2lvbk1hcFtSSUxfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVEVdID0gUmVxV2l0aE5vRGF0YTsgLy8gMjAKLSAgICByaWxSZXFDb252ZXJzaW9uTWFwW1JJTF9SRVFVRVNUX0dQUlNfUkVHSVNUUkFUSU9OX1NUQVRFXSA9IFJlcVdpdGhOb0RhdGE7IC8vIDIxCisgICAgcmlsUmVxQ29udmVyc2lvbk1hcFtSSUxfUkVRVUVTVF9WT0lDRV9SRUdJU1RSQVRJT05fU1RBVEVdID0gUmVxV2l0aE5vRGF0YTsgLy8gMjAKKyAgICByaWxSZXFDb252ZXJzaW9uTWFwW1JJTF9SRVFVRVNUX0RBVEFfUkVHSVNUUkFUSU9OX1NUQVRFXSA9IFJlcVdpdGhOb0RhdGE7IC8vIDIxCiAgICAgcmlsUmVxQ29udmVyc2lvbk1hcFtSSUxfUkVRVUVTVF9PUEVSQVRPUl0gPSBSZXFXaXRoTm9EYXRhOyAvLyAyMgogICAgIHJpbFJlcUNvbnZlcnNpb25NYXBbUklMX1JFUVVFU1RfR0VUX0lNRUldID0gUmVxV2l0aE5vRGF0YTsgLy8gMzgKICAgICByaWxSZXFDb252ZXJzaW9uTWFwW1JJTF9SRVFVRVNUX0dFVF9JTUVJU1ZdID0gUmVxV2l0aE5vRGF0YTsgLy8gMzkKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9jcHAvcmVzcG9uc2VzLmNwcCBiL21vY2stcmlsL3NyYy9jcHAvcmVzcG9uc2VzLmNwcAppbmRleCBhZjAwYjg5Li5kMTNmZWNmIDEwMDY0NAotLS0gYS9tb2NrLXJpbC9zcmMvY3BwL3Jlc3BvbnNlcy5jcHAKKysrIGIvbW9jay1yaWwvc3JjL2NwcC9yZXNwb25zZXMuY3BwCkBAIC0xNyw5ICsxNyw5IEBACiAjaW5jbHVkZSA8bWFwPgogCiAjaW5jbHVkZSA8djguaD4KLSNpbmNsdWRlIDx0ZWxlcGhvbnkvcmlsLmg+CisjaW5jbHVkZSAicmlsLmgiCiAKLSNpbmNsdWRlICJyaWwucGIuaCIKKyNpbmNsdWRlICJoYXJkd2FyZS9yaWwvbW9jay1yaWwvc3JjL3Byb3RvL3JpbC5wYi5oIgogCiAjaW5jbHVkZSAibG9nZ2luZy5oIgogI2luY2x1ZGUgIm1vY2tfcmlsLmgiCkBAIC0xMzksMTAgKzEzOSwxMSBAQAogICAgIHJpbF9wcm90bzo6UnNwR2V0U2ltU3RhdHVzICpyc3AgPSBuZXcgcmlsX3Byb3RvOjpSc3BHZXRTaW1TdGF0dXMoKTsKICAgICByc3AtPlBhcnNlRnJvbUFycmF5KGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPmxlbmd0aCgpKTsKICAgICBjb25zdCByaWxfcHJvdG86OlJpbENhcmRTdGF0dXMmIHIgPSByc3AtPmNhcmRfc3RhdHVzKCk7Ci0gICAgUklMX0NhcmRTdGF0dXMgY2FyZFN0YXR1czsKKyAgICBSSUxfQ2FyZFN0YXR1c192NiBjYXJkU3RhdHVzOwogICAgIGNhcmRTdGF0dXMuY2FyZF9zdGF0ZSA9IFJJTF9DYXJkU3RhdGUoci5jYXJkX3N0YXRlKCkpOwogICAgIGNhcmRTdGF0dXMudW5pdmVyc2FsX3Bpbl9zdGF0ZSA9IFJJTF9QaW5TdGF0ZShyLnVuaXZlcnNhbF9waW5fc3RhdGUoKSk7CiAgICAgY2FyZFN0YXR1cy5nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4ID0gci5nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4KCk7CisgICAgY2FyZFN0YXR1cy5pbXNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCA9IHIuaW1zX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgoKTsKICAgICBjYXJkU3RhdHVzLm51bV9hcHBsaWNhdGlvbnMgPSByLm51bV9hcHBsaWNhdGlvbnMoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcmRTdGF0dXMubnVtX2FwcGxpY2F0aW9uczsgaSsrKSB7CiAgICAgICAgY2FyZFN0YXR1cy5hcHBsaWNhdGlvbnNbaV0uYXBwX3R5cGUgPSBSSUxfQXBwVHlwZShyLmFwcGxpY2F0aW9ucyhpKS5hcHBfdHlwZSgpKTsKQEAgLTIzNyw2ICsyMzgsNDcgQEAKICAgICByZXR1cm4gcmlsRXJybm87CiB9CiAKKwordm9pZCB1bm1hcnNoYWxsUmlsU2lnbmFsU3RyZW5ndGgoQnVmZmVyICpidWZmZXIsIFJJTF9TaWduYWxTdHJlbmd0aF92NiAqcFNpZ25hbFN0cmVuZ3RoKSB7CisgICAgLy8gUmV0cmlldmUgcmVzcG9uc2UgZnJvbSByZXNwb25zZSBtZXNzYWdlCisgICAgcmlsX3Byb3RvOjpSc3BTaWduYWxTdHJlbmd0aCAqcnNwID0gbmV3IHJpbF9wcm90bzo6UnNwU2lnbmFsU3RyZW5ndGgoKTsKKyAgICByc3AtPlBhcnNlRnJvbUFycmF5KGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPmxlbmd0aCgpKTsKKyAgICBjb25zdCByaWxfcHJvdG86OlJJTEdXU2lnbmFsU3RyZW5ndGgmIGd3U1QgPSByc3AtPmd3X3NpZ25hbHN0cmVuZ3RoKCk7CisgICAgY29uc3QgcmlsX3Byb3RvOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIGNkbWFTVCA9IHJzcC0+Y2RtYV9zaWduYWxzdHJlbmd0aCgpOworICAgIGNvbnN0IHJpbF9wcm90bzo6UklMRVZET1NpZ25hbFN0cmVuZ3RoJiBldmRvU1QgPSByc3AtPmV2ZG9fc2lnbmFsc3RyZW5ndGgoKTsKKyAgICBjb25zdCByaWxfcHJvdG86OlJJTExURVNpZ25hbFN0cmVuZ3RoJiBsdGVTVCA9IHJzcC0+bHRlX3NpZ25hbHN0cmVuZ3RoKCk7CisKKyAgICAvLyBDb3B5IHRoZSByZXNwb25zZSBtZXNzYWdlIGZyb20gcmVzcG9uc2UgdG8gZm9ybWF0IGRlZmluZWQgaW4gcmlsLmgKKyAgICBSSUxfU2lnbmFsU3RyZW5ndGhfdjYgY3VyU2lnbmFsU3RyZW5ndGg7CisKKyAgICBjdXJTaWduYWxTdHJlbmd0aC5HV19TaWduYWxTdHJlbmd0aC5zaWduYWxTdHJlbmd0aCA9IGd3U1Quc2lnbmFsX3N0cmVuZ3RoKCk7CisgICAgY3VyU2lnbmFsU3RyZW5ndGguR1dfU2lnbmFsU3RyZW5ndGguYml0RXJyb3JSYXRlID0gZ3dTVC5iaXRfZXJyb3JfcmF0ZSgpOworICAgIGN1clNpZ25hbFN0cmVuZ3RoLkNETUFfU2lnbmFsU3RyZW5ndGguZGJtID0gY2RtYVNULmRibSgpOworICAgIGN1clNpZ25hbFN0cmVuZ3RoLkNETUFfU2lnbmFsU3RyZW5ndGguZWNpbyA9IGNkbWFTVC5lY2lvKCk7CisgICAgY3VyU2lnbmFsU3RyZW5ndGguRVZET19TaWduYWxTdHJlbmd0aC5kYm0gPSBldmRvU1QuZGJtKCk7CisgICAgY3VyU2lnbmFsU3RyZW5ndGguRVZET19TaWduYWxTdHJlbmd0aC5lY2lvID0gZXZkb1NULmVjaW8oKTsKKyAgICBjdXJTaWduYWxTdHJlbmd0aC5FVkRPX1NpZ25hbFN0cmVuZ3RoLnNpZ25hbE5vaXNlUmF0aW8gPSBldmRvU1Quc2lnbmFsX25vaXNlX3JhdGlvKCk7CisgICAgY3VyU2lnbmFsU3RyZW5ndGguTFRFX1NpZ25hbFN0cmVuZ3RoLnNpZ25hbFN0cmVuZ3RoID0gbHRlU1Quc2lnbmFsX3N0cmVuZ3RoKCk7CisgICAgY3VyU2lnbmFsU3RyZW5ndGguTFRFX1NpZ25hbFN0cmVuZ3RoLnJzcnAgPSBsdGVTVC5yc3JwKCk7CisgICAgY3VyU2lnbmFsU3RyZW5ndGguTFRFX1NpZ25hbFN0cmVuZ3RoLnJzcnEgPSBsdGVTVC5yc3JxKCk7CisgICAgY3VyU2lnbmFsU3RyZW5ndGguTFRFX1NpZ25hbFN0cmVuZ3RoLnJzc25yID0gbHRlU1QucnNzbnIoKTsKKyAgICBjdXJTaWduYWxTdHJlbmd0aC5MVEVfU2lnbmFsU3RyZW5ndGguY3FpID0gbHRlU1QuY3FpKCk7CisKKyAgICBEQkcoInByaW50IHJlc3BvbnNlIHNpZ25hbCBzdHJlbmd0aDogIik7CisgICAgREJHKCJndyBzaWduYWxzdHJlbmd0aCA9ICVkIiwgY3VyU2lnbmFsU3RyZW5ndGguR1dfU2lnbmFsU3RyZW5ndGguc2lnbmFsU3RyZW5ndGgpOworICAgIERCRygiZ3dfYml0RXJyb3JSYXRlID0gJWQiLCBjdXJTaWduYWxTdHJlbmd0aC5HV19TaWduYWxTdHJlbmd0aC5iaXRFcnJvclJhdGUpOworICAgIERCRygiY2RtYV9kYm0gPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkNETUFfU2lnbmFsU3RyZW5ndGguZGJtKTsKKyAgICBEQkcoImNkbWFfZWNpbyA9ICVkIiwgY3VyU2lnbmFsU3RyZW5ndGguQ0RNQV9TaWduYWxTdHJlbmd0aC5lY2lvKTsKKyAgICBEQkcoImV2ZG9fZGJtID0gJWQiLCBjdXJTaWduYWxTdHJlbmd0aC5FVkRPX1NpZ25hbFN0cmVuZ3RoLmRibSk7CisgICAgREJHKCJldmRvX2VjaW8gPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkVWRE9fU2lnbmFsU3RyZW5ndGguZWNpbyk7CisgICAgREJHKCJldmRvX3NpZ25hbE5vaXNlUmF0aW8gPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkVWRE9fU2lnbmFsU3RyZW5ndGguc2lnbmFsTm9pc2VSYXRpbyk7CisgICAgREJHKCJsdGVfc2lnbmFsU3RyZW5ndGggPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkxURV9TaWduYWxTdHJlbmd0aC5zaWduYWxTdHJlbmd0aCk7CisgICAgREJHKCJsdGVfcnNycCA9ICVkIiwgY3VyU2lnbmFsU3RyZW5ndGguTFRFX1NpZ25hbFN0cmVuZ3RoLnJzcnApOworICAgIERCRygibHRlX3JzcnEgPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkxURV9TaWduYWxTdHJlbmd0aC5yc3JxKTsKKyAgICBEQkcoImx0ZV9yc3NuciA9ICVkIiwgY3VyU2lnbmFsU3RyZW5ndGguTFRFX1NpZ25hbFN0cmVuZ3RoLnJzc25yKTsKKyAgICBEQkcoImx0ZV9jcWkgPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkxURV9TaWduYWxTdHJlbmd0aC5jcWkpOworfQorCiAvKioKICAqIEhhbmRsZSBSSUxfUkVRVUVTVF9TSUdOQUxfU1RSRU5HVEggcmVzcG9uc2UKICAqLwpAQCAtMjUyLDI2ICsyOTQsMTEgQEAKICAgICBjb25zdCByaWxfcHJvdG86OlJJTEdXU2lnbmFsU3RyZW5ndGgmIGd3U1QgPSByc3AtPmd3X3NpZ25hbHN0cmVuZ3RoKCk7CiAgICAgY29uc3QgcmlsX3Byb3RvOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIGNkbWFTVCA9IHJzcC0+Y2RtYV9zaWduYWxzdHJlbmd0aCgpOwogICAgIGNvbnN0IHJpbF9wcm90bzo6UklMRVZET1NpZ25hbFN0cmVuZ3RoJiBldmRvU1QgPSByc3AtPmV2ZG9fc2lnbmFsc3RyZW5ndGgoKTsKKyAgICBjb25zdCByaWxfcHJvdG86OlJJTExURVNpZ25hbFN0cmVuZ3RoJiBsdGVTVCA9IHJzcC0+bHRlX3NpZ25hbHN0cmVuZ3RoKCk7CiAKICAgICAvLyBDb3B5IHRoZSByZXNwb25zZSBtZXNzYWdlIGZyb20gcmVzcG9uc2UgdG8gZm9ybWF0IGRlZmluZWQgaW4gcmlsLmgKLSAgICBSSUxfU2lnbmFsU3RyZW5ndGggY3VyU2lnbmFsU3RyZW5ndGg7Ci0KLSAgICBjdXJTaWduYWxTdHJlbmd0aC5HV19TaWduYWxTdHJlbmd0aC5zaWduYWxTdHJlbmd0aCA9IGd3U1Quc2lnbmFsX3N0cmVuZ3RoKCk7Ci0gICAgY3VyU2lnbmFsU3RyZW5ndGguR1dfU2lnbmFsU3RyZW5ndGguYml0RXJyb3JSYXRlID0gZ3dTVC5iaXRfZXJyb3JfcmF0ZSgpOwotICAgIGN1clNpZ25hbFN0cmVuZ3RoLkNETUFfU2lnbmFsU3RyZW5ndGguZGJtID0gY2RtYVNULmRibSgpOwotICAgIGN1clNpZ25hbFN0cmVuZ3RoLkNETUFfU2lnbmFsU3RyZW5ndGguZWNpbyA9IGNkbWFTVC5lY2lvKCk7Ci0gICAgY3VyU2lnbmFsU3RyZW5ndGguRVZET19TaWduYWxTdHJlbmd0aC5kYm0gPSBldmRvU1QuZGJtKCk7Ci0gICAgY3VyU2lnbmFsU3RyZW5ndGguRVZET19TaWduYWxTdHJlbmd0aC5lY2lvID0gZXZkb1NULmVjaW8oKTsKLSAgICBjdXJTaWduYWxTdHJlbmd0aC5FVkRPX1NpZ25hbFN0cmVuZ3RoLnNpZ25hbE5vaXNlUmF0aW8gPSBldmRvU1Quc2lnbmFsX25vaXNlX3JhdGlvKCk7Ci0KLSAgICBEQkcoInByaW50IHJlc3BvbnNlIHNpZ25hbCBzdHJlbmd0aDogIik7Ci0gICAgREJHKCJndyBzaWduYWxzdHJlbmd0aCA9ICVkIiwgY3VyU2lnbmFsU3RyZW5ndGguR1dfU2lnbmFsU3RyZW5ndGguc2lnbmFsU3RyZW5ndGgpOwotICAgIERCRygiZ3dfc2lnbmFsc3RyZW5ndGggPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkdXX1NpZ25hbFN0cmVuZ3RoLmJpdEVycm9yUmF0ZSk7Ci0gICAgREJHKCJjZG1hX3NpZ25hbHN0cmVuZ3RoID0gJWQiLCBjdXJTaWduYWxTdHJlbmd0aC5DRE1BX1NpZ25hbFN0cmVuZ3RoLmRibSk7Ci0gICAgREJHKCJjZG1hX3NpZ25hbHN0cmVuZ3RoID0gJWQiLCBjdXJTaWduYWxTdHJlbmd0aC5DRE1BX1NpZ25hbFN0cmVuZ3RoLmVjaW8pOwotICAgIERCRygiZXZkb19zaWduYWxzdHJlbmd0aCA9ICVkIiwgY3VyU2lnbmFsU3RyZW5ndGguRVZET19TaWduYWxTdHJlbmd0aC5kYm0pOwotICAgIERCRygiZXZkb19zaWduYWxzdHJlbmd0aCA9ICVkIiwgY3VyU2lnbmFsU3RyZW5ndGguRVZET19TaWduYWxTdHJlbmd0aC5lY2lvKTsKLSAgICBEQkcoImV2ZG9fc2lnbmFsc3RyZW5ndGggPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkVWRE9fU2lnbmFsU3RyZW5ndGguc2lnbmFsTm9pc2VSYXRpbyk7CisgICAgUklMX1NpZ25hbFN0cmVuZ3RoX3Y2IGN1clNpZ25hbFN0cmVuZ3RoOworICAgIHVubWFyc2hhbGxSaWxTaWduYWxTdHJlbmd0aChidWZmZXIsICZjdXJTaWduYWxTdHJlbmd0aCk7CiAKICAgICAvLyBDb21wbGV0ZSB0aGUgcmVxdWVzdAogICAgIHNfcmlsZW52LT5PblJlcXVlc3RDb21wbGV0ZSh0b2tlbiwgcmlsRXJybm8sICZjdXJTaWduYWxTdHJlbmd0aCwgc2l6ZW9mKGN1clNpZ25hbFN0cmVuZ3RoKSk7CkBAIC0zMjgsMjQgKzM1NSw4IEBACiAgICAgY29uc3QgcmlsX3Byb3RvOjpSSUxFVkRPU2lnbmFsU3RyZW5ndGgmIGV2ZG9TVCA9IHJzcC0+ZXZkb19zaWduYWxzdHJlbmd0aCgpOwogCiAgICAgLy8gQ29weSB0aGUgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHJlc3BvbnNlIHRvIGZvcm1hdCBkZWZpbmVkIGluIHJpbC5oCi0gICAgUklMX1NpZ25hbFN0cmVuZ3RoIGN1clNpZ25hbFN0cmVuZ3RoOwotCi0gICAgY3VyU2lnbmFsU3RyZW5ndGguR1dfU2lnbmFsU3RyZW5ndGguc2lnbmFsU3RyZW5ndGggPSBnd1NULnNpZ25hbF9zdHJlbmd0aCgpOwotICAgIGN1clNpZ25hbFN0cmVuZ3RoLkdXX1NpZ25hbFN0cmVuZ3RoLmJpdEVycm9yUmF0ZSA9IGd3U1QuYml0X2Vycm9yX3JhdGUoKTsKLSAgICBjdXJTaWduYWxTdHJlbmd0aC5DRE1BX1NpZ25hbFN0cmVuZ3RoLmRibSA9IGNkbWFTVC5kYm0oKTsKLSAgICBjdXJTaWduYWxTdHJlbmd0aC5DRE1BX1NpZ25hbFN0cmVuZ3RoLmVjaW8gPSBjZG1hU1QuZWNpbygpOwotICAgIGN1clNpZ25hbFN0cmVuZ3RoLkVWRE9fU2lnbmFsU3RyZW5ndGguZGJtID0gZXZkb1NULmRibSgpOwotICAgIGN1clNpZ25hbFN0cmVuZ3RoLkVWRE9fU2lnbmFsU3RyZW5ndGguZWNpbyA9IGV2ZG9TVC5lY2lvKCk7Ci0gICAgY3VyU2lnbmFsU3RyZW5ndGguRVZET19TaWduYWxTdHJlbmd0aC5zaWduYWxOb2lzZVJhdGlvID0gZXZkb1NULnNpZ25hbF9ub2lzZV9yYXRpbygpOwotCi0gICAgREJHKCJwcmludCByZXNwb25zZSBzaWduYWwgc3RyZW5ndGg6ICIpOwotICAgIERCRygiZ3cgc2lnbmFsc3RyZW5ndGggPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkdXX1NpZ25hbFN0cmVuZ3RoLnNpZ25hbFN0cmVuZ3RoKTsKLSAgICBEQkcoImd3X3NpZ25hbHN0cmVuZ3RoID0gJWQiLCBjdXJTaWduYWxTdHJlbmd0aC5HV19TaWduYWxTdHJlbmd0aC5iaXRFcnJvclJhdGUpOwotICAgIERCRygiY2RtYV9zaWduYWxzdHJlbmd0aCA9ICVkIiwgY3VyU2lnbmFsU3RyZW5ndGguQ0RNQV9TaWduYWxTdHJlbmd0aC5kYm0pOwotICAgIERCRygiY2RtYV9zaWduYWxzdHJlbmd0aCA9ICVkIiwgY3VyU2lnbmFsU3RyZW5ndGguQ0RNQV9TaWduYWxTdHJlbmd0aC5lY2lvKTsKLSAgICBEQkcoImV2ZG9fc2lnbmFsc3RyZW5ndGggPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkVWRE9fU2lnbmFsU3RyZW5ndGguZGJtKTsKLSAgICBEQkcoImV2ZG9fc2lnbmFsc3RyZW5ndGggPSAlZCIsIGN1clNpZ25hbFN0cmVuZ3RoLkVWRE9fU2lnbmFsU3RyZW5ndGguZWNpbyk7Ci0gICAgREJHKCJldmRvX3NpZ25hbHN0cmVuZ3RoID0gJWQiLCBjdXJTaWduYWxTdHJlbmd0aC5FVkRPX1NpZ25hbFN0cmVuZ3RoLnNpZ25hbE5vaXNlUmF0aW8pOworICAgIFJJTF9TaWduYWxTdHJlbmd0aF92NiBjdXJTaWduYWxTdHJlbmd0aDsKKyAgICB1bm1hcnNoYWxsUmlsU2lnbmFsU3RyZW5ndGgoYnVmZmVyLCAmY3VyU2lnbmFsU3RyZW5ndGgpOwogCiAgICAgc19yaWxlbnYtPk9uVW5zb2xpY2l0ZWRSZXNwb25zZShjbWQsICZjdXJTaWduYWxTdHJlbmd0aCwgc2l6ZW9mKGN1clNpZ25hbFN0cmVuZ3RoKSk7CiAgICAgREJHKCJVbnNvbFJzcFNpZ25hbFN0cmVuZ3RoIFgiKTsKQEAgLTUwNCw4ICs1MTUsOCBAQAogICAgIHJpbFJzcENvbnZlcnNpb25NYXBbUklMX1JFUVVFU1RfQ09ORkVSRU5DRV0gPSBSc3BXaXRoTm9EYXRhOyAgLy8gMTYKICAgICByaWxSc3BDb252ZXJzaW9uTWFwW1JJTF9SRVFVRVNUX0xBU1RfQ0FMTF9GQUlMX0NBVVNFXSA9IFJzcEludGVnZXJzOyAgLy8gMTgKICAgICByaWxSc3BDb252ZXJzaW9uTWFwW1JJTF9SRVFVRVNUX1NJR05BTF9TVFJFTkdUSF0gPSBSc3BTaWduYWxTdHJlbmd0aDsgLy8gMTkKLSAgICByaWxSc3BDb252ZXJzaW9uTWFwW1JJTF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFURV0gPSBSc3BTdHJpbmdzOyAvLyAyMAotICAgIHJpbFJzcENvbnZlcnNpb25NYXBbUklMX1JFUVVFU1RfR1BSU19SRUdJU1RSQVRJT05fU1RBVEVdID0gUnNwU3RyaW5nczsgLy8gMjEKKyAgICByaWxSc3BDb252ZXJzaW9uTWFwW1JJTF9SRVFVRVNUX1ZPSUNFX1JFR0lTVFJBVElPTl9TVEFURV0gPSBSc3BTdHJpbmdzOyAvLyAyMAorICAgIHJpbFJzcENvbnZlcnNpb25NYXBbUklMX1JFUVVFU1RfREFUQV9SRUdJU1RSQVRJT05fU1RBVEVdID0gUnNwU3RyaW5nczsgLy8gMjEKICAgICByaWxSc3BDb252ZXJzaW9uTWFwW1JJTF9SRVFVRVNUX09QRVJBVE9SXSA9IFJzcE9wZXJhdG9yOyAvLyAyMgogICAgIHJpbFJzcENvbnZlcnNpb25NYXBbUklMX1JFUVVFU1RfR0VUX0lNRUldID0gUnNwU3RyaW5nOyAvLyAzOAogICAgIHJpbFJzcENvbnZlcnNpb25NYXBbUklMX1JFUVVFU1RfR0VUX0lNRUlTVl0gPSBSc3BTdHJpbmc7IC8vIDM5CmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvY3BwL3JpbC5oIGIvbW9jay1yaWwvc3JjL2NwcC9yaWwuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lYjlhMTIyCi0tLSAvZGV2L251bGwKKysrIGIvbW9jay1yaWwvc3JjL2NwcC9yaWwuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9pbmNsdWRlL3RlbGVwaG9ueS9yaWwuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9jcHAvdjhfZXh0ZW5zaW9uLmNjfiBiL21vY2stcmlsL3NyYy9jcHAvdjhfZXh0ZW5zaW9uLmNjfgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzOTdmOS4uMDAwMDAwMAotLS0gYS9tb2NrLXJpbC9zcmMvY3BwL3Y4X2V4dGVuc2lvbi5jY34KKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0KLSNpbmNsdWRlICJ2OF9leHRlbnNpb24uaCIKLQotTG9jYWw8VmFsdWU+IHY4OjpPYmplY3Q6OkdldCh1aW50MzJfdCBpbmRleCkgewotICBPTl9CQUlMT1VUKCJ2ODo6T2JqZWN0OjpHZXQoKSIsIHJldHVybiBMb2NhbDx2ODo6VmFsdWU+KCkpOwotICBFTlRFUl9WODsKLSAgaTo6SGFuZGxlPGk6OkpTT2JqZWN0PiBzZWxmID0gVXRpbHM6Ok9wZW5IYW5kbGUodGhpcyk7Ci0gIEVYQ0VQVElPTl9QUkVBTUJMRSgpOwotICBpOjpIYW5kbGU8aTo6T2JqZWN0PiByZXN1bHQgPSBpOjpHZXRFbGVtZW50KHNlbGYsIGluZGV4KTsKLSAgaGFzX3BlbmRpbmdfZXhjZXB0aW9uID0gcmVzdWx0LmlzX251bGwoKTsKLSAgRVhDRVBUSU9OX0JBSUxPVVRfQ0hFQ0soTG9jYWw8VmFsdWU+KCkpOwotICByZXR1cm4gVXRpbHM6OlRvTG9jYWwocmVzdWx0KTsKLX0KLQotCmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2NwcC9jdHJsLnBiLmNwcCBiL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvY3BwL2N0cmwucGIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzFkYTljLi4wMDAwMDAwCi0tLSBhL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvY3BwL2N0cmwucGIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYwOCArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotCi0jZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCi0jaW5jbHVkZSAiY3RybC5wYi5oIgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCi0KLW5hbWVzcGFjZSByaWxfcHJvdG8gewotCi1uYW1lc3BhY2UgewotCi1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEN0cmxSZXFSYWRpb1N0YXRlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBDdHJsUmVxUmFkaW9TdGF0ZV9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEN0cmxSc3BSYWRpb1N0YXRlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBDdHJsUnNwUmFkaW9TdGF0ZV9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEN0cmxSZXFTZXRNVENhbGxfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIEN0cmxSZXFTZXRNVENhbGxfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBDdHJsSGFuZ3VwQ29ublJlbW90ZV9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgQ3RybEhhbmd1cENvbm5SZW1vdGVfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ3RybFJlcUFkZERpYWxpbmdDYWxsX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBDdHJsUmVxQWRkRGlhbGluZ0NhbGxfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogQ3RybENtZF9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBDdHJsU3RhdHVzX2Rlc2NyaXB0b3JfID0gTlVMTDsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLQotdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2N0cmxfMmVwcm90bygpIHsKLSAgcHJvdG9idWZfQWRkRGVzY19jdHJsXzJlcHJvdG8oKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvciogZmlsZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+RmluZEZpbGVCeU5hbWUoCi0gICAgICAiY3RybC5wcm90byIpOwotICBHT09HTEVfQ0hFQ0soZmlsZSAhPSBOVUxMKTsKLSAgQ3RybFJlcVJhZGlvU3RhdGVfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgQ3RybFJlcVJhZGlvU3RhdGVfb2Zmc2V0c19bMV0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDdHJsUmVxUmFkaW9TdGF0ZSwgc3RhdGVfKSwKLSAgfTsKLSAgQ3RybFJlcVJhZGlvU3RhdGVfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIEN0cmxSZXFSYWRpb1N0YXRlX2Rlc2NyaXB0b3JfLAotICAgICAgQ3RybFJlcVJhZGlvU3RhdGU6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgQ3RybFJlcVJhZGlvU3RhdGVfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEN0cmxSZXFSYWRpb1N0YXRlLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ3RybFJlcVJhZGlvU3RhdGUsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihDdHJsUmVxUmFkaW9TdGF0ZSkpOwotICBDdHJsUnNwUmFkaW9TdGF0ZV9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxKTsKLSAgc3RhdGljIGNvbnN0IGludCBDdHJsUnNwUmFkaW9TdGF0ZV9vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEN0cmxSc3BSYWRpb1N0YXRlLCBzdGF0ZV8pLAotICB9OwotICBDdHJsUnNwUmFkaW9TdGF0ZV9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgQ3RybFJzcFJhZGlvU3RhdGVfZGVzY3JpcHRvcl8sCi0gICAgICBDdHJsUnNwUmFkaW9TdGF0ZTo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBDdHJsUnNwUmFkaW9TdGF0ZV9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ3RybFJzcFJhZGlvU3RhdGUsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDdHJsUnNwUmFkaW9TdGF0ZSwgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKEN0cmxSc3BSYWRpb1N0YXRlKSk7Ci0gIEN0cmxSZXFTZXRNVENhbGxfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMik7Ci0gIHN0YXRpYyBjb25zdCBpbnQgQ3RybFJlcVNldE1UQ2FsbF9vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEN0cmxSZXFTZXRNVENhbGwsIHBob25lX251bWJlcl8pLAotICB9OwotICBDdHJsUmVxU2V0TVRDYWxsX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBDdHJsUmVxU2V0TVRDYWxsX2Rlc2NyaXB0b3JfLAotICAgICAgQ3RybFJlcVNldE1UQ2FsbDo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBDdHJsUmVxU2V0TVRDYWxsX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDdHJsUmVxU2V0TVRDYWxsLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ3RybFJlcVNldE1UQ2FsbCwgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKEN0cmxSZXFTZXRNVENhbGwpKTsKLSAgQ3RybEhhbmd1cENvbm5SZW1vdGVfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMyk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgQ3RybEhhbmd1cENvbm5SZW1vdGVfb2Zmc2V0c19bMl0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDdHJsSGFuZ3VwQ29ublJlbW90ZSwgY29ubmVjdGlvbl9pZF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ3RybEhhbmd1cENvbm5SZW1vdGUsIGNhbGxfZmFpbF9jYXVzZV8pLAotICB9OwotICBDdHJsSGFuZ3VwQ29ublJlbW90ZV9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgQ3RybEhhbmd1cENvbm5SZW1vdGVfZGVzY3JpcHRvcl8sCi0gICAgICBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBDdHJsSGFuZ3VwQ29ublJlbW90ZV9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ3RybEhhbmd1cENvbm5SZW1vdGUsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDdHJsSGFuZ3VwQ29ublJlbW90ZSwgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKEN0cmxIYW5ndXBDb25uUmVtb3RlKSk7Ci0gIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWdfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoNCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZ19vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcsIGZsYWdfKSwKLSAgfTsKLSAgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZ19yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZ19kZXNjcmlwdG9yXywKLSAgICAgIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZ19vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZywgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKSk7Ci0gIEN0cmxSZXFBZGREaWFsaW5nQ2FsbF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg1KTsKLSAgc3RhdGljIGNvbnN0IGludCBDdHJsUmVxQWRkRGlhbGluZ0NhbGxfb2Zmc2V0c19bMV0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDdHJsUmVxQWRkRGlhbGluZ0NhbGwsIHBob25lX251bWJlcl8pLAotICB9OwotICBDdHJsUmVxQWRkRGlhbGluZ0NhbGxfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIEN0cmxSZXFBZGREaWFsaW5nQ2FsbF9kZXNjcmlwdG9yXywKLSAgICAgIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBDdHJsUmVxQWRkRGlhbGluZ0NhbGxfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEN0cmxSZXFBZGREaWFsaW5nQ2FsbCwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEN0cmxSZXFBZGREaWFsaW5nQ2FsbCwgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKEN0cmxSZXFBZGREaWFsaW5nQ2FsbCkpOwotICBDdHJsQ21kX2Rlc2NyaXB0b3JfID0gZmlsZS0+ZW51bV90eXBlKDApOwotICBDdHJsU3RhdHVzX2Rlc2NyaXB0b3JfID0gZmlsZS0+ZW51bV90eXBlKDEpOwotfQotCi1uYW1lc3BhY2UgewotCi1HT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzX29uY2VfKTsKLWlubGluZSB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8sCi0gICAgICAgICAgICAgICAgICZwcm90b2J1Zl9Bc3NpZ25EZXNjX2N0cmxfMmVwcm90byk7Ci19Ci0KLXZvaWQgcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyhjb25zdCA6OnN0ZDo6c3RyaW5nJikgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgQ3RybFJlcVJhZGlvU3RhdGVfZGVzY3JpcHRvcl8sICZDdHJsUmVxUmFkaW9TdGF0ZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgQ3RybFJzcFJhZGlvU3RhdGVfZGVzY3JpcHRvcl8sICZDdHJsUnNwUmFkaW9TdGF0ZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgQ3RybFJlcVNldE1UQ2FsbF9kZXNjcmlwdG9yXywgJkN0cmxSZXFTZXRNVENhbGw6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIEN0cmxIYW5ndXBDb25uUmVtb3RlX2Rlc2NyaXB0b3JfLCAmQ3RybEhhbmd1cENvbm5SZW1vdGU6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWdfZGVzY3JpcHRvcl8sICZDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBDdHJsUmVxQWRkRGlhbGluZ0NhbGxfZGVzY3JpcHRvcl8sICZDdHJsUmVxQWRkRGlhbGluZ0NhbGw6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9jdHJsXzJlcHJvdG8oKSB7Ci0gIGRlbGV0ZSBDdHJsUmVxUmFkaW9TdGF0ZTo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBDdHJsUmVxUmFkaW9TdGF0ZV9yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIEN0cmxSc3BSYWRpb1N0YXRlOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIEN0cmxSc3BSYWRpb1N0YXRlX3JlZmxlY3Rpb25fOwotICBkZWxldGUgQ3RybFJlcVNldE1UQ2FsbDo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBDdHJsUmVxU2V0TVRDYWxsX3JlZmxlY3Rpb25fOwotICBkZWxldGUgQ3RybEhhbmd1cENvbm5SZW1vdGU6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgQ3RybEhhbmd1cENvbm5SZW1vdGVfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWdfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBDdHJsUmVxQWRkRGlhbGluZ0NhbGw6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgQ3RybFJlcUFkZERpYWxpbmdDYWxsX3JlZmxlY3Rpb25fOwotfQotCi12b2lkIHByb3RvYnVmX0FkZERlc2NfY3RybF8yZXByb3RvKCkgewotICBzdGF0aWMgYm9vbCBhbHJlYWR5X2hlcmUgPSBmYWxzZTsKLSAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuOwotICBhbHJlYWR5X2hlcmUgPSB0cnVlOwotICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047Ci0KLSAgOjpyaWxfcHJvdG86OnByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6SW50ZXJuYWxBZGRHZW5lcmF0ZWRGaWxlKAotICAgICJcblxuY3RybC5wcm90b1wwMjJcdHJpbF9wcm90b1wwMzJcdHJpbC5wcm90b1wiOVxuXDAyMUN0IgotICAgICJybFJlcVJhZGlvU3RhdGVcMDIyJFxuXDAwNXN0YXRlXDAzMFwwMDEgXDAwMihcMDE2MlwwMjUucmlsX3BybyIKLSAgICAidG8uUmFkaW9TdGF0ZVwiOVxuXDAyMUN0cmxSc3BSYWRpb1N0YXRlXDAyMiRcblwwMDVzdCIKLSAgICAiYXRlXDAzMFwwMDEgXDAwMihcMDE2MlwwMjUucmlsX3Byb3RvLlJhZGlvU3RhdGVcIihcblwwMjBDdHJsIgotICAgICJSZXFTZXRNVENhbGxcMDIyXDAyNFxuXDAxNHBob25lX251bWJlclwwMzBcMDAxIFwwMDIoXHRcIkZcblwwMjRDdCIKLSAgICAicmxIYW5ndXBDb25uUmVtb3RlXDAyMlwwMjVcblxyY29ubmVjdGlvbl9pZFwwMzBcMDAxIFwwMDIoIgotICAgICJcMDA1XDAyMlwwMjdcblwwMTdjYWxsX2ZhaWxfY2F1c2VcMDMwXDAwMiBcMDAyKFwwMDVcIilcblwwMzFDdHJsU2V0Q2FsIgotICAgICJsVHJhbnNpdGlvbkZsYWdcMDIyXDAxNFxuXDAwNGZsYWdcMDMwXDAwMSBcMDAyKFwwMTBcIi1cblwwMjVDdHJsUmVxIgotICAgICJBZGREaWFsaW5nQ2FsbFwwMjJcMDI0XG5cMDE0cGhvbmVfbnVtYmVyXDAzMFwwMDEgXDAwMihcdCpcMjMyXDAwMlxuIgotICAgICJcMDA3Q3RybENtZFwwMjJcMDIxXG5cckNUUkxfQ01EX0VDSE9cMDIwXDAwMFwwMjJcMDM0XG5cMDMwQ1RSTF9DTURfIgotICAgICJHRVRfUkFESU9fU1RBVEVcMDIwXDAwMVwwMjJcMDM0XG5cMDMwQ1RSTF9DTURfU0VUX1JBRElPXyIKLSAgICAiU1RBVEVcMDIwXDAwMlwwMjJcMDMxXG5cMDI0Q1RSTF9DTURfU0VUX01UX0NBTExcMDIwXDM1MVwwMDdcMDIyIFxuXDAzM0NUIgotICAgICJSTF9DTURfSEFOR1VQX0NPTk5fUkVNT1RFXDAyMFwzNTJcMDA3XDAyMiZcbiFDVFJMX0NNRCIKLSAgICAiX1NFVF9DQUxMX1RSQU5TSVRJT05fRkxBR1wwMjBcMzUzXDAwN1wwMjJcMDM0XG5cMDI3Q1RSTF9DTUQiCi0gICAgIl9TRVRfQ0FMTF9BTEVSVFwwMjBcMzU0XDAwN1wwMjJcMDM1XG5cMDMwQ1RSTF9DTURfU0VUX0NBTExfIgotICAgICJBQ1RJVkVcMDIwXDM1NVwwMDdcMDIyXDAzNlxuXDAzMUNUUkxfQ01EX0FERF9ESUFMSU5HX0NBTExcMDIwXDM1NiIKLSAgICAiXDAwNyo1XG5cbkN0cmxTdGF0dXNcMDIyXDAyMlxuXDAxNkNUUkxfU1RBVFVTX09LXDAyMFwwMDBcMDIyXDAyM1xuXDAxN0MiCi0gICAgIlRSTF9TVEFUVVNfRVJSXDAyMFwwMDFCN1xuKGNvbS5hbmRyb2lkLmludGVybmFsIgotICAgICIudGVsZXBob255LnJpbF9wcm90b0JcMDEzUmlsQ3RybENtZHMiLCA3NTMpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZSgKLSAgICAiY3RybC5wcm90byIsICZwcm90b2J1Zl9SZWdpc3RlclR5cGVzKTsKLSAgQ3RybFJlcVJhZGlvU3RhdGU6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEN0cmxSZXFSYWRpb1N0YXRlKCk7Ci0gIEN0cmxSc3BSYWRpb1N0YXRlOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBDdHJsUnNwUmFkaW9TdGF0ZSgpOwotICBDdHJsUmVxU2V0TVRDYWxsOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBDdHJsUmVxU2V0TVRDYWxsKCk7Ci0gIEN0cmxIYW5ndXBDb25uUmVtb3RlOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBDdHJsSGFuZ3VwQ29ublJlbW90ZSgpOwotICBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKCk7Ci0gIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgQ3RybFJlcUFkZERpYWxpbmdDYWxsKCk7Ci0gIEN0cmxSZXFSYWRpb1N0YXRlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIEN0cmxSc3BSYWRpb1N0YXRlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIEN0cmxSZXFTZXRNVENhbGw6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgQ3RybEhhbmd1cENvbm5SZW1vdGU6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBDdHJsUmVxQWRkRGlhbGluZ0NhbGw6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmcHJvdG9idWZfU2h1dGRvd25GaWxlX2N0cmxfMmVwcm90byk7Ci19Ci0KLS8vIEZvcmNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYmUgY2FsbGVkIGF0IHN0YXRpYyBpbml0aWFsaXphdGlvbiB0aW1lLgotc3RydWN0IFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9jdHJsXzJlcHJvdG8gewotICBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfY3RybF8yZXByb3RvKCkgewotICAgIHByb3RvYnVmX0FkZERlc2NfY3RybF8yZXByb3RvKCk7Ci0gIH0KLX0gc3RhdGljX2Rlc2NyaXB0b3JfaW5pdGlhbGl6ZXJfY3RybF8yZXByb3RvXzsKLQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogQ3RybENtZF9kZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEN0cmxDbWRfZGVzY3JpcHRvcl87Ci19Ci1ib29sIEN0cmxDbWRfSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgc3dpdGNoKHZhbHVlKSB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAxMDAxOgotICAgIGNhc2UgMTAwMjoKLSAgICBjYXNlIDEwMDM6Ci0gICAgY2FzZSAxMDA0OgotICAgIGNhc2UgMTAwNToKLSAgICBjYXNlIDEwMDY6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEN0cmxTdGF0dXNfZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBDdHJsU3RhdHVzX2Rlc2NyaXB0b3JfOwotfQotYm9vbCBDdHJsU3RhdHVzX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBpbnQgQ3RybFJlcVJhZGlvU3RhdGU6OmtTdGF0ZUZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotQ3RybFJlcVJhZGlvU3RhdGU6OkN0cmxSZXFSYWRpb1N0YXRlKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLX0KLQotdm9pZCBDdHJsUmVxUmFkaW9TdGF0ZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1DdHJsUmVxUmFkaW9TdGF0ZTo6Q3RybFJlcVJhZGlvU3RhdGUoY29uc3QgQ3RybFJlcVJhZGlvU3RhdGUmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBDdHJsUmVxUmFkaW9TdGF0ZTo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIHN0YXRlXyA9IDA7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLUN0cmxSZXFSYWRpb1N0YXRlOjp+Q3RybFJlcVJhZGlvU3RhdGUoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBDdHJsUmVxUmFkaW9TdGF0ZTo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIEN0cmxSZXFSYWRpb1N0YXRlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ3RybFJlcVJhZGlvU3RhdGU6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gQ3RybFJlcVJhZGlvU3RhdGVfZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IEN0cmxSZXFSYWRpb1N0YXRlJiBDdHJsUmVxUmFkaW9TdGF0ZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfY3RybF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1DdHJsUmVxUmFkaW9TdGF0ZSogQ3RybFJlcVJhZGlvU3RhdGU6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotQ3RybFJlcVJhZGlvU3RhdGUqIEN0cmxSZXFSYWRpb1N0YXRlOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgQ3RybFJlcVJhZGlvU3RhdGU7Ci19Ci0KLXZvaWQgQ3RybFJlcVJhZGlvU3RhdGU6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIHN0YXRlXyA9IDA7Ci0gIH0KLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotfQotCi1ib29sIEN0cmxSZXFSYWRpb1N0YXRlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCAucmlsX3Byb3RvLlJhZGlvU3RhdGUgc3RhdGUgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7Ci0gICAgICAgICAgaWYgKHJpbF9wcm90bzo6UmFkaW9TdGF0ZV9Jc1ZhbGlkKHZhbHVlKSkgewotICAgICAgICAgICAgc2V0X3N0YXRlKHN0YXRpY19jYXN0PCByaWxfcHJvdG86OlJhZGlvU3RhdGUgPih2YWx1ZSkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxLCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIEN0cmxSZXFSYWRpb1N0YXRlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCAucmlsX3Byb3RvLlJhZGlvU3RhdGUgc3RhdGUgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAotICAgICAgMSwgdGhpcy0+c3RhdGUoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEN0cmxSZXFSYWRpb1N0YXRlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyByZXF1aXJlZCAucmlsX3Byb3RvLlJhZGlvU3RhdGUgc3RhdGUgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKLSAgICAgIDEsIHRoaXMtPnN0YXRlKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IEN0cmxSZXFSYWRpb1N0YXRlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyByZXF1aXJlZCAucmlsX3Byb3RvLlJhZGlvU3RhdGUgc3RhdGUgPSAxOwotICAgIGlmIChoYXNfc3RhdGUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPnN0YXRlKCkpOwotICAgIH0KLSAgICAKLSAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBDdHJsUmVxUmFkaW9TdGF0ZTo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBDdHJsUmVxUmFkaW9TdGF0ZSogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEN0cmxSZXFSYWRpb1N0YXRlKj4oCi0gICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIEN0cmxSZXFSYWRpb1N0YXRlOjpNZXJnZUZyb20oY29uc3QgQ3RybFJlcVJhZGlvU3RhdGUmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDApKSB7Ci0gICAgICBzZXRfc3RhdGUoZnJvbS5zdGF0ZSgpKTsKLSAgICB9Ci0gIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBDdHJsUmVxUmFkaW9TdGF0ZTo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBDdHJsUmVxUmFkaW9TdGF0ZTo6Q29weUZyb20oY29uc3QgQ3RybFJlcVJhZGlvU3RhdGUmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIEN0cmxSZXFSYWRpb1N0YXRlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICBpZiAoKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxKSAhPSAweDAwMDAwMDAxKSByZXR1cm4gZmFsc2U7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDdHJsUmVxUmFkaW9TdGF0ZTo6U3dhcChDdHJsUmVxUmFkaW9TdGF0ZSogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAoc3RhdGVfLCBvdGhlci0+c3RhdGVfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBDdHJsUmVxUmFkaW9TdGF0ZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gQ3RybFJlcVJhZGlvU3RhdGVfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBDdHJsUmVxUmFkaW9TdGF0ZV9yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IEN0cmxSc3BSYWRpb1N0YXRlOjprU3RhdGVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLUN0cmxSc3BSYWRpb1N0YXRlOjpDdHJsUnNwUmFkaW9TdGF0ZSgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgQ3RybFJzcFJhZGlvU3RhdGU6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotQ3RybFJzcFJhZGlvU3RhdGU6OkN0cmxSc3BSYWRpb1N0YXRlKGNvbnN0IEN0cmxSc3BSYWRpb1N0YXRlJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgQ3RybFJzcFJhZGlvU3RhdGU6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBzdGF0ZV8gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1DdHJsUnNwUmFkaW9TdGF0ZTo6fkN0cmxSc3BSYWRpb1N0YXRlKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgQ3RybFJzcFJhZGlvU3RhdGU6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBDdHJsUnNwUmFkaW9TdGF0ZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEN0cmxSc3BSYWRpb1N0YXRlOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEN0cmxSc3BSYWRpb1N0YXRlX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBDdHJsUnNwUmFkaW9TdGF0ZSYgQ3RybFJzcFJhZGlvU3RhdGU6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2N0cmxfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotQ3RybFJzcFJhZGlvU3RhdGUqIEN0cmxSc3BSYWRpb1N0YXRlOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUN0cmxSc3BSYWRpb1N0YXRlKiBDdHJsUnNwUmFkaW9TdGF0ZTo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IEN0cmxSc3BSYWRpb1N0YXRlOwotfQotCi12b2lkIEN0cmxSc3BSYWRpb1N0YXRlOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBzdGF0ZV8gPSAwOwotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBDdHJsUnNwUmFkaW9TdGF0ZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gcmVxdWlyZWQgLnJpbF9wcm90by5SYWRpb1N0YXRlIHN0YXRlID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOwotICAgICAgICAgIGlmIChyaWxfcHJvdG86OlJhZGlvU3RhdGVfSXNWYWxpZCh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHNldF9zdGF0ZShzdGF0aWNfY2FzdDwgcmlsX3Byb3RvOjpSYWRpb1N0YXRlID4odmFsdWUpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMSwgdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBDdHJsUnNwUmFkaW9TdGF0ZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgLnJpbF9wcm90by5SYWRpb1N0YXRlIHN0YXRlID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKLSAgICAgIDEsIHRoaXMtPnN0YXRlKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBDdHJsUnNwUmFkaW9TdGF0ZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgLnJpbF9wcm90by5SYWRpb1N0YXRlIHN0YXRlID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCi0gICAgICAxLCB0aGlzLT5zdGF0ZSgpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBDdHJsUnNwUmFkaW9TdGF0ZTo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gcmVxdWlyZWQgLnJpbF9wcm90by5SYWRpb1N0YXRlIHN0YXRlID0gMTsKLSAgICBpZiAoaGFzX3N0YXRlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5zdGF0ZSgpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgQ3RybFJzcFJhZGlvU3RhdGU6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgQ3RybFJzcFJhZGlvU3RhdGUqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBDdHJsUnNwUmFkaW9TdGF0ZSo+KAotICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBDdHJsUnNwUmFkaW9TdGF0ZTo6TWVyZ2VGcm9tKGNvbnN0IEN0cmxSc3BSYWRpb1N0YXRlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5faGFzX2JpdCgwKSkgewotICAgICAgc2V0X3N0YXRlKGZyb20uc3RhdGUoKSk7Ci0gICAgfQotICB9Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci19Ci0KLXZvaWQgQ3RybFJzcFJhZGlvU3RhdGU6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgQ3RybFJzcFJhZGlvU3RhdGU6OkNvcHlGcm9tKGNvbnN0IEN0cmxSc3BSYWRpb1N0YXRlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBDdHJsUnNwUmFkaW9TdGF0ZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgaWYgKChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMSkgIT0gMHgwMDAwMDAwMSkgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ3RybFJzcFJhZGlvU3RhdGU6OlN3YXAoQ3RybFJzcFJhZGlvU3RhdGUqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKHN0YXRlXywgb3RoZXItPnN0YXRlXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgQ3RybFJzcFJhZGlvU3RhdGU6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEN0cmxSc3BSYWRpb1N0YXRlX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gQ3RybFJzcFJhZGlvU3RhdGVfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWNvbnN0IDo6c3RkOjpzdHJpbmcgQ3RybFJlcVNldE1UQ2FsbDo6X2RlZmF1bHRfcGhvbmVfbnVtYmVyXzsKLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBDdHJsUmVxU2V0TVRDYWxsOjprUGhvbmVOdW1iZXJGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLUN0cmxSZXFTZXRNVENhbGw6OkN0cmxSZXFTZXRNVENhbGwoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIEN0cmxSZXFTZXRNVENhbGw6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotQ3RybFJlcVNldE1UQ2FsbDo6Q3RybFJlcVNldE1UQ2FsbChjb25zdCBDdHJsUmVxU2V0TVRDYWxsJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgQ3RybFJlcVNldE1UQ2FsbDo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIHBob25lX251bWJlcl8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJl9kZWZhdWx0X3Bob25lX251bWJlcl8pOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1DdHJsUmVxU2V0TVRDYWxsOjp+Q3RybFJlcVNldE1UQ2FsbCgpIHsKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIEN0cmxSZXFTZXRNVENhbGw6OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChwaG9uZV9udW1iZXJfICE9ICZfZGVmYXVsdF9waG9uZV9udW1iZXJfKSB7Ci0gICAgZGVsZXRlIHBob25lX251bWJlcl87Ci0gIH0KLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIEN0cmxSZXFTZXRNVENhbGw6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBDdHJsUmVxU2V0TVRDYWxsOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEN0cmxSZXFTZXRNVENhbGxfZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IEN0cmxSZXFTZXRNVENhbGwmIEN0cmxSZXFTZXRNVENhbGw6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2N0cmxfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotQ3RybFJlcVNldE1UQ2FsbCogQ3RybFJlcVNldE1UQ2FsbDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1DdHJsUmVxU2V0TVRDYWxsKiBDdHJsUmVxU2V0TVRDYWxsOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgQ3RybFJlcVNldE1UQ2FsbDsKLX0KLQotdm9pZCBDdHJsUmVxU2V0TVRDYWxsOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICAgIGlmIChwaG9uZV9udW1iZXJfICE9ICZfZGVmYXVsdF9waG9uZV9udW1iZXJfKSB7Ci0gICAgICAgIHBob25lX251bWJlcl8tPmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBDdHJsUmVxU2V0TVRDYWxsOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCBzdHJpbmcgcGhvbmVfbnVtYmVyID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3Bob25lX251bWJlcigpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgICAgICAgIHRoaXMtPnBob25lX251bWJlcigpLmRhdGEoKSwgdGhpcy0+cGhvbmVfbnVtYmVyKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgQ3RybFJlcVNldE1UQ2FsbDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgc3RyaW5nIHBob25lX251bWJlciA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgICB0aGlzLT5waG9uZV9udW1iZXIoKS5kYXRhKCksIHRoaXMtPnBob25lX251bWJlcigpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCi0gICAgICAxLCB0aGlzLT5waG9uZV9udW1iZXIoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEN0cmxSZXFTZXRNVENhbGw6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIHJlcXVpcmVkIHN0cmluZyBwaG9uZV9udW1iZXIgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+cGhvbmVfbnVtYmVyKCkuZGF0YSgpLCB0aGlzLT5waG9uZV9udW1iZXIoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDEsIHRoaXMtPnBob25lX251bWJlcigpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBDdHJsUmVxU2V0TVRDYWxsOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyByZXF1aXJlZCBzdHJpbmcgcGhvbmVfbnVtYmVyID0gMTsKLSAgICBpZiAoaGFzX3Bob25lX251bWJlcigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5waG9uZV9udW1iZXIoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIEN0cmxSZXFTZXRNVENhbGw6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgQ3RybFJlcVNldE1UQ2FsbCogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEN0cmxSZXFTZXRNVENhbGwqPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgQ3RybFJlcVNldE1UQ2FsbDo6TWVyZ2VGcm9tKGNvbnN0IEN0cmxSZXFTZXRNVENhbGwmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDApKSB7Ci0gICAgICBzZXRfcGhvbmVfbnVtYmVyKGZyb20ucGhvbmVfbnVtYmVyKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIEN0cmxSZXFTZXRNVENhbGw6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgQ3RybFJlcVNldE1UQ2FsbDo6Q29weUZyb20oY29uc3QgQ3RybFJlcVNldE1UQ2FsbCYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgQ3RybFJlcVNldE1UQ2FsbDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgaWYgKChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMSkgIT0gMHgwMDAwMDAwMSkgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ3RybFJlcVNldE1UQ2FsbDo6U3dhcChDdHJsUmVxU2V0TVRDYWxsKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChwaG9uZV9udW1iZXJfLCBvdGhlci0+cGhvbmVfbnVtYmVyXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgQ3RybFJlcVNldE1UQ2FsbDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gQ3RybFJlcVNldE1UQ2FsbF9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEN0cmxSZXFTZXRNVENhbGxfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6a0Nvbm5lY3Rpb25JZEZpZWxkTnVtYmVyOwotY29uc3QgaW50IEN0cmxIYW5ndXBDb25uUmVtb3RlOjprQ2FsbEZhaWxDYXVzZUZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotQ3RybEhhbmd1cENvbm5SZW1vdGU6OkN0cmxIYW5ndXBDb25uUmVtb3RlKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLX0KLQotdm9pZCBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1DdHJsSGFuZ3VwQ29ublJlbW90ZTo6Q3RybEhhbmd1cENvbm5SZW1vdGUoY29uc3QgQ3RybEhhbmd1cENvbm5SZW1vdGUmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGNvbm5lY3Rpb25faWRfID0gMDsKLSAgY2FsbF9mYWlsX2NhdXNlXyA9IDA7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLUN0cmxIYW5ndXBDb25uUmVtb3RlOjp+Q3RybEhhbmd1cENvbm5SZW1vdGUoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIEN0cmxIYW5ndXBDb25uUmVtb3RlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ3RybEhhbmd1cENvbm5SZW1vdGU6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gQ3RybEhhbmd1cENvbm5SZW1vdGVfZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IEN0cmxIYW5ndXBDb25uUmVtb3RlJiBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfY3RybF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1DdHJsSGFuZ3VwQ29ublJlbW90ZSogQ3RybEhhbmd1cENvbm5SZW1vdGU6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotQ3RybEhhbmd1cENvbm5SZW1vdGUqIEN0cmxIYW5ndXBDb25uUmVtb3RlOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgQ3RybEhhbmd1cENvbm5SZW1vdGU7Ci19Ci0KLXZvaWQgQ3RybEhhbmd1cENvbm5SZW1vdGU6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGNvbm5lY3Rpb25faWRfID0gMDsKLSAgICBjYWxsX2ZhaWxfY2F1c2VfID0gMDsKLSAgfQotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci19Ci0KLWJvb2wgQ3RybEhhbmd1cENvbm5SZW1vdGU6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcXVpcmVkIGludDMyIGNvbm5lY3Rpb25faWQgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmNvbm5lY3Rpb25faWRfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTYpKSBnb3RvIHBhcnNlX2NhbGxfZmFpbF9jYXVzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcXVpcmVkIGludDMyIGNhbGxfZmFpbF9jYXVzZSA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9jYWxsX2ZhaWxfY2F1c2U6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmY2FsbF9mYWlsX2NhdXNlXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgaW50MzIgY29ubmVjdGlvbl9pZCA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDEsIHRoaXMtPmNvbm5lY3Rpb25faWQoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVxdWlyZWQgaW50MzIgY2FsbF9mYWlsX2NhdXNlID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMiwgdGhpcy0+Y2FsbF9mYWlsX2NhdXNlKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgaW50MzIgY29ubmVjdGlvbl9pZCA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgxLCB0aGlzLT5jb25uZWN0aW9uX2lkKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIHJlcXVpcmVkIGludDMyIGNhbGxfZmFpbF9jYXVzZSA9IDI7Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgyLCB0aGlzLT5jYWxsX2ZhaWxfY2F1c2UoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgQ3RybEhhbmd1cENvbm5SZW1vdGU6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIHJlcXVpcmVkIGludDMyIGNvbm5lY3Rpb25faWQgPSAxOwotICAgIGlmIChoYXNfY29ubmVjdGlvbl9pZCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPmNvbm5lY3Rpb25faWQoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIHJlcXVpcmVkIGludDMyIGNhbGxfZmFpbF9jYXVzZSA9IDI7Ci0gICAgaWYgKGhhc19jYWxsX2ZhaWxfY2F1c2UoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5jYWxsX2ZhaWxfY2F1c2UoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIEN0cmxIYW5ndXBDb25uUmVtb3RlOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IEN0cmxIYW5ndXBDb25uUmVtb3RlKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgQ3RybEhhbmd1cENvbm5SZW1vdGUqPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgQ3RybEhhbmd1cENvbm5SZW1vdGU6Ok1lcmdlRnJvbShjb25zdCBDdHJsSGFuZ3VwQ29ublJlbW90ZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9jb25uZWN0aW9uX2lkKGZyb20uY29ubmVjdGlvbl9pZCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF9jYWxsX2ZhaWxfY2F1c2UoZnJvbS5jYWxsX2ZhaWxfY2F1c2UoKSk7Ci0gICAgfQotICB9Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci19Ci0KLXZvaWQgQ3RybEhhbmd1cENvbm5SZW1vdGU6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgQ3RybEhhbmd1cENvbm5SZW1vdGU6OkNvcHlGcm9tKGNvbnN0IEN0cmxIYW5ndXBDb25uUmVtb3RlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgaWYgKChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMykgIT0gMHgwMDAwMDAwMykgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ3RybEhhbmd1cENvbm5SZW1vdGU6OlN3YXAoQ3RybEhhbmd1cENvbm5SZW1vdGUqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKGNvbm5lY3Rpb25faWRfLCBvdGhlci0+Y29ubmVjdGlvbl9pZF8pOwotICAgIHN0ZDo6c3dhcChjYWxsX2ZhaWxfY2F1c2VfLCBvdGhlci0+Y2FsbF9mYWlsX2NhdXNlXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgQ3RybEhhbmd1cENvbm5SZW1vdGU6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEN0cmxIYW5ndXBDb25uUmVtb3RlX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gQ3RybEhhbmd1cENvbm5SZW1vdGVfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjprRmxhZ0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6Q3RybFNldENhbGxUcmFuc2l0aW9uRmxhZygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1DdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKGNvbnN0IEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgZmxhZ18gPSBmYWxzZTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6fkN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpTaGFyZWREdG9yKCkgewotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZ19kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyYgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfY3RybF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1DdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKiBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcqIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOwotfQotCi12b2lkIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGZsYWdfID0gZmFsc2U7Ci0gIH0KLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotfQotCi1ib29sIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcXVpcmVkIGJvb2wgZmxhZyA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZmbGFnXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCBib29sIGZsYWcgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDEsIHRoaXMtPmZsYWcoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIHJlcXVpcmVkIGJvb2wgZmxhZyA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEsIHRoaXMtPmZsYWcoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gcmVxdWlyZWQgYm9vbCBmbGFnID0gMTsKLSAgICBpZiAoaGFzX2ZsYWcoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyo+KAotICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpNZXJnZUZyb20oY29uc3QgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9mbGFnKGZyb20uZmxhZygpKTsKLSAgICB9Ci0gIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6OkNvcHlGcm9tKGNvbnN0IEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDEpICE9IDB4MDAwMDAwMDEpIHJldHVybiBmYWxzZTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6OlN3YXAoQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAoZmxhZ18sIG90aGVyLT5mbGFnXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZ19kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWdfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWNvbnN0IDo6c3RkOjpzdHJpbmcgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpfZGVmYXVsdF9waG9uZV9udW1iZXJfOwotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6a1Bob25lTnVtYmVyRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgotCi1DdHJsUmVxQWRkRGlhbGluZ0NhbGw6OkN0cmxSZXFBZGREaWFsaW5nQ2FsbCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLUN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6Q3RybFJlcUFkZERpYWxpbmdDYWxsKGNvbnN0IEN0cmxSZXFBZGREaWFsaW5nQ2FsbCYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIHBob25lX251bWJlcl8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJl9kZWZhdWx0X3Bob25lX251bWJlcl8pOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1DdHJsUmVxQWRkRGlhbGluZ0NhbGw6On5DdHJsUmVxQWRkRGlhbGluZ0NhbGwoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBDdHJsUmVxQWRkRGlhbGluZ0NhbGw6OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChwaG9uZV9udW1iZXJfICE9ICZfZGVmYXVsdF9waG9uZV9udW1iZXJfKSB7Ci0gICAgZGVsZXRlIHBob25lX251bWJlcl87Ci0gIH0KLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBDdHJsUmVxQWRkRGlhbGluZ0NhbGxfZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IEN0cmxSZXFBZGREaWFsaW5nQ2FsbCYgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19jdHJsXzJlcHJvdG8oKTsgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLUN0cmxSZXFBZGREaWFsaW5nQ2FsbCogQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUN0cmxSZXFBZGREaWFsaW5nQ2FsbCogQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgQ3RybFJlcUFkZERpYWxpbmdDYWxsOwotfQotCi12b2lkIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgICBpZiAocGhvbmVfbnVtYmVyXyAhPSAmX2RlZmF1bHRfcGhvbmVfbnVtYmVyXykgewotICAgICAgICBwaG9uZV9udW1iZXJfLT5jbGVhcigpOwotICAgICAgfQotICAgIH0KLSAgfQotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci19Ci0KLWJvb2wgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCBzdHJpbmcgcGhvbmVfbnVtYmVyID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3Bob25lX251bWJlcigpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgICAgICAgIHRoaXMtPnBob25lX251bWJlcigpLmRhdGEoKSwgdGhpcy0+cGhvbmVfbnVtYmVyKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCBzdHJpbmcgcGhvbmVfbnVtYmVyID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPnBob25lX251bWJlcigpLmRhdGEoKSwgdGhpcy0+cGhvbmVfbnVtYmVyKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKLSAgICAgIDEsIHRoaXMtPnBob25lX251bWJlcigpLCBvdXRwdXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyByZXF1aXJlZCBzdHJpbmcgcGhvbmVfbnVtYmVyID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPnBob25lX251bWJlcigpLmRhdGEoKSwgdGhpcy0+cGhvbmVfbnVtYmVyKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAxLCB0aGlzLT5waG9uZV9udW1iZXIoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyByZXF1aXJlZCBzdHJpbmcgcGhvbmVfbnVtYmVyID0gMTsKLSAgICBpZiAoaGFzX3Bob25lX251bWJlcigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5waG9uZV9udW1iZXIoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBDdHJsUmVxQWRkRGlhbGluZ0NhbGwqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBDdHJsUmVxQWRkRGlhbGluZ0NhbGwqPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpNZXJnZUZyb20oY29uc3QgQ3RybFJlcUFkZERpYWxpbmdDYWxsJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5faGFzX2JpdCgwKSkgewotICAgICAgc2V0X3Bob25lX251bWJlcihmcm9tLnBob25lX251bWJlcigpKTsKLSAgICB9Ci0gIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBDdHJsUmVxQWRkRGlhbGluZ0NhbGw6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpDb3B5RnJvbShjb25zdCBDdHJsUmVxQWRkRGlhbGluZ0NhbGwmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgaWYgKChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMSkgIT0gMHgwMDAwMDAwMSkgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpTd2FwKEN0cmxSZXFBZGREaWFsaW5nQ2FsbCogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAocGhvbmVfbnVtYmVyXywgb3RoZXItPnBob25lX251bWJlcl8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gQ3RybFJlcUFkZERpYWxpbmdDYWxsX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gQ3RybFJlcUFkZERpYWxpbmdDYWxsX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKLQotfSAgLy8gbmFtZXNwYWNlIHJpbF9wcm90bwotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9jcHAvY3RybC5wYi5oIGIvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9jcHAvY3RybC5wYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTlmMTY2Li4wMDAwMDAwCi0tLSBhL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvY3BwL2N0cmwucGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1NSArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBjdHJsLnByb3RvCi0KLSNpZm5kZWYgUFJPVE9CVUZfY3RybF8yZXByb3RvX19JTkNMVURFRAotI2RlZmluZSBQUk9UT0JVRl9jdHJsXzJlcHJvdG9fX0lOQ0xVREVECi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLSNpZiBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiA8IDIwMDMwMDAKLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCi0jZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZSB1cGRhdGUKLSNlcnJvciB5b3VyIGhlYWRlcnMuCi0jZW5kaWYKLSNpZiAyMDAzMDAwIDwgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgotI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCi0jZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZQotI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+Ci0jaW5jbHVkZSAicmlsLnBiLmgiCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCi0KLW5hbWVzcGFjZSByaWxfcHJvdG8gewotCi0vLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuCi12b2lkICBwcm90b2J1Zl9BZGREZXNjX2N0cmxfMmVwcm90bygpOwotdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2N0cmxfMmVwcm90bygpOwotdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfY3RybF8yZXByb3RvKCk7Ci0KLWNsYXNzIEN0cmxSZXFSYWRpb1N0YXRlOwotY2xhc3MgQ3RybFJzcFJhZGlvU3RhdGU7Ci1jbGFzcyBDdHJsUmVxU2V0TVRDYWxsOwotY2xhc3MgQ3RybEhhbmd1cENvbm5SZW1vdGU7Ci1jbGFzcyBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOwotY2xhc3MgQ3RybFJlcUFkZERpYWxpbmdDYWxsOwotCi1lbnVtIEN0cmxDbWQgewotICBDVFJMX0NNRF9FQ0hPID0gMCwKLSAgQ1RSTF9DTURfR0VUX1JBRElPX1NUQVRFID0gMSwKLSAgQ1RSTF9DTURfU0VUX1JBRElPX1NUQVRFID0gMiwKLSAgQ1RSTF9DTURfU0VUX01UX0NBTEwgPSAxMDAxLAotICBDVFJMX0NNRF9IQU5HVVBfQ09OTl9SRU1PVEUgPSAxMDAyLAotICBDVFJMX0NNRF9TRVRfQ0FMTF9UUkFOU0lUSU9OX0ZMQUcgPSAxMDAzLAotICBDVFJMX0NNRF9TRVRfQ0FMTF9BTEVSVCA9IDEwMDQsCi0gIENUUkxfQ01EX1NFVF9DQUxMX0FDVElWRSA9IDEwMDUsCi0gIENUUkxfQ01EX0FERF9ESUFMSU5HX0NBTEwgPSAxMDA2Ci19OwotYm9vbCBDdHJsQ21kX0lzVmFsaWQoaW50IHZhbHVlKTsKLWNvbnN0IEN0cmxDbWQgQ3RybENtZF9NSU4gPSBDVFJMX0NNRF9FQ0hPOwotY29uc3QgQ3RybENtZCBDdHJsQ21kX01BWCA9IENUUkxfQ01EX0FERF9ESUFMSU5HX0NBTEw7Ci1jb25zdCBpbnQgQ3RybENtZF9BUlJBWVNJWkUgPSBDdHJsQ21kX01BWCArIDE7Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEN0cmxDbWRfZGVzY3JpcHRvcigpOwotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEN0cmxDbWRfTmFtZShDdHJsQ21kIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAotICAgIEN0cmxDbWRfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBDdHJsQ21kX1BhcnNlKAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsIEN0cmxDbWQqIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxDdHJsQ21kPigKLSAgICBDdHJsQ21kX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOwotfQotZW51bSBDdHJsU3RhdHVzIHsKLSAgQ1RSTF9TVEFUVVNfT0sgPSAwLAotICBDVFJMX1NUQVRVU19FUlIgPSAxCi19OwotYm9vbCBDdHJsU3RhdHVzX0lzVmFsaWQoaW50IHZhbHVlKTsKLWNvbnN0IEN0cmxTdGF0dXMgQ3RybFN0YXR1c19NSU4gPSBDVFJMX1NUQVRVU19PSzsKLWNvbnN0IEN0cmxTdGF0dXMgQ3RybFN0YXR1c19NQVggPSBDVFJMX1NUQVRVU19FUlI7Ci1jb25zdCBpbnQgQ3RybFN0YXR1c19BUlJBWVNJWkUgPSBDdHJsU3RhdHVzX01BWCArIDE7Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEN0cmxTdGF0dXNfZGVzY3JpcHRvcigpOwotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEN0cmxTdGF0dXNfTmFtZShDdHJsU3RhdHVzIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAotICAgIEN0cmxTdGF0dXNfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBDdHJsU3RhdHVzX1BhcnNlKAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsIEN0cmxTdGF0dXMqIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxDdHJsU3RhdHVzPigKLSAgICBDdHJsU3RhdHVzX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOwotfQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBDdHJsUmVxUmFkaW9TdGF0ZSA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgQ3RybFJlcVJhZGlvU3RhdGUoKTsKLSAgdmlydHVhbCB+Q3RybFJlcVJhZGlvU3RhdGUoKTsKLSAgCi0gIEN0cmxSZXFSYWRpb1N0YXRlKGNvbnN0IEN0cmxSZXFSYWRpb1N0YXRlJiBmcm9tKTsKLSAgCi0gIGlubGluZSBDdHJsUmVxUmFkaW9TdGF0ZSYgb3BlcmF0b3I9KGNvbnN0IEN0cmxSZXFSYWRpb1N0YXRlJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBDdHJsUmVxUmFkaW9TdGF0ZSYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKEN0cmxSZXFSYWRpb1N0YXRlKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgQ3RybFJlcVJhZGlvU3RhdGUqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgQ3RybFJlcVJhZGlvU3RhdGUmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBDdHJsUmVxUmFkaW9TdGF0ZSYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyByZXF1aXJlZCAucmlsX3Byb3RvLlJhZGlvU3RhdGUgc3RhdGUgPSAxOwotICBpbmxpbmUgYm9vbCBoYXNfc3RhdGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfc3RhdGUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrU3RhdGVGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSByaWxfcHJvdG86OlJhZGlvU3RhdGUgc3RhdGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3N0YXRlKHJpbF9wcm90bzo6UmFkaW9TdGF0ZSB2YWx1ZSk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLkN0cmxSZXFSYWRpb1N0YXRlKQotIHByaXZhdGU6Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIAotICBpbnQgc3RhdGVfOwotICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19jdHJsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19jdHJsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2N0cmxfMmVwcm90bygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKLSAgCi0gIC8vIFdIWSBET0VTICYgSEFWRSBMT1dFUiBQUkVDRURFTkNFIFRIQU4gIT0gIT8KLSAgaW5saW5lIGJvb2wgX2hhc19iaXQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChfaGFzX2JpdHNfW2luZGV4IC8gMzJdICYgKDF1IDw8IChpbmRleCAlIDMyKSkpICE9IDA7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX3NldF9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSB8PSAoMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfY2xlYXJfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gJj0gfigxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIAotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgQ3RybFJlcVJhZGlvU3RhdGUqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ3RybFJzcFJhZGlvU3RhdGUgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIEN0cmxSc3BSYWRpb1N0YXRlKCk7Ci0gIHZpcnR1YWwgfkN0cmxSc3BSYWRpb1N0YXRlKCk7Ci0gIAotICBDdHJsUnNwUmFkaW9TdGF0ZShjb25zdCBDdHJsUnNwUmFkaW9TdGF0ZSYgZnJvbSk7Ci0gIAotICBpbmxpbmUgQ3RybFJzcFJhZGlvU3RhdGUmIG9wZXJhdG9yPShjb25zdCBDdHJsUnNwUmFkaW9TdGF0ZSYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICAKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgQ3RybFJzcFJhZGlvU3RhdGUmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChDdHJsUnNwUmFkaW9TdGF0ZSogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIEN0cmxSc3BSYWRpb1N0YXRlKiBOZXcoKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IEN0cmxSc3BSYWRpb1N0YXRlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgQ3RybFJzcFJhZGlvU3RhdGUmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gcmVxdWlyZWQgLnJpbF9wcm90by5SYWRpb1N0YXRlIHN0YXRlID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX3N0YXRlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3N0YXRlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1N0YXRlRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgcmlsX3Byb3RvOjpSYWRpb1N0YXRlIHN0YXRlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9zdGF0ZShyaWxfcHJvdG86OlJhZGlvU3RhdGUgdmFsdWUpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5DdHJsUnNwUmFkaW9TdGF0ZSkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgaW50IHN0YXRlXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfY3RybF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfY3RybF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9jdHJsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIEN0cmxSc3BSYWRpb1N0YXRlKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEN0cmxSZXFTZXRNVENhbGwgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIEN0cmxSZXFTZXRNVENhbGwoKTsKLSAgdmlydHVhbCB+Q3RybFJlcVNldE1UQ2FsbCgpOwotICAKLSAgQ3RybFJlcVNldE1UQ2FsbChjb25zdCBDdHJsUmVxU2V0TVRDYWxsJiBmcm9tKTsKLSAgCi0gIGlubGluZSBDdHJsUmVxU2V0TVRDYWxsJiBvcGVyYXRvcj0oY29uc3QgQ3RybFJlcVNldE1UQ2FsbCYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICAKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgQ3RybFJlcVNldE1UQ2FsbCYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKEN0cmxSZXFTZXRNVENhbGwqIG90aGVyKTsKLSAgCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBDdHJsUmVxU2V0TVRDYWxsKiBOZXcoKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IEN0cmxSZXFTZXRNVENhbGwmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBDdHJsUmVxU2V0TVRDYWxsJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICBwdWJsaWM6Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIHJlcXVpcmVkIHN0cmluZyBwaG9uZV9udW1iZXIgPSAxOwotICBpbmxpbmUgYm9vbCBoYXNfcGhvbmVfbnVtYmVyKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3Bob25lX251bWJlcigpOwotICBzdGF0aWMgY29uc3QgaW50IGtQaG9uZU51bWJlckZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHBob25lX251bWJlcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfcGhvbmVfbnVtYmVyKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3Bob25lX251bWJlcihjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9waG9uZV9udW1iZXIoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfcGhvbmVfbnVtYmVyKCk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLkN0cmxSZXFTZXRNVENhbGwpCi0gcHJpdmF0ZToKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgCi0gIDo6c3RkOjpzdHJpbmcqIHBob25lX251bWJlcl87Ci0gIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIF9kZWZhdWx0X3Bob25lX251bWJlcl87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX2N0cmxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2N0cmxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfY3RybF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBDdHJsUmVxU2V0TVRDYWxsKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEN0cmxIYW5ndXBDb25uUmVtb3RlIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBDdHJsSGFuZ3VwQ29ublJlbW90ZSgpOwotICB2aXJ0dWFsIH5DdHJsSGFuZ3VwQ29ublJlbW90ZSgpOwotICAKLSAgQ3RybEhhbmd1cENvbm5SZW1vdGUoY29uc3QgQ3RybEhhbmd1cENvbm5SZW1vdGUmIGZyb20pOwotICAKLSAgaW5saW5lIEN0cmxIYW5ndXBDb25uUmVtb3RlJiBvcGVyYXRvcj0oY29uc3QgQ3RybEhhbmd1cENvbm5SZW1vdGUmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IEN0cmxIYW5ndXBDb25uUmVtb3RlJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoQ3RybEhhbmd1cENvbm5SZW1vdGUqIG90aGVyKTsKLSAgCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBDdHJsSGFuZ3VwQ29ublJlbW90ZSogTmV3KCkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBDdHJsSGFuZ3VwQ29ublJlbW90ZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEN0cmxIYW5ndXBDb25uUmVtb3RlJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICBwdWJsaWM6Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIHJlcXVpcmVkIGludDMyIGNvbm5lY3Rpb25faWQgPSAxOwotICBpbmxpbmUgYm9vbCBoYXNfY29ubmVjdGlvbl9pZCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9jb25uZWN0aW9uX2lkKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0Nvbm5lY3Rpb25JZEZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgY29ubmVjdGlvbl9pZCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfY29ubmVjdGlvbl9pZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgCi0gIC8vIHJlcXVpcmVkIGludDMyIGNhbGxfZmFpbF9jYXVzZSA9IDI7Ci0gIGlubGluZSBib29sIGhhc19jYWxsX2ZhaWxfY2F1c2UoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfY2FsbF9mYWlsX2NhdXNlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NhbGxGYWlsQ2F1c2VGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGNhbGxfZmFpbF9jYXVzZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfY2FsbF9mYWlsX2NhdXNlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5DdHJsSGFuZ3VwQ29ublJlbW90ZSkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBjb25uZWN0aW9uX2lkXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBjYWxsX2ZhaWxfY2F1c2VfOwotICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19jdHJsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19jdHJsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2N0cmxfMmVwcm90bygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMiArIDMxKSAvIDMyXTsKLSAgCi0gIC8vIFdIWSBET0VTICYgSEFWRSBMT1dFUiBQUkVDRURFTkNFIFRIQU4gIT0gIT8KLSAgaW5saW5lIGJvb2wgX2hhc19iaXQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChfaGFzX2JpdHNfW2luZGV4IC8gMzJdICYgKDF1IDw8IChpbmRleCAlIDMyKSkpICE9IDA7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX3NldF9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSB8PSAoMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfY2xlYXJfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gJj0gfigxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIAotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgQ3RybEhhbmd1cENvbm5SZW1vdGUqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZygpOwotICB2aXJ0dWFsIH5DdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKCk7Ci0gIAotICBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKGNvbnN0IEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcmIGZyb20pOwotICAKLSAgaW5saW5lIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcmIG9wZXJhdG9yPShjb25zdCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gcmVxdWlyZWQgYm9vbCBmbGFnID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX2ZsYWcoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZmxhZygpOwotICBzdGF0aWMgY29uc3QgaW50IGtGbGFnRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgYm9vbCBmbGFnKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9mbGFnKGJvb2wgdmFsdWUpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5DdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKQotIHByaXZhdGU6Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIAotICBib29sIGZsYWdfOwotICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19jdHJsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19jdHJsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2N0cmxfMmVwcm90bygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKLSAgCi0gIC8vIFdIWSBET0VTICYgSEFWRSBMT1dFUiBQUkVDRURFTkNFIFRIQU4gIT0gIT8KLSAgaW5saW5lIGJvb2wgX2hhc19iaXQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChfaGFzX2JpdHNfW2luZGV4IC8gMzJdICYgKDF1IDw8IChpbmRleCAlIDMyKSkpICE9IDA7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX3NldF9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSB8PSAoMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfY2xlYXJfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gJj0gfigxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIAotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDdHJsUmVxQWRkRGlhbGluZ0NhbGwgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIEN0cmxSZXFBZGREaWFsaW5nQ2FsbCgpOwotICB2aXJ0dWFsIH5DdHJsUmVxQWRkRGlhbGluZ0NhbGwoKTsKLSAgCi0gIEN0cmxSZXFBZGREaWFsaW5nQ2FsbChjb25zdCBDdHJsUmVxQWRkRGlhbGluZ0NhbGwmIGZyb20pOwotICAKLSAgaW5saW5lIEN0cmxSZXFBZGREaWFsaW5nQ2FsbCYgb3BlcmF0b3I9KGNvbnN0IEN0cmxSZXFBZGREaWFsaW5nQ2FsbCYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICAKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgQ3RybFJlcUFkZERpYWxpbmdDYWxsJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoQ3RybFJlcUFkZERpYWxpbmdDYWxsKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgQ3RybFJlcUFkZERpYWxpbmdDYWxsKiBOZXcoKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IEN0cmxSZXFBZGREaWFsaW5nQ2FsbCYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEN0cmxSZXFBZGREaWFsaW5nQ2FsbCYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyByZXF1aXJlZCBzdHJpbmcgcGhvbmVfbnVtYmVyID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX3Bob25lX251bWJlcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9waG9uZV9udW1iZXIoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrUGhvbmVOdW1iZXJGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBwaG9uZV9udW1iZXIoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3Bob25lX251bWJlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9waG9uZV9udW1iZXIoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfcGhvbmVfbnVtYmVyKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3Bob25lX251bWJlcigpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5DdHJsUmVxQWRkRGlhbGluZ0NhbGwpCi0gcHJpdmF0ZToKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgCi0gIDo6c3RkOjpzdHJpbmcqIHBob25lX251bWJlcl87Ci0gIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIF9kZWZhdWx0X3Bob25lX251bWJlcl87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX2N0cmxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2N0cmxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfY3RybF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBDdHJsUmVxQWRkRGlhbGluZ0NhbGwqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIEN0cmxSZXFSYWRpb1N0YXRlCi0KLS8vIHJlcXVpcmVkIC5yaWxfcHJvdG8uUmFkaW9TdGF0ZSBzdGF0ZSA9IDE7Ci1pbmxpbmUgYm9vbCBDdHJsUmVxUmFkaW9TdGF0ZTo6aGFzX3N0YXRlKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBDdHJsUmVxUmFkaW9TdGF0ZTo6Y2xlYXJfc3RhdGUoKSB7Ci0gIHN0YXRlXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgcmlsX3Byb3RvOjpSYWRpb1N0YXRlIEN0cmxSZXFSYWRpb1N0YXRlOjpzdGF0ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCByaWxfcHJvdG86OlJhZGlvU3RhdGUgPihzdGF0ZV8pOwotfQotaW5saW5lIHZvaWQgQ3RybFJlcVJhZGlvU3RhdGU6OnNldF9zdGF0ZShyaWxfcHJvdG86OlJhZGlvU3RhdGUgdmFsdWUpIHsKLSAgR09PR0xFX0RDSEVDSyhyaWxfcHJvdG86OlJhZGlvU3RhdGVfSXNWYWxpZCh2YWx1ZSkpOwotICBfc2V0X2JpdCgwKTsKLSAgc3RhdGVfID0gdmFsdWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gQ3RybFJzcFJhZGlvU3RhdGUKLQotLy8gcmVxdWlyZWQgLnJpbF9wcm90by5SYWRpb1N0YXRlIHN0YXRlID0gMTsKLWlubGluZSBib29sIEN0cmxSc3BSYWRpb1N0YXRlOjpoYXNfc3RhdGUoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIEN0cmxSc3BSYWRpb1N0YXRlOjpjbGVhcl9zdGF0ZSgpIHsKLSAgc3RhdGVfID0gMDsKLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSByaWxfcHJvdG86OlJhZGlvU3RhdGUgQ3RybFJzcFJhZGlvU3RhdGU6OnN0YXRlKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8IHJpbF9wcm90bzo6UmFkaW9TdGF0ZSA+KHN0YXRlXyk7Ci19Ci1pbmxpbmUgdm9pZCBDdHJsUnNwUmFkaW9TdGF0ZTo6c2V0X3N0YXRlKHJpbF9wcm90bzo6UmFkaW9TdGF0ZSB2YWx1ZSkgewotICBHT09HTEVfRENIRUNLKHJpbF9wcm90bzo6UmFkaW9TdGF0ZV9Jc1ZhbGlkKHZhbHVlKSk7Ci0gIF9zZXRfYml0KDApOwotICBzdGF0ZV8gPSB2YWx1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBDdHJsUmVxU2V0TVRDYWxsCi0KLS8vIHJlcXVpcmVkIHN0cmluZyBwaG9uZV9udW1iZXIgPSAxOwotaW5saW5lIGJvb2wgQ3RybFJlcVNldE1UQ2FsbDo6aGFzX3Bob25lX251bWJlcigpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDApOwotfQotaW5saW5lIHZvaWQgQ3RybFJlcVNldE1UQ2FsbDo6Y2xlYXJfcGhvbmVfbnVtYmVyKCkgewotICBpZiAocGhvbmVfbnVtYmVyXyAhPSAmX2RlZmF1bHRfcGhvbmVfbnVtYmVyXykgewotICAgIHBob25lX251bWJlcl8tPmNsZWFyKCk7Ci0gIH0KLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDdHJsUmVxU2V0TVRDYWxsOjpwaG9uZV9udW1iZXIoKSBjb25zdCB7Ci0gIHJldHVybiAqcGhvbmVfbnVtYmVyXzsKLX0KLWlubGluZSB2b2lkIEN0cmxSZXFTZXRNVENhbGw6OnNldF9waG9uZV9udW1iZXIoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGlmIChwaG9uZV9udW1iZXJfID09ICZfZGVmYXVsdF9waG9uZV9udW1iZXJfKSB7Ci0gICAgcGhvbmVfbnVtYmVyXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHBob25lX251bWJlcl8tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBDdHJsUmVxU2V0TVRDYWxsOjpzZXRfcGhvbmVfbnVtYmVyKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDApOwotICBpZiAocGhvbmVfbnVtYmVyXyA9PSAmX2RlZmF1bHRfcGhvbmVfbnVtYmVyXykgewotICAgIHBob25lX251bWJlcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBwaG9uZV9udW1iZXJfLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgQ3RybFJlcVNldE1UQ2FsbDo6c2V0X3Bob25lX251bWJlcihjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGlmIChwaG9uZV9udW1iZXJfID09ICZfZGVmYXVsdF9waG9uZV9udW1iZXJfKSB7Ci0gICAgcGhvbmVfbnVtYmVyXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHBob25lX251bWJlcl8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIEN0cmxSZXFTZXRNVENhbGw6Om11dGFibGVfcGhvbmVfbnVtYmVyKCkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKHBob25lX251bWJlcl8gPT0gJl9kZWZhdWx0X3Bob25lX251bWJlcl8pIHsKLSAgICBwaG9uZV9udW1iZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIHBob25lX251bWJlcl87Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gQ3RybEhhbmd1cENvbm5SZW1vdGUKLQotLy8gcmVxdWlyZWQgaW50MzIgY29ubmVjdGlvbl9pZCA9IDE7Ci1pbmxpbmUgYm9vbCBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6aGFzX2Nvbm5lY3Rpb25faWQoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIEN0cmxIYW5ndXBDb25uUmVtb3RlOjpjbGVhcl9jb25uZWN0aW9uX2lkKCkgewotICBjb25uZWN0aW9uX2lkXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6Y29ubmVjdGlvbl9pZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbm5lY3Rpb25faWRfOwotfQotaW5saW5lIHZvaWQgQ3RybEhhbmd1cENvbm5SZW1vdGU6OnNldF9jb25uZWN0aW9uX2lkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGNvbm5lY3Rpb25faWRfID0gdmFsdWU7Ci19Ci0KLS8vIHJlcXVpcmVkIGludDMyIGNhbGxfZmFpbF9jYXVzZSA9IDI7Ci1pbmxpbmUgYm9vbCBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6aGFzX2NhbGxfZmFpbF9jYXVzZSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDEpOwotfQotaW5saW5lIHZvaWQgQ3RybEhhbmd1cENvbm5SZW1vdGU6OmNsZWFyX2NhbGxfZmFpbF9jYXVzZSgpIHsKLSAgY2FsbF9mYWlsX2NhdXNlXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMSk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBDdHJsSGFuZ3VwQ29ublJlbW90ZTo6Y2FsbF9mYWlsX2NhdXNlKCkgY29uc3QgewotICByZXR1cm4gY2FsbF9mYWlsX2NhdXNlXzsKLX0KLWlubGluZSB2b2lkIEN0cmxIYW5ndXBDb25uUmVtb3RlOjpzZXRfY2FsbF9mYWlsX2NhdXNlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoMSk7Ci0gIGNhbGxfZmFpbF9jYXVzZV8gPSB2YWx1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnCi0KLS8vIHJlcXVpcmVkIGJvb2wgZmxhZyA9IDE7Ci1pbmxpbmUgYm9vbCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnOjpoYXNfZmxhZygpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDApOwotfQotaW5saW5lIHZvaWQgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZzo6Y2xlYXJfZmxhZygpIHsKLSAgZmxhZ18gPSBmYWxzZTsKLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSBib29sIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6OmZsYWcoKSBjb25zdCB7Ci0gIHJldHVybiBmbGFnXzsKLX0KLWlubGluZSB2b2lkIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWc6OnNldF9mbGFnKGJvb2wgdmFsdWUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGZsYWdfID0gdmFsdWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gQ3RybFJlcUFkZERpYWxpbmdDYWxsCi0KLS8vIHJlcXVpcmVkIHN0cmluZyBwaG9uZV9udW1iZXIgPSAxOwotaW5saW5lIGJvb2wgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpoYXNfcGhvbmVfbnVtYmVyKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBDdHJsUmVxQWRkRGlhbGluZ0NhbGw6OmNsZWFyX3Bob25lX251bWJlcigpIHsKLSAgaWYgKHBob25lX251bWJlcl8gIT0gJl9kZWZhdWx0X3Bob25lX251bWJlcl8pIHsKLSAgICBwaG9uZV9udW1iZXJfLT5jbGVhcigpOwotICB9Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ3RybFJlcUFkZERpYWxpbmdDYWxsOjpwaG9uZV9udW1iZXIoKSBjb25zdCB7Ci0gIHJldHVybiAqcGhvbmVfbnVtYmVyXzsKLX0KLWlubGluZSB2b2lkIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6c2V0X3Bob25lX251bWJlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKHBob25lX251bWJlcl8gPT0gJl9kZWZhdWx0X3Bob25lX251bWJlcl8pIHsKLSAgICBwaG9uZV9udW1iZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcGhvbmVfbnVtYmVyXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6c2V0X3Bob25lX251bWJlcihjb25zdCBjaGFyKiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKHBob25lX251bWJlcl8gPT0gJl9kZWZhdWx0X3Bob25lX251bWJlcl8pIHsKLSAgICBwaG9uZV9udW1iZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcGhvbmVfbnVtYmVyXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6c2V0X3Bob25lX251bWJlcihjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGlmIChwaG9uZV9udW1iZXJfID09ICZfZGVmYXVsdF9waG9uZV9udW1iZXJfKSB7Ci0gICAgcGhvbmVfbnVtYmVyXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHBob25lX251bWJlcl8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIEN0cmxSZXFBZGREaWFsaW5nQ2FsbDo6bXV0YWJsZV9waG9uZV9udW1iZXIoKSB7Ci0gIF9zZXRfYml0KDApOwotICBpZiAocGhvbmVfbnVtYmVyXyA9PSAmX2RlZmF1bHRfcGhvbmVfbnVtYmVyXykgewotICAgIHBob25lX251bWJlcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gcGhvbmVfbnVtYmVyXzsKLX0KLQotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQotCi19ICAvLyBuYW1lc3BhY2UgcmlsX3Byb3RvCi0KLSNpZm5kZWYgU1dJRwotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi10ZW1wbGF0ZSA8PgotaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgcmlsX3Byb3RvOjpDdHJsQ21kPigpIHsKLSAgcmV0dXJuIHJpbF9wcm90bzo6Q3RybENtZF9kZXNjcmlwdG9yKCk7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgcmlsX3Byb3RvOjpDdHJsU3RhdHVzPigpIHsKLSAgcmV0dXJuIHJpbF9wcm90bzo6Q3RybFN0YXR1c19kZXNjcmlwdG9yKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotI2VuZGlmICAvLyBTV0lHCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCi0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfY3RybF8yZXByb3RvX19JTkNMVURFRApkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9jcHAvbXNnaGVhZGVyLnBiLmNwcCBiL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvY3BwL21zZ2hlYWRlci5wYi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YmQxYTUuLjAwMDAwMDAKLS0tIGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9jcHAvbXNnaGVhZGVyLnBiLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotCi0jZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCi0jaW5jbHVkZSAibXNnaGVhZGVyLnBiLmgiCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKLQotbmFtZXNwYWNlIGNvbW11bmljYXRpb24gewotCi1uYW1lc3BhY2UgewotCi1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIE1zZ0hlYWRlcl9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgTXNnSGVhZGVyX3JlZmxlY3Rpb25fID0gTlVMTDsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLQotdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX21zZ2hlYWRlcl8yZXByb3RvKCkgewotICBwcm90b2J1Zl9BZGREZXNjX21zZ2hlYWRlcl8yZXByb3RvKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3IqIGZpbGUgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPkZpbmRGaWxlQnlOYW1lKAotICAgICAgIm1zZ2hlYWRlci5wcm90byIpOwotICBHT09HTEVfQ0hFQ0soZmlsZSAhPSBOVUxMKTsKLSAgTXNnSGVhZGVyX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDApOwotICBzdGF0aWMgY29uc3QgaW50IE1zZ0hlYWRlcl9vZmZzZXRzX1s0XSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1zZ0hlYWRlciwgY21kXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNc2dIZWFkZXIsIGxlbmd0aF9kYXRhXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNc2dIZWFkZXIsIHN0YXR1c18pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTXNnSGVhZGVyLCB0b2tlbl8pLAotICB9OwotICBNc2dIZWFkZXJfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIE1zZ0hlYWRlcl9kZXNjcmlwdG9yXywKLSAgICAgIE1zZ0hlYWRlcjo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBNc2dIZWFkZXJfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1zZ0hlYWRlciwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1zZ0hlYWRlciwgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKE1zZ0hlYWRlcikpOwotfQotCi1uYW1lc3BhY2UgewotCi1HT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzX29uY2VfKTsKLWlubGluZSB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8sCi0gICAgICAgICAgICAgICAgICZwcm90b2J1Zl9Bc3NpZ25EZXNjX21zZ2hlYWRlcl8yZXByb3RvKTsKLX0KLQotdm9pZCBwcm90b2J1Zl9SZWdpc3RlclR5cGVzKGNvbnN0IDo6c3RkOjpzdHJpbmcmKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBNc2dIZWFkZXJfZGVzY3JpcHRvcl8sICZNc2dIZWFkZXI6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9tc2doZWFkZXJfMmVwcm90bygpIHsKLSAgZGVsZXRlIE1zZ0hlYWRlcjo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBNc2dIZWFkZXJfcmVmbGVjdGlvbl87Ci19Ci0KLXZvaWQgcHJvdG9idWZfQWRkRGVzY19tc2doZWFkZXJfMmVwcm90bygpIHsKLSAgc3RhdGljIGJvb2wgYWxyZWFkeV9oZXJlID0gZmFsc2U7Ci0gIGlmIChhbHJlYWR5X2hlcmUpIHJldHVybjsKLSAgYWxyZWFkeV9oZXJlID0gdHJ1ZTsKLSAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OkludGVybmFsQWRkR2VuZXJhdGVkRmlsZSgKLSAgICAiXG5cMDE3bXNnaGVhZGVyLnByb3RvXDAyMlxyY29tbXVuaWNhdGlvblwiTFxuXHRNc2dIIgotICAgICJlYWRlclwwMjJcMDEzXG5cMDAzY21kXDAzMFwwMDEgXDAwMihcclwwMjJcMDIzXG5cMDEzbGVuZ3RoX2RhdGFcMDMwXDAwMiBcMDAyKFxyXDAyMiIKLSAgICAiXDAxNlxuXDAwNnN0YXR1c1wwMzBcMDAzIFwwMDEoXHJcMDIyXHJcblwwMDV0b2tlblwwMzBcMDA0IFwwMDEoXDAwNEIkXG5cImNvbS5hbiIKLSAgICAiZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbiIsIDE0OCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKAotICAgICJtc2doZWFkZXIucHJvdG8iLCAmcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyk7Ci0gIE1zZ0hlYWRlcjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgTXNnSGVhZGVyKCk7Ci0gIE1zZ0hlYWRlcjo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpPblNodXRkb3duKCZwcm90b2J1Zl9TaHV0ZG93bkZpbGVfbXNnaGVhZGVyXzJlcHJvdG8pOwotfQotCi0vLyBGb3JjZSBBZGREZXNjcmlwdG9ycygpIHRvIGJlIGNhbGxlZCBhdCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gdGltZS4KLXN0cnVjdCBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfbXNnaGVhZGVyXzJlcHJvdG8gewotICBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfbXNnaGVhZGVyXzJlcHJvdG8oKSB7Ci0gICAgcHJvdG9idWZfQWRkRGVzY19tc2doZWFkZXJfMmVwcm90bygpOwotICB9Ci19IHN0YXRpY19kZXNjcmlwdG9yX2luaXRpYWxpemVyX21zZ2hlYWRlcl8yZXByb3RvXzsKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBNc2dIZWFkZXI6OmtDbWRGaWVsZE51bWJlcjsKLWNvbnN0IGludCBNc2dIZWFkZXI6OmtMZW5ndGhEYXRhRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgTXNnSGVhZGVyOjprU3RhdHVzRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgTXNnSGVhZGVyOjprVG9rZW5GaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLU1zZ0hlYWRlcjo6TXNnSGVhZGVyKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLX0KLQotdm9pZCBNc2dIZWFkZXI6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotTXNnSGVhZGVyOjpNc2dIZWFkZXIoY29uc3QgTXNnSGVhZGVyJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgTXNnSGVhZGVyOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgY21kXyA9IDB1OwotICBsZW5ndGhfZGF0YV8gPSAwdTsKLSAgc3RhdHVzXyA9IDB1OwotICB0b2tlbl8gPSBHT09HTEVfVUxPTkdMT05HKDApOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1Nc2dIZWFkZXI6On5Nc2dIZWFkZXIoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBNc2dIZWFkZXI6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBNc2dIZWFkZXI6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBNc2dIZWFkZXI6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gTXNnSGVhZGVyX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBNc2dIZWFkZXImIE1zZ0hlYWRlcjo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfbXNnaGVhZGVyXzJlcHJvdG8oKTsgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLU1zZ0hlYWRlciogTXNnSGVhZGVyOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLU1zZ0hlYWRlciogTXNnSGVhZGVyOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgTXNnSGVhZGVyOwotfQotCi12b2lkIE1zZ0hlYWRlcjo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgY21kXyA9IDB1OwotICAgIGxlbmd0aF9kYXRhXyA9IDB1OwotICAgIHN0YXR1c18gPSAwdTsKLSAgICB0b2tlbl8gPSBHT09HTEVfVUxPTkdMT05HKDApOwotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBNc2dIZWFkZXI6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcXVpcmVkIHVpbnQzMiBjbWQgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX1VJTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmY21kXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9sZW5ndGhfZGF0YTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcXVpcmVkIHVpbnQzMiBsZW5ndGhfZGF0YSA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9sZW5ndGhfZGF0YToKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9VSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmxlbmd0aF9kYXRhXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9zdGF0dXM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCB1aW50MzIgc3RhdHVzID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX3N0YXR1czoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9VSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnN0YXR1c18pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoMik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzMikpIGdvdG8gcGFyc2VfdG9rZW47Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCB1aW50NjQgdG9rZW4gPSA0OwotICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgcGFyc2VfdG9rZW46Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfVUlOVDY0PigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZ0b2tlbl8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoMyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgTXNnSGVhZGVyOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCB1aW50MzIgY21kID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyKDEsIHRoaXMtPmNtZCgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXF1aXJlZCB1aW50MzIgbGVuZ3RoX2RhdGEgPSAyOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzIoMiwgdGhpcy0+bGVuZ3RoX2RhdGEoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgdWludDMyIHN0YXR1cyA9IDM7Ci0gIGlmIChfaGFzX2JpdCgyKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMigzLCB0aGlzLT5zdGF0dXMoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgdWludDY0IHRva2VuID0gNDsKLSAgaWYgKF9oYXNfYml0KDMpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0KDQsIHRoaXMtPnRva2VuKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBNc2dIZWFkZXI6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIHJlcXVpcmVkIHVpbnQzMiBjbWQgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJUb0FycmF5KDEsIHRoaXMtPmNtZCgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyByZXF1aXJlZCB1aW50MzIgbGVuZ3RoX2RhdGEgPSAyOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJUb0FycmF5KDIsIHRoaXMtPmxlbmd0aF9kYXRhKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIHVpbnQzMiBzdGF0dXMgPSAzOwotICBpZiAoX2hhc19iaXQoMikpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJUb0FycmF5KDMsIHRoaXMtPnN0YXR1cygpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCB1aW50NjQgdG9rZW4gPSA0OwotICBpZiAoX2hhc19iaXQoMykpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjRUb0FycmF5KDQsIHRoaXMtPnRva2VuKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IE1zZ0hlYWRlcjo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gcmVxdWlyZWQgdWludDMyIGNtZCA9IDE7Ci0gICAgaWYgKGhhc19jbWQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlVJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+Y21kKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXF1aXJlZCB1aW50MzIgbGVuZ3RoX2RhdGEgPSAyOwotICAgIGlmIChoYXNfbGVuZ3RoX2RhdGEoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlVJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+bGVuZ3RoX2RhdGEoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIHVpbnQzMiBzdGF0dXMgPSAzOwotICAgIGlmIChoYXNfc3RhdHVzKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpVSW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPnN0YXR1cygpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgdWludDY0IHRva2VuID0gNDsKLSAgICBpZiAoaGFzX3Rva2VuKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpVSW50NjRTaXplKAotICAgICAgICAgIHRoaXMtPnRva2VuKCkpOwotICAgIH0KLSAgICAKLSAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBNc2dIZWFkZXI6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgTXNnSGVhZGVyKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgTXNnSGVhZGVyKj4oCi0gICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIE1zZ0hlYWRlcjo6TWVyZ2VGcm9tKGNvbnN0IE1zZ0hlYWRlciYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9jbWQoZnJvbS5jbWQoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDEpKSB7Ci0gICAgICBzZXRfbGVuZ3RoX2RhdGEoZnJvbS5sZW5ndGhfZGF0YSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMikpIHsKLSAgICAgIHNldF9zdGF0dXMoZnJvbS5zdGF0dXMoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDMpKSB7Ci0gICAgICBzZXRfdG9rZW4oZnJvbS50b2tlbigpKTsKLSAgICB9Ci0gIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBNc2dIZWFkZXI6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgTXNnSGVhZGVyOjpDb3B5RnJvbShjb25zdCBNc2dIZWFkZXImIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIE1zZ0hlYWRlcjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgaWYgKChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMykgIT0gMHgwMDAwMDAwMykgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTXNnSGVhZGVyOjpTd2FwKE1zZ0hlYWRlciogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAoY21kXywgb3RoZXItPmNtZF8pOwotICAgIHN0ZDo6c3dhcChsZW5ndGhfZGF0YV8sIG90aGVyLT5sZW5ndGhfZGF0YV8pOwotICAgIHN0ZDo6c3dhcChzdGF0dXNfLCBvdGhlci0+c3RhdHVzXyk7Ci0gICAgc3RkOjpzd2FwKHRva2VuXywgb3RoZXItPnRva2VuXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgTXNnSGVhZGVyOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBNc2dIZWFkZXJfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBNc2dIZWFkZXJfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQotCi19ICAvLyBuYW1lc3BhY2UgY29tbXVuaWNhdGlvbgotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9jcHAvbXNnaGVhZGVyLnBiLmggYi9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2NwcC9tc2doZWFkZXIucGIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4YmYzZS4uMDAwMDAwMAotLS0gYS9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2NwcC9tc2doZWFkZXIucGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBtc2doZWFkZXIucHJvdG8KLQotI2lmbmRlZiBQUk9UT0JVRl9tc2doZWFkZXJfMmVwcm90b19fSU5DTFVERUQKLSNkZWZpbmUgUFJPVE9CVUZfbXNnaGVhZGVyXzJlcHJvdG9fX0lOQ0xVREVECi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLSNpZiBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiA8IDIwMDMwMDAKLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCi0jZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZSB1cGRhdGUKLSNlcnJvciB5b3VyIGhlYWRlcnMuCi0jZW5kaWYKLSNpZiAyMDAzMDAwIDwgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgotI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCi0jZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZQotI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCi0KLW5hbWVzcGFjZSBjb21tdW5pY2F0aW9uIHsKLQotLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCBjYWxsIHRoZXNlLgotdm9pZCAgcHJvdG9idWZfQWRkRGVzY19tc2doZWFkZXJfMmVwcm90bygpOwotdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX21zZ2hlYWRlcl8yZXByb3RvKCk7Ci12b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9tc2doZWFkZXJfMmVwcm90bygpOwotCi1jbGFzcyBNc2dIZWFkZXI7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgTXNnSGVhZGVyIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBNc2dIZWFkZXIoKTsKLSAgdmlydHVhbCB+TXNnSGVhZGVyKCk7Ci0gIAotICBNc2dIZWFkZXIoY29uc3QgTXNnSGVhZGVyJiBmcm9tKTsKLSAgCi0gIGlubGluZSBNc2dIZWFkZXImIG9wZXJhdG9yPShjb25zdCBNc2dIZWFkZXImIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IE1zZ0hlYWRlciYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKE1zZ0hlYWRlciogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIE1zZ0hlYWRlciogTmV3KCkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBNc2dIZWFkZXImIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBNc2dIZWFkZXImIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gcmVxdWlyZWQgdWludDMyIGNtZCA9IDE7Ci0gIGlubGluZSBib29sIGhhc19jbWQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfY21kKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NtZEZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIGNtZCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfY21kKDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHZhbHVlKTsKLSAgCi0gIC8vIHJlcXVpcmVkIHVpbnQzMiBsZW5ndGhfZGF0YSA9IDI7Ci0gIGlubGluZSBib29sIGhhc19sZW5ndGhfZGF0YSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9sZW5ndGhfZGF0YSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtMZW5ndGhEYXRhRmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgbGVuZ3RoX2RhdGEoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2xlbmd0aF9kYXRhKDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHZhbHVlKTsKLSAgCi0gIC8vIG9wdGlvbmFsIHVpbnQzMiBzdGF0dXMgPSAzOwotICBpbmxpbmUgYm9vbCBoYXNfc3RhdHVzKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3N0YXR1cygpOwotICBzdGF0aWMgY29uc3QgaW50IGtTdGF0dXNGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBzdGF0dXMoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3N0YXR1cyg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCB1aW50NjQgdG9rZW4gPSA0OwotICBpbmxpbmUgYm9vbCBoYXNfdG9rZW4oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdG9rZW4oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrVG9rZW5GaWVsZE51bWJlciA9IDQ7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCB0b2tlbigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfdG9rZW4oOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgdmFsdWUpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmNvbW11bmljYXRpb24uTXNnSGVhZGVyKQotIHByaXZhdGU6Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBjbWRfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBsZW5ndGhfZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHN0YXR1c187Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IHRva2VuXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfbXNnaGVhZGVyXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19tc2doZWFkZXJfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfbXNnaGVhZGVyXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDQgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIE1zZ0hlYWRlciogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gTXNnSGVhZGVyCi0KLS8vIHJlcXVpcmVkIHVpbnQzMiBjbWQgPSAxOwotaW5saW5lIGJvb2wgTXNnSGVhZGVyOjpoYXNfY21kKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBNc2dIZWFkZXI6OmNsZWFyX2NtZCgpIHsKLSAgY21kXyA9IDB1OwotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIE1zZ0hlYWRlcjo6Y21kKCkgY29uc3QgewotICByZXR1cm4gY21kXzsKLX0KLWlubGluZSB2b2lkIE1zZ0hlYWRlcjo6c2V0X2NtZCg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgY21kXyA9IHZhbHVlOwotfQotCi0vLyByZXF1aXJlZCB1aW50MzIgbGVuZ3RoX2RhdGEgPSAyOwotaW5saW5lIGJvb2wgTXNnSGVhZGVyOjpoYXNfbGVuZ3RoX2RhdGEoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgxKTsKLX0KLWlubGluZSB2b2lkIE1zZ0hlYWRlcjo6Y2xlYXJfbGVuZ3RoX2RhdGEoKSB7Ci0gIGxlbmd0aF9kYXRhXyA9IDB1OwotICBfY2xlYXJfYml0KDEpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIE1zZ0hlYWRlcjo6bGVuZ3RoX2RhdGEoKSBjb25zdCB7Ci0gIHJldHVybiBsZW5ndGhfZGF0YV87Ci19Ci1pbmxpbmUgdm9pZCBNc2dIZWFkZXI6OnNldF9sZW5ndGhfZGF0YSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgxKTsKLSAgbGVuZ3RoX2RhdGFfID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIHVpbnQzMiBzdGF0dXMgPSAzOwotaW5saW5lIGJvb2wgTXNnSGVhZGVyOjpoYXNfc3RhdHVzKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMik7Ci19Ci1pbmxpbmUgdm9pZCBNc2dIZWFkZXI6OmNsZWFyX3N0YXR1cygpIHsKLSAgc3RhdHVzXyA9IDB1OwotICBfY2xlYXJfYml0KDIpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIE1zZ0hlYWRlcjo6c3RhdHVzKCkgY29uc3QgewotICByZXR1cm4gc3RhdHVzXzsKLX0KLWlubGluZSB2b2lkIE1zZ0hlYWRlcjo6c2V0X3N0YXR1cyg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgyKTsKLSAgc3RhdHVzXyA9IHZhbHVlOwotfQotCi0vLyBvcHRpb25hbCB1aW50NjQgdG9rZW4gPSA0OwotaW5saW5lIGJvb2wgTXNnSGVhZGVyOjpoYXNfdG9rZW4oKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgzKTsKLX0KLWlubGluZSB2b2lkIE1zZ0hlYWRlcjo6Y2xlYXJfdG9rZW4oKSB7Ci0gIHRva2VuXyA9IEdPT0dMRV9VTE9OR0xPTkcoMCk7Ci0gIF9jbGVhcl9iaXQoMyk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgTXNnSGVhZGVyOjp0b2tlbigpIGNvbnN0IHsKLSAgcmV0dXJuIHRva2VuXzsKLX0KLWlubGluZSB2b2lkIE1zZ0hlYWRlcjo6c2V0X3Rva2VuKDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IHZhbHVlKSB7Ci0gIF9zZXRfYml0KDMpOwotICB0b2tlbl8gPSB2YWx1ZTsKLX0KLQotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQotCi19ICAvLyBuYW1lc3BhY2UgY29tbXVuaWNhdGlvbgotCi0jaWZuZGVmIFNXSUcKLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLSNlbmRpZiAgLy8gU1dJRwotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX21zZ2hlYWRlcl8yZXByb3RvX19JTkNMVURFRApkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9jcHAvcmlsLnBiLmNwcCBiL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvY3BwL3JpbC5wYi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OGViZmUuLjAwMDAwMDAKLS0tIGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9jcHAvcmlsLnBiLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcwMTcgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLQotI2RlZmluZSBJTlRFUk5BTF9TVVBQUkVTU19QUk9UT0JVRl9GSUVMRF9ERVBSRUNBVElPTgotI2luY2x1ZGUgInJpbC5wYi5oIgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCi0KLW5hbWVzcGFjZSByaWxfcHJvdG8gewotCi1uYW1lc3BhY2UgewotCi1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJpbEFwcFN0YXR1c19kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgUmlsQXBwU3RhdHVzX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUmlsQ2FyZFN0YXR1c19kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgUmlsQ2FyZFN0YXR1c19yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJpbFV1c0luZm9fZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIFJpbFV1c0luZm9fcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSaWxDYWxsX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBSaWxDYWxsX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUklMR1dTaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgUklMR1dTaWduYWxTdHJlbmd0aF9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJJTENETUFTaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUklMRVZET1NpZ25hbFN0cmVuZ3RoX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBSSUxFVkRPU2lnbmFsU3RyZW5ndGhfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSc3BTdHJpbmdzX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBSc3BTdHJpbmdzX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUnNwSW50ZWdlcnNfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIFJzcEludGVnZXJzX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUnNwR2V0U2ltU3RhdHVzX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBSc3BHZXRTaW1TdGF0dXNfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSZXFFbnRlclNpbVBpbl9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgUmVxRW50ZXJTaW1QaW5fcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSc3BFbnRlclNpbVBpbl9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgUnNwRW50ZXJTaW1QaW5fcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSc3BHZXRDdXJyZW50Q2FsbHNfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIFJzcEdldEN1cnJlbnRDYWxsc19yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJlcURpYWxfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIFJlcURpYWxfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSZXFIYW5nVXBfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIFJlcUhhbmdVcF9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJzcExhc3RDYWxsRmFpbENhdXNlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBSc3BMYXN0Q2FsbEZhaWxDYXVzZV9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJzcFNpZ25hbFN0cmVuZ3RoX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBSc3BTaWduYWxTdHJlbmd0aF9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJzcE9wZXJhdG9yX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBSc3BPcGVyYXRvcl9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJlcVNlcGFyYXRlQ29ubmVjdGlvbl9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgUmVxU2VwYXJhdGVDb25uZWN0aW9uX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUmVxU2V0TXV0ZV9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgUmVxU2V0TXV0ZV9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJlcVNjcmVlblN0YXRlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBSZXFTY3JlZW5TdGF0ZV9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBSYWRpb1N0YXRlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbENhcmRTdGF0ZV9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBSaWxQZXJzb1N1YnN0YXRlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbEFwcFN0YXRlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbFBpblN0YXRlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbEFwcFR5cGVfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogUmlsVXVzVHlwZV9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBSaWxVdXNEY3NfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogUmlsQ2FsbFN0YXRlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLQotdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX3JpbF8yZXByb3RvKCkgewotICBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3IqIGZpbGUgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPkZpbmRGaWxlQnlOYW1lKAotICAgICAgInJpbC5wcm90byIpOwotICBHT09HTEVfQ0hFQ0soZmlsZSAhPSBOVUxMKTsKLSAgUmlsQXBwU3RhdHVzX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDApOwotICBzdGF0aWMgY29uc3QgaW50IFJpbEFwcFN0YXR1c19vZmZzZXRzX1s4XSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJpbEFwcFN0YXR1cywgYXBwX3R5cGVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJpbEFwcFN0YXR1cywgYXBwX3N0YXRlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxBcHBTdGF0dXMsIHBlcnNvX3N1YnN0YXRlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxBcHBTdGF0dXMsIGFpZF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQXBwU3RhdHVzLCBhcHBfbGFiZWxfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJpbEFwcFN0YXR1cywgcGluMV9yZXBsYWNlZF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQXBwU3RhdHVzLCBwaW4xXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxBcHBTdGF0dXMsIHBpbjJfKSwKLSAgfTsKLSAgUmlsQXBwU3RhdHVzX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBSaWxBcHBTdGF0dXNfZGVzY3JpcHRvcl8sCi0gICAgICBSaWxBcHBTdGF0dXM6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUmlsQXBwU3RhdHVzX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxBcHBTdGF0dXMsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxBcHBTdGF0dXMsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSaWxBcHBTdGF0dXMpKTsKLSAgUmlsQ2FyZFN0YXR1c19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxKTsKLSAgc3RhdGljIGNvbnN0IGludCBSaWxDYXJkU3RhdHVzX29mZnNldHNfWzZdID0gewotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FyZFN0YXR1cywgY2FyZF9zdGF0ZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FyZFN0YXR1cywgdW5pdmVyc2FsX3Bpbl9zdGF0ZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FyZFN0YXR1cywgZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FyZFN0YXR1cywgY2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4XyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxDYXJkU3RhdHVzLCBudW1fYXBwbGljYXRpb25zXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxDYXJkU3RhdHVzLCBhcHBsaWNhdGlvbnNfKSwKLSAgfTsKLSAgUmlsQ2FyZFN0YXR1c19yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgUmlsQ2FyZFN0YXR1c19kZXNjcmlwdG9yXywKLSAgICAgIFJpbENhcmRTdGF0dXM6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUmlsQ2FyZFN0YXR1c19vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FyZFN0YXR1cywgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJpbENhcmRTdGF0dXMsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSaWxDYXJkU3RhdHVzKSk7Ci0gIFJpbFV1c0luZm9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMik7Ci0gIHN0YXRpYyBjb25zdCBpbnQgUmlsVXVzSW5mb19vZmZzZXRzX1s0XSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJpbFV1c0luZm8sIHV1c190eXBlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxVdXNJbmZvLCB1dXNfZGNzXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxVdXNJbmZvLCB1dXNfbGVuZ3RoXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxVdXNJbmZvLCB1dXNfZGF0YV8pLAotICB9OwotICBSaWxVdXNJbmZvX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBSaWxVdXNJbmZvX2Rlc2NyaXB0b3JfLAotICAgICAgUmlsVXVzSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBSaWxVdXNJbmZvX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxVdXNJbmZvLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsVXVzSW5mbywgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKFJpbFV1c0luZm8pKTsKLSAgUmlsQ2FsbF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgzKTsKLSAgc3RhdGljIGNvbnN0IGludCBSaWxDYWxsX29mZnNldHNfWzEzXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJpbENhbGwsIHN0YXRlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxDYWxsLCBpbmRleF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FsbCwgdG9hXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxDYWxsLCBpc19tcHR5XyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxDYWxsLCBpc19tdF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FsbCwgYWxzXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxDYWxsLCBpc192b2ljZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FsbCwgaXNfdm9pY2VfcHJpdmFjeV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FsbCwgbnVtYmVyXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxDYWxsLCBudW1iZXJfcHJlc2VudGF0aW9uXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxDYWxsLCBuYW1lXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSaWxDYWxsLCBuYW1lX3ByZXNlbnRhdGlvbl8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FsbCwgdXVzX2luZm9fKSwKLSAgfTsKLSAgUmlsQ2FsbF9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgUmlsQ2FsbF9kZXNjcmlwdG9yXywKLSAgICAgIFJpbENhbGw6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUmlsQ2FsbF9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmlsQ2FsbCwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJpbENhbGwsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSaWxDYWxsKSk7Ci0gIFJJTEdXU2lnbmFsU3RyZW5ndGhfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoNCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgUklMR1dTaWduYWxTdHJlbmd0aF9vZmZzZXRzX1syXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJJTEdXU2lnbmFsU3RyZW5ndGgsIHNpZ25hbF9zdHJlbmd0aF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUklMR1dTaWduYWxTdHJlbmd0aCwgYml0X2Vycm9yX3JhdGVfKSwKLSAgfTsKLSAgUklMR1dTaWduYWxTdHJlbmd0aF9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgUklMR1dTaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXywKLSAgICAgIFJJTEdXU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUklMR1dTaWduYWxTdHJlbmd0aF9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUklMR1dTaWduYWxTdHJlbmd0aCwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJJTEdXU2lnbmFsU3RyZW5ndGgsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSSUxHV1NpZ25hbFN0cmVuZ3RoKSk7Ci0gIFJJTENETUFTaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg1KTsKLSAgc3RhdGljIGNvbnN0IGludCBSSUxDRE1BU2lnbmFsU3RyZW5ndGhfb2Zmc2V0c19bMl0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSSUxDRE1BU2lnbmFsU3RyZW5ndGgsIGRibV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUklMQ0RNQVNpZ25hbFN0cmVuZ3RoLCBlY2lvXyksCi0gIH07Ci0gIFJJTENETUFTaWduYWxTdHJlbmd0aF9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoX2Rlc2NyaXB0b3JfLAotICAgICAgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIFJJTENETUFTaWduYWxTdHJlbmd0aF9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUklMQ0RNQVNpZ25hbFN0cmVuZ3RoLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUklMQ0RNQVNpZ25hbFN0cmVuZ3RoLCBfdW5rbm93bl9maWVsZHNfKSwKLSAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoUklMQ0RNQVNpZ25hbFN0cmVuZ3RoKSk7Ci0gIFJJTEVWRE9TaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg2KTsKLSAgc3RhdGljIGNvbnN0IGludCBSSUxFVkRPU2lnbmFsU3RyZW5ndGhfb2Zmc2V0c19bM10gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSSUxFVkRPU2lnbmFsU3RyZW5ndGgsIGRibV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUklMRVZET1NpZ25hbFN0cmVuZ3RoLCBlY2lvXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSSUxFVkRPU2lnbmFsU3RyZW5ndGgsIHNpZ25hbF9ub2lzZV9yYXRpb18pLAotICB9OwotICBSSUxFVkRPU2lnbmFsU3RyZW5ndGhfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJJTEVWRE9TaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXywKLSAgICAgIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBSSUxFVkRPU2lnbmFsU3RyZW5ndGhfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJJTEVWRE9TaWduYWxTdHJlbmd0aCwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJJTEVWRE9TaWduYWxTdHJlbmd0aCwgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKFJJTEVWRE9TaWduYWxTdHJlbmd0aCkpOwotICBSc3BTdHJpbmdzX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDcpOwotICBzdGF0aWMgY29uc3QgaW50IFJzcFN0cmluZ3Nfb2Zmc2V0c19bMV0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BTdHJpbmdzLCBzdHJpbmdzXyksCi0gIH07Ci0gIFJzcFN0cmluZ3NfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJzcFN0cmluZ3NfZGVzY3JpcHRvcl8sCi0gICAgICBSc3BTdHJpbmdzOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIFJzcFN0cmluZ3Nfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJzcFN0cmluZ3MsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BTdHJpbmdzLCBfdW5rbm93bl9maWVsZHNfKSwKLSAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoUnNwU3RyaW5ncykpOwotICBSc3BJbnRlZ2Vyc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg4KTsKLSAgc3RhdGljIGNvbnN0IGludCBSc3BJbnRlZ2Vyc19vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJzcEludGVnZXJzLCBpbnRlZ2Vyc18pLAotICB9OwotICBSc3BJbnRlZ2Vyc19yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgUnNwSW50ZWdlcnNfZGVzY3JpcHRvcl8sCi0gICAgICBSc3BJbnRlZ2Vyczo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBSc3BJbnRlZ2Vyc19vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUnNwSW50ZWdlcnMsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BJbnRlZ2VycywgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKFJzcEludGVnZXJzKSk7Ci0gIFJzcEdldFNpbVN0YXR1c19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg5KTsKLSAgc3RhdGljIGNvbnN0IGludCBSc3BHZXRTaW1TdGF0dXNfb2Zmc2V0c19bMV0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BHZXRTaW1TdGF0dXMsIGNhcmRfc3RhdHVzXyksCi0gIH07Ci0gIFJzcEdldFNpbVN0YXR1c19yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgUnNwR2V0U2ltU3RhdHVzX2Rlc2NyaXB0b3JfLAotICAgICAgUnNwR2V0U2ltU3RhdHVzOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIFJzcEdldFNpbVN0YXR1c19vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUnNwR2V0U2ltU3RhdHVzLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUnNwR2V0U2ltU3RhdHVzLCBfdW5rbm93bl9maWVsZHNfKSwKLSAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoUnNwR2V0U2ltU3RhdHVzKSk7Ci0gIFJlcUVudGVyU2ltUGluX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEwKTsKLSAgc3RhdGljIGNvbnN0IGludCBSZXFFbnRlclNpbVBpbl9vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcUVudGVyU2ltUGluLCBwaW5fKSwKLSAgfTsKLSAgUmVxRW50ZXJTaW1QaW5fcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJlcUVudGVyU2ltUGluX2Rlc2NyaXB0b3JfLAotICAgICAgUmVxRW50ZXJTaW1QaW46OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUmVxRW50ZXJTaW1QaW5fb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcUVudGVyU2ltUGluLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmVxRW50ZXJTaW1QaW4sIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSZXFFbnRlclNpbVBpbikpOwotICBSc3BFbnRlclNpbVBpbl9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxMSk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgUnNwRW50ZXJTaW1QaW5fb2Zmc2V0c19bMV0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BFbnRlclNpbVBpbiwgcmV0cmllc19yZW1haW5pbmdfKSwKLSAgfTsKLSAgUnNwRW50ZXJTaW1QaW5fcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJzcEVudGVyU2ltUGluX2Rlc2NyaXB0b3JfLAotICAgICAgUnNwRW50ZXJTaW1QaW46OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUnNwRW50ZXJTaW1QaW5fb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJzcEVudGVyU2ltUGluLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUnNwRW50ZXJTaW1QaW4sIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSc3BFbnRlclNpbVBpbikpOwotICBSc3BHZXRDdXJyZW50Q2FsbHNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTIpOwotICBzdGF0aWMgY29uc3QgaW50IFJzcEdldEN1cnJlbnRDYWxsc19vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJzcEdldEN1cnJlbnRDYWxscywgY2FsbHNfKSwKLSAgfTsKLSAgUnNwR2V0Q3VycmVudENhbGxzX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBSc3BHZXRDdXJyZW50Q2FsbHNfZGVzY3JpcHRvcl8sCi0gICAgICBSc3BHZXRDdXJyZW50Q2FsbHM6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUnNwR2V0Q3VycmVudENhbGxzX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BHZXRDdXJyZW50Q2FsbHMsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BHZXRDdXJyZW50Q2FsbHMsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSc3BHZXRDdXJyZW50Q2FsbHMpKTsKLSAgUmVxRGlhbF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxMyk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgUmVxRGlhbF9vZmZzZXRzX1szXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcURpYWwsIGFkZHJlc3NfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcURpYWwsIGNsaXJfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcURpYWwsIHV1c19pbmZvXyksCi0gIH07Ci0gIFJlcURpYWxfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJlcURpYWxfZGVzY3JpcHRvcl8sCi0gICAgICBSZXFEaWFsOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIFJlcURpYWxfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcURpYWwsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSZXFEaWFsLCBfdW5rbm93bl9maWVsZHNfKSwKLSAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoUmVxRGlhbCkpOwotICBSZXFIYW5nVXBfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTQpOwotICBzdGF0aWMgY29uc3QgaW50IFJlcUhhbmdVcF9vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcUhhbmdVcCwgY29ubmVjdGlvbl9pbmRleF8pLAotICB9OwotICBSZXFIYW5nVXBfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJlcUhhbmdVcF9kZXNjcmlwdG9yXywKLSAgICAgIFJlcUhhbmdVcDo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBSZXFIYW5nVXBfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcUhhbmdVcCwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcUhhbmdVcCwgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKFJlcUhhbmdVcCkpOwotICBSc3BMYXN0Q2FsbEZhaWxDYXVzZV9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNSk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgUnNwTGFzdENhbGxGYWlsQ2F1c2Vfb2Zmc2V0c19bMV0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BMYXN0Q2FsbEZhaWxDYXVzZSwgbGFzdF9jYWxsX2ZhaWxfY2F1c2VfKSwKLSAgfTsKLSAgUnNwTGFzdENhbGxGYWlsQ2F1c2VfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJzcExhc3RDYWxsRmFpbENhdXNlX2Rlc2NyaXB0b3JfLAotICAgICAgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUnNwTGFzdENhbGxGYWlsQ2F1c2Vfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJzcExhc3RDYWxsRmFpbENhdXNlLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUnNwTGFzdENhbGxGYWlsQ2F1c2UsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSc3BMYXN0Q2FsbEZhaWxDYXVzZSkpOwotICBSc3BTaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNik7Ci0gIHN0YXRpYyBjb25zdCBpbnQgUnNwU2lnbmFsU3RyZW5ndGhfb2Zmc2V0c19bM10gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BTaWduYWxTdHJlbmd0aCwgZ3dfc2lnbmFsc3RyZW5ndGhfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJzcFNpZ25hbFN0cmVuZ3RoLCBjZG1hX3NpZ25hbHN0cmVuZ3RoXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BTaWduYWxTdHJlbmd0aCwgZXZkb19zaWduYWxzdHJlbmd0aF8pLAotICB9OwotICBSc3BTaWduYWxTdHJlbmd0aF9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgUnNwU2lnbmFsU3RyZW5ndGhfZGVzY3JpcHRvcl8sCi0gICAgICBSc3BTaWduYWxTdHJlbmd0aDo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBSc3BTaWduYWxTdHJlbmd0aF9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUnNwU2lnbmFsU3RyZW5ndGgsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSc3BTaWduYWxTdHJlbmd0aCwgX3Vua25vd25fZmllbGRzXyksCi0gICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKFJzcFNpZ25hbFN0cmVuZ3RoKSk7Ci0gIFJzcE9wZXJhdG9yX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDE3KTsKLSAgc3RhdGljIGNvbnN0IGludCBSc3BPcGVyYXRvcl9vZmZzZXRzX1szXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJzcE9wZXJhdG9yLCBsb25nX2FscGhhX29uc18pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUnNwT3BlcmF0b3IsIHNob3J0X2FscGhhX29uc18pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUnNwT3BlcmF0b3IsIG1jY19tbmNfKSwKLSAgfTsKLSAgUnNwT3BlcmF0b3JfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJzcE9wZXJhdG9yX2Rlc2NyaXB0b3JfLAotICAgICAgUnNwT3BlcmF0b3I6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUnNwT3BlcmF0b3Jfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJzcE9wZXJhdG9yLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUnNwT3BlcmF0b3IsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSc3BPcGVyYXRvcikpOwotICBSZXFTZXBhcmF0ZUNvbm5lY3Rpb25fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTgpOwotICBzdGF0aWMgY29uc3QgaW50IFJlcVNlcGFyYXRlQ29ubmVjdGlvbl9vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcVNlcGFyYXRlQ29ubmVjdGlvbiwgaW5kZXhfKSwKLSAgfTsKLSAgUmVxU2VwYXJhdGVDb25uZWN0aW9uX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBSZXFTZXBhcmF0ZUNvbm5lY3Rpb25fZGVzY3JpcHRvcl8sCi0gICAgICBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUmVxU2VwYXJhdGVDb25uZWN0aW9uX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSZXFTZXBhcmF0ZUNvbm5lY3Rpb24sIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSZXFTZXBhcmF0ZUNvbm5lY3Rpb24sIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSZXFTZXBhcmF0ZUNvbm5lY3Rpb24pKTsKLSAgUmVxU2V0TXV0ZV9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxOSk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgUmVxU2V0TXV0ZV9vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcVNldE11dGUsIHN0YXRlXyksCi0gIH07Ci0gIFJlcVNldE11dGVfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJlcVNldE11dGVfZGVzY3JpcHRvcl8sCi0gICAgICBSZXFTZXRNdXRlOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIFJlcVNldE11dGVfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcVNldE11dGUsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSZXFTZXRNdXRlLCBfdW5rbm93bl9maWVsZHNfKSwKLSAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoUmVxU2V0TXV0ZSkpOwotICBSZXFTY3JlZW5TdGF0ZV9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgyMCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgUmVxU2NyZWVuU3RhdGVfb2Zmc2V0c19bMV0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChSZXFTY3JlZW5TdGF0ZSwgc3RhdGVfKSwKLSAgfTsKLSAgUmVxU2NyZWVuU3RhdGVfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFJlcVNjcmVlblN0YXRlX2Rlc2NyaXB0b3JfLAotICAgICAgUmVxU2NyZWVuU3RhdGU6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgUmVxU2NyZWVuU3RhdGVfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFJlcVNjcmVlblN0YXRlLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoUmVxU2NyZWVuU3RhdGUsIF91bmtub3duX2ZpZWxkc18pLAotICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihSZXFTY3JlZW5TdGF0ZSkpOwotICBSYWRpb1N0YXRlX2Rlc2NyaXB0b3JfID0gZmlsZS0+ZW51bV90eXBlKDApOwotICBSaWxDYXJkU3RhdGVfZGVzY3JpcHRvcl8gPSBmaWxlLT5lbnVtX3R5cGUoMSk7Ci0gIFJpbFBlcnNvU3Vic3RhdGVfZGVzY3JpcHRvcl8gPSBmaWxlLT5lbnVtX3R5cGUoMik7Ci0gIFJpbEFwcFN0YXRlX2Rlc2NyaXB0b3JfID0gZmlsZS0+ZW51bV90eXBlKDMpOwotICBSaWxQaW5TdGF0ZV9kZXNjcmlwdG9yXyA9IGZpbGUtPmVudW1fdHlwZSg0KTsKLSAgUmlsQXBwVHlwZV9kZXNjcmlwdG9yXyA9IGZpbGUtPmVudW1fdHlwZSg1KTsKLSAgUmlsVXVzVHlwZV9kZXNjcmlwdG9yXyA9IGZpbGUtPmVudW1fdHlwZSg2KTsKLSAgUmlsVXVzRGNzX2Rlc2NyaXB0b3JfID0gZmlsZS0+ZW51bV90eXBlKDcpOwotICBSaWxDYWxsU3RhdGVfZGVzY3JpcHRvcl8gPSBmaWxlLT5lbnVtX3R5cGUoOCk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLUdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UocHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8pOwotaW5saW5lIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCZwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc19vbmNlXywKLSAgICAgICAgICAgICAgICAgJnByb3RvYnVmX0Fzc2lnbkRlc2NfcmlsXzJlcHJvdG8pOwotfQotCi12b2lkIHByb3RvYnVmX1JlZ2lzdGVyVHlwZXMoY29uc3QgOjpzdGQ6OnN0cmluZyYpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFJpbEFwcFN0YXR1c19kZXNjcmlwdG9yXywgJlJpbEFwcFN0YXR1czo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgUmlsQ2FyZFN0YXR1c19kZXNjcmlwdG9yXywgJlJpbENhcmRTdGF0dXM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFJpbFV1c0luZm9fZGVzY3JpcHRvcl8sICZSaWxVdXNJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBSaWxDYWxsX2Rlc2NyaXB0b3JfLCAmUmlsQ2FsbDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgUklMR1dTaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXywgJlJJTEdXU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFJJTENETUFTaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXywgJlJJTENETUFTaWduYWxTdHJlbmd0aDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgUklMRVZET1NpZ25hbFN0cmVuZ3RoX2Rlc2NyaXB0b3JfLCAmUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBSc3BTdHJpbmdzX2Rlc2NyaXB0b3JfLCAmUnNwU3RyaW5nczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgUnNwSW50ZWdlcnNfZGVzY3JpcHRvcl8sICZSc3BJbnRlZ2Vyczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgUnNwR2V0U2ltU3RhdHVzX2Rlc2NyaXB0b3JfLCAmUnNwR2V0U2ltU3RhdHVzOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBSZXFFbnRlclNpbVBpbl9kZXNjcmlwdG9yXywgJlJlcUVudGVyU2ltUGluOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBSc3BFbnRlclNpbVBpbl9kZXNjcmlwdG9yXywgJlJzcEVudGVyU2ltUGluOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBSc3BHZXRDdXJyZW50Q2FsbHNfZGVzY3JpcHRvcl8sICZSc3BHZXRDdXJyZW50Q2FsbHM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFJlcURpYWxfZGVzY3JpcHRvcl8sICZSZXFEaWFsOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBSZXFIYW5nVXBfZGVzY3JpcHRvcl8sICZSZXFIYW5nVXA6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFJzcExhc3RDYWxsRmFpbENhdXNlX2Rlc2NyaXB0b3JfLCAmUnNwTGFzdENhbGxGYWlsQ2F1c2U6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFJzcFNpZ25hbFN0cmVuZ3RoX2Rlc2NyaXB0b3JfLCAmUnNwU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFJzcE9wZXJhdG9yX2Rlc2NyaXB0b3JfLCAmUnNwT3BlcmF0b3I6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFJlcVNlcGFyYXRlQ29ubmVjdGlvbl9kZXNjcmlwdG9yXywgJlJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgUmVxU2V0TXV0ZV9kZXNjcmlwdG9yXywgJlJlcVNldE11dGU6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFJlcVNjcmVlblN0YXRlX2Rlc2NyaXB0b3JfLCAmUmVxU2NyZWVuU3RhdGU6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9yaWxfMmVwcm90bygpIHsKLSAgZGVsZXRlIFJpbEFwcFN0YXR1czo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBSaWxBcHBTdGF0dXNfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBSaWxDYXJkU3RhdHVzOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJpbENhcmRTdGF0dXNfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBSaWxVdXNJbmZvOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJpbFV1c0luZm9fcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBSaWxDYWxsOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJpbENhbGxfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJJTEdXU2lnbmFsU3RyZW5ndGhfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoX3JlZmxlY3Rpb25fOwotICBkZWxldGUgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJJTEVWRE9TaWduYWxTdHJlbmd0aF9yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIFJzcFN0cmluZ3M6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgUnNwU3RyaW5nc19yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIFJzcEludGVnZXJzOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJzcEludGVnZXJzX3JlZmxlY3Rpb25fOwotICBkZWxldGUgUnNwR2V0U2ltU3RhdHVzOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJzcEdldFNpbVN0YXR1c19yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIFJlcUVudGVyU2ltUGluOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJlcUVudGVyU2ltUGluX3JlZmxlY3Rpb25fOwotICBkZWxldGUgUnNwRW50ZXJTaW1QaW46OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgUnNwRW50ZXJTaW1QaW5fcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBSc3BHZXRDdXJyZW50Q2FsbHM6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgUnNwR2V0Q3VycmVudENhbGxzX3JlZmxlY3Rpb25fOwotICBkZWxldGUgUmVxRGlhbDo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBSZXFEaWFsX3JlZmxlY3Rpb25fOwotICBkZWxldGUgUmVxSGFuZ1VwOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJlcUhhbmdVcF9yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIFJzcExhc3RDYWxsRmFpbENhdXNlOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJzcExhc3RDYWxsRmFpbENhdXNlX3JlZmxlY3Rpb25fOwotICBkZWxldGUgUnNwU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgUnNwU2lnbmFsU3RyZW5ndGhfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBSc3BPcGVyYXRvcjo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBSc3BPcGVyYXRvcl9yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIFJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBSZXFTZXBhcmF0ZUNvbm5lY3Rpb25fcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBSZXFTZXRNdXRlOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFJlcVNldE11dGVfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBSZXFTY3JlZW5TdGF0ZTo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBSZXFTY3JlZW5TdGF0ZV9yZWZsZWN0aW9uXzsKLX0KLQotdm9pZCBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCkgewotICBzdGF0aWMgYm9vbCBhbHJlYWR5X2hlcmUgPSBmYWxzZTsKLSAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuOwotICBhbHJlYWR5X2hlcmUgPSB0cnVlOwotICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6SW50ZXJuYWxBZGRHZW5lcmF0ZWRGaWxlKAotICAgICJcblx0cmlsLnByb3RvXDAyMlx0cmlsX3Byb3RvXCJcMjMyXDAwMlxuXDAxNFJpbEFwcFN0YXR1c1wwMjIiCi0gICAgIlwnXG5cMDEwYXBwX3R5cGVcMDMwXDAwMSBcMDAxKFwwMTYyXDAyNS5yaWxfcHJvdG8uUmlsQXBwVHlwZSIKLSAgICAiXDAyMilcblx0YXBwX3N0YXRlXDAzMFwwMDIgXDAwMShcMDE2MlwwMjYucmlsX3Byb3RvLlJpbEFwcFN0IgotICAgICJhdGVcMDIyM1xuXDAxNnBlcnNvX3N1YnN0YXRlXDAzMFwwMDMgXDAwMShcMDE2MlwwMzMucmlsX3Byb3RvLiIKLSAgICAiUmlsUGVyc29TdWJzdGF0ZVwwMjJcMDEzXG5cMDAzYWlkXDAzMFwwMDQgXDAwMShcdFwwMjJcMDIxXG5cdGFwcF9sYWIiCi0gICAgImVsXDAzMFwwMDUgXDAwMShcdFwwMjJcMDI1XG5ccnBpbjFfcmVwbGFjZWRcMDMwXDAwNiBcMDAxKFwwMDVcMDIyJFxuXDAwNHBpbjFcMDMwIgotICAgICJcMDA3IFwwMDEoXDAxNjJcMDI2LnJpbF9wcm90by5SaWxQaW5TdGF0ZVwwMjIkXG5cMDA0cGluMlwwMzBcMDEwICIKLSAgICAiXDAwMShcMDE2MlwwMjYucmlsX3Byb3RvLlJpbFBpblN0YXRlXCJcMjEwXDAwMlxuXHJSaWxDYXJkUyIKLSAgICAidGF0dXNcMDIyK1xuXG5jYXJkX3N0YXRlXDAzMFwwMDEgXDAwMShcMDE2MlwwMjcucmlsX3Byb3RvLlJpIgotICAgICJsQ2FyZFN0YXRlXDAyMjNcblwwMjN1bml2ZXJzYWxfcGluX3N0YXRlXDAzMFwwMDIgXDAwMShcMDE2MiIKLSAgICAiXDAyNi5yaWxfcHJvdG8uUmlsUGluU3RhdGVcMDIyXCdcblwwMzdnc21fdW10c19zdWJzIgotICAgICJjcmlwdGlvbl9hcHBfaW5kZXhcMDMwXDAwMyBcMDAxKFwwMDVcMDIyI1xuXDAzM2NkbWFfc3Vic2NyaSIKLSAgICAicHRpb25fYXBwX2luZGV4XDAzMFwwMDQgXDAwMShcMDA1XDAyMlwwMzBcblwwMjBudW1fYXBwbGljYXRpb24iCi0gICAgInNcMDMwXDAwNSBcMDAxKFwwMDVcMDIyLVxuXDAxNGFwcGxpY2F0aW9uc1wwMzBcMDA2IFwwMDMoXDAxMzJcMDI3LnJpbF9wcm90IgotICAgICJvLlJpbEFwcFN0YXR1c1wiXDIwMlwwMDFcblxuUmlsVXVzSW5mb1wwMjJcJ1xuXDAxMHV1c190eXAiCi0gICAgImVcMDMwXDAwMSBcMDAxKFwwMTYyXDAyNS5yaWxfcHJvdG8uUmlsVXVzVHlwZVwwMjIlXG5cMDA3dXVzX2RjIgotICAgICJzXDAzMFwwMDIgXDAwMShcMDE2MlwwMjQucmlsX3Byb3RvLlJpbFV1c0Rjc1wwMjJcMDIyXG5cbnV1c19sZW4iCi0gICAgImd0aFwwMzBcMDAzIFwwMDEoXDAwNVwwMjJcMDIwXG5cMDEwdXVzX2RhdGFcMDMwXDAwNCBcMDAxKFx0XCJcMjQ1XDAwMlxuXDAwN1JpbENhbGxcMDIyIgotICAgICImXG5cMDA1c3RhdGVcMDMwXDAwMSBcMDAxKFwwMTYyXDAyNy5yaWxfcHJvdG8uUmlsQ2FsbFN0YXRlXDAyMiIKLSAgICAiXHJcblwwMDVpbmRleFwwMzBcMDAyIFwwMDEoXDAwNVwwMjJcMDEzXG5cMDAzdG9hXDAzMFwwMDMgXDAwMShcMDA1XDAyMlwwMTdcblwwMDdpc19tcHR5XDAzMFwwMDQiCi0gICAgIiBcMDAxKFwwMTBcMDIyXHJcblwwMDVpc19tdFwwMzBcMDA1IFwwMDEoXDAxMFwwMjJcMDEzXG5cMDAzYWxzXDAzMFwwMDYgXDAwMShcMDA1XDAyMlwwMjBcblwwMTBpc192IgotICAgICJvaWNlXDAzMFwwMDcgXDAwMShcMDEwXDAyMlwwMzBcblwwMjBpc192b2ljZV9wcml2YWN5XDAzMFwwMTAgXDAwMShcMDEwXDAyMlwwMTZcblwwMDYiCi0gICAgIm51bWJlclwwMzBcdCBcMDAxKFx0XDAyMlwwMzNcblwwMjNudW1iZXJfcHJlc2VudGF0aW9uXDAzMFxuIFwwMDEoIgotICAgICJcMDA1XDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMTMgXDAwMShcdFwwMjJcMDMxXG5cMDIxbmFtZV9wcmVzZW50YXRpb25cMDMwXDAxNCBcMDAxIgotICAgICIoXDAwNVwwMjJcJ1xuXDAxMHV1c19pbmZvXDAzMFxyIFwwMDEoXDAxMzJcMDI1LnJpbF9wcm90by5SaWxVdXNJIgotICAgICJuZm9cIkZcblwwMjNSSUxHV1NpZ25hbFN0cmVuZ3RoXDAyMlwwMjdcblwwMTdzaWduYWxfc3RyIgotICAgICJlbmd0aFwwMzBcMDAxIFwwMDEoXDAwNVwwMjJcMDI2XG5cMDE2Yml0X2Vycm9yX3JhdGVcMDMwXDAwMiBcMDAxKFwwMDVcIjJcblwwMjVSIgotICAgICJJTENETUFTaWduYWxTdHJlbmd0aFwwMjJcMDEzXG5cMDAzZGJtXDAzMFwwMDEgXDAwMShcMDA1XDAyMlwwMTRcblwwMDRlY2kiCi0gICAgIm9cMDMwXDAwMiBcMDAxKFwwMDVcIk5cblwwMjVSSUxFVkRPU2lnbmFsU3RyZW5ndGhcMDIyXDAxM1xuXDAwM2RibVwwMzAiCi0gICAgIlwwMDEgXDAwMShcMDA1XDAyMlwwMTRcblwwMDRlY2lvXDAzMFwwMDIgXDAwMShcMDA1XDAyMlwwMzJcblwwMjJzaWduYWxfbm9pc2VfcmF0aSIKLSAgICAib1wwMzBcMDAzIFwwMDEoXDAwNVwiXDAzNVxuXG5Sc3BTdHJpbmdzXDAyMlwwMTdcblwwMDdzdHJpbmdzXDAzMFwwMDEgXDAwMyhcdFwiXDAzNyIKLSAgICAiXG5cMDEzUnNwSW50ZWdlcnNcMDIyXDAyMFxuXDAxMGludGVnZXJzXDAzMFwwMDEgXDAwMyhcMDA1XCJAXG5cMDE3UnNwR2UiCi0gICAgInRTaW1TdGF0dXNcMDIyLVxuXDAxM2NhcmRfc3RhdHVzXDAzMFwwMDEgXDAwMihcMDEzMlwwMzAucmlsX3ByIgotICAgICJvdG8uUmlsQ2FyZFN0YXR1c1wiXDAzNVxuXDAxNlJlcUVudGVyU2ltUGluXDAyMlwwMTNcblwwMDNwIgotICAgICJpblwwMzBcMDAxIFwwMDIoXHRcIitcblwwMTZSc3BFbnRlclNpbVBpblwwMjJcMDMxXG5cMDIxcmV0cmllc19yZSIKLSAgICAibWFpbmluZ1wwMzBcMDAxIFwwMDIoXDAwNVwiN1xuXDAyMlJzcEdldEN1cnJlbnRDYWxsc1wwMjIhXG5cMDA1YyIKLSAgICAiYWxsc1wwMzBcMDAxIFwwMDMoXDAxMzJcMDIyLnJpbF9wcm90by5SaWxDYWxsXCJRXG5cMDA3UmVxRGlhIgotICAgICJsXDAyMlwwMTdcblwwMDdhZGRyZXNzXDAzMFwwMDEgXDAwMShcdFwwMjJcMDE0XG5cMDA0Y2xpclwwMzBcMDAyIFwwMDEoXDAwNVwwMjJcJ1xuXDAxMHV1c18iCi0gICAgImluZm9cMDMwXDAwMyBcMDAxKFwwMTMyXDAyNS5yaWxfcHJvdG8uUmlsVXVzSW5mb1wiJVxuXHRSZXEiCi0gICAgIkhhbmdVcFwwMjJcMDMwXG5cMDIwY29ubmVjdGlvbl9pbmRleFwwMzBcMDAxIFwwMDIoXDAwNVwiNFxuXDAyNFJzcEwiCi0gICAgImFzdENhbGxGYWlsQ2F1c2VcMDIyXDAzNFxuXDAyNGxhc3RfY2FsbF9mYWlsX2NhdXNlIgotICAgICJcMDMwXDAwMSBcMDAyKFwwMDVcIlwzMTRcMDAxXG5cMDIxUnNwU2lnbmFsU3RyZW5ndGhcMDIyOVxuXDAyMWd3X3NpZ25hIgotICAgICJsc3RyZW5ndGhcMDMwXDAwMSBcMDAxKFwwMTMyXDAzNi5yaWxfcHJvdG8uUklMR1dTaWduYWxTIgotICAgICJ0cmVuZ3RoXDAyMj1cblwwMjNjZG1hX3NpZ25hbHN0cmVuZ3RoXDAzMFwwMDIgXDAwMShcMDEzMiAuciIKLSAgICAiaWxfcHJvdG8uUklMQ0RNQVNpZ25hbFN0cmVuZ3RoXDAyMj1cblwwMjNldmRvX3MiCi0gICAgImlnbmFsc3RyZW5ndGhcMDMwXDAwMyBcMDAxKFwwMTMyIC5yaWxfcHJvdG8uUklMRVZET1MiCi0gICAgImlnbmFsU3RyZW5ndGhcIk9cblwwMTNSc3BPcGVyYXRvclwwMjJcMDI2XG5cMDE2bG9uZ19hbHAiCi0gICAgImhhX29uc1wwMzBcMDAxIFwwMDEoXHRcMDIyXDAyN1xuXDAxN3Nob3J0X2FscGhhX29uc1wwMzBcMDAyIFwwMDEoXHRcMDIyXDAxN1xuIgotICAgICJcMDA3bWNjX21uY1wwMzBcMDAzIFwwMDEoXHRcIiZcblwwMjVSZXFTZXBhcmF0ZUNvbm5lY3Rpb25cMDIyIgotICAgICJcclxuXDAwNWluZGV4XDAzMFwwMDEgXDAwMihcMDA1XCJcMDMzXG5cblJlcVNldE11dGVcMDIyXHJcblwwMDVzdGF0ZVwwMzBcMDAxICIKLSAgICAiXDAwMihcMDEwXCJcMDM3XG5cMDE2UmVxU2NyZWVuU3RhdGVcMDIyXHJcblwwMDVzdGF0ZVwwMzBcMDAxIFwwMDIoXDAxMCpcMjU3XDAwMlxuIgotICAgICJcblJhZGlvU3RhdGVcMDIyXDAyMlxuXDAxNlJBRElPU1RBVEVfT0ZGXDAyMFwwMDBcMDIyXDAzMlxuXDAyNlJBRElPIgotICAgICJTVEFURV9VTkFWQUlMQUJMRVwwMjBcMDAxXDAyMlwwMzRcblwwMzBSQURJT1NUQVRFX1NJTV9OTyIKLSAgICAiVF9SRUFEWVwwMjBcMDAyXDAyMiNcblwwMzdSQURJT1NUQVRFX1NJTV9MT0NLRURfT1JfQUIiCi0gICAgIlNFTlRcMDIwXDAwM1wwMjJcMDMwXG5cMDI0UkFESU9TVEFURV9TSU1fUkVBRFlcMDIwXDAwNFwwMjJcMDM1XG5cMDMxUkFESSIKLSAgICAiT1NUQVRFX1JVSU1fTk9UX1JFQURZXDAyMFwwMDVcMDIyXDAzMVxuXDAyNVJBRElPU1RBVEVfUlUiCi0gICAgIklNX1JFQURZXDAyMFwwMDZcMDIyJFxuIFJBRElPU1RBVEVfUlVJTV9MT0NLRURfT1JfIgotICAgICJBQlNFTlRcMDIwXDAwN1wwMjJcMDMzXG5cMDI3UkFESU9TVEFURV9OVl9OT1RfUkVBRFlcMDIwXDAxMFwwMjJcMDI3XG4iCi0gICAgIlwwMjNSQURJT1NUQVRFX05WX1JFQURZXDAyMFx0KlBcblwwMTRSaWxDYXJkU3RhdGVcMDIyXDAyNCIKLSAgICAiXG5cMDIwQ0FSRFNUQVRFX0FCU0VOVFwwMjBcMDAwXDAyMlwwMjVcblwwMjFDQVJEU1RBVEVfUFJFU0VOIgotICAgICJUXDAyMFwwMDFcMDIyXDAyM1xuXDAxN0NBUkRTVEFURV9FUlJPUlwwMjBcMDAyKlwzNjFcMDA2XG5cMDIwUmlsUGVyc29TdWIiCi0gICAgInN0YXRlXDAyMlwwMzFcblwwMjVQRVJTT1NVQlNUQVRFX1VOS05PV05cMDIwXDAwMFwwMjJcMDM1XG5cMDMxUEVSUyIKLSAgICAiT1NVQlNUQVRFX0lOX1BST0dSRVNTXDAyMFwwMDFcMDIyXDAyN1xuXDAyM1BFUlNPU1VCU1RBVEUiCi0gICAgIl9SRUFEWVwwMjBcMDAyXDAyMlwwMzVcblwwMzFQRVJTT1NVQlNUQVRFX1NJTV9ORVRXT1JLXDAyMFwwMDNcMDIyIgotICAgICIkXG4gUEVSU09TVUJTVEFURV9TSU1fTkVUV09SS19TVUJTRVRcMDIwXDAwNFwwMjJcMDM3XG4iCi0gICAgIlwwMzNQRVJTT1NVQlNUQVRFX1NJTV9DT1JQT1JBVEVcMDIwXDAwNVwwMjImXG5cIlBFUlNPUyIKLSAgICAiVUJTVEFURV9TSU1fU0VSVklDRV9QUk9WSURFUlwwMjBcMDA2XDAyMlwwMzFcblwwMjVQRVJTT1MiCi0gICAgIlVCU1RBVEVfU0lNX1NJTVwwMjBcMDA3XDAyMiFcblwwMzVQRVJTT1NVQlNUQVRFX1NJTV9OIgotICAgICJFVFdPUktfUFVLXDAyMFwwMTBcMDIyKFxuJFBFUlNPU1VCU1RBVEVfU0lNX05FVFdPUiIKLSAgICAiS19TVUJTRVRfUFVLXDAyMFx0XDAyMiNcblwwMzdQRVJTT1NVQlNUQVRFX1NJTV9DT1JQIgotICAgICJPUkFURV9QVUtcMDIwXG5cMDIyKlxuJlBFUlNPU1VCU1RBVEVfU0lNX1NFUlZJQ0UiCi0gICAgIl9QUk9WSURFUl9QVUtcMDIwXDAxM1wwMjJcMDM1XG5cMDMxUEVSU09TVUJTVEFURV9TSU1fU0lNIgotICAgICJfUFVLXDAyMFwwMTRcMDIyXDAzN1xuXDAzM1BFUlNPU1VCU1RBVEVfUlVJTV9ORVRXT1JLMVwwMjBcclwwMjIiCi0gICAgIlwwMzdcblwwMzNQRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzJcMDIwXDAxNlwwMjJcMDMzXG5cMDI3UEVSUyIKLSAgICAiT1NVQlNUQVRFX1JVSU1fSFJQRFwwMjBcMDE3XDAyMiBcblwwMzRQRVJTT1NVQlNUQVRFX1IiCi0gICAgIlVJTV9DT1JQT1JBVEVcMDIwXDAyMFwwMjJcJ1xuI1BFUlNPU1VCU1RBVEVfUlVJTV9TRSIKLSAgICAiUlZJQ0VfUFJPVklERVJcMDIwXDAyMVwwMjJcMDMzXG5cMDI3UEVSU09TVUJTVEFURV9SVUlNX1IiCi0gICAgIlVJTVwwMjBcMDIyXDAyMiNcblwwMzdQRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzFfUFVLIgotICAgICJcMDIwXDAyM1wwMjIjXG5cMDM3UEVSU09TVUJTVEFURV9SVUlNX05FVFdPUksyX1BVS1wwMjBcMDI0XDAyMiIKLSAgICAiXDAzN1xuXDAzM1BFUlNPU1VCU1RBVEVfUlVJTV9IUlBEX1BVS1wwMjBcMDI1XDAyMiRcbiBQRVJTIgotICAgICJPU1VCU1RBVEVfUlVJTV9DT1JQT1JBVEVfUFVLXDAyMFwwMjZcMDIyK1xuXCdQRVJTT1MiCi0gICAgIlVCU1RBVEVfUlVJTV9TRVJWSUNFX1BST1ZJREVSX1BVS1wwMjBcMDI3XDAyMlwwMzdcblwwMzNQIgotICAgICJFUlNPU1VCU1RBVEVfUlVJTV9SVUlNX1BVS1wwMjBcMDMwKlwyMjNcMDAxXG5cMDEzUmlsQXBwUyIKLSAgICAidGF0ZVwwMjJcMDI0XG5cMDIwQVBQU1RBVEVfVU5LTk9XTlwwMjBcMDAwXDAyMlwwMjVcblwwMjFBUFBTVEFURV9EIgotICAgICJFVEVDVEVEXDAyMFwwMDFcMDIyXDAyMFxuXDAxNEFQUFNUQVRFX1BJTlwwMjBcMDAyXDAyMlwwMjBcblwwMTRBUFBTVEFURV8iCi0gICAgIlBVS1wwMjBcMDAzXDAyMlwwMzdcblwwMzNBUFBTVEFURV9TVUJTQ1JJUFRJT05fUEVSU09cMDIwXDAwNFwwMjJcMDIyIgotICAgICJcblwwMTZBUFBTVEFURV9SRUFEWVwwMjBcMDA1KlwyNzVcMDAxXG5cMDEzUmlsUGluU3RhdGVcMDIyXDAyNFxuXDAyMFBJIgotICAgICJOU1RBVEVfVU5LTk9XTlwwMjBcMDAwXDAyMiFcblwwMzVQSU5TVEFURV9FTkFCTEVEX05PVCIKLSAgICAiX1ZFUklGSUVEXDAyMFwwMDFcMDIyXDAzNVxuXDAzMVBJTlNUQVRFX0VOQUJMRURfVkVSSUZJRUQiCi0gICAgIlwwMjBcMDAyXDAyMlwwMjVcblwwMjFQSU5TVEFURV9ESVNBQkxFRFwwMjBcMDAzXDAyMlwwMzRcblwwMzBQSU5TVEFURV9FTiIKLSAgICAiQUJMRURfQkxPQ0tFRFwwMjBcMDA0XDAyMiFcblwwMzVQSU5TVEFURV9FTkFCTEVEX1BFUk0iCi0gICAgIl9CTE9DS0VEXDAyMFwwMDUqaFxuXG5SaWxBcHBUeXBlXDAyMlwwMjNcblwwMTdBUFBUWVBFX1VOS04iCi0gICAgIk9XTlwwMjBcMDAwXDAyMlwwMTdcblwwMTNBUFBUWVBFX1NJTVwwMjBcMDAxXDAyMlwwMjBcblwwMTRBUFBUWVBFX1VTSU1cMDIwXDAwMiIKLSAgICAiXDAyMlwwMjBcblwwMTRBUFBUWVBFX1JVSU1cMDIwXDAwM1wwMjJcMDIwXG5cMDE0QVBQVFlQRV9DU0lNXDAyMFwwMDQqXDMxNlwwMDFcbiIKLSAgICAiXG5SaWxVdXNUeXBlXDAyMlwwMzBcblwwMjRSSUxVVVNUWVBFMV9JTVBMSUNJVFwwMjBcMDAwXDAyMlwwMzBcbiIKLSAgICAiXDAyNFJJTFVVU1RZUEUxX1JFUVVJUkVEXDAyMFwwMDFcMDIyXDAzNFxuXDAzMFJJTFVVU1RZUEUxX04iCi0gICAgIk9UX1JFUVVJUkVEXDAyMFwwMDJcMDIyXDAzMFxuXDAyNFJJTFVVU1RZUEUyX1JFUVVJUkVEXDAyMFwwMDNcMDIyIgotICAgICJcMDM0XG5cMDMwUklMVVVTVFlQRTJfTk9UX1JFUVVJUkVEXDAyMFwwMDRcMDIyXDAzMFxuXDAyNFJJTFVVU1QiCi0gICAgIllQRTNfUkVRVUlSRURcMDIwXDAwNVwwMjJcMDM0XG5cMDMwUklMVVVTVFlQRTNfTk9UX1JFUVVJIgotICAgICJSRURcMDIwXDAwNipwXG5cdFJpbFV1c0Rjc1wwMjJcMDIxXG5cclJJTFVVU0RDU19VU1BcMDIwXDAwMFwwMjJcMDI0XG4iCi0gICAgIlwwMjBSSUxVVVNEQ1NfT1NJSExQXDAyMFwwMDFcMDIyXDAyMlxuXDAxNlJJTFVVU0RDU19YMjQ0XDAyMFwwMDJcMDIyIgotICAgICJcMDIyXG5cMDE2UklMVVVTRENTX1JNQ0ZcMDIwXDAwM1wwMjJcMDIyXG5cMDE2UklMVVVTRENTX0lBNWNcMDIwXDAwNCoiCi0gICAgIlwyMzFcMDAxXG5cMDE0UmlsQ2FsbFN0YXRlXDAyMlwwMjRcblwwMjBDQUxMU1RBVEVfQUNUSVZFXDAyMFwwMDBcMDIyXDAyNSIKLSAgICAiXG5cMDIxQ0FMTFNUQVRFX0hPTERJTkdcMDIwXDAwMVwwMjJcMDI1XG5cMDIxQ0FMTFNUQVRFX0RJQUxJIgotICAgICJOR1wwMjBcMDAyXDAyMlwwMjZcblwwMjJDQUxMU1RBVEVfQUxFUlRJTkdcMDIwXDAwM1wwMjJcMDI2XG5cMDIyQ0FMTFNUQVQiCi0gICAgIkVfSU5DT01JTkdcMDIwXDAwNFwwMjJcMDI1XG5cMDIxQ0FMTFNUQVRFX1dBSVRJTkdcMDIwXDAwNUIzXG4oYyIKLSAgICAib20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvQiIKLSAgICAiXDAwN1JpbENtZHMiLCA0Mjg4KTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoCi0gICAgInJpbC5wcm90byIsICZwcm90b2J1Zl9SZWdpc3RlclR5cGVzKTsKLSAgUmlsQXBwU3RhdHVzOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBSaWxBcHBTdGF0dXMoKTsKLSAgUmlsQ2FyZFN0YXR1czo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgUmlsQ2FyZFN0YXR1cygpOwotICBSaWxVdXNJbmZvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBSaWxVdXNJbmZvKCk7Ci0gIFJpbENhbGw6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFJpbENhbGwoKTsKLSAgUklMR1dTaWduYWxTdHJlbmd0aDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgUklMR1dTaWduYWxTdHJlbmd0aCgpOwotICBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFJJTENETUFTaWduYWxTdHJlbmd0aCgpOwotICBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFJJTEVWRE9TaWduYWxTdHJlbmd0aCgpOwotICBSc3BTdHJpbmdzOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBSc3BTdHJpbmdzKCk7Ci0gIFJzcEludGVnZXJzOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBSc3BJbnRlZ2VycygpOwotICBSc3BHZXRTaW1TdGF0dXM6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFJzcEdldFNpbVN0YXR1cygpOwotICBSZXFFbnRlclNpbVBpbjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgUmVxRW50ZXJTaW1QaW4oKTsKLSAgUnNwRW50ZXJTaW1QaW46OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFJzcEVudGVyU2ltUGluKCk7Ci0gIFJzcEdldEN1cnJlbnRDYWxsczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgUnNwR2V0Q3VycmVudENhbGxzKCk7Ci0gIFJlcURpYWw6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFJlcURpYWwoKTsKLSAgUmVxSGFuZ1VwOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBSZXFIYW5nVXAoKTsKLSAgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFJzcExhc3RDYWxsRmFpbENhdXNlKCk7Ci0gIFJzcFNpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBSc3BTaWduYWxTdHJlbmd0aCgpOwotICBSc3BPcGVyYXRvcjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgUnNwT3BlcmF0b3IoKTsKLSAgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24oKTsKLSAgUmVxU2V0TXV0ZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgUmVxU2V0TXV0ZSgpOwotICBSZXFTY3JlZW5TdGF0ZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgUmVxU2NyZWVuU3RhdGUoKTsKLSAgUmlsQXBwU3RhdHVzOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIFJpbENhcmRTdGF0dXM6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgUmlsVXVzSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBSaWxDYWxsOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIFJJTEdXU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBSc3BTdHJpbmdzOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIFJzcEludGVnZXJzOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIFJzcEdldFNpbVN0YXR1czo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBSZXFFbnRlclNpbVBpbjo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBSc3BFbnRlclNpbVBpbjo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBSc3BHZXRDdXJyZW50Q2FsbHM6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgUmVxRGlhbDo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBSZXFIYW5nVXA6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgUnNwU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgUnNwT3BlcmF0b3I6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIFJlcVNldE11dGU6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgUmVxU2NyZWVuU3RhdGU6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmcHJvdG9idWZfU2h1dGRvd25GaWxlX3JpbF8yZXByb3RvKTsKLX0KLQotLy8gRm9yY2UgQWRkRGVzY3JpcHRvcnMoKSB0byBiZSBjYWxsZWQgYXQgc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUuCi1zdHJ1Y3QgU3RhdGljRGVzY3JpcHRvckluaXRpYWxpemVyX3JpbF8yZXByb3RvIHsKLSAgU3RhdGljRGVzY3JpcHRvckluaXRpYWxpemVyX3JpbF8yZXByb3RvKCkgewotICAgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgfQotfSBzdGF0aWNfZGVzY3JpcHRvcl9pbml0aWFsaXplcl9yaWxfMmVwcm90b187Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJhZGlvU3RhdGVfZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBSYWRpb1N0YXRlX2Rlc2NyaXB0b3JfOwotfQotYm9vbCBSYWRpb1N0YXRlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA1OgotICAgIGNhc2UgNjoKLSAgICBjYXNlIDc6Ci0gICAgY2FzZSA4OgotICAgIGNhc2UgOToKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogUmlsQ2FyZFN0YXRlX2Rlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gUmlsQ2FyZFN0YXRlX2Rlc2NyaXB0b3JfOwotfQotYm9vbCBSaWxDYXJkU3RhdGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgc3dpdGNoKHZhbHVlKSB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbFBlcnNvU3Vic3RhdGVfZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBSaWxQZXJzb1N1YnN0YXRlX2Rlc2NyaXB0b3JfOwotfQotYm9vbCBSaWxQZXJzb1N1YnN0YXRlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA1OgotICAgIGNhc2UgNjoKLSAgICBjYXNlIDc6Ci0gICAgY2FzZSA4OgotICAgIGNhc2UgOToKLSAgICBjYXNlIDEwOgotICAgIGNhc2UgMTE6Ci0gICAgY2FzZSAxMjoKLSAgICBjYXNlIDEzOgotICAgIGNhc2UgMTQ6Ci0gICAgY2FzZSAxNToKLSAgICBjYXNlIDE2OgotICAgIGNhc2UgMTc6Ci0gICAgY2FzZSAxODoKLSAgICBjYXNlIDE5OgotICAgIGNhc2UgMjA6Ci0gICAgY2FzZSAyMToKLSAgICBjYXNlIDIyOgotICAgIGNhc2UgMjM6Ci0gICAgY2FzZSAyNDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogUmlsQXBwU3RhdGVfZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBSaWxBcHBTdGF0ZV9kZXNjcmlwdG9yXzsKLX0KLWJvb2wgUmlsQXBwU3RhdGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgc3dpdGNoKHZhbHVlKSB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNDoKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbFBpblN0YXRlX2Rlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gUmlsUGluU3RhdGVfZGVzY3JpcHRvcl87Ci19Ci1ib29sIFJpbFBpblN0YXRlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA1OgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBSaWxBcHBUeXBlX2Rlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gUmlsQXBwVHlwZV9kZXNjcmlwdG9yXzsKLX0KLWJvb2wgUmlsQXBwVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgewotICBzd2l0Y2godmFsdWUpIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBSaWxVdXNUeXBlX2Rlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gUmlsVXVzVHlwZV9kZXNjcmlwdG9yXzsKLX0KLWJvb2wgUmlsVXVzVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgewotICBzd2l0Y2godmFsdWUpIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA0OgotICAgIGNhc2UgNToKLSAgICBjYXNlIDY6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbFV1c0Rjc19kZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJpbFV1c0Rjc19kZXNjcmlwdG9yXzsKLX0KLWJvb2wgUmlsVXVzRGNzX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbENhbGxTdGF0ZV9kZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJpbENhbGxTdGF0ZV9kZXNjcmlwdG9yXzsKLX0KLWJvb2wgUmlsQ2FsbFN0YXRlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA1OgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY29uc3QgOjpzdGQ6OnN0cmluZyBSaWxBcHBTdGF0dXM6Ol9kZWZhdWx0X2FpZF87Ci1jb25zdCA6OnN0ZDo6c3RyaW5nIFJpbEFwcFN0YXR1czo6X2RlZmF1bHRfYXBwX2xhYmVsXzsKLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBSaWxBcHBTdGF0dXM6OmtBcHBUeXBlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsQXBwU3RhdHVzOjprQXBwU3RhdGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxBcHBTdGF0dXM6OmtQZXJzb1N1YnN0YXRlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsQXBwU3RhdHVzOjprQWlkRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsQXBwU3RhdHVzOjprQXBwTGFiZWxGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxBcHBTdGF0dXM6OmtQaW4xUmVwbGFjZWRGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxBcHBTdGF0dXM6OmtQaW4xRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsQXBwU3RhdHVzOjprUGluMkZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUmlsQXBwU3RhdHVzOjpSaWxBcHBTdGF0dXMoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIFJpbEFwcFN0YXR1czo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1SaWxBcHBTdGF0dXM6OlJpbEFwcFN0YXR1cyhjb25zdCBSaWxBcHBTdGF0dXMmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSaWxBcHBTdGF0dXM6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBhcHBfdHlwZV8gPSAwOwotICBhcHBfc3RhdGVfID0gMDsKLSAgcGVyc29fc3Vic3RhdGVfID0gMDsKLSAgYWlkXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmX2RlZmF1bHRfYWlkXyk7Ci0gIGFwcF9sYWJlbF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJl9kZWZhdWx0X2FwcF9sYWJlbF8pOwotICBwaW4xX3JlcGxhY2VkXyA9IDA7Ci0gIHBpbjFfID0gMDsKLSAgcGluMl8gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1SaWxBcHBTdGF0dXM6On5SaWxBcHBTdGF0dXMoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBSaWxBcHBTdGF0dXM6OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChhaWRfICE9ICZfZGVmYXVsdF9haWRfKSB7Ci0gICAgZGVsZXRlIGFpZF87Ci0gIH0KLSAgaWYgKGFwcF9sYWJlbF8gIT0gJl9kZWZhdWx0X2FwcF9sYWJlbF8pIHsKLSAgICBkZWxldGUgYXBwX2xhYmVsXzsKLSAgfQotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgUmlsQXBwU3RhdHVzOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUmlsQXBwU3RhdHVzOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJpbEFwcFN0YXR1c19kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgUmlsQXBwU3RhdHVzJiBSaWxBcHBTdGF0dXM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1SaWxBcHBTdGF0dXMqIFJpbEFwcFN0YXR1czo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1SaWxBcHBTdGF0dXMqIFJpbEFwcFN0YXR1czo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFJpbEFwcFN0YXR1czsKLX0KLQotdm9pZCBSaWxBcHBTdGF0dXM6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGFwcF90eXBlXyA9IDA7Ci0gICAgYXBwX3N0YXRlXyA9IDA7Ci0gICAgcGVyc29fc3Vic3RhdGVfID0gMDsKLSAgICBpZiAoX2hhc19iaXQoMykpIHsKLSAgICAgIGlmIChhaWRfICE9ICZfZGVmYXVsdF9haWRfKSB7Ci0gICAgICAgIGFpZF8tPmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChfaGFzX2JpdCg0KSkgewotICAgICAgaWYgKGFwcF9sYWJlbF8gIT0gJl9kZWZhdWx0X2FwcF9sYWJlbF8pIHsKLSAgICAgICAgYXBwX2xhYmVsXy0+Y2xlYXIoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcGluMV9yZXBsYWNlZF8gPSAwOwotICAgIHBpbjFfID0gMDsKLSAgICBwaW4yXyA9IDA7Ci0gIH0KLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotfQotCi1ib29sIFJpbEFwcFN0YXR1czo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxBcHBUeXBlIGFwcF90eXBlID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOwotICAgICAgICAgIGlmIChyaWxfcHJvdG86OlJpbEFwcFR5cGVfSXNWYWxpZCh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHNldF9hcHBfdHlwZShzdGF0aWNfY2FzdDwgcmlsX3Byb3RvOjpSaWxBcHBUeXBlID4odmFsdWUpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMSwgdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9hcHBfc3RhdGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbEFwcFN0YXRlIGFwcF9zdGF0ZSA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9hcHBfc3RhdGU6Ci0gICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKLSAgICAgICAgICBpZiAocmlsX3Byb3RvOjpSaWxBcHBTdGF0ZV9Jc1ZhbGlkKHZhbHVlKSkgewotICAgICAgICAgICAgc2V0X2FwcF9zdGF0ZShzdGF0aWNfY2FzdDwgcmlsX3Byb3RvOjpSaWxBcHBTdGF0ZSA+KHZhbHVlKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDIsIHZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNCkpIGdvdG8gcGFyc2VfcGVyc29fc3Vic3RhdGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBlcnNvU3Vic3RhdGUgcGVyc29fc3Vic3RhdGUgPSAzOwotICAgICAgY2FzZSAzOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgcGFyc2VfcGVyc29fc3Vic3RhdGU6Ci0gICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKLSAgICAgICAgICBpZiAocmlsX3Byb3RvOjpSaWxQZXJzb1N1YnN0YXRlX0lzVmFsaWQodmFsdWUpKSB7Ci0gICAgICAgICAgICBzZXRfcGVyc29fc3Vic3RhdGUoc3RhdGljX2Nhc3Q8IHJpbF9wcm90bzo6UmlsUGVyc29TdWJzdGF0ZSA+KHZhbHVlKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDMsIHZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2VfYWlkOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGFpZCA9IDQ7Ci0gICAgICBjYXNlIDQ6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfYWlkOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9haWQoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgICAgICAgICB0aGlzLT5haWQoKS5kYXRhKCksIHRoaXMtPmFpZCgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2FwcF9sYWJlbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBhcHBfbGFiZWwgPSA1OwotICAgICAgY2FzZSA1OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX2FwcF9sYWJlbDoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfYXBwX2xhYmVsKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgICAgICAgdGhpcy0+YXBwX2xhYmVsKCkuZGF0YSgpLCB0aGlzLT5hcHBfbGFiZWwoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQ4KSkgZ290byBwYXJzZV9waW4xX3JlcGxhY2VkOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgcGluMV9yZXBsYWNlZCA9IDY7Ci0gICAgICBjYXNlIDY6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9waW4xX3JlcGxhY2VkOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnBpbjFfcmVwbGFjZWRfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTYpKSBnb3RvIHBhcnNlX3BpbjE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBpblN0YXRlIHBpbjEgPSA3OwotICAgICAgY2FzZSA3OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgcGFyc2VfcGluMToKLSAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOwotICAgICAgICAgIGlmIChyaWxfcHJvdG86OlJpbFBpblN0YXRlX0lzVmFsaWQodmFsdWUpKSB7Ci0gICAgICAgICAgICBzZXRfcGluMShzdGF0aWNfY2FzdDwgcmlsX3Byb3RvOjpSaWxQaW5TdGF0ZSA+KHZhbHVlKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDcsIHZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg2NCkpIGdvdG8gcGFyc2VfcGluMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGluU3RhdGUgcGluMiA9IDg7Ci0gICAgICBjYXNlIDg6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9waW4yOgotICAgICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7Ci0gICAgICAgICAgaWYgKHJpbF9wcm90bzo6UmlsUGluU3RhdGVfSXNWYWxpZCh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHNldF9waW4yKHN0YXRpY19jYXN0PCByaWxfcHJvdG86OlJpbFBpblN0YXRlID4odmFsdWUpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoOCwgdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBSaWxBcHBTdGF0dXM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQXBwVHlwZSBhcHBfdHlwZSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCi0gICAgICAxLCB0aGlzLT5hcHBfdHlwZSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbEFwcFN0YXRlIGFwcF9zdGF0ZSA9IDI7Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCi0gICAgICAyLCB0aGlzLT5hcHBfc3RhdGUoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxQZXJzb1N1YnN0YXRlIHBlcnNvX3N1YnN0YXRlID0gMzsKLSAgaWYgKF9oYXNfYml0KDIpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKLSAgICAgIDMsIHRoaXMtPnBlcnNvX3N1YnN0YXRlKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBhaWQgPSA0OwotICBpZiAoX2hhc19iaXQoMykpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+YWlkKCkuZGF0YSgpLCB0aGlzLT5haWQoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAotICAgICAgNCwgdGhpcy0+YWlkKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBhcHBfbGFiZWwgPSA1OwotICBpZiAoX2hhc19iaXQoNCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+YXBwX2xhYmVsKCkuZGF0YSgpLCB0aGlzLT5hcHBfbGFiZWwoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAotICAgICAgNSwgdGhpcy0+YXBwX2xhYmVsKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIHBpbjFfcmVwbGFjZWQgPSA2OwotICBpZiAoX2hhc19iaXQoNSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMig2LCB0aGlzLT5waW4xX3JlcGxhY2VkKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGluU3RhdGUgcGluMSA9IDc7Ci0gIGlmIChfaGFzX2JpdCg2KSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCi0gICAgICA3LCB0aGlzLT5waW4xKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGluU3RhdGUgcGluMiA9IDg7Ci0gIGlmIChfaGFzX2JpdCg3KSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCi0gICAgICA4LCB0aGlzLT5waW4yKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBSaWxBcHBTdGF0dXM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQXBwVHlwZSBhcHBfdHlwZSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAotICAgICAgMSwgdGhpcy0+YXBwX3R5cGUoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxBcHBTdGF0ZSBhcHBfc3RhdGUgPSAyOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKLSAgICAgIDIsIHRoaXMtPmFwcF9zdGF0ZSgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBlcnNvU3Vic3RhdGUgcGVyc29fc3Vic3RhdGUgPSAzOwotICBpZiAoX2hhc19iaXQoMikpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKLSAgICAgIDMsIHRoaXMtPnBlcnNvX3N1YnN0YXRlKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBhaWQgPSA0OwotICBpZiAoX2hhc19iaXQoMykpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+YWlkKCkuZGF0YSgpLCB0aGlzLT5haWQoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDQsIHRoaXMtPmFpZCgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgYXBwX2xhYmVsID0gNTsKLSAgaWYgKF9oYXNfYml0KDQpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPmFwcF9sYWJlbCgpLmRhdGEoKSwgdGhpcy0+YXBwX2xhYmVsKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICA1LCB0aGlzLT5hcHBfbGFiZWwoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgcGluMV9yZXBsYWNlZCA9IDY7Ci0gIGlmIChfaGFzX2JpdCg1KSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSg2LCB0aGlzLT5waW4xX3JlcGxhY2VkKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGluU3RhdGUgcGluMSA9IDc7Ci0gIGlmIChfaGFzX2JpdCg2KSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAotICAgICAgNywgdGhpcy0+cGluMSgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBpblN0YXRlIHBpbjIgPSA4OwotICBpZiAoX2hhc19iaXQoNykpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKLSAgICAgIDgsIHRoaXMtPnBpbjIoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgUmlsQXBwU3RhdHVzOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbEFwcFR5cGUgYXBwX3R5cGUgPSAxOwotICAgIGlmIChoYXNfYXBwX3R5cGUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPmFwcF90eXBlKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbEFwcFN0YXRlIGFwcF9zdGF0ZSA9IDI7Ci0gICAgaWYgKGhhc19hcHBfc3RhdGUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPmFwcF9zdGF0ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxQZXJzb1N1YnN0YXRlIHBlcnNvX3N1YnN0YXRlID0gMzsKLSAgICBpZiAoaGFzX3BlcnNvX3N1YnN0YXRlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5wZXJzb19zdWJzdGF0ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGFpZCA9IDQ7Ci0gICAgaWYgKGhhc19haWQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+YWlkKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgYXBwX2xhYmVsID0gNTsKLSAgICBpZiAoaGFzX2FwcF9sYWJlbCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5hcHBfbGFiZWwoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIHBpbjFfcmVwbGFjZWQgPSA2OwotICAgIGlmIChoYXNfcGluMV9yZXBsYWNlZCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPnBpbjFfcmVwbGFjZWQoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGluU3RhdGUgcGluMSA9IDc7Ci0gICAgaWYgKGhhc19waW4xKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5waW4xKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBpblN0YXRlIHBpbjIgPSA4OwotICAgIGlmIChoYXNfcGluMigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+cGluMigpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgUmlsQXBwU3RhdHVzOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJpbEFwcFN0YXR1cyogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFJpbEFwcFN0YXR1cyo+KAotICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBSaWxBcHBTdGF0dXM6Ok1lcmdlRnJvbShjb25zdCBSaWxBcHBTdGF0dXMmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDApKSB7Ci0gICAgICBzZXRfYXBwX3R5cGUoZnJvbS5hcHBfdHlwZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF9hcHBfc3RhdGUoZnJvbS5hcHBfc3RhdGUoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDIpKSB7Ci0gICAgICBzZXRfcGVyc29fc3Vic3RhdGUoZnJvbS5wZXJzb19zdWJzdGF0ZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMykpIHsKLSAgICAgIHNldF9haWQoZnJvbS5haWQoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDQpKSB7Ci0gICAgICBzZXRfYXBwX2xhYmVsKGZyb20uYXBwX2xhYmVsKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCg1KSkgewotICAgICAgc2V0X3BpbjFfcmVwbGFjZWQoZnJvbS5waW4xX3JlcGxhY2VkKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCg2KSkgewotICAgICAgc2V0X3BpbjEoZnJvbS5waW4xKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCg3KSkgewotICAgICAgc2V0X3BpbjIoZnJvbS5waW4yKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJpbEFwcFN0YXR1czo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSaWxBcHBTdGF0dXM6OkNvcHlGcm9tKGNvbnN0IFJpbEFwcFN0YXR1cyYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUmlsQXBwU3RhdHVzOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmlsQXBwU3RhdHVzOjpTd2FwKFJpbEFwcFN0YXR1cyogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAoYXBwX3R5cGVfLCBvdGhlci0+YXBwX3R5cGVfKTsKLSAgICBzdGQ6OnN3YXAoYXBwX3N0YXRlXywgb3RoZXItPmFwcF9zdGF0ZV8pOwotICAgIHN0ZDo6c3dhcChwZXJzb19zdWJzdGF0ZV8sIG90aGVyLT5wZXJzb19zdWJzdGF0ZV8pOwotICAgIHN0ZDo6c3dhcChhaWRfLCBvdGhlci0+YWlkXyk7Ci0gICAgc3RkOjpzd2FwKGFwcF9sYWJlbF8sIG90aGVyLT5hcHBfbGFiZWxfKTsKLSAgICBzdGQ6OnN3YXAocGluMV9yZXBsYWNlZF8sIG90aGVyLT5waW4xX3JlcGxhY2VkXyk7Ci0gICAgc3RkOjpzd2FwKHBpbjFfLCBvdGhlci0+cGluMV8pOwotICAgIHN0ZDo6c3dhcChwaW4yXywgb3RoZXItPnBpbjJfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBSaWxBcHBTdGF0dXM6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJpbEFwcFN0YXR1c19kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFJpbEFwcFN0YXR1c19yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJpbENhcmRTdGF0dXM6OmtDYXJkU3RhdGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxDYXJkU3RhdHVzOjprVW5pdmVyc2FsUGluU3RhdGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxDYXJkU3RhdHVzOjprR3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsQ2FyZFN0YXR1czo6a0NkbWFTdWJzY3JpcHRpb25BcHBJbmRleEZpZWxkTnVtYmVyOwotY29uc3QgaW50IFJpbENhcmRTdGF0dXM6OmtOdW1BcHBsaWNhdGlvbnNGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxDYXJkU3RhdHVzOjprQXBwbGljYXRpb25zRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgotCi1SaWxDYXJkU3RhdHVzOjpSaWxDYXJkU3RhdHVzKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLX0KLQotdm9pZCBSaWxDYXJkU3RhdHVzOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLVJpbENhcmRTdGF0dXM6OlJpbENhcmRTdGF0dXMoY29uc3QgUmlsQ2FyZFN0YXR1cyYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJpbENhcmRTdGF0dXM6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBjYXJkX3N0YXRlXyA9IDA7Ci0gIHVuaXZlcnNhbF9waW5fc3RhdGVfID0gMDsKLSAgZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleF8gPSAwOwotICBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXhfID0gMDsKLSAgbnVtX2FwcGxpY2F0aW9uc18gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1SaWxDYXJkU3RhdHVzOjp+UmlsQ2FyZFN0YXR1cygpIHsKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIFJpbENhcmRTdGF0dXM6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBSaWxDYXJkU3RhdHVzOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUmlsQ2FyZFN0YXR1czo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBSaWxDYXJkU3RhdHVzX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSaWxDYXJkU3RhdHVzJiBSaWxDYXJkU3RhdHVzOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotUmlsQ2FyZFN0YXR1cyogUmlsQ2FyZFN0YXR1czo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1SaWxDYXJkU3RhdHVzKiBSaWxDYXJkU3RhdHVzOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUmlsQ2FyZFN0YXR1czsKLX0KLQotdm9pZCBSaWxDYXJkU3RhdHVzOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBjYXJkX3N0YXRlXyA9IDA7Ci0gICAgdW5pdmVyc2FsX3Bpbl9zdGF0ZV8gPSAwOwotICAgIGdzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXhfID0gMDsKLSAgICBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXhfID0gMDsKLSAgICBudW1fYXBwbGljYXRpb25zXyA9IDA7Ci0gIH0KLSAgYXBwbGljYXRpb25zXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci19Ci0KLWJvb2wgUmlsQ2FyZFN0YXR1czo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxDYXJkU3RhdGUgY2FyZF9zdGF0ZSA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKLSAgICAgICAgICBpZiAocmlsX3Byb3RvOjpSaWxDYXJkU3RhdGVfSXNWYWxpZCh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHNldF9jYXJkX3N0YXRlKHN0YXRpY19jYXN0PCByaWxfcHJvdG86OlJpbENhcmRTdGF0ZSA+KHZhbHVlKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEsIHZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfdW5pdmVyc2FsX3Bpbl9zdGF0ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGluU3RhdGUgdW5pdmVyc2FsX3Bpbl9zdGF0ZSA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV91bml2ZXJzYWxfcGluX3N0YXRlOgotICAgICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7Ci0gICAgICAgICAgaWYgKHJpbF9wcm90bzo6UmlsUGluU3RhdGVfSXNWYWxpZCh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHNldF91bml2ZXJzYWxfcGluX3N0YXRlKHN0YXRpY19jYXN0PCByaWxfcHJvdG86OlJpbFBpblN0YXRlID4odmFsdWUpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMiwgdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCA9IDM7Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4OgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmdzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXhfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzIpKSBnb3RvIHBhcnNlX2NkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIGNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCA9IDQ7Ci0gICAgICBjYXNlIDQ6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9jZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXg6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmY2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4XykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQwKSkgZ290byBwYXJzZV9udW1fYXBwbGljYXRpb25zOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtX2FwcGxpY2F0aW9ucyA9IDU7Ci0gICAgICBjYXNlIDU6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9udW1fYXBwbGljYXRpb25zOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJm51bV9hcHBsaWNhdGlvbnNfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2FwcGxpY2F0aW9uczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcGVhdGVkIC5yaWxfcHJvdG8uUmlsQXBwU3RhdHVzIGFwcGxpY2F0aW9ucyA9IDY7Ci0gICAgICBjYXNlIDY6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfYXBwbGljYXRpb25zOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9hcHBsaWNhdGlvbnMoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2FwcGxpY2F0aW9uczsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFJpbENhcmRTdGF0dXM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQ2FyZFN0YXRlIGNhcmRfc3RhdGUgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAotICAgICAgMSwgdGhpcy0+Y2FyZF9zdGF0ZSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBpblN0YXRlIHVuaXZlcnNhbF9waW5fc3RhdGUgPSAyOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAotICAgICAgMiwgdGhpcy0+dW5pdmVyc2FsX3Bpbl9zdGF0ZSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4ID0gMzsKLSAgaWYgKF9oYXNfYml0KDIpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMywgdGhpcy0+Z3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXggPSA0OwotICBpZiAoX2hhc19iaXQoMykpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMig0LCB0aGlzLT5jZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgbnVtX2FwcGxpY2F0aW9ucyA9IDU7Ci0gIGlmIChfaGFzX2JpdCg0KSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDUsIHRoaXMtPm51bV9hcHBsaWNhdGlvbnMoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgLnJpbF9wcm90by5SaWxBcHBTdGF0dXMgYXBwbGljYXRpb25zID0gNjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5hcHBsaWNhdGlvbnNfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgNiwgdGhpcy0+YXBwbGljYXRpb25zKGkpLCBvdXRwdXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogUmlsQ2FyZFN0YXR1czo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxDYXJkU3RhdGUgY2FyZF9zdGF0ZSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAotICAgICAgMSwgdGhpcy0+Y2FyZF9zdGF0ZSgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBpblN0YXRlIHVuaXZlcnNhbF9waW5fc3RhdGUgPSAyOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKLSAgICAgIDIsIHRoaXMtPnVuaXZlcnNhbF9waW5fc3RhdGUoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCA9IDM7Ci0gIGlmIChfaGFzX2JpdCgyKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgzLCB0aGlzLT5nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4KCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIGNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCA9IDQ7Ci0gIGlmIChfaGFzX2JpdCgzKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSg0LCB0aGlzLT5jZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgbnVtX2FwcGxpY2F0aW9ucyA9IDU7Ci0gIGlmIChfaGFzX2JpdCg0KSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSg1LCB0aGlzLT5udW1fYXBwbGljYXRpb25zKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIHJlcGVhdGVkIC5yaWxfcHJvdG8uUmlsQXBwU3RhdHVzIGFwcGxpY2F0aW9ucyA9IDY7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+YXBwbGljYXRpb25zX3NpemUoKTsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgNiwgdGhpcy0+YXBwbGljYXRpb25zKGkpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBSaWxDYXJkU3RhdHVzOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbENhcmRTdGF0ZSBjYXJkX3N0YXRlID0gMTsKLSAgICBpZiAoaGFzX2NhcmRfc3RhdGUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPmNhcmRfc3RhdGUoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGluU3RhdGUgdW5pdmVyc2FsX3Bpbl9zdGF0ZSA9IDI7Ci0gICAgaWYgKGhhc191bml2ZXJzYWxfcGluX3N0YXRlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT51bml2ZXJzYWxfcGluX3N0YXRlKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4ID0gMzsKLSAgICBpZiAoaGFzX2dzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4KCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXggPSA0OwotICAgIGlmIChoYXNfY2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4KCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+Y2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4KCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1fYXBwbGljYXRpb25zID0gNTsKLSAgICBpZiAoaGFzX251bV9hcHBsaWNhdGlvbnMoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5udW1fYXBwbGljYXRpb25zKCkpOwotICAgIH0KLSAgICAKLSAgfQotICAvLyByZXBlYXRlZCAucmlsX3Byb3RvLlJpbEFwcFN0YXR1cyBhcHBsaWNhdGlvbnMgPSA2OwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5hcHBsaWNhdGlvbnNfc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmFwcGxpY2F0aW9uc19zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+YXBwbGljYXRpb25zKGkpKTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgUmlsQ2FyZFN0YXR1czo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBSaWxDYXJkU3RhdHVzKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUmlsQ2FyZFN0YXR1cyo+KAotICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBSaWxDYXJkU3RhdHVzOjpNZXJnZUZyb20oY29uc3QgUmlsQ2FyZFN0YXR1cyYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBhcHBsaWNhdGlvbnNfLk1lcmdlRnJvbShmcm9tLmFwcGxpY2F0aW9uc18pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9jYXJkX3N0YXRlKGZyb20uY2FyZF9zdGF0ZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF91bml2ZXJzYWxfcGluX3N0YXRlKGZyb20udW5pdmVyc2FsX3Bpbl9zdGF0ZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMikpIHsKLSAgICAgIHNldF9nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4KGZyb20uZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMykpIHsKLSAgICAgIHNldF9jZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgoZnJvbS5jZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDQpKSB7Ci0gICAgICBzZXRfbnVtX2FwcGxpY2F0aW9ucyhmcm9tLm51bV9hcHBsaWNhdGlvbnMoKSk7Ci0gICAgfQotICB9Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci19Ci0KLXZvaWQgUmlsQ2FyZFN0YXR1czo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSaWxDYXJkU3RhdHVzOjpDb3B5RnJvbShjb25zdCBSaWxDYXJkU3RhdHVzJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBSaWxDYXJkU3RhdHVzOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmlsQ2FyZFN0YXR1czo6U3dhcChSaWxDYXJkU3RhdHVzKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChjYXJkX3N0YXRlXywgb3RoZXItPmNhcmRfc3RhdGVfKTsKLSAgICBzdGQ6OnN3YXAodW5pdmVyc2FsX3Bpbl9zdGF0ZV8sIG90aGVyLT51bml2ZXJzYWxfcGluX3N0YXRlXyk7Ci0gICAgc3RkOjpzd2FwKGdzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXhfLCBvdGhlci0+Z3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleF8pOwotICAgIHN0ZDo6c3dhcChjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXhfLCBvdGhlci0+Y2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4Xyk7Ci0gICAgc3RkOjpzd2FwKG51bV9hcHBsaWNhdGlvbnNfLCBvdGhlci0+bnVtX2FwcGxpY2F0aW9uc18pOwotICAgIGFwcGxpY2F0aW9uc18uU3dhcCgmb3RoZXItPmFwcGxpY2F0aW9uc18pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJpbENhcmRTdGF0dXM6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJpbENhcmRTdGF0dXNfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBSaWxDYXJkU3RhdHVzX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jb25zdCA6OnN0ZDo6c3RyaW5nIFJpbFV1c0luZm86Ol9kZWZhdWx0X3V1c19kYXRhXzsKLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBSaWxVdXNJbmZvOjprVXVzVHlwZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IFJpbFV1c0luZm86OmtVdXNEY3NGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxVdXNJbmZvOjprVXVzTGVuZ3RoRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsVXVzSW5mbzo6a1V1c0RhdGFGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLVJpbFV1c0luZm86OlJpbFV1c0luZm8oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIFJpbFV1c0luZm86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotUmlsVXVzSW5mbzo6UmlsVXVzSW5mbyhjb25zdCBSaWxVdXNJbmZvJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUmlsVXVzSW5mbzo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIHV1c190eXBlXyA9IDA7Ci0gIHV1c19kY3NfID0gMDsKLSAgdXVzX2xlbmd0aF8gPSAwOwotICB1dXNfZGF0YV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJl9kZWZhdWx0X3V1c19kYXRhXyk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLVJpbFV1c0luZm86On5SaWxVdXNJbmZvKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUmlsVXVzSW5mbzo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHV1c19kYXRhXyAhPSAmX2RlZmF1bHRfdXVzX2RhdGFfKSB7Ci0gICAgZGVsZXRlIHV1c19kYXRhXzsKLSAgfQotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgUmlsVXVzSW5mbzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJpbFV1c0luZm86OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gUmlsVXVzSW5mb19kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgUmlsVXVzSW5mbyYgUmlsVXVzSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVJpbFV1c0luZm8qIFJpbFV1c0luZm86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotUmlsVXVzSW5mbyogUmlsVXVzSW5mbzo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFJpbFV1c0luZm87Ci19Ci0KLXZvaWQgUmlsVXVzSW5mbzo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgdXVzX3R5cGVfID0gMDsKLSAgICB1dXNfZGNzXyA9IDA7Ci0gICAgdXVzX2xlbmd0aF8gPSAwOwotICAgIGlmIChfaGFzX2JpdCgzKSkgewotICAgICAgaWYgKHV1c19kYXRhXyAhPSAmX2RlZmF1bHRfdXVzX2RhdGFfKSB7Ci0gICAgICAgIHV1c19kYXRhXy0+Y2xlYXIoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotfQotCi1ib29sIFJpbFV1c0luZm86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzVHlwZSB1dXNfdHlwZSA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKLSAgICAgICAgICBpZiAocmlsX3Byb3RvOjpSaWxVdXNUeXBlX0lzVmFsaWQodmFsdWUpKSB7Ci0gICAgICAgICAgICBzZXRfdXVzX3R5cGUoc3RhdGljX2Nhc3Q8IHJpbF9wcm90bzo6UmlsVXVzVHlwZSA+KHZhbHVlKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEsIHZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfdXVzX2RjczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzRGNzIHV1c19kY3MgPSAyOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgcGFyc2VfdXVzX2RjczoKLSAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOwotICAgICAgICAgIGlmIChyaWxfcHJvdG86OlJpbFV1c0Rjc19Jc1ZhbGlkKHZhbHVlKSkgewotICAgICAgICAgICAgc2V0X3V1c19kY3Moc3RhdGljX2Nhc3Q8IHJpbF9wcm90bzo6UmlsVXVzRGNzID4odmFsdWUpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMiwgdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV91dXNfbGVuZ3RoOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgdXVzX2xlbmd0aCA9IDM7Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV91dXNfbGVuZ3RoOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnV1c19sZW5ndGhfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX3V1c19kYXRhOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHV1c19kYXRhID0gNDsKLSAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV91dXNfZGF0YToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfdXVzX2RhdGEoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgICAgICAgICB0aGlzLT51dXNfZGF0YSgpLmRhdGEoKSwgdGhpcy0+dXVzX2RhdGEoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBSaWxVdXNJbmZvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFV1c1R5cGUgdXVzX3R5cGUgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAotICAgICAgMSwgdGhpcy0+dXVzX3R5cGUoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNEY3MgdXVzX2RjcyA9IDI7Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCi0gICAgICAyLCB0aGlzLT51dXNfZGNzKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIHV1c19sZW5ndGggPSAzOwotICBpZiAoX2hhc19iaXQoMikpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigzLCB0aGlzLT51dXNfbGVuZ3RoKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIHN0cmluZyB1dXNfZGF0YSA9IDQ7Ci0gIGlmIChfaGFzX2JpdCgzKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgICB0aGlzLT51dXNfZGF0YSgpLmRhdGEoKSwgdGhpcy0+dXVzX2RhdGEoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAotICAgICAgNCwgdGhpcy0+dXVzX2RhdGEoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFJpbFV1c0luZm86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzVHlwZSB1dXNfdHlwZSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAotICAgICAgMSwgdGhpcy0+dXVzX3R5cGUoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNEY3MgdXVzX2RjcyA9IDI7Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAotICAgICAgMiwgdGhpcy0+dXVzX2RjcygpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiB1dXNfbGVuZ3RoID0gMzsKLSAgaWYgKF9oYXNfYml0KDIpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDMsIHRoaXMtPnV1c19sZW5ndGgoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIHV1c19kYXRhID0gNDsKLSAgaWYgKF9oYXNfYml0KDMpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPnV1c19kYXRhKCkuZGF0YSgpLCB0aGlzLT51dXNfZGF0YSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgNCwgdGhpcy0+dXVzX2RhdGEoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgUmlsVXVzSW5mbzo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNUeXBlIHV1c190eXBlID0gMTsKLSAgICBpZiAoaGFzX3V1c190eXBlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT51dXNfdHlwZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNEY3MgdXVzX2RjcyA9IDI7Ci0gICAgaWYgKGhhc191dXNfZGNzKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT51dXNfZGNzKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiB1dXNfbGVuZ3RoID0gMzsKLSAgICBpZiAoaGFzX3V1c19sZW5ndGgoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT51dXNfbGVuZ3RoKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgdXVzX2RhdGEgPSA0OwotICAgIGlmIChoYXNfdXVzX2RhdGEoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+dXVzX2RhdGEoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFJpbFV1c0luZm86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgUmlsVXVzSW5mbyogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFJpbFV1c0luZm8qPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgUmlsVXVzSW5mbzo6TWVyZ2VGcm9tKGNvbnN0IFJpbFV1c0luZm8mIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDApKSB7Ci0gICAgICBzZXRfdXVzX3R5cGUoZnJvbS51dXNfdHlwZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF91dXNfZGNzKGZyb20udXVzX2RjcygpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMikpIHsKLSAgICAgIHNldF91dXNfbGVuZ3RoKGZyb20udXVzX2xlbmd0aCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMykpIHsKLSAgICAgIHNldF91dXNfZGF0YShmcm9tLnV1c19kYXRhKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJpbFV1c0luZm86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUmlsVXVzSW5mbzo6Q29weUZyb20oY29uc3QgUmlsVXVzSW5mbyYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUmlsVXVzSW5mbzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJpbFV1c0luZm86OlN3YXAoUmlsVXVzSW5mbyogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAodXVzX3R5cGVfLCBvdGhlci0+dXVzX3R5cGVfKTsKLSAgICBzdGQ6OnN3YXAodXVzX2Rjc18sIG90aGVyLT51dXNfZGNzXyk7Ci0gICAgc3RkOjpzd2FwKHV1c19sZW5ndGhfLCBvdGhlci0+dXVzX2xlbmd0aF8pOwotICAgIHN0ZDo6c3dhcCh1dXNfZGF0YV8sIG90aGVyLT51dXNfZGF0YV8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJpbFV1c0luZm86OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJpbFV1c0luZm9fZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBSaWxVdXNJbmZvX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jb25zdCA6OnN0ZDo6c3RyaW5nIFJpbENhbGw6Ol9kZWZhdWx0X251bWJlcl87Ci1jb25zdCA6OnN0ZDo6c3RyaW5nIFJpbENhbGw6Ol9kZWZhdWx0X25hbWVfOwotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJpbENhbGw6OmtTdGF0ZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IFJpbENhbGw6OmtJbmRleEZpZWxkTnVtYmVyOwotY29uc3QgaW50IFJpbENhbGw6OmtUb2FGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxDYWxsOjprSXNNcHR5RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsQ2FsbDo6a0lzTXRGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxDYWxsOjprQWxzRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsQ2FsbDo6a0lzVm9pY2VGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxDYWxsOjprSXNWb2ljZVByaXZhY3lGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxDYWxsOjprTnVtYmVyRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsQ2FsbDo6a051bWJlclByZXNlbnRhdGlvbkZpZWxkTnVtYmVyOwotY29uc3QgaW50IFJpbENhbGw6OmtOYW1lRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmlsQ2FsbDo6a05hbWVQcmVzZW50YXRpb25GaWVsZE51bWJlcjsKLWNvbnN0IGludCBSaWxDYWxsOjprVXVzSW5mb0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUmlsQ2FsbDo6UmlsQ2FsbCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUmlsQ2FsbDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotICB1dXNfaW5mb18gPSBjb25zdF9jYXN0PCA6OnJpbF9wcm90bzo6UmlsVXVzSW5mbyo+KCY6OnJpbF9wcm90bzo6UmlsVXVzSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLX0KLQotUmlsQ2FsbDo6UmlsQ2FsbChjb25zdCBSaWxDYWxsJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUmlsQ2FsbDo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIHN0YXRlXyA9IDA7Ci0gIGluZGV4XyA9IDA7Ci0gIHRvYV8gPSAwOwotICBpc19tcHR5XyA9IGZhbHNlOwotICBpc19tdF8gPSBmYWxzZTsKLSAgYWxzXyA9IDA7Ci0gIGlzX3ZvaWNlXyA9IGZhbHNlOwotICBpc192b2ljZV9wcml2YWN5XyA9IGZhbHNlOwotICBudW1iZXJfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCZfZGVmYXVsdF9udW1iZXJfKTsKLSAgbnVtYmVyX3ByZXNlbnRhdGlvbl8gPSAwOwotICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmX2RlZmF1bHRfbmFtZV8pOwotICBuYW1lX3ByZXNlbnRhdGlvbl8gPSAwOwotICB1dXNfaW5mb18gPSBOVUxMOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1SaWxDYWxsOjp+UmlsQ2FsbCgpIHsKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIFJpbENhbGw6OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChudW1iZXJfICE9ICZfZGVmYXVsdF9udW1iZXJfKSB7Ci0gICAgZGVsZXRlIG51bWJlcl87Ci0gIH0KLSAgaWYgKG5hbWVfICE9ICZfZGVmYXVsdF9uYW1lXykgewotICAgIGRlbGV0ZSBuYW1lXzsKLSAgfQotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICAgIGRlbGV0ZSB1dXNfaW5mb187Ci0gIH0KLX0KLQotdm9pZCBSaWxDYWxsOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUmlsQ2FsbDo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBSaWxDYWxsX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSaWxDYWxsJiBSaWxDYWxsOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotUmlsQ2FsbCogUmlsQ2FsbDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1SaWxDYWxsKiBSaWxDYWxsOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUmlsQ2FsbDsKLX0KLQotdm9pZCBSaWxDYWxsOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBzdGF0ZV8gPSAwOwotICAgIGluZGV4XyA9IDA7Ci0gICAgdG9hXyA9IDA7Ci0gICAgaXNfbXB0eV8gPSBmYWxzZTsKLSAgICBpc19tdF8gPSBmYWxzZTsKLSAgICBhbHNfID0gMDsKLSAgICBpc192b2ljZV8gPSBmYWxzZTsKLSAgICBpc192b2ljZV9wcml2YWN5XyA9IGZhbHNlOwotICB9Ci0gIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAoMHhmZnUgPDwgKDggJSAzMikpKSB7Ci0gICAgaWYgKF9oYXNfYml0KDgpKSB7Ci0gICAgICBpZiAobnVtYmVyXyAhPSAmX2RlZmF1bHRfbnVtYmVyXykgewotICAgICAgICBudW1iZXJfLT5jbGVhcigpOwotICAgICAgfQotICAgIH0KLSAgICBudW1iZXJfcHJlc2VudGF0aW9uXyA9IDA7Ci0gICAgaWYgKF9oYXNfYml0KDEwKSkgewotICAgICAgaWYgKG5hbWVfICE9ICZfZGVmYXVsdF9uYW1lXykgewotICAgICAgICBuYW1lXy0+Y2xlYXIoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbmFtZV9wcmVzZW50YXRpb25fID0gMDsKLSAgICBpZiAoX2hhc19iaXQoMTIpKSB7Ci0gICAgICBpZiAodXVzX2luZm9fICE9IE5VTEwpIHV1c19pbmZvXy0+OjpyaWxfcHJvdG86OlJpbFV1c0luZm86OkNsZWFyKCk7Ci0gICAgfQotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSaWxDYWxsOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbENhbGxTdGF0ZSBzdGF0ZSA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKLSAgICAgICAgICBpZiAocmlsX3Byb3RvOjpSaWxDYWxsU3RhdGVfSXNWYWxpZCh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHNldF9zdGF0ZShzdGF0aWNfY2FzdDwgcmlsX3Byb3RvOjpSaWxDYWxsU3RhdGUgPih2YWx1ZSkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxLCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTYpKSBnb3RvIHBhcnNlX2luZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgaW5kZXggPSAyOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgcGFyc2VfaW5kZXg6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmaW5kZXhfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjQpKSBnb3RvIHBhcnNlX3RvYTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIHRvYSA9IDM7Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV90b2E6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmdG9hXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDMyKSkgZ290byBwYXJzZV9pc19tcHR5OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgYm9vbCBpc19tcHR5ID0gNDsKLSAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX2lzX21wdHk6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZpc19tcHR5XykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQwKSkgZ290byBwYXJzZV9pc19tdDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIGJvb2wgaXNfbXQgPSA1OwotICAgICAgY2FzZSA1OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgcGFyc2VfaXNfbXQ6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZpc19tdF8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoNCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0OCkpIGdvdG8gcGFyc2VfYWxzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgYWxzID0gNjsKLSAgICAgIGNhc2UgNjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX2FsczoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZhbHNfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTYpKSBnb3RvIHBhcnNlX2lzX3ZvaWNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgYm9vbCBpc192b2ljZSA9IDc7Ci0gICAgICBjYXNlIDc6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9pc192b2ljZToKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmlzX3ZvaWNlXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCg2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDY0KSkgZ290byBwYXJzZV9pc192b2ljZV9wcml2YWN5OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgYm9vbCBpc192b2ljZV9wcml2YWN5ID0gODsKLSAgICAgIGNhc2UgODogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX2lzX3ZvaWNlX3ByaXZhY3k6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZpc192b2ljZV9wcml2YWN5XykpKTsKLSAgICAgICAgICBfc2V0X2JpdCg3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc0KSkgZ290byBwYXJzZV9udW1iZXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbnVtYmVyID0gOTsKLSAgICAgIGNhc2UgOTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9udW1iZXI6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX251bWJlcigpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgICAgICAgIHRoaXMtPm51bWJlcigpLmRhdGEoKSwgdGhpcy0+bnVtYmVyKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg4MCkpIGdvdG8gcGFyc2VfbnVtYmVyX3ByZXNlbnRhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlcl9wcmVzZW50YXRpb24gPSAxMDsKLSAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9udW1iZXJfcHJlc2VudGF0aW9uOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJm51bWJlcl9wcmVzZW50YXRpb25fKSkpOwotICAgICAgICAgIF9zZXRfYml0KDkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoOTApKSBnb3RvIHBhcnNlX25hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDExOwotICAgICAgY2FzZSAxMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9uYW1lOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoOTYpKSBnb3RvIHBhcnNlX25hbWVfcHJlc2VudGF0aW9uOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgbmFtZV9wcmVzZW50YXRpb24gPSAxMjsKLSAgICAgIGNhc2UgMTI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9uYW1lX3ByZXNlbnRhdGlvbjoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZuYW1lX3ByZXNlbnRhdGlvbl8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoMTEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTA2KSkgZ290byBwYXJzZV91dXNfaW5mbzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzSW5mbyB1dXNfaW5mbyA9IDEzOwotICAgICAgY2FzZSAxMzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV91dXNfaW5mbzoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAotICAgICAgICAgICAgICAgaW5wdXQsIG11dGFibGVfdXVzX2luZm8oKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFJpbENhbGw6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQ2FsbFN0YXRlIHN0YXRlID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKLSAgICAgIDEsIHRoaXMtPnN0YXRlKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIGluZGV4ID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMiwgdGhpcy0+aW5kZXgoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgdG9hID0gMzsKLSAgaWYgKF9oYXNfYml0KDIpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMywgdGhpcy0+dG9hKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGJvb2wgaXNfbXB0eSA9IDQ7Ci0gIGlmIChfaGFzX2JpdCgzKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woNCwgdGhpcy0+aXNfbXB0eSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBib29sIGlzX210ID0gNTsKLSAgaWYgKF9oYXNfYml0KDQpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCg1LCB0aGlzLT5pc19tdCgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBhbHMgPSA2OwotICBpZiAoX2hhc19iaXQoNSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMig2LCB0aGlzLT5hbHMoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgYm9vbCBpc192b2ljZSA9IDc7Ci0gIGlmIChfaGFzX2JpdCg2KSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woNywgdGhpcy0+aXNfdm9pY2UoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgYm9vbCBpc192b2ljZV9wcml2YWN5ID0gODsKLSAgaWYgKF9oYXNfYml0KDcpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCg4LCB0aGlzLT5pc192b2ljZV9wcml2YWN5KCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBudW1iZXIgPSA5OwotICBpZiAoX2hhc19iaXQoOCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+bnVtYmVyKCkuZGF0YSgpLCB0aGlzLT5udW1iZXIoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAotICAgICAgOSwgdGhpcy0+bnVtYmVyKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIG51bWJlcl9wcmVzZW50YXRpb24gPSAxMDsKLSAgaWYgKF9oYXNfYml0KDkpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMTAsIHRoaXMtPm51bWJlcl9wcmVzZW50YXRpb24oKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxMTsKLSAgaWYgKF9oYXNfYml0KDEwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKLSAgICAgIDExLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIG5hbWVfcHJlc2VudGF0aW9uID0gMTI7Ci0gIGlmIChfaGFzX2JpdCgxMSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigxMiwgdGhpcy0+bmFtZV9wcmVzZW50YXRpb24oKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNJbmZvIHV1c19pbmZvID0gMTM7Ci0gIGlmIChfaGFzX2JpdCgxMikpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgMTMsIHRoaXMtPnV1c19pbmZvKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBSaWxDYWxsOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbENhbGxTdGF0ZSBzdGF0ZSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAotICAgICAgMSwgdGhpcy0+c3RhdGUoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgaW5kZXggPSAyOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMiwgdGhpcy0+aW5kZXgoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgdG9hID0gMzsKLSAgaWYgKF9oYXNfYml0KDIpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDMsIHRoaXMtPnRvYSgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBib29sIGlzX21wdHkgPSA0OwotICBpZiAoX2hhc19iaXQoMykpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSg0LCB0aGlzLT5pc19tcHR5KCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGJvb2wgaXNfbXQgPSA1OwotICBpZiAoX2hhc19iaXQoNCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSg1LCB0aGlzLT5pc19tdCgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBhbHMgPSA2OwotICBpZiAoX2hhc19iaXQoNSkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoNiwgdGhpcy0+YWxzKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGJvb2wgaXNfdm9pY2UgPSA3OwotICBpZiAoX2hhc19iaXQoNikpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSg3LCB0aGlzLT5pc192b2ljZSgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBib29sIGlzX3ZvaWNlX3ByaXZhY3kgPSA4OwotICBpZiAoX2hhc19iaXQoNykpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSg4LCB0aGlzLT5pc192b2ljZV9wcml2YWN5KCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBudW1iZXIgPSA5OwotICBpZiAoX2hhc19iaXQoOCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+bnVtYmVyKCkuZGF0YSgpLCB0aGlzLT5udW1iZXIoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDksIHRoaXMtPm51bWJlcigpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXJfcHJlc2VudGF0aW9uID0gMTA7Ci0gIGlmIChfaGFzX2JpdCg5KSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgxMCwgdGhpcy0+bnVtYmVyX3ByZXNlbnRhdGlvbigpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDExOwotICBpZiAoX2hhc19iaXQoMTApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDExLCB0aGlzLT5uYW1lKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIG5hbWVfcHJlc2VudGF0aW9uID0gMTI7Ci0gIGlmIChfaGFzX2JpdCgxMSkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMTIsIHRoaXMtPm5hbWVfcHJlc2VudGF0aW9uKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzSW5mbyB1dXNfaW5mbyA9IDEzOwotICBpZiAoX2hhc19iaXQoMTIpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMTMsIHRoaXMtPnV1c19pbmZvKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IFJpbENhbGw6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQ2FsbFN0YXRlIHN0YXRlID0gMTsKLSAgICBpZiAoaGFzX3N0YXRlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5zdGF0ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgaW5kZXggPSAyOwotICAgIGlmIChoYXNfaW5kZXgoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5pbmRleCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgdG9hID0gMzsKLSAgICBpZiAoaGFzX3RvYSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPnRvYSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgYm9vbCBpc19tcHR5ID0gNDsKLSAgICBpZiAoaGFzX2lzX21wdHkoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgYm9vbCBpc19tdCA9IDU7Ci0gICAgaWYgKGhhc19pc19tdCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKyAxOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBhbHMgPSA2OwotICAgIGlmIChoYXNfYWxzKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+YWxzKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBib29sIGlzX3ZvaWNlID0gNzsKLSAgICBpZiAoaGFzX2lzX3ZvaWNlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGJvb2wgaXNfdm9pY2VfcHJpdmFjeSA9IDg7Ci0gICAgaWYgKGhhc19pc192b2ljZV9wcml2YWN5KCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAoMHhmZnUgPDwgKDggJSAzMikpKSB7Ci0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIG51bWJlciA9IDk7Ci0gICAgaWYgKGhhc19udW1iZXIoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+bnVtYmVyKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXJfcHJlc2VudGF0aW9uID0gMTA7Ci0gICAgaWYgKGhhc19udW1iZXJfcHJlc2VudGF0aW9uKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+bnVtYmVyX3ByZXNlbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxMTsKLSAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+bmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgbmFtZV9wcmVzZW50YXRpb24gPSAxMjsKLSAgICBpZiAoaGFzX25hbWVfcHJlc2VudGF0aW9uKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+bmFtZV9wcmVzZW50YXRpb24oKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzSW5mbyB1dXNfaW5mbyA9IDEzOwotICAgIGlmIChoYXNfdXVzX2luZm8oKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgIHRoaXMtPnV1c19pbmZvKCkpOwotICAgIH0KLSAgICAKLSAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBSaWxDYWxsOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJpbENhbGwqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBSaWxDYWxsKj4oCi0gICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIFJpbENhbGw6Ok1lcmdlRnJvbShjb25zdCBSaWxDYWxsJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5faGFzX2JpdCgwKSkgewotICAgICAgc2V0X3N0YXRlKGZyb20uc3RhdGUoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDEpKSB7Ci0gICAgICBzZXRfaW5kZXgoZnJvbS5pbmRleCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMikpIHsKLSAgICAgIHNldF90b2EoZnJvbS50b2EoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDMpKSB7Ci0gICAgICBzZXRfaXNfbXB0eShmcm9tLmlzX21wdHkoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDQpKSB7Ci0gICAgICBzZXRfaXNfbXQoZnJvbS5pc19tdCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoNSkpIHsKLSAgICAgIHNldF9hbHMoZnJvbS5hbHMoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDYpKSB7Ci0gICAgICBzZXRfaXNfdm9pY2UoZnJvbS5pc192b2ljZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoNykpIHsKLSAgICAgIHNldF9pc192b2ljZV9wcml2YWN5KGZyb20uaXNfdm9pY2VfcHJpdmFjeSgpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGZyb20uX2hhc19iaXRzX1s4IC8gMzJdICYgKDB4ZmZ1IDw8ICg4ICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDgpKSB7Ci0gICAgICBzZXRfbnVtYmVyKGZyb20ubnVtYmVyKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCg5KSkgewotICAgICAgc2V0X251bWJlcl9wcmVzZW50YXRpb24oZnJvbS5udW1iZXJfcHJlc2VudGF0aW9uKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCgxMCkpIHsKLSAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMTEpKSB7Ci0gICAgICBzZXRfbmFtZV9wcmVzZW50YXRpb24oZnJvbS5uYW1lX3ByZXNlbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMTIpKSB7Ci0gICAgICBtdXRhYmxlX3V1c19pbmZvKCktPjo6cmlsX3Byb3RvOjpSaWxVdXNJbmZvOjpNZXJnZUZyb20oZnJvbS51dXNfaW5mbygpKTsKLSAgICB9Ci0gIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBSaWxDYWxsOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJpbENhbGw6OkNvcHlGcm9tKGNvbnN0IFJpbENhbGwmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIFJpbENhbGw6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSaWxDYWxsOjpTd2FwKFJpbENhbGwqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKHN0YXRlXywgb3RoZXItPnN0YXRlXyk7Ci0gICAgc3RkOjpzd2FwKGluZGV4Xywgb3RoZXItPmluZGV4Xyk7Ci0gICAgc3RkOjpzd2FwKHRvYV8sIG90aGVyLT50b2FfKTsKLSAgICBzdGQ6OnN3YXAoaXNfbXB0eV8sIG90aGVyLT5pc19tcHR5Xyk7Ci0gICAgc3RkOjpzd2FwKGlzX210Xywgb3RoZXItPmlzX210Xyk7Ci0gICAgc3RkOjpzd2FwKGFsc18sIG90aGVyLT5hbHNfKTsKLSAgICBzdGQ6OnN3YXAoaXNfdm9pY2VfLCBvdGhlci0+aXNfdm9pY2VfKTsKLSAgICBzdGQ6OnN3YXAoaXNfdm9pY2VfcHJpdmFjeV8sIG90aGVyLT5pc192b2ljZV9wcml2YWN5Xyk7Ci0gICAgc3RkOjpzd2FwKG51bWJlcl8sIG90aGVyLT5udW1iZXJfKTsKLSAgICBzdGQ6OnN3YXAobnVtYmVyX3ByZXNlbnRhdGlvbl8sIG90aGVyLT5udW1iZXJfcHJlc2VudGF0aW9uXyk7Ci0gICAgc3RkOjpzd2FwKG5hbWVfLCBvdGhlci0+bmFtZV8pOwotICAgIHN0ZDo6c3dhcChuYW1lX3ByZXNlbnRhdGlvbl8sIG90aGVyLT5uYW1lX3ByZXNlbnRhdGlvbl8pOwotICAgIHN0ZDo6c3dhcCh1dXNfaW5mb18sIG90aGVyLT51dXNfaW5mb18pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJpbENhbGw6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJpbENhbGxfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBSaWxDYWxsX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBpbnQgUklMR1dTaWduYWxTdHJlbmd0aDo6a1NpZ25hbFN0cmVuZ3RoRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUklMR1dTaWduYWxTdHJlbmd0aDo6a0JpdEVycm9yUmF0ZUZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUklMR1dTaWduYWxTdHJlbmd0aDo6UklMR1dTaWduYWxTdHJlbmd0aCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUklMR1dTaWduYWxTdHJlbmd0aDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1SSUxHV1NpZ25hbFN0cmVuZ3RoOjpSSUxHV1NpZ25hbFN0cmVuZ3RoKGNvbnN0IFJJTEdXU2lnbmFsU3RyZW5ndGgmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgc2lnbmFsX3N0cmVuZ3RoXyA9IDA7Ci0gIGJpdF9lcnJvcl9yYXRlXyA9IDA7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLVJJTEdXU2lnbmFsU3RyZW5ndGg6On5SSUxHV1NpZ25hbFN0cmVuZ3RoKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUklMR1dTaWduYWxTdHJlbmd0aDo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIFJJTEdXU2lnbmFsU3RyZW5ndGg6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJJTEdXU2lnbmFsU3RyZW5ndGhfZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IFJJTEdXU2lnbmFsU3RyZW5ndGgmIFJJTEdXU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1SSUxHV1NpZ25hbFN0cmVuZ3RoKiBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVJJTEdXU2lnbmFsU3RyZW5ndGgqIFJJTEdXU2lnbmFsU3RyZW5ndGg6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBSSUxHV1NpZ25hbFN0cmVuZ3RoOwotfQotCi12b2lkIFJJTEdXU2lnbmFsU3RyZW5ndGg6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIHNpZ25hbF9zdHJlbmd0aF8gPSAwOwotICAgIGJpdF9lcnJvcl9yYXRlXyA9IDA7Ci0gIH0KLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotfQotCi1ib29sIFJJTEdXU2lnbmFsU3RyZW5ndGg6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIHNpZ25hbF9zdHJlbmd0aCA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmc2lnbmFsX3N0cmVuZ3RoXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9iaXRfZXJyb3JfcmF0ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIGJpdF9lcnJvcl9yYXRlID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX2JpdF9lcnJvcl9yYXRlOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmJpdF9lcnJvcl9yYXRlXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBvcHRpb25hbCBpbnQzMiBzaWduYWxfc3RyZW5ndGggPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigxLCB0aGlzLT5zaWduYWxfc3RyZW5ndGgoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgYml0X2Vycm9yX3JhdGUgPSAyOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigyLCB0aGlzLT5iaXRfZXJyb3JfcmF0ZSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogUklMR1dTaWduYWxTdHJlbmd0aDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gb3B0aW9uYWwgaW50MzIgc2lnbmFsX3N0cmVuZ3RoID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDEsIHRoaXMtPnNpZ25hbF9zdHJlbmd0aCgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBiaXRfZXJyb3JfcmF0ZSA9IDI7Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgyLCB0aGlzLT5iaXRfZXJyb3JfcmF0ZSgpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBzaWduYWxfc3RyZW5ndGggPSAxOwotICAgIGlmIChoYXNfc2lnbmFsX3N0cmVuZ3RoKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+c2lnbmFsX3N0cmVuZ3RoKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBiaXRfZXJyb3JfcmF0ZSA9IDI7Ci0gICAgaWYgKGhhc19iaXRfZXJyb3JfcmF0ZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPmJpdF9lcnJvcl9yYXRlKCkpOwotICAgIH0KLSAgICAKLSAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJJTEdXU2lnbmFsU3RyZW5ndGgqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBSSUxHV1NpZ25hbFN0cmVuZ3RoKj4oCi0gICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIFJJTEdXU2lnbmFsU3RyZW5ndGg6Ok1lcmdlRnJvbShjb25zdCBSSUxHV1NpZ25hbFN0cmVuZ3RoJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5faGFzX2JpdCgwKSkgewotICAgICAgc2V0X3NpZ25hbF9zdHJlbmd0aChmcm9tLnNpZ25hbF9zdHJlbmd0aCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF9iaXRfZXJyb3JfcmF0ZShmcm9tLmJpdF9lcnJvcl9yYXRlKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJJTEdXU2lnbmFsU3RyZW5ndGg6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUklMR1dTaWduYWxTdHJlbmd0aDo6Q29weUZyb20oY29uc3QgUklMR1dTaWduYWxTdHJlbmd0aCYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUklMR1dTaWduYWxTdHJlbmd0aDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJJTEdXU2lnbmFsU3RyZW5ndGg6OlN3YXAoUklMR1dTaWduYWxTdHJlbmd0aCogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAoc2lnbmFsX3N0cmVuZ3RoXywgb3RoZXItPnNpZ25hbF9zdHJlbmd0aF8pOwotICAgIHN0ZDo6c3dhcChiaXRfZXJyb3JfcmF0ZV8sIG90aGVyLT5iaXRfZXJyb3JfcmF0ZV8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJJTEdXU2lnbmFsU3RyZW5ndGg6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJJTEdXU2lnbmFsU3RyZW5ndGhfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBSSUxHV1NpZ25hbFN0cmVuZ3RoX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBpbnQgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjprRGJtRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjprRWNpb0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGgoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIFJJTENETUFTaWduYWxTdHJlbmd0aDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1SSUxDRE1BU2lnbmFsU3RyZW5ndGg6OlJJTENETUFTaWduYWxTdHJlbmd0aChjb25zdCBSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBkYm1fID0gMDsKLSAgZWNpb18gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1SSUxDRE1BU2lnbmFsU3RyZW5ndGg6On5SSUxDRE1BU2lnbmFsU3RyZW5ndGgoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gUklMQ0RNQVNpZ25hbFN0cmVuZ3RoX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIFJJTENETUFTaWduYWxTdHJlbmd0aDo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVJJTENETUFTaWduYWxTdHJlbmd0aCogUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVJJTENETUFTaWduYWxTdHJlbmd0aCogUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOwotfQotCi12b2lkIFJJTENETUFTaWduYWxTdHJlbmd0aDo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgZGJtXyA9IDA7Ci0gICAgZWNpb18gPSAwOwotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIGRibSA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmZGJtXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9lY2lvOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgZWNpbyA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9lY2lvOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmVjaW9fKSkpOwotICAgICAgICAgIF9zZXRfYml0KDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFJJTENETUFTaWduYWxTdHJlbmd0aDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gb3B0aW9uYWwgaW50MzIgZGJtID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMSwgdGhpcy0+ZGJtKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIGVjaW8gPSAyOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigyLCB0aGlzLT5lY2lvKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIG9wdGlvbmFsIGludDMyIGRibSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgxLCB0aGlzLT5kYm0oKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgZWNpbyA9IDI7Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgyLCB0aGlzLT5lY2lvKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IFJJTENETUFTaWduYWxTdHJlbmd0aDo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gb3B0aW9uYWwgaW50MzIgZGJtID0gMTsKLSAgICBpZiAoaGFzX2RibSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPmRibSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgZWNpbyA9IDI7Ci0gICAgaWYgKGhhc19lY2lvKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+ZWNpbygpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJJTENETUFTaWduYWxTdHJlbmd0aCogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFJJTENETUFTaWduYWxTdHJlbmd0aCo+KAotICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6Ok1lcmdlRnJvbShjb25zdCBSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDApKSB7Ci0gICAgICBzZXRfZGJtKGZyb20uZGJtKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCgxKSkgewotICAgICAgc2V0X2VjaW8oZnJvbS5lY2lvKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJJTENETUFTaWduYWxTdHJlbmd0aDo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OkNvcHlGcm9tKGNvbnN0IFJJTENETUFTaWduYWxTdHJlbmd0aCYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpTd2FwKFJJTENETUFTaWduYWxTdHJlbmd0aCogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAoZGJtXywgb3RoZXItPmRibV8pOwotICAgIHN0ZDo6c3dhcChlY2lvXywgb3RoZXItPmVjaW9fKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJJTENETUFTaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFJJTENETUFTaWduYWxTdHJlbmd0aF9yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6a0RibUZpZWxkTnVtYmVyOwotY29uc3QgaW50IFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6a0VjaW9GaWVsZE51bWJlcjsKLWNvbnN0IGludCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OmtTaWduYWxOb2lzZVJhdGlvRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgotCi1SSUxFVkRPU2lnbmFsU3RyZW5ndGg6OlJJTEVWRE9TaWduYWxTdHJlbmd0aCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLVJJTEVWRE9TaWduYWxTdHJlbmd0aDo6UklMRVZET1NpZ25hbFN0cmVuZ3RoKGNvbnN0IFJJTEVWRE9TaWduYWxTdHJlbmd0aCYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGRibV8gPSAwOwotICBlY2lvXyA9IDA7Ci0gIHNpZ25hbF9ub2lzZV9yYXRpb18gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1SSUxFVkRPU2lnbmFsU3RyZW5ndGg6On5SSUxFVkRPU2lnbmFsU3RyZW5ndGgoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gUklMRVZET1NpZ25hbFN0cmVuZ3RoX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSSUxFVkRPU2lnbmFsU3RyZW5ndGgmIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVJJTEVWRE9TaWduYWxTdHJlbmd0aCogUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVJJTEVWRE9TaWduYWxTdHJlbmd0aCogUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUklMRVZET1NpZ25hbFN0cmVuZ3RoOwotfQotCi12b2lkIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgZGJtXyA9IDA7Ci0gICAgZWNpb18gPSAwOwotICAgIHNpZ25hbF9ub2lzZV9yYXRpb18gPSAwOwotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIGRibSA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmZGJtXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9lY2lvOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgZWNpbyA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9lY2lvOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmVjaW9fKSkpOwotICAgICAgICAgIF9zZXRfYml0KDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjQpKSBnb3RvIHBhcnNlX3NpZ25hbF9ub2lzZV9yYXRpbzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIHNpZ25hbF9ub2lzZV9yYXRpbyA9IDM7Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9zaWduYWxfbm9pc2VfcmF0aW86Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmc2lnbmFsX25vaXNlX3JhdGlvXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIG9wdGlvbmFsIGludDMyIGRibSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDEsIHRoaXMtPmRibSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBlY2lvID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMiwgdGhpcy0+ZWNpbygpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBzaWduYWxfbm9pc2VfcmF0aW8gPSAzOwotICBpZiAoX2hhc19iaXQoMikpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigzLCB0aGlzLT5zaWduYWxfbm9pc2VfcmF0aW8oKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gb3B0aW9uYWwgaW50MzIgZGJtID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDEsIHRoaXMtPmRibSgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBlY2lvID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDIsIHRoaXMtPmVjaW8oKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgc2lnbmFsX25vaXNlX3JhdGlvID0gMzsKLSAgaWYgKF9oYXNfYml0KDIpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDMsIHRoaXMtPnNpZ25hbF9ub2lzZV9yYXRpbygpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIG9wdGlvbmFsIGludDMyIGRibSA9IDE7Ci0gICAgaWYgKGhhc19kYm0oKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5kYm0oKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIGVjaW8gPSAyOwotICAgIGlmIChoYXNfZWNpbygpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPmVjaW8oKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIHNpZ25hbF9ub2lzZV9yYXRpbyA9IDM7Ci0gICAgaWYgKGhhc19zaWduYWxfbm9pc2VfcmF0aW8oKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5zaWduYWxfbm9pc2VfcmF0aW8oKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBSSUxFVkRPU2lnbmFsU3RyZW5ndGgqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBSSUxFVkRPU2lnbmFsU3RyZW5ndGgqPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpNZXJnZUZyb20oY29uc3QgUklMRVZET1NpZ25hbFN0cmVuZ3RoJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5faGFzX2JpdCgwKSkgewotICAgICAgc2V0X2RibShmcm9tLmRibSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF9lY2lvKGZyb20uZWNpbygpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMikpIHsKLSAgICAgIHNldF9zaWduYWxfbm9pc2VfcmF0aW8oZnJvbS5zaWduYWxfbm9pc2VfcmF0aW8oKSk7Ci0gICAgfQotICB9Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci19Ci0KLXZvaWQgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6Q29weUZyb20oY29uc3QgUklMRVZET1NpZ25hbFN0cmVuZ3RoJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OlN3YXAoUklMRVZET1NpZ25hbFN0cmVuZ3RoKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChkYm1fLCBvdGhlci0+ZGJtXyk7Ci0gICAgc3RkOjpzd2FwKGVjaW9fLCBvdGhlci0+ZWNpb18pOwotICAgIHN0ZDo6c3dhcChzaWduYWxfbm9pc2VfcmF0aW9fLCBvdGhlci0+c2lnbmFsX25vaXNlX3JhdGlvXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBSSUxFVkRPU2lnbmFsU3RyZW5ndGhfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBSSUxFVkRPU2lnbmFsU3RyZW5ndGhfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBSc3BTdHJpbmdzOjprU3RyaW5nc0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUnNwU3RyaW5nczo6UnNwU3RyaW5ncygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUnNwU3RyaW5nczo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1Sc3BTdHJpbmdzOjpSc3BTdHJpbmdzKGNvbnN0IFJzcFN0cmluZ3MmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSc3BTdHJpbmdzOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotUnNwU3RyaW5nczo6flJzcFN0cmluZ3MoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBSc3BTdHJpbmdzOjpTaGFyZWREdG9yKCkgewotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgUnNwU3RyaW5nczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJzcFN0cmluZ3M6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gUnNwU3RyaW5nc19kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgUnNwU3RyaW5ncyYgUnNwU3RyaW5nczo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVJzcFN0cmluZ3MqIFJzcFN0cmluZ3M6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotUnNwU3RyaW5ncyogUnNwU3RyaW5nczo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFJzcFN0cmluZ3M7Ci19Ci0KLXZvaWQgUnNwU3RyaW5nczo6Q2xlYXIoKSB7Ci0gIHN0cmluZ3NfLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSc3BTdHJpbmdzOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXBlYXRlZCBzdHJpbmcgc3RyaW5ncyA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2Vfc3RyaW5nczoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPmFkZF9zdHJpbmdzKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgICAgICAgdGhpcy0+c3RyaW5ncygwKS5kYXRhKCksIHRoaXMtPnN0cmluZ3MoMCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMCkpIGdvdG8gcGFyc2Vfc3RyaW5nczsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFJzcFN0cmluZ3M6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIHJlcGVhdGVkIHN0cmluZyBzdHJpbmdzID0gMTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5zdHJpbmdzX3NpemUoKTsgaSsrKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgdGhpcy0+c3RyaW5ncyhpKS5kYXRhKCksIHRoaXMtPnN0cmluZ3MoaSkubGVuZ3RoKCksCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCi0gICAgICAxLCB0aGlzLT5zdHJpbmdzKGkpLCBvdXRwdXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogUnNwU3RyaW5nczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gcmVwZWF0ZWQgc3RyaW5nIHN0cmluZ3MgPSAxOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnN0cmluZ3Nfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+c3RyaW5ncyhpKS5kYXRhKCksIHRoaXMtPnN0cmluZ3MoaSkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlU3RyaW5nVG9BcnJheSgxLCB0aGlzLT5zdHJpbmdzKGkpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBSc3BTdHJpbmdzOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgLy8gcmVwZWF0ZWQgc3RyaW5nIHN0cmluZ3MgPSAxOwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5zdHJpbmdzX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5zdHJpbmdzX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgIHRoaXMtPnN0cmluZ3MoaSkpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBSc3BTdHJpbmdzOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJzcFN0cmluZ3MqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBSc3BTdHJpbmdzKj4oCi0gICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIFJzcFN0cmluZ3M6Ok1lcmdlRnJvbShjb25zdCBSc3BTdHJpbmdzJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIHN0cmluZ3NfLk1lcmdlRnJvbShmcm9tLnN0cmluZ3NfKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBSc3BTdHJpbmdzOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJzcFN0cmluZ3M6OkNvcHlGcm9tKGNvbnN0IFJzcFN0cmluZ3MmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIFJzcFN0cmluZ3M6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSc3BTdHJpbmdzOjpTd2FwKFJzcFN0cmluZ3MqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RyaW5nc18uU3dhcCgmb3RoZXItPnN0cmluZ3NfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBSc3BTdHJpbmdzOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBSc3BTdHJpbmdzX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gUnNwU3RyaW5nc19yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJzcEludGVnZXJzOjprSW50ZWdlcnNGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLVJzcEludGVnZXJzOjpSc3BJbnRlZ2VycygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUnNwSW50ZWdlcnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotUnNwSW50ZWdlcnM6OlJzcEludGVnZXJzKGNvbnN0IFJzcEludGVnZXJzJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUnNwSW50ZWdlcnM6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1Sc3BJbnRlZ2Vyczo6flJzcEludGVnZXJzKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUnNwSW50ZWdlcnM6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBSc3BJbnRlZ2Vyczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJzcEludGVnZXJzOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJzcEludGVnZXJzX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSc3BJbnRlZ2VycyYgUnNwSW50ZWdlcnM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1Sc3BJbnRlZ2VycyogUnNwSW50ZWdlcnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotUnNwSW50ZWdlcnMqIFJzcEludGVnZXJzOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUnNwSW50ZWdlcnM7Ci19Ci0KLXZvaWQgUnNwSW50ZWdlcnM6OkNsZWFyKCkgewotICBpbnRlZ2Vyc18uQ2xlYXIoKTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotfQotCi1ib29sIFJzcEludGVnZXJzOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXBlYXRlZCBpbnQzMiBpbnRlZ2VycyA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9pbnRlZ2VyczoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICAxLCA4LCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9pbnRlZ2VycygpKSkpOwotICAgICAgICB9IGVsc2UgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpCi0gICAgICAgICAgICAgICAgICAgPT0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgICAgICAgICAgICAgICAgIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkUHJpbWl0aXZlTm9JbmxpbmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9pbnRlZ2VycygpKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoOCkpIGdvdG8gcGFyc2VfaW50ZWdlcnM7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBSc3BJbnRlZ2Vyczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gcmVwZWF0ZWQgaW50MzIgaW50ZWdlcnMgPSAxOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmludGVnZXJzX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoCi0gICAgICAxLCB0aGlzLT5pbnRlZ2VycyhpKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFJzcEludGVnZXJzOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyByZXBlYXRlZCBpbnQzMiBpbnRlZ2VycyA9IDE7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+aW50ZWdlcnNfc2l6ZSgpOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZUludDMyVG9BcnJheSgxLCB0aGlzLT5pbnRlZ2VycyhpKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgUnNwSW50ZWdlcnM6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICAvLyByZXBlYXRlZCBpbnQzMiBpbnRlZ2VycyA9IDE7Ci0gIHsKLSAgICBpbnQgZGF0YV9zaXplID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmludGVnZXJzX3NpemUoKTsgaSsrKSB7Ci0gICAgICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgICBJbnQzMlNpemUodGhpcy0+aW50ZWdlcnMoaSkpOwotICAgIH0KLSAgICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5pbnRlZ2Vyc19zaXplKCkgKyBkYXRhX3NpemU7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFJzcEludGVnZXJzOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJzcEludGVnZXJzKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUnNwSW50ZWdlcnMqPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgUnNwSW50ZWdlcnM6Ok1lcmdlRnJvbShjb25zdCBSc3BJbnRlZ2VycyYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpbnRlZ2Vyc18uTWVyZ2VGcm9tKGZyb20uaW50ZWdlcnNfKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBSc3BJbnRlZ2Vyczo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSc3BJbnRlZ2Vyczo6Q29weUZyb20oY29uc3QgUnNwSW50ZWdlcnMmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIFJzcEludGVnZXJzOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUnNwSW50ZWdlcnM6OlN3YXAoUnNwSW50ZWdlcnMqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgaW50ZWdlcnNfLlN3YXAoJm90aGVyLT5pbnRlZ2Vyc18pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJzcEludGVnZXJzOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBSc3BJbnRlZ2Vyc19kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFJzcEludGVnZXJzX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBpbnQgUnNwR2V0U2ltU3RhdHVzOjprQ2FyZFN0YXR1c0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUnNwR2V0U2ltU3RhdHVzOjpSc3BHZXRTaW1TdGF0dXMoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIFJzcEdldFNpbVN0YXR1czo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotICBjYXJkX3N0YXR1c18gPSBjb25zdF9jYXN0PCA6OnJpbF9wcm90bzo6UmlsQ2FyZFN0YXR1cyo+KCY6OnJpbF9wcm90bzo6UmlsQ2FyZFN0YXR1czo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLX0KLQotUnNwR2V0U2ltU3RhdHVzOjpSc3BHZXRTaW1TdGF0dXMoY29uc3QgUnNwR2V0U2ltU3RhdHVzJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUnNwR2V0U2ltU3RhdHVzOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgY2FyZF9zdGF0dXNfID0gTlVMTDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotUnNwR2V0U2ltU3RhdHVzOjp+UnNwR2V0U2ltU3RhdHVzKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUnNwR2V0U2ltU3RhdHVzOjpTaGFyZWREdG9yKCkgewotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICAgIGRlbGV0ZSBjYXJkX3N0YXR1c187Ci0gIH0KLX0KLQotdm9pZCBSc3BHZXRTaW1TdGF0dXM6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSc3BHZXRTaW1TdGF0dXM6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gUnNwR2V0U2ltU3RhdHVzX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSc3BHZXRTaW1TdGF0dXMmIFJzcEdldFNpbVN0YXR1czo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVJzcEdldFNpbVN0YXR1cyogUnNwR2V0U2ltU3RhdHVzOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVJzcEdldFNpbVN0YXR1cyogUnNwR2V0U2ltU3RhdHVzOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUnNwR2V0U2ltU3RhdHVzOwotfQotCi12b2lkIFJzcEdldFNpbVN0YXR1czo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgICBpZiAoY2FyZF9zdGF0dXNfICE9IE5VTEwpIGNhcmRfc3RhdHVzXy0+OjpyaWxfcHJvdG86OlJpbENhcmRTdGF0dXM6OkNsZWFyKCk7Ci0gICAgfQotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSc3BHZXRTaW1TdGF0dXM6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcXVpcmVkIC5yaWxfcHJvdG8uUmlsQ2FyZFN0YXR1cyBjYXJkX3N0YXR1cyA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9jYXJkX3N0YXR1cygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgUnNwR2V0U2ltU3RhdHVzOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCAucmlsX3Byb3RvLlJpbENhcmRTdGF0dXMgY2FyZF9zdGF0dXMgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgMSwgdGhpcy0+Y2FyZF9zdGF0dXMoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFJzcEdldFNpbVN0YXR1czo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgLnJpbF9wcm90by5SaWxDYXJkU3RhdHVzIGNhcmRfc3RhdHVzID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+Y2FyZF9zdGF0dXMoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgUnNwR2V0U2ltU3RhdHVzOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyByZXF1aXJlZCAucmlsX3Byb3RvLlJpbENhcmRTdGF0dXMgY2FyZF9zdGF0dXMgPSAxOwotICAgIGlmIChoYXNfY2FyZF9zdGF0dXMoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgIHRoaXMtPmNhcmRfc3RhdHVzKCkpOwotICAgIH0KLSAgICAKLSAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBSc3BHZXRTaW1TdGF0dXM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgUnNwR2V0U2ltU3RhdHVzKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUnNwR2V0U2ltU3RhdHVzKj4oCi0gICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIFJzcEdldFNpbVN0YXR1czo6TWVyZ2VGcm9tKGNvbnN0IFJzcEdldFNpbVN0YXR1cyYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIG11dGFibGVfY2FyZF9zdGF0dXMoKS0+OjpyaWxfcHJvdG86OlJpbENhcmRTdGF0dXM6Ok1lcmdlRnJvbShmcm9tLmNhcmRfc3RhdHVzKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJzcEdldFNpbVN0YXR1czo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSc3BHZXRTaW1TdGF0dXM6OkNvcHlGcm9tKGNvbnN0IFJzcEdldFNpbVN0YXR1cyYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUnNwR2V0U2ltU3RhdHVzOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICBpZiAoKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxKSAhPSAweDAwMDAwMDAxKSByZXR1cm4gZmFsc2U7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSc3BHZXRTaW1TdGF0dXM6OlN3YXAoUnNwR2V0U2ltU3RhdHVzKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChjYXJkX3N0YXR1c18sIG90aGVyLT5jYXJkX3N0YXR1c18pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJzcEdldFNpbVN0YXR1czo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gUnNwR2V0U2ltU3RhdHVzX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gUnNwR2V0U2ltU3RhdHVzX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jb25zdCA6OnN0ZDo6c3RyaW5nIFJlcUVudGVyU2ltUGluOjpfZGVmYXVsdF9waW5fOwotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJlcUVudGVyU2ltUGluOjprUGluRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgotCi1SZXFFbnRlclNpbVBpbjo6UmVxRW50ZXJTaW1QaW4oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIFJlcUVudGVyU2ltUGluOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLVJlcUVudGVyU2ltUGluOjpSZXFFbnRlclNpbVBpbihjb25zdCBSZXFFbnRlclNpbVBpbiYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJlcUVudGVyU2ltUGluOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgcGluXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmX2RlZmF1bHRfcGluXyk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLVJlcUVudGVyU2ltUGluOjp+UmVxRW50ZXJTaW1QaW4oKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBSZXFFbnRlclNpbVBpbjo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHBpbl8gIT0gJl9kZWZhdWx0X3Bpbl8pIHsKLSAgICBkZWxldGUgcGluXzsKLSAgfQotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgUmVxRW50ZXJTaW1QaW46OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSZXFFbnRlclNpbVBpbjo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBSZXFFbnRlclNpbVBpbl9kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgUmVxRW50ZXJTaW1QaW4mIFJlcUVudGVyU2ltUGluOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotUmVxRW50ZXJTaW1QaW4qIFJlcUVudGVyU2ltUGluOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVJlcUVudGVyU2ltUGluKiBSZXFFbnRlclNpbVBpbjo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFJlcUVudGVyU2ltUGluOwotfQotCi12b2lkIFJlcUVudGVyU2ltUGluOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICAgIGlmIChwaW5fICE9ICZfZGVmYXVsdF9waW5fKSB7Ci0gICAgICAgIHBpbl8tPmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSZXFFbnRlclNpbVBpbjo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gcmVxdWlyZWQgc3RyaW5nIHBpbiA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9waW4oKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgICAgICAgICB0aGlzLT5waW4oKS5kYXRhKCksIHRoaXMtPnBpbigpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFJlcUVudGVyU2ltUGluOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCBzdHJpbmcgcGluID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPnBpbigpLmRhdGEoKSwgdGhpcy0+cGluKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKLSAgICAgIDEsIHRoaXMtPnBpbigpLCBvdXRwdXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogUmVxRW50ZXJTaW1QaW46OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIHJlcXVpcmVkIHN0cmluZyBwaW4gPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+cGluKCkuZGF0YSgpLCB0aGlzLT5waW4oKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDEsIHRoaXMtPnBpbigpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBSZXFFbnRlclNpbVBpbjo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gcmVxdWlyZWQgc3RyaW5nIHBpbiA9IDE7Ci0gICAgaWYgKGhhc19waW4oKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+cGluKCkpOwotICAgIH0KLSAgICAKLSAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBSZXFFbnRlclNpbVBpbjo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBSZXFFbnRlclNpbVBpbiogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFJlcUVudGVyU2ltUGluKj4oCi0gICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIFJlcUVudGVyU2ltUGluOjpNZXJnZUZyb20oY29uc3QgUmVxRW50ZXJTaW1QaW4mIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDApKSB7Ci0gICAgICBzZXRfcGluKGZyb20ucGluKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJlcUVudGVyU2ltUGluOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJlcUVudGVyU2ltUGluOjpDb3B5RnJvbShjb25zdCBSZXFFbnRlclNpbVBpbiYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUmVxRW50ZXJTaW1QaW46OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDEpICE9IDB4MDAwMDAwMDEpIHJldHVybiBmYWxzZTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJlcUVudGVyU2ltUGluOjpTd2FwKFJlcUVudGVyU2ltUGluKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChwaW5fLCBvdGhlci0+cGluXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgUmVxRW50ZXJTaW1QaW46OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJlcUVudGVyU2ltUGluX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gUmVxRW50ZXJTaW1QaW5fcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBSc3BFbnRlclNpbVBpbjo6a1JldHJpZXNSZW1haW5pbmdGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLVJzcEVudGVyU2ltUGluOjpSc3BFbnRlclNpbVBpbigpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUnNwRW50ZXJTaW1QaW46OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotUnNwRW50ZXJTaW1QaW46OlJzcEVudGVyU2ltUGluKGNvbnN0IFJzcEVudGVyU2ltUGluJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUnNwRW50ZXJTaW1QaW46OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICByZXRyaWVzX3JlbWFpbmluZ18gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1Sc3BFbnRlclNpbVBpbjo6flJzcEVudGVyU2ltUGluKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUnNwRW50ZXJTaW1QaW46OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBSc3BFbnRlclNpbVBpbjo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJzcEVudGVyU2ltUGluOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJzcEVudGVyU2ltUGluX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSc3BFbnRlclNpbVBpbiYgUnNwRW50ZXJTaW1QaW46OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1Sc3BFbnRlclNpbVBpbiogUnNwRW50ZXJTaW1QaW46OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotUnNwRW50ZXJTaW1QaW4qIFJzcEVudGVyU2ltUGluOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUnNwRW50ZXJTaW1QaW47Ci19Ci0KLXZvaWQgUnNwRW50ZXJTaW1QaW46OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIHJldHJpZXNfcmVtYWluaW5nXyA9IDA7Ci0gIH0KLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotfQotCi1ib29sIFJzcEVudGVyU2ltUGluOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCBpbnQzMiByZXRyaWVzX3JlbWFpbmluZyA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmcmV0cmllc19yZW1haW5pbmdfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFJzcEVudGVyU2ltUGluOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCBpbnQzMiByZXRyaWVzX3JlbWFpbmluZyA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDEsIHRoaXMtPnJldHJpZXNfcmVtYWluaW5nKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBSc3BFbnRlclNpbVBpbjo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgaW50MzIgcmV0cmllc19yZW1haW5pbmcgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMSwgdGhpcy0+cmV0cmllc19yZW1haW5pbmcoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgUnNwRW50ZXJTaW1QaW46OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIHJlcXVpcmVkIGludDMyIHJldHJpZXNfcmVtYWluaW5nID0gMTsKLSAgICBpZiAoaGFzX3JldHJpZXNfcmVtYWluaW5nKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+cmV0cmllc19yZW1haW5pbmcoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFJzcEVudGVyU2ltUGluOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJzcEVudGVyU2ltUGluKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUnNwRW50ZXJTaW1QaW4qPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgUnNwRW50ZXJTaW1QaW46Ok1lcmdlRnJvbShjb25zdCBSc3BFbnRlclNpbVBpbiYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9yZXRyaWVzX3JlbWFpbmluZyhmcm9tLnJldHJpZXNfcmVtYWluaW5nKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJzcEVudGVyU2ltUGluOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJzcEVudGVyU2ltUGluOjpDb3B5RnJvbShjb25zdCBSc3BFbnRlclNpbVBpbiYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUnNwRW50ZXJTaW1QaW46OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDEpICE9IDB4MDAwMDAwMDEpIHJldHVybiBmYWxzZTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJzcEVudGVyU2ltUGluOjpTd2FwKFJzcEVudGVyU2ltUGluKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChyZXRyaWVzX3JlbWFpbmluZ18sIG90aGVyLT5yZXRyaWVzX3JlbWFpbmluZ18pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJzcEVudGVyU2ltUGluOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBSc3BFbnRlclNpbVBpbl9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFJzcEVudGVyU2ltUGluX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBpbnQgUnNwR2V0Q3VycmVudENhbGxzOjprQ2FsbHNGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLVJzcEdldEN1cnJlbnRDYWxsczo6UnNwR2V0Q3VycmVudENhbGxzKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLX0KLQotdm9pZCBSc3BHZXRDdXJyZW50Q2FsbHM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotUnNwR2V0Q3VycmVudENhbGxzOjpSc3BHZXRDdXJyZW50Q2FsbHMoY29uc3QgUnNwR2V0Q3VycmVudENhbGxzJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUnNwR2V0Q3VycmVudENhbGxzOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotUnNwR2V0Q3VycmVudENhbGxzOjp+UnNwR2V0Q3VycmVudENhbGxzKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUnNwR2V0Q3VycmVudENhbGxzOjpTaGFyZWREdG9yKCkgewotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgUnNwR2V0Q3VycmVudENhbGxzOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUnNwR2V0Q3VycmVudENhbGxzOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJzcEdldEN1cnJlbnRDYWxsc19kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgUnNwR2V0Q3VycmVudENhbGxzJiBSc3BHZXRDdXJyZW50Q2FsbHM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1Sc3BHZXRDdXJyZW50Q2FsbHMqIFJzcEdldEN1cnJlbnRDYWxsczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1Sc3BHZXRDdXJyZW50Q2FsbHMqIFJzcEdldEN1cnJlbnRDYWxsczo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFJzcEdldEN1cnJlbnRDYWxsczsKLX0KLQotdm9pZCBSc3BHZXRDdXJyZW50Q2FsbHM6OkNsZWFyKCkgewotICBjYWxsc18uQ2xlYXIoKTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotfQotCi1ib29sIFJzcEdldEN1cnJlbnRDYWxsczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gcmVwZWF0ZWQgLnJpbF9wcm90by5SaWxDYWxsIGNhbGxzID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9jYWxsczoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfY2FsbHMoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2NhbGxzOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgUnNwR2V0Q3VycmVudENhbGxzOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXBlYXRlZCAucmlsX3Byb3RvLlJpbENhbGwgY2FsbHMgPSAxOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmNhbGxzX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDEsIHRoaXMtPmNhbGxzKGkpLCBvdXRwdXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogUnNwR2V0Q3VycmVudENhbGxzOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyByZXBlYXRlZCAucmlsX3Byb3RvLlJpbENhbGwgY2FsbHMgPSAxOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmNhbGxzX3NpemUoKTsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+Y2FsbHMoaSksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IFJzcEdldEN1cnJlbnRDYWxsczo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIC8vIHJlcGVhdGVkIC5yaWxfcHJvdG8uUmlsQ2FsbCBjYWxscyA9IDE7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmNhbGxzX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5jYWxsc19zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+Y2FsbHMoaSkpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBSc3BHZXRDdXJyZW50Q2FsbHM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgUnNwR2V0Q3VycmVudENhbGxzKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUnNwR2V0Q3VycmVudENhbGxzKj4oCi0gICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIFJzcEdldEN1cnJlbnRDYWxsczo6TWVyZ2VGcm9tKGNvbnN0IFJzcEdldEN1cnJlbnRDYWxscyYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjYWxsc18uTWVyZ2VGcm9tKGZyb20uY2FsbHNfKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBSc3BHZXRDdXJyZW50Q2FsbHM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUnNwR2V0Q3VycmVudENhbGxzOjpDb3B5RnJvbShjb25zdCBSc3BHZXRDdXJyZW50Q2FsbHMmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIFJzcEdldEN1cnJlbnRDYWxsczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJzcEdldEN1cnJlbnRDYWxsczo6U3dhcChSc3BHZXRDdXJyZW50Q2FsbHMqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgY2FsbHNfLlN3YXAoJm90aGVyLT5jYWxsc18pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJzcEdldEN1cnJlbnRDYWxsczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gUnNwR2V0Q3VycmVudENhbGxzX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gUnNwR2V0Q3VycmVudENhbGxzX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jb25zdCA6OnN0ZDo6c3RyaW5nIFJlcURpYWw6Ol9kZWZhdWx0X2FkZHJlc3NfOwotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJlcURpYWw6OmtBZGRyZXNzRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUmVxRGlhbDo6a0NsaXJGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSZXFEaWFsOjprVXVzSW5mb0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUmVxRGlhbDo6UmVxRGlhbCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUmVxRGlhbDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotICB1dXNfaW5mb18gPSBjb25zdF9jYXN0PCA6OnJpbF9wcm90bzo6UmlsVXVzSW5mbyo+KCY6OnJpbF9wcm90bzo6UmlsVXVzSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLX0KLQotUmVxRGlhbDo6UmVxRGlhbChjb25zdCBSZXFEaWFsJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUmVxRGlhbDo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGFkZHJlc3NfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCZfZGVmYXVsdF9hZGRyZXNzXyk7Ci0gIGNsaXJfID0gMDsKLSAgdXVzX2luZm9fID0gTlVMTDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotUmVxRGlhbDo6flJlcURpYWwoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBSZXFEaWFsOjpTaGFyZWREdG9yKCkgewotICBpZiAoYWRkcmVzc18gIT0gJl9kZWZhdWx0X2FkZHJlc3NfKSB7Ci0gICAgZGVsZXRlIGFkZHJlc3NfOwotICB9Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gICAgZGVsZXRlIHV1c19pbmZvXzsKLSAgfQotfQotCi12b2lkIFJlcURpYWw6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSZXFEaWFsOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJlcURpYWxfZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IFJlcURpYWwmIFJlcURpYWw6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1SZXFEaWFsKiBSZXFEaWFsOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVJlcURpYWwqIFJlcURpYWw6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBSZXFEaWFsOwotfQotCi12b2lkIFJlcURpYWw6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChfaGFzX2JpdCgwKSkgewotICAgICAgaWYgKGFkZHJlc3NfICE9ICZfZGVmYXVsdF9hZGRyZXNzXykgewotICAgICAgICBhZGRyZXNzXy0+Y2xlYXIoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2xpcl8gPSAwOwotICAgIGlmIChfaGFzX2JpdCgyKSkgewotICAgICAgaWYgKHV1c19pbmZvXyAhPSBOVUxMKSB1dXNfaW5mb18tPjo6cmlsX3Byb3RvOjpSaWxVdXNJbmZvOjpDbGVhcigpOwotICAgIH0KLSAgfQotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci19Ci0KLWJvb2wgUmVxRGlhbDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGFkZHJlc3MgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfYWRkcmVzcygpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgICAgICAgIHRoaXMtPmFkZHJlc3MoKS5kYXRhKCksIHRoaXMtPmFkZHJlc3MoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9jbGlyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgY2xpciA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9jbGlyOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmNsaXJfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX3V1c19pbmZvOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNJbmZvIHV1c19pbmZvID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV91dXNfaW5mbzoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAotICAgICAgICAgICAgICAgaW5wdXQsIG11dGFibGVfdXVzX2luZm8oKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFJlcURpYWw6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIG9wdGlvbmFsIHN0cmluZyBhZGRyZXNzID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPmFkZHJlc3MoKS5kYXRhKCksIHRoaXMtPmFkZHJlc3MoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAotICAgICAgMSwgdGhpcy0+YWRkcmVzcygpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBjbGlyID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMiwgdGhpcy0+Y2xpcigpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFV1c0luZm8gdXVzX2luZm8gPSAzOwotICBpZiAoX2hhc19iaXQoMikpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgMywgdGhpcy0+dXVzX2luZm8oKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFJlcURpYWw6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIG9wdGlvbmFsIHN0cmluZyBhZGRyZXNzID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPmFkZHJlc3MoKS5kYXRhKCksIHRoaXMtPmFkZHJlc3MoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDEsIHRoaXMtPmFkZHJlc3MoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgY2xpciA9IDI7Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgyLCB0aGlzLT5jbGlyKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzSW5mbyB1dXNfaW5mbyA9IDM7Ci0gIGlmIChfaGFzX2JpdCgyKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDMsIHRoaXMtPnV1c19pbmZvKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IFJlcURpYWw6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBhZGRyZXNzID0gMTsKLSAgICBpZiAoaGFzX2FkZHJlc3MoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+YWRkcmVzcygpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgY2xpciA9IDI7Ci0gICAgaWYgKGhhc19jbGlyKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+Y2xpcigpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNJbmZvIHV1c19pbmZvID0gMzsKLSAgICBpZiAoaGFzX3V1c19pbmZvKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICB0aGlzLT51dXNfaW5mbygpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgUmVxRGlhbDo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBSZXFEaWFsKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUmVxRGlhbCo+KAotICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBSZXFEaWFsOjpNZXJnZUZyb20oY29uc3QgUmVxRGlhbCYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9hZGRyZXNzKGZyb20uYWRkcmVzcygpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF9jbGlyKGZyb20uY2xpcigpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMikpIHsKLSAgICAgIG11dGFibGVfdXVzX2luZm8oKS0+OjpyaWxfcHJvdG86OlJpbFV1c0luZm86Ok1lcmdlRnJvbShmcm9tLnV1c19pbmZvKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJlcURpYWw6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUmVxRGlhbDo6Q29weUZyb20oY29uc3QgUmVxRGlhbCYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUmVxRGlhbDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJlcURpYWw6OlN3YXAoUmVxRGlhbCogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAoYWRkcmVzc18sIG90aGVyLT5hZGRyZXNzXyk7Ci0gICAgc3RkOjpzd2FwKGNsaXJfLCBvdGhlci0+Y2xpcl8pOwotICAgIHN0ZDo6c3dhcCh1dXNfaW5mb18sIG90aGVyLT51dXNfaW5mb18pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJlcURpYWw6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJlcURpYWxfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBSZXFEaWFsX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBpbnQgUmVxSGFuZ1VwOjprQ29ubmVjdGlvbkluZGV4RmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgotCi1SZXFIYW5nVXA6OlJlcUhhbmdVcCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUmVxSGFuZ1VwOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLVJlcUhhbmdVcDo6UmVxSGFuZ1VwKGNvbnN0IFJlcUhhbmdVcCYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJlcUhhbmdVcDo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGNvbm5lY3Rpb25faW5kZXhfID0gMDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotUmVxSGFuZ1VwOjp+UmVxSGFuZ1VwKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUmVxSGFuZ1VwOjpTaGFyZWREdG9yKCkgewotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgUmVxSGFuZ1VwOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogUmVxSGFuZ1VwOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJlcUhhbmdVcF9kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgUmVxSGFuZ1VwJiBSZXFIYW5nVXA6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1SZXFIYW5nVXAqIFJlcUhhbmdVcDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1SZXFIYW5nVXAqIFJlcUhhbmdVcDo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFJlcUhhbmdVcDsKLX0KLQotdm9pZCBSZXFIYW5nVXA6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGNvbm5lY3Rpb25faW5kZXhfID0gMDsKLSAgfQotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci19Ci0KLWJvb2wgUmVxSGFuZ1VwOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCBpbnQzMiBjb25uZWN0aW9uX2luZGV4ID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZjb25uZWN0aW9uX2luZGV4XykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBSZXFIYW5nVXA6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIHJlcXVpcmVkIGludDMyIGNvbm5lY3Rpb25faW5kZXggPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigxLCB0aGlzLT5jb25uZWN0aW9uX2luZGV4KCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBSZXFIYW5nVXA6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIHJlcXVpcmVkIGludDMyIGNvbm5lY3Rpb25faW5kZXggPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMSwgdGhpcy0+Y29ubmVjdGlvbl9pbmRleCgpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBSZXFIYW5nVXA6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIHJlcXVpcmVkIGludDMyIGNvbm5lY3Rpb25faW5kZXggPSAxOwotICAgIGlmIChoYXNfY29ubmVjdGlvbl9pbmRleCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPmNvbm5lY3Rpb25faW5kZXgoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFJlcUhhbmdVcDo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBSZXFIYW5nVXAqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBSZXFIYW5nVXAqPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgUmVxSGFuZ1VwOjpNZXJnZUZyb20oY29uc3QgUmVxSGFuZ1VwJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5faGFzX2JpdCgwKSkgewotICAgICAgc2V0X2Nvbm5lY3Rpb25faW5kZXgoZnJvbS5jb25uZWN0aW9uX2luZGV4KCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJlcUhhbmdVcDo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSZXFIYW5nVXA6OkNvcHlGcm9tKGNvbnN0IFJlcUhhbmdVcCYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUmVxSGFuZ1VwOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICBpZiAoKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxKSAhPSAweDAwMDAwMDAxKSByZXR1cm4gZmFsc2U7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSZXFIYW5nVXA6OlN3YXAoUmVxSGFuZ1VwKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChjb25uZWN0aW9uX2luZGV4Xywgb3RoZXItPmNvbm5lY3Rpb25faW5kZXhfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBSZXFIYW5nVXA6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJlcUhhbmdVcF9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFJlcUhhbmdVcF9yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJzcExhc3RDYWxsRmFpbENhdXNlOjprTGFzdENhbGxGYWlsQ2F1c2VGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLVJzcExhc3RDYWxsRmFpbENhdXNlOjpSc3BMYXN0Q2FsbEZhaWxDYXVzZSgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotUnNwTGFzdENhbGxGYWlsQ2F1c2U6OlJzcExhc3RDYWxsRmFpbENhdXNlKGNvbnN0IFJzcExhc3RDYWxsRmFpbENhdXNlJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBsYXN0X2NhbGxfZmFpbF9jYXVzZV8gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1Sc3BMYXN0Q2FsbEZhaWxDYXVzZTo6flJzcExhc3RDYWxsRmFpbENhdXNlKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBSc3BMYXN0Q2FsbEZhaWxDYXVzZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJzcExhc3RDYWxsRmFpbENhdXNlOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJzcExhc3RDYWxsRmFpbENhdXNlX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSc3BMYXN0Q2FsbEZhaWxDYXVzZSYgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1Sc3BMYXN0Q2FsbEZhaWxDYXVzZSogUnNwTGFzdENhbGxGYWlsQ2F1c2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotUnNwTGFzdENhbGxGYWlsQ2F1c2UqIFJzcExhc3RDYWxsRmFpbENhdXNlOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUnNwTGFzdENhbGxGYWlsQ2F1c2U7Ci19Ci0KLXZvaWQgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGxhc3RfY2FsbF9mYWlsX2NhdXNlXyA9IDA7Ci0gIH0KLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotfQotCi1ib29sIFJzcExhc3RDYWxsRmFpbENhdXNlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCBpbnQzMiBsYXN0X2NhbGxfZmFpbF9jYXVzZSA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmbGFzdF9jYWxsX2ZhaWxfY2F1c2VfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFJzcExhc3RDYWxsRmFpbENhdXNlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCBpbnQzMiBsYXN0X2NhbGxfZmFpbF9jYXVzZSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDEsIHRoaXMtPmxhc3RfY2FsbF9mYWlsX2NhdXNlKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBSc3BMYXN0Q2FsbEZhaWxDYXVzZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgaW50MzIgbGFzdF9jYWxsX2ZhaWxfY2F1c2UgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMSwgdGhpcy0+bGFzdF9jYWxsX2ZhaWxfY2F1c2UoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIHJlcXVpcmVkIGludDMyIGxhc3RfY2FsbF9mYWlsX2NhdXNlID0gMTsKLSAgICBpZiAoaGFzX2xhc3RfY2FsbF9mYWlsX2NhdXNlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+bGFzdF9jYWxsX2ZhaWxfY2F1c2UoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFJzcExhc3RDYWxsRmFpbENhdXNlOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJzcExhc3RDYWxsRmFpbENhdXNlKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUnNwTGFzdENhbGxGYWlsQ2F1c2UqPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgUnNwTGFzdENhbGxGYWlsQ2F1c2U6Ok1lcmdlRnJvbShjb25zdCBSc3BMYXN0Q2FsbEZhaWxDYXVzZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9sYXN0X2NhbGxfZmFpbF9jYXVzZShmcm9tLmxhc3RfY2FsbF9mYWlsX2NhdXNlKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJzcExhc3RDYWxsRmFpbENhdXNlOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJzcExhc3RDYWxsRmFpbENhdXNlOjpDb3B5RnJvbShjb25zdCBSc3BMYXN0Q2FsbEZhaWxDYXVzZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUnNwTGFzdENhbGxGYWlsQ2F1c2U6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDEpICE9IDB4MDAwMDAwMDEpIHJldHVybiBmYWxzZTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJzcExhc3RDYWxsRmFpbENhdXNlOjpTd2FwKFJzcExhc3RDYWxsRmFpbENhdXNlKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChsYXN0X2NhbGxfZmFpbF9jYXVzZV8sIG90aGVyLT5sYXN0X2NhbGxfZmFpbF9jYXVzZV8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJzcExhc3RDYWxsRmFpbENhdXNlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBSc3BMYXN0Q2FsbEZhaWxDYXVzZV9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFJzcExhc3RDYWxsRmFpbENhdXNlX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBpbnQgUnNwU2lnbmFsU3RyZW5ndGg6OmtHd1NpZ25hbHN0cmVuZ3RoRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUnNwU2lnbmFsU3RyZW5ndGg6OmtDZG1hU2lnbmFsc3RyZW5ndGhGaWVsZE51bWJlcjsKLWNvbnN0IGludCBSc3BTaWduYWxTdHJlbmd0aDo6a0V2ZG9TaWduYWxzdHJlbmd0aEZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUnNwU2lnbmFsU3RyZW5ndGg6OlJzcFNpZ25hbFN0cmVuZ3RoKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLX0KLQotdm9pZCBSc3BTaWduYWxTdHJlbmd0aDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotICBnd19zaWduYWxzdHJlbmd0aF8gPSBjb25zdF9jYXN0PCA6OnJpbF9wcm90bzo6UklMR1dTaWduYWxTdHJlbmd0aCo+KCY6OnJpbF9wcm90bzo6UklMR1dTaWduYWxTdHJlbmd0aDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgY2RtYV9zaWduYWxzdHJlbmd0aF8gPSBjb25zdF9jYXN0PCA6OnJpbF9wcm90bzo6UklMQ0RNQVNpZ25hbFN0cmVuZ3RoKj4oJjo6cmlsX3Byb3RvOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIGV2ZG9fc2lnbmFsc3RyZW5ndGhfID0gY29uc3RfY2FzdDwgOjpyaWxfcHJvdG86OlJJTEVWRE9TaWduYWxTdHJlbmd0aCo+KCY6OnJpbF9wcm90bzo6UklMRVZET1NpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotfQotCi1Sc3BTaWduYWxTdHJlbmd0aDo6UnNwU2lnbmFsU3RyZW5ndGgoY29uc3QgUnNwU2lnbmFsU3RyZW5ndGgmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSc3BTaWduYWxTdHJlbmd0aDo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGd3X3NpZ25hbHN0cmVuZ3RoXyA9IE5VTEw7Ci0gIGNkbWFfc2lnbmFsc3RyZW5ndGhfID0gTlVMTDsKLSAgZXZkb19zaWduYWxzdHJlbmd0aF8gPSBOVUxMOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1Sc3BTaWduYWxTdHJlbmd0aDo6flJzcFNpZ25hbFN0cmVuZ3RoKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUnNwU2lnbmFsU3RyZW5ndGg6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gICAgZGVsZXRlIGd3X3NpZ25hbHN0cmVuZ3RoXzsKLSAgICBkZWxldGUgY2RtYV9zaWduYWxzdHJlbmd0aF87Ci0gICAgZGVsZXRlIGV2ZG9fc2lnbmFsc3RyZW5ndGhfOwotICB9Ci19Ci0KLXZvaWQgUnNwU2lnbmFsU3RyZW5ndGg6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSc3BTaWduYWxTdHJlbmd0aDo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBSc3BTaWduYWxTdHJlbmd0aF9kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgUnNwU2lnbmFsU3RyZW5ndGgmIFJzcFNpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotUnNwU2lnbmFsU3RyZW5ndGgqIFJzcFNpZ25hbFN0cmVuZ3RoOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVJzcFNpZ25hbFN0cmVuZ3RoKiBSc3BTaWduYWxTdHJlbmd0aDo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFJzcFNpZ25hbFN0cmVuZ3RoOwotfQotCi12b2lkIFJzcFNpZ25hbFN0cmVuZ3RoOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICAgIGlmIChnd19zaWduYWxzdHJlbmd0aF8gIT0gTlVMTCkgZ3dfc2lnbmFsc3RyZW5ndGhfLT46OnJpbF9wcm90bzo6UklMR1dTaWduYWxTdHJlbmd0aDo6Q2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgICBpZiAoY2RtYV9zaWduYWxzdHJlbmd0aF8gIT0gTlVMTCkgY2RtYV9zaWduYWxzdHJlbmd0aF8tPjo6cmlsX3Byb3RvOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OkNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChfaGFzX2JpdCgyKSkgewotICAgICAgaWYgKGV2ZG9fc2lnbmFsc3RyZW5ndGhfICE9IE5VTEwpIGV2ZG9fc2lnbmFsc3RyZW5ndGhfLT46OnJpbF9wcm90bzo6UklMRVZET1NpZ25hbFN0cmVuZ3RoOjpDbGVhcigpOwotICAgIH0KLSAgfQotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci19Ci0KLWJvb2wgUnNwU2lnbmFsU3RyZW5ndGg6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUklMR1dTaWduYWxTdHJlbmd0aCBnd19zaWduYWxzdHJlbmd0aCA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9nd19zaWduYWxzdHJlbmd0aCgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfY2RtYV9zaWduYWxzdHJlbmd0aDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIGNkbWFfc2lnbmFsc3RyZW5ndGggPSAyOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX2NkbWFfc2lnbmFsc3RyZW5ndGg6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKLSAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX2NkbWFfc2lnbmFsc3RyZW5ndGgoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX2V2ZG9fc2lnbmFsc3RyZW5ndGg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJJTEVWRE9TaWduYWxTdHJlbmd0aCBldmRvX3NpZ25hbHN0cmVuZ3RoID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9ldmRvX3NpZ25hbHN0cmVuZ3RoOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9ldmRvX3NpZ25hbHN0cmVuZ3RoKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBSc3BTaWduYWxTdHJlbmd0aDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SSUxHV1NpZ25hbFN0cmVuZ3RoIGd3X3NpZ25hbHN0cmVuZ3RoID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDEsIHRoaXMtPmd3X3NpZ25hbHN0cmVuZ3RoKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIGNkbWFfc2lnbmFsc3RyZW5ndGggPSAyOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgMiwgdGhpcy0+Y2RtYV9zaWduYWxzdHJlbmd0aCgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJJTEVWRE9TaWduYWxTdHJlbmd0aCBldmRvX3NpZ25hbHN0cmVuZ3RoID0gMzsKLSAgaWYgKF9oYXNfYml0KDIpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDMsIHRoaXMtPmV2ZG9fc2lnbmFsc3RyZW5ndGgoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFJzcFNpZ25hbFN0cmVuZ3RoOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJJTEdXU2lnbmFsU3RyZW5ndGggZ3dfc2lnbmFsc3RyZW5ndGggPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICAxLCB0aGlzLT5nd19zaWduYWxzdHJlbmd0aCgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJJTENETUFTaWduYWxTdHJlbmd0aCBjZG1hX3NpZ25hbHN0cmVuZ3RoID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMiwgdGhpcy0+Y2RtYV9zaWduYWxzdHJlbmd0aCgpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJJTEVWRE9TaWduYWxTdHJlbmd0aCBldmRvX3NpZ25hbHN0cmVuZ3RoID0gMzsKLSAgaWYgKF9oYXNfYml0KDIpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMywgdGhpcy0+ZXZkb19zaWduYWxzdHJlbmd0aCgpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBSc3BTaWduYWxTdHJlbmd0aDo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SSUxHV1NpZ25hbFN0cmVuZ3RoIGd3X3NpZ25hbHN0cmVuZ3RoID0gMTsKLSAgICBpZiAoaGFzX2d3X3NpZ25hbHN0cmVuZ3RoKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICB0aGlzLT5nd19zaWduYWxzdHJlbmd0aCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SSUxDRE1BU2lnbmFsU3RyZW5ndGggY2RtYV9zaWduYWxzdHJlbmd0aCA9IDI7Ci0gICAgaWYgKGhhc19jZG1hX3NpZ25hbHN0cmVuZ3RoKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICB0aGlzLT5jZG1hX3NpZ25hbHN0cmVuZ3RoKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJJTEVWRE9TaWduYWxTdHJlbmd0aCBldmRvX3NpZ25hbHN0cmVuZ3RoID0gMzsKLSAgICBpZiAoaGFzX2V2ZG9fc2lnbmFsc3RyZW5ndGgoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgIHRoaXMtPmV2ZG9fc2lnbmFsc3RyZW5ndGgoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFJzcFNpZ25hbFN0cmVuZ3RoOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJzcFNpZ25hbFN0cmVuZ3RoKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUnNwU2lnbmFsU3RyZW5ndGgqPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgUnNwU2lnbmFsU3RyZW5ndGg6Ok1lcmdlRnJvbShjb25zdCBSc3BTaWduYWxTdHJlbmd0aCYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIG11dGFibGVfZ3dfc2lnbmFsc3RyZW5ndGgoKS0+OjpyaWxfcHJvdG86OlJJTEdXU2lnbmFsU3RyZW5ndGg6Ok1lcmdlRnJvbShmcm9tLmd3X3NpZ25hbHN0cmVuZ3RoKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCgxKSkgewotICAgICAgbXV0YWJsZV9jZG1hX3NpZ25hbHN0cmVuZ3RoKCktPjo6cmlsX3Byb3RvOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGg6Ok1lcmdlRnJvbShmcm9tLmNkbWFfc2lnbmFsc3RyZW5ndGgoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDIpKSB7Ci0gICAgICBtdXRhYmxlX2V2ZG9fc2lnbmFsc3RyZW5ndGgoKS0+OjpyaWxfcHJvdG86OlJJTEVWRE9TaWduYWxTdHJlbmd0aDo6TWVyZ2VGcm9tKGZyb20uZXZkb19zaWduYWxzdHJlbmd0aCgpKTsKLSAgICB9Ci0gIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBSc3BTaWduYWxTdHJlbmd0aDo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSc3BTaWduYWxTdHJlbmd0aDo6Q29weUZyb20oY29uc3QgUnNwU2lnbmFsU3RyZW5ndGgmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIFJzcFNpZ25hbFN0cmVuZ3RoOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUnNwU2lnbmFsU3RyZW5ndGg6OlN3YXAoUnNwU2lnbmFsU3RyZW5ndGgqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKGd3X3NpZ25hbHN0cmVuZ3RoXywgb3RoZXItPmd3X3NpZ25hbHN0cmVuZ3RoXyk7Ci0gICAgc3RkOjpzd2FwKGNkbWFfc2lnbmFsc3RyZW5ndGhfLCBvdGhlci0+Y2RtYV9zaWduYWxzdHJlbmd0aF8pOwotICAgIHN0ZDo6c3dhcChldmRvX3NpZ25hbHN0cmVuZ3RoXywgb3RoZXItPmV2ZG9fc2lnbmFsc3RyZW5ndGhfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBSc3BTaWduYWxTdHJlbmd0aDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gUnNwU2lnbmFsU3RyZW5ndGhfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBSc3BTaWduYWxTdHJlbmd0aF9yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY29uc3QgOjpzdGQ6OnN0cmluZyBSc3BPcGVyYXRvcjo6X2RlZmF1bHRfbG9uZ19hbHBoYV9vbnNfOwotY29uc3QgOjpzdGQ6OnN0cmluZyBSc3BPcGVyYXRvcjo6X2RlZmF1bHRfc2hvcnRfYWxwaGFfb25zXzsKLWNvbnN0IDo6c3RkOjpzdHJpbmcgUnNwT3BlcmF0b3I6Ol9kZWZhdWx0X21jY19tbmNfOwotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJzcE9wZXJhdG9yOjprTG9uZ0FscGhhT25zRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUnNwT3BlcmF0b3I6OmtTaG9ydEFscGhhT25zRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgUnNwT3BlcmF0b3I6OmtNY2NNbmNGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLVJzcE9wZXJhdG9yOjpSc3BPcGVyYXRvcigpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUnNwT3BlcmF0b3I6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotUnNwT3BlcmF0b3I6OlJzcE9wZXJhdG9yKGNvbnN0IFJzcE9wZXJhdG9yJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUnNwT3BlcmF0b3I6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBsb25nX2FscGhhX29uc18gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJl9kZWZhdWx0X2xvbmdfYWxwaGFfb25zXyk7Ci0gIHNob3J0X2FscGhhX29uc18gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJl9kZWZhdWx0X3Nob3J0X2FscGhhX29uc18pOwotICBtY2NfbW5jXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmX2RlZmF1bHRfbWNjX21uY18pOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1Sc3BPcGVyYXRvcjo6flJzcE9wZXJhdG9yKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUnNwT3BlcmF0b3I6OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChsb25nX2FscGhhX29uc18gIT0gJl9kZWZhdWx0X2xvbmdfYWxwaGFfb25zXykgewotICAgIGRlbGV0ZSBsb25nX2FscGhhX29uc187Ci0gIH0KLSAgaWYgKHNob3J0X2FscGhhX29uc18gIT0gJl9kZWZhdWx0X3Nob3J0X2FscGhhX29uc18pIHsKLSAgICBkZWxldGUgc2hvcnRfYWxwaGFfb25zXzsKLSAgfQotICBpZiAobWNjX21uY18gIT0gJl9kZWZhdWx0X21jY19tbmNfKSB7Ci0gICAgZGVsZXRlIG1jY19tbmNfOwotICB9Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBSc3BPcGVyYXRvcjo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJzcE9wZXJhdG9yOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJzcE9wZXJhdG9yX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSc3BPcGVyYXRvciYgUnNwT3BlcmF0b3I6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1Sc3BPcGVyYXRvciogUnNwT3BlcmF0b3I6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotUnNwT3BlcmF0b3IqIFJzcE9wZXJhdG9yOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUnNwT3BlcmF0b3I7Ci19Ci0KLXZvaWQgUnNwT3BlcmF0b3I6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChfaGFzX2JpdCgwKSkgewotICAgICAgaWYgKGxvbmdfYWxwaGFfb25zXyAhPSAmX2RlZmF1bHRfbG9uZ19hbHBoYV9vbnNfKSB7Ci0gICAgICAgIGxvbmdfYWxwaGFfb25zXy0+Y2xlYXIoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgICBpZiAoc2hvcnRfYWxwaGFfb25zXyAhPSAmX2RlZmF1bHRfc2hvcnRfYWxwaGFfb25zXykgewotICAgICAgICBzaG9ydF9hbHBoYV9vbnNfLT5jbGVhcigpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoX2hhc19iaXQoMikpIHsKLSAgICAgIGlmIChtY2NfbW5jXyAhPSAmX2RlZmF1bHRfbWNjX21uY18pIHsKLSAgICAgICAgbWNjX21uY18tPmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSc3BPcGVyYXRvcjo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGxvbmdfYWxwaGFfb25zID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2xvbmdfYWxwaGFfb25zKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgICAgICAgdGhpcy0+bG9uZ19hbHBoYV9vbnMoKS5kYXRhKCksIHRoaXMtPmxvbmdfYWxwaGFfb25zKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2Vfc2hvcnRfYWxwaGFfb25zOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHNob3J0X2FscGhhX29ucyA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2Vfc2hvcnRfYWxwaGFfb25zOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zaG9ydF9hbHBoYV9vbnMoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgICAgICAgICB0aGlzLT5zaG9ydF9hbHBoYV9vbnMoKS5kYXRhKCksIHRoaXMtPnNob3J0X2FscGhhX29ucygpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX21jY19tbmM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbWNjX21uYyA9IDM7Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfbWNjX21uYzoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbWNjX21uYygpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgICAgICAgIHRoaXMtPm1jY19tbmMoKS5kYXRhKCksIHRoaXMtPm1jY19tbmMoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBSc3BPcGVyYXRvcjo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGxvbmdfYWxwaGFfb25zID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPmxvbmdfYWxwaGFfb25zKCkuZGF0YSgpLCB0aGlzLT5sb25nX2FscGhhX29ucygpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCi0gICAgICAxLCB0aGlzLT5sb25nX2FscGhhX29ucygpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgc2hvcnRfYWxwaGFfb25zID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPnNob3J0X2FscGhhX29ucygpLmRhdGEoKSwgdGhpcy0+c2hvcnRfYWxwaGFfb25zKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKLSAgICAgIDIsIHRoaXMtPnNob3J0X2FscGhhX29ucygpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgbWNjX21uYyA9IDM7Ci0gIGlmIChfaGFzX2JpdCgyKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgICB0aGlzLT5tY2NfbW5jKCkuZGF0YSgpLCB0aGlzLT5tY2NfbW5jKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKLSAgICAgIDMsIHRoaXMtPm1jY19tbmMoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFJzcE9wZXJhdG9yOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBvcHRpb25hbCBzdHJpbmcgbG9uZ19hbHBoYV9vbnMgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+bG9uZ19hbHBoYV9vbnMoKS5kYXRhKCksIHRoaXMtPmxvbmdfYWxwaGFfb25zKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAxLCB0aGlzLT5sb25nX2FscGhhX29ucygpLCB0YXJnZXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgc2hvcnRfYWxwaGFfb25zID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgIHRoaXMtPnNob3J0X2FscGhhX29ucygpLmRhdGEoKSwgdGhpcy0+c2hvcnRfYWxwaGFfb25zKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAyLCB0aGlzLT5zaG9ydF9hbHBoYV9vbnMoKSwgdGFyZ2V0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG1jY19tbmMgPSAzOwotICBpZiAoX2hhc19iaXQoMikpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+bWNjX21uYygpLmRhdGEoKSwgdGhpcy0+bWNjX21uYygpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMywgdGhpcy0+bWNjX21uYygpLCB0YXJnZXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBSc3BPcGVyYXRvcjo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGxvbmdfYWxwaGFfb25zID0gMTsKLSAgICBpZiAoaGFzX2xvbmdfYWxwaGFfb25zKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPmxvbmdfYWxwaGFfb25zKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgc2hvcnRfYWxwaGFfb25zID0gMjsKLSAgICBpZiAoaGFzX3Nob3J0X2FscGhhX29ucygpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5zaG9ydF9hbHBoYV9vbnMoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBtY2NfbW5jID0gMzsKLSAgICBpZiAoaGFzX21jY19tbmMoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+bWNjX21uYygpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgUnNwT3BlcmF0b3I6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgUnNwT3BlcmF0b3IqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBSc3BPcGVyYXRvcio+KAotICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBSc3BPcGVyYXRvcjo6TWVyZ2VGcm9tKGNvbnN0IFJzcE9wZXJhdG9yJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5faGFzX2JpdCgwKSkgewotICAgICAgc2V0X2xvbmdfYWxwaGFfb25zKGZyb20ubG9uZ19hbHBoYV9vbnMoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDEpKSB7Ci0gICAgICBzZXRfc2hvcnRfYWxwaGFfb25zKGZyb20uc2hvcnRfYWxwaGFfb25zKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCgyKSkgewotICAgICAgc2V0X21jY19tbmMoZnJvbS5tY2NfbW5jKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJzcE9wZXJhdG9yOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJzcE9wZXJhdG9yOjpDb3B5RnJvbShjb25zdCBSc3BPcGVyYXRvciYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUnNwT3BlcmF0b3I6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSc3BPcGVyYXRvcjo6U3dhcChSc3BPcGVyYXRvciogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAobG9uZ19hbHBoYV9vbnNfLCBvdGhlci0+bG9uZ19hbHBoYV9vbnNfKTsKLSAgICBzdGQ6OnN3YXAoc2hvcnRfYWxwaGFfb25zXywgb3RoZXItPnNob3J0X2FscGhhX29uc18pOwotICAgIHN0ZDo6c3dhcChtY2NfbW5jXywgb3RoZXItPm1jY19tbmNfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBSc3BPcGVyYXRvcjo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gUnNwT3BlcmF0b3JfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBSc3BPcGVyYXRvcl9yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6a0luZGV4RmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgotCi1SZXFTZXBhcmF0ZUNvbm5lY3Rpb246OlJlcVNlcGFyYXRlQ29ubmVjdGlvbigpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLVJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6UmVxU2VwYXJhdGVDb25uZWN0aW9uKGNvbnN0IFJlcVNlcGFyYXRlQ29ubmVjdGlvbiYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGluZGV4XyA9IDA7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLVJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6flJlcVNlcGFyYXRlQ29ubmVjdGlvbigpIHsKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIFJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIFJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBSZXFTZXBhcmF0ZUNvbm5lY3Rpb25fZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IFJlcVNlcGFyYXRlQ29ubmVjdGlvbiYgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotUmVxU2VwYXJhdGVDb25uZWN0aW9uKiBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotUmVxU2VwYXJhdGVDb25uZWN0aW9uKiBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb247Ci19Ci0KLXZvaWQgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpbmRleF8gPSAwOwotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcXVpcmVkIGludDMyIGluZGV4ID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZpbmRleF8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCBpbnQzMiBpbmRleCA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDEsIHRoaXMtPmluZGV4KCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIHJlcXVpcmVkIGludDMyIGluZGV4ID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDEsIHRoaXMtPmluZGV4KCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IFJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gcmVxdWlyZWQgaW50MzIgaW5kZXggPSAxOwotICAgIGlmIChoYXNfaW5kZXgoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5pbmRleCgpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJlcVNlcGFyYXRlQ29ubmVjdGlvbiogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFJlcVNlcGFyYXRlQ29ubmVjdGlvbio+KAotICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246Ok1lcmdlRnJvbShjb25zdCBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24mIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDApKSB7Ci0gICAgICBzZXRfaW5kZXgoZnJvbS5pbmRleCgpKTsKLSAgICB9Ci0gIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLX0KLQotdm9pZCBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpDb3B5RnJvbShjb25zdCBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24mIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIFJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgaWYgKChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMSkgIT0gMHgwMDAwMDAwMSkgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpTd2FwKFJlcVNlcGFyYXRlQ29ubmVjdGlvbiogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAoaW5kZXhfLCBvdGhlci0+aW5kZXhfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJlcVNlcGFyYXRlQ29ubmVjdGlvbl9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFJlcVNlcGFyYXRlQ29ubmVjdGlvbl9yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IFJlcVNldE11dGU6OmtTdGF0ZUZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUmVxU2V0TXV0ZTo6UmVxU2V0TXV0ZSgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgUmVxU2V0TXV0ZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1SZXFTZXRNdXRlOjpSZXFTZXRNdXRlKGNvbnN0IFJlcVNldE11dGUmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSZXFTZXRNdXRlOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgc3RhdGVfID0gZmFsc2U7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLVJlcVNldE11dGU6On5SZXFTZXRNdXRlKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUmVxU2V0TXV0ZTo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIFJlcVNldE11dGU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBSZXFTZXRNdXRlOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJlcVNldE11dGVfZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IFJlcVNldE11dGUmIFJlcVNldE11dGU6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1SZXFTZXRNdXRlKiBSZXFTZXRNdXRlOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVJlcVNldE11dGUqIFJlcVNldE11dGU6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBSZXFTZXRNdXRlOwotfQotCi12b2lkIFJlcVNldE11dGU6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIHN0YXRlXyA9IGZhbHNlOwotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSZXFTZXRNdXRlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCBib29sIHN0YXRlID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnN0YXRlXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBSZXFTZXRNdXRlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCBib29sIHN0YXRlID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxLCB0aGlzLT5zdGF0ZSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogUmVxU2V0TXV0ZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgYm9vbCBzdGF0ZSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEsIHRoaXMtPnN0YXRlKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IFJlcVNldE11dGU6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIHJlcXVpcmVkIGJvb2wgc3RhdGUgPSAxOwotICAgIGlmIChoYXNfc3RhdGUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgUmVxU2V0TXV0ZTo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBSZXFTZXRNdXRlKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUmVxU2V0TXV0ZSo+KAotICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBSZXFTZXRNdXRlOjpNZXJnZUZyb20oY29uc3QgUmVxU2V0TXV0ZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9zdGF0ZShmcm9tLnN0YXRlKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJlcVNldE11dGU6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgUmVxU2V0TXV0ZTo6Q29weUZyb20oY29uc3QgUmVxU2V0TXV0ZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUmVxU2V0TXV0ZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgaWYgKChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMSkgIT0gMHgwMDAwMDAwMSkgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVxU2V0TXV0ZTo6U3dhcChSZXFTZXRNdXRlKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChzdGF0ZV8sIG90aGVyLT5zdGF0ZV8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJlcVNldE11dGU6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFJlcVNldE11dGVfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBSZXFTZXRNdXRlX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBpbnQgUmVxU2NyZWVuU3RhdGU6OmtTdGF0ZUZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotUmVxU2NyZWVuU3RhdGU6OlJlcVNjcmVlblN0YXRlKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLX0KLQotdm9pZCBSZXFTY3JlZW5TdGF0ZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1SZXFTY3JlZW5TdGF0ZTo6UmVxU2NyZWVuU3RhdGUoY29uc3QgUmVxU2NyZWVuU3RhdGUmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBSZXFTY3JlZW5TdGF0ZTo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIHN0YXRlXyA9IGZhbHNlOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1SZXFTY3JlZW5TdGF0ZTo6flJlcVNjcmVlblN0YXRlKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgUmVxU2NyZWVuU3RhdGU6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBSZXFTY3JlZW5TdGF0ZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFJlcVNjcmVlblN0YXRlOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFJlcVNjcmVlblN0YXRlX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBSZXFTY3JlZW5TdGF0ZSYgUmVxU2NyZWVuU3RhdGU6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1SZXFTY3JlZW5TdGF0ZSogUmVxU2NyZWVuU3RhdGU6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotUmVxU2NyZWVuU3RhdGUqIFJlcVNjcmVlblN0YXRlOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgUmVxU2NyZWVuU3RhdGU7Ci19Ci0KLXZvaWQgUmVxU2NyZWVuU3RhdGU6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIHN0YXRlXyA9IGZhbHNlOwotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSZXFTY3JlZW5TdGF0ZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gcmVxdWlyZWQgYm9vbCBzdGF0ZSA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZzdGF0ZV8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgUmVxU2NyZWVuU3RhdGU6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIHJlcXVpcmVkIGJvb2wgc3RhdGUgPSAxOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDEsIHRoaXMtPnN0YXRlKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBSZXFTY3JlZW5TdGF0ZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgYm9vbCBzdGF0ZSA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEsIHRoaXMtPnN0YXRlKCksIHRhcmdldCk7Ci0gIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IFJlcVNjcmVlblN0YXRlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyByZXF1aXJlZCBib29sIHN0YXRlID0gMTsKLSAgICBpZiAoaGFzX3N0YXRlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotICAgIAotICB9Ci0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFJlcVNjcmVlblN0YXRlOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFJlcVNjcmVlblN0YXRlKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgUmVxU2NyZWVuU3RhdGUqPigKLSAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgUmVxU2NyZWVuU3RhdGU6Ok1lcmdlRnJvbShjb25zdCBSZXFTY3JlZW5TdGF0ZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9zdGF0ZShmcm9tLnN0YXRlKCkpOwotICAgIH0KLSAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotfQotCi12b2lkIFJlcVNjcmVlblN0YXRlOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIFJlcVNjcmVlblN0YXRlOjpDb3B5RnJvbShjb25zdCBSZXFTY3JlZW5TdGF0ZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgUmVxU2NyZWVuU3RhdGU6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDEpICE9IDB4MDAwMDAwMDEpIHJldHVybiBmYWxzZTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJlcVNjcmVlblN0YXRlOjpTd2FwKFJlcVNjcmVlblN0YXRlKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChzdGF0ZV8sIG90aGVyLT5zdGF0ZV8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFJlcVNjcmVlblN0YXRlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBSZXFTY3JlZW5TdGF0ZV9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFJlcVNjcmVlblN0YXRlX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKLQotfSAgLy8gbmFtZXNwYWNlIHJpbF9wcm90bwotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9jcHAvcmlsLnBiLmggYi9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2NwcC9yaWwucGIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlOWZjMi4uMDAwMDAwMAotLS0gYS9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2NwcC9yaWwucGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5MTAgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogcmlsLnByb3RvCi0KLSNpZm5kZWYgUFJPVE9CVUZfcmlsXzJlcHJvdG9fX0lOQ0xVREVECi0jZGVmaW5lIFBST1RPQlVGX3JpbF8yZXByb3RvX19JTkNMVURFRAotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi0jaWYgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gPCAyMDAzMDAwCi0jZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcwotI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2UgdXBkYXRlCi0jZXJyb3IgeW91ciBoZWFkZXJzLgotI2VuZGlmCi0jaWYgMjAwMzAwMCA8IEdPT0dMRV9QUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT04KLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcwotI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2UKLSNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCi0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQotCi1uYW1lc3BhY2UgcmlsX3Byb3RvIHsKLQotLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCBjYWxsIHRoZXNlLgotdm9pZCAgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOwotdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX3JpbF8yZXByb3RvKCk7Ci12b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9yaWxfMmVwcm90bygpOwotCi1jbGFzcyBSaWxBcHBTdGF0dXM7Ci1jbGFzcyBSaWxDYXJkU3RhdHVzOwotY2xhc3MgUmlsVXVzSW5mbzsKLWNsYXNzIFJpbENhbGw7Ci1jbGFzcyBSSUxHV1NpZ25hbFN0cmVuZ3RoOwotY2xhc3MgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOwotY2xhc3MgUklMRVZET1NpZ25hbFN0cmVuZ3RoOwotY2xhc3MgUnNwU3RyaW5nczsKLWNsYXNzIFJzcEludGVnZXJzOwotY2xhc3MgUnNwR2V0U2ltU3RhdHVzOwotY2xhc3MgUmVxRW50ZXJTaW1QaW47Ci1jbGFzcyBSc3BFbnRlclNpbVBpbjsKLWNsYXNzIFJzcEdldEN1cnJlbnRDYWxsczsKLWNsYXNzIFJlcURpYWw7Ci1jbGFzcyBSZXFIYW5nVXA7Ci1jbGFzcyBSc3BMYXN0Q2FsbEZhaWxDYXVzZTsKLWNsYXNzIFJzcFNpZ25hbFN0cmVuZ3RoOwotY2xhc3MgUnNwT3BlcmF0b3I7Ci1jbGFzcyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb247Ci1jbGFzcyBSZXFTZXRNdXRlOwotY2xhc3MgUmVxU2NyZWVuU3RhdGU7Ci0KLWVudW0gUmFkaW9TdGF0ZSB7Ci0gIFJBRElPU1RBVEVfT0ZGID0gMCwKLSAgUkFESU9TVEFURV9VTkFWQUlMQUJMRSA9IDEsCi0gIFJBRElPU1RBVEVfU0lNX05PVF9SRUFEWSA9IDIsCi0gIFJBRElPU1RBVEVfU0lNX0xPQ0tFRF9PUl9BQlNFTlQgPSAzLAotICBSQURJT1NUQVRFX1NJTV9SRUFEWSA9IDQsCi0gIFJBRElPU1RBVEVfUlVJTV9OT1RfUkVBRFkgPSA1LAotICBSQURJT1NUQVRFX1JVSU1fUkVBRFkgPSA2LAotICBSQURJT1NUQVRFX1JVSU1fTE9DS0VEX09SX0FCU0VOVCA9IDcsCi0gIFJBRElPU1RBVEVfTlZfTk9UX1JFQURZID0gOCwKLSAgUkFESU9TVEFURV9OVl9SRUFEWSA9IDkKLX07Ci1ib29sIFJhZGlvU3RhdGVfSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgUmFkaW9TdGF0ZSBSYWRpb1N0YXRlX01JTiA9IFJBRElPU1RBVEVfT0ZGOwotY29uc3QgUmFkaW9TdGF0ZSBSYWRpb1N0YXRlX01BWCA9IFJBRElPU1RBVEVfTlZfUkVBRFk7Ci1jb25zdCBpbnQgUmFkaW9TdGF0ZV9BUlJBWVNJWkUgPSBSYWRpb1N0YXRlX01BWCArIDE7Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJhZGlvU3RhdGVfZGVzY3JpcHRvcigpOwotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFJhZGlvU3RhdGVfTmFtZShSYWRpb1N0YXRlIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAotICAgIFJhZGlvU3RhdGVfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBSYWRpb1N0YXRlX1BhcnNlKAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsIFJhZGlvU3RhdGUqIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxSYWRpb1N0YXRlPigKLSAgICBSYWRpb1N0YXRlX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOwotfQotZW51bSBSaWxDYXJkU3RhdGUgewotICBDQVJEU1RBVEVfQUJTRU5UID0gMCwKLSAgQ0FSRFNUQVRFX1BSRVNFTlQgPSAxLAotICBDQVJEU1RBVEVfRVJST1IgPSAyCi19OwotYm9vbCBSaWxDYXJkU3RhdGVfSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgUmlsQ2FyZFN0YXRlIFJpbENhcmRTdGF0ZV9NSU4gPSBDQVJEU1RBVEVfQUJTRU5UOwotY29uc3QgUmlsQ2FyZFN0YXRlIFJpbENhcmRTdGF0ZV9NQVggPSBDQVJEU1RBVEVfRVJST1I7Ci1jb25zdCBpbnQgUmlsQ2FyZFN0YXRlX0FSUkFZU0laRSA9IFJpbENhcmRTdGF0ZV9NQVggKyAxOwotCi1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBSaWxDYXJkU3RhdGVfZGVzY3JpcHRvcigpOwotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFJpbENhcmRTdGF0ZV9OYW1lKFJpbENhcmRTdGF0ZSB2YWx1ZSkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKLSAgICBSaWxDYXJkU3RhdGVfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBSaWxDYXJkU3RhdGVfUGFyc2UoCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgUmlsQ2FyZFN0YXRlKiB2YWx1ZSkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08UmlsQ2FyZFN0YXRlPigKLSAgICBSaWxDYXJkU3RhdGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Ci19Ci1lbnVtIFJpbFBlcnNvU3Vic3RhdGUgewotICBQRVJTT1NVQlNUQVRFX1VOS05PV04gPSAwLAotICBQRVJTT1NVQlNUQVRFX0lOX1BST0dSRVNTID0gMSwKLSAgUEVSU09TVUJTVEFURV9SRUFEWSA9IDIsCi0gIFBFUlNPU1VCU1RBVEVfU0lNX05FVFdPUksgPSAzLAotICBQRVJTT1NVQlNUQVRFX1NJTV9ORVRXT1JLX1NVQlNFVCA9IDQsCi0gIFBFUlNPU1VCU1RBVEVfU0lNX0NPUlBPUkFURSA9IDUsCi0gIFBFUlNPU1VCU1RBVEVfU0lNX1NFUlZJQ0VfUFJPVklERVIgPSA2LAotICBQRVJTT1NVQlNUQVRFX1NJTV9TSU0gPSA3LAotICBQRVJTT1NVQlNUQVRFX1NJTV9ORVRXT1JLX1BVSyA9IDgsCi0gIFBFUlNPU1VCU1RBVEVfU0lNX05FVFdPUktfU1VCU0VUX1BVSyA9IDksCi0gIFBFUlNPU1VCU1RBVEVfU0lNX0NPUlBPUkFURV9QVUsgPSAxMCwKLSAgUEVSU09TVUJTVEFURV9TSU1fU0VSVklDRV9QUk9WSURFUl9QVUsgPSAxMSwKLSAgUEVSU09TVUJTVEFURV9TSU1fU0lNX1BVSyA9IDEyLAotICBQRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzEgPSAxMywKLSAgUEVSU09TVUJTVEFURV9SVUlNX05FVFdPUksyID0gMTQsCi0gIFBFUlNPU1VCU1RBVEVfUlVJTV9IUlBEID0gMTUsCi0gIFBFUlNPU1VCU1RBVEVfUlVJTV9DT1JQT1JBVEUgPSAxNiwKLSAgUEVSU09TVUJTVEFURV9SVUlNX1NFUlZJQ0VfUFJPVklERVIgPSAxNywKLSAgUEVSU09TVUJTVEFURV9SVUlNX1JVSU0gPSAxOCwKLSAgUEVSU09TVUJTVEFURV9SVUlNX05FVFdPUksxX1BVSyA9IDE5LAotICBQRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzJfUFVLID0gMjAsCi0gIFBFUlNPU1VCU1RBVEVfUlVJTV9IUlBEX1BVSyA9IDIxLAotICBQRVJTT1NVQlNUQVRFX1JVSU1fQ09SUE9SQVRFX1BVSyA9IDIyLAotICBQRVJTT1NVQlNUQVRFX1JVSU1fU0VSVklDRV9QUk9WSURFUl9QVUsgPSAyMywKLSAgUEVSU09TVUJTVEFURV9SVUlNX1JVSU1fUFVLID0gMjQKLX07Ci1ib29sIFJpbFBlcnNvU3Vic3RhdGVfSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgUmlsUGVyc29TdWJzdGF0ZSBSaWxQZXJzb1N1YnN0YXRlX01JTiA9IFBFUlNPU1VCU1RBVEVfVU5LTk9XTjsKLWNvbnN0IFJpbFBlcnNvU3Vic3RhdGUgUmlsUGVyc29TdWJzdGF0ZV9NQVggPSBQRVJTT1NVQlNUQVRFX1JVSU1fUlVJTV9QVUs7Ci1jb25zdCBpbnQgUmlsUGVyc29TdWJzdGF0ZV9BUlJBWVNJWkUgPSBSaWxQZXJzb1N1YnN0YXRlX01BWCArIDE7Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbFBlcnNvU3Vic3RhdGVfZGVzY3JpcHRvcigpOwotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFJpbFBlcnNvU3Vic3RhdGVfTmFtZShSaWxQZXJzb1N1YnN0YXRlIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAotICAgIFJpbFBlcnNvU3Vic3RhdGVfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBSaWxQZXJzb1N1YnN0YXRlX1BhcnNlKAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsIFJpbFBlcnNvU3Vic3RhdGUqIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxSaWxQZXJzb1N1YnN0YXRlPigKLSAgICBSaWxQZXJzb1N1YnN0YXRlX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOwotfQotZW51bSBSaWxBcHBTdGF0ZSB7Ci0gIEFQUFNUQVRFX1VOS05PV04gPSAwLAotICBBUFBTVEFURV9ERVRFQ1RFRCA9IDEsCi0gIEFQUFNUQVRFX1BJTiA9IDIsCi0gIEFQUFNUQVRFX1BVSyA9IDMsCi0gIEFQUFNUQVRFX1NVQlNDUklQVElPTl9QRVJTTyA9IDQsCi0gIEFQUFNUQVRFX1JFQURZID0gNQotfTsKLWJvb2wgUmlsQXBwU3RhdGVfSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgUmlsQXBwU3RhdGUgUmlsQXBwU3RhdGVfTUlOID0gQVBQU1RBVEVfVU5LTk9XTjsKLWNvbnN0IFJpbEFwcFN0YXRlIFJpbEFwcFN0YXRlX01BWCA9IEFQUFNUQVRFX1JFQURZOwotY29uc3QgaW50IFJpbEFwcFN0YXRlX0FSUkFZU0laRSA9IFJpbEFwcFN0YXRlX01BWCArIDE7Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbEFwcFN0YXRlX2Rlc2NyaXB0b3IoKTsKLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBSaWxBcHBTdGF0ZV9OYW1lKFJpbEFwcFN0YXRlIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAotICAgIFJpbEFwcFN0YXRlX2Rlc2NyaXB0b3IoKSwgdmFsdWUpOwotfQotaW5saW5lIGJvb2wgUmlsQXBwU3RhdGVfUGFyc2UoCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgUmlsQXBwU3RhdGUqIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxSaWxBcHBTdGF0ZT4oCi0gICAgUmlsQXBwU3RhdGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Ci19Ci1lbnVtIFJpbFBpblN0YXRlIHsKLSAgUElOU1RBVEVfVU5LTk9XTiA9IDAsCi0gIFBJTlNUQVRFX0VOQUJMRURfTk9UX1ZFUklGSUVEID0gMSwKLSAgUElOU1RBVEVfRU5BQkxFRF9WRVJJRklFRCA9IDIsCi0gIFBJTlNUQVRFX0RJU0FCTEVEID0gMywKLSAgUElOU1RBVEVfRU5BQkxFRF9CTE9DS0VEID0gNCwKLSAgUElOU1RBVEVfRU5BQkxFRF9QRVJNX0JMT0NLRUQgPSA1Ci19OwotYm9vbCBSaWxQaW5TdGF0ZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Ci1jb25zdCBSaWxQaW5TdGF0ZSBSaWxQaW5TdGF0ZV9NSU4gPSBQSU5TVEFURV9VTktOT1dOOwotY29uc3QgUmlsUGluU3RhdGUgUmlsUGluU3RhdGVfTUFYID0gUElOU1RBVEVfRU5BQkxFRF9QRVJNX0JMT0NLRUQ7Ci1jb25zdCBpbnQgUmlsUGluU3RhdGVfQVJSQVlTSVpFID0gUmlsUGluU3RhdGVfTUFYICsgMTsKLQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogUmlsUGluU3RhdGVfZGVzY3JpcHRvcigpOwotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFJpbFBpblN0YXRlX05hbWUoUmlsUGluU3RhdGUgdmFsdWUpIHsKLSAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCi0gICAgUmlsUGluU3RhdGVfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBSaWxQaW5TdGF0ZV9QYXJzZSgKLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLCBSaWxQaW5TdGF0ZSogdmFsdWUpIHsKLSAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPFJpbFBpblN0YXRlPigKLSAgICBSaWxQaW5TdGF0ZV9kZXNjcmlwdG9yKCksIG5hbWUsIHZhbHVlKTsKLX0KLWVudW0gUmlsQXBwVHlwZSB7Ci0gIEFQUFRZUEVfVU5LTk9XTiA9IDAsCi0gIEFQUFRZUEVfU0lNID0gMSwKLSAgQVBQVFlQRV9VU0lNID0gMiwKLSAgQVBQVFlQRV9SVUlNID0gMywKLSAgQVBQVFlQRV9DU0lNID0gNAotfTsKLWJvb2wgUmlsQXBwVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Ci1jb25zdCBSaWxBcHBUeXBlIFJpbEFwcFR5cGVfTUlOID0gQVBQVFlQRV9VTktOT1dOOwotY29uc3QgUmlsQXBwVHlwZSBSaWxBcHBUeXBlX01BWCA9IEFQUFRZUEVfQ1NJTTsKLWNvbnN0IGludCBSaWxBcHBUeXBlX0FSUkFZU0laRSA9IFJpbEFwcFR5cGVfTUFYICsgMTsKLQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogUmlsQXBwVHlwZV9kZXNjcmlwdG9yKCk7Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgUmlsQXBwVHlwZV9OYW1lKFJpbEFwcFR5cGUgdmFsdWUpIHsKLSAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCi0gICAgUmlsQXBwVHlwZV9kZXNjcmlwdG9yKCksIHZhbHVlKTsKLX0KLWlubGluZSBib29sIFJpbEFwcFR5cGVfUGFyc2UoCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgUmlsQXBwVHlwZSogdmFsdWUpIHsKLSAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPFJpbEFwcFR5cGU+KAotICAgIFJpbEFwcFR5cGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Ci19Ci1lbnVtIFJpbFV1c1R5cGUgewotICBSSUxVVVNUWVBFMV9JTVBMSUNJVCA9IDAsCi0gIFJJTFVVU1RZUEUxX1JFUVVJUkVEID0gMSwKLSAgUklMVVVTVFlQRTFfTk9UX1JFUVVJUkVEID0gMiwKLSAgUklMVVVTVFlQRTJfUkVRVUlSRUQgPSAzLAotICBSSUxVVVNUWVBFMl9OT1RfUkVRVUlSRUQgPSA0LAotICBSSUxVVVNUWVBFM19SRVFVSVJFRCA9IDUsCi0gIFJJTFVVU1RZUEUzX05PVF9SRVFVSVJFRCA9IDYKLX07Ci1ib29sIFJpbFV1c1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgUmlsVXVzVHlwZSBSaWxVdXNUeXBlX01JTiA9IFJJTFVVU1RZUEUxX0lNUExJQ0lUOwotY29uc3QgUmlsVXVzVHlwZSBSaWxVdXNUeXBlX01BWCA9IFJJTFVVU1RZUEUzX05PVF9SRVFVSVJFRDsKLWNvbnN0IGludCBSaWxVdXNUeXBlX0FSUkFZU0laRSA9IFJpbFV1c1R5cGVfTUFYICsgMTsKLQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogUmlsVXVzVHlwZV9kZXNjcmlwdG9yKCk7Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgUmlsVXVzVHlwZV9OYW1lKFJpbFV1c1R5cGUgdmFsdWUpIHsKLSAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCi0gICAgUmlsVXVzVHlwZV9kZXNjcmlwdG9yKCksIHZhbHVlKTsKLX0KLWlubGluZSBib29sIFJpbFV1c1R5cGVfUGFyc2UoCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgUmlsVXVzVHlwZSogdmFsdWUpIHsKLSAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPFJpbFV1c1R5cGU+KAotICAgIFJpbFV1c1R5cGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Ci19Ci1lbnVtIFJpbFV1c0RjcyB7Ci0gIFJJTFVVU0RDU19VU1AgPSAwLAotICBSSUxVVVNEQ1NfT1NJSExQID0gMSwKLSAgUklMVVVTRENTX1gyNDQgPSAyLAotICBSSUxVVVNEQ1NfUk1DRiA9IDMsCi0gIFJJTFVVU0RDU19JQTVjID0gNAotfTsKLWJvb2wgUmlsVXVzRGNzX0lzVmFsaWQoaW50IHZhbHVlKTsKLWNvbnN0IFJpbFV1c0RjcyBSaWxVdXNEY3NfTUlOID0gUklMVVVTRENTX1VTUDsKLWNvbnN0IFJpbFV1c0RjcyBSaWxVdXNEY3NfTUFYID0gUklMVVVTRENTX0lBNWM7Ci1jb25zdCBpbnQgUmlsVXVzRGNzX0FSUkFZU0laRSA9IFJpbFV1c0Rjc19NQVggKyAxOwotCi1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBSaWxVdXNEY3NfZGVzY3JpcHRvcigpOwotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFJpbFV1c0Rjc19OYW1lKFJpbFV1c0RjcyB2YWx1ZSkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKLSAgICBSaWxVdXNEY3NfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBSaWxVdXNEY3NfUGFyc2UoCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgUmlsVXVzRGNzKiB2YWx1ZSkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08UmlsVXVzRGNzPigKLSAgICBSaWxVdXNEY3NfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Ci19Ci1lbnVtIFJpbENhbGxTdGF0ZSB7Ci0gIENBTExTVEFURV9BQ1RJVkUgPSAwLAotICBDQUxMU1RBVEVfSE9MRElORyA9IDEsCi0gIENBTExTVEFURV9ESUFMSU5HID0gMiwKLSAgQ0FMTFNUQVRFX0FMRVJUSU5HID0gMywKLSAgQ0FMTFNUQVRFX0lOQ09NSU5HID0gNCwKLSAgQ0FMTFNUQVRFX1dBSVRJTkcgPSA1Ci19OwotYm9vbCBSaWxDYWxsU3RhdGVfSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgUmlsQ2FsbFN0YXRlIFJpbENhbGxTdGF0ZV9NSU4gPSBDQUxMU1RBVEVfQUNUSVZFOwotY29uc3QgUmlsQ2FsbFN0YXRlIFJpbENhbGxTdGF0ZV9NQVggPSBDQUxMU1RBVEVfV0FJVElORzsKLWNvbnN0IGludCBSaWxDYWxsU3RhdGVfQVJSQVlTSVpFID0gUmlsQ2FsbFN0YXRlX01BWCArIDE7Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIFJpbENhbGxTdGF0ZV9kZXNjcmlwdG9yKCk7Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgUmlsQ2FsbFN0YXRlX05hbWUoUmlsQ2FsbFN0YXRlIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAotICAgIFJpbENhbGxTdGF0ZV9kZXNjcmlwdG9yKCksIHZhbHVlKTsKLX0KLWlubGluZSBib29sIFJpbENhbGxTdGF0ZV9QYXJzZSgKLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLCBSaWxDYWxsU3RhdGUqIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxSaWxDYWxsU3RhdGU+KAotICAgIFJpbENhbGxTdGF0ZV9kZXNjcmlwdG9yKCksIG5hbWUsIHZhbHVlKTsKLX0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgUmlsQXBwU3RhdHVzIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBSaWxBcHBTdGF0dXMoKTsKLSAgdmlydHVhbCB+UmlsQXBwU3RhdHVzKCk7Ci0gIAotICBSaWxBcHBTdGF0dXMoY29uc3QgUmlsQXBwU3RhdHVzJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSaWxBcHBTdGF0dXMmIG9wZXJhdG9yPShjb25zdCBSaWxBcHBTdGF0dXMmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IFJpbEFwcFN0YXR1cyYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJpbEFwcFN0YXR1cyogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIFJpbEFwcFN0YXR1cyogTmV3KCkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBSaWxBcHBTdGF0dXMmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSaWxBcHBTdGF0dXMmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxBcHBUeXBlIGFwcF90eXBlID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX2FwcF90eXBlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2FwcF90eXBlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0FwcFR5cGVGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSByaWxfcHJvdG86OlJpbEFwcFR5cGUgYXBwX3R5cGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2FwcF90eXBlKHJpbF9wcm90bzo6UmlsQXBwVHlwZSB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbEFwcFN0YXRlIGFwcF9zdGF0ZSA9IDI7Ci0gIGlubGluZSBib29sIGhhc19hcHBfc3RhdGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfYXBwX3N0YXRlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0FwcFN0YXRlRmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgcmlsX3Byb3RvOjpSaWxBcHBTdGF0ZSBhcHBfc3RhdGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2FwcF9zdGF0ZShyaWxfcHJvdG86OlJpbEFwcFN0YXRlIHZhbHVlKTsKLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGVyc29TdWJzdGF0ZSBwZXJzb19zdWJzdGF0ZSA9IDM7Ci0gIGlubGluZSBib29sIGhhc19wZXJzb19zdWJzdGF0ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9wZXJzb19zdWJzdGF0ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtQZXJzb1N1YnN0YXRlRmllbGROdW1iZXIgPSAzOwotICBpbmxpbmUgcmlsX3Byb3RvOjpSaWxQZXJzb1N1YnN0YXRlIHBlcnNvX3N1YnN0YXRlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9wZXJzb19zdWJzdGF0ZShyaWxfcHJvdG86OlJpbFBlcnNvU3Vic3RhdGUgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGFpZCA9IDQ7Ci0gIGlubGluZSBib29sIGhhc19haWQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfYWlkKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0FpZEZpZWxkTnVtYmVyID0gNDsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFpZCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfYWlkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2FpZChjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9haWQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfYWlkKCk7Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgYXBwX2xhYmVsID0gNTsKLSAgaW5saW5lIGJvb2wgaGFzX2FwcF9sYWJlbCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9hcHBfbGFiZWwoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrQXBwTGFiZWxGaWVsZE51bWJlciA9IDU7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcHBfbGFiZWwoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2FwcF9sYWJlbChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9hcHBfbGFiZWwoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfYXBwX2xhYmVsKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2FwcF9sYWJlbCgpOwotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgcGluMV9yZXBsYWNlZCA9IDY7Ci0gIGlubGluZSBib29sIGhhc19waW4xX3JlcGxhY2VkKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3BpbjFfcmVwbGFjZWQoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrUGluMVJlcGxhY2VkRmllbGROdW1iZXIgPSA2OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBwaW4xX3JlcGxhY2VkKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9waW4xX3JlcGxhY2VkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxQaW5TdGF0ZSBwaW4xID0gNzsKLSAgaW5saW5lIGJvb2wgaGFzX3BpbjEoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfcGluMSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtQaW4xRmllbGROdW1iZXIgPSA3OwotICBpbmxpbmUgcmlsX3Byb3RvOjpSaWxQaW5TdGF0ZSBwaW4xKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9waW4xKHJpbF9wcm90bzo6UmlsUGluU3RhdGUgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxQaW5TdGF0ZSBwaW4yID0gODsKLSAgaW5saW5lIGJvb2wgaGFzX3BpbjIoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfcGluMigpOwotICBzdGF0aWMgY29uc3QgaW50IGtQaW4yRmllbGROdW1iZXIgPSA4OwotICBpbmxpbmUgcmlsX3Byb3RvOjpSaWxQaW5TdGF0ZSBwaW4yKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9waW4yKHJpbF9wcm90bzo6UmlsUGluU3RhdGUgdmFsdWUpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5SaWxBcHBTdGF0dXMpCi0gcHJpdmF0ZToKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgCi0gIGludCBhcHBfdHlwZV87Ci0gIGludCBhcHBfc3RhdGVfOwotICBpbnQgcGVyc29fc3Vic3RhdGVfOwotICA6OnN0ZDo6c3RyaW5nKiBhaWRfOwotICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBfZGVmYXVsdF9haWRfOwotICA6OnN0ZDo6c3RyaW5nKiBhcHBfbGFiZWxfOwotICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBfZGVmYXVsdF9hcHBfbGFiZWxfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHBpbjFfcmVwbGFjZWRfOwotICBpbnQgcGluMV87Ci0gIGludCBwaW4yXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfcmlsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDggKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIFJpbEFwcFN0YXR1cyogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSaWxDYXJkU3RhdHVzIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBSaWxDYXJkU3RhdHVzKCk7Ci0gIHZpcnR1YWwgflJpbENhcmRTdGF0dXMoKTsKLSAgCi0gIFJpbENhcmRTdGF0dXMoY29uc3QgUmlsQ2FyZFN0YXR1cyYgZnJvbSk7Ci0gIAotICBpbmxpbmUgUmlsQ2FyZFN0YXR1cyYgb3BlcmF0b3I9KGNvbnN0IFJpbENhcmRTdGF0dXMmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IFJpbENhcmRTdGF0dXMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChSaWxDYXJkU3RhdHVzKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUmlsQ2FyZFN0YXR1cyogTmV3KCkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBSaWxDYXJkU3RhdHVzJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgUmlsQ2FyZFN0YXR1cyYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbENhcmRTdGF0ZSBjYXJkX3N0YXRlID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX2NhcmRfc3RhdGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfY2FyZF9zdGF0ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtDYXJkU3RhdGVGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSByaWxfcHJvdG86OlJpbENhcmRTdGF0ZSBjYXJkX3N0YXRlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9jYXJkX3N0YXRlKHJpbF9wcm90bzo6UmlsQ2FyZFN0YXRlIHZhbHVlKTsKLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGluU3RhdGUgdW5pdmVyc2FsX3Bpbl9zdGF0ZSA9IDI7Ci0gIGlubGluZSBib29sIGhhc191bml2ZXJzYWxfcGluX3N0YXRlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3VuaXZlcnNhbF9waW5fc3RhdGUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrVW5pdmVyc2FsUGluU3RhdGVGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSByaWxfcHJvdG86OlJpbFBpblN0YXRlIHVuaXZlcnNhbF9waW5fc3RhdGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3VuaXZlcnNhbF9waW5fc3RhdGUocmlsX3Byb3RvOjpSaWxQaW5TdGF0ZSB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4ID0gMzsKLSAgaW5saW5lIGJvb2wgaGFzX2dzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtHc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXhGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGdzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2dzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXggPSA0OwotICBpbmxpbmUgYm9vbCBoYXNfY2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2NkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtDZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXhGaWVsZE51bWJlciA9IDQ7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfY2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgbnVtX2FwcGxpY2F0aW9ucyA9IDU7Ci0gIGlubGluZSBib29sIGhhc19udW1fYXBwbGljYXRpb25zKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX251bV9hcHBsaWNhdGlvbnMoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTnVtQXBwbGljYXRpb25zRmllbGROdW1iZXIgPSA1OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBudW1fYXBwbGljYXRpb25zKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9udW1fYXBwbGljYXRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gcmVwZWF0ZWQgLnJpbF9wcm90by5SaWxBcHBTdGF0dXMgYXBwbGljYXRpb25zID0gNjsKLSAgaW5saW5lIGludCBhcHBsaWNhdGlvbnNfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9hcHBsaWNhdGlvbnMoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrQXBwbGljYXRpb25zRmllbGROdW1iZXIgPSA2OwotICBpbmxpbmUgY29uc3QgOjpyaWxfcHJvdG86OlJpbEFwcFN0YXR1cyYgYXBwbGljYXRpb25zKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6OnJpbF9wcm90bzo6UmlsQXBwU3RhdHVzKiBtdXRhYmxlX2FwcGxpY2F0aW9ucyhpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpyaWxfcHJvdG86OlJpbEFwcFN0YXR1cyogYWRkX2FwcGxpY2F0aW9ucygpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnJpbF9wcm90bzo6UmlsQXBwU3RhdHVzID4mCi0gICAgICBhcHBsaWNhdGlvbnMoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpyaWxfcHJvdG86OlJpbEFwcFN0YXR1cyA+KgotICAgICAgbXV0YWJsZV9hcHBsaWNhdGlvbnMoKTsKLSAgCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUmlsQ2FyZFN0YXR1cykKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgaW50IGNhcmRfc3RhdGVfOwotICBpbnQgdW5pdmVyc2FsX3Bpbl9zdGF0ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleF87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgY2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4XzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBudW1fYXBwbGljYXRpb25zXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnJpbF9wcm90bzo6UmlsQXBwU3RhdHVzID4gYXBwbGljYXRpb25zXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfcmlsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDYgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIFJpbENhcmRTdGF0dXMqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmlsVXVzSW5mbyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUmlsVXVzSW5mbygpOwotICB2aXJ0dWFsIH5SaWxVdXNJbmZvKCk7Ci0gIAotICBSaWxVdXNJbmZvKGNvbnN0IFJpbFV1c0luZm8mIGZyb20pOwotICAKLSAgaW5saW5lIFJpbFV1c0luZm8mIG9wZXJhdG9yPShjb25zdCBSaWxVdXNJbmZvJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSaWxVdXNJbmZvJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoUmlsVXVzSW5mbyogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIFJpbFV1c0luZm8qIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUmlsVXVzSW5mbyYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJpbFV1c0luZm8mIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNUeXBlIHV1c190eXBlID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX3V1c190eXBlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3V1c190eXBlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1V1c1R5cGVGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSByaWxfcHJvdG86OlJpbFV1c1R5cGUgdXVzX3R5cGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3V1c190eXBlKHJpbF9wcm90bzo6UmlsVXVzVHlwZSB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFV1c0RjcyB1dXNfZGNzID0gMjsKLSAgaW5saW5lIGJvb2wgaGFzX3V1c19kY3MoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdXVzX2RjcygpOwotICBzdGF0aWMgY29uc3QgaW50IGtVdXNEY3NGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSByaWxfcHJvdG86OlJpbFV1c0RjcyB1dXNfZGNzKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF91dXNfZGNzKHJpbF9wcm90bzo6UmlsVXVzRGNzIHZhbHVlKTsKLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIHV1c19sZW5ndGggPSAzOwotICBpbmxpbmUgYm9vbCBoYXNfdXVzX2xlbmd0aCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl91dXNfbGVuZ3RoKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1V1c0xlbmd0aEZpZWxkTnVtYmVyID0gMzsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdXVzX2xlbmd0aCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfdXVzX2xlbmd0aCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgCi0gIC8vIG9wdGlvbmFsIHN0cmluZyB1dXNfZGF0YSA9IDQ7Ci0gIGlubGluZSBib29sIGhhc191dXNfZGF0YSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl91dXNfZGF0YSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtVdXNEYXRhRmllbGROdW1iZXIgPSA0OwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgdXVzX2RhdGEoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3V1c19kYXRhKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3V1c19kYXRhKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3V1c19kYXRhKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3V1c19kYXRhKCk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJpbFV1c0luZm8pCi0gcHJpdmF0ZToKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgCi0gIGludCB1dXNfdHlwZV87Ci0gIGludCB1dXNfZGNzXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB1dXNfbGVuZ3RoXzsKLSAgOjpzdGQ6OnN0cmluZyogdXVzX2RhdGFfOwotICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBfZGVmYXVsdF91dXNfZGF0YV87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3JpbF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyg0ICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBSaWxVdXNJbmZvKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJpbENhbGwgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIFJpbENhbGwoKTsKLSAgdmlydHVhbCB+UmlsQ2FsbCgpOwotICAKLSAgUmlsQ2FsbChjb25zdCBSaWxDYWxsJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSaWxDYWxsJiBvcGVyYXRvcj0oY29uc3QgUmlsQ2FsbCYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICAKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgUmlsQ2FsbCYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJpbENhbGwqIG90aGVyKTsKLSAgCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBSaWxDYWxsKiBOZXcoKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IFJpbENhbGwmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSaWxDYWxsJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICBwdWJsaWM6Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQ2FsbFN0YXRlIHN0YXRlID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX3N0YXRlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3N0YXRlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1N0YXRlRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgcmlsX3Byb3RvOjpSaWxDYWxsU3RhdGUgc3RhdGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3N0YXRlKHJpbF9wcm90bzo6UmlsQ2FsbFN0YXRlIHZhbHVlKTsKLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIGluZGV4ID0gMjsKLSAgaW5saW5lIGJvb2wgaGFzX2luZGV4KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2luZGV4KCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0luZGV4RmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBpbmRleCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfaW5kZXgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiB0b2EgPSAzOwotICBpbmxpbmUgYm9vbCBoYXNfdG9hKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3RvYSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtUb2FGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHRvYSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfdG9hKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgYm9vbCBpc19tcHR5ID0gNDsKLSAgaW5saW5lIGJvb2wgaGFzX2lzX21wdHkoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaXNfbXB0eSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtJc01wdHlGaWVsZE51bWJlciA9IDQ7Ci0gIGlubGluZSBib29sIGlzX21wdHkoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2lzX21wdHkoYm9vbCB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCBib29sIGlzX210ID0gNTsKLSAgaW5saW5lIGJvb2wgaGFzX2lzX210KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2lzX210KCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0lzTXRGaWVsZE51bWJlciA9IDU7Ci0gIGlubGluZSBib29sIGlzX210KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9pc19tdChib29sIHZhbHVlKTsKLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIGFscyA9IDY7Ci0gIGlubGluZSBib29sIGhhc19hbHMoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfYWxzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0Fsc0ZpZWxkTnVtYmVyID0gNjsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgYWxzKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9hbHMoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCBib29sIGlzX3ZvaWNlID0gNzsKLSAgaW5saW5lIGJvb2wgaGFzX2lzX3ZvaWNlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2lzX3ZvaWNlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0lzVm9pY2VGaWVsZE51bWJlciA9IDc7Ci0gIGlubGluZSBib29sIGlzX3ZvaWNlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9pc192b2ljZShib29sIHZhbHVlKTsKLSAgCi0gIC8vIG9wdGlvbmFsIGJvb2wgaXNfdm9pY2VfcHJpdmFjeSA9IDg7Ci0gIGlubGluZSBib29sIGhhc19pc192b2ljZV9wcml2YWN5KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2lzX3ZvaWNlX3ByaXZhY3koKTsKLSAgc3RhdGljIGNvbnN0IGludCBrSXNWb2ljZVByaXZhY3lGaWVsZE51bWJlciA9IDg7Ci0gIGlubGluZSBib29sIGlzX3ZvaWNlX3ByaXZhY3koKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2lzX3ZvaWNlX3ByaXZhY3koYm9vbCB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgbnVtYmVyID0gOTsKLSAgaW5saW5lIGJvb2wgaGFzX251bWJlcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9udW1iZXIoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTnVtYmVyRmllbGROdW1iZXIgPSA5OwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbnVtYmVyKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9udW1iZXIoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfbnVtYmVyKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X251bWJlcihjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9udW1iZXIoKTsKLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIG51bWJlcl9wcmVzZW50YXRpb24gPSAxMDsKLSAgaW5saW5lIGJvb2wgaGFzX251bWJlcl9wcmVzZW50YXRpb24oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbnVtYmVyX3ByZXNlbnRhdGlvbigpOwotICBzdGF0aWMgY29uc3QgaW50IGtOdW1iZXJQcmVzZW50YXRpb25GaWVsZE51bWJlciA9IDEwOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBudW1iZXJfcHJlc2VudGF0aW9uKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9udW1iZXJfcHJlc2VudGF0aW9uKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxMTsKLSAgaW5saW5lIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxMTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIG5hbWVfcHJlc2VudGF0aW9uID0gMTI7Ci0gIGlubGluZSBib29sIGhhc19uYW1lX3ByZXNlbnRhdGlvbigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lX3ByZXNlbnRhdGlvbigpOwotICBzdGF0aWMgY29uc3QgaW50IGtOYW1lUHJlc2VudGF0aW9uRmllbGROdW1iZXIgPSAxMjsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgbmFtZV9wcmVzZW50YXRpb24oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWVfcHJlc2VudGF0aW9uKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNJbmZvIHV1c19pbmZvID0gMTM7Ci0gIGlubGluZSBib29sIGhhc191dXNfaW5mbygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl91dXNfaW5mbygpOwotICBzdGF0aWMgY29uc3QgaW50IGtVdXNJbmZvRmllbGROdW1iZXIgPSAxMzsKLSAgaW5saW5lIGNvbnN0IDo6cmlsX3Byb3RvOjpSaWxVdXNJbmZvJiB1dXNfaW5mbygpIGNvbnN0OwotICBpbmxpbmUgOjpyaWxfcHJvdG86OlJpbFV1c0luZm8qIG11dGFibGVfdXVzX2luZm8oKTsKLSAgCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUmlsQ2FsbCkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgaW50IHN0YXRlXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBpbmRleF87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdG9hXzsKLSAgYm9vbCBpc19tcHR5XzsKLSAgYm9vbCBpc19tdF87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgYWxzXzsKLSAgYm9vbCBpc192b2ljZV87Ci0gIGJvb2wgaXNfdm9pY2VfcHJpdmFjeV87Ci0gIDo6c3RkOjpzdHJpbmcqIG51bWJlcl87Ci0gIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIF9kZWZhdWx0X251bWJlcl87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgbnVtYmVyX3ByZXNlbnRhdGlvbl87Ci0gIDo6c3RkOjpzdHJpbmcqIG5hbWVfOwotICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBfZGVmYXVsdF9uYW1lXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBuYW1lX3ByZXNlbnRhdGlvbl87Ci0gIDo6cmlsX3Byb3RvOjpSaWxVdXNJbmZvKiB1dXNfaW5mb187Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3JpbF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxMyArIDMxKSAvIDMyXTsKLSAgCi0gIC8vIFdIWSBET0VTICYgSEFWRSBMT1dFUiBQUkVDRURFTkNFIFRIQU4gIT0gIT8KLSAgaW5saW5lIGJvb2wgX2hhc19iaXQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChfaGFzX2JpdHNfW2luZGV4IC8gMzJdICYgKDF1IDw8IChpbmRleCAlIDMyKSkpICE9IDA7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX3NldF9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSB8PSAoMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfY2xlYXJfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gJj0gfigxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIAotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgUmlsQ2FsbCogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSSUxHV1NpZ25hbFN0cmVuZ3RoIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBSSUxHV1NpZ25hbFN0cmVuZ3RoKCk7Ci0gIHZpcnR1YWwgflJJTEdXU2lnbmFsU3RyZW5ndGgoKTsKLSAgCi0gIFJJTEdXU2lnbmFsU3RyZW5ndGgoY29uc3QgUklMR1dTaWduYWxTdHJlbmd0aCYgZnJvbSk7Ci0gIAotICBpbmxpbmUgUklMR1dTaWduYWxTdHJlbmd0aCYgb3BlcmF0b3I9KGNvbnN0IFJJTEdXU2lnbmFsU3RyZW5ndGgmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IFJJTEdXU2lnbmFsU3RyZW5ndGgmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChSSUxHV1NpZ25hbFN0cmVuZ3RoKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUklMR1dTaWduYWxTdHJlbmd0aCogTmV3KCkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBSSUxHV1NpZ25hbFN0cmVuZ3RoJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgUklMR1dTaWduYWxTdHJlbmd0aCYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBzaWduYWxfc3RyZW5ndGggPSAxOwotICBpbmxpbmUgYm9vbCBoYXNfc2lnbmFsX3N0cmVuZ3RoKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3NpZ25hbF9zdHJlbmd0aCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtTaWduYWxTdHJlbmd0aEZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgc2lnbmFsX3N0cmVuZ3RoKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9zaWduYWxfc3RyZW5ndGgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBiaXRfZXJyb3JfcmF0ZSA9IDI7Ci0gIGlubGluZSBib29sIGhhc19iaXRfZXJyb3JfcmF0ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9iaXRfZXJyb3JfcmF0ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtCaXRFcnJvclJhdGVGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGJpdF9lcnJvcl9yYXRlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9iaXRfZXJyb3JfcmF0ZSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUklMR1dTaWduYWxTdHJlbmd0aCkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBzaWduYWxfc3RyZW5ndGhfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGJpdF9lcnJvcl9yYXRlXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfcmlsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDIgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIFJJTEdXU2lnbmFsU3RyZW5ndGgqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBSSUxDRE1BU2lnbmFsU3RyZW5ndGgoKTsKLSAgdmlydHVhbCB+UklMQ0RNQVNpZ25hbFN0cmVuZ3RoKCk7Ci0gIAotICBSSUxDRE1BU2lnbmFsU3RyZW5ndGgoY29uc3QgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIG9wZXJhdG9yPShjb25zdCBSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IFJJTENETUFTaWduYWxTdHJlbmd0aCYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJJTENETUFTaWduYWxTdHJlbmd0aCogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIFJJTENETUFTaWduYWxTdHJlbmd0aCogTmV3KCkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgZGJtID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX2RibSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9kYm0oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrRGJtRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBkYm0oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2RibSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIGVjaW8gPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfZWNpbygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9lY2lvKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0VjaW9GaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGVjaW8oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2VjaW8oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJJTENETUFTaWduYWxTdHJlbmd0aCkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBkYm1fOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGVjaW9fOwotICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9yaWxfMmVwcm90bygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMiArIDMxKSAvIDMyXTsKLSAgCi0gIC8vIFdIWSBET0VTICYgSEFWRSBMT1dFUiBQUkVDRURFTkNFIFRIQU4gIT0gIT8KLSAgaW5saW5lIGJvb2wgX2hhc19iaXQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChfaGFzX2JpdHNfW2luZGV4IC8gMzJdICYgKDF1IDw8IChpbmRleCAlIDMyKSkpICE9IDA7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX3NldF9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSB8PSAoMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfY2xlYXJfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gJj0gfigxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIAotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJJTEVWRE9TaWduYWxTdHJlbmd0aCA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUklMRVZET1NpZ25hbFN0cmVuZ3RoKCk7Ci0gIHZpcnR1YWwgflJJTEVWRE9TaWduYWxTdHJlbmd0aCgpOwotICAKLSAgUklMRVZET1NpZ25hbFN0cmVuZ3RoKGNvbnN0IFJJTEVWRE9TaWduYWxTdHJlbmd0aCYgZnJvbSk7Ci0gIAotICBpbmxpbmUgUklMRVZET1NpZ25hbFN0cmVuZ3RoJiBvcGVyYXRvcj0oY29uc3QgUklMRVZET1NpZ25hbFN0cmVuZ3RoJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSSUxFVkRPU2lnbmFsU3RyZW5ndGgmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChSSUxFVkRPU2lnbmFsU3RyZW5ndGgqIG90aGVyKTsKLSAgCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBSSUxFVkRPU2lnbmFsU3RyZW5ndGgqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUklMRVZET1NpZ25hbFN0cmVuZ3RoJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgUklMRVZET1NpZ25hbFN0cmVuZ3RoJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICBwdWJsaWM6Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIGRibSA9IDE7Ci0gIGlubGluZSBib29sIGhhc19kYm0oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZGJtKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0RibUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZGJtKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9kYm0oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiBlY2lvID0gMjsKLSAgaW5saW5lIGJvb2wgaGFzX2VjaW8oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZWNpbygpOwotICBzdGF0aWMgY29uc3QgaW50IGtFY2lvRmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBlY2lvKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9lY2lvKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgc2lnbmFsX25vaXNlX3JhdGlvID0gMzsKLSAgaW5saW5lIGJvb2wgaGFzX3NpZ25hbF9ub2lzZV9yYXRpbygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9zaWduYWxfbm9pc2VfcmF0aW8oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrU2lnbmFsTm9pc2VSYXRpb0ZpZWxkTnVtYmVyID0gMzsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgc2lnbmFsX25vaXNlX3JhdGlvKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9zaWduYWxfbm9pc2VfcmF0aW8oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJJTEVWRE9TaWduYWxTdHJlbmd0aCkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBkYm1fOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGVjaW9fOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHNpZ25hbF9ub2lzZV9yYXRpb187Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3JpbF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBSSUxFVkRPU2lnbmFsU3RyZW5ndGgqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUnNwU3RyaW5ncyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUnNwU3RyaW5ncygpOwotICB2aXJ0dWFsIH5Sc3BTdHJpbmdzKCk7Ci0gIAotICBSc3BTdHJpbmdzKGNvbnN0IFJzcFN0cmluZ3MmIGZyb20pOwotICAKLSAgaW5saW5lIFJzcFN0cmluZ3MmIG9wZXJhdG9yPShjb25zdCBSc3BTdHJpbmdzJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSc3BTdHJpbmdzJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoUnNwU3RyaW5ncyogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIFJzcFN0cmluZ3MqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUnNwU3RyaW5ncyYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJzcFN0cmluZ3MmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gcmVwZWF0ZWQgc3RyaW5nIHN0cmluZ3MgPSAxOwotICBpbmxpbmUgaW50IHN0cmluZ3Nfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9zdHJpbmdzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1N0cmluZ3NGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHJpbmdzKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3N0cmluZ3MoaW50IGluZGV4KTsKLSAgaW5saW5lIHZvaWQgc2V0X3N0cmluZ3MoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9zdHJpbmdzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfc3RyaW5ncyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBhZGRfc3RyaW5ncygpOwotICBpbmxpbmUgdm9pZCBhZGRfc3RyaW5ncyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIGFkZF9zdHJpbmdzKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX3N0cmluZ3MoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mIHN0cmluZ3MoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qIG11dGFibGVfc3RyaW5ncygpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5Sc3BTdHJpbmdzKQotIHByaXZhdGU6Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+IHN0cmluZ3NfOwotICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9yaWxfMmVwcm90bygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKLSAgCi0gIC8vIFdIWSBET0VTICYgSEFWRSBMT1dFUiBQUkVDRURFTkNFIFRIQU4gIT0gIT8KLSAgaW5saW5lIGJvb2wgX2hhc19iaXQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChfaGFzX2JpdHNfW2luZGV4IC8gMzJdICYgKDF1IDw8IChpbmRleCAlIDMyKSkpICE9IDA7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX3NldF9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSB8PSAoMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfY2xlYXJfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gJj0gfigxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIAotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgUnNwU3RyaW5ncyogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSc3BJbnRlZ2VycyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUnNwSW50ZWdlcnMoKTsKLSAgdmlydHVhbCB+UnNwSW50ZWdlcnMoKTsKLSAgCi0gIFJzcEludGVnZXJzKGNvbnN0IFJzcEludGVnZXJzJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSc3BJbnRlZ2VycyYgb3BlcmF0b3I9KGNvbnN0IFJzcEludGVnZXJzJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSc3BJbnRlZ2VycyYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJzcEludGVnZXJzKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUnNwSW50ZWdlcnMqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUnNwSW50ZWdlcnMmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSc3BJbnRlZ2VycyYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyByZXBlYXRlZCBpbnQzMiBpbnRlZ2VycyA9IDE7Ci0gIGlubGluZSBpbnQgaW50ZWdlcnNfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9pbnRlZ2VycygpOwotICBzdGF0aWMgY29uc3QgaW50IGtJbnRlZ2Vyc0ZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgaW50ZWdlcnMoaW50IGluZGV4KSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2ludGVnZXJzKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIGFkZF9pbnRlZ2Vycyg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgotICAgICAgaW50ZWdlcnMoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgotICAgICAgbXV0YWJsZV9pbnRlZ2VycygpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5Sc3BJbnRlZ2VycykKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4gaW50ZWdlcnNfOwotICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9yaWxfMmVwcm90bygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKLSAgCi0gIC8vIFdIWSBET0VTICYgSEFWRSBMT1dFUiBQUkVDRURFTkNFIFRIQU4gIT0gIT8KLSAgaW5saW5lIGJvb2wgX2hhc19iaXQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChfaGFzX2JpdHNfW2luZGV4IC8gMzJdICYgKDF1IDw8IChpbmRleCAlIDMyKSkpICE9IDA7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX3NldF9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSB8PSAoMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfY2xlYXJfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gJj0gfigxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIAotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgUnNwSW50ZWdlcnMqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUnNwR2V0U2ltU3RhdHVzIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBSc3BHZXRTaW1TdGF0dXMoKTsKLSAgdmlydHVhbCB+UnNwR2V0U2ltU3RhdHVzKCk7Ci0gIAotICBSc3BHZXRTaW1TdGF0dXMoY29uc3QgUnNwR2V0U2ltU3RhdHVzJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSc3BHZXRTaW1TdGF0dXMmIG9wZXJhdG9yPShjb25zdCBSc3BHZXRTaW1TdGF0dXMmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IFJzcEdldFNpbVN0YXR1cyYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJzcEdldFNpbVN0YXR1cyogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIFJzcEdldFNpbVN0YXR1cyogTmV3KCkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBSc3BHZXRTaW1TdGF0dXMmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSc3BHZXRTaW1TdGF0dXMmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gcmVxdWlyZWQgLnJpbF9wcm90by5SaWxDYXJkU3RhdHVzIGNhcmRfc3RhdHVzID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX2NhcmRfc3RhdHVzKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2NhcmRfc3RhdHVzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NhcmRTdGF0dXNGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSBjb25zdCA6OnJpbF9wcm90bzo6UmlsQ2FyZFN0YXR1cyYgY2FyZF9zdGF0dXMoKSBjb25zdDsKLSAgaW5saW5lIDo6cmlsX3Byb3RvOjpSaWxDYXJkU3RhdHVzKiBtdXRhYmxlX2NhcmRfc3RhdHVzKCk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcEdldFNpbVN0YXR1cykKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpyaWxfcHJvdG86OlJpbENhcmRTdGF0dXMqIGNhcmRfc3RhdHVzXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfcmlsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIFJzcEdldFNpbVN0YXR1cyogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZXFFbnRlclNpbVBpbiA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUmVxRW50ZXJTaW1QaW4oKTsKLSAgdmlydHVhbCB+UmVxRW50ZXJTaW1QaW4oKTsKLSAgCi0gIFJlcUVudGVyU2ltUGluKGNvbnN0IFJlcUVudGVyU2ltUGluJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSZXFFbnRlclNpbVBpbiYgb3BlcmF0b3I9KGNvbnN0IFJlcUVudGVyU2ltUGluJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSZXFFbnRlclNpbVBpbiYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJlcUVudGVyU2ltUGluKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUmVxRW50ZXJTaW1QaW4qIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUmVxRW50ZXJTaW1QaW4mIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSZXFFbnRlclNpbVBpbiYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyByZXF1aXJlZCBzdHJpbmcgcGluID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX3BpbigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9waW4oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrUGluRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgcGluKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9waW4oY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfcGluKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3Bpbihjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9waW4oKTsKLSAgCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUmVxRW50ZXJTaW1QaW4pCi0gcHJpdmF0ZToKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgCi0gIDo6c3RkOjpzdHJpbmcqIHBpbl87Ci0gIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIF9kZWZhdWx0X3Bpbl87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3JpbF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBSZXFFbnRlclNpbVBpbiogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSc3BFbnRlclNpbVBpbiA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUnNwRW50ZXJTaW1QaW4oKTsKLSAgdmlydHVhbCB+UnNwRW50ZXJTaW1QaW4oKTsKLSAgCi0gIFJzcEVudGVyU2ltUGluKGNvbnN0IFJzcEVudGVyU2ltUGluJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSc3BFbnRlclNpbVBpbiYgb3BlcmF0b3I9KGNvbnN0IFJzcEVudGVyU2ltUGluJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSc3BFbnRlclNpbVBpbiYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJzcEVudGVyU2ltUGluKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUnNwRW50ZXJTaW1QaW4qIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUnNwRW50ZXJTaW1QaW4mIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSc3BFbnRlclNpbVBpbiYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyByZXF1aXJlZCBpbnQzMiByZXRyaWVzX3JlbWFpbmluZyA9IDE7Ci0gIGlubGluZSBib29sIGhhc19yZXRyaWVzX3JlbWFpbmluZygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9yZXRyaWVzX3JlbWFpbmluZygpOwotICBzdGF0aWMgY29uc3QgaW50IGtSZXRyaWVzUmVtYWluaW5nRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiByZXRyaWVzX3JlbWFpbmluZygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfcmV0cmllc19yZW1haW5pbmcoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcEVudGVyU2ltUGluKQotIHByaXZhdGU6Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHJldHJpZXNfcmVtYWluaW5nXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfcmlsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIFJzcEVudGVyU2ltUGluKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJzcEdldEN1cnJlbnRDYWxscyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUnNwR2V0Q3VycmVudENhbGxzKCk7Ci0gIHZpcnR1YWwgflJzcEdldEN1cnJlbnRDYWxscygpOwotICAKLSAgUnNwR2V0Q3VycmVudENhbGxzKGNvbnN0IFJzcEdldEN1cnJlbnRDYWxscyYgZnJvbSk7Ci0gIAotICBpbmxpbmUgUnNwR2V0Q3VycmVudENhbGxzJiBvcGVyYXRvcj0oY29uc3QgUnNwR2V0Q3VycmVudENhbGxzJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSc3BHZXRDdXJyZW50Q2FsbHMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChSc3BHZXRDdXJyZW50Q2FsbHMqIG90aGVyKTsKLSAgCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBSc3BHZXRDdXJyZW50Q2FsbHMqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUnNwR2V0Q3VycmVudENhbGxzJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgUnNwR2V0Q3VycmVudENhbGxzJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICBwdWJsaWM6Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIHJlcGVhdGVkIC5yaWxfcHJvdG8uUmlsQ2FsbCBjYWxscyA9IDE7Ci0gIGlubGluZSBpbnQgY2FsbHNfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9jYWxscygpOwotICBzdGF0aWMgY29uc3QgaW50IGtDYWxsc0ZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6cmlsX3Byb3RvOjpSaWxDYWxsJiBjYWxscyhpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpyaWxfcHJvdG86OlJpbENhbGwqIG11dGFibGVfY2FsbHMoaW50IGluZGV4KTsKLSAgaW5saW5lIDo6cmlsX3Byb3RvOjpSaWxDYWxsKiBhZGRfY2FsbHMoKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpyaWxfcHJvdG86OlJpbENhbGwgPiYKLSAgICAgIGNhbGxzKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6cmlsX3Byb3RvOjpSaWxDYWxsID4qCi0gICAgICBtdXRhYmxlX2NhbGxzKCk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcEdldEN1cnJlbnRDYWxscykKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnJpbF9wcm90bzo6UmlsQ2FsbCA+IGNhbGxzXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfcmlsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIFJzcEdldEN1cnJlbnRDYWxscyogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZXFEaWFsIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBSZXFEaWFsKCk7Ci0gIHZpcnR1YWwgflJlcURpYWwoKTsKLSAgCi0gIFJlcURpYWwoY29uc3QgUmVxRGlhbCYgZnJvbSk7Ci0gIAotICBpbmxpbmUgUmVxRGlhbCYgb3BlcmF0b3I9KGNvbnN0IFJlcURpYWwmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IFJlcURpYWwmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChSZXFEaWFsKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUmVxRGlhbCogTmV3KCkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBSZXFEaWFsJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgUmVxRGlhbCYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgYWRkcmVzcyA9IDE7Ci0gIGlubGluZSBib29sIGhhc19hZGRyZXNzKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2FkZHJlc3MoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrQWRkcmVzc0ZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFkZHJlc3MoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2FkZHJlc3MoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfYWRkcmVzcyhjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9hZGRyZXNzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2FkZHJlc3MoKTsKLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIGNsaXIgPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfY2xpcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9jbGlyKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NsaXJGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGNsaXIoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2NsaXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFV1c0luZm8gdXVzX2luZm8gPSAzOwotICBpbmxpbmUgYm9vbCBoYXNfdXVzX2luZm8oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdXVzX2luZm8oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrVXVzSW5mb0ZpZWxkTnVtYmVyID0gMzsKLSAgaW5saW5lIGNvbnN0IDo6cmlsX3Byb3RvOjpSaWxVdXNJbmZvJiB1dXNfaW5mbygpIGNvbnN0OwotICBpbmxpbmUgOjpyaWxfcHJvdG86OlJpbFV1c0luZm8qIG11dGFibGVfdXVzX2luZm8oKTsKLSAgCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUmVxRGlhbCkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpzdGQ6OnN0cmluZyogYWRkcmVzc187Ci0gIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIF9kZWZhdWx0X2FkZHJlc3NfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGNsaXJfOwotICA6OnJpbF9wcm90bzo6UmlsVXVzSW5mbyogdXVzX2luZm9fOwotICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9yaWxfMmVwcm90bygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMyArIDMxKSAvIDMyXTsKLSAgCi0gIC8vIFdIWSBET0VTICYgSEFWRSBMT1dFUiBQUkVDRURFTkNFIFRIQU4gIT0gIT8KLSAgaW5saW5lIGJvb2wgX2hhc19iaXQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChfaGFzX2JpdHNfW2luZGV4IC8gMzJdICYgKDF1IDw8IChpbmRleCAlIDMyKSkpICE9IDA7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX3NldF9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSB8PSAoMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfY2xlYXJfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gJj0gfigxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIAotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgUmVxRGlhbCogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZXFIYW5nVXAgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIFJlcUhhbmdVcCgpOwotICB2aXJ0dWFsIH5SZXFIYW5nVXAoKTsKLSAgCi0gIFJlcUhhbmdVcChjb25zdCBSZXFIYW5nVXAmIGZyb20pOwotICAKLSAgaW5saW5lIFJlcUhhbmdVcCYgb3BlcmF0b3I9KGNvbnN0IFJlcUhhbmdVcCYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICAKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgUmVxSGFuZ1VwJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoUmVxSGFuZ1VwKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUmVxSGFuZ1VwKiBOZXcoKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IFJlcUhhbmdVcCYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJlcUhhbmdVcCYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyByZXF1aXJlZCBpbnQzMiBjb25uZWN0aW9uX2luZGV4ID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX2Nvbm5lY3Rpb25faW5kZXgoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfY29ubmVjdGlvbl9pbmRleCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtDb25uZWN0aW9uSW5kZXhGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGNvbm5lY3Rpb25faW5kZXgoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2Nvbm5lY3Rpb25faW5kZXgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJlcUhhbmdVcCkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBjb25uZWN0aW9uX2luZGV4XzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfcmlsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIFJlcUhhbmdVcCogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSc3BMYXN0Q2FsbEZhaWxDYXVzZSA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUnNwTGFzdENhbGxGYWlsQ2F1c2UoKTsKLSAgdmlydHVhbCB+UnNwTGFzdENhbGxGYWlsQ2F1c2UoKTsKLSAgCi0gIFJzcExhc3RDYWxsRmFpbENhdXNlKGNvbnN0IFJzcExhc3RDYWxsRmFpbENhdXNlJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSc3BMYXN0Q2FsbEZhaWxDYXVzZSYgb3BlcmF0b3I9KGNvbnN0IFJzcExhc3RDYWxsRmFpbENhdXNlJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSc3BMYXN0Q2FsbEZhaWxDYXVzZSYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJzcExhc3RDYWxsRmFpbENhdXNlKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUnNwTGFzdENhbGxGYWlsQ2F1c2UqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUnNwTGFzdENhbGxGYWlsQ2F1c2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSc3BMYXN0Q2FsbEZhaWxDYXVzZSYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyByZXF1aXJlZCBpbnQzMiBsYXN0X2NhbGxfZmFpbF9jYXVzZSA9IDE7Ci0gIGlubGluZSBib29sIGhhc19sYXN0X2NhbGxfZmFpbF9jYXVzZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9sYXN0X2NhbGxfZmFpbF9jYXVzZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtMYXN0Q2FsbEZhaWxDYXVzZUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgbGFzdF9jYWxsX2ZhaWxfY2F1c2UoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2xhc3RfY2FsbF9mYWlsX2NhdXNlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5Sc3BMYXN0Q2FsbEZhaWxDYXVzZSkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBsYXN0X2NhbGxfZmFpbF9jYXVzZV87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3JpbF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBSc3BMYXN0Q2FsbEZhaWxDYXVzZSogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSc3BTaWduYWxTdHJlbmd0aCA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUnNwU2lnbmFsU3RyZW5ndGgoKTsKLSAgdmlydHVhbCB+UnNwU2lnbmFsU3RyZW5ndGgoKTsKLSAgCi0gIFJzcFNpZ25hbFN0cmVuZ3RoKGNvbnN0IFJzcFNpZ25hbFN0cmVuZ3RoJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSc3BTaWduYWxTdHJlbmd0aCYgb3BlcmF0b3I9KGNvbnN0IFJzcFNpZ25hbFN0cmVuZ3RoJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSc3BTaWduYWxTdHJlbmd0aCYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJzcFNpZ25hbFN0cmVuZ3RoKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUnNwU2lnbmFsU3RyZW5ndGgqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUnNwU2lnbmFsU3RyZW5ndGgmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSc3BTaWduYWxTdHJlbmd0aCYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJJTEdXU2lnbmFsU3RyZW5ndGggZ3dfc2lnbmFsc3RyZW5ndGggPSAxOwotICBpbmxpbmUgYm9vbCBoYXNfZ3dfc2lnbmFsc3RyZW5ndGgoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZ3dfc2lnbmFsc3RyZW5ndGgoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrR3dTaWduYWxzdHJlbmd0aEZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6cmlsX3Byb3RvOjpSSUxHV1NpZ25hbFN0cmVuZ3RoJiBnd19zaWduYWxzdHJlbmd0aCgpIGNvbnN0OwotICBpbmxpbmUgOjpyaWxfcHJvdG86OlJJTEdXU2lnbmFsU3RyZW5ndGgqIG11dGFibGVfZ3dfc2lnbmFsc3RyZW5ndGgoKTsKLSAgCi0gIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIGNkbWFfc2lnbmFsc3RyZW5ndGggPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfY2RtYV9zaWduYWxzdHJlbmd0aCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9jZG1hX3NpZ25hbHN0cmVuZ3RoKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NkbWFTaWduYWxzdHJlbmd0aEZpZWxkTnVtYmVyID0gMjsKLSAgaW5saW5lIGNvbnN0IDo6cmlsX3Byb3RvOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGgmIGNkbWFfc2lnbmFsc3RyZW5ndGgoKSBjb25zdDsKLSAgaW5saW5lIDo6cmlsX3Byb3RvOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGgqIG11dGFibGVfY2RtYV9zaWduYWxzdHJlbmd0aCgpOwotICAKLSAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SSUxFVkRPU2lnbmFsU3RyZW5ndGggZXZkb19zaWduYWxzdHJlbmd0aCA9IDM7Ci0gIGlubGluZSBib29sIGhhc19ldmRvX3NpZ25hbHN0cmVuZ3RoKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2V2ZG9fc2lnbmFsc3RyZW5ndGgoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrRXZkb1NpZ25hbHN0cmVuZ3RoRmllbGROdW1iZXIgPSAzOwotICBpbmxpbmUgY29uc3QgOjpyaWxfcHJvdG86OlJJTEVWRE9TaWduYWxTdHJlbmd0aCYgZXZkb19zaWduYWxzdHJlbmd0aCgpIGNvbnN0OwotICBpbmxpbmUgOjpyaWxfcHJvdG86OlJJTEVWRE9TaWduYWxTdHJlbmd0aCogbXV0YWJsZV9ldmRvX3NpZ25hbHN0cmVuZ3RoKCk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcFNpZ25hbFN0cmVuZ3RoKQotIHByaXZhdGU6Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIAotICA6OnJpbF9wcm90bzo6UklMR1dTaWduYWxTdHJlbmd0aCogZ3dfc2lnbmFsc3RyZW5ndGhfOwotICA6OnJpbF9wcm90bzo6UklMQ0RNQVNpZ25hbFN0cmVuZ3RoKiBjZG1hX3NpZ25hbHN0cmVuZ3RoXzsKLSAgOjpyaWxfcHJvdG86OlJJTEVWRE9TaWduYWxTdHJlbmd0aCogZXZkb19zaWduYWxzdHJlbmd0aF87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3JpbF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBSc3BTaWduYWxTdHJlbmd0aCogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSc3BPcGVyYXRvciA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUnNwT3BlcmF0b3IoKTsKLSAgdmlydHVhbCB+UnNwT3BlcmF0b3IoKTsKLSAgCi0gIFJzcE9wZXJhdG9yKGNvbnN0IFJzcE9wZXJhdG9yJiBmcm9tKTsKLSAgCi0gIGlubGluZSBSc3BPcGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFJzcE9wZXJhdG9yJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSc3BPcGVyYXRvciYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKFJzcE9wZXJhdG9yKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgUnNwT3BlcmF0b3IqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUnNwT3BlcmF0b3ImIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSc3BPcGVyYXRvciYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgbG9uZ19hbHBoYV9vbnMgPSAxOwotICBpbmxpbmUgYm9vbCBoYXNfbG9uZ19hbHBoYV9vbnMoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbG9uZ19hbHBoYV9vbnMoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTG9uZ0FscGhhT25zRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbG9uZ19hbHBoYV9vbnMoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2xvbmdfYWxwaGFfb25zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2xvbmdfYWxwaGFfb25zKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2xvbmdfYWxwaGFfb25zKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2xvbmdfYWxwaGFfb25zKCk7Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgc2hvcnRfYWxwaGFfb25zID0gMjsKLSAgaW5saW5lIGJvb2wgaGFzX3Nob3J0X2FscGhhX29ucygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9zaG9ydF9hbHBoYV9vbnMoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrU2hvcnRBbHBoYU9uc0ZpZWxkTnVtYmVyID0gMjsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHNob3J0X2FscGhhX29ucygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfc2hvcnRfYWxwaGFfb25zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3Nob3J0X2FscGhhX29ucyhjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9zaG9ydF9hbHBoYV9vbnMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfc2hvcnRfYWxwaGFfb25zKCk7Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgbWNjX21uYyA9IDM7Ci0gIGlubGluZSBib29sIGhhc19tY2NfbW5jKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX21jY19tbmMoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTWNjTW5jRmllbGROdW1iZXIgPSAzOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbWNjX21uYygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfbWNjX21uYyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9tY2NfbW5jKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X21jY19tbmMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbWNjX21uYygpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5Sc3BPcGVyYXRvcikKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpzdGQ6OnN0cmluZyogbG9uZ19hbHBoYV9vbnNfOwotICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBfZGVmYXVsdF9sb25nX2FscGhhX29uc187Ci0gIDo6c3RkOjpzdHJpbmcqIHNob3J0X2FscGhhX29uc187Ci0gIHN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nIF9kZWZhdWx0X3Nob3J0X2FscGhhX29uc187Ci0gIDo6c3RkOjpzdHJpbmcqIG1jY19tbmNfOwotICBzdGF0aWMgY29uc3QgOjpzdGQ6OnN0cmluZyBfZGVmYXVsdF9tY2NfbW5jXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfcmlsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDMgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIFJzcE9wZXJhdG9yKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlcVNlcGFyYXRlQ29ubmVjdGlvbiA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUmVxU2VwYXJhdGVDb25uZWN0aW9uKCk7Ci0gIHZpcnR1YWwgflJlcVNlcGFyYXRlQ29ubmVjdGlvbigpOwotICAKLSAgUmVxU2VwYXJhdGVDb25uZWN0aW9uKGNvbnN0IFJlcVNlcGFyYXRlQ29ubmVjdGlvbiYgZnJvbSk7Ci0gIAotICBpbmxpbmUgUmVxU2VwYXJhdGVDb25uZWN0aW9uJiBvcGVyYXRvcj0oY29uc3QgUmVxU2VwYXJhdGVDb25uZWN0aW9uJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChSZXFTZXBhcmF0ZUNvbm5lY3Rpb24qIG90aGVyKTsKLSAgCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24qIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUmVxU2VwYXJhdGVDb25uZWN0aW9uJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgUmVxU2VwYXJhdGVDb25uZWN0aW9uJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICBwdWJsaWM6Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIHJlcXVpcmVkIGludDMyIGluZGV4ID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX2luZGV4KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2luZGV4KCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0luZGV4RmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBpbmRleCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfaW5kZXgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJlcVNlcGFyYXRlQ29ubmVjdGlvbikKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBpbmRleF87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3JpbF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24qIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVxU2V0TXV0ZSA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgUmVxU2V0TXV0ZSgpOwotICB2aXJ0dWFsIH5SZXFTZXRNdXRlKCk7Ci0gIAotICBSZXFTZXRNdXRlKGNvbnN0IFJlcVNldE11dGUmIGZyb20pOwotICAKLSAgaW5saW5lIFJlcVNldE11dGUmIG9wZXJhdG9yPShjb25zdCBSZXFTZXRNdXRlJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBSZXFTZXRNdXRlJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoUmVxU2V0TXV0ZSogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIFJlcVNldE11dGUqIE5ldygpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUmVxU2V0TXV0ZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJlcVNldE11dGUmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gcmVxdWlyZWQgYm9vbCBzdGF0ZSA9IDE7Ci0gIGlubGluZSBib29sIGhhc19zdGF0ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9zdGF0ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtTdGF0ZUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGJvb2wgc3RhdGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3N0YXRlKGJvb2wgdmFsdWUpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5SZXFTZXRNdXRlKQotIHByaXZhdGU6Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIAotICBib29sIHN0YXRlXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19yaWxfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfcmlsXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIFJlcVNldE11dGUqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVxU2NyZWVuU3RhdGUgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIFJlcVNjcmVlblN0YXRlKCk7Ci0gIHZpcnR1YWwgflJlcVNjcmVlblN0YXRlKCk7Ci0gIAotICBSZXFTY3JlZW5TdGF0ZShjb25zdCBSZXFTY3JlZW5TdGF0ZSYgZnJvbSk7Ci0gIAotICBpbmxpbmUgUmVxU2NyZWVuU3RhdGUmIG9wZXJhdG9yPShjb25zdCBSZXFTY3JlZW5TdGF0ZSYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICAKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKLSAgfQotICAKLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgUmVxU2NyZWVuU3RhdGUmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChSZXFTY3JlZW5TdGF0ZSogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIFJlcVNjcmVlblN0YXRlKiBOZXcoKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IFJlcVNjcmVlblN0YXRlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgUmVxU2NyZWVuU3RhdGUmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gcmVxdWlyZWQgYm9vbCBzdGF0ZSA9IDE7Ci0gIGlubGluZSBib29sIGhhc19zdGF0ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9zdGF0ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtTdGF0ZUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGJvb2wgc3RhdGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3N0YXRlKGJvb2wgdmFsdWUpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5SZXFTY3JlZW5TdGF0ZSkKLSBwcml2YXRlOgotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgYm9vbCBzdGF0ZV87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3JpbF8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfcmlsXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3JpbF8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBSZXFTY3JlZW5TdGF0ZSogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gUmlsQXBwU3RhdHVzCi0KLS8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQXBwVHlwZSBhcHBfdHlwZSA9IDE7Ci1pbmxpbmUgYm9vbCBSaWxBcHBTdGF0dXM6Omhhc19hcHBfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDApOwotfQotaW5saW5lIHZvaWQgUmlsQXBwU3RhdHVzOjpjbGVhcl9hcHBfdHlwZSgpIHsKLSAgYXBwX3R5cGVfID0gMDsKLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSByaWxfcHJvdG86OlJpbEFwcFR5cGUgUmlsQXBwU3RhdHVzOjphcHBfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCByaWxfcHJvdG86OlJpbEFwcFR5cGUgPihhcHBfdHlwZV8pOwotfQotaW5saW5lIHZvaWQgUmlsQXBwU3RhdHVzOjpzZXRfYXBwX3R5cGUocmlsX3Byb3RvOjpSaWxBcHBUeXBlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0socmlsX3Byb3RvOjpSaWxBcHBUeXBlX0lzVmFsaWQodmFsdWUpKTsKLSAgX3NldF9iaXQoMCk7Ci0gIGFwcF90eXBlXyA9IHZhbHVlOwotfQotCi0vLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbEFwcFN0YXRlIGFwcF9zdGF0ZSA9IDI7Ci1pbmxpbmUgYm9vbCBSaWxBcHBTdGF0dXM6Omhhc19hcHBfc3RhdGUoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgxKTsKLX0KLWlubGluZSB2b2lkIFJpbEFwcFN0YXR1czo6Y2xlYXJfYXBwX3N0YXRlKCkgewotICBhcHBfc3RhdGVfID0gMDsKLSAgX2NsZWFyX2JpdCgxKTsKLX0KLWlubGluZSByaWxfcHJvdG86OlJpbEFwcFN0YXRlIFJpbEFwcFN0YXR1czo6YXBwX3N0YXRlKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8IHJpbF9wcm90bzo6UmlsQXBwU3RhdGUgPihhcHBfc3RhdGVfKTsKLX0KLWlubGluZSB2b2lkIFJpbEFwcFN0YXR1czo6c2V0X2FwcF9zdGF0ZShyaWxfcHJvdG86OlJpbEFwcFN0YXRlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0socmlsX3Byb3RvOjpSaWxBcHBTdGF0ZV9Jc1ZhbGlkKHZhbHVlKSk7Ci0gIF9zZXRfYml0KDEpOwotICBhcHBfc3RhdGVfID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGVyc29TdWJzdGF0ZSBwZXJzb19zdWJzdGF0ZSA9IDM7Ci1pbmxpbmUgYm9vbCBSaWxBcHBTdGF0dXM6Omhhc19wZXJzb19zdWJzdGF0ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDIpOwotfQotaW5saW5lIHZvaWQgUmlsQXBwU3RhdHVzOjpjbGVhcl9wZXJzb19zdWJzdGF0ZSgpIHsKLSAgcGVyc29fc3Vic3RhdGVfID0gMDsKLSAgX2NsZWFyX2JpdCgyKTsKLX0KLWlubGluZSByaWxfcHJvdG86OlJpbFBlcnNvU3Vic3RhdGUgUmlsQXBwU3RhdHVzOjpwZXJzb19zdWJzdGF0ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCByaWxfcHJvdG86OlJpbFBlcnNvU3Vic3RhdGUgPihwZXJzb19zdWJzdGF0ZV8pOwotfQotaW5saW5lIHZvaWQgUmlsQXBwU3RhdHVzOjpzZXRfcGVyc29fc3Vic3RhdGUocmlsX3Byb3RvOjpSaWxQZXJzb1N1YnN0YXRlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0socmlsX3Byb3RvOjpSaWxQZXJzb1N1YnN0YXRlX0lzVmFsaWQodmFsdWUpKTsKLSAgX3NldF9iaXQoMik7Ci0gIHBlcnNvX3N1YnN0YXRlXyA9IHZhbHVlOwotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgYWlkID0gNDsKLWlubGluZSBib29sIFJpbEFwcFN0YXR1czo6aGFzX2FpZCgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDMpOwotfQotaW5saW5lIHZvaWQgUmlsQXBwU3RhdHVzOjpjbGVhcl9haWQoKSB7Ci0gIGlmIChhaWRfICE9ICZfZGVmYXVsdF9haWRfKSB7Ci0gICAgYWlkXy0+Y2xlYXIoKTsKLSAgfQotICBfY2xlYXJfYml0KDMpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFJpbEFwcFN0YXR1czo6YWlkKCkgY29uc3QgewotICByZXR1cm4gKmFpZF87Ci19Ci1pbmxpbmUgdm9pZCBSaWxBcHBTdGF0dXM6OnNldF9haWQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgX3NldF9iaXQoMyk7Ci0gIGlmIChhaWRfID09ICZfZGVmYXVsdF9haWRfKSB7Ci0gICAgYWlkXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGFpZF8tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxBcHBTdGF0dXM6OnNldF9haWQoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgX3NldF9iaXQoMyk7Ci0gIGlmIChhaWRfID09ICZfZGVmYXVsdF9haWRfKSB7Ci0gICAgYWlkXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGFpZF8tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxBcHBTdGF0dXM6OnNldF9haWQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIF9zZXRfYml0KDMpOwotICBpZiAoYWlkXyA9PSAmX2RlZmF1bHRfYWlkXykgewotICAgIGFpZF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBhaWRfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBSaWxBcHBTdGF0dXM6Om11dGFibGVfYWlkKCkgewotICBfc2V0X2JpdCgzKTsKLSAgaWYgKGFpZF8gPT0gJl9kZWZhdWx0X2FpZF8pIHsKLSAgICBhaWRfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIGFpZF87Ci19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBhcHBfbGFiZWwgPSA1OwotaW5saW5lIGJvb2wgUmlsQXBwU3RhdHVzOjpoYXNfYXBwX2xhYmVsKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoNCk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxBcHBTdGF0dXM6OmNsZWFyX2FwcF9sYWJlbCgpIHsKLSAgaWYgKGFwcF9sYWJlbF8gIT0gJl9kZWZhdWx0X2FwcF9sYWJlbF8pIHsKLSAgICBhcHBfbGFiZWxfLT5jbGVhcigpOwotICB9Ci0gIF9jbGVhcl9iaXQoNCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgUmlsQXBwU3RhdHVzOjphcHBfbGFiZWwoKSBjb25zdCB7Ci0gIHJldHVybiAqYXBwX2xhYmVsXzsKLX0KLWlubGluZSB2b2lkIFJpbEFwcFN0YXR1czo6c2V0X2FwcF9sYWJlbChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBfc2V0X2JpdCg0KTsKLSAgaWYgKGFwcF9sYWJlbF8gPT0gJl9kZWZhdWx0X2FwcF9sYWJlbF8pIHsKLSAgICBhcHBfbGFiZWxfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgYXBwX2xhYmVsXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJpbEFwcFN0YXR1czo6c2V0X2FwcF9sYWJlbChjb25zdCBjaGFyKiB2YWx1ZSkgewotICBfc2V0X2JpdCg0KTsKLSAgaWYgKGFwcF9sYWJlbF8gPT0gJl9kZWZhdWx0X2FwcF9sYWJlbF8pIHsKLSAgICBhcHBfbGFiZWxfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgYXBwX2xhYmVsXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJpbEFwcFN0YXR1czo6c2V0X2FwcF9sYWJlbChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgX3NldF9iaXQoNCk7Ci0gIGlmIChhcHBfbGFiZWxfID09ICZfZGVmYXVsdF9hcHBfbGFiZWxfKSB7Ci0gICAgYXBwX2xhYmVsXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGFwcF9sYWJlbF8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFJpbEFwcFN0YXR1czo6bXV0YWJsZV9hcHBfbGFiZWwoKSB7Ci0gIF9zZXRfYml0KDQpOwotICBpZiAoYXBwX2xhYmVsXyA9PSAmX2RlZmF1bHRfYXBwX2xhYmVsXykgewotICAgIGFwcF9sYWJlbF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gYXBwX2xhYmVsXzsKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgcGluMV9yZXBsYWNlZCA9IDY7Ci1pbmxpbmUgYm9vbCBSaWxBcHBTdGF0dXM6Omhhc19waW4xX3JlcGxhY2VkKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoNSk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxBcHBTdGF0dXM6OmNsZWFyX3BpbjFfcmVwbGFjZWQoKSB7Ci0gIHBpbjFfcmVwbGFjZWRfID0gMDsKLSAgX2NsZWFyX2JpdCg1KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJpbEFwcFN0YXR1czo6cGluMV9yZXBsYWNlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBpbjFfcmVwbGFjZWRfOwotfQotaW5saW5lIHZvaWQgUmlsQXBwU3RhdHVzOjpzZXRfcGluMV9yZXBsYWNlZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDUpOwotICBwaW4xX3JlcGxhY2VkXyA9IHZhbHVlOwotfQotCi0vLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBpblN0YXRlIHBpbjEgPSA3OwotaW5saW5lIGJvb2wgUmlsQXBwU3RhdHVzOjpoYXNfcGluMSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDYpOwotfQotaW5saW5lIHZvaWQgUmlsQXBwU3RhdHVzOjpjbGVhcl9waW4xKCkgewotICBwaW4xXyA9IDA7Ci0gIF9jbGVhcl9iaXQoNik7Ci19Ci1pbmxpbmUgcmlsX3Byb3RvOjpSaWxQaW5TdGF0ZSBSaWxBcHBTdGF0dXM6OnBpbjEoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDwgcmlsX3Byb3RvOjpSaWxQaW5TdGF0ZSA+KHBpbjFfKTsKLX0KLWlubGluZSB2b2lkIFJpbEFwcFN0YXR1czo6c2V0X3BpbjEocmlsX3Byb3RvOjpSaWxQaW5TdGF0ZSB2YWx1ZSkgewotICBHT09HTEVfRENIRUNLKHJpbF9wcm90bzo6UmlsUGluU3RhdGVfSXNWYWxpZCh2YWx1ZSkpOwotICBfc2V0X2JpdCg2KTsKLSAgcGluMV8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxQaW5TdGF0ZSBwaW4yID0gODsKLWlubGluZSBib29sIFJpbEFwcFN0YXR1czo6aGFzX3BpbjIoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCg3KTsKLX0KLWlubGluZSB2b2lkIFJpbEFwcFN0YXR1czo6Y2xlYXJfcGluMigpIHsKLSAgcGluMl8gPSAwOwotICBfY2xlYXJfYml0KDcpOwotfQotaW5saW5lIHJpbF9wcm90bzo6UmlsUGluU3RhdGUgUmlsQXBwU3RhdHVzOjpwaW4yKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8IHJpbF9wcm90bzo6UmlsUGluU3RhdGUgPihwaW4yXyk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxBcHBTdGF0dXM6OnNldF9waW4yKHJpbF9wcm90bzo6UmlsUGluU3RhdGUgdmFsdWUpIHsKLSAgR09PR0xFX0RDSEVDSyhyaWxfcHJvdG86OlJpbFBpblN0YXRlX0lzVmFsaWQodmFsdWUpKTsKLSAgX3NldF9iaXQoNyk7Ci0gIHBpbjJfID0gdmFsdWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUmlsQ2FyZFN0YXR1cwotCi0vLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbENhcmRTdGF0ZSBjYXJkX3N0YXRlID0gMTsKLWlubGluZSBib29sIFJpbENhcmRTdGF0dXM6Omhhc19jYXJkX3N0YXRlKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYXJkU3RhdHVzOjpjbGVhcl9jYXJkX3N0YXRlKCkgewotICBjYXJkX3N0YXRlXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgcmlsX3Byb3RvOjpSaWxDYXJkU3RhdGUgUmlsQ2FyZFN0YXR1czo6Y2FyZF9zdGF0ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCByaWxfcHJvdG86OlJpbENhcmRTdGF0ZSA+KGNhcmRfc3RhdGVfKTsKLX0KLWlubGluZSB2b2lkIFJpbENhcmRTdGF0dXM6OnNldF9jYXJkX3N0YXRlKHJpbF9wcm90bzo6UmlsQ2FyZFN0YXRlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0socmlsX3Byb3RvOjpSaWxDYXJkU3RhdGVfSXNWYWxpZCh2YWx1ZSkpOwotICBfc2V0X2JpdCgwKTsKLSAgY2FyZF9zdGF0ZV8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxQaW5TdGF0ZSB1bml2ZXJzYWxfcGluX3N0YXRlID0gMjsKLWlubGluZSBib29sIFJpbENhcmRTdGF0dXM6Omhhc191bml2ZXJzYWxfcGluX3N0YXRlKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMSk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYXJkU3RhdHVzOjpjbGVhcl91bml2ZXJzYWxfcGluX3N0YXRlKCkgewotICB1bml2ZXJzYWxfcGluX3N0YXRlXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMSk7Ci19Ci1pbmxpbmUgcmlsX3Byb3RvOjpSaWxQaW5TdGF0ZSBSaWxDYXJkU3RhdHVzOjp1bml2ZXJzYWxfcGluX3N0YXRlKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8IHJpbF9wcm90bzo6UmlsUGluU3RhdGUgPih1bml2ZXJzYWxfcGluX3N0YXRlXyk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYXJkU3RhdHVzOjpzZXRfdW5pdmVyc2FsX3Bpbl9zdGF0ZShyaWxfcHJvdG86OlJpbFBpblN0YXRlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0socmlsX3Byb3RvOjpSaWxQaW5TdGF0ZV9Jc1ZhbGlkKHZhbHVlKSk7Ci0gIF9zZXRfYml0KDEpOwotICB1bml2ZXJzYWxfcGluX3N0YXRlXyA9IHZhbHVlOwotfQotCi0vLyBvcHRpb25hbCBpbnQzMiBnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4ID0gMzsKLWlubGluZSBib29sIFJpbENhcmRTdGF0dXM6Omhhc19nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4KCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMik7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYXJkU3RhdHVzOjpjbGVhcl9nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4KCkgewotICBnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4XyA9IDA7Ci0gIF9jbGVhcl9iaXQoMik7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBSaWxDYXJkU3RhdHVzOjpnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4KCkgY29uc3QgewotICByZXR1cm4gZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleF87Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYXJkU3RhdHVzOjpzZXRfZ3NtX3VtdHNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDIpOwotICBnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4XyA9IHZhbHVlOwotfQotCi0vLyBvcHRpb25hbCBpbnQzMiBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXggPSA0OwotaW5saW5lIGJvb2wgUmlsQ2FyZFN0YXR1czo6aGFzX2NkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDMpOwotfQotaW5saW5lIHZvaWQgUmlsQ2FyZFN0YXR1czo6Y2xlYXJfY2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4KCkgewotICBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXhfID0gMDsKLSAgX2NsZWFyX2JpdCgzKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJpbENhcmRTdGF0dXM6OmNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleF87Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYXJkU3RhdHVzOjpzZXRfY2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoMyk7Ci0gIGNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleF8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgbnVtX2FwcGxpY2F0aW9ucyA9IDU7Ci1pbmxpbmUgYm9vbCBSaWxDYXJkU3RhdHVzOjpoYXNfbnVtX2FwcGxpY2F0aW9ucygpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDQpOwotfQotaW5saW5lIHZvaWQgUmlsQ2FyZFN0YXR1czo6Y2xlYXJfbnVtX2FwcGxpY2F0aW9ucygpIHsKLSAgbnVtX2FwcGxpY2F0aW9uc18gPSAwOwotICBfY2xlYXJfYml0KDQpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgUmlsQ2FyZFN0YXR1czo6bnVtX2FwcGxpY2F0aW9ucygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bV9hcHBsaWNhdGlvbnNfOwotfQotaW5saW5lIHZvaWQgUmlsQ2FyZFN0YXR1czo6c2V0X251bV9hcHBsaWNhdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCg0KTsKLSAgbnVtX2FwcGxpY2F0aW9uc18gPSB2YWx1ZTsKLX0KLQotLy8gcmVwZWF0ZWQgLnJpbF9wcm90by5SaWxBcHBTdGF0dXMgYXBwbGljYXRpb25zID0gNjsKLWlubGluZSBpbnQgUmlsQ2FyZFN0YXR1czo6YXBwbGljYXRpb25zX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBhcHBsaWNhdGlvbnNfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIFJpbENhcmRTdGF0dXM6OmNsZWFyX2FwcGxpY2F0aW9ucygpIHsKLSAgYXBwbGljYXRpb25zXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6cmlsX3Byb3RvOjpSaWxBcHBTdGF0dXMmIFJpbENhcmRTdGF0dXM6OmFwcGxpY2F0aW9ucyhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGFwcGxpY2F0aW9uc18uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6OnJpbF9wcm90bzo6UmlsQXBwU3RhdHVzKiBSaWxDYXJkU3RhdHVzOjptdXRhYmxlX2FwcGxpY2F0aW9ucyhpbnQgaW5kZXgpIHsKLSAgcmV0dXJuIGFwcGxpY2F0aW9uc18uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgOjpyaWxfcHJvdG86OlJpbEFwcFN0YXR1cyogUmlsQ2FyZFN0YXR1czo6YWRkX2FwcGxpY2F0aW9ucygpIHsKLSAgcmV0dXJuIGFwcGxpY2F0aW9uc18uQWRkKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnJpbF9wcm90bzo6UmlsQXBwU3RhdHVzID4mCi1SaWxDYXJkU3RhdHVzOjphcHBsaWNhdGlvbnMoKSBjb25zdCB7Ci0gIHJldHVybiBhcHBsaWNhdGlvbnNfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpyaWxfcHJvdG86OlJpbEFwcFN0YXR1cyA+KgotUmlsQ2FyZFN0YXR1czo6bXV0YWJsZV9hcHBsaWNhdGlvbnMoKSB7Ci0gIHJldHVybiAmYXBwbGljYXRpb25zXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSaWxVdXNJbmZvCi0KLS8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzVHlwZSB1dXNfdHlwZSA9IDE7Ci1pbmxpbmUgYm9vbCBSaWxVdXNJbmZvOjpoYXNfdXVzX3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIFJpbFV1c0luZm86OmNsZWFyX3V1c190eXBlKCkgewotICB1dXNfdHlwZV8gPSAwOwotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIHJpbF9wcm90bzo6UmlsVXVzVHlwZSBSaWxVdXNJbmZvOjp1dXNfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCByaWxfcHJvdG86OlJpbFV1c1R5cGUgPih1dXNfdHlwZV8pOwotfQotaW5saW5lIHZvaWQgUmlsVXVzSW5mbzo6c2V0X3V1c190eXBlKHJpbF9wcm90bzo6UmlsVXVzVHlwZSB2YWx1ZSkgewotICBHT09HTEVfRENIRUNLKHJpbF9wcm90bzo6UmlsVXVzVHlwZV9Jc1ZhbGlkKHZhbHVlKSk7Ci0gIF9zZXRfYml0KDApOwotICB1dXNfdHlwZV8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNEY3MgdXVzX2RjcyA9IDI7Ci1pbmxpbmUgYm9vbCBSaWxVdXNJbmZvOjpoYXNfdXVzX2RjcygpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDEpOwotfQotaW5saW5lIHZvaWQgUmlsVXVzSW5mbzo6Y2xlYXJfdXVzX2RjcygpIHsKLSAgdXVzX2Rjc18gPSAwOwotICBfY2xlYXJfYml0KDEpOwotfQotaW5saW5lIHJpbF9wcm90bzo6UmlsVXVzRGNzIFJpbFV1c0luZm86OnV1c19kY3MoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDwgcmlsX3Byb3RvOjpSaWxVdXNEY3MgPih1dXNfZGNzXyk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxVdXNJbmZvOjpzZXRfdXVzX2RjcyhyaWxfcHJvdG86OlJpbFV1c0RjcyB2YWx1ZSkgewotICBHT09HTEVfRENIRUNLKHJpbF9wcm90bzo6UmlsVXVzRGNzX0lzVmFsaWQodmFsdWUpKTsKLSAgX3NldF9iaXQoMSk7Ci0gIHV1c19kY3NfID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIGludDMyIHV1c19sZW5ndGggPSAzOwotaW5saW5lIGJvb2wgUmlsVXVzSW5mbzo6aGFzX3V1c19sZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgyKTsKLX0KLWlubGluZSB2b2lkIFJpbFV1c0luZm86OmNsZWFyX3V1c19sZW5ndGgoKSB7Ci0gIHV1c19sZW5ndGhfID0gMDsKLSAgX2NsZWFyX2JpdCgyKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJpbFV1c0luZm86OnV1c19sZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiB1dXNfbGVuZ3RoXzsKLX0KLWlubGluZSB2b2lkIFJpbFV1c0luZm86OnNldF91dXNfbGVuZ3RoKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoMik7Ci0gIHV1c19sZW5ndGhfID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyB1dXNfZGF0YSA9IDQ7Ci1pbmxpbmUgYm9vbCBSaWxVdXNJbmZvOjpoYXNfdXVzX2RhdGEoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgzKTsKLX0KLWlubGluZSB2b2lkIFJpbFV1c0luZm86OmNsZWFyX3V1c19kYXRhKCkgewotICBpZiAodXVzX2RhdGFfICE9ICZfZGVmYXVsdF91dXNfZGF0YV8pIHsKLSAgICB1dXNfZGF0YV8tPmNsZWFyKCk7Ci0gIH0KLSAgX2NsZWFyX2JpdCgzKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBSaWxVdXNJbmZvOjp1dXNfZGF0YSgpIGNvbnN0IHsKLSAgcmV0dXJuICp1dXNfZGF0YV87Ci19Ci1pbmxpbmUgdm9pZCBSaWxVdXNJbmZvOjpzZXRfdXVzX2RhdGEoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgX3NldF9iaXQoMyk7Ci0gIGlmICh1dXNfZGF0YV8gPT0gJl9kZWZhdWx0X3V1c19kYXRhXykgewotICAgIHV1c19kYXRhXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHV1c19kYXRhXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJpbFV1c0luZm86OnNldF91dXNfZGF0YShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBfc2V0X2JpdCgzKTsKLSAgaWYgKHV1c19kYXRhXyA9PSAmX2RlZmF1bHRfdXVzX2RhdGFfKSB7Ci0gICAgdXVzX2RhdGFfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgdXVzX2RhdGFfLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgUmlsVXVzSW5mbzo6c2V0X3V1c19kYXRhKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBfc2V0X2JpdCgzKTsKLSAgaWYgKHV1c19kYXRhXyA9PSAmX2RlZmF1bHRfdXVzX2RhdGFfKSB7Ci0gICAgdXVzX2RhdGFfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgdXVzX2RhdGFfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBSaWxVdXNJbmZvOjptdXRhYmxlX3V1c19kYXRhKCkgewotICBfc2V0X2JpdCgzKTsKLSAgaWYgKHV1c19kYXRhXyA9PSAmX2RlZmF1bHRfdXVzX2RhdGFfKSB7Ci0gICAgdXVzX2RhdGFfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIHV1c19kYXRhXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSaWxDYWxsCi0KLS8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQ2FsbFN0YXRlIHN0YXRlID0gMTsKLWlubGluZSBib29sIFJpbENhbGw6Omhhc19zdGF0ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDApOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6Y2xlYXJfc3RhdGUoKSB7Ci0gIHN0YXRlXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgcmlsX3Byb3RvOjpSaWxDYWxsU3RhdGUgUmlsQ2FsbDo6c3RhdGUoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDwgcmlsX3Byb3RvOjpSaWxDYWxsU3RhdGUgPihzdGF0ZV8pOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6c2V0X3N0YXRlKHJpbF9wcm90bzo6UmlsQ2FsbFN0YXRlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0socmlsX3Byb3RvOjpSaWxDYWxsU3RhdGVfSXNWYWxpZCh2YWx1ZSkpOwotICBfc2V0X2JpdCgwKTsKLSAgc3RhdGVfID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIGludDMyIGluZGV4ID0gMjsKLWlubGluZSBib29sIFJpbENhbGw6Omhhc19pbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDEpOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6Y2xlYXJfaW5kZXgoKSB7Ci0gIGluZGV4XyA9IDA7Ci0gIF9jbGVhcl9iaXQoMSk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBSaWxDYWxsOjppbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIGluZGV4XzsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OnNldF9pbmRleCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDEpOwotICBpbmRleF8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgdG9hID0gMzsKLWlubGluZSBib29sIFJpbENhbGw6Omhhc190b2EoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgyKTsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OmNsZWFyX3RvYSgpIHsKLSAgdG9hXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMik7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBSaWxDYWxsOjp0b2EoKSBjb25zdCB7Ci0gIHJldHVybiB0b2FfOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6c2V0X3RvYSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDIpOwotICB0b2FfID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgaXNfbXB0eSA9IDQ7Ci1pbmxpbmUgYm9vbCBSaWxDYWxsOjpoYXNfaXNfbXB0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDMpOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6Y2xlYXJfaXNfbXB0eSgpIHsKLSAgaXNfbXB0eV8gPSBmYWxzZTsKLSAgX2NsZWFyX2JpdCgzKTsKLX0KLWlubGluZSBib29sIFJpbENhbGw6OmlzX21wdHkoKSBjb25zdCB7Ci0gIHJldHVybiBpc19tcHR5XzsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OnNldF9pc19tcHR5KGJvb2wgdmFsdWUpIHsKLSAgX3NldF9iaXQoMyk7Ci0gIGlzX21wdHlfID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgaXNfbXQgPSA1OwotaW5saW5lIGJvb2wgUmlsQ2FsbDo6aGFzX2lzX210KCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoNCk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYWxsOjpjbGVhcl9pc19tdCgpIHsKLSAgaXNfbXRfID0gZmFsc2U7Ci0gIF9jbGVhcl9iaXQoNCk7Ci19Ci1pbmxpbmUgYm9vbCBSaWxDYWxsOjppc19tdCgpIGNvbnN0IHsKLSAgcmV0dXJuIGlzX210XzsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OnNldF9pc19tdChib29sIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDQpOwotICBpc19tdF8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgYWxzID0gNjsKLWlubGluZSBib29sIFJpbENhbGw6Omhhc19hbHMoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCg1KTsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OmNsZWFyX2FscygpIHsKLSAgYWxzXyA9IDA7Ci0gIF9jbGVhcl9iaXQoNSk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBSaWxDYWxsOjphbHMoKSBjb25zdCB7Ci0gIHJldHVybiBhbHNfOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6c2V0X2Fscyg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDUpOwotICBhbHNfID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgaXNfdm9pY2UgPSA3OwotaW5saW5lIGJvb2wgUmlsQ2FsbDo6aGFzX2lzX3ZvaWNlKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoNik7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYWxsOjpjbGVhcl9pc192b2ljZSgpIHsKLSAgaXNfdm9pY2VfID0gZmFsc2U7Ci0gIF9jbGVhcl9iaXQoNik7Ci19Ci1pbmxpbmUgYm9vbCBSaWxDYWxsOjppc192b2ljZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGlzX3ZvaWNlXzsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OnNldF9pc192b2ljZShib29sIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDYpOwotICBpc192b2ljZV8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBpc192b2ljZV9wcml2YWN5ID0gODsKLWlubGluZSBib29sIFJpbENhbGw6Omhhc19pc192b2ljZV9wcml2YWN5KCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoNyk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYWxsOjpjbGVhcl9pc192b2ljZV9wcml2YWN5KCkgewotICBpc192b2ljZV9wcml2YWN5XyA9IGZhbHNlOwotICBfY2xlYXJfYml0KDcpOwotfQotaW5saW5lIGJvb2wgUmlsQ2FsbDo6aXNfdm9pY2VfcHJpdmFjeSgpIGNvbnN0IHsKLSAgcmV0dXJuIGlzX3ZvaWNlX3ByaXZhY3lfOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6c2V0X2lzX3ZvaWNlX3ByaXZhY3koYm9vbCB2YWx1ZSkgewotICBfc2V0X2JpdCg3KTsKLSAgaXNfdm9pY2VfcHJpdmFjeV8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIG51bWJlciA9IDk7Ci1pbmxpbmUgYm9vbCBSaWxDYWxsOjpoYXNfbnVtYmVyKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoOCk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYWxsOjpjbGVhcl9udW1iZXIoKSB7Ci0gIGlmIChudW1iZXJfICE9ICZfZGVmYXVsdF9udW1iZXJfKSB7Ci0gICAgbnVtYmVyXy0+Y2xlYXIoKTsKLSAgfQotICBfY2xlYXJfYml0KDgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFJpbENhbGw6Om51bWJlcigpIGNvbnN0IHsKLSAgcmV0dXJuICpudW1iZXJfOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6c2V0X251bWJlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBfc2V0X2JpdCg4KTsKLSAgaWYgKG51bWJlcl8gPT0gJl9kZWZhdWx0X251bWJlcl8pIHsKLSAgICBudW1iZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbnVtYmVyXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OnNldF9udW1iZXIoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgX3NldF9iaXQoOCk7Ci0gIGlmIChudW1iZXJfID09ICZfZGVmYXVsdF9udW1iZXJfKSB7Ci0gICAgbnVtYmVyXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG51bWJlcl8tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYWxsOjpzZXRfbnVtYmVyKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBfc2V0X2JpdCg4KTsKLSAgaWYgKG51bWJlcl8gPT0gJl9kZWZhdWx0X251bWJlcl8pIHsKLSAgICBudW1iZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbnVtYmVyXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogUmlsQ2FsbDo6bXV0YWJsZV9udW1iZXIoKSB7Ci0gIF9zZXRfYml0KDgpOwotICBpZiAobnVtYmVyXyA9PSAmX2RlZmF1bHRfbnVtYmVyXykgewotICAgIG51bWJlcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gbnVtYmVyXzsKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyX3ByZXNlbnRhdGlvbiA9IDEwOwotaW5saW5lIGJvb2wgUmlsQ2FsbDo6aGFzX251bWJlcl9wcmVzZW50YXRpb24oKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCg5KTsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OmNsZWFyX251bWJlcl9wcmVzZW50YXRpb24oKSB7Ci0gIG51bWJlcl9wcmVzZW50YXRpb25fID0gMDsKLSAgX2NsZWFyX2JpdCg5KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJpbENhbGw6Om51bWJlcl9wcmVzZW50YXRpb24oKSBjb25zdCB7Ci0gIHJldHVybiBudW1iZXJfcHJlc2VudGF0aW9uXzsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OnNldF9udW1iZXJfcHJlc2VudGF0aW9uKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoOSk7Ci0gIG51bWJlcl9wcmVzZW50YXRpb25fID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTE7Ci1pbmxpbmUgYm9vbCBSaWxDYWxsOjpoYXNfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDEwKTsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OmNsZWFyX25hbWUoKSB7Ci0gIGlmIChuYW1lXyAhPSAmX2RlZmF1bHRfbmFtZV8pIHsKLSAgICBuYW1lXy0+Y2xlYXIoKTsKLSAgfQotICBfY2xlYXJfYml0KDEwKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBSaWxDYWxsOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gKm5hbWVfOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgX3NldF9iaXQoMTApOwotICBpZiAobmFtZV8gPT0gJl9kZWZhdWx0X25hbWVfKSB7Ci0gICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDEwKTsKLSAgaWYgKG5hbWVfID09ICZfZGVmYXVsdF9uYW1lXykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYWxsOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgX3NldF9iaXQoMTApOwotICBpZiAobmFtZV8gPT0gJl9kZWZhdWx0X25hbWVfKSB7Ci0gICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBuYW1lXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogUmlsQ2FsbDo6bXV0YWJsZV9uYW1lKCkgewotICBfc2V0X2JpdCgxMCk7Ci0gIGlmIChuYW1lXyA9PSAmX2RlZmF1bHRfbmFtZV8pIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiBuYW1lXzsKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgbmFtZV9wcmVzZW50YXRpb24gPSAxMjsKLWlubGluZSBib29sIFJpbENhbGw6Omhhc19uYW1lX3ByZXNlbnRhdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDExKTsKLX0KLWlubGluZSB2b2lkIFJpbENhbGw6OmNsZWFyX25hbWVfcHJlc2VudGF0aW9uKCkgewotICBuYW1lX3ByZXNlbnRhdGlvbl8gPSAwOwotICBfY2xlYXJfYml0KDExKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJpbENhbGw6Om5hbWVfcHJlc2VudGF0aW9uKCkgY29uc3QgewotICByZXR1cm4gbmFtZV9wcmVzZW50YXRpb25fOwotfQotaW5saW5lIHZvaWQgUmlsQ2FsbDo6c2V0X25hbWVfcHJlc2VudGF0aW9uKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoMTEpOwotICBuYW1lX3ByZXNlbnRhdGlvbl8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNJbmZvIHV1c19pbmZvID0gMTM7Ci1pbmxpbmUgYm9vbCBSaWxDYWxsOjpoYXNfdXVzX2luZm8oKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgxMik7Ci19Ci1pbmxpbmUgdm9pZCBSaWxDYWxsOjpjbGVhcl91dXNfaW5mbygpIHsKLSAgaWYgKHV1c19pbmZvXyAhPSBOVUxMKSB1dXNfaW5mb18tPjo6cmlsX3Byb3RvOjpSaWxVdXNJbmZvOjpDbGVhcigpOwotICBfY2xlYXJfYml0KDEyKTsKLX0KLWlubGluZSBjb25zdCA6OnJpbF9wcm90bzo6UmlsVXVzSW5mbyYgUmlsQ2FsbDo6dXVzX2luZm8oKSBjb25zdCB7Ci0gIHJldHVybiB1dXNfaW5mb18gIT0gTlVMTCA/ICp1dXNfaW5mb18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPnV1c19pbmZvXzsKLX0KLWlubGluZSA6OnJpbF9wcm90bzo6UmlsVXVzSW5mbyogUmlsQ2FsbDo6bXV0YWJsZV91dXNfaW5mbygpIHsKLSAgX3NldF9iaXQoMTIpOwotICBpZiAodXVzX2luZm9fID09IE5VTEwpIHV1c19pbmZvXyA9IG5ldyA6OnJpbF9wcm90bzo6UmlsVXVzSW5mbzsKLSAgcmV0dXJuIHV1c19pbmZvXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSSUxHV1NpZ25hbFN0cmVuZ3RoCi0KLS8vIG9wdGlvbmFsIGludDMyIHNpZ25hbF9zdHJlbmd0aCA9IDE7Ci1pbmxpbmUgYm9vbCBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpoYXNfc2lnbmFsX3N0cmVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpjbGVhcl9zaWduYWxfc3RyZW5ndGgoKSB7Ci0gIHNpZ25hbF9zdHJlbmd0aF8gPSAwOwotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgUklMR1dTaWduYWxTdHJlbmd0aDo6c2lnbmFsX3N0cmVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gc2lnbmFsX3N0cmVuZ3RoXzsKLX0KLWlubGluZSB2b2lkIFJJTEdXU2lnbmFsU3RyZW5ndGg6OnNldF9zaWduYWxfc3RyZW5ndGgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgc2lnbmFsX3N0cmVuZ3RoXyA9IHZhbHVlOwotfQotCi0vLyBvcHRpb25hbCBpbnQzMiBiaXRfZXJyb3JfcmF0ZSA9IDI7Ci1pbmxpbmUgYm9vbCBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpoYXNfYml0X2Vycm9yX3JhdGUoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgxKTsKLX0KLWlubGluZSB2b2lkIFJJTEdXU2lnbmFsU3RyZW5ndGg6OmNsZWFyX2JpdF9lcnJvcl9yYXRlKCkgewotICBiaXRfZXJyb3JfcmF0ZV8gPSAwOwotICBfY2xlYXJfYml0KDEpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgUklMR1dTaWduYWxTdHJlbmd0aDo6Yml0X2Vycm9yX3JhdGUoKSBjb25zdCB7Ci0gIHJldHVybiBiaXRfZXJyb3JfcmF0ZV87Ci19Ci1pbmxpbmUgdm9pZCBSSUxHV1NpZ25hbFN0cmVuZ3RoOjpzZXRfYml0X2Vycm9yX3JhdGUoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgxKTsKLSAgYml0X2Vycm9yX3JhdGVfID0gdmFsdWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUklMQ0RNQVNpZ25hbFN0cmVuZ3RoCi0KLS8vIG9wdGlvbmFsIGludDMyIGRibSA9IDE7Ci1pbmxpbmUgYm9vbCBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6Omhhc19kYm0oKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIFJJTENETUFTaWduYWxTdHJlbmd0aDo6Y2xlYXJfZGJtKCkgewotICBkYm1fID0gMDsKLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJJTENETUFTaWduYWxTdHJlbmd0aDo6ZGJtKCkgY29uc3QgewotICByZXR1cm4gZGJtXzsKLX0KLWlubGluZSB2b2lkIFJJTENETUFTaWduYWxTdHJlbmd0aDo6c2V0X2RibSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDApOwotICBkYm1fID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIGludDMyIGVjaW8gPSAyOwotaW5saW5lIGJvb2wgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpoYXNfZWNpbygpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDEpOwotfQotaW5saW5lIHZvaWQgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoOjpjbGVhcl9lY2lvKCkgewotICBlY2lvXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMSk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OmVjaW8oKSBjb25zdCB7Ci0gIHJldHVybiBlY2lvXzsKLX0KLWlubGluZSB2b2lkIFJJTENETUFTaWduYWxTdHJlbmd0aDo6c2V0X2VjaW8oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgxKTsKLSAgZWNpb18gPSB2YWx1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSSUxFVkRPU2lnbmFsU3RyZW5ndGgKLQotLy8gb3B0aW9uYWwgaW50MzIgZGJtID0gMTsKLWlubGluZSBib29sIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6aGFzX2RibSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDApOwotfQotaW5saW5lIHZvaWQgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpjbGVhcl9kYm0oKSB7Ci0gIGRibV8gPSAwOwotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpkYm0oKSBjb25zdCB7Ci0gIHJldHVybiBkYm1fOwotfQotaW5saW5lIHZvaWQgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpzZXRfZGJtKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGRibV8gPSB2YWx1ZTsKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgZWNpbyA9IDI7Ci1pbmxpbmUgYm9vbCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6Omhhc19lY2lvKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMSk7Ci19Ci1pbmxpbmUgdm9pZCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OmNsZWFyX2VjaW8oKSB7Ci0gIGVjaW9fID0gMDsKLSAgX2NsZWFyX2JpdCgxKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJJTEVWRE9TaWduYWxTdHJlbmd0aDo6ZWNpbygpIGNvbnN0IHsKLSAgcmV0dXJuIGVjaW9fOwotfQotaW5saW5lIHZvaWQgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpzZXRfZWNpbyg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDEpOwotICBlY2lvXyA9IHZhbHVlOwotfQotCi0vLyBvcHRpb25hbCBpbnQzMiBzaWduYWxfbm9pc2VfcmF0aW8gPSAzOwotaW5saW5lIGJvb2wgUklMRVZET1NpZ25hbFN0cmVuZ3RoOjpoYXNfc2lnbmFsX25vaXNlX3JhdGlvKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMik7Ci19Ci1pbmxpbmUgdm9pZCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OmNsZWFyX3NpZ25hbF9ub2lzZV9yYXRpbygpIHsKLSAgc2lnbmFsX25vaXNlX3JhdGlvXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMik7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OnNpZ25hbF9ub2lzZV9yYXRpbygpIGNvbnN0IHsKLSAgcmV0dXJuIHNpZ25hbF9ub2lzZV9yYXRpb187Ci19Ci1pbmxpbmUgdm9pZCBSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OnNldF9zaWduYWxfbm9pc2VfcmF0aW8oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgyKTsKLSAgc2lnbmFsX25vaXNlX3JhdGlvXyA9IHZhbHVlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFJzcFN0cmluZ3MKLQotLy8gcmVwZWF0ZWQgc3RyaW5nIHN0cmluZ3MgPSAxOwotaW5saW5lIGludCBSc3BTdHJpbmdzOjpzdHJpbmdzX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBzdHJpbmdzXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBSc3BTdHJpbmdzOjpjbGVhcl9zdHJpbmdzKCkgewotICBzdHJpbmdzXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFJzcFN0cmluZ3M6OnN0cmluZ3MoaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBzdHJpbmdzXy5HZXQoaW5kZXgpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFJzcFN0cmluZ3M6Om11dGFibGVfc3RyaW5ncyhpbnQgaW5kZXgpIHsKLSAgcmV0dXJuIHN0cmluZ3NfLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIHZvaWQgUnNwU3RyaW5nczo6c2V0X3N0cmluZ3MoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzdHJpbmdzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJzcFN0cmluZ3M6OnNldF9zdHJpbmdzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc3RyaW5nc18uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBSc3BTdHJpbmdzOjpzZXRfc3RyaW5ncyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzdHJpbmdzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogUnNwU3RyaW5nczo6YWRkX3N0cmluZ3MoKSB7Ci0gIHJldHVybiBzdHJpbmdzXy5BZGQoKTsKLX0KLWlubGluZSB2b2lkIFJzcFN0cmluZ3M6OmFkZF9zdHJpbmdzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHN0cmluZ3NfLkFkZCgpLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgUnNwU3RyaW5nczo6YWRkX3N0cmluZ3MoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc3RyaW5nc18uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBSc3BTdHJpbmdzOjphZGRfc3RyaW5ncyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc3RyaW5nc18uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCi1Sc3BTdHJpbmdzOjpzdHJpbmdzKCkgY29uc3QgewotICByZXR1cm4gc3RyaW5nc187Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPioKLVJzcFN0cmluZ3M6Om11dGFibGVfc3RyaW5ncygpIHsKLSAgcmV0dXJuICZzdHJpbmdzXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSc3BJbnRlZ2VycwotCi0vLyByZXBlYXRlZCBpbnQzMiBpbnRlZ2VycyA9IDE7Ci1pbmxpbmUgaW50IFJzcEludGVnZXJzOjppbnRlZ2Vyc19zaXplKCkgY29uc3QgewotICByZXR1cm4gaW50ZWdlcnNfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIFJzcEludGVnZXJzOjpjbGVhcl9pbnRlZ2VycygpIHsKLSAgaW50ZWdlcnNfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBSc3BJbnRlZ2Vyczo6aW50ZWdlcnMoaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBpbnRlZ2Vyc18uR2V0KGluZGV4KTsKLX0KLWlubGluZSB2b2lkIFJzcEludGVnZXJzOjpzZXRfaW50ZWdlcnMoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIGludGVnZXJzXy5TZXQoaW5kZXgsIHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJzcEludGVnZXJzOjphZGRfaW50ZWdlcnMoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBpbnRlZ2Vyc18uQWRkKHZhbHVlKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKLVJzcEludGVnZXJzOjppbnRlZ2VycygpIGNvbnN0IHsKLSAgcmV0dXJuIGludGVnZXJzXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKLVJzcEludGVnZXJzOjptdXRhYmxlX2ludGVnZXJzKCkgewotICByZXR1cm4gJmludGVnZXJzXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSc3BHZXRTaW1TdGF0dXMKLQotLy8gcmVxdWlyZWQgLnJpbF9wcm90by5SaWxDYXJkU3RhdHVzIGNhcmRfc3RhdHVzID0gMTsKLWlubGluZSBib29sIFJzcEdldFNpbVN0YXR1czo6aGFzX2NhcmRfc3RhdHVzKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBSc3BHZXRTaW1TdGF0dXM6OmNsZWFyX2NhcmRfc3RhdHVzKCkgewotICBpZiAoY2FyZF9zdGF0dXNfICE9IE5VTEwpIGNhcmRfc3RhdHVzXy0+OjpyaWxfcHJvdG86OlJpbENhcmRTdGF0dXM6OkNsZWFyKCk7Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpyaWxfcHJvdG86OlJpbENhcmRTdGF0dXMmIFJzcEdldFNpbVN0YXR1czo6Y2FyZF9zdGF0dXMoKSBjb25zdCB7Ci0gIHJldHVybiBjYXJkX3N0YXR1c18gIT0gTlVMTCA/ICpjYXJkX3N0YXR1c18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPmNhcmRfc3RhdHVzXzsKLX0KLWlubGluZSA6OnJpbF9wcm90bzo6UmlsQ2FyZFN0YXR1cyogUnNwR2V0U2ltU3RhdHVzOjptdXRhYmxlX2NhcmRfc3RhdHVzKCkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKGNhcmRfc3RhdHVzXyA9PSBOVUxMKSBjYXJkX3N0YXR1c18gPSBuZXcgOjpyaWxfcHJvdG86OlJpbENhcmRTdGF0dXM7Ci0gIHJldHVybiBjYXJkX3N0YXR1c187Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUmVxRW50ZXJTaW1QaW4KLQotLy8gcmVxdWlyZWQgc3RyaW5nIHBpbiA9IDE7Ci1pbmxpbmUgYm9vbCBSZXFFbnRlclNpbVBpbjo6aGFzX3BpbigpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDApOwotfQotaW5saW5lIHZvaWQgUmVxRW50ZXJTaW1QaW46OmNsZWFyX3BpbigpIHsKLSAgaWYgKHBpbl8gIT0gJl9kZWZhdWx0X3Bpbl8pIHsKLSAgICBwaW5fLT5jbGVhcigpOwotICB9Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgUmVxRW50ZXJTaW1QaW46OnBpbigpIGNvbnN0IHsKLSAgcmV0dXJuICpwaW5fOwotfQotaW5saW5lIHZvaWQgUmVxRW50ZXJTaW1QaW46OnNldF9waW4oY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGlmIChwaW5fID09ICZfZGVmYXVsdF9waW5fKSB7Ci0gICAgcGluXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHBpbl8tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBSZXFFbnRlclNpbVBpbjo6c2V0X3Bpbihjb25zdCBjaGFyKiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKHBpbl8gPT0gJl9kZWZhdWx0X3Bpbl8pIHsKLSAgICBwaW5fID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcGluXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJlcUVudGVyU2ltUGluOjpzZXRfcGluKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKHBpbl8gPT0gJl9kZWZhdWx0X3Bpbl8pIHsKLSAgICBwaW5fID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcGluXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogUmVxRW50ZXJTaW1QaW46Om11dGFibGVfcGluKCkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKHBpbl8gPT0gJl9kZWZhdWx0X3Bpbl8pIHsKLSAgICBwaW5fID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIHBpbl87Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUnNwRW50ZXJTaW1QaW4KLQotLy8gcmVxdWlyZWQgaW50MzIgcmV0cmllc19yZW1haW5pbmcgPSAxOwotaW5saW5lIGJvb2wgUnNwRW50ZXJTaW1QaW46Omhhc19yZXRyaWVzX3JlbWFpbmluZygpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDApOwotfQotaW5saW5lIHZvaWQgUnNwRW50ZXJTaW1QaW46OmNsZWFyX3JldHJpZXNfcmVtYWluaW5nKCkgewotICByZXRyaWVzX3JlbWFpbmluZ18gPSAwOwotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgUnNwRW50ZXJTaW1QaW46OnJldHJpZXNfcmVtYWluaW5nKCkgY29uc3QgewotICByZXR1cm4gcmV0cmllc19yZW1haW5pbmdfOwotfQotaW5saW5lIHZvaWQgUnNwRW50ZXJTaW1QaW46OnNldF9yZXRyaWVzX3JlbWFpbmluZyg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDApOwotICByZXRyaWVzX3JlbWFpbmluZ18gPSB2YWx1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSc3BHZXRDdXJyZW50Q2FsbHMKLQotLy8gcmVwZWF0ZWQgLnJpbF9wcm90by5SaWxDYWxsIGNhbGxzID0gMTsKLWlubGluZSBpbnQgUnNwR2V0Q3VycmVudENhbGxzOjpjYWxsc19zaXplKCkgY29uc3QgewotICByZXR1cm4gY2FsbHNfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIFJzcEdldEN1cnJlbnRDYWxsczo6Y2xlYXJfY2FsbHMoKSB7Ci0gIGNhbGxzXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6cmlsX3Byb3RvOjpSaWxDYWxsJiBSc3BHZXRDdXJyZW50Q2FsbHM6OmNhbGxzKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gY2FsbHNfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpyaWxfcHJvdG86OlJpbENhbGwqIFJzcEdldEN1cnJlbnRDYWxsczo6bXV0YWJsZV9jYWxscyhpbnQgaW5kZXgpIHsKLSAgcmV0dXJuIGNhbGxzXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6OnJpbF9wcm90bzo6UmlsQ2FsbCogUnNwR2V0Q3VycmVudENhbGxzOjphZGRfY2FsbHMoKSB7Ci0gIHJldHVybiBjYWxsc18uQWRkKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnJpbF9wcm90bzo6UmlsQ2FsbCA+JgotUnNwR2V0Q3VycmVudENhbGxzOjpjYWxscygpIGNvbnN0IHsKLSAgcmV0dXJuIGNhbGxzXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6cmlsX3Byb3RvOjpSaWxDYWxsID4qCi1Sc3BHZXRDdXJyZW50Q2FsbHM6Om11dGFibGVfY2FsbHMoKSB7Ci0gIHJldHVybiAmY2FsbHNfOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFJlcURpYWwKLQotLy8gb3B0aW9uYWwgc3RyaW5nIGFkZHJlc3MgPSAxOwotaW5saW5lIGJvb2wgUmVxRGlhbDo6aGFzX2FkZHJlc3MoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIFJlcURpYWw6OmNsZWFyX2FkZHJlc3MoKSB7Ci0gIGlmIChhZGRyZXNzXyAhPSAmX2RlZmF1bHRfYWRkcmVzc18pIHsKLSAgICBhZGRyZXNzXy0+Y2xlYXIoKTsKLSAgfQotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFJlcURpYWw6OmFkZHJlc3MoKSBjb25zdCB7Ci0gIHJldHVybiAqYWRkcmVzc187Ci19Ci1pbmxpbmUgdm9pZCBSZXFEaWFsOjpzZXRfYWRkcmVzcyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKGFkZHJlc3NfID09ICZfZGVmYXVsdF9hZGRyZXNzXykgewotICAgIGFkZHJlc3NfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgYWRkcmVzc18tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBSZXFEaWFsOjpzZXRfYWRkcmVzcyhjb25zdCBjaGFyKiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKGFkZHJlc3NfID09ICZfZGVmYXVsdF9hZGRyZXNzXykgewotICAgIGFkZHJlc3NfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgYWRkcmVzc18tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBSZXFEaWFsOjpzZXRfYWRkcmVzcyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGlmIChhZGRyZXNzXyA9PSAmX2RlZmF1bHRfYWRkcmVzc18pIHsKLSAgICBhZGRyZXNzXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGFkZHJlc3NfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBSZXFEaWFsOjptdXRhYmxlX2FkZHJlc3MoKSB7Ci0gIF9zZXRfYml0KDApOwotICBpZiAoYWRkcmVzc18gPT0gJl9kZWZhdWx0X2FkZHJlc3NfKSB7Ci0gICAgYWRkcmVzc18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gYWRkcmVzc187Ci19Ci0KLS8vIG9wdGlvbmFsIGludDMyIGNsaXIgPSAyOwotaW5saW5lIGJvb2wgUmVxRGlhbDo6aGFzX2NsaXIoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgxKTsKLX0KLWlubGluZSB2b2lkIFJlcURpYWw6OmNsZWFyX2NsaXIoKSB7Ci0gIGNsaXJfID0gMDsKLSAgX2NsZWFyX2JpdCgxKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJlcURpYWw6OmNsaXIoKSBjb25zdCB7Ci0gIHJldHVybiBjbGlyXzsKLX0KLWlubGluZSB2b2lkIFJlcURpYWw6OnNldF9jbGlyKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoMSk7Ci0gIGNsaXJfID0gdmFsdWU7Ci19Ci0KLS8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzSW5mbyB1dXNfaW5mbyA9IDM7Ci1pbmxpbmUgYm9vbCBSZXFEaWFsOjpoYXNfdXVzX2luZm8oKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgyKTsKLX0KLWlubGluZSB2b2lkIFJlcURpYWw6OmNsZWFyX3V1c19pbmZvKCkgewotICBpZiAodXVzX2luZm9fICE9IE5VTEwpIHV1c19pbmZvXy0+OjpyaWxfcHJvdG86OlJpbFV1c0luZm86OkNsZWFyKCk7Ci0gIF9jbGVhcl9iaXQoMik7Ci19Ci1pbmxpbmUgY29uc3QgOjpyaWxfcHJvdG86OlJpbFV1c0luZm8mIFJlcURpYWw6OnV1c19pbmZvKCkgY29uc3QgewotICByZXR1cm4gdXVzX2luZm9fICE9IE5VTEwgPyAqdXVzX2luZm9fIDogKmRlZmF1bHRfaW5zdGFuY2VfLT51dXNfaW5mb187Ci19Ci1pbmxpbmUgOjpyaWxfcHJvdG86OlJpbFV1c0luZm8qIFJlcURpYWw6Om11dGFibGVfdXVzX2luZm8oKSB7Ci0gIF9zZXRfYml0KDIpOwotICBpZiAodXVzX2luZm9fID09IE5VTEwpIHV1c19pbmZvXyA9IG5ldyA6OnJpbF9wcm90bzo6UmlsVXVzSW5mbzsKLSAgcmV0dXJuIHV1c19pbmZvXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSZXFIYW5nVXAKLQotLy8gcmVxdWlyZWQgaW50MzIgY29ubmVjdGlvbl9pbmRleCA9IDE7Ci1pbmxpbmUgYm9vbCBSZXFIYW5nVXA6Omhhc19jb25uZWN0aW9uX2luZGV4KCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBSZXFIYW5nVXA6OmNsZWFyX2Nvbm5lY3Rpb25faW5kZXgoKSB7Ci0gIGNvbm5lY3Rpb25faW5kZXhfID0gMDsKLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJlcUhhbmdVcDo6Y29ubmVjdGlvbl9pbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbm5lY3Rpb25faW5kZXhfOwotfQotaW5saW5lIHZvaWQgUmVxSGFuZ1VwOjpzZXRfY29ubmVjdGlvbl9pbmRleCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDApOwotICBjb25uZWN0aW9uX2luZGV4XyA9IHZhbHVlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFJzcExhc3RDYWxsRmFpbENhdXNlCi0KLS8vIHJlcXVpcmVkIGludDMyIGxhc3RfY2FsbF9mYWlsX2NhdXNlID0gMTsKLWlubGluZSBib29sIFJzcExhc3RDYWxsRmFpbENhdXNlOjpoYXNfbGFzdF9jYWxsX2ZhaWxfY2F1c2UoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIFJzcExhc3RDYWxsRmFpbENhdXNlOjpjbGVhcl9sYXN0X2NhbGxfZmFpbF9jYXVzZSgpIHsKLSAgbGFzdF9jYWxsX2ZhaWxfY2F1c2VfID0gMDsKLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJzcExhc3RDYWxsRmFpbENhdXNlOjpsYXN0X2NhbGxfZmFpbF9jYXVzZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGxhc3RfY2FsbF9mYWlsX2NhdXNlXzsKLX0KLWlubGluZSB2b2lkIFJzcExhc3RDYWxsRmFpbENhdXNlOjpzZXRfbGFzdF9jYWxsX2ZhaWxfY2F1c2UoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgbGFzdF9jYWxsX2ZhaWxfY2F1c2VfID0gdmFsdWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUnNwU2lnbmFsU3RyZW5ndGgKLQotLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SSUxHV1NpZ25hbFN0cmVuZ3RoIGd3X3NpZ25hbHN0cmVuZ3RoID0gMTsKLWlubGluZSBib29sIFJzcFNpZ25hbFN0cmVuZ3RoOjpoYXNfZ3dfc2lnbmFsc3RyZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIFJzcFNpZ25hbFN0cmVuZ3RoOjpjbGVhcl9nd19zaWduYWxzdHJlbmd0aCgpIHsKLSAgaWYgKGd3X3NpZ25hbHN0cmVuZ3RoXyAhPSBOVUxMKSBnd19zaWduYWxzdHJlbmd0aF8tPjo6cmlsX3Byb3RvOjpSSUxHV1NpZ25hbFN0cmVuZ3RoOjpDbGVhcigpOwotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIGNvbnN0IDo6cmlsX3Byb3RvOjpSSUxHV1NpZ25hbFN0cmVuZ3RoJiBSc3BTaWduYWxTdHJlbmd0aDo6Z3dfc2lnbmFsc3RyZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBnd19zaWduYWxzdHJlbmd0aF8gIT0gTlVMTCA/ICpnd19zaWduYWxzdHJlbmd0aF8gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPmd3X3NpZ25hbHN0cmVuZ3RoXzsKLX0KLWlubGluZSA6OnJpbF9wcm90bzo6UklMR1dTaWduYWxTdHJlbmd0aCogUnNwU2lnbmFsU3RyZW5ndGg6Om11dGFibGVfZ3dfc2lnbmFsc3RyZW5ndGgoKSB7Ci0gIF9zZXRfYml0KDApOwotICBpZiAoZ3dfc2lnbmFsc3RyZW5ndGhfID09IE5VTEwpIGd3X3NpZ25hbHN0cmVuZ3RoXyA9IG5ldyA6OnJpbF9wcm90bzo6UklMR1dTaWduYWxTdHJlbmd0aDsKLSAgcmV0dXJuIGd3X3NpZ25hbHN0cmVuZ3RoXzsKLX0KLQotLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SSUxDRE1BU2lnbmFsU3RyZW5ndGggY2RtYV9zaWduYWxzdHJlbmd0aCA9IDI7Ci1pbmxpbmUgYm9vbCBSc3BTaWduYWxTdHJlbmd0aDo6aGFzX2NkbWFfc2lnbmFsc3RyZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgxKTsKLX0KLWlubGluZSB2b2lkIFJzcFNpZ25hbFN0cmVuZ3RoOjpjbGVhcl9jZG1hX3NpZ25hbHN0cmVuZ3RoKCkgewotICBpZiAoY2RtYV9zaWduYWxzdHJlbmd0aF8gIT0gTlVMTCkgY2RtYV9zaWduYWxzdHJlbmd0aF8tPjo6cmlsX3Byb3RvOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGg6OkNsZWFyKCk7Ci0gIF9jbGVhcl9iaXQoMSk7Ci19Ci1pbmxpbmUgY29uc3QgOjpyaWxfcHJvdG86OlJJTENETUFTaWduYWxTdHJlbmd0aCYgUnNwU2lnbmFsU3RyZW5ndGg6OmNkbWFfc2lnbmFsc3RyZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBjZG1hX3NpZ25hbHN0cmVuZ3RoXyAhPSBOVUxMID8gKmNkbWFfc2lnbmFsc3RyZW5ndGhfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5jZG1hX3NpZ25hbHN0cmVuZ3RoXzsKLX0KLWlubGluZSA6OnJpbF9wcm90bzo6UklMQ0RNQVNpZ25hbFN0cmVuZ3RoKiBSc3BTaWduYWxTdHJlbmd0aDo6bXV0YWJsZV9jZG1hX3NpZ25hbHN0cmVuZ3RoKCkgewotICBfc2V0X2JpdCgxKTsKLSAgaWYgKGNkbWFfc2lnbmFsc3RyZW5ndGhfID09IE5VTEwpIGNkbWFfc2lnbmFsc3RyZW5ndGhfID0gbmV3IDo6cmlsX3Byb3RvOjpSSUxDRE1BU2lnbmFsU3RyZW5ndGg7Ci0gIHJldHVybiBjZG1hX3NpZ25hbHN0cmVuZ3RoXzsKLX0KLQotLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SSUxFVkRPU2lnbmFsU3RyZW5ndGggZXZkb19zaWduYWxzdHJlbmd0aCA9IDM7Ci1pbmxpbmUgYm9vbCBSc3BTaWduYWxTdHJlbmd0aDo6aGFzX2V2ZG9fc2lnbmFsc3RyZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgyKTsKLX0KLWlubGluZSB2b2lkIFJzcFNpZ25hbFN0cmVuZ3RoOjpjbGVhcl9ldmRvX3NpZ25hbHN0cmVuZ3RoKCkgewotICBpZiAoZXZkb19zaWduYWxzdHJlbmd0aF8gIT0gTlVMTCkgZXZkb19zaWduYWxzdHJlbmd0aF8tPjo6cmlsX3Byb3RvOjpSSUxFVkRPU2lnbmFsU3RyZW5ndGg6OkNsZWFyKCk7Ci0gIF9jbGVhcl9iaXQoMik7Ci19Ci1pbmxpbmUgY29uc3QgOjpyaWxfcHJvdG86OlJJTEVWRE9TaWduYWxTdHJlbmd0aCYgUnNwU2lnbmFsU3RyZW5ndGg6OmV2ZG9fc2lnbmFsc3RyZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBldmRvX3NpZ25hbHN0cmVuZ3RoXyAhPSBOVUxMID8gKmV2ZG9fc2lnbmFsc3RyZW5ndGhfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5ldmRvX3NpZ25hbHN0cmVuZ3RoXzsKLX0KLWlubGluZSA6OnJpbF9wcm90bzo6UklMRVZET1NpZ25hbFN0cmVuZ3RoKiBSc3BTaWduYWxTdHJlbmd0aDo6bXV0YWJsZV9ldmRvX3NpZ25hbHN0cmVuZ3RoKCkgewotICBfc2V0X2JpdCgyKTsKLSAgaWYgKGV2ZG9fc2lnbmFsc3RyZW5ndGhfID09IE5VTEwpIGV2ZG9fc2lnbmFsc3RyZW5ndGhfID0gbmV3IDo6cmlsX3Byb3RvOjpSSUxFVkRPU2lnbmFsU3RyZW5ndGg7Ci0gIHJldHVybiBldmRvX3NpZ25hbHN0cmVuZ3RoXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSc3BPcGVyYXRvcgotCi0vLyBvcHRpb25hbCBzdHJpbmcgbG9uZ19hbHBoYV9vbnMgPSAxOwotaW5saW5lIGJvb2wgUnNwT3BlcmF0b3I6Omhhc19sb25nX2FscGhhX29ucygpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDApOwotfQotaW5saW5lIHZvaWQgUnNwT3BlcmF0b3I6OmNsZWFyX2xvbmdfYWxwaGFfb25zKCkgewotICBpZiAobG9uZ19hbHBoYV9vbnNfICE9ICZfZGVmYXVsdF9sb25nX2FscGhhX29uc18pIHsKLSAgICBsb25nX2FscGhhX29uc18tPmNsZWFyKCk7Ci0gIH0KLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBSc3BPcGVyYXRvcjo6bG9uZ19hbHBoYV9vbnMoKSBjb25zdCB7Ci0gIHJldHVybiAqbG9uZ19hbHBoYV9vbnNfOwotfQotaW5saW5lIHZvaWQgUnNwT3BlcmF0b3I6OnNldF9sb25nX2FscGhhX29ucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKGxvbmdfYWxwaGFfb25zXyA9PSAmX2RlZmF1bHRfbG9uZ19hbHBoYV9vbnNfKSB7Ci0gICAgbG9uZ19hbHBoYV9vbnNfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbG9uZ19hbHBoYV9vbnNfLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgUnNwT3BlcmF0b3I6OnNldF9sb25nX2FscGhhX29ucyhjb25zdCBjaGFyKiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgaWYgKGxvbmdfYWxwaGFfb25zXyA9PSAmX2RlZmF1bHRfbG9uZ19hbHBoYV9vbnNfKSB7Ci0gICAgbG9uZ19hbHBoYV9vbnNfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbG9uZ19hbHBoYV9vbnNfLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgUnNwT3BlcmF0b3I6OnNldF9sb25nX2FscGhhX29ucyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGlmIChsb25nX2FscGhhX29uc18gPT0gJl9kZWZhdWx0X2xvbmdfYWxwaGFfb25zXykgewotICAgIGxvbmdfYWxwaGFfb25zXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGxvbmdfYWxwaGFfb25zXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogUnNwT3BlcmF0b3I6Om11dGFibGVfbG9uZ19hbHBoYV9vbnMoKSB7Ci0gIF9zZXRfYml0KDApOwotICBpZiAobG9uZ19hbHBoYV9vbnNfID09ICZfZGVmYXVsdF9sb25nX2FscGhhX29uc18pIHsKLSAgICBsb25nX2FscGhhX29uc18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gbG9uZ19hbHBoYV9vbnNfOwotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgc2hvcnRfYWxwaGFfb25zID0gMjsKLWlubGluZSBib29sIFJzcE9wZXJhdG9yOjpoYXNfc2hvcnRfYWxwaGFfb25zKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMSk7Ci19Ci1pbmxpbmUgdm9pZCBSc3BPcGVyYXRvcjo6Y2xlYXJfc2hvcnRfYWxwaGFfb25zKCkgewotICBpZiAoc2hvcnRfYWxwaGFfb25zXyAhPSAmX2RlZmF1bHRfc2hvcnRfYWxwaGFfb25zXykgewotICAgIHNob3J0X2FscGhhX29uc18tPmNsZWFyKCk7Ci0gIH0KLSAgX2NsZWFyX2JpdCgxKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBSc3BPcGVyYXRvcjo6c2hvcnRfYWxwaGFfb25zKCkgY29uc3QgewotICByZXR1cm4gKnNob3J0X2FscGhhX29uc187Ci19Ci1pbmxpbmUgdm9pZCBSc3BPcGVyYXRvcjo6c2V0X3Nob3J0X2FscGhhX29ucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBfc2V0X2JpdCgxKTsKLSAgaWYgKHNob3J0X2FscGhhX29uc18gPT0gJl9kZWZhdWx0X3Nob3J0X2FscGhhX29uc18pIHsKLSAgICBzaG9ydF9hbHBoYV9vbnNfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgc2hvcnRfYWxwaGFfb25zXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJzcE9wZXJhdG9yOjpzZXRfc2hvcnRfYWxwaGFfb25zKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDEpOwotICBpZiAoc2hvcnRfYWxwaGFfb25zXyA9PSAmX2RlZmF1bHRfc2hvcnRfYWxwaGFfb25zXykgewotICAgIHNob3J0X2FscGhhX29uc18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBzaG9ydF9hbHBoYV9vbnNfLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgUnNwT3BlcmF0b3I6OnNldF9zaG9ydF9hbHBoYV9vbnMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIF9zZXRfYml0KDEpOwotICBpZiAoc2hvcnRfYWxwaGFfb25zXyA9PSAmX2RlZmF1bHRfc2hvcnRfYWxwaGFfb25zXykgewotICAgIHNob3J0X2FscGhhX29uc18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBzaG9ydF9hbHBoYV9vbnNfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBSc3BPcGVyYXRvcjo6bXV0YWJsZV9zaG9ydF9hbHBoYV9vbnMoKSB7Ci0gIF9zZXRfYml0KDEpOwotICBpZiAoc2hvcnRfYWxwaGFfb25zXyA9PSAmX2RlZmF1bHRfc2hvcnRfYWxwaGFfb25zXykgewotICAgIHNob3J0X2FscGhhX29uc18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gc2hvcnRfYWxwaGFfb25zXzsKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIG1jY19tbmMgPSAzOwotaW5saW5lIGJvb2wgUnNwT3BlcmF0b3I6Omhhc19tY2NfbW5jKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMik7Ci19Ci1pbmxpbmUgdm9pZCBSc3BPcGVyYXRvcjo6Y2xlYXJfbWNjX21uYygpIHsKLSAgaWYgKG1jY19tbmNfICE9ICZfZGVmYXVsdF9tY2NfbW5jXykgewotICAgIG1jY19tbmNfLT5jbGVhcigpOwotICB9Ci0gIF9jbGVhcl9iaXQoMik7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgUnNwT3BlcmF0b3I6Om1jY19tbmMoKSBjb25zdCB7Ci0gIHJldHVybiAqbWNjX21uY187Ci19Ci1pbmxpbmUgdm9pZCBSc3BPcGVyYXRvcjo6c2V0X21jY19tbmMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgX3NldF9iaXQoMik7Ci0gIGlmIChtY2NfbW5jXyA9PSAmX2RlZmF1bHRfbWNjX21uY18pIHsKLSAgICBtY2NfbW5jXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG1jY19tbmNfLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgUnNwT3BlcmF0b3I6OnNldF9tY2NfbW5jKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDIpOwotICBpZiAobWNjX21uY18gPT0gJl9kZWZhdWx0X21jY19tbmNfKSB7Ci0gICAgbWNjX21uY18gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBtY2NfbW5jXy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIFJzcE9wZXJhdG9yOjpzZXRfbWNjX21uYyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgX3NldF9iaXQoMik7Ci0gIGlmIChtY2NfbW5jXyA9PSAmX2RlZmF1bHRfbWNjX21uY18pIHsKLSAgICBtY2NfbW5jXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG1jY19tbmNfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBSc3BPcGVyYXRvcjo6bXV0YWJsZV9tY2NfbW5jKCkgewotICBfc2V0X2JpdCgyKTsKLSAgaWYgKG1jY19tbmNfID09ICZfZGVmYXVsdF9tY2NfbW5jXykgewotICAgIG1jY19tbmNfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIG1jY19tbmNfOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFJlcVNlcGFyYXRlQ29ubmVjdGlvbgotCi0vLyByZXF1aXJlZCBpbnQzMiBpbmRleCA9IDE7Ci1pbmxpbmUgYm9vbCBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246Omhhc19pbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDApOwotfQotaW5saW5lIHZvaWQgUmVxU2VwYXJhdGVDb25uZWN0aW9uOjpjbGVhcl9pbmRleCgpIHsKLSAgaW5kZXhfID0gMDsKLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFJlcVNlcGFyYXRlQ29ubmVjdGlvbjo6aW5kZXgoKSBjb25zdCB7Ci0gIHJldHVybiBpbmRleF87Ci19Ci1pbmxpbmUgdm9pZCBSZXFTZXBhcmF0ZUNvbm5lY3Rpb246OnNldF9pbmRleCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDApOwotICBpbmRleF8gPSB2YWx1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSZXFTZXRNdXRlCi0KLS8vIHJlcXVpcmVkIGJvb2wgc3RhdGUgPSAxOwotaW5saW5lIGJvb2wgUmVxU2V0TXV0ZTo6aGFzX3N0YXRlKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBSZXFTZXRNdXRlOjpjbGVhcl9zdGF0ZSgpIHsKLSAgc3RhdGVfID0gZmFsc2U7Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgYm9vbCBSZXFTZXRNdXRlOjpzdGF0ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRlXzsKLX0KLWlubGluZSB2b2lkIFJlcVNldE11dGU6OnNldF9zdGF0ZShib29sIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDApOwotICBzdGF0ZV8gPSB2YWx1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSZXFTY3JlZW5TdGF0ZQotCi0vLyByZXF1aXJlZCBib29sIHN0YXRlID0gMTsKLWlubGluZSBib29sIFJlcVNjcmVlblN0YXRlOjpoYXNfc3RhdGUoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIFJlcVNjcmVlblN0YXRlOjpjbGVhcl9zdGF0ZSgpIHsKLSAgc3RhdGVfID0gZmFsc2U7Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgYm9vbCBSZXFTY3JlZW5TdGF0ZTo6c3RhdGUoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0ZV87Ci19Ci1pbmxpbmUgdm9pZCBSZXFTY3JlZW5TdGF0ZTo6c2V0X3N0YXRlKGJvb2wgdmFsdWUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIHN0YXRlXyA9IHZhbHVlOwotfQotCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCi0KLX0gIC8vIG5hbWVzcGFjZSByaWxfcHJvdG8KLQotI2lmbmRlZiBTV0lHCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCByaWxfcHJvdG86OlJhZGlvU3RhdGU+KCkgewotICByZXR1cm4gcmlsX3Byb3RvOjpSYWRpb1N0YXRlX2Rlc2NyaXB0b3IoKTsKLX0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCByaWxfcHJvdG86OlJpbENhcmRTdGF0ZT4oKSB7Ci0gIHJldHVybiByaWxfcHJvdG86OlJpbENhcmRTdGF0ZV9kZXNjcmlwdG9yKCk7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgcmlsX3Byb3RvOjpSaWxQZXJzb1N1YnN0YXRlPigpIHsKLSAgcmV0dXJuIHJpbF9wcm90bzo6UmlsUGVyc29TdWJzdGF0ZV9kZXNjcmlwdG9yKCk7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgcmlsX3Byb3RvOjpSaWxBcHBTdGF0ZT4oKSB7Ci0gIHJldHVybiByaWxfcHJvdG86OlJpbEFwcFN0YXRlX2Rlc2NyaXB0b3IoKTsKLX0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCByaWxfcHJvdG86OlJpbFBpblN0YXRlPigpIHsKLSAgcmV0dXJuIHJpbF9wcm90bzo6UmlsUGluU3RhdGVfZGVzY3JpcHRvcigpOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IHJpbF9wcm90bzo6UmlsQXBwVHlwZT4oKSB7Ci0gIHJldHVybiByaWxfcHJvdG86OlJpbEFwcFR5cGVfZGVzY3JpcHRvcigpOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IHJpbF9wcm90bzo6UmlsVXVzVHlwZT4oKSB7Ci0gIHJldHVybiByaWxfcHJvdG86OlJpbFV1c1R5cGVfZGVzY3JpcHRvcigpOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IHJpbF9wcm90bzo6UmlsVXVzRGNzPigpIHsKLSAgcmV0dXJuIHJpbF9wcm90bzo6UmlsVXVzRGNzX2Rlc2NyaXB0b3IoKTsKLX0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCByaWxfcHJvdG86OlJpbENhbGxTdGF0ZT4oKSB7Ci0gIHJldHVybiByaWxfcHJvdG86OlJpbENhbGxTdGF0ZV9kZXNjcmlwdG9yKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotI2VuZGlmICAvLyBTV0lHCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCi0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfcmlsXzJlcHJvdG9fX0lOQ0xVREVECmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2Rlc2MvY3RybC5kZXNjIGIvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9kZXNjL2N0cmwuZGVzYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4ZmQ5Ni4uMDAwMDAwMAotLS0gYS9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2Rlc2MvY3RybC5kZXNjCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9kZXNjL21zZ2hlYWRlci5kZXNjIGIvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9kZXNjL21zZ2hlYWRlci5kZXNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmVhMDI4Li4wMDAwMDAwCi0tLSBhL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvZGVzYy9tc2doZWFkZXIuZGVzYworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvZGVzYy9yaWwuZGVzYyBiL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvZGVzYy9yaWwuZGVzYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0MGRiMy4uMDAwMDAwMAotLS0gYS9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2Rlc2MvcmlsLmRlc2MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvY29tbXVuaWNhdGlvbi9Nc2dIZWFkZXIuamF2YSBiL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9jb21tdW5pY2F0aW9uL01zZ0hlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDc1NmQ0Li4wMDAwMDAwCi0tLSBhL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9jb21tdW5pY2F0aW9uL01zZ0hlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbjsKLQotcHVibGljICBmaW5hbCBjbGFzcyBNc2dIZWFkZXIgZXh0ZW5kcwotICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgcHVibGljIE1zZ0hlYWRlcigpIHt9Ci0gIAotICAvLyByZXF1aXJlZCB1aW50MzIgY21kID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0ZJRUxEX05VTUJFUiA9IDE7Ci0gIHByaXZhdGUgYm9vbGVhbiBoYXNDbWQ7Ci0gIHByaXZhdGUgaW50IGNtZF8gPSAwOwotICBwdWJsaWMgaW50IGdldENtZCgpIHsgcmV0dXJuIGNtZF87IH0KLSAgcHVibGljIGJvb2xlYW4gaGFzQ21kKCkgeyByZXR1cm4gaGFzQ21kOyB9Ci0gIHB1YmxpYyBNc2dIZWFkZXIgc2V0Q21kKGludCB2YWx1ZSkgewotICAgIGhhc0NtZCA9IHRydWU7Ci0gICAgY21kXyA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIHB1YmxpYyBNc2dIZWFkZXIgY2xlYXJDbWQoKSB7Ci0gICAgaGFzQ21kID0gZmFsc2U7Ci0gICAgY21kXyA9IDA7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIC8vIHJlcXVpcmVkIHVpbnQzMiBsZW5ndGhfZGF0YSA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9EQVRBX0ZJRUxEX05VTUJFUiA9IDI7Ci0gIHByaXZhdGUgYm9vbGVhbiBoYXNMZW5ndGhEYXRhOwotICBwcml2YXRlIGludCBsZW5ndGhEYXRhXyA9IDA7Ci0gIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoRGF0YSgpIHsgcmV0dXJuIGxlbmd0aERhdGFfOyB9Ci0gIHB1YmxpYyBib29sZWFuIGhhc0xlbmd0aERhdGEoKSB7IHJldHVybiBoYXNMZW5ndGhEYXRhOyB9Ci0gIHB1YmxpYyBNc2dIZWFkZXIgc2V0TGVuZ3RoRGF0YShpbnQgdmFsdWUpIHsKLSAgICBoYXNMZW5ndGhEYXRhID0gdHJ1ZTsKLSAgICBsZW5ndGhEYXRhXyA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIHB1YmxpYyBNc2dIZWFkZXIgY2xlYXJMZW5ndGhEYXRhKCkgewotICAgIGhhc0xlbmd0aERhdGEgPSBmYWxzZTsKLSAgICBsZW5ndGhEYXRhXyA9IDA7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIC8vIG9wdGlvbmFsIHVpbnQzMiBzdGF0dXMgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRklFTERfTlVNQkVSID0gMzsKLSAgcHJpdmF0ZSBib29sZWFuIGhhc1N0YXR1czsKLSAgcHJpdmF0ZSBpbnQgc3RhdHVzXyA9IDA7Ci0gIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeyByZXR1cm4gc3RhdHVzXzsgfQotICBwdWJsaWMgYm9vbGVhbiBoYXNTdGF0dXMoKSB7IHJldHVybiBoYXNTdGF0dXM7IH0KLSAgcHVibGljIE1zZ0hlYWRlciBzZXRTdGF0dXMoaW50IHZhbHVlKSB7Ci0gICAgaGFzU3RhdHVzID0gdHJ1ZTsKLSAgICBzdGF0dXNfID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgcHVibGljIE1zZ0hlYWRlciBjbGVhclN0YXR1cygpIHsKLSAgICBoYXNTdGF0dXMgPSBmYWxzZTsKLSAgICBzdGF0dXNfID0gMDsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgdWludDY0IHRva2VuID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fRklFTERfTlVNQkVSID0gNDsKLSAgcHJpdmF0ZSBib29sZWFuIGhhc1Rva2VuOwotICBwcml2YXRlIGxvbmcgdG9rZW5fID0gMEw7Ci0gIHB1YmxpYyBsb25nIGdldFRva2VuKCkgeyByZXR1cm4gdG9rZW5fOyB9Ci0gIHB1YmxpYyBib29sZWFuIGhhc1Rva2VuKCkgeyByZXR1cm4gaGFzVG9rZW47IH0KLSAgcHVibGljIE1zZ0hlYWRlciBzZXRUb2tlbihsb25nIHZhbHVlKSB7Ci0gICAgaGFzVG9rZW4gPSB0cnVlOwotICAgIHRva2VuXyA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIHB1YmxpYyBNc2dIZWFkZXIgY2xlYXJUb2tlbigpIHsKLSAgICBoYXNUb2tlbiA9IGZhbHNlOwotICAgIHRva2VuXyA9IDBMOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgTXNnSGVhZGVyIGNsZWFyKCkgewotICAgIGNsZWFyQ21kKCk7Ci0gICAgY2xlYXJMZW5ndGhEYXRhKCk7Ci0gICAgY2xlYXJTdGF0dXMoKTsKLSAgICBjbGVhclRva2VuKCk7Ci0gICAgY2FjaGVkU2l6ZSA9IC0xOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgIGlmICghaGFzQ21kKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFoYXNMZW5ndGhEYXRhKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKGhhc0NtZCgpKSB7Ci0gICAgICBvdXRwdXQud3JpdGVVSW50MzIoMSwgZ2V0Q21kKCkpOwotICAgIH0KLSAgICBpZiAoaGFzTGVuZ3RoRGF0YSgpKSB7Ci0gICAgICBvdXRwdXQud3JpdGVVSW50MzIoMiwgZ2V0TGVuZ3RoRGF0YSgpKTsKLSAgICB9Ci0gICAgaWYgKGhhc1N0YXR1cygpKSB7Ci0gICAgICBvdXRwdXQud3JpdGVVSW50MzIoMywgZ2V0U3RhdHVzKCkpOwotICAgIH0KLSAgICBpZiAoaGFzVG9rZW4oKSkgewotICAgICAgb3V0cHV0LndyaXRlVUludDY0KDQsIGdldFRva2VuKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBjYWNoZWRTaXplOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgIGludCBzaXplID0gMDsKLSAgICBpZiAoaGFzQ21kKCkpIHsKLSAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgIC5jb21wdXRlVUludDMyU2l6ZSgxLCBnZXRDbWQoKSk7Ci0gICAgfQotICAgIGlmIChoYXNMZW5ndGhEYXRhKCkpIHsKLSAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgIC5jb21wdXRlVUludDMyU2l6ZSgyLCBnZXRMZW5ndGhEYXRhKCkpOwotICAgIH0KLSAgICBpZiAoaGFzU3RhdHVzKCkpIHsKLSAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgIC5jb21wdXRlVUludDMyU2l6ZSgzLCBnZXRTdGF0dXMoKSk7Ci0gICAgfQotICAgIGlmIChoYXNUb2tlbigpKSB7Ci0gICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAuY29tcHV0ZVVJbnQ2NFNpemUoNCwgZ2V0VG9rZW4oKSk7Ci0gICAgfQotICAgIGNhY2hlZFNpemUgPSBzaXplOwotICAgIHJldHVybiBzaXplOwotICB9Ci0gIAotICBwdWJsaWMgTXNnSGVhZGVyIG1lcmdlRnJvbSgKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgaWYgKCFwYXJzZVVua25vd25GaWVsZChpbnB1dCwgdGFnKSkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgODogewotICAgICAgICAgIHNldENtZChpbnB1dC5yZWFkVUludDMyKCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICBzZXRMZW5ndGhEYXRhKGlucHV0LnJlYWRVSW50MzIoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAyNDogewotICAgICAgICAgIHNldFN0YXR1cyhpbnB1dC5yZWFkVUludDMyKCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzI6IHsKLSAgICAgICAgICBzZXRUb2tlbihpbnB1dC5yZWFkVUludDY0KCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIE1zZ0hlYWRlciBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpCi0gICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIChNc2dIZWFkZXIpIChuZXcgTXNnSGVhZGVyKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBNc2dIZWFkZXIgcGFyc2VGcm9tKAotICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHJldHVybiAoTXNnSGVhZGVyKSAobmV3IE1zZ0hlYWRlcigpLm1lcmdlRnJvbShpbnB1dCkpOwotICB9Ci0gIAotfQotCmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3JpbF9wcm90by9SaWxDbWRzLmphdmEgYi9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3JpbF9wcm90by9SaWxDbWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTU0ZGIuLjAwMDAwMDAKLS0tIGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9yaWxfcHJvdG8vUmlsQ21kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxMyArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG87Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSaWxDbWRzIHsKLSAgcHJpdmF0ZSBSaWxDbWRzKCkge30KLSAgLy8gZW51bSBSYWRpb1N0YXRlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPU1RBVEVfT0ZGID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFESU9TVEFURV9VTkFWQUlMQUJMRSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPU1RBVEVfU0lNX05PVF9SRUFEWSA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPU1RBVEVfU0lNX0xPQ0tFRF9PUl9BQlNFTlQgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQURJT1NUQVRFX1NJTV9SRUFEWSA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPU1RBVEVfUlVJTV9OT1RfUkVBRFkgPSA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQURJT1NUQVRFX1JVSU1fUkVBRFkgPSA2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQURJT1NUQVRFX1JVSU1fTE9DS0VEX09SX0FCU0VOVCA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPU1RBVEVfTlZfTk9UX1JFQURZID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFESU9TVEFURV9OVl9SRUFEWSA9IDk7Ci0gIAotICAvLyBlbnVtIFJpbENhcmRTdGF0ZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVJEU1RBVEVfQUJTRU5UID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FSRFNUQVRFX1BSRVNFTlQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVJEU1RBVEVfRVJST1IgPSAyOwotICAKLSAgLy8gZW51bSBSaWxQZXJzb1N1YnN0YXRlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPU1VCU1RBVEVfVU5LTk9XTiA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPU1VCU1RBVEVfSU5fUFJPR1JFU1MgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTT1NVQlNUQVRFX1JFQURZID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU09TVUJTVEFURV9TSU1fTkVUV09SSyA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPU1VCU1RBVEVfU0lNX05FVFdPUktfU1VCU0VUID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU09TVUJTVEFURV9TSU1fQ09SUE9SQVRFID0gNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU09TVUJTVEFURV9TSU1fU0VSVklDRV9QUk9WSURFUiA9IDY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPU1VCU1RBVEVfU0lNX1NJTSA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPU1VCU1RBVEVfU0lNX05FVFdPUktfUFVLID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU09TVUJTVEFURV9TSU1fTkVUV09SS19TVUJTRVRfUFVLID0gOTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU09TVUJTVEFURV9TSU1fQ09SUE9SQVRFX1BVSyA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTT1NVQlNUQVRFX1NJTV9TRVJWSUNFX1BST1ZJREVSX1BVSyA9IDExOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTT1NVQlNUQVRFX1NJTV9TSU1fUFVLID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPU1VCU1RBVEVfUlVJTV9ORVRXT1JLMSA9IDEzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzIgPSAxNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU09TVUJTVEFURV9SVUlNX0hSUEQgPSAxNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU09TVUJTVEFURV9SVUlNX0NPUlBPUkFURSA9IDE2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTT1NVQlNUQVRFX1JVSU1fU0VSVklDRV9QUk9WSURFUiA9IDE3OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTT1NVQlNUQVRFX1JVSU1fUlVJTSA9IDE4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzFfUFVLID0gMTk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPU1VCU1RBVEVfUlVJTV9ORVRXT1JLMl9QVUsgPSAyMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU09TVUJTVEFURV9SVUlNX0hSUERfUFVLID0gMjE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPU1VCU1RBVEVfUlVJTV9DT1JQT1JBVEVfUFVLID0gMjI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPU1VCU1RBVEVfUlVJTV9TRVJWSUNFX1BST1ZJREVSX1BVSyA9IDIzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTT1NVQlNUQVRFX1JVSU1fUlVJTV9QVUsgPSAyNDsKLSAgCi0gIC8vIGVudW0gUmlsQXBwU3RhdGUKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQU1RBVEVfVU5LTk9XTiA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUFNUQVRFX0RFVEVDVEVEID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQU1RBVEVfUElOID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQU1RBVEVfUFVLID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQU1RBVEVfU1VCU0NSSVBUSU9OX1BFUlNPID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQU1RBVEVfUkVBRFkgPSA1OwotICAKLSAgLy8gZW51bSBSaWxQaW5TdGF0ZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSU5TVEFURV9VTktOT1dOID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUElOU1RBVEVfRU5BQkxFRF9OT1RfVkVSSUZJRUQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSU5TVEFURV9FTkFCTEVEX1ZFUklGSUVEID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUElOU1RBVEVfRElTQUJMRUQgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSU5TVEFURV9FTkFCTEVEX0JMT0NLRUQgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSU5TVEFURV9FTkFCTEVEX1BFUk1fQkxPQ0tFRCA9IDU7Ci0gIAotICAvLyBlbnVtIFJpbEFwcFR5cGUKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQVFlQRV9VTktOT1dOID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQVFlQRV9TSU0gPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBUWVBFX1VTSU0gPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBUWVBFX1JVSU0gPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBUWVBFX0NTSU0gPSA0OwotICAKLSAgLy8gZW51bSBSaWxVdXNUeXBlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTFVVU1RZUEUxX0lNUExJQ0lUID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMVVVTVFlQRTFfUkVRVUlSRUQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxVVVNUWVBFMV9OT1RfUkVRVUlSRUQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxVVVNUWVBFMl9SRVFVSVJFRCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTFVVU1RZUEUyX05PVF9SRVFVSVJFRCA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTFVVU1RZUEUzX1JFUVVJUkVEID0gNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMVVVTVFlQRTNfTk9UX1JFUVVJUkVEID0gNjsKLSAgCi0gIC8vIGVudW0gUmlsVXVzRGNzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTFVVU0RDU19VU1AgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxVVVNEQ1NfT1NJSExQID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklMVVVTRENTX1gyNDQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUxVVVNEQ1NfUk1DRiA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJTFVVU0RDU19JQTVjID0gNDsKLSAgCi0gIC8vIGVudW0gUmlsQ2FsbFN0YXRlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExTVEFURV9BQ1RJVkUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMU1RBVEVfSE9MRElORyA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExTVEFURV9ESUFMSU5HID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTFNUQVRFX0FMRVJUSU5HID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTFNUQVRFX0lOQ09NSU5HID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTFNUQVRFX1dBSVRJTkcgPSA1OwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSaWxBcHBTdGF0dXMgZXh0ZW5kcwotICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5NZXNzYWdlTWljcm8gewotICAgIHB1YmxpYyBSaWxBcHBTdGF0dXMoKSB7fQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQXBwVHlwZSBhcHBfdHlwZSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX1RZUEVfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQXBwVHlwZTsKLSAgICBwcml2YXRlIGludCBhcHBUeXBlXyA9IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5BUFBUWVBFX1VOS05PV047Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzQXBwVHlwZSgpIHsgcmV0dXJuIGhhc0FwcFR5cGU7IH0KLSAgICBwdWJsaWMgaW50IGdldEFwcFR5cGUoKSB7IHJldHVybiBhcHBUeXBlXzsgfQotICAgIHB1YmxpYyBSaWxBcHBTdGF0dXMgc2V0QXBwVHlwZShpbnQgdmFsdWUpIHsKLSAgICAgIGhhc0FwcFR5cGUgPSB0cnVlOwotICAgICAgYXBwVHlwZV8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmlsQXBwU3RhdHVzIGNsZWFyQXBwVHlwZSgpIHsKLSAgICAgIGhhc0FwcFR5cGUgPSBmYWxzZTsKLSAgICAgIGFwcFR5cGVfID0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLkFQUFRZUEVfVU5LTk9XTjsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbEFwcFN0YXRlIGFwcF9zdGF0ZSA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX1NUQVRFX0ZJRUxEX05VTUJFUiA9IDI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0FwcFN0YXRlOwotICAgIHByaXZhdGUgaW50IGFwcFN0YXRlXyA9IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5BUFBTVEFURV9VTktOT1dOOwotICAgIHB1YmxpYyBib29sZWFuIGhhc0FwcFN0YXRlKCkgeyByZXR1cm4gaGFzQXBwU3RhdGU7IH0KLSAgICBwdWJsaWMgaW50IGdldEFwcFN0YXRlKCkgeyByZXR1cm4gYXBwU3RhdGVfOyB9Ci0gICAgcHVibGljIFJpbEFwcFN0YXR1cyBzZXRBcHBTdGF0ZShpbnQgdmFsdWUpIHsKLSAgICAgIGhhc0FwcFN0YXRlID0gdHJ1ZTsKLSAgICAgIGFwcFN0YXRlXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxBcHBTdGF0dXMgY2xlYXJBcHBTdGF0ZSgpIHsKLSAgICAgIGhhc0FwcFN0YXRlID0gZmFsc2U7Ci0gICAgICBhcHBTdGF0ZV8gPSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuQVBQU1RBVEVfVU5LTk9XTjsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBlcnNvU3Vic3RhdGUgcGVyc29fc3Vic3RhdGUgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNPX1NVQlNUQVRFX0ZJRUxEX05VTUJFUiA9IDM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1BlcnNvU3Vic3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgcGVyc29TdWJzdGF0ZV8gPSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUEVSU09TVUJTVEFURV9VTktOT1dOOwotICAgIHB1YmxpYyBib29sZWFuIGhhc1BlcnNvU3Vic3RhdGUoKSB7IHJldHVybiBoYXNQZXJzb1N1YnN0YXRlOyB9Ci0gICAgcHVibGljIGludCBnZXRQZXJzb1N1YnN0YXRlKCkgeyByZXR1cm4gcGVyc29TdWJzdGF0ZV87IH0KLSAgICBwdWJsaWMgUmlsQXBwU3RhdHVzIHNldFBlcnNvU3Vic3RhdGUoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNQZXJzb1N1YnN0YXRlID0gdHJ1ZTsKLSAgICAgIHBlcnNvU3Vic3RhdGVfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJpbEFwcFN0YXR1cyBjbGVhclBlcnNvU3Vic3RhdGUoKSB7Ci0gICAgICBoYXNQZXJzb1N1YnN0YXRlID0gZmFsc2U7Ci0gICAgICBwZXJzb1N1YnN0YXRlXyA9IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5QRVJTT1NVQlNUQVRFX1VOS05PV047Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGFpZCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUlEX0ZJRUxEX05VTUJFUiA9IDQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0FpZDsKLSAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgYWlkXyA9ICIiOwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFpZCgpIHsgcmV0dXJuIGFpZF87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBaWQoKSB7IHJldHVybiBoYXNBaWQ7IH0KLSAgICBwdWJsaWMgUmlsQXBwU3RhdHVzIHNldEFpZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICBoYXNBaWQgPSB0cnVlOwotICAgICAgYWlkXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxBcHBTdGF0dXMgY2xlYXJBaWQoKSB7Ci0gICAgICBoYXNBaWQgPSBmYWxzZTsKLSAgICAgIGFpZF8gPSAiIjsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgYXBwX2xhYmVsID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfTEFCRUxfRklFTERfTlVNQkVSID0gNTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQXBwTGFiZWw7Ci0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGFwcExhYmVsXyA9ICIiOwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFwcExhYmVsKCkgeyByZXR1cm4gYXBwTGFiZWxfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzQXBwTGFiZWwoKSB7IHJldHVybiBoYXNBcHBMYWJlbDsgfQotICAgIHB1YmxpYyBSaWxBcHBTdGF0dXMgc2V0QXBwTGFiZWwoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgaGFzQXBwTGFiZWwgPSB0cnVlOwotICAgICAgYXBwTGFiZWxfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJpbEFwcFN0YXR1cyBjbGVhckFwcExhYmVsKCkgewotICAgICAgaGFzQXBwTGFiZWwgPSBmYWxzZTsKLSAgICAgIGFwcExhYmVsXyA9ICIiOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIHBpbjFfcmVwbGFjZWQgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJTjFfUkVQTEFDRURfRklFTERfTlVNQkVSID0gNjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUGluMVJlcGxhY2VkOwotICAgIHByaXZhdGUgaW50IHBpbjFSZXBsYWNlZF8gPSAwOwotICAgIHB1YmxpYyBpbnQgZ2V0UGluMVJlcGxhY2VkKCkgeyByZXR1cm4gcGluMVJlcGxhY2VkXzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc1BpbjFSZXBsYWNlZCgpIHsgcmV0dXJuIGhhc1BpbjFSZXBsYWNlZDsgfQotICAgIHB1YmxpYyBSaWxBcHBTdGF0dXMgc2V0UGluMVJlcGxhY2VkKGludCB2YWx1ZSkgewotICAgICAgaGFzUGluMVJlcGxhY2VkID0gdHJ1ZTsKLSAgICAgIHBpbjFSZXBsYWNlZF8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmlsQXBwU3RhdHVzIGNsZWFyUGluMVJlcGxhY2VkKCkgewotICAgICAgaGFzUGluMVJlcGxhY2VkID0gZmFsc2U7Ci0gICAgICBwaW4xUmVwbGFjZWRfID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFBpblN0YXRlIHBpbjEgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJTjFfRklFTERfTlVNQkVSID0gNzsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUGluMTsKLSAgICBwcml2YXRlIGludCBwaW4xXyA9IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5QSU5TVEFURV9VTktOT1dOOwotICAgIHB1YmxpYyBib29sZWFuIGhhc1BpbjEoKSB7IHJldHVybiBoYXNQaW4xOyB9Ci0gICAgcHVibGljIGludCBnZXRQaW4xKCkgeyByZXR1cm4gcGluMV87IH0KLSAgICBwdWJsaWMgUmlsQXBwU3RhdHVzIHNldFBpbjEoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNQaW4xID0gdHJ1ZTsKLSAgICAgIHBpbjFfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJpbEFwcFN0YXR1cyBjbGVhclBpbjEoKSB7Ci0gICAgICBoYXNQaW4xID0gZmFsc2U7Ci0gICAgICBwaW4xXyA9IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5QSU5TVEFURV9VTktOT1dOOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsUGluU3RhdGUgcGluMiA9IDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUElOMl9GSUVMRF9OVU1CRVIgPSA4OwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQaW4yOwotICAgIHByaXZhdGUgaW50IHBpbjJfID0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlBJTlNUQVRFX1VOS05PV047Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzUGluMigpIHsgcmV0dXJuIGhhc1BpbjI7IH0KLSAgICBwdWJsaWMgaW50IGdldFBpbjIoKSB7IHJldHVybiBwaW4yXzsgfQotICAgIHB1YmxpYyBSaWxBcHBTdGF0dXMgc2V0UGluMihpbnQgdmFsdWUpIHsKLSAgICAgIGhhc1BpbjIgPSB0cnVlOwotICAgICAgcGluMl8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmlsQXBwU3RhdHVzIGNsZWFyUGluMigpIHsKLSAgICAgIGhhc1BpbjIgPSBmYWxzZTsKLSAgICAgIHBpbjJfID0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlBJTlNUQVRFX1VOS05PV047Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJpbEFwcFN0YXR1cyBjbGVhcigpIHsKLSAgICAgIGNsZWFyQXBwVHlwZSgpOwotICAgICAgY2xlYXJBcHBTdGF0ZSgpOwotICAgICAgY2xlYXJQZXJzb1N1YnN0YXRlKCk7Ci0gICAgICBjbGVhckFpZCgpOwotICAgICAgY2xlYXJBcHBMYWJlbCgpOwotICAgICAgY2xlYXJQaW4xUmVwbGFjZWQoKTsKLSAgICAgIGNsZWFyUGluMSgpOwotICAgICAgY2xlYXJQaW4yKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzQXBwVHlwZSgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDEsIGdldEFwcFR5cGUoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQXBwU3RhdGUoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigyLCBnZXRBcHBTdGF0ZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNQZXJzb1N1YnN0YXRlKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMywgZ2V0UGVyc29TdWJzdGF0ZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNBaWQoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcoNCwgZ2V0QWlkKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0FwcExhYmVsKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlU3RyaW5nKDUsIGdldEFwcExhYmVsKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc1BpbjFSZXBsYWNlZCgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDYsIGdldFBpbjFSZXBsYWNlZCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNQaW4xKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoNywgZ2V0UGluMSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNQaW4yKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoOCwgZ2V0UGluMigpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVkU2l6ZSgpIHsKLSAgICAgIGlmIChjYWNoZWRTaXplIDwgMCkgewotICAgICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgICAgZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjYWNoZWRTaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGhhc0FwcFR5cGUoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlSW50MzJTaXplKDEsIGdldEFwcFR5cGUoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQXBwU3RhdGUoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlSW50MzJTaXplKDIsIGdldEFwcFN0YXRlKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc1BlcnNvU3Vic3RhdGUoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlSW50MzJTaXplKDMsIGdldFBlcnNvU3Vic3RhdGUoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQWlkKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZVN0cmluZ1NpemUoNCwgZ2V0QWlkKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0FwcExhYmVsKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZVN0cmluZ1NpemUoNSwgZ2V0QXBwTGFiZWwoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzUGluMVJlcGxhY2VkKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSg2LCBnZXRQaW4xUmVwbGFjZWQoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzUGluMSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoNywgZ2V0UGluMSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNQaW4yKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSg4LCBnZXRQaW4yKCkpOwotICAgICAgfQotICAgICAgY2FjaGVkU2l6ZSA9IHNpemU7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFJpbEFwcFN0YXR1cyBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICAgIHNldEFwcFR5cGUoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgICAgc2V0QXBwU3RhdGUoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjQ6IHsKLSAgICAgICAgICAgICAgc2V0UGVyc29TdWJzdGF0ZShpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgc2V0QWlkKGlucHV0LnJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MjogewotICAgICAgICAgICAgc2V0QXBwTGFiZWwoaW5wdXQucmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQ4OiB7Ci0gICAgICAgICAgICBzZXRQaW4xUmVwbGFjZWQoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTY6IHsKLSAgICAgICAgICAgICAgc2V0UGluMShpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA2NDogewotICAgICAgICAgICAgICBzZXRQaW4yKGlucHV0LnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJpbEFwcFN0YXR1cyBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUmlsQXBwU3RhdHVzKSAobmV3IFJpbEFwcFN0YXR1cygpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUmlsQXBwU3RhdHVzIHBhcnNlRnJvbSgKLSAgICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJpbEFwcFN0YXR1cykgKG5ldyBSaWxBcHBTdGF0dXMoKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmlsQ2FyZFN0YXR1cyBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIFJpbENhcmRTdGF0dXMoKSB7fQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQ2FyZFN0YXRlIGNhcmRfc3RhdGUgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUkRfU1RBVEVfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2FyZFN0YXRlOwotICAgIHByaXZhdGUgaW50IGNhcmRTdGF0ZV8gPSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuQ0FSRFNUQVRFX0FCU0VOVDsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYXJkU3RhdGUoKSB7IHJldHVybiBoYXNDYXJkU3RhdGU7IH0KLSAgICBwdWJsaWMgaW50IGdldENhcmRTdGF0ZSgpIHsgcmV0dXJuIGNhcmRTdGF0ZV87IH0KLSAgICBwdWJsaWMgUmlsQ2FyZFN0YXR1cyBzZXRDYXJkU3RhdGUoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNDYXJkU3RhdGUgPSB0cnVlOwotICAgICAgY2FyZFN0YXRlXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYXJkU3RhdHVzIGNsZWFyQ2FyZFN0YXRlKCkgewotICAgICAgaGFzQ2FyZFN0YXRlID0gZmFsc2U7Ci0gICAgICBjYXJkU3RhdGVfID0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLkNBUkRTVEFURV9BQlNFTlQ7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxQaW5TdGF0ZSB1bml2ZXJzYWxfcGluX3N0YXRlID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTklWRVJTQUxfUElOX1NUQVRFX0ZJRUxEX05VTUJFUiA9IDI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1VuaXZlcnNhbFBpblN0YXRlOwotICAgIHByaXZhdGUgaW50IHVuaXZlcnNhbFBpblN0YXRlXyA9IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5QSU5TVEFURV9VTktOT1dOOwotICAgIHB1YmxpYyBib29sZWFuIGhhc1VuaXZlcnNhbFBpblN0YXRlKCkgeyByZXR1cm4gaGFzVW5pdmVyc2FsUGluU3RhdGU7IH0KLSAgICBwdWJsaWMgaW50IGdldFVuaXZlcnNhbFBpblN0YXRlKCkgeyByZXR1cm4gdW5pdmVyc2FsUGluU3RhdGVfOyB9Ci0gICAgcHVibGljIFJpbENhcmRTdGF0dXMgc2V0VW5pdmVyc2FsUGluU3RhdGUoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNVbml2ZXJzYWxQaW5TdGF0ZSA9IHRydWU7Ci0gICAgICB1bml2ZXJzYWxQaW5TdGF0ZV8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmlsQ2FyZFN0YXR1cyBjbGVhclVuaXZlcnNhbFBpblN0YXRlKCkgewotICAgICAgaGFzVW5pdmVyc2FsUGluU3RhdGUgPSBmYWxzZTsKLSAgICAgIHVuaXZlcnNhbFBpblN0YXRlXyA9IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5QSU5TVEFURV9VTktOT1dOOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIGdzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXggPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdTTV9VTVRTX1NVQlNDUklQVElPTl9BUFBfSU5ERVhfRklFTERfTlVNQkVSID0gMzsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzR3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4OwotICAgIHByaXZhdGUgaW50IGdzbVVtdHNTdWJzY3JpcHRpb25BcHBJbmRleF8gPSAwOwotICAgIHB1YmxpYyBpbnQgZ2V0R3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4KCkgeyByZXR1cm4gZ3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4XzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc0dzbVVtdHNTdWJzY3JpcHRpb25BcHBJbmRleCgpIHsgcmV0dXJuIGhhc0dzbVVtdHNTdWJzY3JpcHRpb25BcHBJbmRleDsgfQotICAgIHB1YmxpYyBSaWxDYXJkU3RhdHVzIHNldEdzbVVtdHNTdWJzY3JpcHRpb25BcHBJbmRleChpbnQgdmFsdWUpIHsKLSAgICAgIGhhc0dzbVVtdHNTdWJzY3JpcHRpb25BcHBJbmRleCA9IHRydWU7Ci0gICAgICBnc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXhfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJpbENhcmRTdGF0dXMgY2xlYXJHc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXgoKSB7Ci0gICAgICBoYXNHc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXggPSBmYWxzZTsKLSAgICAgIGdzbVVtdHNTdWJzY3JpcHRpb25BcHBJbmRleF8gPSAwOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIGNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0RNQV9TVUJTQ1JJUFRJT05fQVBQX0lOREVYX0ZJRUxEX05VTUJFUiA9IDQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0NkbWFTdWJzY3JpcHRpb25BcHBJbmRleDsKLSAgICBwcml2YXRlIGludCBjZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXhfID0gMDsKLSAgICBwdWJsaWMgaW50IGdldENkbWFTdWJzY3JpcHRpb25BcHBJbmRleCgpIHsgcmV0dXJuIGNkbWFTdWJzY3JpcHRpb25BcHBJbmRleF87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXgoKSB7IHJldHVybiBoYXNDZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXg7IH0KLSAgICBwdWJsaWMgUmlsQ2FyZFN0YXR1cyBzZXRDZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXgoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNDZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXggPSB0cnVlOwotICAgICAgY2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4XyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYXJkU3RhdHVzIGNsZWFyQ2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4KCkgewotICAgICAgaGFzQ2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4ID0gZmFsc2U7Ci0gICAgICBjZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXhfID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1fYXBwbGljYXRpb25zID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fQVBQTElDQVRJT05TX0ZJRUxEX05VTUJFUiA9IDU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc051bUFwcGxpY2F0aW9uczsKLSAgICBwcml2YXRlIGludCBudW1BcHBsaWNhdGlvbnNfID0gMDsKLSAgICBwdWJsaWMgaW50IGdldE51bUFwcGxpY2F0aW9ucygpIHsgcmV0dXJuIG51bUFwcGxpY2F0aW9uc187IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOdW1BcHBsaWNhdGlvbnMoKSB7IHJldHVybiBoYXNOdW1BcHBsaWNhdGlvbnM7IH0KLSAgICBwdWJsaWMgUmlsQ2FyZFN0YXR1cyBzZXROdW1BcHBsaWNhdGlvbnMoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNOdW1BcHBsaWNhdGlvbnMgPSB0cnVlOwotICAgICAgbnVtQXBwbGljYXRpb25zXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYXJkU3RhdHVzIGNsZWFyTnVtQXBwbGljYXRpb25zKCkgewotICAgICAgaGFzTnVtQXBwbGljYXRpb25zID0gZmFsc2U7Ci0gICAgICBudW1BcHBsaWNhdGlvbnNfID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyByZXBlYXRlZCAucmlsX3Byb3RvLlJpbEFwcFN0YXR1cyBhcHBsaWNhdGlvbnMgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OU19GSUVMRF9OVU1CRVIgPSA2OwotICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8Y29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbEFwcFN0YXR1cz4gYXBwbGljYXRpb25zXyA9Ci0gICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgcHVibGljIGphdmEudXRpbC5MaXN0PGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxBcHBTdGF0dXM+IGdldEFwcGxpY2F0aW9uc0xpc3QoKSB7Ci0gICAgICByZXR1cm4gYXBwbGljYXRpb25zXzsKLSAgICB9Ci0gICAgcHVibGljIGludCBnZXRBcHBsaWNhdGlvbnNDb3VudCgpIHsgcmV0dXJuIGFwcGxpY2F0aW9uc18uc2l6ZSgpOyB9Ci0gICAgcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxBcHBTdGF0dXMgZ2V0QXBwbGljYXRpb25zKGludCBpbmRleCkgewotICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uc18uZ2V0KGluZGV4KTsKLSAgICB9Ci0gICAgcHVibGljIFJpbENhcmRTdGF0dXMgc2V0QXBwbGljYXRpb25zKGludCBpbmRleCwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbEFwcFN0YXR1cyB2YWx1ZSkgewotICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBhcHBsaWNhdGlvbnNfLnNldChpbmRleCwgdmFsdWUpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYXJkU3RhdHVzIGFkZEFwcGxpY2F0aW9ucyhjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsQXBwU3RhdHVzIHZhbHVlKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGlmIChhcHBsaWNhdGlvbnNfLmlzRW1wdHkoKSkgewotICAgICAgICBhcHBsaWNhdGlvbnNfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8Y29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbEFwcFN0YXR1cz4oKTsKLSAgICAgIH0KLSAgICAgIGFwcGxpY2F0aW9uc18uYWRkKHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmlsQ2FyZFN0YXR1cyBjbGVhckFwcGxpY2F0aW9ucygpIHsKLSAgICAgIGFwcGxpY2F0aW9uc18gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJpbENhcmRTdGF0dXMgY2xlYXIoKSB7Ci0gICAgICBjbGVhckNhcmRTdGF0ZSgpOwotICAgICAgY2xlYXJVbml2ZXJzYWxQaW5TdGF0ZSgpOwotICAgICAgY2xlYXJHc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXgoKTsKLSAgICAgIGNsZWFyQ2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4KCk7Ci0gICAgICBjbGVhck51bUFwcGxpY2F0aW9ucygpOwotICAgICAgY2xlYXJBcHBsaWNhdGlvbnMoKTsKLSAgICAgIGNhY2hlZFNpemUgPSAtMTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChoYXNDYXJkU3RhdGUoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigxLCBnZXRDYXJkU3RhdGUoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzVW5pdmVyc2FsUGluU3RhdGUoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigyLCBnZXRVbml2ZXJzYWxQaW5TdGF0ZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNHc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXgoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigzLCBnZXRHc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXgoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQ2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4KCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoNCwgZ2V0Q2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4KCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc051bUFwcGxpY2F0aW9ucygpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDUsIGdldE51bUFwcGxpY2F0aW9ucygpKTsKLSAgICAgIH0KLSAgICAgIGZvciAoY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbEFwcFN0YXR1cyBlbGVtZW50IDogZ2V0QXBwbGljYXRpb25zTGlzdCgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZU1lc3NhZ2UoNiwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNhY2hlZFNpemUgPSAtMTsKLSAgICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgICBpZiAoY2FjaGVkU2l6ZSA8IDApIHsKLSAgICAgICAgLy8gZ2V0U2VyaWFsaXplZFNpemUgc2V0cyBjYWNoZWRTaXplCi0gICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2FjaGVkU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChoYXNDYXJkU3RhdGUoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlSW50MzJTaXplKDEsIGdldENhcmRTdGF0ZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNVbml2ZXJzYWxQaW5TdGF0ZSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMiwgZ2V0VW5pdmVyc2FsUGluU3RhdGUoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzR3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4KCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgzLCBnZXRHc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXgoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQ2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4KCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSg0LCBnZXRDZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXgoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzTnVtQXBwbGljYXRpb25zKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSg1LCBnZXROdW1BcHBsaWNhdGlvbnMoKSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxBcHBTdGF0dXMgZWxlbWVudCA6IGdldEFwcGxpY2F0aW9uc0xpc3QoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlTWVzc2FnZVNpemUoNiwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmlsQ2FyZFN0YXR1cyBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICAgIHNldENhcmRTdGF0ZShpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgICBzZXRVbml2ZXJzYWxQaW5TdGF0ZShpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNDogewotICAgICAgICAgICAgc2V0R3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4KGlucHV0LnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMyOiB7Ci0gICAgICAgICAgICBzZXRDZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXgoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDA6IHsKLSAgICAgICAgICAgIHNldE51bUFwcGxpY2F0aW9ucyhpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1MDogewotICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbEFwcFN0YXR1cyB2YWx1ZSA9IG5ldyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsQXBwU3RhdHVzKCk7Ci0gICAgICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZSh2YWx1ZSk7Ci0gICAgICAgICAgICBhZGRBcHBsaWNhdGlvbnModmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUmlsQ2FyZFN0YXR1cyBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUmlsQ2FyZFN0YXR1cykgKG5ldyBSaWxDYXJkU3RhdHVzKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSaWxDYXJkU3RhdHVzIHBhcnNlRnJvbSgKLSAgICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJpbENhcmRTdGF0dXMpIChuZXcgUmlsQ2FyZFN0YXR1cygpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSaWxVdXNJbmZvIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgICBwdWJsaWMgUmlsVXVzSW5mbygpIHt9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SaWxVdXNUeXBlIHV1c190eXBlID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVVVNfVFlQRV9GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNVdXNUeXBlOwotICAgIHByaXZhdGUgaW50IHV1c1R5cGVfID0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJJTFVVU1RZUEUxX0lNUExJQ0lUOwotICAgIHB1YmxpYyBib29sZWFuIGhhc1V1c1R5cGUoKSB7IHJldHVybiBoYXNVdXNUeXBlOyB9Ci0gICAgcHVibGljIGludCBnZXRVdXNUeXBlKCkgeyByZXR1cm4gdXVzVHlwZV87IH0KLSAgICBwdWJsaWMgUmlsVXVzSW5mbyBzZXRVdXNUeXBlKGludCB2YWx1ZSkgewotICAgICAgaGFzVXVzVHlwZSA9IHRydWU7Ci0gICAgICB1dXNUeXBlXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxVdXNJbmZvIGNsZWFyVXVzVHlwZSgpIHsKLSAgICAgIGhhc1V1c1R5cGUgPSBmYWxzZTsKLSAgICAgIHV1c1R5cGVfID0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJJTFVVU1RZUEUxX0lNUExJQ0lUOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsVXVzRGNzIHV1c19kY3MgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVVU19EQ1NfRklFTERfTlVNQkVSID0gMjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVXVzRGNzOwotICAgIHByaXZhdGUgaW50IHV1c0Rjc18gPSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUklMVVVTRENTX1VTUDsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVdXNEY3MoKSB7IHJldHVybiBoYXNVdXNEY3M7IH0KLSAgICBwdWJsaWMgaW50IGdldFV1c0RjcygpIHsgcmV0dXJuIHV1c0Rjc187IH0KLSAgICBwdWJsaWMgUmlsVXVzSW5mbyBzZXRVdXNEY3MoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNVdXNEY3MgPSB0cnVlOwotICAgICAgdXVzRGNzXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxVdXNJbmZvIGNsZWFyVXVzRGNzKCkgewotICAgICAgaGFzVXVzRGNzID0gZmFsc2U7Ci0gICAgICB1dXNEY3NfID0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJJTFVVU0RDU19VU1A7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgdXVzX2xlbmd0aCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVVTX0xFTkdUSF9GSUVMRF9OVU1CRVIgPSAzOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNVdXNMZW5ndGg7Ci0gICAgcHJpdmF0ZSBpbnQgdXVzTGVuZ3RoXyA9IDA7Ci0gICAgcHVibGljIGludCBnZXRVdXNMZW5ndGgoKSB7IHJldHVybiB1dXNMZW5ndGhfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzVXVzTGVuZ3RoKCkgeyByZXR1cm4gaGFzVXVzTGVuZ3RoOyB9Ci0gICAgcHVibGljIFJpbFV1c0luZm8gc2V0VXVzTGVuZ3RoKGludCB2YWx1ZSkgewotICAgICAgaGFzVXVzTGVuZ3RoID0gdHJ1ZTsKLSAgICAgIHV1c0xlbmd0aF8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmlsVXVzSW5mbyBjbGVhclV1c0xlbmd0aCgpIHsKLSAgICAgIGhhc1V1c0xlbmd0aCA9IGZhbHNlOwotICAgICAgdXVzTGVuZ3RoXyA9IDA7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIHV1c19kYXRhID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVVVNfREFUQV9GSUVMRF9OVU1CRVIgPSA0OwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNVdXNEYXRhOwotICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB1dXNEYXRhXyA9ICIiOwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFV1c0RhdGEoKSB7IHJldHVybiB1dXNEYXRhXzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc1V1c0RhdGEoKSB7IHJldHVybiBoYXNVdXNEYXRhOyB9Ci0gICAgcHVibGljIFJpbFV1c0luZm8gc2V0VXVzRGF0YShqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICBoYXNVdXNEYXRhID0gdHJ1ZTsKLSAgICAgIHV1c0RhdGFfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJpbFV1c0luZm8gY2xlYXJVdXNEYXRhKCkgewotICAgICAgaGFzVXVzRGF0YSA9IGZhbHNlOwotICAgICAgdXVzRGF0YV8gPSAiIjsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgUmlsVXVzSW5mbyBjbGVhcigpIHsKLSAgICAgIGNsZWFyVXVzVHlwZSgpOwotICAgICAgY2xlYXJVdXNEY3MoKTsKLSAgICAgIGNsZWFyVXVzTGVuZ3RoKCk7Ci0gICAgICBjbGVhclV1c0RhdGEoKTsKLSAgICAgIGNhY2hlZFNpemUgPSAtMTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChoYXNVdXNUeXBlKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMSwgZ2V0VXVzVHlwZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNVdXNEY3MoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigyLCBnZXRVdXNEY3MoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzVXVzTGVuZ3RoKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMywgZ2V0VXVzTGVuZ3RoKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc1V1c0RhdGEoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcoNCwgZ2V0VXVzRGF0YSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVkU2l6ZSgpIHsKLSAgICAgIGlmIChjYWNoZWRTaXplIDwgMCkgewotICAgICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgICAgZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjYWNoZWRTaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGhhc1V1c1R5cGUoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlSW50MzJTaXplKDEsIGdldFV1c1R5cGUoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzVXVzRGNzKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgyLCBnZXRVdXNEY3MoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzVXVzTGVuZ3RoKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgzLCBnZXRVdXNMZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzVXVzRGF0YSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVTdHJpbmdTaXplKDQsIGdldFV1c0RhdGEoKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmlsVXVzSW5mbyBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICAgIHNldFV1c1R5cGUoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgICAgc2V0VXVzRGNzKGlucHV0LnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI0OiB7Ci0gICAgICAgICAgICBzZXRVdXNMZW5ndGgoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzQ6IHsKLSAgICAgICAgICAgIHNldFV1c0RhdGEoaW5wdXQucmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJpbFV1c0luZm8gcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJpbFV1c0luZm8pIChuZXcgUmlsVXVzSW5mbygpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUmlsVXVzSW5mbyBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSaWxVdXNJbmZvKSAobmV3IFJpbFV1c0luZm8oKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmlsQ2FsbCBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIFJpbENhbGwoKSB7fQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUmlsQ2FsbFN0YXRlIHN0YXRlID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNTdGF0ZTsKLSAgICBwcml2YXRlIGludCBzdGF0ZV8gPSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuQ0FMTFNUQVRFX0FDVElWRTsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGF0ZSgpIHsgcmV0dXJuIGhhc1N0YXRlOyB9Ci0gICAgcHVibGljIGludCBnZXRTdGF0ZSgpIHsgcmV0dXJuIHN0YXRlXzsgfQotICAgIHB1YmxpYyBSaWxDYWxsIHNldFN0YXRlKGludCB2YWx1ZSkgewotICAgICAgaGFzU3RhdGUgPSB0cnVlOwotICAgICAgc3RhdGVfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJpbENhbGwgY2xlYXJTdGF0ZSgpIHsKLSAgICAgIGhhc1N0YXRlID0gZmFsc2U7Ci0gICAgICBzdGF0ZV8gPSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuQ0FMTFNUQVRFX0FDVElWRTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBpbmRleCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfRklFTERfTlVNQkVSID0gMjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgaW5kZXhfID0gMDsKLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXhfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzSW5kZXgoKSB7IHJldHVybiBoYXNJbmRleDsgfQotICAgIHB1YmxpYyBSaWxDYWxsIHNldEluZGV4KGludCB2YWx1ZSkgewotICAgICAgaGFzSW5kZXggPSB0cnVlOwotICAgICAgaW5kZXhfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJpbENhbGwgY2xlYXJJbmRleCgpIHsKLSAgICAgIGhhc0luZGV4ID0gZmFsc2U7Ci0gICAgICBpbmRleF8gPSAwOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIHRvYSA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9BX0ZJRUxEX05VTUJFUiA9IDM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1RvYTsKLSAgICBwcml2YXRlIGludCB0b2FfID0gMDsKLSAgICBwdWJsaWMgaW50IGdldFRvYSgpIHsgcmV0dXJuIHRvYV87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUb2EoKSB7IHJldHVybiBoYXNUb2E7IH0KLSAgICBwdWJsaWMgUmlsQ2FsbCBzZXRUb2EoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNUb2EgPSB0cnVlOwotICAgICAgdG9hXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYWxsIGNsZWFyVG9hKCkgewotICAgICAgaGFzVG9hID0gZmFsc2U7Ci0gICAgICB0b2FfID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBib29sIGlzX21wdHkgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX01QVFlfRklFTERfTlVNQkVSID0gNDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzSXNNcHR5OwotICAgIHByaXZhdGUgYm9vbGVhbiBpc01wdHlfID0gZmFsc2U7Ci0gICAgcHVibGljIGJvb2xlYW4gZ2V0SXNNcHR5KCkgeyByZXR1cm4gaXNNcHR5XzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc0lzTXB0eSgpIHsgcmV0dXJuIGhhc0lzTXB0eTsgfQotICAgIHB1YmxpYyBSaWxDYWxsIHNldElzTXB0eShib29sZWFuIHZhbHVlKSB7Ci0gICAgICBoYXNJc01wdHkgPSB0cnVlOwotICAgICAgaXNNcHR5XyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYWxsIGNsZWFySXNNcHR5KCkgewotICAgICAgaGFzSXNNcHR5ID0gZmFsc2U7Ci0gICAgICBpc01wdHlfID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgYm9vbCBpc19tdCA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNfTVRfRklFTERfTlVNQkVSID0gNTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzSXNNdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNdF8gPSBmYWxzZTsKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRJc010KCkgeyByZXR1cm4gaXNNdF87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNJc010KCkgeyByZXR1cm4gaGFzSXNNdDsgfQotICAgIHB1YmxpYyBSaWxDYWxsIHNldElzTXQoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgaGFzSXNNdCA9IHRydWU7Ci0gICAgICBpc010XyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYWxsIGNsZWFySXNNdCgpIHsKLSAgICAgIGhhc0lzTXQgPSBmYWxzZTsKLSAgICAgIGlzTXRfID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgYWxzID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTFNfRklFTERfTlVNQkVSID0gNjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQWxzOwotICAgIHByaXZhdGUgaW50IGFsc18gPSAwOwotICAgIHB1YmxpYyBpbnQgZ2V0QWxzKCkgeyByZXR1cm4gYWxzXzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc0FscygpIHsgcmV0dXJuIGhhc0FsczsgfQotICAgIHB1YmxpYyBSaWxDYWxsIHNldEFscyhpbnQgdmFsdWUpIHsKLSAgICAgIGhhc0FscyA9IHRydWU7Ci0gICAgICBhbHNfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJpbENhbGwgY2xlYXJBbHMoKSB7Ci0gICAgICBoYXNBbHMgPSBmYWxzZTsKLSAgICAgIGFsc18gPSAwOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGJvb2wgaXNfdm9pY2UgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX1ZPSUNFX0ZJRUxEX05VTUJFUiA9IDc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0lzVm9pY2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzVm9pY2VfID0gZmFsc2U7Ci0gICAgcHVibGljIGJvb2xlYW4gZ2V0SXNWb2ljZSgpIHsgcmV0dXJuIGlzVm9pY2VfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzSXNWb2ljZSgpIHsgcmV0dXJuIGhhc0lzVm9pY2U7IH0KLSAgICBwdWJsaWMgUmlsQ2FsbCBzZXRJc1ZvaWNlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgIGhhc0lzVm9pY2UgPSB0cnVlOwotICAgICAgaXNWb2ljZV8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmlsQ2FsbCBjbGVhcklzVm9pY2UoKSB7Ci0gICAgICBoYXNJc1ZvaWNlID0gZmFsc2U7Ci0gICAgICBpc1ZvaWNlXyA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGJvb2wgaXNfdm9pY2VfcHJpdmFjeSA9IDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNfVk9JQ0VfUFJJVkFDWV9GSUVMRF9OVU1CRVIgPSA4OwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNJc1ZvaWNlUHJpdmFjeTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWb2ljZVByaXZhY3lfID0gZmFsc2U7Ci0gICAgcHVibGljIGJvb2xlYW4gZ2V0SXNWb2ljZVByaXZhY3koKSB7IHJldHVybiBpc1ZvaWNlUHJpdmFjeV87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNJc1ZvaWNlUHJpdmFjeSgpIHsgcmV0dXJuIGhhc0lzVm9pY2VQcml2YWN5OyB9Ci0gICAgcHVibGljIFJpbENhbGwgc2V0SXNWb2ljZVByaXZhY3koYm9vbGVhbiB2YWx1ZSkgewotICAgICAgaGFzSXNWb2ljZVByaXZhY3kgPSB0cnVlOwotICAgICAgaXNWb2ljZVByaXZhY3lfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJpbENhbGwgY2xlYXJJc1ZvaWNlUHJpdmFjeSgpIHsKLSAgICAgIGhhc0lzVm9pY2VQcml2YWN5ID0gZmFsc2U7Ci0gICAgICBpc1ZvaWNlUHJpdmFjeV8gPSBmYWxzZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgbnVtYmVyID0gOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfRklFTERfTlVNQkVSID0gOTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzTnVtYmVyOwotICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBudW1iZXJfID0gIiI7Ci0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TnVtYmVyKCkgeyByZXR1cm4gbnVtYmVyXzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc051bWJlcigpIHsgcmV0dXJuIGhhc051bWJlcjsgfQotICAgIHB1YmxpYyBSaWxDYWxsIHNldE51bWJlcihqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICBoYXNOdW1iZXIgPSB0cnVlOwotICAgICAgbnVtYmVyXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYWxsIGNsZWFyTnVtYmVyKCkgewotICAgICAgaGFzTnVtYmVyID0gZmFsc2U7Ci0gICAgICBudW1iZXJfID0gIiI7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyX3ByZXNlbnRhdGlvbiA9IDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9QUkVTRU5UQVRJT05fRklFTERfTlVNQkVSID0gMTA7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc051bWJlclByZXNlbnRhdGlvbjsKLSAgICBwcml2YXRlIGludCBudW1iZXJQcmVzZW50YXRpb25fID0gMDsKLSAgICBwdWJsaWMgaW50IGdldE51bWJlclByZXNlbnRhdGlvbigpIHsgcmV0dXJuIG51bWJlclByZXNlbnRhdGlvbl87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOdW1iZXJQcmVzZW50YXRpb24oKSB7IHJldHVybiBoYXNOdW1iZXJQcmVzZW50YXRpb247IH0KLSAgICBwdWJsaWMgUmlsQ2FsbCBzZXROdW1iZXJQcmVzZW50YXRpb24oaW50IHZhbHVlKSB7Ci0gICAgICBoYXNOdW1iZXJQcmVzZW50YXRpb24gPSB0cnVlOwotICAgICAgbnVtYmVyUHJlc2VudGF0aW9uXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYWxsIGNsZWFyTnVtYmVyUHJlc2VudGF0aW9uKCkgewotICAgICAgaGFzTnVtYmVyUHJlc2VudGF0aW9uID0gZmFsc2U7Ci0gICAgICBudW1iZXJQcmVzZW50YXRpb25fID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfRklFTERfTlVNQkVSID0gMTE7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc05hbWU7Ci0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5hbWVfID0gIiI7Ci0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIG5hbWVfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsgcmV0dXJuIGhhc05hbWU7IH0KLSAgICBwdWJsaWMgUmlsQ2FsbCBzZXROYW1lKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgIGhhc05hbWUgPSB0cnVlOwotICAgICAgbmFtZV8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmlsQ2FsbCBjbGVhck5hbWUoKSB7Ci0gICAgICBoYXNOYW1lID0gZmFsc2U7Ci0gICAgICBuYW1lXyA9ICIiOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIG5hbWVfcHJlc2VudGF0aW9uID0gMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9QUkVTRU5UQVRJT05fRklFTERfTlVNQkVSID0gMTI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc05hbWVQcmVzZW50YXRpb247Ci0gICAgcHJpdmF0ZSBpbnQgbmFtZVByZXNlbnRhdGlvbl8gPSAwOwotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZVByZXNlbnRhdGlvbigpIHsgcmV0dXJuIG5hbWVQcmVzZW50YXRpb25fOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZVByZXNlbnRhdGlvbigpIHsgcmV0dXJuIGhhc05hbWVQcmVzZW50YXRpb247IH0KLSAgICBwdWJsaWMgUmlsQ2FsbCBzZXROYW1lUHJlc2VudGF0aW9uKGludCB2YWx1ZSkgewotICAgICAgaGFzTmFtZVByZXNlbnRhdGlvbiA9IHRydWU7Ci0gICAgICBuYW1lUHJlc2VudGF0aW9uXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSaWxDYWxsIGNsZWFyTmFtZVByZXNlbnRhdGlvbigpIHsKLSAgICAgIGhhc05hbWVQcmVzZW50YXRpb24gPSBmYWxzZTsKLSAgICAgIG5hbWVQcmVzZW50YXRpb25fID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFV1c0luZm8gdXVzX2luZm8gPSAxMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVVVNfSU5GT19GSUVMRF9OVU1CRVIgPSAxMzsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVXVzSW5mbzsKLSAgICBwcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxVdXNJbmZvIHV1c0luZm9fID0gbnVsbDsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVdXNJbmZvKCkgeyByZXR1cm4gaGFzVXVzSW5mbzsgfQotICAgIHB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsVXVzSW5mbyBnZXRVdXNJbmZvKCkgeyByZXR1cm4gdXVzSW5mb187IH0KLSAgICBwdWJsaWMgUmlsQ2FsbCBzZXRVdXNJbmZvKGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxVdXNJbmZvIHZhbHVlKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGhhc1V1c0luZm8gPSB0cnVlOwotICAgICAgdXVzSW5mb18gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmlsQ2FsbCBjbGVhclV1c0luZm8oKSB7Ci0gICAgICBoYXNVdXNJbmZvID0gZmFsc2U7Ci0gICAgICB1dXNJbmZvXyA9IG51bGw7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJpbENhbGwgY2xlYXIoKSB7Ci0gICAgICBjbGVhclN0YXRlKCk7Ci0gICAgICBjbGVhckluZGV4KCk7Ci0gICAgICBjbGVhclRvYSgpOwotICAgICAgY2xlYXJJc01wdHkoKTsKLSAgICAgIGNsZWFySXNNdCgpOwotICAgICAgY2xlYXJBbHMoKTsKLSAgICAgIGNsZWFySXNWb2ljZSgpOwotICAgICAgY2xlYXJJc1ZvaWNlUHJpdmFjeSgpOwotICAgICAgY2xlYXJOdW1iZXIoKTsKLSAgICAgIGNsZWFyTnVtYmVyUHJlc2VudGF0aW9uKCk7Ci0gICAgICBjbGVhck5hbWUoKTsKLSAgICAgIGNsZWFyTmFtZVByZXNlbnRhdGlvbigpOwotICAgICAgY2xlYXJVdXNJbmZvKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzU3RhdGUoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigxLCBnZXRTdGF0ZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNJbmRleCgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDIsIGdldEluZGV4KCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc1RvYSgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDMsIGdldFRvYSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNJc01wdHkoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVCb29sKDQsIGdldElzTXB0eSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNJc010KCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlQm9vbCg1LCBnZXRJc010KCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0FscygpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDYsIGdldEFscygpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNJc1ZvaWNlKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlQm9vbCg3LCBnZXRJc1ZvaWNlKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0lzVm9pY2VQcml2YWN5KCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlQm9vbCg4LCBnZXRJc1ZvaWNlUHJpdmFjeSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNOdW1iZXIoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcoOSwgZ2V0TnVtYmVyKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc051bWJlclByZXNlbnRhdGlvbigpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDEwLCBnZXROdW1iZXJQcmVzZW50YXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzTmFtZSgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZVN0cmluZygxMSwgZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNOYW1lUHJlc2VudGF0aW9uKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMTIsIGdldE5hbWVQcmVzZW50YXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzVXVzSW5mbygpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZU1lc3NhZ2UoMTMsIGdldFV1c0luZm8oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNhY2hlZFNpemUgPSAtMTsKLSAgICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgICBpZiAoY2FjaGVkU2l6ZSA8IDApIHsKLSAgICAgICAgLy8gZ2V0U2VyaWFsaXplZFNpemUgc2V0cyBjYWNoZWRTaXplCi0gICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2FjaGVkU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChoYXNTdGF0ZSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMSwgZ2V0U3RhdGUoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzSW5kZXgoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlSW50MzJTaXplKDIsIGdldEluZGV4KCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc1RvYSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMywgZ2V0VG9hKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0lzTXB0eSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVCb29sU2l6ZSg0LCBnZXRJc01wdHkoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzSXNNdCgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVCb29sU2l6ZSg1LCBnZXRJc010KCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0FscygpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoNiwgZ2V0QWxzKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0lzVm9pY2UoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlQm9vbFNpemUoNywgZ2V0SXNWb2ljZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNJc1ZvaWNlUHJpdmFjeSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVCb29sU2l6ZSg4LCBnZXRJc1ZvaWNlUHJpdmFjeSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNOdW1iZXIoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlU3RyaW5nU2l6ZSg5LCBnZXROdW1iZXIoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzTnVtYmVyUHJlc2VudGF0aW9uKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgxMCwgZ2V0TnVtYmVyUHJlc2VudGF0aW9uKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc05hbWUoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlU3RyaW5nU2l6ZSgxMSwgZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNOYW1lUHJlc2VudGF0aW9uKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgxMiwgZ2V0TmFtZVByZXNlbnRhdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNVdXNJbmZvKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZU1lc3NhZ2VTaXplKDEzLCBnZXRVdXNJbmZvKCkpOwotICAgICAgfQotICAgICAgY2FjaGVkU2l6ZSA9IHNpemU7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFJpbENhbGwgbWVyZ2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB0YWcpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgICBzZXRTdGF0ZShpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgc2V0SW5kZXgoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjQ6IHsKLSAgICAgICAgICAgIHNldFRvYShpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMjogewotICAgICAgICAgICAgc2V0SXNNcHR5KGlucHV0LnJlYWRCb29sKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDA6IHsKLSAgICAgICAgICAgIHNldElzTXQoaW5wdXQucmVhZEJvb2woKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0ODogewotICAgICAgICAgICAgc2V0QWxzKGlucHV0LnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDU2OiB7Ci0gICAgICAgICAgICBzZXRJc1ZvaWNlKGlucHV0LnJlYWRCb29sKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNjQ6IHsKLSAgICAgICAgICAgIHNldElzVm9pY2VQcml2YWN5KGlucHV0LnJlYWRCb29sKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNzQ6IHsKLSAgICAgICAgICAgIHNldE51bWJlcihpbnB1dC5yZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODA6IHsKLSAgICAgICAgICAgIHNldE51bWJlclByZXNlbnRhdGlvbihpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MDogewotICAgICAgICAgICAgc2V0TmFtZShpbnB1dC5yZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgOTY6IHsKLSAgICAgICAgICAgIHNldE5hbWVQcmVzZW50YXRpb24oaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTA2OiB7Ci0gICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsVXVzSW5mbyB2YWx1ZSA9IG5ldyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsVXVzSW5mbygpOwotICAgICAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2UodmFsdWUpOwotICAgICAgICAgICAgc2V0VXVzSW5mbyh2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSaWxDYWxsIHBhcnNlRnJvbShieXRlW10gZGF0YSkKLSAgICAgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSaWxDYWxsKSAobmV3IFJpbENhbGwoKS5tZXJnZUZyb20oZGF0YSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJpbENhbGwgcGFyc2VGcm9tKAotICAgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUmlsQ2FsbCkgKG5ldyBSaWxDYWxsKCkubWVyZ2VGcm9tKGlucHV0KSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJJTEdXU2lnbmFsU3RyZW5ndGggZXh0ZW5kcwotICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5NZXNzYWdlTWljcm8gewotICAgIHB1YmxpYyBSSUxHV1NpZ25hbFN0cmVuZ3RoKCkge30KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBzaWduYWxfc3RyZW5ndGggPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR05BTF9TVFJFTkdUSF9GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNTaWduYWxTdHJlbmd0aDsKLSAgICBwcml2YXRlIGludCBzaWduYWxTdHJlbmd0aF8gPSAwOwotICAgIHB1YmxpYyBpbnQgZ2V0U2lnbmFsU3RyZW5ndGgoKSB7IHJldHVybiBzaWduYWxTdHJlbmd0aF87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTaWduYWxTdHJlbmd0aCgpIHsgcmV0dXJuIGhhc1NpZ25hbFN0cmVuZ3RoOyB9Ci0gICAgcHVibGljIFJJTEdXU2lnbmFsU3RyZW5ndGggc2V0U2lnbmFsU3RyZW5ndGgoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNTaWduYWxTdHJlbmd0aCA9IHRydWU7Ci0gICAgICBzaWduYWxTdHJlbmd0aF8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUklMR1dTaWduYWxTdHJlbmd0aCBjbGVhclNpZ25hbFN0cmVuZ3RoKCkgewotICAgICAgaGFzU2lnbmFsU3RyZW5ndGggPSBmYWxzZTsKLSAgICAgIHNpZ25hbFN0cmVuZ3RoXyA9IDA7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgYml0X2Vycm9yX3JhdGUgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVF9FUlJPUl9SQVRFX0ZJRUxEX05VTUJFUiA9IDI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0JpdEVycm9yUmF0ZTsKLSAgICBwcml2YXRlIGludCBiaXRFcnJvclJhdGVfID0gMDsKLSAgICBwdWJsaWMgaW50IGdldEJpdEVycm9yUmF0ZSgpIHsgcmV0dXJuIGJpdEVycm9yUmF0ZV87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNCaXRFcnJvclJhdGUoKSB7IHJldHVybiBoYXNCaXRFcnJvclJhdGU7IH0KLSAgICBwdWJsaWMgUklMR1dTaWduYWxTdHJlbmd0aCBzZXRCaXRFcnJvclJhdGUoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNCaXRFcnJvclJhdGUgPSB0cnVlOwotICAgICAgYml0RXJyb3JSYXRlXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSSUxHV1NpZ25hbFN0cmVuZ3RoIGNsZWFyQml0RXJyb3JSYXRlKCkgewotICAgICAgaGFzQml0RXJyb3JSYXRlID0gZmFsc2U7Ci0gICAgICBiaXRFcnJvclJhdGVfID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgUklMR1dTaWduYWxTdHJlbmd0aCBjbGVhcigpIHsKLSAgICAgIGNsZWFyU2lnbmFsU3RyZW5ndGgoKTsKLSAgICAgIGNsZWFyQml0RXJyb3JSYXRlKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzU2lnbmFsU3RyZW5ndGgoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigxLCBnZXRTaWduYWxTdHJlbmd0aCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNCaXRFcnJvclJhdGUoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigyLCBnZXRCaXRFcnJvclJhdGUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNhY2hlZFNpemUgPSAtMTsKLSAgICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgICBpZiAoY2FjaGVkU2l6ZSA8IDApIHsKLSAgICAgICAgLy8gZ2V0U2VyaWFsaXplZFNpemUgc2V0cyBjYWNoZWRTaXplCi0gICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2FjaGVkU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChoYXNTaWduYWxTdHJlbmd0aCgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMSwgZ2V0U2lnbmFsU3RyZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQml0RXJyb3JSYXRlKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgyLCBnZXRCaXRFcnJvclJhdGUoKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUklMR1dTaWduYWxTdHJlbmd0aCBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBzZXRTaWduYWxTdHJlbmd0aChpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgc2V0Qml0RXJyb3JSYXRlKGlucHV0LnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJJTEdXU2lnbmFsU3RyZW5ndGggcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJJTEdXU2lnbmFsU3RyZW5ndGgpIChuZXcgUklMR1dTaWduYWxTdHJlbmd0aCgpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUklMR1dTaWduYWxTdHJlbmd0aCBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSSUxHV1NpZ25hbFN0cmVuZ3RoKSAobmV3IFJJTEdXU2lnbmFsU3RyZW5ndGgoKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgICBwdWJsaWMgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoKCkge30KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBkYm0gPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERCTV9GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEYm07Ci0gICAgcHJpdmF0ZSBpbnQgZGJtXyA9IDA7Ci0gICAgcHVibGljIGludCBnZXREYm0oKSB7IHJldHVybiBkYm1fOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzRGJtKCkgeyByZXR1cm4gaGFzRGJtOyB9Ci0gICAgcHVibGljIFJJTENETUFTaWduYWxTdHJlbmd0aCBzZXREYm0oaW50IHZhbHVlKSB7Ci0gICAgICBoYXNEYm0gPSB0cnVlOwotICAgICAgZGJtXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSSUxDRE1BU2lnbmFsU3RyZW5ndGggY2xlYXJEYm0oKSB7Ci0gICAgICBoYXNEYm0gPSBmYWxzZTsKLSAgICAgIGRibV8gPSAwOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIGVjaW8gPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVDSU9fRklFTERfTlVNQkVSID0gMjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRWNpbzsKLSAgICBwcml2YXRlIGludCBlY2lvXyA9IDA7Ci0gICAgcHVibGljIGludCBnZXRFY2lvKCkgeyByZXR1cm4gZWNpb187IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFY2lvKCkgeyByZXR1cm4gaGFzRWNpbzsgfQotICAgIHB1YmxpYyBSSUxDRE1BU2lnbmFsU3RyZW5ndGggc2V0RWNpbyhpbnQgdmFsdWUpIHsKLSAgICAgIGhhc0VjaW8gPSB0cnVlOwotICAgICAgZWNpb18gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIGNsZWFyRWNpbygpIHsKLSAgICAgIGhhc0VjaW8gPSBmYWxzZTsKLSAgICAgIGVjaW9fID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIGNsZWFyKCkgewotICAgICAgY2xlYXJEYm0oKTsKLSAgICAgIGNsZWFyRWNpbygpOwotICAgICAgY2FjaGVkU2l6ZSA9IC0xOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgaWYgKGhhc0RibSgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDEsIGdldERibSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNFY2lvKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMiwgZ2V0RWNpbygpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVkU2l6ZSgpIHsKLSAgICAgIGlmIChjYWNoZWRTaXplIDwgMCkgewotICAgICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgICAgZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjYWNoZWRTaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGhhc0RibSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMSwgZ2V0RGJtKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0VjaW8oKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlSW50MzJTaXplKDIsIGdldEVjaW8oKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIG1lcmdlRnJvbSgKLSAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgaWYgKCFwYXJzZVVua25vd25GaWVsZChpbnB1dCwgdGFnKSkgewotICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIHNldERibShpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgc2V0RWNpbyhpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSSUxDRE1BU2lnbmFsU3RyZW5ndGggcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJJTENETUFTaWduYWxTdHJlbmd0aCkgKG5ldyBSSUxDRE1BU2lnbmFsU3RyZW5ndGgoKS5tZXJnZUZyb20oZGF0YSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJJTENETUFTaWduYWxTdHJlbmd0aCBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSSUxDRE1BU2lnbmFsU3RyZW5ndGgpIChuZXcgUklMQ0RNQVNpZ25hbFN0cmVuZ3RoKCkubWVyZ2VGcm9tKGlucHV0KSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJJTEVWRE9TaWduYWxTdHJlbmd0aCBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIFJJTEVWRE9TaWduYWxTdHJlbmd0aCgpIHt9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgZGJtID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQk1fRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRGJtOwotICAgIHByaXZhdGUgaW50IGRibV8gPSAwOwotICAgIHB1YmxpYyBpbnQgZ2V0RGJtKCkgeyByZXR1cm4gZGJtXzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc0RibSgpIHsgcmV0dXJuIGhhc0RibTsgfQotICAgIHB1YmxpYyBSSUxFVkRPU2lnbmFsU3RyZW5ndGggc2V0RGJtKGludCB2YWx1ZSkgewotICAgICAgaGFzRGJtID0gdHJ1ZTsKLSAgICAgIGRibV8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUklMRVZET1NpZ25hbFN0cmVuZ3RoIGNsZWFyRGJtKCkgewotICAgICAgaGFzRGJtID0gZmFsc2U7Ci0gICAgICBkYm1fID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBlY2lvID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQ0lPX0ZJRUxEX05VTUJFUiA9IDI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0VjaW87Ci0gICAgcHJpdmF0ZSBpbnQgZWNpb18gPSAwOwotICAgIHB1YmxpYyBpbnQgZ2V0RWNpbygpIHsgcmV0dXJuIGVjaW9fOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzRWNpbygpIHsgcmV0dXJuIGhhc0VjaW87IH0KLSAgICBwdWJsaWMgUklMRVZET1NpZ25hbFN0cmVuZ3RoIHNldEVjaW8oaW50IHZhbHVlKSB7Ci0gICAgICBoYXNFY2lvID0gdHJ1ZTsKLSAgICAgIGVjaW9fID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJJTEVWRE9TaWduYWxTdHJlbmd0aCBjbGVhckVjaW8oKSB7Ci0gICAgICBoYXNFY2lvID0gZmFsc2U7Ci0gICAgICBlY2lvXyA9IDA7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgc2lnbmFsX25vaXNlX3JhdGlvID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSUdOQUxfTk9JU0VfUkFUSU9fRklFTERfTlVNQkVSID0gMzsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzU2lnbmFsTm9pc2VSYXRpbzsKLSAgICBwcml2YXRlIGludCBzaWduYWxOb2lzZVJhdGlvXyA9IDA7Ci0gICAgcHVibGljIGludCBnZXRTaWduYWxOb2lzZVJhdGlvKCkgeyByZXR1cm4gc2lnbmFsTm9pc2VSYXRpb187IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTaWduYWxOb2lzZVJhdGlvKCkgeyByZXR1cm4gaGFzU2lnbmFsTm9pc2VSYXRpbzsgfQotICAgIHB1YmxpYyBSSUxFVkRPU2lnbmFsU3RyZW5ndGggc2V0U2lnbmFsTm9pc2VSYXRpbyhpbnQgdmFsdWUpIHsKLSAgICAgIGhhc1NpZ25hbE5vaXNlUmF0aW8gPSB0cnVlOwotICAgICAgc2lnbmFsTm9pc2VSYXRpb18gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUklMRVZET1NpZ25hbFN0cmVuZ3RoIGNsZWFyU2lnbmFsTm9pc2VSYXRpbygpIHsKLSAgICAgIGhhc1NpZ25hbE5vaXNlUmF0aW8gPSBmYWxzZTsKLSAgICAgIHNpZ25hbE5vaXNlUmF0aW9fID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgUklMRVZET1NpZ25hbFN0cmVuZ3RoIGNsZWFyKCkgewotICAgICAgY2xlYXJEYm0oKTsKLSAgICAgIGNsZWFyRWNpbygpOwotICAgICAgY2xlYXJTaWduYWxOb2lzZVJhdGlvKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzRGJtKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMSwgZ2V0RGJtKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0VjaW8oKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigyLCBnZXRFY2lvKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc1NpZ25hbE5vaXNlUmF0aW8oKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigzLCBnZXRTaWduYWxOb2lzZVJhdGlvKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoaGFzRGJtKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgxLCBnZXREYm0oKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzRWNpbygpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMiwgZ2V0RWNpbygpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNTaWduYWxOb2lzZVJhdGlvKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgzLCBnZXRTaWduYWxOb2lzZVJhdGlvKCkpOwotICAgICAgfQotICAgICAgY2FjaGVkU2l6ZSA9IHNpemU7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFJJTEVWRE9TaWduYWxTdHJlbmd0aCBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBzZXREYm0oaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgIHNldEVjaW8oaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjQ6IHsKLSAgICAgICAgICAgIHNldFNpZ25hbE5vaXNlUmF0aW8oaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUklMRVZET1NpZ25hbFN0cmVuZ3RoIHBhcnNlRnJvbShieXRlW10gZGF0YSkKLSAgICAgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSSUxFVkRPU2lnbmFsU3RyZW5ndGgpIChuZXcgUklMRVZET1NpZ25hbFN0cmVuZ3RoKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSSUxFVkRPU2lnbmFsU3RyZW5ndGggcGFyc2VGcm9tKAotICAgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUklMRVZET1NpZ25hbFN0cmVuZ3RoKSAobmV3IFJJTEVWRE9TaWduYWxTdHJlbmd0aCgpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSc3BTdHJpbmdzIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgICBwdWJsaWMgUnNwU3RyaW5ncygpIHt9Ci0gICAgCi0gICAgLy8gcmVwZWF0ZWQgc3RyaW5nIHN0cmluZ3MgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklOR1NfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IHN0cmluZ3NfID0KLSAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4gZ2V0U3RyaW5nc0xpc3QoKSB7Ci0gICAgICByZXR1cm4gc3RyaW5nc187Ci0gICAgfQotICAgIHB1YmxpYyBpbnQgZ2V0U3RyaW5nc0NvdW50KCkgeyByZXR1cm4gc3RyaW5nc18uc2l6ZSgpOyB9Ci0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5ncyhpbnQgaW5kZXgpIHsKLSAgICAgIHJldHVybiBzdHJpbmdzXy5nZXQoaW5kZXgpOwotICAgIH0KLSAgICBwdWJsaWMgUnNwU3RyaW5ncyBzZXRTdHJpbmdzKGludCBpbmRleCwgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgfQotICBzdHJpbmdzXy5zZXQoaW5kZXgsIHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUnNwU3RyaW5ncyBhZGRTdHJpbmdzKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gIH0KLSAgaWYgKHN0cmluZ3NfLmlzRW1wdHkoKSkgewotICAgICAgICBzdHJpbmdzXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PGphdmEubGFuZy5TdHJpbmc+KCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmdzXy5hZGQodmFsdWUpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BTdHJpbmdzIGNsZWFyU3RyaW5ncygpIHsKLSAgICAgIHN0cmluZ3NfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBSc3BTdHJpbmdzIGNsZWFyKCkgewotICAgICAgY2xlYXJTdHJpbmdzKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBmb3IgKGphdmEubGFuZy5TdHJpbmcgZWxlbWVudCA6IGdldFN0cmluZ3NMaXN0KCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlU3RyaW5nKDEsIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICB7Ci0gICAgICAgIGludCBkYXRhU2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoamF2YS5sYW5nLlN0cmluZyBlbGVtZW50IDogZ2V0U3RyaW5nc0xpc3QoKSkgewotICAgICAgICAgIGRhdGFTaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgICAgLmNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZSArPSBkYXRhU2l6ZTsKLSAgICAgICAgc2l6ZSArPSAxICogZ2V0U3RyaW5nc0xpc3QoKS5zaXplKCk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUnNwU3RyaW5ncyBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgYWRkU3RyaW5ncyhpbnB1dC5yZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUnNwU3RyaW5ncyBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUnNwU3RyaW5ncykgKG5ldyBSc3BTdHJpbmdzKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSc3BTdHJpbmdzIHBhcnNlRnJvbSgKLSAgICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJzcFN0cmluZ3MpIChuZXcgUnNwU3RyaW5ncygpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSc3BJbnRlZ2VycyBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIFJzcEludGVnZXJzKCkge30KLSAgICAKLSAgICAvLyByZXBlYXRlZCBpbnQzMiBpbnRlZ2VycyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdFUlNfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5JbnRlZ2VyPiBpbnRlZ2Vyc18gPQotICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuSW50ZWdlcj4gZ2V0SW50ZWdlcnNMaXN0KCkgewotICAgICAgcmV0dXJuIGludGVnZXJzXzsKLSAgICB9Ci0gICAgcHVibGljIGludCBnZXRJbnRlZ2Vyc0NvdW50KCkgeyByZXR1cm4gaW50ZWdlcnNfLnNpemUoKTsgfQotICAgIHB1YmxpYyBpbnQgZ2V0SW50ZWdlcnMoaW50IGluZGV4KSB7Ci0gICAgICByZXR1cm4gaW50ZWdlcnNfLmdldChpbmRleCk7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BJbnRlZ2VycyBzZXRJbnRlZ2VycyhpbnQgaW5kZXgsIGludCB2YWx1ZSkgewotICAgICAgaW50ZWdlcnNfLnNldChpbmRleCwgdmFsdWUpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BJbnRlZ2VycyBhZGRJbnRlZ2VycyhpbnQgdmFsdWUpIHsKLSAgICAgIGlmIChpbnRlZ2Vyc18uaXNFbXB0eSgpKSB7Ci0gICAgICAgIGludGVnZXJzXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PGphdmEubGFuZy5JbnRlZ2VyPigpOwotICAgICAgfQotICAgICAgaW50ZWdlcnNfLmFkZCh2YWx1ZSk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJzcEludGVnZXJzIGNsZWFySW50ZWdlcnMoKSB7Ci0gICAgICBpbnRlZ2Vyc18gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJzcEludGVnZXJzIGNsZWFyKCkgewotICAgICAgY2xlYXJJbnRlZ2VycygpOwotICAgICAgY2FjaGVkU2l6ZSA9IC0xOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgZm9yIChpbnQgZWxlbWVudCA6IGdldEludGVnZXJzTGlzdCgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDEsIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICB7Ci0gICAgICAgIGludCBkYXRhU2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGVsZW1lbnQgOiBnZXRJbnRlZ2Vyc0xpc3QoKSkgewotICAgICAgICAgIGRhdGFTaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemVOb1RhZyhlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBzaXplICs9IGRhdGFTaXplOwotICAgICAgICBzaXplICs9IDEgKiBnZXRJbnRlZ2Vyc0xpc3QoKS5zaXplKCk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUnNwSW50ZWdlcnMgbWVyZ2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB0YWcpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgYWRkSW50ZWdlcnMoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUnNwSW50ZWdlcnMgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJzcEludGVnZXJzKSAobmV3IFJzcEludGVnZXJzKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSc3BJbnRlZ2VycyBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSc3BJbnRlZ2VycykgKG5ldyBSc3BJbnRlZ2VycygpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSc3BHZXRTaW1TdGF0dXMgZXh0ZW5kcwotICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5NZXNzYWdlTWljcm8gewotICAgIHB1YmxpYyBSc3BHZXRTaW1TdGF0dXMoKSB7fQotICAgIAotICAgIC8vIHJlcXVpcmVkIC5yaWxfcHJvdG8uUmlsQ2FyZFN0YXR1cyBjYXJkX3N0YXR1cyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FSRF9TVEFUVVNfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2FyZFN0YXR1czsKLSAgICBwcml2YXRlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxDYXJkU3RhdHVzIGNhcmRTdGF0dXNfID0gbnVsbDsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYXJkU3RhdHVzKCkgeyByZXR1cm4gaGFzQ2FyZFN0YXR1czsgfQotICAgIHB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsQ2FyZFN0YXR1cyBnZXRDYXJkU3RhdHVzKCkgeyByZXR1cm4gY2FyZFN0YXR1c187IH0KLSAgICBwdWJsaWMgUnNwR2V0U2ltU3RhdHVzIHNldENhcmRTdGF0dXMoY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbENhcmRTdGF0dXMgdmFsdWUpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgaGFzQ2FyZFN0YXR1cyA9IHRydWU7Ci0gICAgICBjYXJkU3RhdHVzXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BHZXRTaW1TdGF0dXMgY2xlYXJDYXJkU3RhdHVzKCkgewotICAgICAgaGFzQ2FyZFN0YXR1cyA9IGZhbHNlOwotICAgICAgY2FyZFN0YXR1c18gPSBudWxsOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBSc3BHZXRTaW1TdGF0dXMgY2xlYXIoKSB7Ci0gICAgICBjbGVhckNhcmRTdGF0dXMoKTsKLSAgICAgIGNhY2hlZFNpemUgPSAtMTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgaWYgKCFoYXNDYXJkU3RhdHVzKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgaWYgKGhhc0NhcmRTdGF0dXMoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVNZXNzYWdlKDEsIGdldENhcmRTdGF0dXMoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNhY2hlZFNpemUgPSAtMTsKLSAgICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgICBpZiAoY2FjaGVkU2l6ZSA8IDApIHsKLSAgICAgICAgLy8gZ2V0U2VyaWFsaXplZFNpemUgc2V0cyBjYWNoZWRTaXplCi0gICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2FjaGVkU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChoYXNDYXJkU3RhdHVzKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZU1lc3NhZ2VTaXplKDEsIGdldENhcmRTdGF0dXMoKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUnNwR2V0U2ltU3RhdHVzIG1lcmdlRnJvbSgKLSAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgaWYgKCFwYXJzZVVua25vd25GaWVsZChpbnB1dCwgdGFnKSkgewotICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsQ2FyZFN0YXR1cyB2YWx1ZSA9IG5ldyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsQ2FyZFN0YXR1cygpOwotICAgICAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2UodmFsdWUpOwotICAgICAgICAgICAgc2V0Q2FyZFN0YXR1cyh2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSc3BHZXRTaW1TdGF0dXMgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJzcEdldFNpbVN0YXR1cykgKG5ldyBSc3BHZXRTaW1TdGF0dXMoKS5tZXJnZUZyb20oZGF0YSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJzcEdldFNpbVN0YXR1cyBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSc3BHZXRTaW1TdGF0dXMpIChuZXcgUnNwR2V0U2ltU3RhdHVzKCkubWVyZ2VGcm9tKGlucHV0KSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlcUVudGVyU2ltUGluIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgICBwdWJsaWMgUmVxRW50ZXJTaW1QaW4oKSB7fQotICAgIAotICAgIC8vIHJlcXVpcmVkIHN0cmluZyBwaW4gPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJTl9GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQaW47Ci0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBpbl8gPSAiIjsKLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQaW4oKSB7IHJldHVybiBwaW5fOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzUGluKCkgeyByZXR1cm4gaGFzUGluOyB9Ci0gICAgcHVibGljIFJlcUVudGVyU2ltUGluIHNldFBpbihqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICBoYXNQaW4gPSB0cnVlOwotICAgICAgcGluXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSZXFFbnRlclNpbVBpbiBjbGVhclBpbigpIHsKLSAgICAgIGhhc1BpbiA9IGZhbHNlOwotICAgICAgcGluXyA9ICIiOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBSZXFFbnRlclNpbVBpbiBjbGVhcigpIHsKLSAgICAgIGNsZWFyUGluKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzUGluKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgaWYgKGhhc1BpbigpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZVN0cmluZygxLCBnZXRQaW4oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNhY2hlZFNpemUgPSAtMTsKLSAgICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgICBpZiAoY2FjaGVkU2l6ZSA8IDApIHsKLSAgICAgICAgLy8gZ2V0U2VyaWFsaXplZFNpemUgc2V0cyBjYWNoZWRTaXplCi0gICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2FjaGVkU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChoYXNQaW4oKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlU3RyaW5nU2l6ZSgxLCBnZXRQaW4oKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmVxRW50ZXJTaW1QaW4gbWVyZ2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB0YWcpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIHNldFBpbihpbnB1dC5yZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUmVxRW50ZXJTaW1QaW4gcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJlcUVudGVyU2ltUGluKSAobmV3IFJlcUVudGVyU2ltUGluKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSZXFFbnRlclNpbVBpbiBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSZXFFbnRlclNpbVBpbikgKG5ldyBSZXFFbnRlclNpbVBpbigpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSc3BFbnRlclNpbVBpbiBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIFJzcEVudGVyU2ltUGluKCkge30KLSAgICAKLSAgICAvLyByZXF1aXJlZCBpbnQzMiByZXRyaWVzX3JlbWFpbmluZyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUUklFU19SRU1BSU5JTkdfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUmV0cmllc1JlbWFpbmluZzsKLSAgICBwcml2YXRlIGludCByZXRyaWVzUmVtYWluaW5nXyA9IDA7Ci0gICAgcHVibGljIGludCBnZXRSZXRyaWVzUmVtYWluaW5nKCkgeyByZXR1cm4gcmV0cmllc1JlbWFpbmluZ187IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXRyaWVzUmVtYWluaW5nKCkgeyByZXR1cm4gaGFzUmV0cmllc1JlbWFpbmluZzsgfQotICAgIHB1YmxpYyBSc3BFbnRlclNpbVBpbiBzZXRSZXRyaWVzUmVtYWluaW5nKGludCB2YWx1ZSkgewotICAgICAgaGFzUmV0cmllc1JlbWFpbmluZyA9IHRydWU7Ci0gICAgICByZXRyaWVzUmVtYWluaW5nXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BFbnRlclNpbVBpbiBjbGVhclJldHJpZXNSZW1haW5pbmcoKSB7Ci0gICAgICBoYXNSZXRyaWVzUmVtYWluaW5nID0gZmFsc2U7Ci0gICAgICByZXRyaWVzUmVtYWluaW5nXyA9IDA7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJzcEVudGVyU2ltUGluIGNsZWFyKCkgewotICAgICAgY2xlYXJSZXRyaWVzUmVtYWluaW5nKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzUmV0cmllc1JlbWFpbmluZykgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChoYXNSZXRyaWVzUmVtYWluaW5nKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMSwgZ2V0UmV0cmllc1JlbWFpbmluZygpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVkU2l6ZSgpIHsKLSAgICAgIGlmIChjYWNoZWRTaXplIDwgMCkgewotICAgICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgICAgZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjYWNoZWRTaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGhhc1JldHJpZXNSZW1haW5pbmcoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlSW50MzJTaXplKDEsIGdldFJldHJpZXNSZW1haW5pbmcoKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUnNwRW50ZXJTaW1QaW4gbWVyZ2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB0YWcpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgc2V0UmV0cmllc1JlbWFpbmluZyhpbnB1dC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSc3BFbnRlclNpbVBpbiBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUnNwRW50ZXJTaW1QaW4pIChuZXcgUnNwRW50ZXJTaW1QaW4oKS5tZXJnZUZyb20oZGF0YSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJzcEVudGVyU2ltUGluIHBhcnNlRnJvbSgKLSAgICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJzcEVudGVyU2ltUGluKSAobmV3IFJzcEVudGVyU2ltUGluKCkubWVyZ2VGcm9tKGlucHV0KSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJzcEdldEN1cnJlbnRDYWxscyBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIFJzcEdldEN1cnJlbnRDYWxscygpIHt9Ci0gICAgCi0gICAgLy8gcmVwZWF0ZWQgLnJpbF9wcm90by5SaWxDYWxsIGNhbGxzID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMU19GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8Y29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbENhbGw+IGNhbGxzXyA9Ci0gICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgcHVibGljIGphdmEudXRpbC5MaXN0PGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxDYWxsPiBnZXRDYWxsc0xpc3QoKSB7Ci0gICAgICByZXR1cm4gY2FsbHNfOwotICAgIH0KLSAgICBwdWJsaWMgaW50IGdldENhbGxzQ291bnQoKSB7IHJldHVybiBjYWxsc18uc2l6ZSgpOyB9Ci0gICAgcHVibGljIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxDYWxsIGdldENhbGxzKGludCBpbmRleCkgewotICAgICAgcmV0dXJuIGNhbGxzXy5nZXQoaW5kZXgpOwotICAgIH0KLSAgICBwdWJsaWMgUnNwR2V0Q3VycmVudENhbGxzIHNldENhbGxzKGludCBpbmRleCwgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbENhbGwgdmFsdWUpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgY2FsbHNfLnNldChpbmRleCwgdmFsdWUpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BHZXRDdXJyZW50Q2FsbHMgYWRkQ2FsbHMoY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbENhbGwgdmFsdWUpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgaWYgKGNhbGxzXy5pc0VtcHR5KCkpIHsKLSAgICAgICAgY2FsbHNfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8Y29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbENhbGw+KCk7Ci0gICAgICB9Ci0gICAgICBjYWxsc18uYWRkKHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUnNwR2V0Q3VycmVudENhbGxzIGNsZWFyQ2FsbHMoKSB7Ci0gICAgICBjYWxsc18gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJzcEdldEN1cnJlbnRDYWxscyBjbGVhcigpIHsKLSAgICAgIGNsZWFyQ2FsbHMoKTsKLSAgICAgIGNhY2hlZFNpemUgPSAtMTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIGZvciAoY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbENhbGwgZWxlbWVudCA6IGdldENhbGxzTGlzdCgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZU1lc3NhZ2UoMSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNhY2hlZFNpemUgPSAtMTsKLSAgICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgICBpZiAoY2FjaGVkU2l6ZSA8IDApIHsKLSAgICAgICAgLy8gZ2V0U2VyaWFsaXplZFNpemUgc2V0cyBjYWNoZWRTaXplCi0gICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2FjaGVkU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGZvciAoY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbENhbGwgZWxlbWVudCA6IGdldENhbGxzTGlzdCgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVNZXNzYWdlU2l6ZSgxLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGNhY2hlZFNpemUgPSBzaXplOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBSc3BHZXRDdXJyZW50Q2FsbHMgbWVyZ2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB0YWcpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxDYWxsIHZhbHVlID0gbmV3IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxDYWxsKCk7Ci0gICAgICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZSh2YWx1ZSk7Ci0gICAgICAgICAgICBhZGRDYWxscyh2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSc3BHZXRDdXJyZW50Q2FsbHMgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJzcEdldEN1cnJlbnRDYWxscykgKG5ldyBSc3BHZXRDdXJyZW50Q2FsbHMoKS5tZXJnZUZyb20oZGF0YSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJzcEdldEN1cnJlbnRDYWxscyBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSc3BHZXRDdXJyZW50Q2FsbHMpIChuZXcgUnNwR2V0Q3VycmVudENhbGxzKCkubWVyZ2VGcm9tKGlucHV0KSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlcURpYWwgZXh0ZW5kcwotICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5NZXNzYWdlTWljcm8gewotICAgIHB1YmxpYyBSZXFEaWFsKCkge30KLSAgICAKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgYWRkcmVzcyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREUkVTU19GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNBZGRyZXNzOwotICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBhZGRyZXNzXyA9ICIiOwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFkZHJlc3MoKSB7IHJldHVybiBhZGRyZXNzXzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc0FkZHJlc3MoKSB7IHJldHVybiBoYXNBZGRyZXNzOyB9Ci0gICAgcHVibGljIFJlcURpYWwgc2V0QWRkcmVzcyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICBoYXNBZGRyZXNzID0gdHJ1ZTsKLSAgICAgIGFkZHJlc3NfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJlcURpYWwgY2xlYXJBZGRyZXNzKCkgewotICAgICAgaGFzQWRkcmVzcyA9IGZhbHNlOwotICAgICAgYWRkcmVzc18gPSAiIjsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBjbGlyID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElSX0ZJRUxEX05VTUJFUiA9IDI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0NsaXI7Ci0gICAgcHJpdmF0ZSBpbnQgY2xpcl8gPSAwOwotICAgIHB1YmxpYyBpbnQgZ2V0Q2xpcigpIHsgcmV0dXJuIGNsaXJfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2xpcigpIHsgcmV0dXJuIGhhc0NsaXI7IH0KLSAgICBwdWJsaWMgUmVxRGlhbCBzZXRDbGlyKGludCB2YWx1ZSkgewotICAgICAgaGFzQ2xpciA9IHRydWU7Ci0gICAgICBjbGlyXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSZXFEaWFsIGNsZWFyQ2xpcigpIHsKLSAgICAgIGhhc0NsaXIgPSBmYWxzZTsKLSAgICAgIGNsaXJfID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJpbFV1c0luZm8gdXVzX2luZm8gPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVVU19JTkZPX0ZJRUxEX05VTUJFUiA9IDM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1V1c0luZm87Ci0gICAgcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsVXVzSW5mbyB1dXNJbmZvXyA9IG51bGw7Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzVXVzSW5mbygpIHsgcmV0dXJuIGhhc1V1c0luZm87IH0KLSAgICBwdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJpbFV1c0luZm8gZ2V0VXVzSW5mbygpIHsgcmV0dXJuIHV1c0luZm9fOyB9Ci0gICAgcHVibGljIFJlcURpYWwgc2V0VXVzSW5mbyhjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUmlsVXVzSW5mbyB2YWx1ZSkgewotICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBoYXNVdXNJbmZvID0gdHJ1ZTsKLSAgICAgIHV1c0luZm9fID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJlcURpYWwgY2xlYXJVdXNJbmZvKCkgewotICAgICAgaGFzVXVzSW5mbyA9IGZhbHNlOwotICAgICAgdXVzSW5mb18gPSBudWxsOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBSZXFEaWFsIGNsZWFyKCkgewotICAgICAgY2xlYXJBZGRyZXNzKCk7Ci0gICAgICBjbGVhckNsaXIoKTsKLSAgICAgIGNsZWFyVXVzSW5mbygpOwotICAgICAgY2FjaGVkU2l6ZSA9IC0xOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgaWYgKGhhc0FkZHJlc3MoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcoMSwgZ2V0QWRkcmVzcygpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNDbGlyKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMiwgZ2V0Q2xpcigpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNVdXNJbmZvKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZSgzLCBnZXRVdXNJbmZvKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoaGFzQWRkcmVzcygpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVTdHJpbmdTaXplKDEsIGdldEFkZHJlc3MoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQ2xpcigpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMiwgZ2V0Q2xpcigpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNVdXNJbmZvKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZU1lc3NhZ2VTaXplKDMsIGdldFV1c0luZm8oKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmVxRGlhbCBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgc2V0QWRkcmVzcyhpbnB1dC5yZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgIHNldENsaXIoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxVdXNJbmZvIHZhbHVlID0gbmV3IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SaWxVdXNJbmZvKCk7Ci0gICAgICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZSh2YWx1ZSk7Ci0gICAgICAgICAgICBzZXRVdXNJbmZvKHZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJlcURpYWwgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJlcURpYWwpIChuZXcgUmVxRGlhbCgpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUmVxRGlhbCBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSZXFEaWFsKSAobmV3IFJlcURpYWwoKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVxSGFuZ1VwIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgICBwdWJsaWMgUmVxSGFuZ1VwKCkge30KLSAgICAKLSAgICAvLyByZXF1aXJlZCBpbnQzMiBjb25uZWN0aW9uX2luZGV4ID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX0lOREVYX0ZJRUxEX05VTUJFUiA9IDE7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0Nvbm5lY3Rpb25JbmRleDsKLSAgICBwcml2YXRlIGludCBjb25uZWN0aW9uSW5kZXhfID0gMDsKLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25JbmRleCgpIHsgcmV0dXJuIGNvbm5lY3Rpb25JbmRleF87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb25uZWN0aW9uSW5kZXgoKSB7IHJldHVybiBoYXNDb25uZWN0aW9uSW5kZXg7IH0KLSAgICBwdWJsaWMgUmVxSGFuZ1VwIHNldENvbm5lY3Rpb25JbmRleChpbnQgdmFsdWUpIHsKLSAgICAgIGhhc0Nvbm5lY3Rpb25JbmRleCA9IHRydWU7Ci0gICAgICBjb25uZWN0aW9uSW5kZXhfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJlcUhhbmdVcCBjbGVhckNvbm5lY3Rpb25JbmRleCgpIHsKLSAgICAgIGhhc0Nvbm5lY3Rpb25JbmRleCA9IGZhbHNlOwotICAgICAgY29ubmVjdGlvbkluZGV4XyA9IDA7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJlcUhhbmdVcCBjbGVhcigpIHsKLSAgICAgIGNsZWFyQ29ubmVjdGlvbkluZGV4KCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzQ29ubmVjdGlvbkluZGV4KSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgaWYgKGhhc0Nvbm5lY3Rpb25JbmRleCgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDEsIGdldENvbm5lY3Rpb25JbmRleCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVkU2l6ZSgpIHsKLSAgICAgIGlmIChjYWNoZWRTaXplIDwgMCkgewotICAgICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgICAgZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjYWNoZWRTaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGhhc0Nvbm5lY3Rpb25JbmRleCgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMSwgZ2V0Q29ubmVjdGlvbkluZGV4KCkpOwotICAgICAgfQotICAgICAgY2FjaGVkU2l6ZSA9IHNpemU7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFJlcUhhbmdVcCBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBzZXRDb25uZWN0aW9uSW5kZXgoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUmVxSGFuZ1VwIHBhcnNlRnJvbShieXRlW10gZGF0YSkKLSAgICAgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSZXFIYW5nVXApIChuZXcgUmVxSGFuZ1VwKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSZXFIYW5nVXAgcGFyc2VGcm9tKAotICAgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUmVxSGFuZ1VwKSAobmV3IFJlcUhhbmdVcCgpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSc3BMYXN0Q2FsbEZhaWxDYXVzZSBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIFJzcExhc3RDYWxsRmFpbENhdXNlKCkge30KLSAgICAKLSAgICAvLyByZXF1aXJlZCBpbnQzMiBsYXN0X2NhbGxfZmFpbF9jYXVzZSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9DQUxMX0ZBSUxfQ0FVU0VfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzTGFzdENhbGxGYWlsQ2F1c2U7Ci0gICAgcHJpdmF0ZSBpbnQgbGFzdENhbGxGYWlsQ2F1c2VfID0gMDsKLSAgICBwdWJsaWMgaW50IGdldExhc3RDYWxsRmFpbENhdXNlKCkgeyByZXR1cm4gbGFzdENhbGxGYWlsQ2F1c2VfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzTGFzdENhbGxGYWlsQ2F1c2UoKSB7IHJldHVybiBoYXNMYXN0Q2FsbEZhaWxDYXVzZTsgfQotICAgIHB1YmxpYyBSc3BMYXN0Q2FsbEZhaWxDYXVzZSBzZXRMYXN0Q2FsbEZhaWxDYXVzZShpbnQgdmFsdWUpIHsKLSAgICAgIGhhc0xhc3RDYWxsRmFpbENhdXNlID0gdHJ1ZTsKLSAgICAgIGxhc3RDYWxsRmFpbENhdXNlXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BMYXN0Q2FsbEZhaWxDYXVzZSBjbGVhckxhc3RDYWxsRmFpbENhdXNlKCkgewotICAgICAgaGFzTGFzdENhbGxGYWlsQ2F1c2UgPSBmYWxzZTsKLSAgICAgIGxhc3RDYWxsRmFpbENhdXNlXyA9IDA7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJzcExhc3RDYWxsRmFpbENhdXNlIGNsZWFyKCkgewotICAgICAgY2xlYXJMYXN0Q2FsbEZhaWxDYXVzZSgpOwotICAgICAgY2FjaGVkU2l6ZSA9IC0xOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICBpZiAoIWhhc0xhc3RDYWxsRmFpbENhdXNlKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgaWYgKGhhc0xhc3RDYWxsRmFpbENhdXNlKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMSwgZ2V0TGFzdENhbGxGYWlsQ2F1c2UoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNhY2hlZFNpemUgPSAtMTsKLSAgICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgICBpZiAoY2FjaGVkU2l6ZSA8IDApIHsKLSAgICAgICAgLy8gZ2V0U2VyaWFsaXplZFNpemUgc2V0cyBjYWNoZWRTaXplCi0gICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2FjaGVkU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChoYXNMYXN0Q2FsbEZhaWxDYXVzZSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMSwgZ2V0TGFzdENhbGxGYWlsQ2F1c2UoKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUnNwTGFzdENhbGxGYWlsQ2F1c2UgbWVyZ2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB0YWcpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgc2V0TGFzdENhbGxGYWlsQ2F1c2UoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUnNwTGFzdENhbGxGYWlsQ2F1c2UgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJzcExhc3RDYWxsRmFpbENhdXNlKSAobmV3IFJzcExhc3RDYWxsRmFpbENhdXNlKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSc3BMYXN0Q2FsbEZhaWxDYXVzZSBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSc3BMYXN0Q2FsbEZhaWxDYXVzZSkgKG5ldyBSc3BMYXN0Q2FsbEZhaWxDYXVzZSgpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSc3BTaWduYWxTdHJlbmd0aCBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIFJzcFNpZ25hbFN0cmVuZ3RoKCkge30KLSAgICAKLSAgICAvLyBvcHRpb25hbCAucmlsX3Byb3RvLlJJTEdXU2lnbmFsU3RyZW5ndGggZ3dfc2lnbmFsc3RyZW5ndGggPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdXX1NJR05BTFNUUkVOR1RIX0ZJRUxEX05VTUJFUiA9IDE7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0d3U2lnbmFsc3RyZW5ndGg7Ci0gICAgcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUklMR1dTaWduYWxTdHJlbmd0aCBnd1NpZ25hbHN0cmVuZ3RoXyA9IG51bGw7Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzR3dTaWduYWxzdHJlbmd0aCgpIHsgcmV0dXJuIGhhc0d3U2lnbmFsc3RyZW5ndGg7IH0KLSAgICBwdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJJTEdXU2lnbmFsU3RyZW5ndGggZ2V0R3dTaWduYWxzdHJlbmd0aCgpIHsgcmV0dXJuIGd3U2lnbmFsc3RyZW5ndGhfOyB9Ci0gICAgcHVibGljIFJzcFNpZ25hbFN0cmVuZ3RoIHNldEd3U2lnbmFsc3RyZW5ndGgoY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJJTEdXU2lnbmFsU3RyZW5ndGggdmFsdWUpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgaGFzR3dTaWduYWxzdHJlbmd0aCA9IHRydWU7Ci0gICAgICBnd1NpZ25hbHN0cmVuZ3RoXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BTaWduYWxTdHJlbmd0aCBjbGVhckd3U2lnbmFsc3RyZW5ndGgoKSB7Ci0gICAgICBoYXNHd1NpZ25hbHN0cmVuZ3RoID0gZmFsc2U7Ci0gICAgICBnd1NpZ25hbHN0cmVuZ3RoXyA9IG51bGw7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgLnJpbF9wcm90by5SSUxDRE1BU2lnbmFsU3RyZW5ndGggY2RtYV9zaWduYWxzdHJlbmd0aCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0RNQV9TSUdOQUxTVFJFTkdUSF9GSUVMRF9OVU1CRVIgPSAyOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNDZG1hU2lnbmFsc3RyZW5ndGg7Ci0gICAgcHJpdmF0ZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIGNkbWFTaWduYWxzdHJlbmd0aF8gPSBudWxsOwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NkbWFTaWduYWxzdHJlbmd0aCgpIHsgcmV0dXJuIGhhc0NkbWFTaWduYWxzdHJlbmd0aDsgfQotICAgIHB1YmxpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUklMQ0RNQVNpZ25hbFN0cmVuZ3RoIGdldENkbWFTaWduYWxzdHJlbmd0aCgpIHsgcmV0dXJuIGNkbWFTaWduYWxzdHJlbmd0aF87IH0KLSAgICBwdWJsaWMgUnNwU2lnbmFsU3RyZW5ndGggc2V0Q2RtYVNpZ25hbHN0cmVuZ3RoKGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SSUxDRE1BU2lnbmFsU3RyZW5ndGggdmFsdWUpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgaGFzQ2RtYVNpZ25hbHN0cmVuZ3RoID0gdHJ1ZTsKLSAgICAgIGNkbWFTaWduYWxzdHJlbmd0aF8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUnNwU2lnbmFsU3RyZW5ndGggY2xlYXJDZG1hU2lnbmFsc3RyZW5ndGgoKSB7Ci0gICAgICBoYXNDZG1hU2lnbmFsc3RyZW5ndGggPSBmYWxzZTsKLSAgICAgIGNkbWFTaWduYWxzdHJlbmd0aF8gPSBudWxsOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5yaWxfcHJvdG8uUklMRVZET1NpZ25hbFN0cmVuZ3RoIGV2ZG9fc2lnbmFsc3RyZW5ndGggPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRE9fU0lHTkFMU1RSRU5HVEhfRklFTERfTlVNQkVSID0gMzsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRXZkb1NpZ25hbHN0cmVuZ3RoOwotICAgIHByaXZhdGUgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJJTEVWRE9TaWduYWxTdHJlbmd0aCBldmRvU2lnbmFsc3RyZW5ndGhfID0gbnVsbDsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFdmRvU2lnbmFsc3RyZW5ndGgoKSB7IHJldHVybiBoYXNFdmRvU2lnbmFsc3RyZW5ndGg7IH0KLSAgICBwdWJsaWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJJTEVWRE9TaWduYWxTdHJlbmd0aCBnZXRFdmRvU2lnbmFsc3RyZW5ndGgoKSB7IHJldHVybiBldmRvU2lnbmFsc3RyZW5ndGhfOyB9Ci0gICAgcHVibGljIFJzcFNpZ25hbFN0cmVuZ3RoIHNldEV2ZG9TaWduYWxzdHJlbmd0aChjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUklMRVZET1NpZ25hbFN0cmVuZ3RoIHZhbHVlKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGhhc0V2ZG9TaWduYWxzdHJlbmd0aCA9IHRydWU7Ci0gICAgICBldmRvU2lnbmFsc3RyZW5ndGhfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJzcFNpZ25hbFN0cmVuZ3RoIGNsZWFyRXZkb1NpZ25hbHN0cmVuZ3RoKCkgewotICAgICAgaGFzRXZkb1NpZ25hbHN0cmVuZ3RoID0gZmFsc2U7Ci0gICAgICBldmRvU2lnbmFsc3RyZW5ndGhfID0gbnVsbDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgUnNwU2lnbmFsU3RyZW5ndGggY2xlYXIoKSB7Ci0gICAgICBjbGVhckd3U2lnbmFsc3RyZW5ndGgoKTsKLSAgICAgIGNsZWFyQ2RtYVNpZ25hbHN0cmVuZ3RoKCk7Ci0gICAgICBjbGVhckV2ZG9TaWduYWxzdHJlbmd0aCgpOwotICAgICAgY2FjaGVkU2l6ZSA9IC0xOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgaWYgKGhhc0d3U2lnbmFsc3RyZW5ndGgoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVNZXNzYWdlKDEsIGdldEd3U2lnbmFsc3RyZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQ2RtYVNpZ25hbHN0cmVuZ3RoKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZSgyLCBnZXRDZG1hU2lnbmFsc3RyZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzRXZkb1NpZ25hbHN0cmVuZ3RoKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZSgzLCBnZXRFdmRvU2lnbmFsc3RyZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNhY2hlZFNpemUgPSAtMTsKLSAgICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgICBpZiAoY2FjaGVkU2l6ZSA8IDApIHsKLSAgICAgICAgLy8gZ2V0U2VyaWFsaXplZFNpemUgc2V0cyBjYWNoZWRTaXplCi0gICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2FjaGVkU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChoYXNHd1NpZ25hbHN0cmVuZ3RoKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZU1lc3NhZ2VTaXplKDEsIGdldEd3U2lnbmFsc3RyZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQ2RtYVNpZ25hbHN0cmVuZ3RoKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZU1lc3NhZ2VTaXplKDIsIGdldENkbWFTaWduYWxzdHJlbmd0aCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNFdmRvU2lnbmFsc3RyZW5ndGgoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlTWVzc2FnZVNpemUoMywgZ2V0RXZkb1NpZ25hbHN0cmVuZ3RoKCkpOwotICAgICAgfQotICAgICAgY2FjaGVkU2l6ZSA9IHNpemU7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFJzcFNpZ25hbFN0cmVuZ3RoIG1lcmdlRnJvbSgKLSAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgaWYgKCFwYXJzZVVua25vd25GaWVsZChpbnB1dCwgdGFnKSkgewotICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUklMR1dTaWduYWxTdHJlbmd0aCB2YWx1ZSA9IG5ldyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUklMR1dTaWduYWxTdHJlbmd0aCgpOwotICAgICAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2UodmFsdWUpOwotICAgICAgICAgICAgc2V0R3dTaWduYWxzdHJlbmd0aCh2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJJTENETUFTaWduYWxTdHJlbmd0aCB2YWx1ZSA9IG5ldyBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHMuUklMQ0RNQVNpZ25hbFN0cmVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZSh2YWx1ZSk7Ci0gICAgICAgICAgICBzZXRDZG1hU2lnbmFsc3RyZW5ndGgodmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SSUxFVkRPU2lnbmFsU3RyZW5ndGggdmFsdWUgPSBuZXcgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJJTEVWRE9TaWduYWxTdHJlbmd0aCgpOwotICAgICAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2UodmFsdWUpOwotICAgICAgICAgICAgc2V0RXZkb1NpZ25hbHN0cmVuZ3RoKHZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJzcFNpZ25hbFN0cmVuZ3RoIHBhcnNlRnJvbShieXRlW10gZGF0YSkKLSAgICAgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSc3BTaWduYWxTdHJlbmd0aCkgKG5ldyBSc3BTaWduYWxTdHJlbmd0aCgpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUnNwU2lnbmFsU3RyZW5ndGggcGFyc2VGcm9tKAotICAgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUnNwU2lnbmFsU3RyZW5ndGgpIChuZXcgUnNwU2lnbmFsU3RyZW5ndGgoKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUnNwT3BlcmF0b3IgZXh0ZW5kcwotICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5NZXNzYWdlTWljcm8gewotICAgIHB1YmxpYyBSc3BPcGVyYXRvcigpIHt9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGxvbmdfYWxwaGFfb25zID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT05HX0FMUEhBX09OU19GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNMb25nQWxwaGFPbnM7Ci0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGxvbmdBbHBoYU9uc18gPSAiIjsKLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMb25nQWxwaGFPbnMoKSB7IHJldHVybiBsb25nQWxwaGFPbnNfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzTG9uZ0FscGhhT25zKCkgeyByZXR1cm4gaGFzTG9uZ0FscGhhT25zOyB9Ci0gICAgcHVibGljIFJzcE9wZXJhdG9yIHNldExvbmdBbHBoYU9ucyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICBoYXNMb25nQWxwaGFPbnMgPSB0cnVlOwotICAgICAgbG9uZ0FscGhhT25zXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BPcGVyYXRvciBjbGVhckxvbmdBbHBoYU9ucygpIHsKLSAgICAgIGhhc0xvbmdBbHBoYU9ucyA9IGZhbHNlOwotICAgICAgbG9uZ0FscGhhT25zXyA9ICIiOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBzaG9ydF9hbHBoYV9vbnMgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUX0FMUEhBX09OU19GSUVMRF9OVU1CRVIgPSAyOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNTaG9ydEFscGhhT25zOwotICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzaG9ydEFscGhhT25zXyA9ICIiOwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNob3J0QWxwaGFPbnMoKSB7IHJldHVybiBzaG9ydEFscGhhT25zXzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc1Nob3J0QWxwaGFPbnMoKSB7IHJldHVybiBoYXNTaG9ydEFscGhhT25zOyB9Ci0gICAgcHVibGljIFJzcE9wZXJhdG9yIHNldFNob3J0QWxwaGFPbnMoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgaGFzU2hvcnRBbHBoYU9ucyA9IHRydWU7Ci0gICAgICBzaG9ydEFscGhhT25zXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSc3BPcGVyYXRvciBjbGVhclNob3J0QWxwaGFPbnMoKSB7Ci0gICAgICBoYXNTaG9ydEFscGhhT25zID0gZmFsc2U7Ci0gICAgICBzaG9ydEFscGhhT25zXyA9ICIiOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBtY2NfbW5jID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQ0NfTU5DX0ZJRUxEX05VTUJFUiA9IDM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc01jY01uYzsKLSAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbWNjTW5jXyA9ICIiOwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1jY01uYygpIHsgcmV0dXJuIG1jY01uY187IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNY2NNbmMoKSB7IHJldHVybiBoYXNNY2NNbmM7IH0KLSAgICBwdWJsaWMgUnNwT3BlcmF0b3Igc2V0TWNjTW5jKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgIGhhc01jY01uYyA9IHRydWU7Ci0gICAgICBtY2NNbmNfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIFJzcE9wZXJhdG9yIGNsZWFyTWNjTW5jKCkgewotICAgICAgaGFzTWNjTW5jID0gZmFsc2U7Ci0gICAgICBtY2NNbmNfID0gIiI7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJzcE9wZXJhdG9yIGNsZWFyKCkgewotICAgICAgY2xlYXJMb25nQWxwaGFPbnMoKTsKLSAgICAgIGNsZWFyU2hvcnRBbHBoYU9ucygpOwotICAgICAgY2xlYXJNY2NNbmMoKTsKLSAgICAgIGNhY2hlZFNpemUgPSAtMTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChoYXNMb25nQWxwaGFPbnMoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcoMSwgZ2V0TG9uZ0FscGhhT25zKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc1Nob3J0QWxwaGFPbnMoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcoMiwgZ2V0U2hvcnRBbHBoYU9ucygpKTsKLSAgICAgIH0KLSAgICAgIGlmIChoYXNNY2NNbmMoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcoMywgZ2V0TWNjTW5jKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoaGFzTG9uZ0FscGhhT25zKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZVN0cmluZ1NpemUoMSwgZ2V0TG9uZ0FscGhhT25zKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc1Nob3J0QWxwaGFPbnMoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlU3RyaW5nU2l6ZSgyLCBnZXRTaG9ydEFscGhhT25zKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc01jY01uYygpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVTdHJpbmdTaXplKDMsIGdldE1jY01uYygpKTsKLSAgICAgIH0KLSAgICAgIGNhY2hlZFNpemUgPSBzaXplOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBSc3BPcGVyYXRvciBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgc2V0TG9uZ0FscGhhT25zKGlucHV0LnJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgc2V0U2hvcnRBbHBoYU9ucyhpbnB1dC5yZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIHNldE1jY01uYyhpbnB1dC5yZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUnNwT3BlcmF0b3IgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJzcE9wZXJhdG9yKSAobmV3IFJzcE9wZXJhdG9yKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSc3BPcGVyYXRvciBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSc3BPcGVyYXRvcikgKG5ldyBSc3BPcGVyYXRvcigpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24gZXh0ZW5kcwotICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5NZXNzYWdlTWljcm8gewotICAgIHB1YmxpYyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24oKSB7fQotICAgIAotICAgIC8vIHJlcXVpcmVkIGludDMyIGluZGV4ID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkRFWF9GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNJbmRleDsKLSAgICBwcml2YXRlIGludCBpbmRleF8gPSAwOwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7IHJldHVybiBpbmRleF87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbmRleCgpIHsgcmV0dXJuIGhhc0luZGV4OyB9Ci0gICAgcHVibGljIFJlcVNlcGFyYXRlQ29ubmVjdGlvbiBzZXRJbmRleChpbnQgdmFsdWUpIHsKLSAgICAgIGhhc0luZGV4ID0gdHJ1ZTsKLSAgICAgIGluZGV4XyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24gY2xlYXJJbmRleCgpIHsKLSAgICAgIGhhc0luZGV4ID0gZmFsc2U7Ci0gICAgICBpbmRleF8gPSAwOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24gY2xlYXIoKSB7Ci0gICAgICBjbGVhckluZGV4KCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzSW5kZXgpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzSW5kZXgoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigxLCBnZXRJbmRleCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVkU2l6ZSgpIHsKLSAgICAgIGlmIChjYWNoZWRTaXplIDwgMCkgewotICAgICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgICAgZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjYWNoZWRTaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGhhc0luZGV4KCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgxLCBnZXRJbmRleCgpKTsKLSAgICAgIH0KLSAgICAgIGNhY2hlZFNpemUgPSBzaXplOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24gbWVyZ2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB0YWcpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgc2V0SW5kZXgoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUmVxU2VwYXJhdGVDb25uZWN0aW9uIHBhcnNlRnJvbShieXRlW10gZGF0YSkKLSAgICAgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSZXFTZXBhcmF0ZUNvbm5lY3Rpb24pIChuZXcgUmVxU2VwYXJhdGVDb25uZWN0aW9uKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24gcGFyc2VGcm9tKAotICAgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUmVxU2VwYXJhdGVDb25uZWN0aW9uKSAobmV3IFJlcVNlcGFyYXRlQ29ubmVjdGlvbigpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXFTZXRNdXRlIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgICBwdWJsaWMgUmVxU2V0TXV0ZSgpIHt9Ci0gICAgCi0gICAgLy8gcmVxdWlyZWQgYm9vbCBzdGF0ZSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzU3RhdGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN0YXRlXyA9IGZhbHNlOwotICAgIHB1YmxpYyBib29sZWFuIGdldFN0YXRlKCkgeyByZXR1cm4gc3RhdGVfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzU3RhdGUoKSB7IHJldHVybiBoYXNTdGF0ZTsgfQotICAgIHB1YmxpYyBSZXFTZXRNdXRlIHNldFN0YXRlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgIGhhc1N0YXRlID0gdHJ1ZTsKLSAgICAgIHN0YXRlXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBSZXFTZXRNdXRlIGNsZWFyU3RhdGUoKSB7Ci0gICAgICBoYXNTdGF0ZSA9IGZhbHNlOwotICAgICAgc3RhdGVfID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFJlcVNldE11dGUgY2xlYXIoKSB7Ci0gICAgICBjbGVhclN0YXRlKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzU3RhdGUpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzU3RhdGUoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVCb29sKDEsIGdldFN0YXRlKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoaGFzU3RhdGUoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlQm9vbFNpemUoMSwgZ2V0U3RhdGUoKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmVxU2V0TXV0ZSBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBzZXRTdGF0ZShpbnB1dC5yZWFkQm9vbCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJlcVNldE11dGUgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJlcVNldE11dGUpIChuZXcgUmVxU2V0TXV0ZSgpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgUmVxU2V0TXV0ZSBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChSZXFTZXRNdXRlKSAobmV3IFJlcVNldE11dGUoKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVxU2NyZWVuU3RhdGUgZXh0ZW5kcwotICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5NZXNzYWdlTWljcm8gewotICAgIHB1YmxpYyBSZXFTY3JlZW5TdGF0ZSgpIHt9Ci0gICAgCi0gICAgLy8gcmVxdWlyZWQgYm9vbCBzdGF0ZSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzU3RhdGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN0YXRlXyA9IGZhbHNlOwotICAgIHB1YmxpYyBib29sZWFuIGdldFN0YXRlKCkgeyByZXR1cm4gc3RhdGVfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzU3RhdGUoKSB7IHJldHVybiBoYXNTdGF0ZTsgfQotICAgIHB1YmxpYyBSZXFTY3JlZW5TdGF0ZSBzZXRTdGF0ZShib29sZWFuIHZhbHVlKSB7Ci0gICAgICBoYXNTdGF0ZSA9IHRydWU7Ci0gICAgICBzdGF0ZV8gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgUmVxU2NyZWVuU3RhdGUgY2xlYXJTdGF0ZSgpIHsKLSAgICAgIGhhc1N0YXRlID0gZmFsc2U7Ci0gICAgICBzdGF0ZV8gPSBmYWxzZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgUmVxU2NyZWVuU3RhdGUgY2xlYXIoKSB7Ci0gICAgICBjbGVhclN0YXRlKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzU3RhdGUpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzU3RhdGUoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVCb29sKDEsIGdldFN0YXRlKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoaGFzU3RhdGUoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlQm9vbFNpemUoMSwgZ2V0U3RhdGUoKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmVxU2NyZWVuU3RhdGUgbWVyZ2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB0YWcpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgc2V0U3RhdGUoaW5wdXQucmVhZEJvb2woKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSZXFTY3JlZW5TdGF0ZSBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoUmVxU2NyZWVuU3RhdGUpIChuZXcgUmVxU2NyZWVuU3RhdGUoKS5tZXJnZUZyb20oZGF0YSkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFJlcVNjcmVlblN0YXRlIHBhcnNlRnJvbSgKLSAgICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKFJlcVNjcmVlblN0YXRlKSAobmV3IFJlcVNjcmVlblN0YXRlKCkubWVyZ2VGcm9tKGlucHV0KSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9yaWxfcHJvdG8vUmlsQ3RybENtZHMuamF2YSBiL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvcmlsX3Byb3RvL1JpbEN0cmxDbWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTc0YjcuLjAwMDAwMDAKLS0tIGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9yaWxfcHJvdG8vUmlsQ3RybENtZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG87Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSaWxDdHJsQ21kcyB7Ci0gIHByaXZhdGUgUmlsQ3RybENtZHMoKSB7fQotICAvLyBlbnVtIEN0cmxDbWQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1RSTF9DTURfRUNITyA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENUUkxfQ01EX0dFVF9SQURJT19TVEFURSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENUUkxfQ01EX1NFVF9SQURJT19TVEFURSA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENUUkxfQ01EX1NFVF9NVF9DQUxMID0gMTAwMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1RSTF9DTURfSEFOR1VQX0NPTk5fUkVNT1RFID0gMTAwMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1RSTF9DTURfU0VUX0NBTExfVFJBTlNJVElPTl9GTEFHID0gMTAwMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1RSTF9DTURfU0VUX0NBTExfQUxFUlQgPSAxMDA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVFJMX0NNRF9TRVRfQ0FMTF9BQ1RJVkUgPSAxMDA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVFJMX0NNRF9BRERfRElBTElOR19DQUxMID0gMTAwNjsKLSAgCi0gIC8vIGVudW0gQ3RybFN0YXR1cwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVFJMX1NUQVRVU19PSyA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENUUkxfU1RBVFVTX0VSUiA9IDE7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEN0cmxSZXFSYWRpb1N0YXRlIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgICBwdWJsaWMgQ3RybFJlcVJhZGlvU3RhdGUoKSB7fQotICAgIAotICAgIC8vIHJlcXVpcmVkIC5yaWxfcHJvdG8uUmFkaW9TdGF0ZSBzdGF0ZSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzU3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgc3RhdGVfID0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJBRElPU1RBVEVfT0ZGOwotICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YXRlKCkgeyByZXR1cm4gaGFzU3RhdGU7IH0KLSAgICBwdWJsaWMgaW50IGdldFN0YXRlKCkgeyByZXR1cm4gc3RhdGVfOyB9Ci0gICAgcHVibGljIEN0cmxSZXFSYWRpb1N0YXRlIHNldFN0YXRlKGludCB2YWx1ZSkgewotICAgICAgaGFzU3RhdGUgPSB0cnVlOwotICAgICAgc3RhdGVfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIEN0cmxSZXFSYWRpb1N0YXRlIGNsZWFyU3RhdGUoKSB7Ci0gICAgICBoYXNTdGF0ZSA9IGZhbHNlOwotICAgICAgc3RhdGVfID0gY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzLlJBRElPU1RBVEVfT0ZGOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBDdHJsUmVxUmFkaW9TdGF0ZSBjbGVhcigpIHsKLSAgICAgIGNsZWFyU3RhdGUoKTsKLSAgICAgIGNhY2hlZFNpemUgPSAtMTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgaWYgKCFoYXNTdGF0ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChoYXNTdGF0ZSgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUludDMyKDEsIGdldFN0YXRlKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoaGFzU3RhdGUoKSkgewotICAgICAgICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybwotICAgICAgICAgIC5jb21wdXRlSW50MzJTaXplKDEsIGdldFN0YXRlKCkpOwotICAgICAgfQotICAgICAgY2FjaGVkU2l6ZSA9IHNpemU7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEN0cmxSZXFSYWRpb1N0YXRlIG1lcmdlRnJvbSgKLSAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgaWYgKCFwYXJzZVVua25vd25GaWVsZChpbnB1dCwgdGFnKSkgewotICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgICAgc2V0U3RhdGUoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ3RybFJlcVJhZGlvU3RhdGUgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKEN0cmxSZXFSYWRpb1N0YXRlKSAobmV3IEN0cmxSZXFSYWRpb1N0YXRlKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBDdHJsUmVxUmFkaW9TdGF0ZSBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChDdHJsUmVxUmFkaW9TdGF0ZSkgKG5ldyBDdHJsUmVxUmFkaW9TdGF0ZSgpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDdHJsUnNwUmFkaW9TdGF0ZSBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIEN0cmxSc3BSYWRpb1N0YXRlKCkge30KLSAgICAKLSAgICAvLyByZXF1aXJlZCAucmlsX3Byb3RvLlJhZGlvU3RhdGUgc3RhdGUgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0ZJRUxEX05VTUJFUiA9IDE7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1N0YXRlOwotICAgIHByaXZhdGUgaW50IHN0YXRlXyA9IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SQURJT1NUQVRFX09GRjsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGF0ZSgpIHsgcmV0dXJuIGhhc1N0YXRlOyB9Ci0gICAgcHVibGljIGludCBnZXRTdGF0ZSgpIHsgcmV0dXJuIHN0YXRlXzsgfQotICAgIHB1YmxpYyBDdHJsUnNwUmFkaW9TdGF0ZSBzZXRTdGF0ZShpbnQgdmFsdWUpIHsKLSAgICAgIGhhc1N0YXRlID0gdHJ1ZTsKLSAgICAgIHN0YXRlXyA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIHB1YmxpYyBDdHJsUnNwUmFkaW9TdGF0ZSBjbGVhclN0YXRlKCkgewotICAgICAgaGFzU3RhdGUgPSBmYWxzZTsKLSAgICAgIHN0YXRlXyA9IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kcy5SQURJT1NUQVRFX09GRjsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgQ3RybFJzcFJhZGlvU3RhdGUgY2xlYXIoKSB7Ci0gICAgICBjbGVhclN0YXRlKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzU3RhdGUpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzU3RhdGUoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigxLCBnZXRTdGF0ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVkU2l6ZSgpIHsKLSAgICAgIGlmIChjYWNoZWRTaXplIDwgMCkgewotICAgICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgICAgZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjYWNoZWRTaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGhhc1N0YXRlKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgxLCBnZXRTdGF0ZSgpKTsKLSAgICAgIH0KLSAgICAgIGNhY2hlZFNpemUgPSBzaXplOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDdHJsUnNwUmFkaW9TdGF0ZSBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICAgIHNldFN0YXRlKGlucHV0LnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEN0cmxSc3BSYWRpb1N0YXRlIHBhcnNlRnJvbShieXRlW10gZGF0YSkKLSAgICAgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChDdHJsUnNwUmFkaW9TdGF0ZSkgKG5ldyBDdHJsUnNwUmFkaW9TdGF0ZSgpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ3RybFJzcFJhZGlvU3RhdGUgcGFyc2VGcm9tKAotICAgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZElucHV0U3RyZWFtTWljcm8gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoQ3RybFJzcFJhZGlvU3RhdGUpIChuZXcgQ3RybFJzcFJhZGlvU3RhdGUoKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ3RybFJlcVNldE1UQ2FsbCBleHRlbmRzCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybyB7Ci0gICAgcHVibGljIEN0cmxSZXFTZXRNVENhbGwoKSB7fQotICAgIAotICAgIC8vIHJlcXVpcmVkIHN0cmluZyBwaG9uZV9udW1iZXIgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBIT05FX05VTUJFUl9GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQaG9uZU51bWJlcjsKLSAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcGhvbmVOdW1iZXJfID0gIiI7Ci0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UGhvbmVOdW1iZXIoKSB7IHJldHVybiBwaG9uZU51bWJlcl87IH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQaG9uZU51bWJlcigpIHsgcmV0dXJuIGhhc1Bob25lTnVtYmVyOyB9Ci0gICAgcHVibGljIEN0cmxSZXFTZXRNVENhbGwgc2V0UGhvbmVOdW1iZXIoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgaGFzUGhvbmVOdW1iZXIgPSB0cnVlOwotICAgICAgcGhvbmVOdW1iZXJfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIEN0cmxSZXFTZXRNVENhbGwgY2xlYXJQaG9uZU51bWJlcigpIHsKLSAgICAgIGhhc1Bob25lTnVtYmVyID0gZmFsc2U7Ci0gICAgICBwaG9uZU51bWJlcl8gPSAiIjsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgQ3RybFJlcVNldE1UQ2FsbCBjbGVhcigpIHsKLSAgICAgIGNsZWFyUGhvbmVOdW1iZXIoKTsKLSAgICAgIGNhY2hlZFNpemUgPSAtMTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgaWYgKCFoYXNQaG9uZU51bWJlcikgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChoYXNQaG9uZU51bWJlcigpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZVN0cmluZygxLCBnZXRQaG9uZU51bWJlcigpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVkU2l6ZSgpIHsKLSAgICAgIGlmIChjYWNoZWRTaXplIDwgMCkgewotICAgICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgICAgZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjYWNoZWRTaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGhhc1Bob25lTnVtYmVyKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZVN0cmluZ1NpemUoMSwgZ2V0UGhvbmVOdW1iZXIoKSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ3RybFJlcVNldE1UQ2FsbCBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgc2V0UGhvbmVOdW1iZXIoaW5wdXQucmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEN0cmxSZXFTZXRNVENhbGwgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKEN0cmxSZXFTZXRNVENhbGwpIChuZXcgQ3RybFJlcVNldE1UQ2FsbCgpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ3RybFJlcVNldE1UQ2FsbCBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChDdHJsUmVxU2V0TVRDYWxsKSAobmV3IEN0cmxSZXFTZXRNVENhbGwoKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ3RybEhhbmd1cENvbm5SZW1vdGUgZXh0ZW5kcwotICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5NZXNzYWdlTWljcm8gewotICAgIHB1YmxpYyBDdHJsSGFuZ3VwQ29ublJlbW90ZSgpIHt9Ci0gICAgCi0gICAgLy8gcmVxdWlyZWQgaW50MzIgY29ubmVjdGlvbl9pZCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9JRF9GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNDb25uZWN0aW9uSWQ7Ci0gICAgcHJpdmF0ZSBpbnQgY29ubmVjdGlvbklkXyA9IDA7Ci0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uSWQoKSB7IHJldHVybiBjb25uZWN0aW9uSWRfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29ubmVjdGlvbklkKCkgeyByZXR1cm4gaGFzQ29ubmVjdGlvbklkOyB9Ci0gICAgcHVibGljIEN0cmxIYW5ndXBDb25uUmVtb3RlIHNldENvbm5lY3Rpb25JZChpbnQgdmFsdWUpIHsKLSAgICAgIGhhc0Nvbm5lY3Rpb25JZCA9IHRydWU7Ci0gICAgICBjb25uZWN0aW9uSWRfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIEN0cmxIYW5ndXBDb25uUmVtb3RlIGNsZWFyQ29ubmVjdGlvbklkKCkgewotICAgICAgaGFzQ29ubmVjdGlvbklkID0gZmFsc2U7Ci0gICAgICBjb25uZWN0aW9uSWRfID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICAvLyByZXF1aXJlZCBpbnQzMiBjYWxsX2ZhaWxfY2F1c2UgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExfRkFJTF9DQVVTRV9GSUVMRF9OVU1CRVIgPSAyOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNDYWxsRmFpbENhdXNlOwotICAgIHByaXZhdGUgaW50IGNhbGxGYWlsQ2F1c2VfID0gMDsKLSAgICBwdWJsaWMgaW50IGdldENhbGxGYWlsQ2F1c2UoKSB7IHJldHVybiBjYWxsRmFpbENhdXNlXzsgfQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NhbGxGYWlsQ2F1c2UoKSB7IHJldHVybiBoYXNDYWxsRmFpbENhdXNlOyB9Ci0gICAgcHVibGljIEN0cmxIYW5ndXBDb25uUmVtb3RlIHNldENhbGxGYWlsQ2F1c2UoaW50IHZhbHVlKSB7Ci0gICAgICBoYXNDYWxsRmFpbENhdXNlID0gdHJ1ZTsKLSAgICAgIGNhbGxGYWlsQ2F1c2VfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIEN0cmxIYW5ndXBDb25uUmVtb3RlIGNsZWFyQ2FsbEZhaWxDYXVzZSgpIHsKLSAgICAgIGhhc0NhbGxGYWlsQ2F1c2UgPSBmYWxzZTsKLSAgICAgIGNhbGxGYWlsQ2F1c2VfID0gMDsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgQ3RybEhhbmd1cENvbm5SZW1vdGUgY2xlYXIoKSB7Ci0gICAgICBjbGVhckNvbm5lY3Rpb25JZCgpOwotICAgICAgY2xlYXJDYWxsRmFpbENhdXNlKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzQ29ubmVjdGlvbklkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIWhhc0NhbGxGYWlsQ2F1c2UpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzQ29ubmVjdGlvbklkKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlSW50MzIoMSwgZ2V0Q29ubmVjdGlvbklkKCkpOwotICAgICAgfQotICAgICAgaWYgKGhhc0NhbGxGYWlsQ2F1c2UoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVJbnQzMigyLCBnZXRDYWxsRmFpbENhdXNlKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoaGFzQ29ubmVjdGlvbklkKCkpIHsKLSAgICAgICAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkT3V0cHV0U3RyZWFtTWljcm8KLSAgICAgICAgICAuY29tcHV0ZUludDMyU2l6ZSgxLCBnZXRDb25uZWN0aW9uSWQoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzQ2FsbEZhaWxDYXVzZSgpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVJbnQzMlNpemUoMiwgZ2V0Q2FsbEZhaWxDYXVzZSgpKTsKLSAgICAgIH0KLSAgICAgIGNhY2hlZFNpemUgPSBzaXplOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDdHJsSGFuZ3VwQ29ublJlbW90ZSBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBzZXRDb25uZWN0aW9uSWQoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgIHNldENhbGxGYWlsQ2F1c2UoaW5wdXQucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ3RybEhhbmd1cENvbm5SZW1vdGUgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKEN0cmxIYW5ndXBDb25uUmVtb3RlKSAobmV3IEN0cmxIYW5ndXBDb25uUmVtb3RlKCkubWVyZ2VGcm9tKGRhdGEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBDdHJsSGFuZ3VwQ29ublJlbW90ZSBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChDdHJsSGFuZ3VwQ29ublJlbW90ZSkgKG5ldyBDdHJsSGFuZ3VwQ29ublJlbW90ZSgpLm1lcmdlRnJvbShpbnB1dCkpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgICBwdWJsaWMgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZygpIHt9Ci0gICAgCi0gICAgLy8gcmVxdWlyZWQgYm9vbCBmbGFnID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJRUxEX05VTUJFUiA9IDE7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0ZsYWc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZsYWdfID0gZmFsc2U7Ci0gICAgcHVibGljIGJvb2xlYW4gZ2V0RmxhZygpIHsgcmV0dXJuIGZsYWdfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzRmxhZygpIHsgcmV0dXJuIGhhc0ZsYWc7IH0KLSAgICBwdWJsaWMgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyBzZXRGbGFnKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgIGhhc0ZsYWcgPSB0cnVlOwotICAgICAgZmxhZ18gPSB2YWx1ZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBwdWJsaWMgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyBjbGVhckZsYWcoKSB7Ci0gICAgICBoYXNGbGFnID0gZmFsc2U7Ci0gICAgICBmbGFnXyA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnIGNsZWFyKCkgewotICAgICAgY2xlYXJGbGFnKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzRmxhZykgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChoYXNGbGFnKCkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlQm9vbCgxLCBnZXRGbGFnKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBjYWNoZWRTaXplID0gLTE7Ci0gICAgcHVibGljIGludCBnZXRDYWNoZWRTaXplKCkgewotICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplIHNldHMgY2FjaGVkU2l6ZQotICAgICAgICBnZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoaGFzRmxhZygpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVCb29sU2l6ZSgxLCBnZXRGbGFnKCkpOwotICAgICAgfQotICAgICAgY2FjaGVkU2l6ZSA9IHNpemU7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcgbWVyZ2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB0YWcpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgc2V0RmxhZyhpbnB1dC5yZWFkQm9vbCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5JbnZhbGlkUHJvdG9jb2xCdWZmZXJNaWNyb0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcpIChuZXcgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZygpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZyBwYXJzZUZyb20oCi0gICAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkNvZGVkSW5wdXRTdHJlYW1NaWNybyBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIChDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKSAobmV3IEN0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcoKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ3RybFJlcUFkZERpYWxpbmdDYWxsIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvIHsKLSAgICBwdWJsaWMgQ3RybFJlcUFkZERpYWxpbmdDYWxsKCkge30KLSAgICAKLSAgICAvLyByZXF1aXJlZCBzdHJpbmcgcGhvbmVfbnVtYmVyID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSE9ORV9OVU1CRVJfRklFTERfTlVNQkVSID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUGhvbmVOdW1iZXI7Ci0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHBob25lTnVtYmVyXyA9ICIiOwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBob25lTnVtYmVyKCkgeyByZXR1cm4gcGhvbmVOdW1iZXJfOyB9Ci0gICAgcHVibGljIGJvb2xlYW4gaGFzUGhvbmVOdW1iZXIoKSB7IHJldHVybiBoYXNQaG9uZU51bWJlcjsgfQotICAgIHB1YmxpYyBDdHJsUmVxQWRkRGlhbGluZ0NhbGwgc2V0UGhvbmVOdW1iZXIoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgaGFzUGhvbmVOdW1iZXIgPSB0cnVlOwotICAgICAgcGhvbmVOdW1iZXJfID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgcHVibGljIEN0cmxSZXFBZGREaWFsaW5nQ2FsbCBjbGVhclBob25lTnVtYmVyKCkgewotICAgICAgaGFzUGhvbmVOdW1iZXIgPSBmYWxzZTsKLSAgICAgIHBob25lTnVtYmVyXyA9ICIiOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBDdHJsUmVxQWRkRGlhbGluZ0NhbGwgY2xlYXIoKSB7Ci0gICAgICBjbGVhclBob25lTnVtYmVyKCk7Ci0gICAgICBjYWNoZWRTaXplID0gLTE7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmICghaGFzUGhvbmVOdW1iZXIpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRPdXRwdXRTdHJlYW1NaWNybyBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaGFzUGhvbmVOdW1iZXIoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcoMSwgZ2V0UGhvbmVOdW1iZXIoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGNhY2hlZFNpemUgPSAtMTsKLSAgICBwdWJsaWMgaW50IGdldENhY2hlZFNpemUoKSB7Ci0gICAgICBpZiAoY2FjaGVkU2l6ZSA8IDApIHsKLSAgICAgICAgLy8gZ2V0U2VyaWFsaXplZFNpemUgc2V0cyBjYWNoZWRTaXplCi0gICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2FjaGVkU2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChoYXNQaG9uZU51bWJlcigpKSB7Ci0gICAgICAgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5Db2RlZE91dHB1dFN0cmVhbU1pY3JvCi0gICAgICAgICAgLmNvbXB1dGVTdHJpbmdTaXplKDEsIGdldFBob25lTnVtYmVyKCkpOwotICAgICAgfQotICAgICAgY2FjaGVkU2l6ZSA9IHNpemU7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEN0cmxSZXFBZGREaWFsaW5nQ2FsbCBtZXJnZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHRhZykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgc2V0UGhvbmVOdW1iZXIoaW5wdXQucmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEN0cmxSZXFBZGREaWFsaW5nQ2FsbCBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoQ3RybFJlcUFkZERpYWxpbmdDYWxsKSAobmV3IEN0cmxSZXFBZGREaWFsaW5nQ2FsbCgpLm1lcmdlRnJvbShkYXRhKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ3RybFJlcUFkZERpYWxpbmdDYWxsIHBhcnNlRnJvbSgKLSAgICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uQ29kZWRJbnB1dFN0cmVhbU1pY3JvIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKEN0cmxSZXFBZGREaWFsaW5nQ2FsbCkgKG5ldyBDdHJsUmVxQWRkRGlhbGluZ0NhbGwoKS5tZXJnZUZyb20oaW5wdXQpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL3B5dGhvbi9jdHJsX3BiMi5weSBiL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvcHl0aG9uL2N0cmxfcGIyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWE3N2IxLi4wMDAwMDAwCi0tLSBhL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvcHl0aG9uL2N0cmxfcGIyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLSMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCi0jIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQotCi0KLURFU0NSSVBUT1IgPSBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAotICBuYW1lPSdjdHJsLnByb3RvJywKLSAgcGFja2FnZT0ncmlsX3Byb3RvJywKLSAgc2VyaWFsaXplZF9wYj0nXG5cbmN0cmwucHJvdG9ceDEyXHRyaWxfcHJvdG9ceDFhXHRyaWwucHJvdG9cIjlcblx4MTFceDQzdHJsUmVxUmFkaW9TdGF0ZVx4MTIkXG5ceDA1c3RhdGVceDE4XHgwMSBceDAyKFx4MGVceDMyXHgxNS5yaWxfcHJvdG8uUmFkaW9TdGF0ZVwiOVxuXHgxMVx4NDN0cmxSc3BSYWRpb1N0YXRlXHgxMiRcblx4MDVzdGF0ZVx4MThceDAxIFx4MDIoXHgwZVx4MzJceDE1LnJpbF9wcm90by5SYWRpb1N0YXRlXCIoXG5ceDEwXHg0M3RybFJlcVNldE1UQ2FsbFx4MTJceDE0XG5ceDBjcGhvbmVfbnVtYmVyXHgxOFx4MDEgXHgwMihcdFwiRlxuXHgxNFx4NDN0cmxIYW5ndXBDb25uUmVtb3RlXHgxMlx4MTVcblxyY29ubmVjdGlvbl9pZFx4MThceDAxIFx4MDIoXHgwNVx4MTJceDE3XG5ceDBmXHg2M1x4NjFsbF9mYWlsX2NhdXNlXHgxOFx4MDIgXHgwMihceDA1XCIpXG5ceDE5XHg0M3RybFNldENhbGxUcmFuc2l0aW9uRmxhZ1x4MTJceDBjXG5ceDA0XHg2NmxhZ1x4MThceDAxIFx4MDIoXHgwOFwiLVxuXHgxNVx4NDN0cmxSZXFBZGREaWFsaW5nQ2FsbFx4MTJceDE0XG5ceDBjcGhvbmVfbnVtYmVyXHgxOFx4MDEgXHgwMihcdCpceDlhXHgwMlxuXHgwN1x4NDN0cmxDbWRceDEyXHgxMVxuXHJDVFJMX0NNRF9FQ0hPXHgxMFx4MDBceDEyXHgxY1xuXHgxOFx4NDNUUkxfQ01EX0dFVF9SQURJT19TVEFURVx4MTBceDAxXHgxMlx4MWNcblx4MThceDQzVFJMX0NNRF9TRVRfUkFESU9fU1RBVEVceDEwXHgwMlx4MTJceDE5XG5ceDE0XHg0M1RSTF9DTURfU0VUX01UX0NBTExceDEwXHhlOVx4MDdceDEyIFxuXHgxYlx4NDNUUkxfQ01EX0hBTkdVUF9DT05OX1JFTU9URVx4MTBceGVhXHgwN1x4MTImXG4hQ1RSTF9DTURfU0VUX0NBTExfVFJBTlNJVElPTl9GTEFHXHgxMFx4ZWJceDA3XHgxMlx4MWNcblx4MTdceDQzVFJMX0NNRF9TRVRfQ0FMTF9BTEVSVFx4MTBceGVjXHgwN1x4MTJceDFkXG5ceDE4XHg0M1RSTF9DTURfU0VUX0NBTExfQUNUSVZFXHgxMFx4ZWRceDA3XHgxMlx4MWVcblx4MTlceDQzVFJMX0NNRF9BRERfRElBTElOR19DQUxMXHgxMFx4ZWVceDA3KjVcblxuQ3RybFN0YXR1c1x4MTJceDEyXG5ceDBlXHg0M1RSTF9TVEFUVVNfT0tceDEwXHgwMFx4MTJceDEzXG5ceDBmXHg0M1RSTF9TVEFUVVNfRVJSXHgxMFx4MDFceDQyXHgzN1xuKGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG9CXHgwYlJpbEN0cmxDbWRzJykKLQotX0NUUkxDTUQgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdDdHJsQ21kJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uQ3RybENtZCcsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgdmFsdWVzPVsKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdDVFJMX0NNRF9FQ0hPJywgaW5kZXg9MCwgbnVtYmVyPTAsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0NUUkxfQ01EX0dFVF9SQURJT19TVEFURScsIGluZGV4PTEsIG51bWJlcj0xLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdDVFJMX0NNRF9TRVRfUkFESU9fU1RBVEUnLCBpbmRleD0yLCBudW1iZXI9MiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQ1RSTF9DTURfU0VUX01UX0NBTEwnLCBpbmRleD0zLCBudW1iZXI9MTAwMSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQ1RSTF9DTURfSEFOR1VQX0NPTk5fUkVNT1RFJywgaW5kZXg9NCwgbnVtYmVyPTEwMDIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0NUUkxfQ01EX1NFVF9DQUxMX1RSQU5TSVRJT05fRkxBRycsIGluZGV4PTUsIG51bWJlcj0xMDAzLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdDVFJMX0NNRF9TRVRfQ0FMTF9BTEVSVCcsIGluZGV4PTYsIG51bWJlcj0xMDA0LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdDVFJMX0NNRF9TRVRfQ0FMTF9BQ1RJVkUnLCBpbmRleD03LCBudW1iZXI9MTAwNSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQ1RSTF9DTURfQUREX0RJQUxJTkdfQ0FMTCcsIGluZGV4PTgsIG51bWJlcj0xMDA2LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0zNTksCi0gIHNlcmlhbGl6ZWRfZW5kPTY0MSwKLSkKLQotCi1fQ1RSTFNUQVRVUyA9IGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCi0gIG5hbWU9J0N0cmxTdGF0dXMnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5DdHJsU3RhdHVzJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICB2YWx1ZXM9WwotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0NUUkxfU1RBVFVTX09LJywgaW5kZXg9MCwgbnVtYmVyPTAsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0NUUkxfU1RBVFVTX0VSUicsIGluZGV4PTEsIG51bWJlcj0xLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD02NDMsCi0gIHNlcmlhbGl6ZWRfZW5kPTY5NiwKLSkKLQotCi1DVFJMX0NNRF9FQ0hPID0gMAotQ1RSTF9DTURfR0VUX1JBRElPX1NUQVRFID0gMQotQ1RSTF9DTURfU0VUX1JBRElPX1NUQVRFID0gMgotQ1RSTF9DTURfU0VUX01UX0NBTEwgPSAxMDAxCi1DVFJMX0NNRF9IQU5HVVBfQ09OTl9SRU1PVEUgPSAxMDAyCi1DVFJMX0NNRF9TRVRfQ0FMTF9UUkFOU0lUSU9OX0ZMQUcgPSAxMDAzCi1DVFJMX0NNRF9TRVRfQ0FMTF9BTEVSVCA9IDEwMDQKLUNUUkxfQ01EX1NFVF9DQUxMX0FDVElWRSA9IDEwMDUKLUNUUkxfQ01EX0FERF9ESUFMSU5HX0NBTEwgPSAxMDA2Ci1DVFJMX1NUQVRVU19PSyA9IDAKLUNUUkxfU1RBVFVTX0VSUiA9IDEKLQotCi0KLV9DVFJMUkVRUkFESU9TVEFURSA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nQ3RybFJlcVJhZGlvU3RhdGUnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5DdHJsUmVxUmFkaW9TdGF0ZScsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdzdGF0ZScsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLkN0cmxSZXFSYWRpb1N0YXRlLnN0YXRlJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0yLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgc2VyaWFsaXplZF9zdGFydD0zNiwKLSAgc2VyaWFsaXplZF9lbmQ9OTMsCi0pCi0KLQotX0NUUkxSU1BSQURJT1NUQVRFID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdDdHJsUnNwUmFkaW9TdGF0ZScsCi0gIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLkN0cmxSc3BSYWRpb1N0YXRlJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3N0YXRlJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uQ3RybFJzcFJhZGlvU3RhdGUuc3RhdGUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTIsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTk1LAotICBzZXJpYWxpemVkX2VuZD0xNTIsCi0pCi0KLQotX0NUUkxSRVFTRVRNVENBTEwgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0N0cmxSZXFTZXRNVENhbGwnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5DdHJsUmVxU2V0TVRDYWxsJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3Bob25lX251bWJlcicsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLkN0cmxSZXFTZXRNVENhbGwucGhvbmVfbnVtYmVyJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTIsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgc2VyaWFsaXplZF9zdGFydD0xNTQsCi0gIHNlcmlhbGl6ZWRfZW5kPTE5NCwKLSkKLQotCi1fQ1RSTEhBTkdVUENPTk5SRU1PVEUgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0N0cmxIYW5ndXBDb25uUmVtb3RlJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uQ3RybEhhbmd1cENvbm5SZW1vdGUnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nY29ubmVjdGlvbl9pZCcsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLkN0cmxIYW5ndXBDb25uUmVtb3RlLmNvbm5lY3Rpb25faWQnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MiwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdjYWxsX2ZhaWxfY2F1c2UnLCBmdWxsX25hbWU9J3JpbF9wcm90by5DdHJsSGFuZ3VwQ29ublJlbW90ZS5jYWxsX2ZhaWxfY2F1c2UnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MiwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTk2LAotICBzZXJpYWxpemVkX2VuZD0yNjYsCi0pCi0KLQotX0NUUkxTRVRDQUxMVFJBTlNJVElPTkZMQUcgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0N0cmxTZXRDYWxsVHJhbnNpdGlvbkZsYWcnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5DdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2ZsYWcnLCBmdWxsX25hbWU9J3JpbF9wcm90by5DdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnLmZsYWcnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MiwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTI2OCwKLSAgc2VyaWFsaXplZF9lbmQ9MzA5LAotKQotCi0KLV9DVFJMUkVRQURERElBTElOR0NBTEwgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0N0cmxSZXFBZGREaWFsaW5nQ2FsbCcsCi0gIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLkN0cmxSZXFBZGREaWFsaW5nQ2FsbCcsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdwaG9uZV9udW1iZXInLCBmdWxsX25hbWU9J3JpbF9wcm90by5DdHJsUmVxQWRkRGlhbGluZ0NhbGwucGhvbmVfbnVtYmVyJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTIsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgc2VyaWFsaXplZF9zdGFydD0zMTEsCi0gIHNlcmlhbGl6ZWRfZW5kPTM1NiwKLSkKLQotaW1wb3J0IHJpbF9wYjIKLQotX0NUUkxSRVFSQURJT1NUQVRFLmZpZWxkc19ieV9uYW1lWydzdGF0ZSddLmVudW1fdHlwZSA9IHJpbF9wYjIuX1JBRElPU1RBVEUKLV9DVFJMUlNQUkFESU9TVEFURS5maWVsZHNfYnlfbmFtZVsnc3RhdGUnXS5lbnVtX3R5cGUgPSByaWxfcGIyLl9SQURJT1NUQVRFCi0KLWNsYXNzIEN0cmxSZXFSYWRpb1N0YXRlKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9DVFJMUkVRUkFESU9TVEFURQotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLkN0cmxSZXFSYWRpb1N0YXRlKQotCi1jbGFzcyBDdHJsUnNwUmFkaW9TdGF0ZShtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfQ1RSTFJTUFJBRElPU1RBVEUKLSAgCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5DdHJsUnNwUmFkaW9TdGF0ZSkKLQotY2xhc3MgQ3RybFJlcVNldE1UQ2FsbChtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfQ1RSTFJFUVNFVE1UQ0FMTAotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLkN0cmxSZXFTZXRNVENhbGwpCi0KLWNsYXNzIEN0cmxIYW5ndXBDb25uUmVtb3RlKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9DVFJMSEFOR1VQQ09OTlJFTU9URQotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLkN0cmxIYW5ndXBDb25uUmVtb3RlKQotCi1jbGFzcyBDdHJsU2V0Q2FsbFRyYW5zaXRpb25GbGFnKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9DVFJMU0VUQ0FMTFRSQU5TSVRJT05GTEFHCi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uQ3RybFNldENhbGxUcmFuc2l0aW9uRmxhZykKLQotY2xhc3MgQ3RybFJlcUFkZERpYWxpbmdDYWxsKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9DVFJMUkVRQURERElBTElOR0NBTEwKLSAgCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5DdHJsUmVxQWRkRGlhbGluZ0NhbGwpCi0KLSMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1vZHVsZV9zY29wZSkKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvcHl0aG9uL21zZ2hlYWRlcl9wYjIucHkgYi9tb2NrLXJpbC9zcmMvZ2VuZXJhdGVkL3B5dGhvbi9tc2doZWFkZXJfcGIyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjcwY2M5Li4wMDAwMDAwCi0tLSBhL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvcHl0aG9uL21zZ2hlYWRlcl9wYjIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb24KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgotIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKLQotCi1ERVNDUklQVE9SID0gZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcigKLSAgbmFtZT0nbXNnaGVhZGVyLnByb3RvJywKLSAgcGFja2FnZT0nY29tbXVuaWNhdGlvbicsCi0gIHNlcmlhbGl6ZWRfcGI9J1xuXHgwZm1zZ2hlYWRlci5wcm90b1x4MTJccmNvbW11bmljYXRpb25cIkxcblx0TXNnSGVhZGVyXHgxMlx4MGJcblx4MDNceDYzbWRceDE4XHgwMSBceDAyKFxyXHgxMlx4MTNcblx4MGJsZW5ndGhfZGF0YVx4MThceDAyIFx4MDIoXHJceDEyXHgwZVxuXHgwNnN0YXR1c1x4MThceDAzIFx4MDEoXHJceDEyXHJcblx4MDV0b2tlblx4MThceDA0IFx4MDEoXHgwNFx4NDIkXG5cImNvbS5hbmRyb2lkLmludGVybmFsLmNvbW11bmljYXRpb24nKQotCi0KLQotCi1fTVNHSEVBREVSID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdNc2dIZWFkZXInLAotICBmdWxsX25hbWU9J2NvbW11bmljYXRpb24uTXNnSGVhZGVyJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2NtZCcsIGZ1bGxfbmFtZT0nY29tbXVuaWNhdGlvbi5Nc2dIZWFkZXIuY21kJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTEzLCBjcHBfdHlwZT0zLCBsYWJlbD0yLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2xlbmd0aF9kYXRhJywgZnVsbF9uYW1lPSdjb21tdW5pY2F0aW9uLk1zZ0hlYWRlci5sZW5ndGhfZGF0YScsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MiwgdHlwZT0xMywgY3BwX3R5cGU9MywgbGFiZWw9MiwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdzdGF0dXMnLCBmdWxsX25hbWU9J2NvbW11bmljYXRpb24uTXNnSGVhZGVyLnN0YXR1cycsIGluZGV4PTIsCi0gICAgICBudW1iZXI9MywgdHlwZT0xMywgY3BwX3R5cGU9MywgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd0b2tlbicsIGZ1bGxfbmFtZT0nY29tbXVuaWNhdGlvbi5Nc2dIZWFkZXIudG9rZW4nLCBpbmRleD0zLAotICAgICAgbnVtYmVyPTQsIHR5cGU9NCwgY3BwX3R5cGU9NCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MzQsCi0gIHNlcmlhbGl6ZWRfZW5kPTExMCwKLSkKLQotCi0KLWNsYXNzIE1zZ0hlYWRlcihtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfTVNHSEVBREVSCi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpjb21tdW5pY2F0aW9uLk1zZ0hlYWRlcikKLQotIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobW9kdWxlX3Njb3BlKQpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9weXRob24vcmlsX3BiMi5weSBiL21vY2stcmlsL3NyYy9nZW5lcmF0ZWQvcHl0aG9uL3JpbF9wYjIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OGZmYmIuLjAwMDAwMDAKLS0tIGEvbW9jay1yaWwvc3JjL2dlbmVyYXRlZC9weXRob24vcmlsX3BiMi5weQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDEgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKLSMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCi0KLQotREVTQ1JJUFRPUiA9IGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoCi0gIG5hbWU9J3JpbC5wcm90bycsCi0gIHBhY2thZ2U9J3JpbF9wcm90bycsCi0gIHNlcmlhbGl6ZWRfcGI9J1xuXHRyaWwucHJvdG9ceDEyXHRyaWxfcHJvdG9cIlx4OWFceDAyXG5ceDBjUmlsQXBwU3RhdHVzXHgxMlwnXG5ceDA4XHg2MXBwX3R5cGVceDE4XHgwMSBceDAxKFx4MGVceDMyXHgxNS5yaWxfcHJvdG8uUmlsQXBwVHlwZVx4MTIpXG5cdGFwcF9zdGF0ZVx4MThceDAyIFx4MDEoXHgwZVx4MzJceDE2LnJpbF9wcm90by5SaWxBcHBTdGF0ZVx4MTJceDMzXG5ceDBlcGVyc29fc3Vic3RhdGVceDE4XHgwMyBceDAxKFx4MGVceDMyXHgxYi5yaWxfcHJvdG8uUmlsUGVyc29TdWJzdGF0ZVx4MTJceDBiXG5ceDAzXHg2MWlkXHgxOFx4MDQgXHgwMShcdFx4MTJceDExXG5cdGFwcF9sYWJlbFx4MThceDA1IFx4MDEoXHRceDEyXHgxNVxuXHJwaW4xX3JlcGxhY2VkXHgxOFx4MDYgXHgwMShceDA1XHgxMiRcblx4MDRwaW4xXHgxOFx4MDcgXHgwMShceDBlXHgzMlx4MTYucmlsX3Byb3RvLlJpbFBpblN0YXRlXHgxMiRcblx4MDRwaW4yXHgxOFx4MDggXHgwMShceDBlXHgzMlx4MTYucmlsX3Byb3RvLlJpbFBpblN0YXRlXCJceDg4XHgwMlxuXHJSaWxDYXJkU3RhdHVzXHgxMitcblxuY2FyZF9zdGF0ZVx4MThceDAxIFx4MDEoXHgwZVx4MzJceDE3LnJpbF9wcm90by5SaWxDYXJkU3RhdGVceDEyXHgzM1xuXHgxM3VuaXZlcnNhbF9waW5fc3RhdGVceDE4XHgwMiBceDAxKFx4MGVceDMyXHgxNi5yaWxfcHJvdG8uUmlsUGluU3RhdGVceDEyXCdcblx4MWZnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4XHgxOFx4MDMgXHgwMShceDA1XHgxMiNcblx4MWJceDYzXHg2NG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXhceDE4XHgwNCBceDAxKFx4MDVceDEyXHgxOFxuXHgxMG51bV9hcHBsaWNhdGlvbnNceDE4XHgwNSBceDAxKFx4MDVceDEyLVxuXHgwY1x4NjFwcGxpY2F0aW9uc1x4MThceDA2IFx4MDMoXHgwYlx4MzJceDE3LnJpbF9wcm90by5SaWxBcHBTdGF0dXNcIlx4ODJceDAxXG5cblJpbFV1c0luZm9ceDEyXCdcblx4MDh1dXNfdHlwZVx4MThceDAxIFx4MDEoXHgwZVx4MzJceDE1LnJpbF9wcm90by5SaWxVdXNUeXBlXHgxMiVcblx4MDd1dXNfZGNzXHgxOFx4MDIgXHgwMShceDBlXHgzMlx4MTQucmlsX3Byb3RvLlJpbFV1c0Rjc1x4MTJceDEyXG5cbnV1c19sZW5ndGhceDE4XHgwMyBceDAxKFx4MDVceDEyXHgxMFxuXHgwOHV1c19kYXRhXHgxOFx4MDQgXHgwMShcdFwiXHhhNVx4MDJcblx4MDdSaWxDYWxsXHgxMiZcblx4MDVzdGF0ZVx4MThceDAxIFx4MDEoXHgwZVx4MzJceDE3LnJpbF9wcm90by5SaWxDYWxsU3RhdGVceDEyXHJcblx4MDVpbmRleFx4MThceDAyIFx4MDEoXHgwNVx4MTJceDBiXG5ceDAzdG9hXHgxOFx4MDMgXHgwMShceDA1XHgxMlx4MGZcblx4MDdpc19tcHR5XHgxOFx4MDQgXHgwMShceDA4XHgxMlxyXG5ceDA1aXNfbXRceDE4XHgwNSBceDAxKFx4MDhceDEyXHgwYlxuXHgwM1x4NjFsc1x4MThceDA2IFx4MDEoXHgwNVx4MTJceDEwXG5ceDA4aXNfdm9pY2VceDE4XHgwNyBceDAxKFx4MDhceDEyXHgxOFxuXHgxMGlzX3ZvaWNlX3ByaXZhY3lceDE4XHgwOCBceDAxKFx4MDhceDEyXHgwZVxuXHgwNm51bWJlclx4MThcdCBceDAxKFx0XHgxMlx4MWJcblx4MTNudW1iZXJfcHJlc2VudGF0aW9uXHgxOFxuIFx4MDEoXHgwNVx4MTJceDBjXG5ceDA0bmFtZVx4MThceDBiIFx4MDEoXHRceDEyXHgxOVxuXHgxMW5hbWVfcHJlc2VudGF0aW9uXHgxOFx4MGMgXHgwMShceDA1XHgxMlwnXG5ceDA4dXVzX2luZm9ceDE4XHIgXHgwMShceDBiXHgzMlx4MTUucmlsX3Byb3RvLlJpbFV1c0luZm9cIkZcblx4MTNSSUxHV1NpZ25hbFN0cmVuZ3RoXHgxMlx4MTdcblx4MGZzaWduYWxfc3RyZW5ndGhceDE4XHgwMSBceDAxKFx4MDVceDEyXHgxNlxuXHgwZVx4NjJpdF9lcnJvcl9yYXRlXHgxOFx4MDIgXHgwMShceDA1XCIyXG5ceDE1UklMQ0RNQVNpZ25hbFN0cmVuZ3RoXHgxMlx4MGJcblx4MDNceDY0XHg2Mm1ceDE4XHgwMSBceDAxKFx4MDVceDEyXHgwY1xuXHgwNFx4NjVceDYzaW9ceDE4XHgwMiBceDAxKFx4MDVcIk5cblx4MTVSSUxFVkRPU2lnbmFsU3RyZW5ndGhceDEyXHgwYlxuXHgwM1x4NjRceDYybVx4MThceDAxIFx4MDEoXHgwNVx4MTJceDBjXG5ceDA0XHg2NVx4NjNpb1x4MThceDAyIFx4MDEoXHgwNVx4MTJceDFhXG5ceDEyc2lnbmFsX25vaXNlX3JhdGlvXHgxOFx4MDMgXHgwMShceDA1XCJceDFkXG5cblJzcFN0cmluZ3NceDEyXHgwZlxuXHgwN3N0cmluZ3NceDE4XHgwMSBceDAzKFx0XCJceDFmXG5ceDBiUnNwSW50ZWdlcnNceDEyXHgxMFxuXHgwOGludGVnZXJzXHgxOFx4MDEgXHgwMyhceDA1XCJAXG5ceDBmUnNwR2V0U2ltU3RhdHVzXHgxMi1cblx4MGJceDYzXHg2MXJkX3N0YXR1c1x4MThceDAxIFx4MDIoXHgwYlx4MzJceDE4LnJpbF9wcm90by5SaWxDYXJkU3RhdHVzXCJceDFkXG5ceDBlUmVxRW50ZXJTaW1QaW5ceDEyXHgwYlxuXHgwM3Bpblx4MThceDAxIFx4MDIoXHRcIitcblx4MGVSc3BFbnRlclNpbVBpblx4MTJceDE5XG5ceDExcmV0cmllc19yZW1haW5pbmdceDE4XHgwMSBceDAyKFx4MDVcIjdcblx4MTJSc3BHZXRDdXJyZW50Q2FsbHNceDEyIVxuXHgwNVx4NjNceDYxbGxzXHgxOFx4MDEgXHgwMyhceDBiXHgzMlx4MTIucmlsX3Byb3RvLlJpbENhbGxcIlFcblx4MDdSZXFEaWFsXHgxMlx4MGZcblx4MDdceDYxXHg2NFx4NjRyZXNzXHgxOFx4MDEgXHgwMShcdFx4MTJceDBjXG5ceDA0XHg2M2xpclx4MThceDAyIFx4MDEoXHgwNVx4MTJcJ1xuXHgwOHV1c19pbmZvXHgxOFx4MDMgXHgwMShceDBiXHgzMlx4MTUucmlsX3Byb3RvLlJpbFV1c0luZm9cIiVcblx0UmVxSGFuZ1VwXHgxMlx4MThcblx4MTBceDYzb25uZWN0aW9uX2luZGV4XHgxOFx4MDEgXHgwMihceDA1XCI0XG5ceDE0UnNwTGFzdENhbGxGYWlsQ2F1c2VceDEyXHgxY1xuXHgxNGxhc3RfY2FsbF9mYWlsX2NhdXNlXHgxOFx4MDEgXHgwMihceDA1XCJceGNjXHgwMVxuXHgxMVJzcFNpZ25hbFN0cmVuZ3RoXHgxMlx4Mzlcblx4MTFnd19zaWduYWxzdHJlbmd0aFx4MThceDAxIFx4MDEoXHgwYlx4MzJceDFlLnJpbF9wcm90by5SSUxHV1NpZ25hbFN0cmVuZ3RoXHgxMj1cblx4MTNceDYzXHg2NG1hX3NpZ25hbHN0cmVuZ3RoXHgxOFx4MDIgXHgwMShceDBiXHgzMiAucmlsX3Byb3RvLlJJTENETUFTaWduYWxTdHJlbmd0aFx4MTI9XG5ceDEzXHg2NXZkb19zaWduYWxzdHJlbmd0aFx4MThceDAzIFx4MDEoXHgwYlx4MzIgLnJpbF9wcm90by5SSUxFVkRPU2lnbmFsU3RyZW5ndGhcIk9cblx4MGJSc3BPcGVyYXRvclx4MTJceDE2XG5ceDBlbG9uZ19hbHBoYV9vbnNceDE4XHgwMSBceDAxKFx0XHgxMlx4MTdcblx4MGZzaG9ydF9hbHBoYV9vbnNceDE4XHgwMiBceDAxKFx0XHgxMlx4MGZcblx4MDdtY2NfbW5jXHgxOFx4MDMgXHgwMShcdFwiJlxuXHgxNVJlcVNlcGFyYXRlQ29ubmVjdGlvblx4MTJcclxuXHgwNWluZGV4XHgxOFx4MDEgXHgwMihceDA1XCJceDFiXG5cblJlcVNldE11dGVceDEyXHJcblx4MDVzdGF0ZVx4MThceDAxIFx4MDIoXHgwOFwiXHgxZlxuXHgwZVJlcVNjcmVlblN0YXRlXHgxMlxyXG5ceDA1c3RhdGVceDE4XHgwMSBceDAyKFx4MDgqXHhhZlx4MDJcblxuUmFkaW9TdGF0ZVx4MTJceDEyXG5ceDBlUkFESU9TVEFURV9PRkZceDEwXHgwMFx4MTJceDFhXG5ceDE2UkFESU9TVEFURV9VTkFWQUlMQUJMRVx4MTBceDAxXHgxMlx4MWNcblx4MThSQURJT1NUQVRFX1NJTV9OT1RfUkVBRFlceDEwXHgwMlx4MTIjXG5ceDFmUkFESU9TVEFURV9TSU1fTE9DS0VEX09SX0FCU0VOVFx4MTBceDAzXHgxMlx4MThcblx4MTRSQURJT1NUQVRFX1NJTV9SRUFEWVx4MTBceDA0XHgxMlx4MWRcblx4MTlSQURJT1NUQVRFX1JVSU1fTk9UX1JFQURZXHgxMFx4MDVceDEyXHgxOVxuXHgxNVJBRElPU1RBVEVfUlVJTV9SRUFEWVx4MTBceDA2XHgxMiRcbiBSQURJT1NUQVRFX1JVSU1fTE9DS0VEX09SX0FCU0VOVFx4MTBceDA3XHgxMlx4MWJcblx4MTdSQURJT1NUQVRFX05WX05PVF9SRUFEWVx4MTBceDA4XHgxMlx4MTdcblx4MTNSQURJT1NUQVRFX05WX1JFQURZXHgxMFx0KlBcblx4MGNSaWxDYXJkU3RhdGVceDEyXHgxNFxuXHgxMFx4NDNceDQxUkRTVEFURV9BQlNFTlRceDEwXHgwMFx4MTJceDE1XG5ceDExXHg0M1x4NDFSRFNUQVRFX1BSRVNFTlRceDEwXHgwMVx4MTJceDEzXG5ceDBmXHg0M1x4NDFSRFNUQVRFX0VSUk9SXHgxMFx4MDIqXHhmMVx4MDZcblx4MTBSaWxQZXJzb1N1YnN0YXRlXHgxMlx4MTlcblx4MTVQRVJTT1NVQlNUQVRFX1VOS05PV05ceDEwXHgwMFx4MTJceDFkXG5ceDE5UEVSU09TVUJTVEFURV9JTl9QUk9HUkVTU1x4MTBceDAxXHgxMlx4MTdcblx4MTNQRVJTT1NVQlNUQVRFX1JFQURZXHgxMFx4MDJceDEyXHgxZFxuXHgxOVBFUlNPU1VCU1RBVEVfU0lNX05FVFdPUktceDEwXHgwM1x4MTIkXG4gUEVSU09TVUJTVEFURV9TSU1fTkVUV09SS19TVUJTRVRceDEwXHgwNFx4MTJceDFmXG5ceDFiUEVSU09TVUJTVEFURV9TSU1fQ09SUE9SQVRFXHgxMFx4MDVceDEyJlxuXCJQRVJTT1NVQlNUQVRFX1NJTV9TRVJWSUNFX1BST1ZJREVSXHgxMFx4MDZceDEyXHgxOVxuXHgxNVBFUlNPU1VCU1RBVEVfU0lNX1NJTVx4MTBceDA3XHgxMiFcblx4MWRQRVJTT1NVQlNUQVRFX1NJTV9ORVRXT1JLX1BVS1x4MTBceDA4XHgxMihcbiRQRVJTT1NVQlNUQVRFX1NJTV9ORVRXT1JLX1NVQlNFVF9QVUtceDEwXHRceDEyI1xuXHgxZlBFUlNPU1VCU1RBVEVfU0lNX0NPUlBPUkFURV9QVUtceDEwXG5ceDEyKlxuJlBFUlNPU1VCU1RBVEVfU0lNX1NFUlZJQ0VfUFJPVklERVJfUFVLXHgxMFx4MGJceDEyXHgxZFxuXHgxOVBFUlNPU1VCU1RBVEVfU0lNX1NJTV9QVUtceDEwXHgwY1x4MTJceDFmXG5ceDFiUEVSU09TVUJTVEFURV9SVUlNX05FVFdPUksxXHgxMFxyXHgxMlx4MWZcblx4MWJQRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzJceDEwXHgwZVx4MTJceDFiXG5ceDE3UEVSU09TVUJTVEFURV9SVUlNX0hSUERceDEwXHgwZlx4MTIgXG5ceDFjUEVSU09TVUJTVEFURV9SVUlNX0NPUlBPUkFURVx4MTBceDEwXHgxMlwnXG4jUEVSU09TVUJTVEFURV9SVUlNX1NFUlZJQ0VfUFJPVklERVJceDEwXHgxMVx4MTJceDFiXG5ceDE3UEVSU09TVUJTVEFURV9SVUlNX1JVSU1ceDEwXHgxMlx4MTIjXG5ceDFmUEVSU09TVUJTVEFURV9SVUlNX05FVFdPUksxX1BVS1x4MTBceDEzXHgxMiNcblx4MWZQRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzJfUFVLXHgxMFx4MTRceDEyXHgxZlxuXHgxYlBFUlNPU1VCU1RBVEVfUlVJTV9IUlBEX1BVS1x4MTBceDE1XHgxMiRcbiBQRVJTT1NVQlNUQVRFX1JVSU1fQ09SUE9SQVRFX1BVS1x4MTBceDE2XHgxMitcblwnUEVSU09TVUJTVEFURV9SVUlNX1NFUlZJQ0VfUFJPVklERVJfUFVLXHgxMFx4MTdceDEyXHgxZlxuXHgxYlBFUlNPU1VCU1RBVEVfUlVJTV9SVUlNX1BVS1x4MTBceDE4Klx4OTNceDAxXG5ceDBiUmlsQXBwU3RhdGVceDEyXHgxNFxuXHgxMFx4NDFQUFNUQVRFX1VOS05PV05ceDEwXHgwMFx4MTJceDE1XG5ceDExXHg0MVBQU1RBVEVfREVURUNURURceDEwXHgwMVx4MTJceDEwXG5ceDBjXHg0MVBQU1RBVEVfUElOXHgxMFx4MDJceDEyXHgxMFxuXHgwY1x4NDFQUFNUQVRFX1BVS1x4MTBceDAzXHgxMlx4MWZcblx4MWJceDQxUFBTVEFURV9TVUJTQ1JJUFRJT05fUEVSU09ceDEwXHgwNFx4MTJceDEyXG5ceDBlXHg0MVBQU1RBVEVfUkVBRFlceDEwXHgwNSpceGJkXHgwMVxuXHgwYlJpbFBpblN0YXRlXHgxMlx4MTRcblx4MTBQSU5TVEFURV9VTktOT1dOXHgxMFx4MDBceDEyIVxuXHgxZFBJTlNUQVRFX0VOQUJMRURfTk9UX1ZFUklGSUVEXHgxMFx4MDFceDEyXHgxZFxuXHgxOVBJTlNUQVRFX0VOQUJMRURfVkVSSUZJRURceDEwXHgwMlx4MTJceDE1XG5ceDExUElOU1RBVEVfRElTQUJMRURceDEwXHgwM1x4MTJceDFjXG5ceDE4UElOU1RBVEVfRU5BQkxFRF9CTE9DS0VEXHgxMFx4MDRceDEyIVxuXHgxZFBJTlNUQVRFX0VOQUJMRURfUEVSTV9CTE9DS0VEXHgxMFx4MDUqaFxuXG5SaWxBcHBUeXBlXHgxMlx4MTNcblx4MGZceDQxUFBUWVBFX1VOS05PV05ceDEwXHgwMFx4MTJceDBmXG5ceDBiXHg0MVBQVFlQRV9TSU1ceDEwXHgwMVx4MTJceDEwXG5ceDBjXHg0MVBQVFlQRV9VU0lNXHgxMFx4MDJceDEyXHgxMFxuXHgwY1x4NDFQUFRZUEVfUlVJTVx4MTBceDAzXHgxMlx4MTBcblx4MGNceDQxUFBUWVBFX0NTSU1ceDEwXHgwNCpceGNlXHgwMVxuXG5SaWxVdXNUeXBlXHgxMlx4MThcblx4MTRSSUxVVVNUWVBFMV9JTVBMSUNJVFx4MTBceDAwXHgxMlx4MThcblx4MTRSSUxVVVNUWVBFMV9SRVFVSVJFRFx4MTBceDAxXHgxMlx4MWNcblx4MThSSUxVVVNUWVBFMV9OT1RfUkVRVUlSRURceDEwXHgwMlx4MTJceDE4XG5ceDE0UklMVVVTVFlQRTJfUkVRVUlSRURceDEwXHgwM1x4MTJceDFjXG5ceDE4UklMVVVTVFlQRTJfTk9UX1JFUVVJUkVEXHgxMFx4MDRceDEyXHgxOFxuXHgxNFJJTFVVU1RZUEUzX1JFUVVJUkVEXHgxMFx4MDVceDEyXHgxY1xuXHgxOFJJTFVVU1RZUEUzX05PVF9SRVFVSVJFRFx4MTBceDA2KnBcblx0UmlsVXVzRGNzXHgxMlx4MTFcblxyUklMVVVTRENTX1VTUFx4MTBceDAwXHgxMlx4MTRcblx4MTBSSUxVVVNEQ1NfT1NJSExQXHgxMFx4MDFceDEyXHgxMlxuXHgwZVJJTFVVU0RDU19YMjQ0XHgxMFx4MDJceDEyXHgxMlxuXHgwZVJJTFVVU0RDU19STUNGXHgxMFx4MDNceDEyXHgxMlxuXHgwZVJJTFVVU0RDU19JQTVjXHgxMFx4MDQqXHg5OVx4MDFcblx4MGNSaWxDYWxsU3RhdGVceDEyXHgxNFxuXHgxMFx4NDNceDQxTExTVEFURV9BQ1RJVkVceDEwXHgwMFx4MTJceDE1XG5ceDExXHg0M1x4NDFMTFNUQVRFX0hPTERJTkdceDEwXHgwMVx4MTJceDE1XG5ceDExXHg0M1x4NDFMTFNUQVRFX0RJQUxJTkdceDEwXHgwMlx4MTJceDE2XG5ceDEyXHg0M1x4NDFMTFNUQVRFX0FMRVJUSU5HXHgxMFx4MDNceDEyXHgxNlxuXHgxMlx4NDNceDQxTExTVEFURV9JTkNPTUlOR1x4MTBceDA0XHgxMlx4MTVcblx4MTFceDQzXHg0MUxMU1RBVEVfV0FJVElOR1x4MTBceDA1XHg0Mlx4MzNcbihjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvQlx4MDdSaWxDbWRzJykKLQotX1JBRElPU1RBVEUgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdSYWRpb1N0YXRlJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmFkaW9TdGF0ZScsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgdmFsdWVzPVsKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdSQURJT1NUQVRFX09GRicsIGluZGV4PTAsIG51bWJlcj0wLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdSQURJT1NUQVRFX1VOQVZBSUxBQkxFJywgaW5kZXg9MSwgbnVtYmVyPTEsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JBRElPU1RBVEVfU0lNX05PVF9SRUFEWScsIGluZGV4PTIsIG51bWJlcj0yLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdSQURJT1NUQVRFX1NJTV9MT0NLRURfT1JfQUJTRU5UJywgaW5kZXg9MywgbnVtYmVyPTMsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JBRElPU1RBVEVfU0lNX1JFQURZJywgaW5kZXg9NCwgbnVtYmVyPTQsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JBRElPU1RBVEVfUlVJTV9OT1RfUkVBRFknLCBpbmRleD01LCBudW1iZXI9NSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUkFESU9TVEFURV9SVUlNX1JFQURZJywgaW5kZXg9NiwgbnVtYmVyPTYsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JBRElPU1RBVEVfUlVJTV9MT0NLRURfT1JfQUJTRU5UJywgaW5kZXg9NywgbnVtYmVyPTcsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JBRElPU1RBVEVfTlZfTk9UX1JFQURZJywgaW5kZXg9OCwgbnVtYmVyPTgsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JBRElPU1RBVEVfTlZfUkVBRFknLCBpbmRleD05LCBudW1iZXI9OSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gIF0sCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBvcHRpb25zPU5vbmUsCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MjAzOSwKLSAgc2VyaWFsaXplZF9lbmQ9MjM0MiwKLSkKLQotCi1fUklMQ0FSRFNUQVRFID0gZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKLSAgbmFtZT0nUmlsQ2FyZFN0YXRlJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FyZFN0YXRlJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICB2YWx1ZXM9WwotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0NBUkRTVEFURV9BQlNFTlQnLCBpbmRleD0wLCBudW1iZXI9MCwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQ0FSRFNUQVRFX1BSRVNFTlQnLCBpbmRleD0xLCBudW1iZXI9MSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQ0FSRFNUQVRFX0VSUk9SJywgaW5kZXg9MiwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICBdLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgb3B0aW9ucz1Ob25lLAotICBzZXJpYWxpemVkX3N0YXJ0PTIzNDQsCi0gIHNlcmlhbGl6ZWRfZW5kPTI0MjQsCi0pCi0KLQotX1JJTFBFUlNPU1VCU1RBVEUgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdSaWxQZXJzb1N1YnN0YXRlJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsUGVyc29TdWJzdGF0ZScsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgdmFsdWVzPVsKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQRVJTT1NVQlNUQVRFX1VOS05PV04nLCBpbmRleD0wLCBudW1iZXI9MCwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9JTl9QUk9HUkVTUycsIGluZGV4PTEsIG51bWJlcj0xLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQRVJTT1NVQlNUQVRFX1JFQURZJywgaW5kZXg9MiwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1BFUlNPU1VCU1RBVEVfU0lNX05FVFdPUksnLCBpbmRleD0zLCBudW1iZXI9MywKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9TSU1fTkVUV09SS19TVUJTRVQnLCBpbmRleD00LCBudW1iZXI9NCwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9TSU1fQ09SUE9SQVRFJywgaW5kZXg9NSwgbnVtYmVyPTUsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1BFUlNPU1VCU1RBVEVfU0lNX1NFUlZJQ0VfUFJPVklERVInLCBpbmRleD02LCBudW1iZXI9NiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9TSU1fU0lNJywgaW5kZXg9NywgbnVtYmVyPTcsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1BFUlNPU1VCU1RBVEVfU0lNX05FVFdPUktfUFVLJywgaW5kZXg9OCwgbnVtYmVyPTgsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1BFUlNPU1VCU1RBVEVfU0lNX05FVFdPUktfU1VCU0VUX1BVSycsIGluZGV4PTksIG51bWJlcj05LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQRVJTT1NVQlNUQVRFX1NJTV9DT1JQT1JBVEVfUFVLJywgaW5kZXg9MTAsIG51bWJlcj0xMCwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9TSU1fU0VSVklDRV9QUk9WSURFUl9QVUsnLCBpbmRleD0xMSwgbnVtYmVyPTExLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQRVJTT1NVQlNUQVRFX1NJTV9TSU1fUFVLJywgaW5kZXg9MTIsIG51bWJlcj0xMiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9SVUlNX05FVFdPUksxJywgaW5kZXg9MTMsIG51bWJlcj0xMywKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9SVUlNX05FVFdPUksyJywgaW5kZXg9MTQsIG51bWJlcj0xNCwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9SVUlNX0hSUEQnLCBpbmRleD0xNSwgbnVtYmVyPTE1LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQRVJTT1NVQlNUQVRFX1JVSU1fQ09SUE9SQVRFJywgaW5kZXg9MTYsIG51bWJlcj0xNiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9SVUlNX1NFUlZJQ0VfUFJPVklERVInLCBpbmRleD0xNywgbnVtYmVyPTE3LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQRVJTT1NVQlNUQVRFX1JVSU1fUlVJTScsIGluZGV4PTE4LCBudW1iZXI9MTgsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1BFUlNPU1VCU1RBVEVfUlVJTV9ORVRXT1JLMV9QVUsnLCBpbmRleD0xOSwgbnVtYmVyPTE5LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzJfUFVLJywgaW5kZXg9MjAsIG51bWJlcj0yMCwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9SVUlNX0hSUERfUFVLJywgaW5kZXg9MjEsIG51bWJlcj0yMSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUEVSU09TVUJTVEFURV9SVUlNX0NPUlBPUkFURV9QVUsnLCBpbmRleD0yMiwgbnVtYmVyPTIyLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQRVJTT1NVQlNUQVRFX1JVSU1fU0VSVklDRV9QUk9WSURFUl9QVUsnLCBpbmRleD0yMywgbnVtYmVyPTIzLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQRVJTT1NVQlNUQVRFX1JVSU1fUlVJTV9QVUsnLCBpbmRleD0yNCwgbnVtYmVyPTI0LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0yNDI3LAotICBzZXJpYWxpemVkX2VuZD0zMzA4LAotKQotCi0KLV9SSUxBUFBTVEFURSA9IGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCi0gIG5hbWU9J1JpbEFwcFN0YXRlJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQXBwU3RhdGUnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIHZhbHVlcz1bCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQVBQU1RBVEVfVU5LTk9XTicsIGluZGV4PTAsIG51bWJlcj0wLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdBUFBTVEFURV9ERVRFQ1RFRCcsIGluZGV4PTEsIG51bWJlcj0xLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdBUFBTVEFURV9QSU4nLCBpbmRleD0yLCBudW1iZXI9MiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQVBQU1RBVEVfUFVLJywgaW5kZXg9MywgbnVtYmVyPTMsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0FQUFNUQVRFX1NVQlNDUklQVElPTl9QRVJTTycsIGluZGV4PTQsIG51bWJlcj00LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdBUFBTVEFURV9SRUFEWScsIGluZGV4PTUsIG51bWJlcj01LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0zMzExLAotICBzZXJpYWxpemVkX2VuZD0zNDU4LAotKQotCi0KLV9SSUxQSU5TVEFURSA9IGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCi0gIG5hbWU9J1JpbFBpblN0YXRlJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsUGluU3RhdGUnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIHZhbHVlcz1bCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUElOU1RBVEVfVU5LTk9XTicsIGluZGV4PTAsIG51bWJlcj0wLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQSU5TVEFURV9FTkFCTEVEX05PVF9WRVJJRklFRCcsIGluZGV4PTEsIG51bWJlcj0xLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQSU5TVEFURV9FTkFCTEVEX1ZFUklGSUVEJywgaW5kZXg9MiwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1BJTlNUQVRFX0RJU0FCTEVEJywgaW5kZXg9MywgbnVtYmVyPTMsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1BJTlNUQVRFX0VOQUJMRURfQkxPQ0tFRCcsIGluZGV4PTQsIG51bWJlcj00LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdQSU5TVEFURV9FTkFCTEVEX1BFUk1fQkxPQ0tFRCcsIGluZGV4PTUsIG51bWJlcj01LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0zNDYxLAotICBzZXJpYWxpemVkX2VuZD0zNjUwLAotKQotCi0KLV9SSUxBUFBUWVBFID0gZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKLSAgbmFtZT0nUmlsQXBwVHlwZScsCi0gIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJpbEFwcFR5cGUnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIHZhbHVlcz1bCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQVBQVFlQRV9VTktOT1dOJywgaW5kZXg9MCwgbnVtYmVyPTAsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0FQUFRZUEVfU0lNJywgaW5kZXg9MSwgbnVtYmVyPTEsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0FQUFRZUEVfVVNJTScsIGluZGV4PTIsIG51bWJlcj0yLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdBUFBUWVBFX1JVSU0nLCBpbmRleD0zLCBudW1iZXI9MywKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQVBQVFlQRV9DU0lNJywgaW5kZXg9NCwgbnVtYmVyPTQsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICBdLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgb3B0aW9ucz1Ob25lLAotICBzZXJpYWxpemVkX3N0YXJ0PTM2NTIsCi0gIHNlcmlhbGl6ZWRfZW5kPTM3NTYsCi0pCi0KLQotX1JJTFVVU1RZUEUgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdSaWxVdXNUeXBlJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsVXVzVHlwZScsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgdmFsdWVzPVsKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdSSUxVVVNUWVBFMV9JTVBMSUNJVCcsIGluZGV4PTAsIG51bWJlcj0wLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdSSUxVVVNUWVBFMV9SRVFVSVJFRCcsIGluZGV4PTEsIG51bWJlcj0xLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdSSUxVVVNUWVBFMV9OT1RfUkVRVUlSRUQnLCBpbmRleD0yLCBudW1iZXI9MiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUklMVVVTVFlQRTJfUkVRVUlSRUQnLCBpbmRleD0zLCBudW1iZXI9MywKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUklMVVVTVFlQRTJfTk9UX1JFUVVJUkVEJywgaW5kZXg9NCwgbnVtYmVyPTQsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JJTFVVU1RZUEUzX1JFUVVJUkVEJywgaW5kZXg9NSwgbnVtYmVyPTUsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JJTFVVU1RZUEUzX05PVF9SRVFVSVJFRCcsIGluZGV4PTYsIG51bWJlcj02LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0zNzU5LAotICBzZXJpYWxpemVkX2VuZD0zOTY1LAotKQotCi0KLV9SSUxVVVNEQ1MgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdSaWxVdXNEY3MnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxVdXNEY3MnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIHZhbHVlcz1bCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nUklMVVVTRENTX1VTUCcsIGluZGV4PTAsIG51bWJlcj0wLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdSSUxVVVNEQ1NfT1NJSExQJywgaW5kZXg9MSwgbnVtYmVyPTEsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JJTFVVU0RDU19YMjQ0JywgaW5kZXg9MiwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JJTFVVU0RDU19STUNGJywgaW5kZXg9MywgbnVtYmVyPTMsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1JJTFVVU0RDU19JQTVjJywgaW5kZXg9NCwgbnVtYmVyPTQsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICBdLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgb3B0aW9ucz1Ob25lLAotICBzZXJpYWxpemVkX3N0YXJ0PTM5NjcsCi0gIHNlcmlhbGl6ZWRfZW5kPTQwNzksCi0pCi0KLQotX1JJTENBTExTVEFURSA9IGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCi0gIG5hbWU9J1JpbENhbGxTdGF0ZScsCi0gIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJpbENhbGxTdGF0ZScsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgdmFsdWVzPVsKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdDQUxMU1RBVEVfQUNUSVZFJywgaW5kZXg9MCwgbnVtYmVyPTAsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0NBTExTVEFURV9IT0xESU5HJywgaW5kZXg9MSwgbnVtYmVyPTEsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0NBTExTVEFURV9ESUFMSU5HJywgaW5kZXg9MiwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0NBTExTVEFURV9BTEVSVElORycsIGluZGV4PTMsIG51bWJlcj0zLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdDQUxMU1RBVEVfSU5DT01JTkcnLCBpbmRleD00LCBudW1iZXI9NCwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQ0FMTFNUQVRFX1dBSVRJTkcnLCBpbmRleD01LCBudW1iZXI9NSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gIF0sCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBvcHRpb25zPU5vbmUsCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9NDA4MiwKLSAgc2VyaWFsaXplZF9lbmQ9NDIzNSwKLSkKLQotCi1SQURJT1NUQVRFX09GRiA9IDAKLVJBRElPU1RBVEVfVU5BVkFJTEFCTEUgPSAxCi1SQURJT1NUQVRFX1NJTV9OT1RfUkVBRFkgPSAyCi1SQURJT1NUQVRFX1NJTV9MT0NLRURfT1JfQUJTRU5UID0gMwotUkFESU9TVEFURV9TSU1fUkVBRFkgPSA0Ci1SQURJT1NUQVRFX1JVSU1fTk9UX1JFQURZID0gNQotUkFESU9TVEFURV9SVUlNX1JFQURZID0gNgotUkFESU9TVEFURV9SVUlNX0xPQ0tFRF9PUl9BQlNFTlQgPSA3Ci1SQURJT1NUQVRFX05WX05PVF9SRUFEWSA9IDgKLVJBRElPU1RBVEVfTlZfUkVBRFkgPSA5Ci1DQVJEU1RBVEVfQUJTRU5UID0gMAotQ0FSRFNUQVRFX1BSRVNFTlQgPSAxCi1DQVJEU1RBVEVfRVJST1IgPSAyCi1QRVJTT1NVQlNUQVRFX1VOS05PV04gPSAwCi1QRVJTT1NVQlNUQVRFX0lOX1BST0dSRVNTID0gMQotUEVSU09TVUJTVEFURV9SRUFEWSA9IDIKLVBFUlNPU1VCU1RBVEVfU0lNX05FVFdPUksgPSAzCi1QRVJTT1NVQlNUQVRFX1NJTV9ORVRXT1JLX1NVQlNFVCA9IDQKLVBFUlNPU1VCU1RBVEVfU0lNX0NPUlBPUkFURSA9IDUKLVBFUlNPU1VCU1RBVEVfU0lNX1NFUlZJQ0VfUFJPVklERVIgPSA2Ci1QRVJTT1NVQlNUQVRFX1NJTV9TSU0gPSA3Ci1QRVJTT1NVQlNUQVRFX1NJTV9ORVRXT1JLX1BVSyA9IDgKLVBFUlNPU1VCU1RBVEVfU0lNX05FVFdPUktfU1VCU0VUX1BVSyA9IDkKLVBFUlNPU1VCU1RBVEVfU0lNX0NPUlBPUkFURV9QVUsgPSAxMAotUEVSU09TVUJTVEFURV9TSU1fU0VSVklDRV9QUk9WSURFUl9QVUsgPSAxMQotUEVSU09TVUJTVEFURV9TSU1fU0lNX1BVSyA9IDEyCi1QRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzEgPSAxMwotUEVSU09TVUJTVEFURV9SVUlNX05FVFdPUksyID0gMTQKLVBFUlNPU1VCU1RBVEVfUlVJTV9IUlBEID0gMTUKLVBFUlNPU1VCU1RBVEVfUlVJTV9DT1JQT1JBVEUgPSAxNgotUEVSU09TVUJTVEFURV9SVUlNX1NFUlZJQ0VfUFJPVklERVIgPSAxNwotUEVSU09TVUJTVEFURV9SVUlNX1JVSU0gPSAxOAotUEVSU09TVUJTVEFURV9SVUlNX05FVFdPUksxX1BVSyA9IDE5Ci1QRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzJfUFVLID0gMjAKLVBFUlNPU1VCU1RBVEVfUlVJTV9IUlBEX1BVSyA9IDIxCi1QRVJTT1NVQlNUQVRFX1JVSU1fQ09SUE9SQVRFX1BVSyA9IDIyCi1QRVJTT1NVQlNUQVRFX1JVSU1fU0VSVklDRV9QUk9WSURFUl9QVUsgPSAyMwotUEVSU09TVUJTVEFURV9SVUlNX1JVSU1fUFVLID0gMjQKLUFQUFNUQVRFX1VOS05PV04gPSAwCi1BUFBTVEFURV9ERVRFQ1RFRCA9IDEKLUFQUFNUQVRFX1BJTiA9IDIKLUFQUFNUQVRFX1BVSyA9IDMKLUFQUFNUQVRFX1NVQlNDUklQVElPTl9QRVJTTyA9IDQKLUFQUFNUQVRFX1JFQURZID0gNQotUElOU1RBVEVfVU5LTk9XTiA9IDAKLVBJTlNUQVRFX0VOQUJMRURfTk9UX1ZFUklGSUVEID0gMQotUElOU1RBVEVfRU5BQkxFRF9WRVJJRklFRCA9IDIKLVBJTlNUQVRFX0RJU0FCTEVEID0gMwotUElOU1RBVEVfRU5BQkxFRF9CTE9DS0VEID0gNAotUElOU1RBVEVfRU5BQkxFRF9QRVJNX0JMT0NLRUQgPSA1Ci1BUFBUWVBFX1VOS05PV04gPSAwCi1BUFBUWVBFX1NJTSA9IDEKLUFQUFRZUEVfVVNJTSA9IDIKLUFQUFRZUEVfUlVJTSA9IDMKLUFQUFRZUEVfQ1NJTSA9IDQKLVJJTFVVU1RZUEUxX0lNUExJQ0lUID0gMAotUklMVVVTVFlQRTFfUkVRVUlSRUQgPSAxCi1SSUxVVVNUWVBFMV9OT1RfUkVRVUlSRUQgPSAyCi1SSUxVVVNUWVBFMl9SRVFVSVJFRCA9IDMKLVJJTFVVU1RZUEUyX05PVF9SRVFVSVJFRCA9IDQKLVJJTFVVU1RZUEUzX1JFUVVJUkVEID0gNQotUklMVVVTVFlQRTNfTk9UX1JFUVVJUkVEID0gNgotUklMVVVTRENTX1VTUCA9IDAKLVJJTFVVU0RDU19PU0lITFAgPSAxCi1SSUxVVVNEQ1NfWDI0NCA9IDIKLVJJTFVVU0RDU19STUNGID0gMwotUklMVVVTRENTX0lBNWMgPSA0Ci1DQUxMU1RBVEVfQUNUSVZFID0gMAotQ0FMTFNUQVRFX0hPTERJTkcgPSAxCi1DQUxMU1RBVEVfRElBTElORyA9IDIKLUNBTExTVEFURV9BTEVSVElORyA9IDMKLUNBTExTVEFURV9JTkNPTUlORyA9IDQKLUNBTExTVEFURV9XQUlUSU5HID0gNQotCi0KLQotX1JJTEFQUFNUQVRVUyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nUmlsQXBwU3RhdHVzJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQXBwU3RhdHVzJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2FwcF90eXBlJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQXBwU3RhdHVzLmFwcF90eXBlJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2FwcF9zdGF0ZScsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJpbEFwcFN0YXR1cy5hcHBfc3RhdGUnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ncGVyc29fc3Vic3RhdGUnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxBcHBTdGF0dXMucGVyc29fc3Vic3RhdGUnLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTMsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nYWlkJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQXBwU3RhdHVzLmFpZCcsIGluZGV4PTMsCi0gICAgICBudW1iZXI9NCwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdhcHBfbGFiZWwnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxBcHBTdGF0dXMuYXBwX2xhYmVsJywgaW5kZXg9NCwKLSAgICAgIG51bWJlcj01LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3BpbjFfcmVwbGFjZWQnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxBcHBTdGF0dXMucGluMV9yZXBsYWNlZCcsIGluZGV4PTUsCi0gICAgICBudW1iZXI9NiwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3BpbjEnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxBcHBTdGF0dXMucGluMScsIGluZGV4PTYsCi0gICAgICBudW1iZXI9NywgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdwaW4yJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQXBwU3RhdHVzLnBpbjInLCBpbmRleD03LAotICAgICAgbnVtYmVyPTgsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTI1LAotICBzZXJpYWxpemVkX2VuZD0zMDcsCi0pCi0KLQotX1JJTENBUkRTVEFUVVMgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1JpbENhcmRTdGF0dXMnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxDYXJkU3RhdHVzJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2NhcmRfc3RhdGUnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxDYXJkU3RhdHVzLmNhcmRfc3RhdGUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndW5pdmVyc2FsX3Bpbl9zdGF0ZScsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJpbENhcmRTdGF0dXMudW5pdmVyc2FsX3Bpbl9zdGF0ZScsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MiwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4JywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FyZFN0YXR1cy5nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4JywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nY2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4JywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FyZFN0YXR1cy5jZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXgnLCBpbmRleD0zLAotICAgICAgbnVtYmVyPTQsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdudW1fYXBwbGljYXRpb25zJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FyZFN0YXR1cy5udW1fYXBwbGljYXRpb25zJywgaW5kZXg9NCwKLSAgICAgIG51bWJlcj01LCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nYXBwbGljYXRpb25zJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FyZFN0YXR1cy5hcHBsaWNhdGlvbnMnLCBpbmRleD01LAotICAgICAgbnVtYmVyPTYsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MzEwLAotICBzZXJpYWxpemVkX2VuZD01NzQsCi0pCi0KLQotX1JJTFVVU0lORk8gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1JpbFV1c0luZm8nLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxVdXNJbmZvJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3V1c190eXBlJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsVXVzSW5mby51dXNfdHlwZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd1dXNfZGNzJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsVXVzSW5mby51dXNfZGNzJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3V1c19sZW5ndGgnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxVdXNJbmZvLnV1c19sZW5ndGgnLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTMsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd1dXNfZGF0YScsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJpbFV1c0luZm8udXVzX2RhdGEnLCBpbmRleD0zLAotICAgICAgbnVtYmVyPTQsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTU3NywKLSAgc2VyaWFsaXplZF9lbmQ9NzA3LAotKQotCi0KLV9SSUxDQUxMID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdSaWxDYWxsJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FsbCcsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdzdGF0ZScsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJpbENhbGwuc3RhdGUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0naW5kZXgnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxDYWxsLmluZGV4JywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndG9hJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FsbC50b2EnLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTMsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdpc19tcHR5JywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FsbC5pc19tcHR5JywgaW5kZXg9MywKLSAgICAgIG51bWJlcj00LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2lzX210JywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FsbC5pc19tdCcsIGluZGV4PTQsCi0gICAgICBudW1iZXI9NSwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdhbHMnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxDYWxsLmFscycsIGluZGV4PTUsCi0gICAgICBudW1iZXI9NiwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2lzX3ZvaWNlJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FsbC5pc192b2ljZScsIGluZGV4PTYsCi0gICAgICBudW1iZXI9NywgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdpc192b2ljZV9wcml2YWN5JywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FsbC5pc192b2ljZV9wcml2YWN5JywgaW5kZXg9NywKLSAgICAgIG51bWJlcj04LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J251bWJlcicsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJpbENhbGwubnVtYmVyJywgaW5kZXg9OCwKLSAgICAgIG51bWJlcj05LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J251bWJlcl9wcmVzZW50YXRpb24nLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxDYWxsLm51bWJlcl9wcmVzZW50YXRpb24nLCBpbmRleD05LAotICAgICAgbnVtYmVyPTEwLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJpbENhbGwubmFtZScsIGluZGV4PTEwLAotICAgICAgbnVtYmVyPTExLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J25hbWVfcHJlc2VudGF0aW9uJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmlsQ2FsbC5uYW1lX3ByZXNlbnRhdGlvbicsIGluZGV4PTExLAotICAgICAgbnVtYmVyPTEyLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndXVzX2luZm8nLCBmdWxsX25hbWU9J3JpbF9wcm90by5SaWxDYWxsLnV1c19pbmZvJywgaW5kZXg9MTIsCi0gICAgICBudW1iZXI9MTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgc2VyaWFsaXplZF9zdGFydD03MTAsCi0gIHNlcmlhbGl6ZWRfZW5kPTEwMDMsCi0pCi0KLQotX1JJTEdXU0lHTkFMU1RSRU5HVEggPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1JJTEdXU2lnbmFsU3RyZW5ndGgnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5SSUxHV1NpZ25hbFN0cmVuZ3RoJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3NpZ25hbF9zdHJlbmd0aCcsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJJTEdXU2lnbmFsU3RyZW5ndGguc2lnbmFsX3N0cmVuZ3RoJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nYml0X2Vycm9yX3JhdGUnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SSUxHV1NpZ25hbFN0cmVuZ3RoLmJpdF9lcnJvcl9yYXRlJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTEwMDUsCi0gIHNlcmlhbGl6ZWRfZW5kPTEwNzUsCi0pCi0KLQotX1JJTENETUFTSUdOQUxTVFJFTkdUSCA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nUklMQ0RNQVNpZ25hbFN0cmVuZ3RoJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUklMQ0RNQVNpZ25hbFN0cmVuZ3RoJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2RibScsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJJTENETUFTaWduYWxTdHJlbmd0aC5kYm0nLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdlY2lvJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUklMQ0RNQVNpZ25hbFN0cmVuZ3RoLmVjaW8nLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTA3NywKLSAgc2VyaWFsaXplZF9lbmQ9MTEyNywKLSkKLQotCi1fUklMRVZET1NJR05BTFNUUkVOR1RIID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdSSUxFVkRPU2lnbmFsU3RyZW5ndGgnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5SSUxFVkRPU2lnbmFsU3RyZW5ndGgnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZGJtJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUklMRVZET1NpZ25hbFN0cmVuZ3RoLmRibScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2VjaW8nLCBmdWxsX25hbWU9J3JpbF9wcm90by5SSUxFVkRPU2lnbmFsU3RyZW5ndGguZWNpbycsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MiwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3NpZ25hbF9ub2lzZV9yYXRpbycsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJJTEVWRE9TaWduYWxTdHJlbmd0aC5zaWduYWxfbm9pc2VfcmF0aW8nLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTMsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTEyOSwKLSAgc2VyaWFsaXplZF9lbmQ9MTIwNywKLSkKLQotCi1fUlNQU1RSSU5HUyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nUnNwU3RyaW5ncycsCi0gIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJzcFN0cmluZ3MnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nc3RyaW5ncycsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJzcFN0cmluZ3Muc3RyaW5ncycsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTIwOSwKLSAgc2VyaWFsaXplZF9lbmQ9MTIzOCwKLSkKLQotCi1fUlNQSU5URUdFUlMgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1JzcEludGVnZXJzJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUnNwSW50ZWdlcnMnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0naW50ZWdlcnMnLCBmdWxsX25hbWU9J3JpbF9wcm90by5Sc3BJbnRlZ2Vycy5pbnRlZ2VycycsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTI0MCwKLSAgc2VyaWFsaXplZF9lbmQ9MTI3MSwKLSkKLQotCi1fUlNQR0VUU0lNU1RBVFVTID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdSc3BHZXRTaW1TdGF0dXMnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5Sc3BHZXRTaW1TdGF0dXMnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nY2FyZF9zdGF0dXMnLCBmdWxsX25hbWU9J3JpbF9wcm90by5Sc3BHZXRTaW1TdGF0dXMuY2FyZF9zdGF0dXMnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0yLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgc2VyaWFsaXplZF9zdGFydD0xMjczLAotICBzZXJpYWxpemVkX2VuZD0xMzM3LAotKQotCi0KLV9SRVFFTlRFUlNJTVBJTiA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nUmVxRW50ZXJTaW1QaW4nLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5SZXFFbnRlclNpbVBpbicsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdwaW4nLCBmdWxsX25hbWU9J3JpbF9wcm90by5SZXFFbnRlclNpbVBpbi5waW4nLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MiwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTEzMzksCi0gIHNlcmlhbGl6ZWRfZW5kPTEzNjgsCi0pCi0KLQotX1JTUEVOVEVSU0lNUElOID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdSc3BFbnRlclNpbVBpbicsCi0gIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJzcEVudGVyU2ltUGluJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3JldHJpZXNfcmVtYWluaW5nJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUnNwRW50ZXJTaW1QaW4ucmV0cmllc19yZW1haW5pbmcnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MiwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTM3MCwKLSAgc2VyaWFsaXplZF9lbmQ9MTQxMywKLSkKLQotCi1fUlNQR0VUQ1VSUkVOVENBTExTID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdSc3BHZXRDdXJyZW50Q2FsbHMnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5Sc3BHZXRDdXJyZW50Q2FsbHMnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nY2FsbHMnLCBmdWxsX25hbWU9J3JpbF9wcm90by5Sc3BHZXRDdXJyZW50Q2FsbHMuY2FsbHMnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTQxNSwKLSAgc2VyaWFsaXplZF9lbmQ9MTQ3MCwKLSkKLQotCi1fUkVRRElBTCA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nUmVxRGlhbCcsCi0gIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJlcURpYWwnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nYWRkcmVzcycsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJlcURpYWwuYWRkcmVzcycsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdjbGlyJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmVxRGlhbC5jbGlyJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndXVzX2luZm8nLCBmdWxsX25hbWU9J3JpbF9wcm90by5SZXFEaWFsLnV1c19pbmZvJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTQ3MiwKLSAgc2VyaWFsaXplZF9lbmQ9MTU1MywKLSkKLQotCi1fUkVRSEFOR1VQID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdSZXFIYW5nVXAnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5SZXFIYW5nVXAnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nY29ubmVjdGlvbl9pbmRleCcsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJlcUhhbmdVcC5jb25uZWN0aW9uX2luZGV4JywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTIsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTE1NTUsCi0gIHNlcmlhbGl6ZWRfZW5kPTE1OTIsCi0pCi0KLQotX1JTUExBU1RDQUxMRkFJTENBVVNFID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdSc3BMYXN0Q2FsbEZhaWxDYXVzZScsCi0gIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJzcExhc3RDYWxsRmFpbENhdXNlJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2xhc3RfY2FsbF9mYWlsX2NhdXNlJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUnNwTGFzdENhbGxGYWlsQ2F1c2UubGFzdF9jYWxsX2ZhaWxfY2F1c2UnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MiwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTU5NCwKLSAgc2VyaWFsaXplZF9lbmQ9MTY0NiwKLSkKLQotCi1fUlNQU0lHTkFMU1RSRU5HVEggPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1JzcFNpZ25hbFN0cmVuZ3RoJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUnNwU2lnbmFsU3RyZW5ndGgnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZ3dfc2lnbmFsc3RyZW5ndGgnLCBmdWxsX25hbWU9J3JpbF9wcm90by5Sc3BTaWduYWxTdHJlbmd0aC5nd19zaWduYWxzdHJlbmd0aCcsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nY2RtYV9zaWduYWxzdHJlbmd0aCcsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJzcFNpZ25hbFN0cmVuZ3RoLmNkbWFfc2lnbmFsc3RyZW5ndGgnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2V2ZG9fc2lnbmFsc3RyZW5ndGgnLCBmdWxsX25hbWU9J3JpbF9wcm90by5Sc3BTaWduYWxTdHJlbmd0aC5ldmRvX3NpZ25hbHN0cmVuZ3RoJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTY0OSwKLSAgc2VyaWFsaXplZF9lbmQ9MTg1MywKLSkKLQotCi1fUlNQT1BFUkFUT1IgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1JzcE9wZXJhdG9yJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUnNwT3BlcmF0b3InLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbG9uZ19hbHBoYV9vbnMnLCBmdWxsX25hbWU9J3JpbF9wcm90by5Sc3BPcGVyYXRvci5sb25nX2FscGhhX29ucycsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdzaG9ydF9hbHBoYV9vbnMnLCBmdWxsX25hbWU9J3JpbF9wcm90by5Sc3BPcGVyYXRvci5zaG9ydF9hbHBoYV9vbnMnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbWNjX21uYycsIGZ1bGxfbmFtZT0ncmlsX3Byb3RvLlJzcE9wZXJhdG9yLm1jY19tbmMnLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTMsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTE4NTUsCi0gIHNlcmlhbGl6ZWRfZW5kPTE5MzQsCi0pCi0KLQotX1JFUVNFUEFSQVRFQ09OTkVDVElPTiA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nUmVxU2VwYXJhdGVDb25uZWN0aW9uJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmVxU2VwYXJhdGVDb25uZWN0aW9uJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2luZGV4JywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmVxU2VwYXJhdGVDb25uZWN0aW9uLmluZGV4JywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTIsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTE5MzYsCi0gIHNlcmlhbGl6ZWRfZW5kPTE5NzQsCi0pCi0KLQotX1JFUVNFVE1VVEUgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1JlcVNldE11dGUnLAotICBmdWxsX25hbWU9J3JpbF9wcm90by5SZXFTZXRNdXRlJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3N0YXRlJywgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmVxU2V0TXV0ZS5zdGF0ZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0yLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTk3NiwKLSAgc2VyaWFsaXplZF9lbmQ9MjAwMywKLSkKLQotCi1fUkVRU0NSRUVOU1RBVEUgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1JlcVNjcmVlblN0YXRlJywKLSAgZnVsbF9uYW1lPSdyaWxfcHJvdG8uUmVxU2NyZWVuU3RhdGUnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nc3RhdGUnLCBmdWxsX25hbWU9J3JpbF9wcm90by5SZXFTY3JlZW5TdGF0ZS5zdGF0ZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0yLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MjAwNSwKLSAgc2VyaWFsaXplZF9lbmQ9MjAzNiwKLSkKLQotCi1fUklMQVBQU1RBVFVTLmZpZWxkc19ieV9uYW1lWydhcHBfdHlwZSddLmVudW1fdHlwZSA9IF9SSUxBUFBUWVBFCi1fUklMQVBQU1RBVFVTLmZpZWxkc19ieV9uYW1lWydhcHBfc3RhdGUnXS5lbnVtX3R5cGUgPSBfUklMQVBQU1RBVEUKLV9SSUxBUFBTVEFUVVMuZmllbGRzX2J5X25hbWVbJ3BlcnNvX3N1YnN0YXRlJ10uZW51bV90eXBlID0gX1JJTFBFUlNPU1VCU1RBVEUKLV9SSUxBUFBTVEFUVVMuZmllbGRzX2J5X25hbWVbJ3BpbjEnXS5lbnVtX3R5cGUgPSBfUklMUElOU1RBVEUKLV9SSUxBUFBTVEFUVVMuZmllbGRzX2J5X25hbWVbJ3BpbjInXS5lbnVtX3R5cGUgPSBfUklMUElOU1RBVEUKLV9SSUxDQVJEU1RBVFVTLmZpZWxkc19ieV9uYW1lWydjYXJkX3N0YXRlJ10uZW51bV90eXBlID0gX1JJTENBUkRTVEFURQotX1JJTENBUkRTVEFUVVMuZmllbGRzX2J5X25hbWVbJ3VuaXZlcnNhbF9waW5fc3RhdGUnXS5lbnVtX3R5cGUgPSBfUklMUElOU1RBVEUKLV9SSUxDQVJEU1RBVFVTLmZpZWxkc19ieV9uYW1lWydhcHBsaWNhdGlvbnMnXS5tZXNzYWdlX3R5cGUgPSBfUklMQVBQU1RBVFVTCi1fUklMVVVTSU5GTy5maWVsZHNfYnlfbmFtZVsndXVzX3R5cGUnXS5lbnVtX3R5cGUgPSBfUklMVVVTVFlQRQotX1JJTFVVU0lORk8uZmllbGRzX2J5X25hbWVbJ3V1c19kY3MnXS5lbnVtX3R5cGUgPSBfUklMVVVTRENTCi1fUklMQ0FMTC5maWVsZHNfYnlfbmFtZVsnc3RhdGUnXS5lbnVtX3R5cGUgPSBfUklMQ0FMTFNUQVRFCi1fUklMQ0FMTC5maWVsZHNfYnlfbmFtZVsndXVzX2luZm8nXS5tZXNzYWdlX3R5cGUgPSBfUklMVVVTSU5GTwotX1JTUEdFVFNJTVNUQVRVUy5maWVsZHNfYnlfbmFtZVsnY2FyZF9zdGF0dXMnXS5tZXNzYWdlX3R5cGUgPSBfUklMQ0FSRFNUQVRVUwotX1JTUEdFVENVUlJFTlRDQUxMUy5maWVsZHNfYnlfbmFtZVsnY2FsbHMnXS5tZXNzYWdlX3R5cGUgPSBfUklMQ0FMTAotX1JFUURJQUwuZmllbGRzX2J5X25hbWVbJ3V1c19pbmZvJ10ubWVzc2FnZV90eXBlID0gX1JJTFVVU0lORk8KLV9SU1BTSUdOQUxTVFJFTkdUSC5maWVsZHNfYnlfbmFtZVsnZ3dfc2lnbmFsc3RyZW5ndGgnXS5tZXNzYWdlX3R5cGUgPSBfUklMR1dTSUdOQUxTVFJFTkdUSAotX1JTUFNJR05BTFNUUkVOR1RILmZpZWxkc19ieV9uYW1lWydjZG1hX3NpZ25hbHN0cmVuZ3RoJ10ubWVzc2FnZV90eXBlID0gX1JJTENETUFTSUdOQUxTVFJFTkdUSAotX1JTUFNJR05BTFNUUkVOR1RILmZpZWxkc19ieV9uYW1lWydldmRvX3NpZ25hbHN0cmVuZ3RoJ10ubWVzc2FnZV90eXBlID0gX1JJTEVWRE9TSUdOQUxTVFJFTkdUSAotCi1jbGFzcyBSaWxBcHBTdGF0dXMobWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX1JJTEFQUFNUQVRVUwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJpbEFwcFN0YXR1cykKLQotY2xhc3MgUmlsQ2FyZFN0YXR1cyhtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfUklMQ0FSRFNUQVRVUwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJpbENhcmRTdGF0dXMpCi0KLWNsYXNzIFJpbFV1c0luZm8obWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX1JJTFVVU0lORk8KLSAgCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5SaWxVdXNJbmZvKQotCi1jbGFzcyBSaWxDYWxsKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9SSUxDQUxMCi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUmlsQ2FsbCkKLQotY2xhc3MgUklMR1dTaWduYWxTdHJlbmd0aChtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfUklMR1dTSUdOQUxTVFJFTkdUSAotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJJTEdXU2lnbmFsU3RyZW5ndGgpCi0KLWNsYXNzIFJJTENETUFTaWduYWxTdHJlbmd0aChtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfUklMQ0RNQVNJR05BTFNUUkVOR1RICi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUklMQ0RNQVNpZ25hbFN0cmVuZ3RoKQotCi1jbGFzcyBSSUxFVkRPU2lnbmFsU3RyZW5ndGgobWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX1JJTEVWRE9TSUdOQUxTVFJFTkdUSAotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJJTEVWRE9TaWduYWxTdHJlbmd0aCkKLQotY2xhc3MgUnNwU3RyaW5ncyhtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfUlNQU1RSSU5HUwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcFN0cmluZ3MpCi0KLWNsYXNzIFJzcEludGVnZXJzKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9SU1BJTlRFR0VSUwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcEludGVnZXJzKQotCi1jbGFzcyBSc3BHZXRTaW1TdGF0dXMobWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX1JTUEdFVFNJTVNUQVRVUwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcEdldFNpbVN0YXR1cykKLQotY2xhc3MgUmVxRW50ZXJTaW1QaW4obWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX1JFUUVOVEVSU0lNUElOCi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUmVxRW50ZXJTaW1QaW4pCi0KLWNsYXNzIFJzcEVudGVyU2ltUGluKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9SU1BFTlRFUlNJTVBJTgotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcEVudGVyU2ltUGluKQotCi1jbGFzcyBSc3BHZXRDdXJyZW50Q2FsbHMobWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX1JTUEdFVENVUlJFTlRDQUxMUwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcEdldEN1cnJlbnRDYWxscykKLQotY2xhc3MgUmVxRGlhbChtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfUkVRRElBTAotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJlcURpYWwpCi0KLWNsYXNzIFJlcUhhbmdVcChtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfUkVRSEFOR1VQCi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUmVxSGFuZ1VwKQotCi1jbGFzcyBSc3BMYXN0Q2FsbEZhaWxDYXVzZShtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfUlNQTEFTVENBTExGQUlMQ0FVU0UKLSAgCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOnJpbF9wcm90by5Sc3BMYXN0Q2FsbEZhaWxDYXVzZSkKLQotY2xhc3MgUnNwU2lnbmFsU3RyZW5ndGgobWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX1JTUFNJR05BTFNUUkVOR1RICi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpyaWxfcHJvdG8uUnNwU2lnbmFsU3RyZW5ndGgpCi0KLWNsYXNzIFJzcE9wZXJhdG9yKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9SU1BPUEVSQVRPUgotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJzcE9wZXJhdG9yKQotCi1jbGFzcyBSZXFTZXBhcmF0ZUNvbm5lY3Rpb24obWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX1JFUVNFUEFSQVRFQ09OTkVDVElPTgotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJlcVNlcGFyYXRlQ29ubmVjdGlvbikKLQotY2xhc3MgUmVxU2V0TXV0ZShtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfUkVRU0VUTVVURQotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJlcVNldE11dGUpCi0KLWNsYXNzIFJlcVNjcmVlblN0YXRlKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9SRVFTQ1JFRU5TVEFURQotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6cmlsX3Byb3RvLlJlcVNjcmVlblN0YXRlKQotCi0jIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtb2R1bGVfc2NvcGUpCmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvanMvbW9ja19yaWwuanMgYi9tb2NrLXJpbC9zcmMvanMvbW9ja19yaWwuanMKaW5kZXggZjdjNDkwMS4uODQ4NTM1OCAxMDA2NDQKLS0tIGEvbW9jay1yaWwvc3JjL2pzL21vY2tfcmlsLmpzCisrKyBiL21vY2stcmlsL3NyYy9qcy9tb2NrX3JpbC5qcwpAQCAtMjYwLDEwICsyNjAsMTAgQEAKIGRpc3BhdGNoVGFibGVbUklMX1JFUVVFU1RfU0lHTkFMX1NUUkVOR1RIXSAgPSB7IC8vIDE5CiAgICAgJ2NvbXBvbmVudHMnIDogW3NpbXVsYXRlZFJhZGlvV29ya2VyXSwKIH07Ci1kaXNwYXRjaFRhYmxlW1JJTF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFURV0gPSB7IC8vIDIwCitkaXNwYXRjaFRhYmxlW1JJTF9SRVFVRVNUX1ZPSUNFX1JFR0lTVFJBVElPTl9TVEFURV0gPSB7IC8vIDIwCiAgICAgJ2NvbXBvbmVudHMnIDogW3NpbXVsYXRlZFJhZGlvV29ya2VyXSwKIH07Ci1kaXNwYXRjaFRhYmxlW1JJTF9SRVFVRVNUX0dQUlNfUkVHSVNUUkFUSU9OX1NUQVRFXSA9IHsgLy8gMjEKK2Rpc3BhdGNoVGFibGVbUklMX1JFUVVFU1RfREFUQV9SRUdJU1RSQVRJT05fU1RBVEVdID0geyAvLyAyMQogICAgICdjb21wb25lbnRzJyA6IFtzaW11bGF0ZWRSYWRpb1dvcmtlcl0sCiB9OwogZGlzcGF0Y2hUYWJsZVtSSUxfUkVRVUVTVF9PUEVSQVRPUl0gPSB7IC8vIDIyCmRpZmYgLS1naXQgYS9tb2NrLXJpbC9zcmMvanMvcmlsX3ZhcnMuanMgYi9tb2NrLXJpbC9zcmMvanMvcmlsX3ZhcnMuanMKaW5kZXggODI0NjFkNS4uYWFkYzM1YSAxMDA2NDQKLS0tIGEvbW9jay1yaWwvc3JjL2pzL3JpbF92YXJzLmpzCisrKyBiL21vY2stcmlsL3NyYy9qcy9yaWxfdmFycy5qcwpAQCAtMTg3LDggKzE4Nyw4IEBACiB2YXIgUklMX1JFUVVFU1RfVURVQiA9IDE3CiB2YXIgUklMX1JFUVVFU1RfTEFTVF9DQUxMX0ZBSUxfQ0FVU0UgPSAxOAogdmFyIFJJTF9SRVFVRVNUX1NJR05BTF9TVFJFTkdUSCA9IDE5Ci12YXIgUklMX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRFID0gMjAKLXZhciBSSUxfUkVRVUVTVF9HUFJTX1JFR0lTVFJBVElPTl9TVEFURSA9IDIxCit2YXIgUklMX1JFUVVFU1RfVk9JQ0VfUkVHSVNUUkFUSU9OX1NUQVRFID0gMjAKK3ZhciBSSUxfUkVRVUVTVF9EQVRBX1JFR0lTVFJBVElPTl9TVEFURSA9IDIxCiB2YXIgUklMX1JFUVVFU1RfT1BFUkFUT1IgPSAyMgogdmFyIFJJTF9SRVFVRVNUX1JBRElPX1BPV0VSID0gMjMKIHZhciBSSUxfUkVRVUVTVF9EVE1GID0gMjQKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9qcy9zaW11bGF0ZWRfaWNjLmpzIGIvbW9jay1yaWwvc3JjL2pzL3NpbXVsYXRlZF9pY2MuanMKaW5kZXggZWU4ZTRkMS4uOTU5MDMxZiAxMDA2NDQKLS0tIGEvbW9jay1yaWwvc3JjL2pzL3NpbXVsYXRlZF9pY2MuanMKKysrIGIvbW9jay1yaWwvc3JjL2pzL3NpbXVsYXRlZF9pY2MuanMKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAgICAgdGhpcy51bml2ZXJzYWxQaW5TdGF0ZSA9IFBJTlNUQVRFX1VOS05PV047CiAgICAgICAgIHRoaXMuZ3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4ID0gMDsKICAgICAgICAgdGhpcy5jZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXggPSBDQVJEX01BWF9BUFBTOworICAgICAgICB0aGlzLmltc1N1YnNjcmlwdGlvbkFwcEluZGV4ID0gQ0FSRF9NQVhfQVBQUzsKICAgICAgICAgdGhpcy5udW1BcHBsaWNhdGlvbnMgPSAxOwogICAgICAgICB0aGlzLmFwcGxpY2F0aW9ucyA9IG5ldyBBcnJheShDQVJEX01BWF9BUFBTKTsKIApkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2pzL3NpbXVsYXRlZF9yYWRpby5qcyBiL21vY2stcmlsL3NyYy9qcy9zaW11bGF0ZWRfcmFkaW8uanMKaW5kZXggZmI3OTM1Ni4uOTE1MzY5NCAxMDA2NDQKLS0tIGEvbW9jay1yaWwvc3JjL2pzL3NpbXVsYXRlZF9yYWRpby5qcworKysgYi9tb2NrLXJpbC9zcmMvanMvc2ltdWxhdGVkX3JhZGlvLmpzCkBAIC0xMzQsOSArMTM0LDE4IEBACiAgICAgICAgIHRoaXMuc2lnbmFsTm9pc2VSYXRpbyA9IDA7CiAgICAgfQogCisgICAgZnVuY3Rpb24gTFRFU2lnbmFsU3RyZW5ndGgoKSB7CisgICAgICAgIHRoaXMuc2lnbmFsU3RyZW5ndGggPSAtMTsKKyAgICAgICAgdGhpcy5yc3JwID0gMDsKKyAgICAgICAgdGhpcy5yc3JxID0gMDsKKyAgICAgICAgdGhpcy5yc3NuciA9IDA7CisgICAgICAgIHRoaXMuY3FpID0gMDsKKyAgICB9CisKICAgICB2YXIgZ3dTaWduYWxTdHJlbmd0aCA9IG5ldyBHV1NpZ25hbFN0cmVuZ3RoOwogICAgIHZhciBjZG1hU2lnbmFsU3RyZW5ndGggPSBuZXcgQ0RNQVNpZ25hbFN0cmVuZ3RoKCk7CiAgICAgdmFyIGV2ZG9TaWduYWxTdHJlbmd0aCA9IG5ldyBFVkRPU2lnbmFsU3RyZW5ndGgoKTsKKyAgICB2YXIgbHRlU2lnbmFsU3RyZW5ndGggPSBuZXcgTFRFU2lnbmFsU3RyZW5ndGgoKTsKIAogICAgIC8qKgogICAgICAqIFRoZSB0aGUgYXJyYXkgb2YgY2FsbHMsIHRoaXMgaXMgYSBzcGFyc2UKQEAgLTI5Myw2ICszMDIsMTEgQEAKICAgICAgICAgcHJpbnQoJ2V2ZG9Sc3NpOiAnICsgZXZkb1NpZ25hbFN0cmVuZ3RoLmRibSk7CiAgICAgICAgIHByaW50KCdldmRvRWNpbzogJyArIGV2ZG9TaWduYWxTdHJlbmd0aC5lY2lvKTsKICAgICAgICAgcHJpbnQoJ2V2ZG9TbnI6ICcgICsgZXZkb1NpZ25hbFN0cmVuZ3RoLnNpZ25hbE5vaXNlUmF0aW8pOworICAgICAgICBwcmludCgnbHRlUnNzaTogJyAgKyBsdGVTaWduYWxTdHJlbmd0aC5zaWduYWxTdHJlbmd0aCk7CisgICAgICAgIHByaW50KCdsdGVSc3JwOiAnICArIGx0ZVNpZ25hbFN0cmVuZ3RoLnJzcnApOworICAgICAgICBwcmludCgnbHRlUnNycTogJyAgKyBsdGVTaWduYWxTdHJlbmd0aC5yc3JxKTsKKyAgICAgICAgcHJpbnQoJ2x0ZVJzc25yOiAnICsgbHRlU2lnbmFsU3RyZW5ndGgucnNzbnIpOworICAgICAgICBwcmludCgnbHRlQ3FpOiAnICAgKyBsdGVTaWduYWxTdHJlbmd0aC5jcWkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzAyLDcgKzMxNiw4IEBACiAgICAgICogICAgICAgIGNkbWFEYm0sIGNkbWFFY2lvLCBldmRvUnNzaSwgZXZkb0VjaW8sIGV2ZG9TbnIgYXJlIHBhcmFtZXRlcnMgZm9yIENETUEgJiBFVkRPCiAgICAgICovCiAgICAgdGhpcy5zZXRTaWduYWxTdHJlbmd0aCA9IGZ1bmN0aW9uKHJzc2ksIGJpdEVycm9yUmF0ZSwgY2RtYURibSwgY2RtYUVjaW8sIGV2ZG9Sc3NpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmRvRWNpbywgZXZkb1NucikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmRvRWNpbywgZXZkb1NuciwgbHRlU2lnU3RyZW5ndGgsIGx0ZVJzcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0ZVJzcnEsIGx0ZVJzc25yLCBsdGVDcWkpIHsKICAgICAgICAgcHJpbnQoJ3NldFNpZ25hbFN0cmVuZ3RoIEUnKTsKIAogICAgICAgICBpZiAocnNzaSAhPSA5OSkgewpAQCAtMzE4LDYgKzMzMywxMSBAQAogICAgICAgICBldmRvU2lnbmFsU3RyZW5ndGguZGJtID0gZXZkb1Jzc2k7CiAgICAgICAgIGV2ZG9TaWduYWxTdHJlbmd0aC5lY2lvID0gZXZkb0VjaW87CiAgICAgICAgIGV2ZG9TaWduYWxTdHJlbmd0aC5zaWduYWxOb2lzZVJhdGlvID0gZXZkb1NucjsKKyAgICAgICAgbHRlU2lnbmFsU3RyZW5ndGguc2lnbmFsU3RyZW5ndGggPSBsdGVTaWdTdHJlbmd0aDsKKyAgICAgICAgbHRlU2lnbmFsU3RyZW5ndGgucnNycCA9IGx0ZVJzcnA7CisgICAgICAgIGx0ZVNpZ25hbFN0cmVuZ3RoLnJzcnEgPSBsdGVSc3JxOworICAgICAgICBsdGVTaWduYWxTdHJlbmd0aC5yc3NuciA9IGx0ZVJzc25yOworICAgICAgICBsdGVTaWduYWxTdHJlbmd0aC5jcWkgPSBsdGVDcWk7CiAKICAgICAgICAgLy8gcGFjayB0aGUgc2lnbmFsIHN0cmVuZ3RoIGludG8gUnNwU2lnbmFsU3RyZW5ndGggYW5kIHNlbmQgYSB1bnNvbGljaXRlZCByZXNwb25zZQogICAgICAgICB2YXIgcnNwID0gbmV3IE9iamVjdCgpOwpAQCAtMzI1LDYgKzM0NSw3IEBACiAgICAgICAgIHJzcC5nd1NpZ25hbHN0cmVuZ3RoID0gZ3dTaWduYWxTdHJlbmd0aDsKICAgICAgICAgcnNwLmNkbVNpZ25hbHN0cmVuZ3RoID0gY2RtYVNpZ25hbFN0cmVuZ3RoOwogICAgICAgICByc3AuZXZkb1NpZ25hbHN0cmVuZ3RoID0gZXZkb1NpZ25hbFN0cmVuZ3RoOworICAgICAgICByc3AubHRlU2lnbmFsc3RyZW5ndGggPSBsdGVTaWduYWxTdHJlbmd0aDsKIAogICAgICAgICB2YXIgcmVzcG9uc2UgPSByaWxTY2hlbWFbcGFja2FnZU5hbWVBbmRTZXBlcmF0b3IgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUnNwU2lnbmFsU3RyZW5ndGgnXS5zZXJpYWxpemUocnNwKTsKQEAgLTYzMywxMiArNjU0LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGFuZGxlIFJJTF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFURQorICAgICAqIEhhbmRsZSBSSUxfUkVRVUVTVF9WT0lDRV9SRUdJU1RSQVRJT05fU1RBVEUKICAgICAgKgogICAgICAqIEBwYXJhbSByZXEgaXMgdGhlIFJlcXVlc3QKICAgICAgKi8KLSAgICB0aGlzLnJpbFJlcXVlc3RSZWdpc3RyYXRpb25TdGF0ZSA9IGZ1bmN0aW9uKHJlcSkgeyAvLyAyMAotICAgICAgICBwcmludCgnUmFkaW86IHJpbFJlcXVlc3RSZWdpc3RyYXRpb25TdGF0ZScpOworICAgIHRoaXMucmlsUmVxdWVzdFZvaWNlUmVnaXN0cmF0aW9uU3RhdGUgPSBmdW5jdGlvbihyZXEpIHsgLy8gMjAKKyAgICAgICAgcHJpbnQoJ1JhZGlvOiByaWxSZXF1ZXN0Vm9pY2VSZWdpc3RyYXRpb25TdGF0ZScpOwogCiAgICAgICAgIHZhciByc3AgPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgIHJzcC5zdHJpbmdzID0gQXJyYXkoKTsKQEAgLTY2NCwxMiArNjg1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGFuZGxlIFJJTF9SRVFVRVNUX0dQUlNfUkVHSVNUUkFUSU9OX1NUQVRFCisgICAgICogSGFuZGxlIFJJTF9SRVFVRVNUX0RBVEFfUkVHSVNUUkFUSU9OX1NUQVRFCiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVxIGlzIHRoZSBSZXF1ZXN0CiAgICAgICovCi0gICAgdGhpcy5yaWxSZXF1ZXN0R3Byc1JlZ2lzdHJhdGlvblN0YXRlID0gZnVuY3Rpb24ocmVxKSB7IC8vIDIxCi0gICAgICAgIHByaW50KCdSYWRpbzogcmlsUmVxdWVzdEdwcnNSZWdpc3RyYXRpb25TdGF0ZScpOworICAgIHRoaXMucmlsUmVxdWVzdERhdGFSZWdpc3RyYXRpb25TdGF0ZSA9IGZ1bmN0aW9uKHJlcSkgeyAvLyAyMQorICAgICAgICBwcmludCgnUmFkaW86IHJpbFJlcXVlc3REYXRhUmVnaXN0cmF0aW9uU3RhdGUnKTsKIAogICAgICAgICB2YXIgcnNwID0gbmV3IE9iamVjdCgpOwogICAgICAgICByc3Auc3RyaW5ncyA9IEFycmF5KCk7CkBAIC0xMTgyLDEwICsxMjAzLDEwIEBACiAgICAgICAgICAgICAgICAgdGhpcy5yaWxSZXF1ZXN0TGFzdENhbGxGYWlsQ2F1c2U7CiAgICAgdGhpcy5yYWRpb0Rpc3BhdGNoVGFibGVbUklMX1JFUVVFU1RfU0lHTkFMX1NUUkVOR1RIXSA9IC8vIDE5CiAgICAgICAgICAgICAgICAgdGhpcy5yaWxSZXF1ZXN0U2lnbmFsU3RyZW5ndGg7Ci0gICAgdGhpcy5yYWRpb0Rpc3BhdGNoVGFibGVbUklMX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRFXSA9IC8vIDIwCi0gICAgICAgICAgICAgICAgdGhpcy5yaWxSZXF1ZXN0UmVnaXN0cmF0aW9uU3RhdGU7Ci0gICAgdGhpcy5yYWRpb0Rpc3BhdGNoVGFibGVbUklMX1JFUVVFU1RfR1BSU19SRUdJU1RSQVRJT05fU1RBVEVdID0gLy8gMjEKLSAgICAgICAgICAgICAgICB0aGlzLnJpbFJlcXVlc3RHcHJzUmVnaXN0cmF0aW9uU3RhdGU7CisgICAgdGhpcy5yYWRpb0Rpc3BhdGNoVGFibGVbUklMX1JFUVVFU1RfVk9JQ0VfUkVHSVNUUkFUSU9OX1NUQVRFXSA9IC8vIDIwCisgICAgICAgICAgICAgICAgdGhpcy5yaWxSZXF1ZXN0Vm9pY2VSZWdpc3RyYXRpb25TdGF0ZTsKKyAgICB0aGlzLnJhZGlvRGlzcGF0Y2hUYWJsZVtSSUxfUkVRVUVTVF9EQVRBX1JFR0lTVFJBVElPTl9TVEFURV0gPSAvLyAyMQorICAgICAgICAgICAgICAgIHRoaXMucmlsUmVxdWVzdERhdGFSZWdpc3RyYXRpb25TdGF0ZTsKICAgICB0aGlzLnJhZGlvRGlzcGF0Y2hUYWJsZVtSSUxfUkVRVUVTVF9BTlNXRVJdID0gLy8gNDAKICAgICAgICAgICAgICAgICB0aGlzLnJpbFJlcXVlc3RBbnN3ZXI7CiAgICAgdGhpcy5yYWRpb0Rpc3BhdGNoVGFibGVbUklMX1JFUVVFU1RfUVVFUllfTkVUV09SS19TRUxFQ1RJT05fTU9ERV0gPSAvLyA0NQpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL2pzL3NpbXVsYXRlZF9yYWRpb190ZXN0cy5qcyBiL21vY2stcmlsL3NyYy9qcy9zaW11bGF0ZWRfcmFkaW9fdGVzdHMuanMKaW5kZXggZTZiMDI3Yi4uNDk3NzY3YiAxMDA2NDQKLS0tIGEvbW9jay1yaWwvc3JjL2pzL3NpbXVsYXRlZF9yYWRpb190ZXN0cy5qcworKysgYi9tb2NrLXJpbC9zcmMvanMvc2ltdWxhdGVkX3JhZGlvX3Rlc3RzLmpzCkBAIC0yNiwxMyArMjYsMTMgQEAKICAgICAgICAgcHJpbnQoJ3Rlc3RTZXRTaWduYWxTdHJlbmd0aCBFOicpOwogICAgICAgICBzaW11bGF0ZWRSYWRpby5wcmludFNpZ25hbFN0cmVuZ3RoKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzaW11bGF0ZWRSYWRpby5zZXRTaWduYWxTdHJlbmd0aCgwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgICAgICAgICAgIHNpbXVsYXRlZFJhZGlvLnNldFNpZ25hbFN0cmVuZ3RoKDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CiAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgcHJpbnQoJ3Rlc3QgZmFpbGVkJyk7CiAgICAgICAgIH0KICAgICAgICAgc2ltdWxhdGVkUmFkaW8ucHJpbnRTaWduYWxTdHJlbmd0aCgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc2ltdWxhdGVkUmFkaW8uc2V0U2lnbmFsU3RyZW5ndGgoNjAsIDMwLCAyOSAsIDI4LCAyNywgMjYsIDI1KTsKKyAgICAgICAgICAgIHNpbXVsYXRlZFJhZGlvLnNldFNpZ25hbFN0cmVuZ3RoKDYwLCAzMCwgMjkgLCAyOCwgMjcsIDI2LCAyNSwgMjQsIDIzLCAyMiwgMjEsIDIwKTsKICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICBwcmludCgndGVzdCBzdWNjZXNzOiAnICsgZXJyKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbW9jay1yaWwvc3JjL3Byb3RvL2N0cmwucHJvdG8gYi9tb2NrLXJpbC9zcmMvcHJvdG8vY3RybC5wcm90bwppbmRleCA5YTVmOTI5Li4wNzA1Mzg2IDEwMDY0NAotLS0gYS9tb2NrLXJpbC9zcmMvcHJvdG8vY3RybC5wcm90bworKysgYi9tb2NrLXJpbC9zcmMvcHJvdG8vY3RybC5wcm90bwpAQCAtNiw3ICs2LDcgQEAKIG9wdGlvbiBqYXZhX3BhY2thZ2U9J2NvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8nOwogb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lPSdSaWxDdHJsQ21kcyc7CiAKLWltcG9ydCAicmlsLnByb3RvIjsKK2ltcG9ydCAiaGFyZHdhcmUvcmlsL21vY2stcmlsL3NyYy9wcm90by9yaWwucHJvdG8iOwogCiBlbnVtIEN0cmxDbWQgewogICBDVFJMX0NNRF9FQ0hPID0gMDsKZGlmZiAtLWdpdCBhL21vY2stcmlsL3NyYy9wcm90by9yaWwucHJvdG8gYi9tb2NrLXJpbC9zcmMvcHJvdG8vcmlsLnByb3RvCmluZGV4IDk5NjcyMDQuLmY3YzJlNzMgMTAwNjQ0Ci0tLSBhL21vY2stcmlsL3NyYy9wcm90by9yaWwucHJvdG8KKysrIGIvbW9jay1yaWwvc3JjL3Byb3RvL3JpbC5wcm90bwpAQCAtMTAzLDggKzEwMyw5IEBACiAgIG9wdGlvbmFsIFJpbFBpblN0YXRlICB1bml2ZXJzYWxfcGluX3N0YXRlICAgICAgICAgICAgID0gMjsgLyogYXBwbGljYWJsZSB0byBVU0lNIGFuZCBDU0lNOiBQSU5TVEFURV94eHggKi8KICAgb3B0aW9uYWwgaW50MzIgICAgICAgIGdzbV91bXRzX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXggPSAzOyAvKiB2YWx1ZSA8IENBUkRfTUFYX0FQUFMgKi8KICAgb3B0aW9uYWwgaW50MzIgICAgICAgIGNkbWFfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCAgICAgPSA0OyAvKiB2YWx1ZSA8IENBUkRfTUFYX0FQUFMgKi8KLSAgb3B0aW9uYWwgaW50MzIgICAgICAgIG51bV9hcHBsaWNhdGlvbnMgICAgICAgICAgICAgICAgPSA1OyAvKiB2YWx1ZSA8PSBDQVJEX01BWF9BUFBTICovCi0gIHJlcGVhdGVkIFJpbEFwcFN0YXR1cyBhcHBsaWNhdGlvbnMgICAgICAgICAgICAgICAgICAgID0gNjsgLyogQ0FSRF9NQVhfQVBQUyA9PSA4ICovCisgIG9wdGlvbmFsIGludDMyICAgICAgICBpbXNfc3Vic2NyaXB0aW9uX2FwcF9pbmRleCAgICAgID0gNTsgLyogdmFsdWUgPCBDQVJEX01BWF9BUFBTICovCisgIG9wdGlvbmFsIGludDMyICAgICAgICBudW1fYXBwbGljYXRpb25zICAgICAgICAgICAgICAgID0gNjsgLyogdmFsdWUgPD0gQ0FSRF9NQVhfQVBQUyAqLworICByZXBlYXRlZCBSaWxBcHBTdGF0dXMgYXBwbGljYXRpb25zICAgICAgICAgICAgICAgICAgICA9IDc7IC8qIENBUkRfTUFYX0FQUFMgPT0gOCAqLwogfQogCiAvKiBVc2VyLXRvLVVzZXIgc2lnbmFsaW5nIEluZm8gYWN0aXZhdGlvbiB0eXBlcyBkZXJpdmVkIGZyb20gM0dQUCAyMy4wODcgdjguMCAqLwpAQCAtMTk4LDYgKzE5OSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggaXMgdGhlIGhpZ2hlc3Qgc2lnbmFsIHRvIG5vaXNlIHJhdGlvLiAqLwogfQogCittZXNzYWdlIFJJTExURVNpZ25hbFN0cmVuZ3RoIHsKKyAgICBvcHRpb25hbCBpbnQzMiBzaWduYWxfc3RyZW5ndGggPSAxOyAvKiBWYWxpZCB2YWx1ZXMgYXJlICgwLTMxLCA5OSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgYXMgZGVmaW5lZCBpbiBUUyAyNy4wMDcgOC41ICovCisgICAgb3B0aW9uYWwgaW50MzIgcnNycCA9IDI7ICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgUmVmZXJlbmNlIFNpZ25hbCBSZWNlaXZlIFBvd2VyIGluIGRCbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG11bHRpcGxlZCBieSAtMS4gUmFuZ2U6IDQ0IHRvIDE0MCBkQm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVE9ETzogZG9jIHJlZmVyZW5jZSAqLworICAgIG9wdGlvbmFsIGludDMyIHJzcnEgPSAzOyAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IFJlZmVyZW5jZSBTaWduYWwgUmVjZWl2ZSBRdWFsaXR5IGluIGRCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbXVsdGlwbGllZCBieSAtMS4gUmFuZ2U6IDIwIHRvIDMgZEIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVE9ETzogZG9jIHJlZmVyZW5jZSAqLworICAgIG9wdGlvbmFsIGludDMyIHJzc25yID0gNDsgICAgICAgICAgIC8qIFRPRE86IE5lZWQgZG9jdW1lbnRhdGlvbiBhbmQgZG9jIHJlZmVyZW5jZSAqLworICAgIG9wdGlvbmFsIGludDMyIGNxaSA9IDU7ICAgICAgICAgICAgIC8qIFRPRE86IE5lZWQgZG9jdW1lbnRhdGlvbiBhbmQgZG9jIHJlZmVyZW5jZSAqLworfQorCiAvLyBSZXNwb25zZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLgogLy8KIC8vIElmIGEgc3RyaW5ncyhpKSBpcyAiKm1hZ2ljLW51bGwqIiB0aGVuIHRoYXQgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhcyBudWxsLgpAQCAtMjU2LDYgKzI3MCw3IEBACiAgICAgb3B0aW9uYWwgUklMR1dTaWduYWxTdHJlbmd0aCAgIGd3X3NpZ25hbHN0cmVuZ3RoICAgPSAxOwogICAgIG9wdGlvbmFsIFJJTENETUFTaWduYWxTdHJlbmd0aCBjZG1hX3NpZ25hbHN0cmVuZ3RoID0gMjsKICAgICBvcHRpb25hbCBSSUxFVkRPU2lnbmFsU3RyZW5ndGggZXZkb19zaWduYWxzdHJlbmd0aCA9IDM7CisgICAgb3B0aW9uYWwgUklMTFRFU2lnbmFsU3RyZW5ndGggbHRlX3NpZ25hbHN0cmVuZ3RoID0gNDsKIH0KIAogLy8gMjIgUklMX1JFUVVFU1RfT1BFUkFUT1IgcmVzcG9uc2UKZGlmZiAtLWdpdCBhL3JlZmVyZW5jZS1jZG1hLXNtcy9BbmRyb2lkLm1rIGIvcmVmZXJlbmNlLWNkbWEtc21zL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzlkOGMuLjAwMDAwMDAKLS0tIGEvcmVmZXJlbmNlLWNkbWEtc21zL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIENvcHlyaWdodCAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIHJlZmVyZW5jZS1jZG1hLXNtcy5jCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJyaWwKLQotIyBmb3IgYXNwcmluZgotTE9DQUxfQ0ZMQUdTIDo9IC1EX0dOVV9TT1VSQ0UKLQotTE9DQUxfQ19JTkNMVURFUyA6PSAkKEtFUk5FTF9IRUFERVJTKQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgbGliY3V0aWxzIGxpYnV0aWxzCi1MT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCi1MT0NBTF9NT0RVTEU6PSBsaWJyZWZlcmVuY2UtY2RtYS1zbXMKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3JlZmVyZW5jZS1jZG1hLXNtcy9yZWZlcmVuY2UtY2RtYS1zbXMuYyBiL3JlZmVyZW5jZS1jZG1hLXNtcy9yZWZlcmVuY2UtY2RtYS1zbXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliMjc3NC4uMDAwMDAwMAotLS0gYS9yZWZlcmVuY2UtY2RtYS1zbXMvcmVmZXJlbmNlLWNkbWEtc21zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaW5jbHVkZSAicmVmZXJlbmNlLWNkbWEtc21zLmgiCi0KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIkNETUEiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLVJJTF9FcnJubyB3bXN0c19yaWxfY2RtYV9kZWNvZGVfc21zKCBSSUxfQ0RNQV9FbmNvZGVkX1NNUyAqICBlbmNvZGVkX3NtcywKLSAgICAgICAgUklMX0NETUFfU01TX0NsaWVudEJkICogY2xpZW50X2JkKSB7Ci0gICAgTE9HRSgicmlsX2NkbWFfZGVjb2RlX3NtcyBmdW5jdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIpOwotICAgIHJldHVybiBSSUxfRV9HRU5FUklDX0ZBSUxVUkU7Ci0gIH0KLQotUklMX0Vycm5vIHdtc3RzX3JpbF9jZG1hX2VuY29kZV9zbXMoUklMX0NETUFfU01TX0NsaWVudEJkICogY2xpZW50X2JkLAotICAgICAgICBSSUxfQ0RNQV9FbmNvZGVkX1NNUyAqICBlbmNvZGVkX3NtcykgewotCi0gICAgTE9HRSgicmlsX2NkbWFfZW5jb2RlX3NtcyBmdW5jdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIpOwotICAgIHJldHVybiBSSUxfRV9HRU5FUklDX0ZBSUxVUkU7Ci0gIH0KZGlmZiAtLWdpdCBhL3JlZmVyZW5jZS1jZG1hLXNtcy9yZWZlcmVuY2UtY2RtYS1zbXMuaCBiL3JlZmVyZW5jZS1jZG1hLXNtcy9yZWZlcmVuY2UtY2RtYS1zbXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzZGRmNS4uMDAwMDAwMAotLS0gYS9yZWZlcmVuY2UtY2RtYS1zbXMvcmVmZXJlbmNlLWNkbWEtc21zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBSRUZFUkVOQ0VfQ0RNQV9TTVNfSAotI2RlZmluZSBSRUZFUkVOQ0VfQ0RNQV9TTVNfSCAxCi0KLSNpbmNsdWRlIDx0ZWxlcGhvbnkvcmlsLmg+Ci0jaW5jbHVkZSA8dGVsZXBob255L3JpbF9jZG1hX3Ntcy5oPgotCi0vKioKLSAqIFRPRE8gVDoKLSAqIGNoZWNrIGlmIEJlYXJlciBkYXRhIHN1YnBhcmFtZXRlciBtYXNrIHZhbHVlcyAoQ0RNU19TTUFfTUFTS18qKSBoYXZlIHRvIGJlIG1vdmVkIHRvIHJpbF9jZG1hX3Ntcy5oCi0gKiB2ZW5kb3IgaW1wbGVtZW50YXRpb24gbmVlZHMgdG8gdXNlIHJpbF9jZG1hX2RlY29kZV9zbXMgYW5kIHJpbF9jZG1hX2VuY29kZV9zbXMgYXMgZnVuY3Rpb24gbmFtZXMKLSAqLwotCi0vKiogQmVhcmVyIGRhdGEgc3VicGFyYW1ldGVyIG1hc2sgdmFsdWVzOiAqLwotLy8gVE9ETyBUOiB1c2UgZW51bSBmcm9tIHZlbmRvciAuaAotI2RlZmluZSBXTVNfTUFTS19CRF9OVUxMICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFdNU19NQVNLX0JEX01TR19JRCAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgV01TX01BU0tfQkRfVVNFUl9EQVRBICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBXTVNfTUFTS19CRF9VU0VSX1JFU1AgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFdNU19NQVNLX0JEX01DX1RJTUUgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgV01TX01BU0tfQkRfVkFMSURfQUJTICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBXTVNfTUFTS19CRF9WQUxJRF9SRUwgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFdNU19NQVNLX0JEX0RFRkVSX0FCUyAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgV01TX01BU0tfQkRfREVGRVJfUkVMICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBXTVNfTUFTS19CRF9QUklPUklUWSAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFdNU19NQVNLX0JEX1BSSVZBQ1kgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgV01TX01BU0tfQkRfUkVQTFlfT1BUSU9OICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBXTVNfTUFTS19CRF9OVU1fT0ZfTVNHUyAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIFdNU19NQVNLX0JEX0FMRVJUICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgV01TX01BU0tfQkRfTEFOR1VBR0UgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBXTVNfTUFTS19CRF9DQUxMQkFDSyAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIFdNU19NQVNLX0JEX0RJU1BMQVlfTU9ERSAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgV01TX01BU0tfQkRfU0NQVF9EQVRBICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBXTVNfTUFTS19CRF9TQ1BUX1JFU1VMVCAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIFdNU19NQVNLX0JEX0RFUE9TSVRfSU5ERVggICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgV01TX01BU0tfQkRfREVMSVZFUllfU1RBVFVTICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBXTVNfTUFTS19CRF9JUF9BRERSRVNTICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIFdNU19NQVNLX0JEX1JTTl9OT19OT1RJRlkgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgV01TX01BU0tfQkRfT1RIRVIgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotCi0KLS8qKiBEZWNvZGUgYSBDRE1BIFNNUyBNZXNzYWdlLiAqLwotUklMX0Vycm5vIHdtc3RzX3JpbF9jZG1hX2RlY29kZV9zbXMgKAotICAgIFJJTF9DRE1BX0VuY29kZWRfU01TICogIGVuY29kZWRfc21zLCAgIC8qIElucHV0ICovCi0gICAgUklMX0NETUFfU01TX0NsaWVudEJkICogY2xpZW50X2JkICAgICAgLyogT3V0cHV0ICovCi0pOwotCi0vKiogRW5jb2RlIGEgQ0RNQSBTTVMgTWVzc2FnZS4gKi8KLVJJTF9FcnJubyB3bXN0c19yaWxfY2RtYV9lbmNvZGVfc21zICgKLSAgICBSSUxfQ0RNQV9TTVNfQ2xpZW50QmQgKiBjbGllbnRfYmQsICAgICAvKiBJbnB1dCAqLwotICAgIFJJTF9DRE1BX0VuY29kZWRfU01TICogIGVuY29kZWRfc21zICAgIC8qIE91dHB1dCAqLwotKTsKLQotI2VuZGlmIC8qUkVGRVJFTkNFX0NETUFfU01TX0gqLwotCmRpZmYgLS1naXQgYS9yZWZlcmVuY2UtcmlsL3JlZmVyZW5jZS1yaWwuYyBiL3JlZmVyZW5jZS1yaWwvcmVmZXJlbmNlLXJpbC5jCmluZGV4IDYzM2FkOGIuLjE5N2YwNzAgMTAwNjQ0Ci0tLSBhL3JlZmVyZW5jZS1yaWwvcmVmZXJlbmNlLXJpbC5jCisrKyBiL3JlZmVyZW5jZS1yaWwvcmVmZXJlbmNlLXJpbC5jCkBAIC0xNSw3ICsxNSw2IEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKLSNpbmNsdWRlIDx0ZWxlcGhvbnkvcmlsLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTMzLDYgKzMyLDkgQEAKICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RlbV9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlICJyaWwuaCIKIAogI2RlZmluZSBMT0dfVEFHICJSSUwiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC00MCw3ICs0Miw3IEBACiAjZGVmaW5lIE1BWF9BVF9SRVNQT05TRSAweDEwMDAKIAogLyogcGF0aG5hbWUgcmV0dXJuZWQgZnJvbSBSSUxfUkVRVUVTVF9TRVRVUF9EQVRBX0NBTEwgLyBSSUxfUkVRVUVTVF9TRVRVUF9ERUZBVUxUX1BEUCAqLwotI2RlZmluZSBQUFBfVFRZX1BBVEggIi9kZXYvb21hcF9jc21pX3R0eTEiCisjZGVmaW5lIFBQUF9UVFlfUEFUSCAiZXRoMCIKIAogI2lmZGVmIFVTRV9USV9DT01NQU5EUwogCkBAIC02Myw3ICs2NSw3IEBACiAgICAgU0lNX1BJTiA9IDMsCiAgICAgU0lNX1BVSyA9IDQsCiAgICAgU0lNX05FVFdPUktfUEVSU09OQUxJWkFUSU9OID0gNQotfSBTSU1fU3RhdHVzOyAKK30gU0lNX1N0YXR1czsKIAogc3RhdGljIHZvaWQgb25SZXF1ZXN0IChpbnQgcmVxdWVzdCwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sIFJJTF9Ub2tlbiB0KTsKIHN0YXRpYyBSSUxfUmFkaW9TdGF0ZSBjdXJyZW50U3RhdGUoKTsKQEAgLTcyLDggKzc0LDggQEAKIHN0YXRpYyBjb25zdCBjaGFyICpnZXRWZXJzaW9uKCk7CiBzdGF0aWMgaW50IGlzUmFkaW9PbigpOwogc3RhdGljIFNJTV9TdGF0dXMgZ2V0U0lNU3RhdHVzKCk7Ci1zdGF0aWMgaW50IGdldENhcmRTdGF0dXMoUklMX0NhcmRTdGF0dXMgKipwcF9jYXJkX3N0YXR1cyk7Ci1zdGF0aWMgdm9pZCBmcmVlQ2FyZFN0YXR1cyhSSUxfQ2FyZFN0YXR1cyAqcF9jYXJkX3N0YXR1cyk7CitzdGF0aWMgaW50IGdldENhcmRTdGF0dXMoUklMX0NhcmRTdGF0dXNfdjYgKipwcF9jYXJkX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBmcmVlQ2FyZFN0YXR1cyhSSUxfQ2FyZFN0YXR1c192NiAqcF9jYXJkX3N0YXR1cyk7CiBzdGF0aWMgdm9pZCBvbkRhdGFDYWxsTGlzdENoYW5nZWQodm9pZCAqcGFyYW0pOwogCiBleHRlcm4gY29uc3QgY2hhciAqIHJlcXVlc3RUb1N0cmluZyhpbnQgcmVxdWVzdCk7CkBAIC0zMTUsMTkgKzMxNywyMiBAQAogICAgICAgICAgcF9jdXIgPSBwX2N1ci0+cF9uZXh0KQogICAgICAgICBuKys7CiAKLSAgICBSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlICpyZXNwb25zZXMgPQotICAgICAgICBhbGxvY2EobiAqIHNpemVvZihSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlKSk7CisgICAgUklMX0RhdGFfQ2FsbF9SZXNwb25zZV92NiAqcmVzcG9uc2VzID0KKyAgICAgICAgYWxsb2NhKG4gKiBzaXplb2YoUklMX0RhdGFfQ2FsbF9SZXNwb25zZV92NikpOwogCiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICByZXNwb25zZXNbaV0uc3RhdHVzID0gLTE7CiAgICAgICAgIHJlc3BvbnNlc1tpXS5jaWQgPSAtMTsKICAgICAgICAgcmVzcG9uc2VzW2ldLmFjdGl2ZSA9IC0xOwogICAgICAgICByZXNwb25zZXNbaV0udHlwZSA9ICIiOwotICAgICAgICByZXNwb25zZXNbaV0uYXBuID0gIiI7Ci0gICAgICAgIHJlc3BvbnNlc1tpXS5hZGRyZXNzID0gIiI7CisgICAgICAgIHJlc3BvbnNlc1tpXS5pZm5hbWUgPSAiIjsKKyAgICAgICAgcmVzcG9uc2VzW2ldLmFkZHJlc3NlcyA9ICIiOworICAgICAgICByZXNwb25zZXNbaV0uZG5zZXMgPSAiIjsKKyAgICAgICAgcmVzcG9uc2VzW2ldLmdhdGV3YXlzID0gIiI7CiAgICAgfQogCi0gICAgUklMX0RhdGFfQ2FsbF9SZXNwb25zZSAqcmVzcG9uc2UgPSByZXNwb25zZXM7CisgICAgUklMX0RhdGFfQ2FsbF9SZXNwb25zZV92NiAqcmVzcG9uc2UgPSByZXNwb25zZXM7CiAgICAgZm9yIChwX2N1ciA9IHBfcmVzcG9uc2UtPnBfaW50ZXJtZWRpYXRlczsgcF9jdXIgIT0gTlVMTDsKICAgICAgICAgIHBfY3VyID0gcF9jdXItPnBfbmV4dCkgewogICAgICAgICBjaGFyICpsaW5lID0gcF9jdXItPmxpbmU7CkBAIC0zNjMsMTAgKzM2OCw2IEBACiAgICAgICAgICBwX2N1ciA9IHBfY3VyLT5wX25leHQpIHsKICAgICAgICAgY2hhciAqbGluZSA9IHBfY3VyLT5saW5lOwogICAgICAgICBpbnQgY2lkOwotICAgICAgICBjaGFyICp0eXBlOwotICAgICAgICBjaGFyICphcG47Ci0gICAgICAgIGNoYXIgKmFkZHJlc3M7Ci0KIAogICAgICAgICBlcnIgPSBhdF90b2tfc3RhcnQoJmxpbmUpOwogICAgICAgICBpZiAoZXJyIDwgMCkKQEAgLTM4NiwzNyArMzg3LDg4IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCisgICAgICAgIC8vIEFzc3VtZSBubyBlcnJvcgorICAgICAgICByZXNwb25zZXNbaV0uc3RhdHVzID0gMDsKKworICAgICAgICAvLyB0eXBlCiAgICAgICAgIGVyciA9IGF0X3Rva19uZXh0c3RyKCZsaW5lLCAmb3V0KTsKICAgICAgICAgaWYgKGVyciA8IDApCiAgICAgICAgICAgICBnb3RvIGVycm9yOwotCiAgICAgICAgIHJlc3BvbnNlc1tpXS50eXBlID0gYWxsb2NhKHN0cmxlbihvdXQpICsgMSk7CiAgICAgICAgIHN0cmNweShyZXNwb25zZXNbaV0udHlwZSwgb3V0KTsKIAorICAgICAgICAvLyBBUE4gaWdub3JlZCBmb3IgdjUKICAgICAgICAgZXJyID0gYXRfdG9rX25leHRzdHIoJmxpbmUsICZvdXQpOwogICAgICAgICBpZiAoZXJyIDwgMCkKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKLSAgICAgICAgcmVzcG9uc2VzW2ldLmFwbiA9IGFsbG9jYShzdHJsZW4ob3V0KSArIDEpOwotICAgICAgICBzdHJjcHkocmVzcG9uc2VzW2ldLmFwbiwgb3V0KTsKKyAgICAgICAgcmVzcG9uc2VzW2ldLmlmbmFtZSA9IGFsbG9jYShzdHJsZW4oUFBQX1RUWV9QQVRIKSArIDEpOworICAgICAgICBzdHJjcHkocmVzcG9uc2VzW2ldLmlmbmFtZSwgUFBQX1RUWV9QQVRIKTsKIAogICAgICAgICBlcnIgPSBhdF90b2tfbmV4dHN0cigmbGluZSwgJm91dCk7CiAgICAgICAgIGlmIChlcnIgPCAwKQogICAgICAgICAgICAgZ290byBlcnJvcjsKIAotICAgICAgICByZXNwb25zZXNbaV0uYWRkcmVzcyA9IGFsbG9jYShzdHJsZW4ob3V0KSArIDEpOwotICAgICAgICBzdHJjcHkocmVzcG9uc2VzW2ldLmFkZHJlc3MsIG91dCk7CisgICAgICAgIHJlc3BvbnNlc1tpXS5hZGRyZXNzZXMgPSBhbGxvY2Eoc3RybGVuKG91dCkgKyAxKTsKKyAgICAgICAgc3RyY3B5KHJlc3BvbnNlc1tpXS5hZGRyZXNzZXMsIG91dCk7CisKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAgcHJvcFZhbHVlW1BST1BfVkFMVUVfTUFYXTsKKworICAgICAgICAgICAgaWYgKF9fc3lzdGVtX3Byb3BlcnR5X2dldCgicm8ua2VybmVsLnFlbXUiLCBwcm9wVmFsdWUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAvKiBXZSBhcmUgaW4gdGhlIGVtdWxhdG9yIC0gdGhlIGRucyBzZXJ2ZXJzIGFyZSBsaXN0ZWQKKyAgICAgICAgICAgICAgICAgKiBieSB0aGUgZm9sbG93aW5nIHN5c3RlbSBwcm9wZXJ0aWVzLCBzZXR1cCBpbgorICAgICAgICAgICAgICAgICAqIC9zeXN0ZW0vZXRjL2luaXQuZ29sZGZpc2guc2g6CisgICAgICAgICAgICAgICAgICogIC0gbmV0LmV0aDAuZG5zMQorICAgICAgICAgICAgICAgICAqICAtIG5ldC5ldGgwLmRuczIKKyAgICAgICAgICAgICAgICAgKiAgLSBuZXQuZXRoMC5kbnMzCisgICAgICAgICAgICAgICAgICogIC0gbmV0LmV0aDAuZG5zNAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIGRuc2xpc3Rfc3ogPSAxMjg7CisgICAgICAgICAgICAgICAgY2hhciogICAgICAgZG5zbGlzdCA9IGFsbG9jYShkbnNsaXN0X3N6KTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZXBhcmF0b3IgPSAiIjsKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICBubjsKKworICAgICAgICAgICAgICAgIGRuc2xpc3RbMF0gPSAwOworICAgICAgICAgICAgICAgIGZvciAobm4gPSAxOyBubiA8PSA0OyBubisrKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFByb2JlIG5ldC5ldGgwLmRuczxuPiAqLworICAgICAgICAgICAgICAgICAgICBjaGFyICBwcm9wTmFtZVtQUk9QX05BTUVfTUFYXTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYocHJvcE5hbWUsIHNpemVvZiBwcm9wTmFtZSwgIm5ldC5ldGgwLmRucyVkIiwgbm4pOworCisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBpZiB1bmRlZmluZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fc3lzdGVtX3Byb3BlcnR5X2dldChwcm9wTmFtZSwgcHJvcFZhbHVlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIEFwcGVuZCB0aGUgRE5TIElQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RybGNhdChkbnNsaXN0LCBzZXBhcmF0b3IsIGRuc2xpc3Rfc3opOworICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGRuc2xpc3QsIHByb3BWYWx1ZSwgZG5zbGlzdF9zeik7CisgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9ICIgIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzcG9uc2VzW2ldLmRuc2VzID0gZG5zbGlzdDsKKworICAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIG9ubHkgb24gZ2F0ZXdheSBpbiB0aGUgZW11bGF0b3IgKi8KKyAgICAgICAgICAgICAgICByZXNwb25zZXNbaV0uZ2F0ZXdheXMgPSAiMTAuMC4yLjIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSwgc28gdXNlIHRoZSBwdWJsaWMgR29vZ2xlIEROUworICAgICAgICAgICAgICAgICAqIHNlcnZlcnMgYnkgZGVmYXVsdCBhbmQgbm8gZ2F0ZXdheS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXNwb25zZXNbaV0uZG5zZXMgPSAiOC44LjguOCA4LjguNC40IjsKKyAgICAgICAgICAgICAgICByZXNwb25zZXNbaV0uZ2F0ZXdheXMgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIGF0X3Jlc3BvbnNlX2ZyZWUocF9yZXNwb25zZSk7CiAKICAgICBpZiAodCAhPSBOVUxMKQogICAgICAgICBSSUxfb25SZXF1ZXN0Q29tcGxldGUoKnQsIFJJTF9FX1NVQ0NFU1MsIHJlc3BvbnNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gKiBzaXplb2YoUklMX0RhdGFfQ2FsbF9SZXNwb25zZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAqIHNpemVvZihSSUxfRGF0YV9DYWxsX1Jlc3BvbnNlX3Y2KSk7CiAgICAgZWxzZQogICAgICAgICBSSUxfb25VbnNvbGljaXRlZFJlc3BvbnNlKFJJTF9VTlNPTF9EQVRBX0NBTExfTElTVF9DSEFOR0VELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICogc2l6ZW9mKFJJTF9EYXRhX0NhbGxfUmVzcG9uc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICogc2l6ZW9mKFJJTF9EYXRhX0NhbGxfUmVzcG9uc2VfdjYpKTsKIAogICAgIHJldHVybjsKIApAQCAtNzIzLDEwICs3NzUsMTAgQEAKICAgICBpbnQgY291bnQgPSAzOwogCiAKLSAgICBpZiAocmVxdWVzdCA9PSBSSUxfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVEUpIHsKKyAgICBpZiAocmVxdWVzdCA9PSBSSUxfUkVRVUVTVF9WT0lDRV9SRUdJU1RSQVRJT05fU1RBVEUpIHsKICAgICAgICAgY21kID0gIkFUK0NSRUc/IjsKICAgICAgICAgcHJlZml4ID0gIitDUkVHOiI7Ci0gICAgfSBlbHNlIGlmIChyZXF1ZXN0ID09IFJJTF9SRVFVRVNUX0dQUlNfUkVHSVNUUkFUSU9OX1NUQVRFKSB7CisgICAgfSBlbHNlIGlmIChyZXF1ZXN0ID09IFJJTF9SRVFVRVNUX0RBVEFfUkVHSVNUUkFUSU9OX1NUQVRFKSB7CiAgICAgICAgIGNtZCA9ICJBVCtDR1JFRz8iOwogICAgICAgICBwcmVmaXggPSAiK0NHUkVHOiI7CiAgICAgfSBlbHNlIHsKQEAgLTk2MCw3ICsxMDEyLDYgQEAKICAgICBjaGFyICpjbWQ7CiAgICAgaW50IGVycjsKICAgICBBVFJlc3BvbnNlICpwX3Jlc3BvbnNlID0gTlVMTDsKLSAgICBjaGFyICpyZXNwb25zZVsyXSA9IHsgIjEiLCBQUFBfVFRZX1BBVEggfTsKIAogICAgIGFwbiA9ICgoY29uc3QgY2hhciAqKilkYXRhKVsyXTsKIApAQCAtOTc4LDIyICsxMDI5LDIzIEBACiAgICAgc3NpemVfdCB3cml0dGVuLCBybGVuOwogICAgIGNoYXIgc3RhdHVzWzMyXSA9IHswfTsKICAgICBpbnQgcmV0cnkgPSAxMDsKKyAgICBjb25zdCBjaGFyICpwZHBfdHlwZTsKIAogICAgIExPR0QoInJlcXVlc3RpbmcgZGF0YSBjb25uZWN0aW9uIHRvIEFQTiAnJXMnIiwgYXBuKTsKIAogICAgIGZkID0gb3BlbiAoIi9kZXYvcW1pIiwgT19SRFdSKTsKICAgICBpZiAoZmQgPj0gMCkgeyAvKiB0aGUgZGV2aWNlIGRvZXNuJ3QgZXhpc3Qgb24gdGhlIGVtdWxhdG9yICovCiAKLQkgICAgTE9HRCgib3BlbmVkIHRoZSBxbWkgZGV2aWNlXG4iKTsKLQkgICAgYXNwcmludGYoJmNtZCwgInVwOiVzIiwgYXBuKTsKLQkgICAgbGVuID0gc3RybGVuKGNtZCk7CisgICAgICAgIExPR0QoIm9wZW5lZCB0aGUgcW1pIGRldmljZVxuIik7CisgICAgICAgIGFzcHJpbnRmKCZjbWQsICJ1cDolcyIsIGFwbik7CisgICAgICAgIGxlbiA9IHN0cmxlbihjbWQpOwogCi0JICAgIHdoaWxlIChjdXIgPCBsZW4pIHsKLQkJICAgIGRvIHsKLQkgICAgICAgICAgICB3cml0dGVuID0gd3JpdGUgKGZkLCBjbWQgKyBjdXIsIGxlbiAtIGN1cik7Ci0JICAgICAgICB9IHdoaWxlICh3cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICAgIHdoaWxlIChjdXIgPCBsZW4pIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB3cml0dGVuID0gd3JpdGUgKGZkLCBjbWQgKyBjdXIsIGxlbiAtIGN1cik7CisgICAgICAgICAgICB9IHdoaWxlICh3cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CiAKLQkgICAgICAgIGlmICh3cml0dGVuIDwgMCkgeworICAgICAgICAgICAgaWYgKHdyaXR0ZW4gPCAwKSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiIyMjIEVSUk9SIHdyaXRpbmcgdG8gL2Rldi9xbWkiKTsKICAgICAgICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTEwMjQsNDMgKzEwNzYsNTAgQEAKIAogICAgICAgICBpZiAocmV0cnkgPT0gMCkgewogICAgICAgICAgICAgTE9HRSgiIyMjIEZhaWxlZCB0byBnZXQgZGF0YSBjb25uZWN0aW9uIHVwXG4iKTsKLQkgICAgICAgIGdvdG8gZXJyb3I7Ci0JCX0KKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KIAogICAgICAgICBxbWlzdGF0dXMgPSBzeXN0ZW0oIm5ldGNmZyBybW5ldDAgZGhjcCIpOwogCiAgICAgICAgIExPR0QoIm5ldGNmZyBybW5ldDAgZGhjcDogc3RhdHVzICVkXG4iLCBxbWlzdGF0dXMpOwogCi0JICAgIGlmIChxbWlzdGF0dXMgPCAwKSBnb3RvIGVycm9yOworICAgICAgICBpZiAocW1pc3RhdHVzIDwgMCkgZ290byBlcnJvcjsKIAotCX0gZWxzZSB7CisgICAgfSBlbHNlIHsKIAotICAgICAgICBhc3ByaW50ZigmY21kLCAiQVQrQ0dEQ09OVD0xLFwiSVBcIixcIiVzXCIsLDAsMCIsIGFwbik7Ci0JICAgIC8vRklYTUUgY2hlY2sgZm9yIGVycm9yIGhlcmUKLQkgICAgZXJyID0gYXRfc2VuZF9jb21tYW5kKGNtZCwgTlVMTCk7Ci0JICAgIGZyZWUoY21kKTsKKyAgICAgICAgaWYgKGRhdGFsZW4gPiA2ICogc2l6ZW9mKGNoYXIgKikpIHsKKyAgICAgICAgICAgIHBkcF90eXBlID0gKChjb25zdCBjaGFyICoqKWRhdGEpWzZdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGRwX3R5cGUgPSAiSVAiOworICAgICAgICB9CiAKLQkgICAgLy8gU2V0IHJlcXVpcmVkIFFvUyBwYXJhbXMgdG8gZGVmYXVsdAotCSAgICBlcnIgPSBhdF9zZW5kX2NvbW1hbmQoIkFUK0NHUVJFUT0xIiwgTlVMTCk7CisgICAgICAgIGFzcHJpbnRmKCZjbWQsICJBVCtDR0RDT05UPTEsXCIlc1wiLFwiJXNcIiwsMCwwIiwgcGRwX3R5cGUsIGFwbik7CisgICAgICAgIC8vRklYTUUgY2hlY2sgZm9yIGVycm9yIGhlcmUKKyAgICAgICAgZXJyID0gYXRfc2VuZF9jb21tYW5kKGNtZCwgTlVMTCk7CisgICAgICAgIGZyZWUoY21kKTsKIAotCSAgICAvLyBTZXQgbWluaW11bSBRb1MgcGFyYW1zIHRvIGRlZmF1bHQKLQkgICAgZXJyID0gYXRfc2VuZF9jb21tYW5kKCJBVCtDR1FNSU49MSIsIE5VTEwpOworICAgICAgICAvLyBTZXQgcmVxdWlyZWQgUW9TIHBhcmFtcyB0byBkZWZhdWx0CisgICAgICAgIGVyciA9IGF0X3NlbmRfY29tbWFuZCgiQVQrQ0dRUkVRPTEiLCBOVUxMKTsKIAotCSAgICAvLyBwYWNrZXQtZG9tYWluIGV2ZW50IHJlcG9ydGluZwotCSAgICBlcnIgPSBhdF9zZW5kX2NvbW1hbmQoIkFUK0NHRVJFUD0xLDAiLCBOVUxMKTsKKyAgICAgICAgLy8gU2V0IG1pbmltdW0gUW9TIHBhcmFtcyB0byBkZWZhdWx0CisgICAgICAgIGVyciA9IGF0X3NlbmRfY29tbWFuZCgiQVQrQ0dRTUlOPTEiLCBOVUxMKTsKIAotCSAgICAvLyBIYW5ndXAgYW55dGhpbmcgdGhhdCdzIGhhcHBlbmluZyB0aGVyZSBub3cKLQkgICAgZXJyID0gYXRfc2VuZF9jb21tYW5kKCJBVCtDR0FDVD0xLDAiLCBOVUxMKTsKKyAgICAgICAgLy8gcGFja2V0LWRvbWFpbiBldmVudCByZXBvcnRpbmcKKyAgICAgICAgZXJyID0gYXRfc2VuZF9jb21tYW5kKCJBVCtDR0VSRVA9MSwwIiwgTlVMTCk7CiAKLQkgICAgLy8gU3RhcnQgZGF0YSBvbiBQRFAgY29udGV4dCAxCi0JICAgIGVyciA9IGF0X3NlbmRfY29tbWFuZCgiQVREKjk5KioqMSMiLCAmcF9yZXNwb25zZSk7CisgICAgICAgIC8vIEhhbmd1cCBhbnl0aGluZyB0aGF0J3MgaGFwcGVuaW5nIHRoZXJlIG5vdworICAgICAgICBlcnIgPSBhdF9zZW5kX2NvbW1hbmQoIkFUK0NHQUNUPTEsMCIsIE5VTEwpOwogCi0JICAgIGlmIChlcnIgPCAwIHx8IHBfcmVzcG9uc2UtPnN1Y2Nlc3MgPT0gMCkgewotCSAgICAgICAgZ290byBlcnJvcjsKLQkgICAgfQorICAgICAgICAvLyBTdGFydCBkYXRhIG9uIFBEUCBjb250ZXh0IDEKKyAgICAgICAgZXJyID0gYXRfc2VuZF9jb21tYW5kKCJBVEQqOTkqKioxIyIsICZwX3Jlc3BvbnNlKTsKKworICAgICAgICBpZiAoZXJyIDwgMCB8fCBwX3Jlc3BvbnNlLT5zdWNjZXNzID09IDApIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBSSUxfb25SZXF1ZXN0Q29tcGxldGUodCwgUklMX0VfU1VDQ0VTUywgcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworICAgIHJlcXVlc3RPclNlbmREYXRhQ2FsbExpc3QoJnQpOworCiAgICAgYXRfcmVzcG9uc2VfZnJlZShwX3Jlc3BvbnNlKTsKIAogICAgIHJldHVybjsKQEAgLTEwOTgsMTIgKzExNTcsMTIgQEAKICAgICBSSUxfU0lNX0lPX1Jlc3BvbnNlIHNyOwogICAgIGludCBlcnI7CiAgICAgY2hhciAqY21kID0gTlVMTDsKLSAgICBSSUxfU0lNX0lPICpwX2FyZ3M7CisgICAgUklMX1NJTV9JT192NiAqcF9hcmdzOwogICAgIGNoYXIgKmxpbmU7CiAKICAgICBtZW1zZXQoJnNyLCAwLCBzaXplb2Yoc3IpKTsKIAotICAgIHBfYXJncyA9IChSSUxfU0lNX0lPICopZGF0YTsKKyAgICBwX2FyZ3MgPSAoUklMX1NJTV9JT192NiAqKWRhdGE7CiAKICAgICAvKiBGSVhNRSBoYW5kbGUgcGluMiAqLwogCkBAIC0xMjM3LDcgKzEyOTYsNyBAQAogCiAgICAgc3dpdGNoIChyZXF1ZXN0KSB7CiAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfR0VUX1NJTV9TVEFUVVM6IHsKLSAgICAgICAgICAgIFJJTF9DYXJkU3RhdHVzICpwX2NhcmRfc3RhdHVzOworICAgICAgICAgICAgUklMX0NhcmRTdGF0dXNfdjYgKnBfY2FyZF9zdGF0dXM7CiAgICAgICAgICAgICBjaGFyICpwX2J1ZmZlcjsKICAgICAgICAgICAgIGludCBidWZmZXJfc2l6ZTsKIApAQCAtMTM0Nyw4ICsxNDA2LDggQEAKICAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9TSUdOQUxfU1RSRU5HVEg6CiAgICAgICAgICAgICByZXF1ZXN0U2lnbmFsU3RyZW5ndGgoZGF0YSwgZGF0YWxlbiwgdCk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVEU6Ci0gICAgICAgIGNhc2UgUklMX1JFUVVFU1RfR1BSU19SRUdJU1RSQVRJT05fU1RBVEU6CisgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfVk9JQ0VfUkVHSVNUUkFUSU9OX1NUQVRFOgorICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX0RBVEFfUkVHSVNUUkFUSU9OX1NUQVRFOgogICAgICAgICAgICAgcmVxdWVzdFJlZ2lzdHJhdGlvblN0YXRlKHJlcXVlc3QsIGRhdGEsIGRhdGFsZW4sIHQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfT1BFUkFUT1I6CkBAIC0xNTczLDcgKzE2MzIsNyBAQAogfQogCiAvKiogUmV0dXJucyBTSU1fTk9UX1JFQURZIG9uIGVycm9yICovCi1zdGF0aWMgU0lNX1N0YXR1cyAKK3N0YXRpYyBTSU1fU3RhdHVzCiBnZXRTSU1TdGF0dXMoKQogewogICAgIEFUUmVzcG9uc2UgKnBfcmVzcG9uc2UgPSBOVUxMOwpAQCAtMTY1Niw3ICsxNzE1LDcgQEAKICAqIFRoaXMgbXVzdCBiZSBmcmVlZCB1c2luZyBmcmVlQ2FyZFN0YXR1cy4KICAqIEByZXR1cm46IE9uIHN1Y2Nlc3MgcmV0dXJucyBSSUxfRV9TVUNDRVNTCiAgKi8KLXN0YXRpYyBpbnQgZ2V0Q2FyZFN0YXR1cyhSSUxfQ2FyZFN0YXR1cyAqKnBwX2NhcmRfc3RhdHVzKSB7CitzdGF0aWMgaW50IGdldENhcmRTdGF0dXMoUklMX0NhcmRTdGF0dXNfdjYgKipwcF9jYXJkX3N0YXR1cykgewogICAgIHN0YXRpYyBSSUxfQXBwU3RhdHVzIGFwcF9zdGF0dXNfYXJyYXlbXSA9IHsKICAgICAgICAgLy8gU0lNX0FCU0VOVCA9IDAKICAgICAgICAgeyBSSUxfQVBQVFlQRV9VTktOT1dOLCBSSUxfQVBQU1RBVEVfVU5LTk9XTiwgUklMX1BFUlNPU1VCU1RBVEVfVU5LTk9XTiwKQEAgLTE2OTAsMTEgKzE3NDksMTIgQEAKICAgICB9CiAKICAgICAvLyBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBiYXNlIGNhcmQgc3RhdHVzLgotICAgIFJJTF9DYXJkU3RhdHVzICpwX2NhcmRfc3RhdHVzID0gbWFsbG9jKHNpemVvZihSSUxfQ2FyZFN0YXR1cykpOworICAgIFJJTF9DYXJkU3RhdHVzX3Y2ICpwX2NhcmRfc3RhdHVzID0gbWFsbG9jKHNpemVvZihSSUxfQ2FyZFN0YXR1c192NikpOwogICAgIHBfY2FyZF9zdGF0dXMtPmNhcmRfc3RhdGUgPSBjYXJkX3N0YXRlOwogICAgIHBfY2FyZF9zdGF0dXMtPnVuaXZlcnNhbF9waW5fc3RhdGUgPSBSSUxfUElOU1RBVEVfVU5LTk9XTjsKICAgICBwX2NhcmRfc3RhdHVzLT5nc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4ID0gUklMX0NBUkRfTUFYX0FQUFM7CiAgICAgcF9jYXJkX3N0YXR1cy0+Y2RtYV9zdWJzY3JpcHRpb25fYXBwX2luZGV4ID0gUklMX0NBUkRfTUFYX0FQUFM7CisgICAgcF9jYXJkX3N0YXR1cy0+aW1zX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXggPSBSSUxfQ0FSRF9NQVhfQVBQUzsKICAgICBwX2NhcmRfc3RhdHVzLT5udW1fYXBwbGljYXRpb25zID0gbnVtX2FwcHM7CiAKICAgICAvLyBJbml0aWFsaXplIGFwcGxpY2F0aW9uIHN0YXR1cwpAQCAtMTcyMSw3ICsxNzgxLDcgQEAKIC8qKgogICogRnJlZSB0aGUgY2FyZCBzdGF0dXMgcmV0dXJuZWQgYnkgZ2V0Q2FyZFN0YXR1cwogICovCi1zdGF0aWMgdm9pZCBmcmVlQ2FyZFN0YXR1cyhSSUxfQ2FyZFN0YXR1cyAqcF9jYXJkX3N0YXR1cykgeworc3RhdGljIHZvaWQgZnJlZUNhcmRTdGF0dXMoUklMX0NhcmRTdGF0dXNfdjYgKnBfY2FyZF9zdGF0dXMpIHsKICAgICBmcmVlKHBfY2FyZF9zdGF0dXMpOwogfQogCkBAIC0xOTM0LDcgKzE5OTQsNyBAQAogICAgICAgICAgICAgICAgIHx8IHN0clN0YXJ0c1dpdGgocywiK0NHUkVHOiIpCiAgICAgKSB7CiAgICAgICAgIFJJTF9vblVuc29saWNpdGVkUmVzcG9uc2UgKAotICAgICAgICAgICAgUklMX1VOU09MX1JFU1BPTlNFX05FVFdPUktfU1RBVEVfQ0hBTkdFRCwKKyAgICAgICAgICAgIFJJTF9VTlNPTF9SRVNQT05TRV9WT0lDRV9ORVRXT1JLX1NUQVRFX0NIQU5HRUQsCiAgICAgICAgICAgICBOVUxMLCAwKTsKICNpZmRlZiBXT1JLQVJPVU5EX0ZBS0VfQ0dFVgogICAgICAgICBSSUxfcmVxdWVzdFRpbWVkQ2FsbGJhY2sgKG9uRGF0YUNhbGxMaXN0Q2hhbmdlZCwgTlVMTCwgTlVMTCk7CmRpZmYgLS1naXQgYS9yZWZlcmVuY2UtcmlsL3JpbC5oIGIvcmVmZXJlbmNlLXJpbC9yaWwuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42ZDg0MzI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVmZXJlbmNlLXJpbC9yaWwuaApAQCAtMCwwICsxIEBACisuLi9pbmNsdWRlL3RlbGVwaG9ueS9yaWwuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK