ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGY2YWFjZDIuLjljNWE5Y2MgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMjMsNiArMjMsNyBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJ2bmRrc3VwcG9ydCIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsiLURRRU1VX0hBUkRXQVJFIl0sCiAKZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBiODRlMWI2Li4xYzY0YmZjIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00NywzICs0NywxMyBAQAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1mICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliZHluYW1pY19zZW5zb3JfZXh0LnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliNjQvbGliZHluYW1pY19zZW5zb3JfZXh0LnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2h3L3NlbnNvcnMuZHluYW1pY19zZW5zb3JfaGFsLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliNjQvaHcvc2Vuc29ycy5keW5hbWljX3NlbnNvcl9oYWwuc28pCisKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwpkaWZmIC0tZ2l0IGEvaGFyZHdhcmUuYyBiL2hhcmR3YXJlLmMKaW5kZXggN2U0ZGViZS4uOGZhYWMwNyAxMDA2NDQKLS0tIGEvaGFyZHdhcmUuYworKysgYi9oYXJkd2FyZS5jCkBAIC0yOSw2ICsyOSw4IEBACiAjZGVmaW5lIExPR19UQUcgIkhBTCIKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKKyNpbmNsdWRlIDx2bmRrc3VwcG9ydC9saW5rZXIuaD4KKwogLyoqIEJhc2UgcGF0aCBvZiB0aGUgaGFsIG1vZHVsZXMgKi8KICNpZiBkZWZpbmVkKF9fTFA2NF9fKQogI2RlZmluZSBIQUxfTElCUkFSWV9QQVRIMSAiL3N5c3RlbS9saWI2NC9odyIKQEAgLTgwLDcgKzgyLDE0IEBACiAgICAgICogZGxvcGVuIHJldHVybnMuIFNpbmNlIFJUTERfR0xPQkFMIGlzIG5vdCBvcidkIGluIHdpdGgKICAgICAgKiBSVExEX05PVyB0aGUgZXh0ZXJuYWwgc3ltYm9scyB3aWxsIG5vdCBiZSBnbG9iYWwKICAgICAgKi8KLSAgICBoYW5kbGUgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOworICAgIGlmIChzdHJuY21wKHBhdGgsICIvc3lzdGVtLyIsIDgpID09IDApIHsKKyAgICAgICAgLyogSWYgdGhlIGxpYnJhcnkgaXMgaW4gc3lzdGVtIHBhcnRpdGlvbiwgbm8gbmVlZCB0byBjaGVjaworICAgICAgICAgKiBzcGhhbCBuYW1lc3BhY2UuIE9wZW4gaXQgd2l0aCBkbG9wZW4uCisgICAgICAgICAqLworICAgICAgICBoYW5kbGUgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOworICAgIH0gZWxzZSB7CisgICAgICAgIGhhbmRsZSA9IGFuZHJvaWRfbG9hZF9zcGhhbF9saWJyYXJ5KHBhdGgsIFJUTERfTk9XKTsKKyAgICB9CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIGNoYXIgY29uc3QgKmVycl9zdHIgPSBkbGVycm9yKCk7CiAgICAgICAgIEFMT0dFKCJsb2FkOiBtb2R1bGU9JXNcbiVzIiwgcGF0aCwgZXJyX3N0cj9lcnJfc3RyOiJ1bmtub3duIik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvLmggYi9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvLmgKaW5kZXggYzk1YWQwOS4uMmQ2ZWIzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9hdWRpby5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW8uaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHN0cmluZ3MuaD4KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAKQEAgLTU5LDE5ICs2MCw2IEBACiAvKiBNaW5pbWFsIGF1ZGlvIEhBTCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgYXVkaW8gZnJhbWV3b3JrICovCiAjZGVmaW5lIEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzJfMAogCi0vKioKLSAqIExpc3Qgb2Yga25vd24gYXVkaW8gSEFMIG1vZHVsZXMuIFRoaXMgaXMgdGhlIGJhc2UgbmFtZSBvZiB0aGUgYXVkaW8gSEFMCi0gKiBsaWJyYXJ5IGNvbXBvc2VkIG9mIHRoZSAiYXVkaW8uIiBwcmVmaXgsIG9uZSBvZiB0aGUgYmFzZSBuYW1lcyBiZWxvdyBhbmQKLSAqIGEgc3VmZml4IHNwZWNpZmljIHRvIHRoZSBkZXZpY2UuCi0gKiBlLmc6IGF1ZGlvLnByaW1hcnkuZ29sZGZpc2guc28gb3IgYXVkaW8uYTJkcC5kZWZhdWx0LnNvCi0gKi8KLQotI2RlZmluZSBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSAicHJpbWFyeSIKLSNkZWZpbmUgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAgImEyZHAiCi0jZGVmaW5lIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IgInVzYiIKLSNkZWZpbmUgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVggInJfc3VibWl4IgotI2RlZmluZSBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQ09ERUNfT0ZGTE9BRCAiY29kZWNfb2ZmbG9hZCIKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKQEAgLTgyLDExICs3MCw2IEBACiAgKiAgYXVkaW8gZGV2aWNlIHBhcmFtZXRlcnMKICAqLwogCi0vKiBCVCBTQ08gTm9pc2UgUmVkdWN0aW9uICsgRWNobyBDYW5jZWxsYXRpb24gcGFyYW1ldGVycyAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfS0VZX0JUX05SRUMgImJ0X2hlYWRzZXRfbnJlYyIKLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX09OICJvbiIKLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX09GRiAib2ZmIgotCiAvKiBUVFkgbW9kZSBzZWxlY3Rpb24gKi8KICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX0tFWV9UVFlfTU9ERSAidHR5X21vZGUiCiAjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9WQUxVRV9UVFlfT0ZGICJ0dHlfb2ZmIgpAQCAtOTQsOCArNzcsNyBAQAogI2RlZmluZSBBVURJT19QQVJBTUVURVJfVkFMVUVfVFRZX0hDTyAidHR5X2hjbyIKICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX1RUWV9GVUxMICJ0dHlfZnVsbCIKIAotLyogSGVhcmluZyBBaWQgQ29tcGF0aWJpbGl0eSAtIFRlbGVjb2lsIChIQUMtVCkgbW9kZSBvbi9vZmYKLSAgIFN0cmluZ3MgbXVzdCBiZSBpbiBzeW5jIHdpdGggQ2FsbEZlYXR1cmVzU2V0dGluZy5qYXZhICovCisvKiBIZWFyaW5nIEFpZCBDb21wYXRpYmlsaXR5IC0gVGVsZWNvaWwgKEhBQy1UKSBtb2RlIG9uL29mZiAqLwogI2RlZmluZSBBVURJT19QQVJBTUVURVJfS0VZX0hBQyAiSEFDU2V0dGluZyIKICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX0hBQ19PTiAiT04iCiAjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9WQUxVRV9IQUNfT0ZGICJPRkYiCkBAIC0xMDYsNjMgKzg4LDE1IEBACiAvKiBBMkRQIHNvdXJjZSBhZGRyZXNzIHNldCBieSBmcmFtZXdvcmsgKi8KICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX0EyRFBfU09VUkNFX0FERFJFU1MgImEyZHBfc291cmNlX2FkZHJlc3MiCiAKLS8qIFNjcmVlbiBzdGF0ZSAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfS0VZX1NDUkVFTl9TVEFURSAic2NyZWVuX3N0YXRlIgotCiAvKiBCbHVldG9vdGggU0NPIHdpZGViYW5kICovCiAjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9LRVlfQlRfU0NPX1dCICJidF93YnMiCiAKLS8qIEdldCBhIG5ldyBIVyBzeW5jaHJvbml6YXRpb24gc291cmNlIGlkZW50aWZpZXIuCi0gKiBSZXR1cm4gYSB2YWxpZCBzb3VyY2UgKHBvc2l0aXZlIGludGVnZXIpIG9yIEFVRElPX0hXX1NZTkNfSU5WQUxJRCBpZiBhbiBlcnJvciBvY2N1cnMKLSAqIG9yIG5vIEhXIHN5bmMgaXMgYXZhaWxhYmxlLiAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfSFdfQVZfU1lOQyAiaHdfYXZfc3luYyIKLQogLyoqCiAgKiAgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMKICAqLwogCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyAicm91dGluZyIgICAgICAgICAgICAgLyogYXVkaW9fZGV2aWNlc190ICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fRk9STUFUICJmb3JtYXQiICAgICAgICAgICAgICAgLyogYXVkaW9fZm9ybWF0X3QgKi8KLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9DSEFOTkVMUyAiY2hhbm5lbHMiICAgICAgICAgICAvKiBhdWRpb19jaGFubmVsX21hc2tfdCAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0ZSQU1FX0NPVU5UICJmcmFtZV9jb3VudCIgICAgIC8qIHNpemVfdCAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0lOUFVUX1NPVVJDRSAiaW5wdXRfc291cmNlIiAgIC8qIGF1ZGlvX3NvdXJjZV90ICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU0FNUExJTkdfUkFURSAic2FtcGxpbmdfcmF0ZSIgLyogdWludDMyX3QgKi8KLQotI2RlZmluZSBBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QgImNvbm5lY3QiICAgICAgICAgICAgLyogYXVkaW9fZGV2aWNlc190ICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCAiZGlzY29ubmVjdCIgICAgICAvKiBhdWRpb19kZXZpY2VzX3QgKi8KLQotLyogUXVlcnkgc3VwcG9ydGVkIGZvcm1hdHMuIFRoZSByZXNwb25zZSBpcyBhICd8JyBzZXBhcmF0ZWQgbGlzdCBvZiBzdHJpbmdzIGZyb20KLSAqIGF1ZGlvX2Zvcm1hdF90IGVudW0gZS5nOiAic3VwX2Zvcm1hdHM9QVVESU9fRk9STUFUX1BDTV8xNl9CSVQiICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMgInN1cF9mb3JtYXRzIgotLyogUXVlcnkgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MuIFRoZSByZXNwb25zZSBpcyBhICd8JyBzZXBhcmF0ZWQgbGlzdCBvZiBzdHJpbmdzIGZyb20KLSAqIGF1ZGlvX2NoYW5uZWxfbWFza190IGVudW0gZS5nOiAic3VwX2NoYW5uZWxzPUFVRElPX0NIQU5ORUxfT1VUX1NURVJFT3xBVURJT19DSEFOTkVMX09VVF9NT05PIiAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9DSEFOTkVMUyAic3VwX2NoYW5uZWxzIgotLyogUXVlcnkgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzLiBUaGUgcmVzcG9uc2UgaXMgYSAnfCcgc2VwYXJhdGVkIGxpc3Qgb2YgaW50ZWdlciB2YWx1ZXMgZS5nOgotICogInN1cF9zYW1wbGluZ19yYXRlcz00NDEwMHw0ODAwMCIgKi8KLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMgInN1cF9zYW1wbGluZ19yYXRlcyIKLQotLyogU2V0IHRoZSBIVyBzeW5jaHJvbml6YXRpb24gc291cmNlIGZvciBhbiBvdXRwdXQgc3RyZWFtLiAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0hXX0FWX1NZTkMgImh3X2F2X3N5bmMiCi0KLS8qIEVuYWJsZSBtb25vIGF1ZGlvIHBsYXliYWNrIGlmIDEsIGVsc2Ugc2hvdWxkIGJlIDAuICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9NT05PX09VVFBVVCAibW9ub19vdXRwdXQiCi0KLS8qKgotICogYXVkaW8gY29kZWMgcGFyYW1ldGVycwotICovCi0KLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19QQVJBTVMgIm11c2ljX29mZmxvYWRfY29kZWNfcGFyYW0iCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfQklUX1BFUl9TQU1QTEUgIm11c2ljX29mZmxvYWRfYml0X3Blcl9zYW1wbGUiCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfQklUX1JBVEUgIm11c2ljX29mZmxvYWRfYml0X3JhdGUiCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfQVZHX0JJVF9SQVRFICJtdXNpY19vZmZsb2FkX2F2Z19iaXRfcmF0ZSIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19JRCAibXVzaWNfb2ZmbG9hZF9jb2RlY19pZCIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19CTE9DS19BTElHTiAibXVzaWNfb2ZmbG9hZF9ibG9ja19hbGlnbiIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19TQU1QTEVfUkFURSAibXVzaWNfb2ZmbG9hZF9zYW1wbGVfcmF0ZSIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19FTkNPREVfT1BUSU9OICJtdXNpY19vZmZsb2FkX2VuY29kZV9vcHRpb24iCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfTlVNX0NIQU5ORUwgICJtdXNpY19vZmZsb2FkX251bV9jaGFubmVscyIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19ET1dOX1NBTVBMSU5HICAibXVzaWNfb2ZmbG9hZF9kb3duX3NhbXBsaW5nIgotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX0RFTEFZX1NBTVBMRVMgICJkZWxheV9zYW1wbGVzIgotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX1BBRERJTkdfU0FNUExFUyAgInBhZGRpbmdfc2FtcGxlcyIKKy8qIEVuYWJsZSBBQU5DICovCisjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9LRVlfQUFOQyAiYWFuY19lbmFibGVkIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTM5OSw2ICszMzMsNjUgQEAKICAgICBpbnQgKCpnZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKIAorICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICogY3JlYXRlX21tYXBfYnVmZmVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHN0YXJ0KCkKKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZSBvciBvbiBub24gbW1hcCBzdHJlYW0KKyAgICAgKi8KKyAgICBpbnQgKCpzdGFydCkoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqIHN0cmVhbSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byBzdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgc3RhcnQoKQorICAgICAqCisgICAgICogXG5vdGUgRnVuY3Rpb24gb25seSBpbXBsZW1lbnRlZCBieSBzdHJlYW1zIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIHN0cmVhbSB0aGUgc3RyZWFtIG9iamVjdC4KKyAgICAgKiBccmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLgorICAgICAqICAgICAgICAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlIG9yIG9uIG5vbiBtbWFwIHN0cmVhbQorICAgICAqLworICAgIGludCAoKnN0b3ApKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0pOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIG1tYXAgYnVmZmVyIHVzZWQgZm9yIGF1ZGlvCisgICAgICogc2FtcGxlcyB0cmFuc2Zlci4KKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHBhcmFtW2luXSBtaW5fc2l6ZV9mcmFtZXMgbWluaW11bSBidWZmZXIgc2l6ZSByZXF1ZXN0ZWQuIFRoZSBhY3R1YWwgYnVmZmVyCisgICAgICogICAgICAgIHNpemUgcmV0dXJuZWQgaW4gc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gY2FuIGJlIGxhcmdlci4KKyAgICAgKiBccGFyYW1bb3V0XSBpbmZvIGFkZHJlc3MgYXQgd2hpY2ggdGhlIG1tYXAgYnVmZmVyIGluZm9ybWF0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gMCBpZiB0aGUgYnVmZmVyIHdhcyBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICAtRU5PREVWIGluIGNhc2Ugb2YgaW5pdGlhbGl6YXRpb24gZXJyb3IKKyAgICAgKiAgICAgICAgIC1FSU5WQUwgaWYgdGhlIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSBpcyB0b28gbGFyZ2UKKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZSAoZS5nLiBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWQpCisgICAgICovCisgICAgaW50ICgqY3JlYXRlX21tYXBfYnVmZmVyKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5fc2l6ZV9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byByZWFkIGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICAgKiB3aXRoIGFzc29jaWF0ZWQgdGltZSBzdGFtcC4KKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHBhcmFtW291dF0gcG9zaXRpb24gYWRkcmVzcyBhdCB3aGljaCB0aGUgbW1hcCByZWFkL3dyaXRlIHBvc2l0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gMCBpZiB0aGUgcG9zaXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLgorICAgICAqICAgICAgICAgLUVOT0RBVEEgaWYgdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZXRyaWV2ZWQKKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIGJlZm9yZSBjcmVhdGVfbW1hcF9idWZmZXIoKQorICAgICAqLworICAgIGludCAoKmdldF9tbWFwX3Bvc2l0aW9uKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwogfTsKIHR5cGVkZWYgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgYXVkaW9fc3RyZWFtX291dF90OwogCkBAIC00NDksNiArNDQyLDY1IEBACiAgICAgICovCiAgICAgaW50ICgqZ2V0X2NhcHR1cmVfcG9zaXRpb24pKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICogY3JlYXRlX21tYXBfYnVmZmVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHN0YXJ0KCkKKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHJldHVybiAwIGluIGNhc2Ugb2ZmIHN1Y2Nlc3MuCisgICAgICogICAgICAgICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2Ugb3Igb24gbm9uIG1tYXAgc3RyZWFtCisgICAgICovCisgICAgaW50ICgqc3RhcnQpKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIHN0cmVhbSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byBzdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICoKKyAgICAgKiBcbm90ZSBGdW5jdGlvbiBvbmx5IGltcGxlbWVudGVkIGJ5IHN0cmVhbXMgb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gc3RyZWFtIHRoZSBzdHJlYW0gb2JqZWN0LgorICAgICAqIFxyZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisgICAgICogICAgICAgICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2Ugb3Igb24gbm9uIG1tYXAgc3RyZWFtCisgICAgICovCisgICAgaW50ICgqc3RvcCkoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBtbWFwIGJ1ZmZlciB1c2VkIGZvciBhdWRpbworICAgICAqIHNhbXBsZXMgdHJhbnNmZXIuCisgICAgICoKKyAgICAgKiBcbm90ZSBGdW5jdGlvbiBvbmx5IGltcGxlbWVudGVkIGJ5IHN0cmVhbXMgb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gc3RyZWFtIHRoZSBzdHJlYW0gb2JqZWN0LgorICAgICAqIFxwYXJhbVtpbl0gbWluX3NpemVfZnJhbWVzIG1pbmltdW0gYnVmZmVyIHNpemUgcmVxdWVzdGVkLiBUaGUgYWN0dWFsIGJ1ZmZlcgorICAgICAqICAgICAgICBzaXplIHJldHVybmVkIGluIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvIGNhbiBiZSBsYXJnZXIuCisgICAgICogXHBhcmFtW291dF0gaW5mbyBhZGRyZXNzIGF0IHdoaWNoIHRoZSBtbWFwIGJ1ZmZlciBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIDAgaWYgdGhlIGJ1ZmZlciB3YXMgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgLUVOT0RFViBpbiBjYXNlIG9mIGluaXRpYWxpemF0aW9uIGVycm9yCisgICAgICogICAgICAgICAtRUlOVkFMIGlmIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHNpemUgaXMgdG9vIGxhcmdlCisgICAgICogICAgICAgICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UgKGUuZy4gYnVmZmVyIGFscmVhZHkgYWxsb2NhdGVkKQorICAgICAqLworICAgIGludCAoKmNyZWF0ZV9tbWFwX2J1ZmZlcikoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5fc2l6ZV9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byByZWFkIGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICAgKiB3aXRoIGFzc29jaWF0ZWQgdGltZSBzdGFtcC4KKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHBhcmFtW291dF0gcG9zaXRpb24gYWRkcmVzcyBhdCB3aGljaCB0aGUgbW1hcCByZWFkL3dyaXRlIHBvc2l0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gMCBpZiB0aGUgcG9zaXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLgorICAgICAqICAgICAgICAgLUVOT0RBVEEgaWYgdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZXRyZWl2ZWQKKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIGJlZm9yZSBtbWFwX3JlYWRfcG9zaXRpb24oKQorICAgICAqLworICAgIGludCAoKmdldF9tbWFwX3Bvc2l0aW9uKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luIGF1ZGlvX3N0cmVhbV9pbl90OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvX2Fsc2FvcHMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fYWxzYW9wcy5oCmluZGV4IGY4Mzk0MWUuLjZhMTdhMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fYWxzYW9wcy5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fYWxzYW9wcy5oCkBAIC0zOCw3ICszOCw3IEBACiBzdGF0aWMgaW5saW5lIGVudW0gcGNtX2Zvcm1hdCBwY21fZm9ybWF0X2Zyb21fYXVkaW9fZm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKICAgICBzd2l0Y2ggKGZvcm1hdCkgewotI2lmZGVmIEhBVkVfQklHX0VORElBTgorI2lmIEhBVkVfQklHX0VORElBTgogICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CiAgICAgICAgIHJldHVybiBQQ01fRk9STUFUX1MxNl9CRTsKICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKQEAgLTczLDcgKzczLDcgQEAKIHN0YXRpYyBpbmxpbmUgYXVkaW9fZm9ybWF0X3QgYXVkaW9fZm9ybWF0X2Zyb21fcGNtX2Zvcm1hdChlbnVtIHBjbV9mb3JtYXQgZm9ybWF0KQogewogICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0jaWZkZWYgSEFWRV9CSUdfRU5ESUFOCisjaWYgSEFWRV9CSUdfRU5ESUFOCiAgICAgY2FzZSBQQ01fRk9STUFUX1MxNl9CRToKICAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIGNhc2UgUENNX0ZPUk1BVF9TMjRfM0JFOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9hdWRpb19lZmZlY3QuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fZWZmZWN0LmgKaW5kZXggOGE4ODQxNC4uMzM2NmUxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9hdWRpb19lZmZlY3QuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oCkBAIC0yNiw3ICsyNiw3IEBACiAKICNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CiAKIAogX19CRUdJTl9ERUNMUwpAQCAtMzYsMjMxICszNiwxMSBAQAogLy8gICAgICBDb21tb24gRGVmaW5pdGlvbnMKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotLy8KLS8vLS0tIEVmZmVjdCBkZXNjcmlwdG9yIHN0cnVjdHVyZSBlZmZlY3RfZGVzY3JpcHRvcl90Ci0vLwotCi0vLyBVbmlxdWUgZWZmZWN0IElEIChjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBzaXRlOgotLy8gIGh0dHA6Ly93d3cuaXR1LmludC9JVFUtVC9hc24xL3V1aWQuaHRtbCkKLS8vIFRoaXMgZm9ybWF0IGlzIHVzZWQgZm9yIGJvdGggInR5cGUiIGFuZCAidXVpZCIgZmllbGRzIG9mIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCi0vLyAtIFdoZW4gdXNlZCBmb3IgZWZmZWN0IHR5cGUgYW5kIHRoZSBlbmdpbmUgaXMgaW1wbGVtZW50aW5nIGFuZCBlZmZlY3QgY29ycmVzcG9uZGluZyB0byBhIHN0YW5kYXJkCi0vLyBPcGVuU0wgRVMgaW50ZXJmYWNlLCB0aGlzIElEIG11c3QgYmUgdGhlIG9uZSBkZWZpbmVkIGluIE9wZW5TTEVTX0lJRC5oIGZvciB0aGF0IGludGVyZmFjZS4KLS8vIC0gV2hlbiB1c2VkIGFzIHV1aWQsIGl0IHNob3VsZCBiZSBhIHVuaXF1ZSBVVUlEIGZvciB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfdXVpZF9zIHsKLSAgICB1aW50MzJfdCB0aW1lTG93OwotICAgIHVpbnQxNl90IHRpbWVNaWQ7Ci0gICAgdWludDE2X3QgdGltZUhpQW5kVmVyc2lvbjsKLSAgICB1aW50MTZfdCBjbG9ja1NlcTsKLSAgICB1aW50OF90IG5vZGVbNl07Ci19IGVmZmVjdF91dWlkX3Q7Ci0KLS8vIE1heGltdW0gbGVuZ3RoIG9mIGNoYXJhY3RlciBzdHJpbmdzIGluIHN0cnVjdHVyZXMgZGVmaW5lcyBieSB0aGlzIEFQSS4KLSNkZWZpbmUgRUZGRUNUX1NUUklOR19MRU5fTUFYIDY0Ci0KLS8vIE5VTEwgVVVJRCBkZWZpbml0aW9uIChtYXRjaGVzIFNMX0lJRF9OVUxMXykKLSNkZWZpbmUgRUZGRUNUX1VVSURfSU5JVElBTElaRVIgeyAweGVjNzE3OGVjLCAweGU1ZTEsIDB4NDQzMiwgMHhhM2Y0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDQ2LCAweDU3LCAweGU2LCAweDc5LCAweDUyLCAweDEwIH0gfQotc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgRUZGRUNUX1VVSURfTlVMTF8gPSBFRkZFQ1RfVVVJRF9JTklUSUFMSVpFUjsKLXN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgRUZGRUNUX1VVSURfTlVMTCA9ICZFRkZFQ1RfVVVJRF9OVUxMXzsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgRUZGRUNUX1VVSURfTlVMTF9TVFIgPSAiZWM3MTc4ZWMtZTVlMS00NDMyLWEzZjQtNDY1N2U2Nzk1MjEwIjsKLQotCi0vLyBUaGUgZWZmZWN0IGRlc2NyaXB0b3IgY29udGFpbnMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGZhY2lsaXRhdGUgdGhlIGVudW1lcmF0aW9uIG9mIHRoZSBlZmZlY3QKLS8vIGVuZ2luZXMgcHJlc2VudCBpbiBhIGxpYnJhcnkuCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfZGVzY3JpcHRvcl9zIHsKLSAgICBlZmZlY3RfdXVpZF90IHR5cGU7ICAgICAvLyBVVUlEIG9mIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOyAgICAgLy8gVVVJRCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uCi0gICAgdWludDMyX3QgYXBpVmVyc2lvbjsgICAgLy8gVmVyc2lvbiBvZiB0aGUgZWZmZWN0IGNvbnRyb2wgQVBJIGltcGxlbWVudGVkCi0gICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgLy8gZWZmZWN0IGVuZ2luZSBjYXBhYmlsaXRpZXMvcmVxdWlyZW1lbnRzIGZsYWdzIChzZWUgYmVsb3cpCi0gICAgdWludDE2X3QgY3B1TG9hZDsgICAgICAgLy8gQ1BVIGxvYWQgaW5kaWNhdGlvbiAoc2VlIGJlbG93KQotICAgIHVpbnQxNl90IG1lbW9yeVVzYWdlOyAgIC8vIERhdGEgTWVtb3J5IHVzYWdlIChzZWUgYmVsb3cpCi0gICAgY2hhciAgICBuYW1lW0VGRkVDVF9TVFJJTkdfTEVOX01BWF07ICAgLy8gaHVtYW4gcmVhZGFibGUgZWZmZWN0IG5hbWUKLSAgICBjaGFyICAgIGltcGxlbWVudG9yW0VGRkVDVF9TVFJJTkdfTEVOX01BWF07ICAgIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBpbXBsZW1lbnRvciBuYW1lCi19IGVmZmVjdF9kZXNjcmlwdG9yX3Q7Ci0KLS8vIENQVSBsb2FkIGFuZCBtZW1vcnkgdXNhZ2UgaW5kaWNhdGlvbjogZWFjaCBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGFuIGluZGljYXRpb24gb2YKLS8vIGl0cyBDUFUgYW5kIG1lbW9yeSB1c2FnZSBmb3IgdGhlIGF1ZGlvIGVmZmVjdCBmcmFtZXdvcmsgdG8gbGltaXQgdGhlIG51bWJlciBvZiBlZmZlY3RzCi0vLyBpbnN0YW50aWF0ZWQgYXQgYSBnaXZlbiB0aW1lIG9uIGEgZ2l2ZW4gcGxhdGZvcm0uCi0vLyBUaGUgQ1BVIGxvYWQgaXMgZXhwcmVzc2VkIGluIDAuMSBNSVBTIHVuaXRzIGFzIGVzdGltYXRlZCBvbiBhbiBBUk05RSBjb3JlIChBUk12NVRFKSB3aXRoIDAgV1MuCi0vLyBUaGUgbWVtb3J5IHVzYWdlIGlzIGV4cHJlc3NlZCBpbiBLQiBhbmQgaW5jbHVkZXMgb25seSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5Ci0KLS8vIERlZmluaXRpb25zIGZvciBmbGFncyBmaWVsZCBvZiBlZmZlY3QgZGVzY3JpcHRvci4KLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgIHwgYml0cyAgICAgIHwgdmFsdWVzCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgY29ubmVjdGlvbiBtb2RlICAgICAgICAgICB8IDAuLjIgICAgICB8IDAgaW5zZXJ0OiBhZnRlciB0cmFjayBwcm9jZXNzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBhdXhpbGlhcnk6IGNvbm5lY3QgdG8gdHJhY2sgYXV4aWxpYXJ5Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgIG91dHB1dCBhbmQgdXNlIHNlbmQgbGV2ZWwKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHJlcGxhY2U6IHJlcGxhY2VzIHRyYWNrIHByb2Nlc3MgZnVuY3Rpb247Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBtdXN0IGltcGxlbWVudCBTUkMsIHZvbHVtZSBhbmQgbW9ubyB0byBzdGVyZW8uCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyBwcmUgcHJvY2Vzc2luZzogYXBwbGllZCBiZWxvdyBhdWRpbyBIQUwgb24gaW5wdXQKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCA0IHBvc3QgcHJvY2Vzc2luZzogYXBwbGllZCBiZWxvdyBhdWRpbyBIQUwgb24gb3V0cHV0Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNSAtIDcgcmVzZXJ2ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBpbnNlcnRpb24gcHJlZmVyZW5jZSAgICAgIHwgMy4uNSAgICAgIHwgMCBub25lCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBmaXJzdCBvZiB0aGUgY2hhaW4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIGxhc3Qgb2YgdGhlIGNoYWluCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyBleGNsdXNpdmUgKG9ubHkgZWZmZWN0IGluIHRoZSBpbnNlcnQgY2hhaW4pCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNC4uNyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFZvbHVtZSBtYW5hZ2VtZW50ICAgICAgICAgfCA2Li44ICAgICAgfCAwIG5vbmUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIGltcGxlbWVudHMgdm9sdW1lIGNvbnRyb2wKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHJlcXVpcmVzIHZvbHVtZSBpbmRpY2F0aW9uCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNCByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IERldmljZSBpbmRpY2F0aW9uICAgICAgICAgfCA5Li4xMSAgICAgfCAwIG5vbmUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHJlcXVpcmVzIGRldmljZSB1cGRhdGVzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiwgNCByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFNhbXBsZSBpbnB1dCBtb2RlICAgICAgICAgfCAxMi4uMTMgICAgfCAxIGRpcmVjdDogcHJvY2VzcygpIGZ1bmN0aW9uIG9yIEVGRkVDVF9DTURfU0VUX0NPTkZJRwotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgY29tbWFuZCBtdXN0IHNwZWNpZnkgYSBidWZmZXIgZGVzY3JpcHRvcgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgcHJvdmlkZXI6IHByb2Nlc3MoKSBmdW5jdGlvbiB1c2VzIHRoZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgYnVmZmVyUHJvdmlkZXIgaW5kaWNhdGVkIGJ5IHRoZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHIGNvbW1hbmQgdG8gcmVxdWVzdCBpbnB1dC4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlcnMuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyBib3RoOiBib3RoIGlucHV0IG1vZGVzIGFyZSBzdXBwb3J0ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBTYW1wbGUgb3V0cHV0IG1vZGUgICAgICAgIHwgMTQuLjE1ICAgIHwgMSBkaXJlY3Q6IHByb2Nlc3MoKSBmdW5jdGlvbiBvciBFRkZFQ1RfQ01EX1NFVF9DT05GSUcKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbW1hbmQgbXVzdCBzcGVjaWZ5IGEgYnVmZmVyIGRlc2NyaXB0b3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHByb3ZpZGVyOiBwcm9jZXNzKCkgZnVuY3Rpb24gdXNlcyB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlclByb3ZpZGVyIGluZGljYXRlZCBieSB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIEVGRkVDVF9DTURfU0VUX0NPTkZJRyBjb21tYW5kIHRvIHJlcXVlc3Qgb3V0cHV0Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJzLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgYm90aDogYm90aCBvdXRwdXQgbW9kZXMgYXJlIHN1cHBvcnRlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IEhhcmR3YXJlIGFjY2VsZXJhdGlvbiAgICAgfCAxNi4uMTcgICAgfCAwIE5vIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgbm9uIHR1bm5lbGVkIGh3IGFjY2VsZXJhdGlvbjogdGhlIHByb2Nlc3MoKSBmdW5jdGlvbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgcmVhZHMgdGhlIHNhbXBsZXMsIHNlbmQgdGhlbSB0byBIVyBhY2NlbGVyYXRlZAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgZWZmZWN0IHByb2Nlc3NvciwgcmVhZHMgYmFjayB0aGUgcHJvY2Vzc2VkIHNhbXBsZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGFuZCByZXR1cm5zIHRoZW0gdG8gdGhlIG91dHB1dCBidWZmZXIuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiB0dW5uZWxlZCBodyBhY2NlbGVyYXRpb246IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gaXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIHRyYW5zcGFyZW50LiBUaGUgZWZmZWN0IGludGVyZmFjZSBpcyBvbmx5IHVzZWQgdG8KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbnRyb2wgdGhlIGVmZmVjdCBlbmdpbmUuIFRoaXMgbW9kZSBpcyByZWxldmFudCBmb3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGdsb2JhbCBlZmZlY3RzIGFjdHVhbGx5IGFwcGxpZWQgYnkgdGhlIGF1ZGlvCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBoYXJkd2FyZSBvbiB0aGUgb3V0cHV0IHN0cmVhbS4KLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBBdWRpbyBNb2RlIGluZGljYXRpb24gICAgIHwgMTguLjE5ICAgIHwgMCBub25lCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSByZXF1aXJlcyBhdWRpbyBtb2RlIHVwZGF0ZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyLi4zIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgQXVkaW8gc291cmNlIGluZGljYXRpb24gICB8IDIwLi4yMSAgICB8IDAgbm9uZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgcmVxdWlyZXMgYXVkaW8gc291cmNlIHVwZGF0ZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyLi4zIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgRWZmZWN0IG9mZmxvYWQgc3VwcG9ydGVkICB8IDIyICAgICAgICB8IDAgVGhlIGVmZmVjdCBjYW5ub3QgYmUgb2ZmbG9hZGVkIHRvIGFuIGF1ZGlvIERTUAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgVGhlIGVmZmVjdCBjYW4gYmUgb2ZmbG9hZGVkIHRvIGFuIGF1ZGlvIERTUAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFByb2Nlc3MgZnVuY3Rpb24gbm90ICAgICAgfCAyMyAgICAgICAgfCAwIFRoZSBlZmZlY3QgaW1wbGVtZW50cyBhIHByb2Nlc3MgZnVuY3Rpb24uCi0vLyAgfCBpbXBsZW1lbnRlZCAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBUaGUgZWZmZWN0IGRvZXMgbm90IGltcGxlbWVudCBhIHByb2Nlc3MgZnVuY3Rpb246Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBlbmFibGluZyB0aGUgZWZmZWN0IGhhcyBubyBpbXBhY3Qgb24gbGF0ZW5jeSBvcgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgQ1BVIGxvYWQuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBFZmZlY3QgaW1wbGVtZW50YXRpb25zIHNldHRpbmcgdGhpcyBmbGFnIGRvIG5vdCBoYXZlCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICB0byBpbXBsZW1lbnQgYSBwcm9jZXNzIGZ1bmN0aW9uLgotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gSW5zZXJ0IG1vZGUKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCAgICAgICAgICAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfU0laRSAgICAgICAgICAgMwotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX01BU0sgICAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfVFlQRV9TSVpFKSAtMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19UWVBFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCAgICAgICAgICgwIDw8IEVGRkVDVF9GTEFHX1RZUEVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZICAgICAgKDEgPDwgRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9SRVBMQUNFICAgICAgICAoMiA8PCBFRkZFQ1RfRkxBR19UWVBFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DICAgICAgICgzIDw8IEVGRkVDVF9GTEFHX1RZUEVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DICAgICAgKDQgPDwgRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCkKLQotLy8gSW5zZXJ0IHByZWZlcmVuY2UKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX1NISUZUICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCArIEVGRkVDVF9GTEFHX1RZUEVfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX1NJWkUgICAgICAgICAzCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLICAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19JTlNFUlRfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfSU5TRVJUX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZICAgICAgICAgICgwIDw8IEVGRkVDVF9GTEFHX0lOU0VSVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUICAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19JTlNFUlRfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUICAgICAgICAgKDIgPDwgRUZGRUNUX0ZMQUdfSU5TRVJUX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFICAgICgzIDw8IEVGRkVDVF9GTEFHX0lOU0VSVF9TSElGVCkKLQotCi0vLyBWb2x1bWUgY29udHJvbAotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfU0hJRlQgICAgICAgIChFRkZFQ1RfRkxBR19JTlNFUlRfU0hJRlQgKyBFRkZFQ1RfRkxBR19JTlNFUlRfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX1NJWkUgICAgICAgICAzCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLICAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19WT0xVTUVfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfVk9MVU1FX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCAgICAgICAgICgxIDw8IEVGRkVDVF9GTEFHX1ZPTFVNRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCAgICAgICAgICAoMiA8PCBFRkZFQ1RfRkxBR19WT0xVTUVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9OT05FICAgICAgICAgKDAgPDwgRUZGRUNUX0ZMQUdfVk9MVU1FX1NISUZUKQotCi0vLyBEZXZpY2UgaW5kaWNhdGlvbgotI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfU0hJRlQgICAgICAgIChFRkZFQ1RfRkxBR19WT0xVTUVfU0hJRlQgKyBFRkZFQ1RfRkxBR19WT0xVTUVfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX1NJWkUgICAgICAgICAzCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0RFVklDRV9NQVNLICAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19ERVZJQ0VfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfREVWSUNFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EICAgICAgICAgICgxIDw8IEVGRkVDVF9GTEFHX0RFVklDRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX05PTkUgICAgICAgICAoMCA8PCBFRkZFQ1RfRkxBR19ERVZJQ0VfU0hJRlQpCi0KLS8vIFNhbXBsZSBpbnB1dCBtb2RlcwotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCAgICAgICAgIChFRkZFQ1RfRkxBR19ERVZJQ0VfU0hJRlQgKyBFRkZFQ1RfRkxBR19ERVZJQ0VfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfU0laRSAgICAgICAgICAyCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX01BU0sgICAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSVpFKSAtMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfRElSRUNUICAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfUFJPVklERVIgICAgICAoMiA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfQk9USCAgICAgICAgICAoMyA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCkKLQotLy8gU2FtcGxlIG91dHB1dCBtb2RlcwotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfU0hJRlQgICAgICAgIChFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCArIEVGRkVDVF9GTEFHX0lOUFVUX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9TSVpFICAgICAgICAgMgotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfTUFTSyAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfT1VUUFVUX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX09VVFBVVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX0RJUkVDVCAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19PVVRQVVRfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9QUk9WSURFUiAgICAgKDIgPDwgRUZGRUNUX0ZMQUdfT1VUUFVUX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfQk9USCAgICAgICAgICgzIDw8IEVGRkVDVF9GTEFHX09VVFBVVF9TSElGVCkKLQotLy8gSGFyZHdhcmUgYWNjZWxlcmF0aW9uIG1vZGUKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX1NISUZUICAgICAgICAoRUZGRUNUX0ZMQUdfT1VUUFVUX1NISUZUICsgRUZGRUNUX0ZMQUdfT1VUUFVUX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19TSVpFICAgICAgICAgMgotI2RlZmluZSBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSyAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfSFdfQUNDX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX0hXX0FDQ19TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX1NJTVBMRSAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19IV19BQ0NfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwgICAgICAgKDIgPDwgRUZGRUNUX0ZMQUdfSFdfQUNDX1NISUZUKQotCi0vLyBBdWRpbyBtb2RlIGluZGljYXRpb24KLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9TSElGVCAgICAoRUZGRUNUX0ZMQUdfSFdfQUNDX1NISUZUICsgRUZGRUNUX0ZMQUdfSFdfQUNDX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0laRSAgICAgMgotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX01BU0sgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9TSVpFKSAtMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19BVURJT19NT0RFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCAgICAgICgxIDw8IEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTk9ORSAgICAgKDAgPDwgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9TSElGVCkKLQotLy8gQXVkaW8gc291cmNlIGluZGljYXRpb24KLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX1NISUZUICAoRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9TSElGVCArIEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX1NJWkUgICAyCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9NQVNLICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX0lORCAgICAoMSA8PCBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9OT05FICAgKDAgPDwgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX1NISUZUKQotCi0vLyBFZmZlY3Qgb2ZmbG9hZCBpbmRpY2F0aW9uCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09GRkxPQURfU0hJRlQgICAgICAgKEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9TSElGVCArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TSVpFICAgICAgICAxCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09GRkxPQURfTUFTSyAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19PRkZMT0FEX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19PRkZMT0FEX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCAgICgxIDw8IEVGRkVDVF9GTEFHX09GRkxPQURfU0hJRlQpCi0KLS8vIEVmZmVjdCBoYXMgbm8gcHJvY2VzcyBpbmRpY2F0aW9uCi0jZGVmaW5lIEVGRkVDVF9GTEFHX05PX1BST0NFU1NfU0hJRlQgICAgICAgKEVGRkVDVF9GTEFHX09GRkxPQURfU0hJRlQgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TSVpFKQotI2RlZmluZSBFRkZFQ1RfRkxBR19OT19QUk9DRVNTX1NJWkUgICAgICAgIDEKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfTk9fUFJPQ0VTU19NQVNLICAgICAgICAoKCgxIDw8IEVGRkVDVF9GTEFHX05PX1BST0NFU1NfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX05PX1BST0NFU1NfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX05PX1BST0NFU1MgICAgICAgICAgKDEgPDwgRUZGRUNUX0ZMQUdfTk9fUFJPQ0VTU19TSElGVCkKLQogI2RlZmluZSBFRkZFQ1RfTUFLRV9BUElfVkVSU0lPTihNLCBtKSAgKCgoTSk8PDE2KSB8ICgobSkgJiAweEZGRkYpKQogI2RlZmluZSBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IodikgICAgKCh2KT4+MTYpCiAjZGVmaW5lIEVGRkVDVF9BUElfVkVSU0lPTl9NSU5PUih2KSAgICAoKG0pICYgMHhGRkZGKQogCiAKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBFZmZlY3QgY29udHJvbCBpbnRlcmZhY2UKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTI4OCwxNSArNjgsNiBAQAogLy8gdHlwZSBhbmQgcmV0dXJuIGl0cyBhZGRyZXNzIGFzIGVmZmVjdF9oYW5kbGVfdAogdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICoqZWZmZWN0X2hhbmRsZV90OwogCi0KLS8vIEZvcndhcmQgZGVmaW5pdGlvbiBvZiB0eXBlIGF1ZGlvX2J1ZmZlcl90Ci10eXBlZGVmIHN0cnVjdCBhdWRpb19idWZmZXJfcyBhdWRpb19idWZmZXJfdDsKLQotCi0KLQotCi0KIC8vIEVmZmVjdCBjb250cm9sIGludGVyZmFjZSBkZWZpbml0aW9uCiBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHsKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNDI4LDQ5OSArMTk5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKTsKIH07CiAKLQotLy8KLS8vLS0tIFN0YW5kYXJkaXplZCBjb21tYW5kIGNvZGVzIGZvciBjb21tYW5kKCkgZnVuY3Rpb24KLS8vCi1lbnVtIGVmZmVjdF9jb21tYW5kX2UgewotICAgRUZGRUNUX0NNRF9JTklULCAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBlZmZlY3QgZW5naW5lCi0gICBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsICAgICAgICAgICAvLyBjb25maWd1cmUgZWZmZWN0IGVuZ2luZSAoc2VlIGVmZmVjdF9jb25maWdfdCkKLSAgIEVGRkVDVF9DTURfUkVTRVQsICAgICAgICAgICAgICAgIC8vIHJlc2V0IGVmZmVjdCBlbmdpbmUKLSAgIEVGRkVDVF9DTURfRU5BQkxFLCAgICAgICAgICAgICAgIC8vIGVuYWJsZSBlZmZlY3QgcHJvY2VzcwotICAgRUZGRUNUX0NNRF9ESVNBQkxFLCAgICAgICAgICAgICAgLy8gZGlzYWJsZSBlZmZlY3QgcHJvY2VzcwotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0sICAgICAgICAgICAgLy8gc2V0IHBhcmFtZXRlciBpbW1lZGlhdGVseSAoc2VlIGVmZmVjdF9wYXJhbV90KQotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQsICAgLy8gc2V0IHBhcmFtZXRlciBkZWZlcnJlZAotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlULCAgICAgLy8gY29tbWl0IHByZXZpb3VzIHNldCBwYXJhbWV0ZXIgZGVmZXJyZWQKLSAgIEVGRkVDVF9DTURfR0VUX1BBUkFNLCAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXIKLSAgIEVGRkVDVF9DTURfU0VUX0RFVklDRSwgICAgICAgICAgIC8vIHNldCBhdWRpbyBkZXZpY2UgKHNlZSBhdWRpby5oLCBhdWRpb19kZXZpY2VzX3QpCi0gICBFRkZFQ1RfQ01EX1NFVF9WT0xVTUUsICAgICAgICAgICAvLyBzZXQgdm9sdW1lCi0gICBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFLCAgICAgICAvLyBzZXQgdGhlIGF1ZGlvIG1vZGUgKG5vcm1hbCwgcmluZywgLi4uKQotICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UsICAgLy8gY29uZmlndXJlIGVmZmVjdCBlbmdpbmUgcmV2ZXJzZSBzdHJlYW0oc2VlIGVmZmVjdF9jb25maWdfdCkKLSAgIEVGRkVDVF9DTURfU0VUX0lOUFVUX0RFVklDRSwgICAgIC8vIHNldCBjYXB0dXJlIGRldmljZSAoc2VlIGF1ZGlvLmgsIGF1ZGlvX2RldmljZXNfdCkKLSAgIEVGRkVDVF9DTURfR0VUX0NPTkZJRywgICAgICAgICAgIC8vIHJlYWQgZWZmZWN0IGVuZ2luZSBjb25maWd1cmF0aW9uCi0gICBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSwgICAvLyByZWFkIGNvbmZpZ3VyZSBlZmZlY3QgZW5naW5lIHJldmVyc2Ugc3RyZWFtIGNvbmZpZ3VyYXRpb24KLSAgIEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfU1VQUE9SVEVEX0NPTkZJR1MsLy8gZ2V0IGFsbCBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMgZm9yIGEgZmVhdHVyZS4KLSAgIEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfQ09ORklHLCAgIC8vIGdldCBjdXJyZW50IGZlYXR1cmUgY29uZmlndXJhdGlvbgotICAgRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUcsICAgLy8gc2V0IGN1cnJlbnQgZmVhdHVyZSBjb25maWd1cmF0aW9uCi0gICBFRkZFQ1RfQ01EX1NFVF9BVURJT19TT1VSQ0UsICAgICAvLyBzZXQgdGhlIGF1ZGlvIHNvdXJjZSAoc2VlIGF1ZGlvLmgsIGF1ZGlvX3NvdXJjZV90KQotICAgRUZGRUNUX0NNRF9PRkZMT0FELCAgICAgICAgICAgICAgLy8gc2V0IGlmIGVmZmVjdCB0aHJlYWQgaXMgYW4gb2ZmbG9hZCBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSBpb0hhbmRsZSBvZiB0aGUgZWZmZWN0IHRocmVhZAotICAgRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWSA9IDB4MTAwMDAgLy8gZmlyc3QgcHJvcHJpZXRhcnkgY29tbWFuZCBjb2RlCi19OwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0lOSVQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEluaXRpYWxpemUgZWZmZWN0IGVuZ2luZTogQWxsIGNvbmZpZ3VyYXRpb25zIHJldHVybiB0byBkZWZhdWx0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX0NPTkZJRwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgQXBwbHkgbmV3IGF1ZGlvIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbnMgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKLS8vICBkYXRhOiBlZmZlY3RfY29uZmlnX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9SRVNFVAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgUmVzZXQgdGhlIGVmZmVjdCBlbmdpbmUuIEtlZXAgY29uZmlndXJhdGlvbiBidXQgcmVzZXRzIHN0YXRlIGFuZCBidWZmZXIgY29udGVudAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfRU5BQkxFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBFbmFibGUgdGhlIHByb2Nlc3MuIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBwcm9jZXNzKCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9ESVNBQkxFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBEaXNhYmxlIHRoZSBwcm9jZXNzLiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayBhZnRlciB0aGUgbGFzdCBjYWxsIHRvIHByb2Nlc3MoKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihpbnQpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IGEgcGFyYW1ldGVyIGFuZCBhcHBseSBpdCBpbW1lZGlhdGVseQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemUgb2YgcGFyYW0gYW5kIHZhbHVlCi0vLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbSArIHZhbHVlLiBTZWUgZWZmZWN0X3BhcmFtX3QgZGVmaW5pdGlvbiBiZWxvdyBmb3IgdmFsdWUgb2Zmc2V0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVECi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgYSBwYXJhbWV0ZXIgYnV0IGFwcGx5IGl0IG9ubHkgd2hlbiByZWNlaXZpbmcgRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlUIGNvbW1hbmQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtIGFuZCB2YWx1ZQotLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0gKyB2YWx1ZS4gU2VlIGVmZmVjdF9wYXJhbV90IGRlZmluaXRpb24gYmVsb3cgZm9yIHZhbHVlIG9mZnNldAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgQXBwbHkgYWxsIHByZXZpb3VzbHkgcmVjZWl2ZWQgRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQgY29tbWFuZHMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9HRVRfUEFSQU0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEdldCBhIHBhcmFtZXRlciB2YWx1ZQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemUgb2YgcGFyYW0KLS8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemUgb2YgcGFyYW0gYW5kIHZhbHVlCi0vLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbSArIHZhbHVlLiBTZWUgZWZmZWN0X3BhcmFtX3QgZGVmaW5pdGlvbiBiZWxvdyBmb3IgdmFsdWUgb2Zmc2V0Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFNldCB0aGUgcmVuZGVyaW5nIGRldmljZSB0aGUgYXVkaW8gb3V0cHV0IHBhdGggaXMgY29ubmVjdGVkIHRvLiBTZWUgYXVkaW8uaCwgYXVkaW9fZGV2aWNlc190Ci0vLyAgZm9yIGRldmljZSB2YWx1ZXMuCi0vLyAgVGhlIGVmZmVjdCBpbXBsZW1lbnRhdGlvbiBtdXN0IHNldCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EIGZsYWcgaW4gaXRzIGRlc2NyaXB0b3IgdG8gcmVjZWl2ZSB0aGlzCi0vLyAgY29tbWFuZCB3aGVuIHRoZSBkZXZpY2UgY2hhbmdlcwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IHVpbnQzMl90Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfVk9MVU1FCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgYW5kIGdldCB2b2x1bWUuIFVzZWQgYnkgYXVkaW8gZnJhbWV3b3JrIHRvIGRlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBlbmdpbmUuCi0vLyAgVGhlIGVmZmVjdCBpbXBsZW1lbnRhdGlvbiBtdXN0IHNldCBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EIG9yIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIGZsYWcgaW4KLS8vICBpdHMgZGVzY3JpcHRvciB0byByZWNlaXZlIHRoaXMgY29tbWFuZCBiZWZvcmUgZXZlcnkgY2FsbCB0byBwcm9jZXNzKCkgZnVuY3Rpb24KLS8vICBJZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBmbGFnIGlzIHNldCBpbiB0aGUgZWZmZWN0IGRlc2NyaXB0b3IsIHRoZSBlZmZlY3QgZW5naW5lIG11c3QgcmV0dXJuCi0vLyAgdGhlIHZvbHVtZSB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSB0aGUgZWZmZWN0IGlzIHByb2Nlc3NlZC4gVGhlIG92ZXJhbGwgdm9sdW1lICh0aGUgdm9sdW1lCi0vLyAgYWN0dWFsbHkgYXBwbGllZCBieSB0aGUgZWZmZWN0IGVuZ2luZSBtdWx0aXBsaWVkIGJ5IHRoZSByZXR1cm5lZCB2YWx1ZSkgc2hvdWxkIG1hdGNoIHRoZSB2YWx1ZQotLy8gIGluZGljYXRlZCBpbiB0aGUgY29tbWFuZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IG4gKiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogdm9sdW1lIGZvciBlYWNoIGNoYW5uZWwgZGVmaW5lZCBpbiBlZmZlY3RfY29uZmlnX3QgZm9yIG91dHB1dCBidWZmZXIgZXhwcmVzc2VkIGluCi0vLyAgICAgIDguMjQgZml4ZWQgcG9pbnQgZm9ybWF0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogbiAqIHNpemVvZih1aW50MzJfdCkgLyAwCi0vLyAgZGF0YTogLSBpZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBpcyBzZXQgaW4gZWZmZWN0IGRlc2NyaXB0b3I6Ci0vLyAgICAgICAgICAgICAgdm9sdW1lIGZvciBlYWNoIGNoYW5uZWwgZGVmaW5lZCBpbiBlZmZlY3RfY29uZmlnX3QgZm9yIG91dHB1dCBidWZmZXIgZXhwcmVzc2VkIGluCi0vLyAgICAgICAgICAgICAgOC4yNCBmaXhlZCBwb2ludCBmb3JtYXQKLS8vICAgICAgICAtIGlmIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIGlzIG5vdCBzZXQgaW4gZWZmZWN0IGRlc2NyaXB0b3I6Ci0vLyAgICAgICAgICAgICAgTi9BCi0vLyAgSXQgaXMgbGVnYWwgdG8gcmVjZWl2ZSBhIG51bGwgcG9pbnRlciBhcyBwUmVwbHlEYXRhIGluIHdoaWNoIGNhc2UgdGhlIGVmZmVjdCBmcmFtZXdvcmsgaGFzCi0vLyAgZGVsZWdhdGVkIHZvbHVtZSBjb250cm9sIHRvIGFub3RoZXIgZWZmZWN0Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIGF1ZGlvIG1vZGUuIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQgZmxhZyBpbiBpdHMKLS8vICBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcyBjb21tYW5kIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKLS8vICBkYXRhOiBhdWRpb19tb2RlX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgQXBwbHkgbmV3IGF1ZGlvIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbnMgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBvZiByZXZlcnNlIHN0cmVhbS4KLS8vICBBbiBleGFtcGxlIG9mIHJldmVyc2Ugc3RyZWFtIGlzIHRoZSBlY2hvIHJlZmVyZW5jZSBzdXBwbGllZCB0byBhbiBBY291c3RpYyBFY2hvIENhbmNlbGVyLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKLS8vICBkYXRhOiBlZmZlY3RfY29uZmlnX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfSU5QVVRfREVWSUNFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIGNhcHR1cmUgZGV2aWNlIHRoZSBhdWRpbyBpbnB1dCBwYXRoIGlzIGNvbm5lY3RlZCB0by4gU2VlIGF1ZGlvLmgsIGF1ZGlvX2RldmljZXNfdAotLy8gIGZvciBkZXZpY2UgdmFsdWVzLgotLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCBmbGFnIGluIGl0cyBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcwotLy8gIGNvbW1hbmQgd2hlbiB0aGUgZGV2aWNlIGNoYW5nZXMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKLS8vICBkYXRhOiB1aW50MzJfdAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX0NPTkZJRwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgUmVhZCBhdWRpbyBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb25zIGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X2NvbmZpZ190KQotLy8gIGRhdGE6IGVmZmVjdF9jb25maWdfdAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFJlYWQgYXVkaW8gcGFyYW1ldGVycyBjb25maWd1cmF0aW9ucyBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9mIHJldmVyc2Ugc3RyZWFtCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKLS8vICBkYXRhOiBlZmZlY3RfY29uZmlnX3QKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfU1VQUE9SVEVEX0NPTkZJR1MKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFF1ZXJpZXMgZm9yIHN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGZlYXR1cmUgKGUuZy4gZ2V0IHRoZSBzdXBwb3J0ZWQKLS8vIGNvbWJpbmF0aW9ucyBvZiBtYWluIGFuZCBhdXhpbGlhcnkgY2hhbm5lbHMgZm9yIGEgbm9pc2Ugc3VwcHJlc3NvcikuCi0vLyBUaGUgY29tbWFuZCBwYXJhbWV0ZXIgaXMgdGhlIGZlYXR1cmUgaWRlbnRpZmllciAoU2VlIGVmZmVjdF9mZWF0dXJlX2UgZm9yIGEgbGlzdCBvZiBkZWZpbmVkCi0vLyBmZWF0dXJlcykgZm9sbG93ZWQgYnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciB0byByZXR1cm4uCi0vLyBUaGUgcmVwbHkgaXMgY29tcG9zZWQgb2Y6Ci0vLyAgLSBzdGF0dXMgKHVpbnQzMl90KToKLS8vICAgICAgICAgIC0gMCBpZiBmZWF0dXJlIGlzIHN1cHBvcnRlZAotLy8gICAgICAgICAgLSAtRU5PU1lTIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQsCi0vLyAgICAgICAgICAtIC1FTk9NRU0gaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ1dCB0aGUgdG90YWwgbnVtYmVyIG9mIHN1cHBvcnRlZCBjb25maWd1cmF0aW9ucwotLy8gICAgICAgICAgZXhjZWVkcyB0aGUgbWF4aW11bSBudW1iZXIgaW5kaWNhdGVkIGJ5IHRoZSBjYWxsZXIuCi0vLyAgLSB0b3RhbCBudW1iZXIgb2Ygc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zICh1aW50MzJfdCkKLS8vICAtIGFuIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvcnMuCi0vLyBUaGUgYWN0dWFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyByZXR1cm5lZCBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIGluZGljYXRlZCBieQotLy8gdGhlIGNhbGxlci4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDIgeCBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogZWZmZWN0X2ZlYXR1cmVfZSArIG1heGltdW0gbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb25zIHRvIHJldHVybgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDIgeCBzaXplb2YodWludDMyX3QpICsgbiB4IHNpemVvZiAoPGNvbmZpZyBkZXNjcmlwdG9yPikKLS8vICBkYXRhOiBzdGF0dXMgKyB0b3RhbCBudW1iZXIgb2YgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkICsgYXJyYXkgb2YgbiBjb25maWcgZGVzY3JpcHRvcnMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfQ09ORklHCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBSZXRyaWV2ZXMgY3VycmVudCBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGZlYXR1cmUuCi0vLyBUaGUgcmVwbHkgc3RhdHVzIGlzOgotLy8gICAgICAtIDAgaWYgZmVhdHVyZSBpcyBzdXBwb3J0ZWQKLS8vICAgICAgLSAtRU5PU1lTIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQsCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogZWZmZWN0X2ZlYXR1cmVfZQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YgKDxjb25maWcgZGVzY3JpcHRvcj4pCi0vLyAgZGF0YTogc3RhdHVzICsgY29uZmlnIGRlc2NyaXB0b3IKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXRzIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBmZWF0dXJlLgotLy8gVGhlIHJlcGx5IHN0YXR1cyBpczoKLS8vICAgICAgLSAwIGlmIGZlYXR1cmUgaXMgc3VwcG9ydGVkCi0vLyAgICAgIC0gLUVOT1NZUyBpZiB0aGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLAotLy8gICAgICAtIC1FSU5WQUwgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZiAoPGNvbmZpZyBkZXNjcmlwdG9yPikKLS8vICBkYXRhOiBlZmZlY3RfZmVhdHVyZV9lICsgY29uZmlnIGRlc2NyaXB0b3IKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9BVURJT19TT1VSQ0UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFNldCB0aGUgYXVkaW8gc291cmNlIHRoZSBjYXB0dXJlIHBhdGggaXMgY29uZmlndXJlZCBmb3IgKENhbWNvcmRlciwgdm9pY2UgcmVjb2duaXRpb24uLi4pLgotLy8gIFNlZSBhdWRpby5oLCBhdWRpb19zb3VyY2VfdCBmb3IgdmFsdWVzLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IHVpbnQzMl90Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9PRkZMT0FECi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICAxLmluZGljYXRlIGlmIHRoZSBwbGF5YmFjayB0aHJlYWQgdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0byBpcyBvZmZsb2FkZWQgb3Igbm90Ci0vLyAgMi51cGRhdGUgdGhlIGlvIGhhbmRsZSBvZiB0aGUgcGxheWJhY2sgdGhyZWFkIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3Rfb2ZmbG9hZF9wYXJhbV90KQotLy8gIGRhdGE6IGVmZmVjdF9vZmZsb2FkX3BhcmFtX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogdWludDMyX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfRklSU1RfUFJPUFJJRVRBUlkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEFsbCBwcm9wcmlldGFyeSBlZmZlY3QgY29tbWFuZHMgbXVzdCB1c2UgY29tbWFuZCBjb2RlcyBhYm92ZSB0aGlzIHZhbHVlLiBUaGUgc2l6ZSBhbmQgZm9ybWF0IG9mCi0vLyAgY29tbWFuZCBhbmQgcmVzcG9uc2UgZmllbGRzIGlzIGZyZWUgaW4gdGhpcyBjYXNlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotLy8gQXVkaW8gYnVmZmVyIGRlc2NyaXB0b3IgdXNlZCBieSBwcm9jZXNzKCksIGJ1ZmZlclByb3ZpZGVyKCkgZnVuY3Rpb25zIGFuZCBidWZmZXJfY29uZmlnX3QKLS8vIHN0cnVjdHVyZS4gTXVsdGktY2hhbm5lbCBhdWRpbyBpcyBhbHdheXMgaW50ZXJsZWF2ZWQuIFRoZSBjaGFubmVsIG9yZGVyIGlzIGZyb20gTFNCIHRvIE1TQiB3aXRoCi0vLyByZWdhcmQgdG8gdGhlIGNoYW5uZWwgbWFzayBkZWZpbml0aW9uIGluIGF1ZGlvLmgsIGF1ZGlvX2NoYW5uZWxfbWFza190IGUuZyA6Ci0vLyBTdGVyZW86IGxlZnQsIHJpZ2h0Ci0vLyA1IHBvaW50IDE6IGZyb250IGxlZnQsIGZyb250IHJpZ2h0LCBmcm9udCBjZW50ZXIsIGxvdyBmcmVxdWVuY3ksIGJhY2sgbGVmdCwgYmFjayByaWdodAotLy8gVGhlIGJ1ZmZlciBzaXplIGlzIGV4cHJlc3NlZCBpbiBmcmFtZSBjb3VudCwgYSBmcmFtZSBiZWluZyBjb21wb3NlZCBvZiBzYW1wbGVzIGZvciBhbGwKLS8vIGNoYW5uZWxzIGF0IGEgZ2l2ZW4gdGltZS4gRnJhbWUgc2l6ZSBmb3IgdW5zcGVjaWZpZWQgZm9ybWF0IChBVURJT19GT1JNQVRfT1RIRVIpIGlzIDggYml0IGJ5Ci0vLyBkZWZpbml0aW9uCi1zdHJ1Y3QgYXVkaW9fYnVmZmVyX3MgewotICAgIHNpemVfdCAgIGZyYW1lQ291bnQ7ICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIGluIGJ1ZmZlcgotICAgIHVuaW9uIHsKLSAgICAgICAgdm9pZCogICAgICAgcmF3OyAgICAgICAgLy8gcmF3IHBvaW50ZXIgdG8gc3RhcnQgb2YgYnVmZmVyCi0gICAgICAgIGludDMyX3QqICAgIHMzMjsgICAgICAgIC8vIHBvaW50ZXIgdG8gc2lnbmVkIDMyIGJpdCBkYXRhIGF0IHN0YXJ0IG9mIGJ1ZmZlcgotICAgICAgICBpbnQxNl90KiAgICBzMTY7ICAgICAgICAvLyBwb2ludGVyIHRvIHNpZ25lZCAxNiBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKLSAgICAgICAgdWludDhfdCogICAgdTg7ICAgICAgICAgLy8gcG9pbnRlciB0byB1bnNpZ25lZCA4IGJpdCBkYXRhIGF0IHN0YXJ0IG9mIGJ1ZmZlcgotICAgIH07Ci19OwotCi0vLyBUaGUgYnVmZmVyX3Byb3ZpZGVyX3Mgc3RydWN0dXJlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkCi0vLyBieSB0aGUgZWZmZWN0IGVuZ2luZSBwcm9jZXNzKCkgZnVuY3Rpb24gdG8gcXVlcnkgYW5kIHJlbGVhc2UgaW5wdXQKLS8vIG9yIG91dHB1dCBhdWRpbyBidWZmZXIuCi0vLyBUaGUgZ2V0QnVmZmVyKCkgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJldHJpZXZlIGEgYnVmZmVyIHdoZXJlIGRhdGEKLS8vIHNob3VsZCByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBieSBwcm9jZXNzKCkgZnVuY3Rpb24uCi0vLyBUaGUgcmVsZWFzZUJ1ZmZlcigpIGZ1bmN0aW9uIE1VU1QgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciByZXRyaWV2ZWQKLS8vIHdpdGggZ2V0QnVmZmVyKCkgaXMgbm90IG5lZWRlZCBhbnltb3JlLgotLy8gVGhlIHByb2Nlc3MgZnVuY3Rpb24gc2hvdWxkIHVzZSB0aGUgYnVmZmVyIHByb3ZpZGVyIG1lY2hhbmlzbSB0byByZXRyaWV2ZQotLy8gaW5wdXQgb3Igb3V0cHV0IGJ1ZmZlciBpZiB0aGUgaW5CdWZmZXIgb3Igb3V0QnVmZmVyIHBhc3NlZCBhcyBhcmd1bWVudCBpcyBOVUxMCi0vLyBhbmQgdGhlIGJ1ZmZlciBjb25maWd1cmF0aW9uIChidWZmZXJfY29uZmlnX3QpIGdpdmVuIGJ5IHRoZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcKLS8vIGNvbW1hbmQgZGlkIG5vdCBzcGVjaWZ5IGFuIGF1ZGlvIGJ1ZmZlci4KLQotdHlwZWRlZiBpbnQzMl90ICgqIGJ1ZmZlcl9mdW5jdGlvbl90KSh2b2lkICpjb29raWUsIGF1ZGlvX2J1ZmZlcl90ICpidWZmZXIpOwotCi10eXBlZGVmIHN0cnVjdCBidWZmZXJfcHJvdmlkZXJfcyB7Ci0gICAgYnVmZmVyX2Z1bmN0aW9uX3QgZ2V0QnVmZmVyOyAgICAgICAvLyByZXRyaWV2ZSBuZXh0IGJ1ZmZlcgotICAgIGJ1ZmZlcl9mdW5jdGlvbl90IHJlbGVhc2VCdWZmZXI7ICAgLy8gcmVsZWFzZSB1c2VkIGJ1ZmZlcgotICAgIHZvaWQgICAgICAgKmNvb2tpZTsgICAgICAgICAgICAgICAgLy8gZm9yIHVzZSBieSBjbGllbnQgb2YgYnVmZmVyIHByb3ZpZGVyIGZ1bmN0aW9ucwotfSBidWZmZXJfcHJvdmlkZXJfdDsKLQotCi0vLyBUaGUgYnVmZmVyX2NvbmZpZ19zIHN0cnVjdHVyZSBzcGVjaWZpZXMgdGhlIGlucHV0IG9yIG91dHB1dCBhdWRpbyBmb3JtYXQKLS8vIHRvIGJlIHVzZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUuIEl0IGlzIHBhcnQgb2YgdGhlIGVmZmVjdF9jb25maWdfdAotLy8gc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIGNvbmZpZ3VyYXRpb25zIGFuZCBpcwotLy8gcGFzc2VkIGJ5IHRoZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgb3IgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UgY29tbWFuZC4KLXR5cGVkZWYgc3RydWN0IGJ1ZmZlcl9jb25maWdfcyB7Ci0gICAgYXVkaW9fYnVmZmVyX3QgIGJ1ZmZlcjsgICAgIC8vIGJ1ZmZlciBmb3IgdXNlIGJ5IHByb2Nlc3MoKSBmdW5jdGlvbiBpZiBub3QgcGFzc2VkIGV4cGxpY2l0bHkKLSAgICB1aW50MzJfdCAgIHNhbXBsaW5nUmF0ZTsgICAgLy8gc2FtcGxpbmcgcmF0ZQotICAgIHVpbnQzMl90ICAgY2hhbm5lbHM7ICAgICAgICAvLyBjaGFubmVsIG1hc2sgKHNlZSBhdWRpb19jaGFubmVsX21hc2tfdCBpbiBhdWRpby5oKQotICAgIGJ1ZmZlcl9wcm92aWRlcl90IGJ1ZmZlclByb3ZpZGVyOyAgIC8vIGJ1ZmZlciBwcm92aWRlcgotICAgIHVpbnQ4X3QgICAgZm9ybWF0OyAgICAgICAgICAvLyBBdWRpbyBmb3JtYXQgKHNlZSBhdWRpb19mb3JtYXRfdCBpbiBhdWRpby5oKQotICAgIHVpbnQ4X3QgICAgYWNjZXNzTW9kZTsgICAgICAvLyByZWFkL3dyaXRlIG9yIGFjY3VtdWxhdGUgaW4gYnVmZmVyIChlZmZlY3RfYnVmZmVyX2FjY2Vzc19lKQotICAgIHVpbnQxNl90ICAgbWFzazsgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIGFib3ZlIGZpZWxkcyBpcyB2YWxpZAotfSBidWZmZXJfY29uZmlnX3Q7Ci0KLS8vIFZhbHVlcyBmb3IgImFjY2Vzc01vZGUiIGZpZWxkIG9mIGJ1ZmZlcl9jb25maWdfdDoKLS8vICAgb3ZlcndyaXRlLCByZWFkIG9ubHksIGFjY3VtdWxhdGUgKHJlYWQvbW9kaWZ5L3dyaXRlKQotZW51bSBlZmZlY3RfYnVmZmVyX2FjY2Vzc19lIHsKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSwKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFELAotICAgIEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUKLQotfTsKLQotLy8gZmVhdHVyZSBpZGVudGlmaWVycyBmb3IgRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9TVVBQT1JURURfQ09ORklHUyBjb21tYW5kCi1lbnVtIGVmZmVjdF9mZWF0dXJlX2UgewotICAgIEVGRkVDVF9GRUFUVVJFX0FVWF9DSEFOTkVMUywgLy8gc3VwcG9ydHMgYXV4aWxpYXJ5IGNoYW5uZWxzIChlLmcuIGR1YWwgbWljIG5vaXNlIHN1cHByZXNzb3IpCi0gICAgRUZGRUNUX0ZFQVRVUkVfQ05UCi19OwotCi0vLyBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgZmVhdHVyZSBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IuIERlc2NyaWJlIGEgY29tYmluYXRpb24KLS8vIG9mIG1haW4gYW5kIGF1eGlsaWFyeSBjaGFubmVscyBzdXBwb3J0ZWQKLXR5cGVkZWYgc3RydWN0IGNoYW5uZWxfY29uZmlnX3MgewotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1haW5fY2hhbm5lbHM7IC8vIGNoYW5uZWwgbWFzayBmb3IgbWFpbiBjaGFubmVscwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGF1eF9jaGFubmVsczsgIC8vIGNoYW5uZWwgbWFzayBmb3IgYXV4aWxpYXJ5IGNoYW5uZWxzCi19IGNoYW5uZWxfY29uZmlnX3Q7Ci0KLQotLy8gVmFsdWVzIGZvciBiaXQgZmllbGQgIm1hc2siIGluIGJ1ZmZlcl9jb25maWdfdC4gSWYgYSBiaXQgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZAotLy8gaW4gYnVmZmVyX2NvbmZpZ190IG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gZXhlY3V0aW5nIHRoZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgY29tbWFuZAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX0JVRkZFUiAgICAweDAwMDEgIC8vIGJ1ZmZlciBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX1NNUF9SQVRFICAweDAwMDIgIC8vIHNhbXBsaW5nUmF0ZSBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTICAweDAwMDQgIC8vIGNoYW5uZWxzIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfRk9STUFUICAgIDB4MDAwOCAgLy8gZm9ybWF0IGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQUNDX01PREUgIDB4MDAxMCAgLy8gYWNjZXNzTW9kZSBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX1BST1ZJREVSICAweDAwMjAgIC8vIGJ1ZmZlclByb3ZpZGVyIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQUxMIChFRkZFQ1RfQ09ORklHX0JVRkZFUiB8IEVGRkVDVF9DT05GSUdfU01QX1JBVEUgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTIHwgRUZGRUNUX0NPTkZJR19GT1JNQVQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFIHwgRUZGRUNUX0NPTkZJR19QUk9WSURFUikKLQotCi0vLyBlZmZlY3RfY29uZmlnX3Mgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBwQ21kRGF0YSBhcmd1bWVudCBvZiBFRkZFQ1RfQ01EX1NFVF9DT05GSUcKLS8vIGNvbW1hbmQgdG8gY29uZmlndXJlIGF1ZGlvIHBhcmFtZXRlcnMgYW5kIGJ1ZmZlcnMgZm9yIGVmZmVjdCBlbmdpbmUgaW5wdXQgYW5kIG91dHB1dC4KLXR5cGVkZWYgc3RydWN0IGVmZmVjdF9jb25maWdfcyB7Ci0gICAgYnVmZmVyX2NvbmZpZ190ICAgaW5wdXRDZmc7Ci0gICAgYnVmZmVyX2NvbmZpZ190ICAgb3V0cHV0Q2ZnOwotfSBlZmZlY3RfY29uZmlnX3Q7Ci0KLQotLy8gZWZmZWN0X3BhcmFtX3Mgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBwQ21kRGF0YSBhcmd1bWVudCBvZiBFRkZFQ1RfQ01EX1NFVF9QQVJBTQotLy8gY29tbWFuZCBhbmQgcENtZERhdGEgYW5kIHBSZXBseURhdGEgb2YgRUZGRUNUX0NNRF9HRVRfUEFSQU0gY29tbWFuZC4KLS8vIHBzaXplIGFuZCB2c2l6ZSByZXByZXNlbnQgdGhlIGFjdHVhbCBzaXplIG9mIHBhcmFtZXRlciBhbmQgdmFsdWUuCi0vLwotLy8gTk9URTogdGhlIHN0YXJ0IG9mIHZhbHVlIGZpZWxkIGluc2lkZSB0aGUgZGF0YSBmaWVsZCBpcyBhbHdheXMgb24gYSAzMiBiaXQgYm91bmRhcnk6Ci0vLwotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8IHN0YXR1cyAgICB8IHNpemVvZihpbnQpCi0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgcHNpemUgICAgIHwgc2l6ZW9mKGludCkKLS8vICArLS0tLS0tLS0tLS0rCi0vLyAgfCB2c2l6ZSAgICAgfCBzaXplb2YoaW50KQotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgfAotLy8gIH4gcGFyYW1ldGVyIH4gICA+IHBzaXplICAgICB8Ci0vLyAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgID4gICgocHNpemUgLSAxKS9zaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCkKLS8vICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgfAotLy8gIHwgcGFkZGluZyAgIHwgICAgICAgICAgICAgICB8Ci0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgICAgICAgICAgIHwgICB8Ci0vLyAgfiB2YWx1ZSAgICAgfiAgID4gdnNpemUKLS8vICB8ICAgICAgICAgICB8ICAgfAotLy8gICstLS0tLS0tLS0tLSsKLQotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X3BhcmFtX3MgewotICAgIGludDMyX3QgICAgIHN0YXR1czsgICAgIC8vIFRyYW5zYWN0aW9uIHN0YXR1cyAodW51c2VkIGZvciBjb21tYW5kLCB1c2VkIGZvciByZXBseSkKLSAgICB1aW50MzJfdCAgICBwc2l6ZTsgICAgICAvLyBQYXJhbWV0ZXIgc2l6ZQotICAgIHVpbnQzMl90ICAgIHZzaXplOyAgICAgIC8vIFZhbHVlIHNpemUKLSAgICBjaGFyICAgICAgICBkYXRhW107ICAgICAvLyBTdGFydCBvZiBQYXJhbWV0ZXIgKyBWYWx1ZSBkYXRhCi19IGVmZmVjdF9wYXJhbV90OwotCi0vLyBNYXhpbXVtIGVmZmVjdF9wYXJhbV90IHNpemUKLSNkZWZpbmUgRUZGRUNUX1BBUkFNX1NJWkVfTUFYICAgICAgIDY1NTM2Ci0KLS8vIHN0cnVjdHVyZSB1c2VkIGJ5IEVGRkVDVF9DTURfT0ZGTE9BRCBjb21tYW5kCi10eXBlZGVmIHN0cnVjdCBlZmZlY3Rfb2ZmbG9hZF9wYXJhbV9zIHsKLSAgICBib29sIGlzT2ZmbG9hZDsgICAgICAgICAvLyB0cnVlIGlmIHRoZSBwbGF5YmFjayB0aHJlYWQgdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0byBpcyBvZmZsb2FkZWQKLSAgICBpbnQgaW9IYW5kbGU7ICAgICAgICAgICAvLyBpbyBoYW5kbGUgb2YgdGhlIHBsYXliYWNrIHRocmVhZCB0aGUgZWZmZWN0IGlzIGF0dGFjaGVkIHRvCi19IGVmZmVjdF9vZmZsb2FkX3BhcmFtX3Q7Ci0KLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBFZmZlY3QgbGlicmFyeSBpbnRlcmZhY2UKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvY2FtZXJhMy5oIGIvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmEzLmgKaW5kZXggYTdkZjBlZS4uY2VjMmFiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmEzLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmEzLmgKQEAgLTE0NzksNiArMTQ3OSwxMyBAQAogICAgICAqICAgICAgYW5kcm9pZC5sZW5zLm9wdGljYWxTdGFiaWxpemF0aW9uTW9kZSAoaWYgaXQgaXMgc3VwcG9ydGVkKQogICAgICAqICAgICAgYW5kcm9pZC5zY2FsZXIuY3JvcFJlZ2lvbgogICAgICAqICAgICAgYW5kcm9pZC5zdGF0aXN0aWNzLmZhY2VEZXRlY3RNb2RlIChpZiBpdCBpcyBzdXBwb3J0ZWQpCisgICAgICogICA2LiBUbyByZWR1Y2UgdGhlIGFtb3VudCBvZiBkYXRhIHBhc3NlZCBhY3Jvc3MgcHJvY2VzcyBib3VuZGFyaWVzIGF0CisgICAgICogICAgICBoaWdoIGZyYW1lIHJhdGUsIHdpdGhpbiBvbmUgYmF0Y2gsIGNhbWVyYSBmcmFtZXdvcmsgb25seSBwcm9wYWdhdGVzCisgICAgICogICAgICB0aGUgbGFzdCBzaHV0dGVyIG5vdGlmeSBhbmQgdGhlIGxhc3QgY2FwdHVyZSByZXN1bHRzIChpbmNsdWRpbmcgcGFydGlhbAorICAgICAqICAgICAgcmVzdWx0cyBhbmQgZmluYWwgcmVzdWx0KSB0byB0aGUgYXBwLiBUaGUgc2h1dHRlciBub3RpZmllcyBhbmQgY2FwdHVyZQorICAgICAqICAgICAgcmVzdWx0cyBmb3IgdGhlIG90aGVyIHJlcXVlc3RzIGluIHRoZSBiYXRjaCBhcmUgZGVyaXZlZCBieQorICAgICAqICAgICAgdGhlIGNhbWVyYSBmcmFtZXdvcmsuIEFzIGEgcmVzdWx0LCB0aGUgSEFMIGNhbiByZXR1cm4gZW1wdHkgbWV0YWRhdGEKKyAgICAgKiAgICAgIGV4Y2VwdCBmb3IgdGhlIGxhc3QgcmVzdWx0IGluIHRoZSBiYXRjaC4KICAgICAgKgogICAgICAqIEZvciBtb3JlIGRldGFpbHMgYWJvdXQgaGlnaCBzcGVlZCBzdHJlYW0gcmVxdWlyZW1lbnRzLCBzZWUKICAgICAgKiBhbmRyb2lkLmNvbnRyb2wuYXZhaWxhYmxlSGlnaFNwZWVkVmlkZW9Db25maWd1cmF0aW9ucyBhbmQgQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTwpAQCAtMTU5Nyw2ICsxNjA0LDEzIEBACiAgICAgICogICB2YWx1ZSBvZiB0aGlzIGlzIDAuCiAgICAgICogICBGb3IgYWxsIHN0cmVhbXMgcGFzc2VkIHZpYSBjb25maWd1cmVfc3RyZWFtcygpLCB0aGUgSEFMIG11c3Qgd3JpdGUKICAgICAgKiAgIG92ZXIgdGhpcyBmaWVsZCB3aXRoIGl0cyB1c2FnZSBmbGFncy4KKyAgICAgKgorICAgICAqICAgRnJvbSBBbmRyb2lkIE8sIHRoZSB1c2FnZSBmbGFnIGZvciBhbiBvdXRwdXQgc3RyZWFtIG1heSBiZSBiaXR3aXNlCisgICAgICogICBjb21iaW5hdGlvbiBvZiB1c2FnZSBmbGFncyBmb3IgbXVsdGlwbGUgY29uc3VtZXJzLCBmb3IgdGhlIHB1cnBvc2Ugb2YKKyAgICAgKiAgIHNoYXJpbmcgb25lIGNhbWVyYSBzdHJlYW0gYmV0d2VlbiB0aG9zZSBjb25zdW1lcnMuIFRoZSBIQUwgbXVzdCBmYWlsCisgICAgICogICBjb25maWd1cmVfc3RyZWFtcyBjYWxsIHdpdGggLUVJTlZBTCBpZiB0aGUgY29tYmluZWQgZmxhZ3MgY2Fubm90IGJlCisgICAgICogICBzdXBwb3J0ZWQgZHVlIHRvIGltY29tcGF0aWJsZSBidWZmZXIgZm9ybWF0LCBkYXRhU3BhY2UsIG9yIG90aGVyIGhhcmR3YXJlCisgICAgICogICBsaW1pdGF0aW9ucy4KICAgICAgKi8KICAgICB1aW50MzJfdCB1c2FnZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmFfY29tbW9uLmggYi9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYV9jb21tb24uaAppbmRleCBjNzRkN2JiLi43YmFmYTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYV9jb21tb24uaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYV9jb21tb24uaApAQCAtMTQzLDggKzE0Myw4IEBACiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigxLCAwKSAvLyBERVBSRUNBVEVECiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigyLCAwKSAvLyBOTyBMT05HRVIgU1VQUE9SVEVECiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigyLCAxKSAvLyBOTyBMT05HRVIgU1VQUE9SVEVECi0jZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCAwKQotI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMywgMSkKKyNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDApIC8vIE5PIExPTkdFUiBTVVBQT1JURUQKKyNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzEgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDEpIC8vIE5PIExPTkdFUiBTVVBQT1JURUQKICNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDIpCiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCAzKQogI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNCBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMywgNCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvZmluZ2VycHJpbnQuaCBiL2luY2x1ZGUvaGFyZHdhcmUvZmluZ2VycHJpbnQuaAppbmRleCBiNDQ2NWJhLi44NmNlZDliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2ZpbmdlcnByaW50LmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9maW5nZXJwcmludC5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIEZJTkdFUlBSSU5UX01PRFVMRV9BUElfVkVSU0lPTl8xXzAgSEFSRFdBUkVfTU9EVUxFX0FQSV9WRVJTSU9OKDEsIDApCiAjZGVmaW5lIEZJTkdFUlBSSU5UX01PRFVMRV9BUElfVkVSU0lPTl8yXzAgSEFSRFdBUkVfTU9EVUxFX0FQSV9WRVJTSU9OKDIsIDApCiAjZGVmaW5lIEZJTkdFUlBSSU5UX01PRFVMRV9BUElfVkVSU0lPTl8yXzEgSEFSRFdBUkVfTU9EVUxFX0FQSV9WRVJTSU9OKDIsIDEpCisjZGVmaW5lIEZJTkdFUlBSSU5UX01PRFVMRV9BUElfVkVSU0lPTl8zXzAgSEFSRFdBUkVfTU9EVUxFX0FQSV9WRVJTSU9OKDMsIDApCiAjZGVmaW5lIEZJTkdFUlBSSU5UX0hBUkRXQVJFX01PRFVMRV9JRCAiZmluZ2VycHJpbnQiCiAKIHR5cGVkZWYgZW51bSBmaW5nZXJwcmludF9tc2dfdHlwZSB7CkBAIC01MSw2ICs1Miw3IEBACiAgICAgRklOR0VSUFJJTlRfRVJST1JfTk9fU1BBQ0UgPSA0LCAvKiBObyBzcGFjZSBhdmFpbGFibGUgdG8gc3RvcmUgYSB0ZW1wbGF0ZSAqLwogICAgIEZJTkdFUlBSSU5UX0VSUk9SX0NBTkNFTEVEID0gNSwgLyogVGhlIGN1cnJlbnQgb3BlcmF0aW9uIGNhbid0IHByb2NlZWQuIFNlZSBhYm92ZS4gKi8KICAgICBGSU5HRVJQUklOVF9FUlJPUl9VTkFCTEVfVE9fUkVNT1ZFID0gNiwgLyogZmluZ2VycHJpbnQgd2l0aCBnaXZlbiBpZCBjYW4ndCBiZSByZW1vdmVkICovCisgICAgRklOR0VSUFJJTlRfRVJST1JfTE9DS09VVCA9IDcsIC8qIHRoZSBmaW5nZXJwcmludCBoYXJkd2FyZSBpcyBpbiBsb2Nrb3V0IGR1ZSB0byB0b28gbWFueSBhdHRlbXB0cyAqLwogICAgIEZJTkdFUlBSSU5UX0VSUk9SX1ZFTkRPUl9CQVNFID0gMTAwMCAvKiB2ZW5kb3Itc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgc3RhcnQgaGVyZSAqLwogfSBmaW5nZXJwcmludF9lcnJvcl90OwogCkBAIC02OSw2ICs3MSw4IEBACiAgICAgRklOR0VSUFJJTlRfQUNRVUlSRURfSU1BR0VSX0RJUlRZID0gMywgLyogc2Vuc29yIG5lZWRzIHRvIGJlIGNsZWFuZWQgKi8KICAgICBGSU5HRVJQUklOVF9BQ1FVSVJFRF9UT09fU0xPVyA9IDQsIC8qIG1vc3RseSBzd2lwZS10eXBlIHNlbnNvcnM7IG5vdCBlbm91Z2ggZGF0YSBjb2xsZWN0ZWQgKi8KICAgICBGSU5HRVJQUklOVF9BQ1FVSVJFRF9UT09fRkFTVCA9IDUsIC8qIGZvciBzd2lwZSBhbmQgYXJlYSBzZW5zb3JzOyB0ZWxsIHVzZXIgdG8gc2xvdyBkb3duKi8KKyAgICBGSU5HRVJQUklOVF9BQ1FVSVJFRF9ERVRFQ1RFRCA9IDYsIC8qIHdoZW4gdGhlIGZpbmdlciBpcyBmaXJzdCBkZXRlY3RlZC4gVXNlZCB0byBvcHRpbWl6ZSB3YWtldXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG91bGQgYmUgZm9sbG93ZWQgYnkgb25lIG9mIHRoZSBhYm92ZSBtZXNzYWdlcyAqLwogICAgIEZJTkdFUlBSSU5UX0FDUVVJUkVEX1ZFTkRPUl9CQVNFID0gMTAwMCAvKiB2ZW5kb3Itc3BlY2lmaWMgYWNxdWlzaXRpb24gbWVzc2FnZXMgc3RhcnQgaGVyZSAqLwogfSBmaW5nZXJwcmludF9hY3F1aXJlZF9pbmZvX3Q7CiAKQEAgLTg1LDE0ICs4OSwxMyBAQAogICAgIHVpbnQ2NF90IG1zZzsgLyogVmVuZG9yIHNwZWNpZmljIG1lc3NhZ2UuIFVzZWQgZm9yIHVzZXIgZ3VpZGFuY2UgKi8KIH0gZmluZ2VycHJpbnRfZW5yb2xsX3Q7CiAKLXR5cGVkZWYgc3RydWN0IGZpbmdlcnByaW50X2VudW1lcmF0ZWQgewordHlwZWRlZiBzdHJ1Y3QgZmluZ2VycHJpbnRfaXRlcmF0b3IgewogICAgIGZpbmdlcnByaW50X2Zpbmdlcl9pZF90IGZpbmdlcjsKICAgICB1aW50MzJfdCByZW1haW5pbmdfdGVtcGxhdGVzOwotfSBmaW5nZXJwcmludF9lbnVtZXJhdGVkX3Q7Cit9IGZpbmdlcnByaW50X2l0ZXJhdG9yX3Q7CiAKLXR5cGVkZWYgc3RydWN0IGZpbmdlcnByaW50X3JlbW92ZWQgewotICAgIGZpbmdlcnByaW50X2Zpbmdlcl9pZF90IGZpbmdlcjsKLX0gZmluZ2VycHJpbnRfcmVtb3ZlZF90OwordHlwZWRlZiBmaW5nZXJwcmludF9pdGVyYXRvcl90IGZpbmdlcnByaW50X2VudW1lcmF0ZWRfdDsKK3R5cGVkZWYgZmluZ2VycHJpbnRfaXRlcmF0b3JfdCBmaW5nZXJwcmludF9yZW1vdmVkX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGZpbmdlcnByaW50X2FjcXVpcmVkIHsKICAgICBmaW5nZXJwcmludF9hY3F1aXJlZF9pbmZvX3QgYWNxdWlyZWRfaW5mbzsgLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlICovCkBAIC0yMDcsMTIgKzIxMCwxMyBAQAogICAgIC8qCiAgICAgICogRW51bWVyYXRlIGFsbCB0aGUgZmluZ2VycHJpbnQgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSBkaXJlY3Rvcnkgc2V0IGJ5CiAgICAgICogc2V0X2FjdGl2ZV9ncm91cCgpCi0gICAgICogRm9yIGVhY2ggdGVtcGxhdGUgZm91bmQgbm90aWZ5KCkgd2lsbCBiZSBjYWxsZWQgd2l0aDoKKyAgICAgKiBGb3IgZWFjaCB0ZW1wbGF0ZSBmb3VuZCBhIG5vdGlmeSgpIHdpbGwgYmUgY2FsbGVkIHdpdGg6CiAgICAgICogZmluZ2VycHJpbnRfbXNnLnR5cGUgPT0gRklOR0VSUFJJTlRfVEVNUExBVEVfRU5VTUVSQVRFRAogICAgICAqIGZpbmdlcnByaW50X21zZy5kYXRhLmVudW1lcmF0ZWQuZmluZ2VyIGluZGljYXRpbmcgYSB0ZW1wbGF0ZSBpZAogICAgICAqIGZpbmdlcnByaW50X21zZy5kYXRhLmVudW1lcmF0ZWQucmVtYWluaW5nX3RlbXBsYXRlcyBpbmRpY2F0aW5nIGhvdyBtYW55IG1vcmUKICAgICAgKiBlbnVtZXJhdGlvbiBtZXNzYWdlcyB0byBleHBlY3QuCi0gICAgICoKKyAgICAgKiBOb3RlOiBJZiB0aGVyZSBhcmUgbm8gZmluZ2VycHJpbnRzLCB0aGVuIHRoaXMgc2hvdWxkIHJldHVybiAwIGFuZCB0aGUgZmlyc3QgZmluZ2VycHJpbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZWQgc2hvdWxkIGhhdmUgZmluZ2VyaWQ9MCBhbmQgcmVtYWluaW5nPTAKICAgICAgKiBGdW5jdGlvbiByZXR1cm46IDAgaWYgZW51bWVyYXRlIHJlcXVlc3QgaXMgYWNjZXB0ZWQKICAgICAgKiAgICAgICAgICAgICAgICAgIG9yIGEgbmVnYXRpdmUgbnVtYmVyIGluIGNhc2Ugb2YgZXJyb3IsIGdlbmVyYWxseSBmcm9tIHRoZSBlcnJuby5oIHNldC4KICAgICAgKi8KQEAgLTIyMiw5ICsyMjYsMTQgQEAKICAgICAgKiBGaW5nZXJwcmludCByZW1vdmUgcmVxdWVzdDoKICAgICAgKiBEZWxldGVzIGEgZmluZ2VycHJpbnQgdGVtcGxhdGUuCiAgICAgICogV29ya3Mgb25seSB3aXRoaW4gdGhlIHBhdGggc2V0IGJ5IHNldF9hY3RpdmVfZ3JvdXAoKS4KLSAgICAgKiBub3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB3aXRoIGRldGFpbHMgb24gdGhlIHRlbXBsYXRlIGRlbGV0ZWQuCi0gICAgICogZmluZ2VycHJpbnRfbXNnLnR5cGUgPT0gRklOR0VSUFJJTlRfVEVNUExBVEVfUkVNT1ZFRCBhbmQKLSAgICAgKiBmaW5nZXJwcmludF9tc2cuZGF0YS5yZW1vdmVkLmZpbmdlciBpbmRpY2F0aW5nIHRoZSB0ZW1wbGF0ZSBpZCByZW1vdmVkLgorICAgICAqIFRoZSBmaWQgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIGFzIGEgd2lkY2FyZDoKKyAgICAgKiAgICogZmlkID09IDAgLS0gZGVsZXRlIGFsbCB0aGUgdGVtcGxhdGVzIGluIHRoZSBncm91cC4KKyAgICAgKiAgICogZmlkICE9IDAgLS0gZGVsZXRlIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUgZnJvbSB0aGUgZ3JvdXAuCisgICAgICogRm9yIGVhY2ggdGVtcGxhdGUgZm91bmQgYSBub3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB3aXRoOgorICAgICAqIGZpbmdlcnByaW50X21zZy50eXBlID09IEZJTkdFUlBSSU5UX1RFTVBMQVRFX1JFTU9WRUQKKyAgICAgKiBmaW5nZXJwcmludF9tc2cuZGF0YS5yZW1vdmVkLmZpbmdlciBpbmRpY2F0aW5nIGEgdGVtcGxhdGUgaWQgZGVsZXRlZAorICAgICAqIGZpbmdlcnByaW50X21zZy5kYXRhLnJlbW92ZWQucmVtYWluaW5nX3RlbXBsYXRlcyBpbmRpY2F0aW5nIGhvdyBtYW55IG1vcmUKKyAgICAgKiB0ZW1wbGF0ZXMgd2lsbCBiZSBkZWxldGVkIGJ5IHRoaXMgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogRnVuY3Rpb24gcmV0dXJuOiAwIGlmIGZpbmdlcnByaW50IHRlbXBsYXRlKHMpIGNhbiBiZSBzdWNjZXNzZnVsbHkgZGVsZXRlZAogICAgICAqICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSBudW1iZXIgaW4gY2FzZSBvZiBlcnJvciwgZ2VuZXJhbGx5IGZyb20gdGhlIGVycm5vLmggc2V0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9mdXNlZF9sb2NhdGlvbi5oIGIvaW5jbHVkZS9oYXJkd2FyZS9mdXNlZF9sb2NhdGlvbi5oCmluZGV4IDczMzYwYTEuLjU1MGUxOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvZnVzZWRfbG9jYXRpb24uaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2Z1c2VkX2xvY2F0aW9uLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAKKyNpbmNsdWRlICJnbnNzLWJhc2UuaCIKIAogLyoqCiAgKiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBvZiB0aGUgRnVzZWQgTG9jYXRpb24gUHJvdmlkZXIuCkBAIC0xMDMsMTYgKzEwNCw2IEBACiAjZGVmaW5lIEZMUF9TVEFUVVNfTE9DQVRJT05fVU5BVkFJTEFCTEUgICAgICAgMQogCiAvKioKLSAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCB3aXRoIHRoZSBiYXRjaGVkIGxvY2F0aW9ucwotICogQVBJcy4gQmF0Y2hpbmcgaXMgbWFuZGF0b3J5IHdoZW4gRkxQIGltcGxlbWVudGF0aW9uCi0gKiBpcyBzdXBwb3J0ZWQuIElmIHRoZSBmbGFnIGlzIHNldCwgdGhlIGhhcmR3YXJlIGltcGxlbWVudGF0aW9uCi0gKiB3aWxsIHdha2UgdXAgdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3NvciB3aGVuIHRoZSBGSUZPIGlzIGZ1bGwsCi0gKiBJZiB0aGUgZmxhZyBpcyBub3Qgc2V0LCB0aGUgaGFyZHdhcmUgaW1wbGVtZW50YXRpb24gd2lsbCBkcm9wCi0gKiB0aGUgb2xkZXN0IGRhdGEgd2hlbiB0aGUgRklGTyBpcyBmdWxsLgotICovCi0jZGVmaW5lIEZMUF9CQVRDSF9XQUtFVVBfT05fRklGT19GVUxMICAgICAgICAweDAwMDAwMDEKLQotLyoqCiAgKiBXaGlsZSBiYXRjaGluZywgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBub3QgY2FsbCB0aGUKICAqIGZscF9sb2NhdGlvbl9jYWxsYmFjayBvbiBldmVyeSBsb2NhdGlvbiBmaXguIEhvd2V2ZXIsCiAgKiBzb21ldGltZXMgaW4gaGlnaCBwb3dlciBtb2RlLCB0aGUgc3lzdGVtIG1pZ2h0IG5lZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvZ25zcy1iYXNlLmggYi9pbmNsdWRlL2hhcmR3YXJlL2duc3MtYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjAyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2duc3MtYmFzZS5oCkBAIC0wLDAgKzEsMjc1IEBACisvLyBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBieSBoaWRsLWdlbi4gRG8gbm90IGVkaXQgbWFudWFsbHkuCisvLyBTb3VyY2U6IGFuZHJvaWQuaGFyZHdhcmUuZ25zc0AxLjAKKy8vIFJvb3Q6IGFuZHJvaWQuaGFyZHdhcmU6aGFyZHdhcmUvaW50ZXJmYWNlcworCisjaWZuZGVmIEhJRExfR0VORVJBVEVEX0FORFJPSURfSEFSRFdBUkVfR05TU19WMV8wX0VYUE9SVEVEX0NPTlNUQU5UU19IXworI2RlZmluZSBISURMX0dFTkVSQVRFRF9BTkRST0lEX0hBUkRXQVJFX0dOU1NfVjFfMF9FWFBPUlRFRF9DT05TVEFOVFNfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitlbnVtIHsKKyAgICBHTlNTX01BWF9TVlNfQ09VTlQgPSA2NHUsIC8vIDY0Cit9OworCitlbnVtIHsKKyAgICBHTlNTX0NPTlNURUxMQVRJT05fVU5LTk9XTiA9IDAsCisgICAgR05TU19DT05TVEVMTEFUSU9OX0dQUyA9IDEsCisgICAgR05TU19DT05TVEVMTEFUSU9OX1NCQVMgPSAyLAorICAgIEdOU1NfQ09OU1RFTExBVElPTl9HTE9OQVNTID0gMywKKyAgICBHTlNTX0NPTlNURUxMQVRJT05fUVpTUyA9IDQsCisgICAgR05TU19DT05TVEVMTEFUSU9OX0JFSURPVSA9IDUsCisgICAgR05TU19DT05TVEVMTEFUSU9OX0dBTElMRU8gPSA2LAorfTsKKworZW51bSB7CisgICAgR1BTX0xPQ0FUSU9OX0hBU19MQVRfTE9ORyA9IDEsIC8vIDB4MDAwMQorICAgIEdQU19MT0NBVElPTl9IQVNfQUxUSVRVREUgPSAyLCAvLyAweDAwMDIKKyAgICBHUFNfTE9DQVRJT05fSEFTX1NQRUVEID0gNCwgLy8gMHgwMDA0CisgICAgR1BTX0xPQ0FUSU9OX0hBU19CRUFSSU5HID0gOCwgLy8gMHgwMDA4CisgICAgR1BTX0xPQ0FUSU9OX0hBU19IT1JJWk9OVEFMX0FDQ1VSQUNZID0gMTYsIC8vIDB4MDAxMAorICAgIEdQU19MT0NBVElPTl9IQVNfVkVSVElDQUxfQUNDVVJBQ1kgPSAzMiwgLy8gMHgwMDIwCisgICAgR1BTX0xPQ0FUSU9OX0hBU19TUEVFRF9BQ0NVUkFDWSA9IDY0LCAvLyAweDAwNDAKKyAgICBHUFNfTE9DQVRJT05fSEFTX0JFQVJJTkdfQUNDVVJBQ1kgPSAxMjgsIC8vIDB4MDA4MAorfTsKKworZW51bSB7CisgICAgQVBOX0lQX0lOVkFMSUQgPSAwLAorICAgIEFQTl9JUF9JUFY0ID0gMSwKKyAgICBBUE5fSVBfSVBWNiA9IDIsCisgICAgQVBOX0lQX0lQVjRWNiA9IDMsCit9OworCitlbnVtIHsKKyAgICBBR1BTX1RZUEVfU1VQTCA9IDEsCisgICAgQUdQU19UWVBFX0MySyA9IDIsCit9OworCitlbnVtIHsKKyAgICBHTlNTX1JFUVVFU1RfQUdOU1NfREFUQV9DT05OID0gMSwKKyAgICBHTlNTX1JFTEVBU0VfQUdOU1NfREFUQV9DT05OID0gMiwKKyAgICBHTlNTX0FHTlNTX0RBVEFfQ09OTkVDVEVEID0gMywKKyAgICBHTlNTX0FHTlNTX0RBVEFfQ09OTl9ET05FID0gNCwKKyAgICBHTlNTX0FHTlNTX0RBVEFfQ09OTl9GQUlMRUQgPSA1LAorfTsKKworZW51bSB7CisgICAgQUdQU19TRVRJRF9UWVBFX05PTkUgPSAwLAorICAgIEFHUFNfU0VUSURfVFlQRV9JTVNJID0gMSwKKyAgICBBR1BTX1NFVElEX1RZUEVfTVNJU0RNID0gMiwKK307CisKK2VudW0geworICAgIEFHUFNfUklMX05FVFdPUktfVFlQRV9NT0JJTEUgPSAwLAorICAgIEFHUFNfUklMX05FVFdPUktfVFlQRV9XSUZJID0gMSwKKyAgICBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfTU1TID0gMiwKKyAgICBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfU1VQTCA9IDMsCisgICAgQUdQU19SSUxfTkVUV09SS19UWVBFX0RVTiA9IDQsCisgICAgQUdQU19SSUxfTkVUV09SS19UWVBFX0hJUFJJID0gNSwKKyAgICBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfV0lNQVggPSA2LAorfTsKKworZW51bSB7CisgICAgQUdQU19SRUZfTE9DQVRJT05fVFlQRV9HU01fQ0VMTElEID0gMSwKKyAgICBBR1BTX1JFRl9MT0NBVElPTl9UWVBFX1VNVFNfQ0VMTElEID0gMiwKKyAgICBBR1BTX1JFRl9MT0NBVElPTl9UWVBFX0xURV9DRUxMSUQgPSA0LAorfTsKKworZW51bSB7CisgICAgQUdQU19SSUxfUkVRVUVTVF9TRVRJRF9JTVNJID0gMXUsIC8vICgxIDw8IDBMKQorICAgIEFHUFNfUklMX1JFUVVFU1RfU0VUSURfTVNJU0ROID0gMnUsIC8vICgxIDw8IDFMKQorfTsKKworZW51bSB7CisgICAgR1BTX1BPU0lUSU9OX01PREVfU1RBTkRBTE9ORSA9IDAsCisgICAgR1BTX1BPU0lUSU9OX01PREVfTVNfQkFTRUQgPSAxLAorICAgIEdQU19QT1NJVElPTl9NT0RFX01TX0FTU0lTVEVEID0gMiwKK307CisKK2VudW0geworICAgIEdQU19QT1NJVElPTl9SRUNVUlJFTkNFX1BFUklPRElDID0gMHUsIC8vIDAKKyAgICBHUFNfUE9TSVRJT05fUkVDVVJSRU5DRV9TSU5HTEUgPSAxdSwgLy8gMQorfTsKKworZW51bSB7CisgICAgR1BTX0RFTEVURV9FUEhFTUVSSVMgPSAxLCAvLyAweDAwMDEKKyAgICBHUFNfREVMRVRFX0FMTUFOQUMgPSAyLCAvLyAweDAwMDIKKyAgICBHUFNfREVMRVRFX1BPU0lUSU9OID0gNCwgLy8gMHgwMDA0CisgICAgR1BTX0RFTEVURV9USU1FID0gOCwgLy8gMHgwMDA4CisgICAgR1BTX0RFTEVURV9JT05PID0gMTYsIC8vIDB4MDAxMAorICAgIEdQU19ERUxFVEVfVVRDID0gMzIsIC8vIDB4MDAyMAorICAgIEdQU19ERUxFVEVfSEVBTFRIID0gNjQsIC8vIDB4MDA0MAorICAgIEdQU19ERUxFVEVfU1ZESVIgPSAxMjgsIC8vIDB4MDA4MAorICAgIEdQU19ERUxFVEVfU1ZTVEVFUiA9IDI1NiwgLy8gMHgwMTAwCisgICAgR1BTX0RFTEVURV9TQURBVEEgPSA1MTIsIC8vIDB4MDIwMAorICAgIEdQU19ERUxFVEVfUlRJID0gMTAyNCwgLy8gMHgwNDAwCisgICAgR1BTX0RFTEVURV9DRUxMREJfSU5GTyA9IDMyNzY4LCAvLyAweDgwMDAKKyAgICBHUFNfREVMRVRFX0FMTCA9IDY1NTM1LCAvLyAweEZGRkYKK307CisKK2VudW0geworICAgIEZMUF9CQVRDSF9XQUtFVVBfT05fRklGT19GVUxMID0gMSwgLy8gMHgwMQorfTsKKworZW51bSB7CisgICAgR1BTX0NBUEFCSUxJVFlfU0NIRURVTElORyA9IDF1LCAvLyAoMSA8PCAwKQorICAgIEdQU19DQVBBQklMSVRZX01TQiA9IDJ1LCAvLyAoMSA8PCAxKQorICAgIEdQU19DQVBBQklMSVRZX01TQSA9IDR1LCAvLyAoMSA8PCAyKQorICAgIEdQU19DQVBBQklMSVRZX1NJTkdMRV9TSE9UID0gOHUsIC8vICgxIDw8IDMpCisgICAgR1BTX0NBUEFCSUxJVFlfT05fREVNQU5EX1RJTUUgPSAxNnUsIC8vICgxIDw8IDQpCisgICAgR1BTX0NBUEFCSUxJVFlfR0VPRkVOQ0lORyA9IDMydSwgLy8gKDEgPDwgNSkKKyAgICBHUFNfQ0FQQUJJTElUWV9NRUFTVVJFTUVOVFMgPSA2NHUsIC8vICgxIDw8IDYpCisgICAgR1BTX0NBUEFCSUxJVFlfTkFWX01FU1NBR0VTID0gMTI4dSwgLy8gKDEgPDwgNykKK307CisKK2VudW0geworICAgIEdQU19TVEFUVVNfTk9ORSA9IDAsCisgICAgR1BTX1NUQVRVU19TRVNTSU9OX0JFR0lOID0gMSwKKyAgICBHUFNfU1RBVFVTX1NFU1NJT05fRU5EID0gMiwKKyAgICBHUFNfU1RBVFVTX0VOR0lORV9PTiA9IDMsCisgICAgR1BTX1NUQVRVU19FTkdJTkVfT0ZGID0gNCwKK307CisKK2VudW0geworICAgIEdOU1NfU1ZfRkxBR1NfTk9ORSA9IDAsCisgICAgR05TU19TVl9GTEFHU19IQVNfRVBIRU1FUklTX0RBVEEgPSAxLCAvLyAoMSA8PCAwKQorICAgIEdOU1NfU1ZfRkxBR1NfSEFTX0FMTUFOQUNfREFUQSA9IDIsIC8vICgxIDw8IDEpCisgICAgR05TU19TVl9GTEFHU19VU0VEX0lOX0ZJWCA9IDQsIC8vICgxIDw8IDIpCisgICAgR05TU19TVl9GTEFHU19IQVNfQ0FSUklFUl9GUkVRVUVOQ1kgPSA4LCAvLyAoMSA8PCAzKQorfTsKKworZW51bSB7CisgICAgR1BTX0dFT0ZFTkNFX0VOVEVSRUQgPSAxLCAvLyAoMSA8PCAwTCkKKyAgICBHUFNfR0VPRkVOQ0VfRVhJVEVEID0gMiwgLy8gKDEgPDwgMUwpCisgICAgR1BTX0dFT0ZFTkNFX1VOQ0VSVEFJTiA9IDQsIC8vICgxIDw8IDJMKQorfTsKKworZW51bSB7CisgICAgR1BTX0dFT0ZFTkNFX1VOQVZBSUxBQkxFID0gMSwgLy8gKDEgPDwgMEwpCisgICAgR1BTX0dFT0ZFTkNFX0FWQUlMQUJMRSA9IDIsIC8vICgxIDw8IDFMKQorfTsKKworZW51bSB7CisgICAgR1BTX0dFT0ZFTkNFX09QRVJBVElPTl9TVUNDRVNTID0gMCwKKyAgICBHUFNfR0VPRkVOQ0VfRVJST1JfVE9PX01BTllfR0VPRkVOQ0VTID0gLTEwMCwgLy8gKC0xMDApCisgICAgR1BTX0dFT0ZFTkNFX0VSUk9SX0lEX0VYSVNUUyA9IC0xMDEsIC8vICgtMTAxKQorICAgIEdQU19HRU9GRU5DRV9FUlJPUl9JRF9VTktOT1dOID0gLTEwMiwgLy8gKC0xMDIpCisgICAgR1BTX0dFT0ZFTkNFX0VSUk9SX0lOVkFMSURfVFJBTlNJVElPTiA9IC0xMDMsIC8vICgtMTAzKQorICAgIEdQU19HRU9GRU5DRV9FUlJPUl9HRU5FUklDID0gLTE0OSwgLy8gKC0xNDkpCit9OworCitlbnVtIHsKKyAgICBHUFNfTUVBU1VSRU1FTlRfU1VDQ0VTUyA9IDAsCisgICAgR1BTX01FQVNVUkVNRU5UX0VSUk9SX0FMUkVBRFlfSU5JVCA9IC0xMDAsIC8vICgtMTAwKQorICAgIEdQU19NRUFTVVJFTUVOVF9FUlJPUl9HRU5FUklDID0gLTEwMSwgLy8gKC0xMDEpCit9OworCitlbnVtIHsKKyAgICBHTlNTX0NMT0NLX0hBU19MRUFQX1NFQ09ORCA9IDEsIC8vICgxIDw8IDApCisgICAgR05TU19DTE9DS19IQVNfVElNRV9VTkNFUlRBSU5UWSA9IDIsIC8vICgxIDw8IDEpCisgICAgR05TU19DTE9DS19IQVNfRlVMTF9CSUFTID0gNCwgLy8gKDEgPDwgMikKKyAgICBHTlNTX0NMT0NLX0hBU19CSUFTID0gOCwgLy8gKDEgPDwgMykKKyAgICBHTlNTX0NMT0NLX0hBU19CSUFTX1VOQ0VSVEFJTlRZID0gMTYsIC8vICgxIDw8IDQpCisgICAgR05TU19DTE9DS19IQVNfRFJJRlQgPSAzMiwgLy8gKDEgPDwgNSkKKyAgICBHTlNTX0NMT0NLX0hBU19EUklGVF9VTkNFUlRBSU5UWSA9IDY0LCAvLyAoMSA8PCA2KQorfTsKKworZW51bSB7CisgICAgR05TU19NRUFTVVJFTUVOVF9IQVNfU05SID0gMXUsIC8vICgxIDw8IDApCisgICAgR05TU19NRUFTVVJFTUVOVF9IQVNfQ0FSUklFUl9GUkVRVUVOQ1kgPSA1MTJ1LCAvLyAoMSA8PCA5KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfSEFTX0NBUlJJRVJfQ1lDTEVTID0gMTAyNHUsIC8vICgxIDw8IDEwKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfSEFTX0NBUlJJRVJfUEhBU0UgPSAyMDQ4dSwgLy8gKDEgPDwgMTEpCisgICAgR05TU19NRUFTVVJFTUVOVF9IQVNfQ0FSUklFUl9QSEFTRV9VTkNFUlRBSU5UWSA9IDQwOTZ1LCAvLyAoMSA8PCAxMikKKyAgICBHTlNTX01FQVNVUkVNRU5UX0hBU19BVVRPTUFUSUNfR0FJTl9DT05UUk9MID0gODE5MnUsIC8vICgxIDw8IDEzKQorfTsKKworZW51bSB7CisgICAgR05TU19NVUxUSVBBVEhfSU5ESUNBVE9SX1VOS05PV04gPSAwLAorICAgIEdOU1NfTVVMVElQQVRIX0lORElDQVRPUl9QUkVTRU5UID0gMSwKKyAgICBHTlNTX01VTFRJUEFUSF9JTkRJQ0FUSU9SX05PVF9QUkVTRU5UID0gMiwKK307CisKK2VudW0geworICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfVU5LTk9XTiA9IDB1LCAvLyAwCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9DT0RFX0xPQ0sgPSAxdSwgLy8gKDEgPDwgMCkKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0JJVF9TWU5DID0gMnUsIC8vICgxIDw8IDEpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9TVUJGUkFNRV9TWU5DID0gNHUsIC8vICgxIDw8IDIpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9UT1dfREVDT0RFRCA9IDh1LCAvLyAoMSA8PCAzKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfTVNFQ19BTUJJR1VPVVMgPSAxNnUsIC8vICgxIDw8IDQpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9TWU1CT0xfU1lOQyA9IDMydSwgLy8gKDEgPDwgNSkKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dMT19TVFJJTkdfU1lOQyA9IDY0dSwgLy8gKDEgPDwgNikKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dMT19UT0RfREVDT0RFRCA9IDEyOHUsIC8vICgxIDw8IDcpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9CRFNfRDJfQklUX1NZTkMgPSAyNTZ1LCAvLyAoMSA8PCA4KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfQkRTX0QyX1NVQkZSQU1FX1NZTkMgPSA1MTJ1LCAvLyAoMSA8PCA5KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0FMX0UxQkNfQ09ERV9MT0NLID0gMTAyNHUsIC8vICgxIDw8IDEwKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0FMX0UxQ18yTkRfQ09ERV9MT0NLID0gMjA0OHUsIC8vICgxIDw8IDExKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0FMX0UxQl9QQUdFX1NZTkMgPSA0MDk2dSwgLy8gKDEgPDwgMTIpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9TQkFTX1NZTkMgPSA4MTkydSwgLy8gKDEgPDwgMTMpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9UT1dfS05PV04gPSAxNjM4NHUsIC8vICgxIDw8IDE0KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0xPX1RPRF9LTk9XTiA9IDMyNzY4dSwgLy8gKDEgPDwgMTUpCit9OworCitlbnVtIHsKKyAgICBHTlNTX0FEUl9TVEFURV9VTktOT1dOID0gMCwKKyAgICBHTlNTX0FEUl9TVEFURV9WQUxJRCA9IDEsIC8vICgxIDw8IDApCisgICAgR05TU19BRFJfU1RBVEVfUkVTRVQgPSAyLCAvLyAoMSA8PCAxKQorICAgIEdOU1NfQURSX1NUQVRFX0NZQ0xFX1NMSVAgPSA0LCAvLyAoMSA8PCAyKQorfTsKKworZW51bSB7CisgICAgR1BTX05BVklHQVRJT05fTUVTU0FHRV9TVUNDRVNTID0gMCwKKyAgICBHUFNfTkFWSUdBVElPTl9NRVNTQUdFX0VSUk9SX0FMUkVBRFlfSU5JVCA9IC0xMDAsIC8vICgtMTAwKQorICAgIEdQU19OQVZJR0FUSU9OX01FU1NBR0VfRVJST1JfR0VORVJJQyA9IC0xMDEsIC8vICgtMTAxKQorfTsKKworZW51bSB7CisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9VTktOT1dOID0gMCwKKyAgICBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dOU1NfTDFDQSA9IDI1NywgLy8gMHgwMTAxCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0wyQ05BViA9IDI1OCwgLy8gMHgwMTAyCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0w1Q05BViA9IDI1OSwgLy8gMHgwMTAzCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0NOQVYyID0gMjYwLCAvLyAweDAxMDQKKyAgICBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dMT19MMUNBID0gNzY5LCAvLyAweDAzMDEKKyAgICBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0JEU19EMSA9IDEyODEsIC8vIDB4MDUwMQorICAgIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfQkRTX0QyID0gMTI4MiwgLy8gMHgwNTAyCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HQUxfSSA9IDE1MzcsIC8vIDB4MDYwMQorICAgIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR0FMX0YgPSAxNTM4LCAvLyAweDA2MDIKK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgTkFWX01FU1NBR0VfU1RBVFVTX1BBUklUWV9QQVNTRUQgPSAxLCAvLyAoMSA8PCAwKQorICAgIE5BVl9NRVNTQUdFX1NUQVRVU19QQVJJVFlfUkVCVUlMVCA9IDIsIC8vICgxIDw8IDEpCisgICAgTkFWX01FU1NBR0VfU1RBVFVTX1VOS05PV04gPSAwLAorfSBuYXZpZ2F0aW9uX21lc3NhZ2Vfc3RhdHVzOworCitlbnVtIHsKKyAgICBHUFNfTklfVFlQRV9WT0lDRSA9IDEsCisgICAgR1BTX05JX1RZUEVfVU1UU19TVVBMID0gMiwKKyAgICBHUFNfTklfVFlQRV9VTVRTX0NUUkxfUExBTkUgPSAzLAorfTsKKworZW51bSB7CisgICAgR1BTX05JX05FRURfTk9USUZZID0gMXUsIC8vIDB4MDAwMQorICAgIEdQU19OSV9ORUVEX1ZFUklGWSA9IDJ1LCAvLyAweDAwMDIKKyAgICBHUFNfTklfUFJJVkFDWV9PVkVSUklERSA9IDR1LCAvLyAweDAwMDQKK307CisKK2VudW0geworICAgIEdQU19OSV9SRVNQT05TRV9BQ0NFUFQgPSAxLAorICAgIEdQU19OSV9SRVNQT05TRV9ERU5ZID0gMiwKKyAgICBHUFNfTklfUkVTUE9OU0VfTk9SRVNQID0gMywKK307CisKK2VudW0geworICAgIEdQU19FTkNfTk9ORSA9IDAsCisgICAgR1BTX0VOQ19TVVBMX0dTTV9ERUZBVUxUID0gMSwKKyAgICBHUFNfRU5DX1NVUExfVVRGOCA9IDIsCisgICAgR1BTX0VOQ19TVVBMX1VDUzIgPSAzLAorICAgIEdQU19FTkNfVU5LTk9XTiA9IC0xLCAvLyAoLTEpCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIEhJRExfR0VORVJBVEVEX0FORFJPSURfSEFSRFdBUkVfR05TU19WMV8wX0VYUE9SVEVEX0NPTlNUQU5UU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9ncHMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvZ3BzLmgKaW5kZXggYWNmNjAxYi4uNGUxMDhiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9ncHMuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2dwcy5oCkBAIC0yNiw4ICsyNiw0MiBAQAogCiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KIAorI2luY2x1ZGUgImduc3MtYmFzZS5oIgorCiBfX0JFR0lOX0RFQ0xTCiAKKy8qCisgKiBFbnVtcyBkZWZpbmVkIGluIEhJREwgaW4gaGFyZHdhcmUvaW50ZXJmYWNlcyBhcmUgYXV0by1nZW5lcmF0ZWQgYW5kIHByZXNlbnQKKyAqIGluIGduc3MtYmFzZS5oLgorICovCisKKy8qIGZvciBjb21wYXRpYmlsaXR5ICovCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBTVnMgZm9yIGdwc19zdl9zdGF0dXNfY2FsbGJhY2soKS4gKi8KKyNkZWZpbmUgR05TU19NQVhfU1ZTIEdOU1NfTUFYX1NWU19DT1VOVAorLyoqIE1heGltdW0gbnVtYmVyIG9mIE1lYXN1cmVtZW50cyBpbiBnbnNzX21lYXN1cmVtZW50X2NhbGxiYWNrKCkuICovCisjZGVmaW5lIEdOU1NfTUFYX01FQVNVUkVNRU5UIEdOU1NfTUFYX1NWU19DT1VOVAorCisjZGVmaW5lIEdQU19SRVFVRVNUX0FHUFNfREFUQV9DT05OIEdOU1NfUkVRVUVTVF9BR05TU19EQVRBX0NPTk4KKyNkZWZpbmUgR1BTX1JFTEVBU0VfQUdQU19EQVRBX0NPTk4gR05TU19SRUxFQVNFX0FHTlNTX0RBVEFfQ09OTgorI2RlZmluZSBHUFNfQUdQU19EQVRBX0NPTk5FQ1RFRCBHTlNTX0FHTlNTX0RBVEFfQ09OTkVDVEVECisjZGVmaW5lIEdQU19BR1BTX0RBVEFfQ09OTl9ET05FIEdOU1NfQUdOU1NfREFUQV9DT05OX0RPTkUKKyNkZWZpbmUgR1BTX0FHUFNfREFUQV9DT05OX0ZBSUxFRCBHTlNTX0FHTlNTX0RBVEFfQ09OTl9GQUlMRUQKKyNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UWVBFX01PQklMRV9NTVMgQUdQU19SSUxfTkVUV09SS19UWVBFX01NUworI2RlZmluZSBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfTU9CSUxFX1NVUEwgQUdQU19SSUxfTkVUV09SS19UWVBFX1NVUEwKKyNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UVFlQRV9NT0JJTEVfRFVOIEFHUFNfUklMX05FVFdPUktfVFlQRV9EVU4KKyNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UVFlQRV9NT0JJTEVfSElQUkkgQUdQU19SSUxfTkVUV09SS19UWVBFX0hJUFJJCisjZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFRZUEVfV0lNQVggQUdQU19SSUxfTkVUV09SS19UWVBFX1dJTUFYCisjZGVmaW5lIEdOU1NfTVVMVElQQVRIX0lORElDQVRPUl9OT1RfUFJFU0VOVCBHTlNTX01VTFRJUEFUSF9JTkRJQ0FUSU9SX05PVF9QUkVTRU5UCisjZGVmaW5lIEFHUFNfU0VUSURfVFlQRV9NU0lTRE4gQUdQU19TRVRJRF9UWVBFX01TSVNETQorI2RlZmluZSBHUFNfTUVBU1VSRU1FTlRfT1BFUkFUSU9OX1NVQ0NFU1MgR1BTX01FQVNVUkVNRU5UX1NVQ0NFU1MKKyNkZWZpbmUgR1BTX05BVklHQVRJT05fTUVTU0FHRV9PUEVSQVRJT05fU1VDQ0VTUyBHUFNfTkFWSUdBVElPTl9NRVNTQUdFX1NVQ0NFU1MKKyNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HUFNfTDFDQSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dOU1NfTDFDQQorI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19MMkNOQVYgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0wyQ05BVgorI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19MNUNOQVYgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0w1Q05BVgorI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19DTkFWMiBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dOU1NfQ05BVjIKKyNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19BQ0NVUkFDWSBHUFNfTE9DQVRJT05fSEFTX0hPUklaT05UQUxfQUNDVVJBQ1kKKwogLyoqCiAgKiBUaGUgaWQgb2YgdGhpcyBtb2R1bGUKICAqLwpAQCAtMzksMTI3ICs3MywzNCBAQAogCiAvKiogTWF4aW11bSBudW1iZXIgb2YgU1ZzIGZvciBncHNfc3Zfc3RhdHVzX2NhbGxiYWNrKCkuICovCiAjZGVmaW5lIEdQU19NQVhfU1ZTIDMyCi0vKiogTWF4aW11bSBudW1iZXIgb2YgU1ZzIGZvciBncHNfc3Zfc3RhdHVzX2NhbGxiYWNrKCkuICovCi0jZGVmaW5lIEdOU1NfTUFYX1NWUyA2NAogCiAvKiogTWF4aW11bSBudW1iZXIgb2YgTWVhc3VyZW1lbnRzIGluIGdwc19tZWFzdXJlbWVudF9jYWxsYmFjaygpLiAqLwogI2RlZmluZSBHUFNfTUFYX01FQVNVUkVNRU5UICAgMzIKIAotLyoqIE1heGltdW0gbnVtYmVyIG9mIE1lYXN1cmVtZW50cyBpbiBnbnNzX21lYXN1cmVtZW50X2NhbGxiYWNrKCkuICovCi0jZGVmaW5lIEdOU1NfTUFYX01FQVNVUkVNRU5UICAgNjQKLQogLyoqIFJlcXVlc3RlZCBvcGVyYXRpb25hbCBtb2RlIGZvciBHUFMgb3BlcmF0aW9uLiAqLwogdHlwZWRlZiB1aW50MzJfdCBHcHNQb3NpdGlvbk1vZGU7Ci0vKiBJTVBPUlRBTlQ6IE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBtdXN0IG1hdGNoCi0gKiBjb25zdGFudHMgaW4gR3BzTG9jYXRpb25Qcm92aWRlci5qYXZhLiAqLwotLyoqIE1vZGUgZm9yIHJ1bm5pbmcgR1BTIHN0YW5kYWxvbmUgKG5vIGFzc2lzdGFuY2UpLiAqLwotI2RlZmluZSBHUFNfUE9TSVRJT05fTU9ERV9TVEFOREFMT05FICAgIDAKLS8qKiBBR1BTIE1TLUJhc2VkIG1vZGUuICovCi0jZGVmaW5lIEdQU19QT1NJVElPTl9NT0RFX01TX0JBU0VEICAgICAgMQotLyoqCi0gKiBBR1BTIE1TLUFzc2lzdGVkIG1vZGUuIFRoaXMgbW9kZSBpcyBub3QgbWFpbnRhaW5lZCBieSB0aGUgcGxhdGZvcm0gYW55bW9yZS4KLSAqIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHVzZSBHUFNfUE9TSVRJT05fTU9ERV9NU19CQVNFRCBpbnN0ZWFkLgotICovCi0jZGVmaW5lIEdQU19QT1NJVElPTl9NT0RFX01TX0FTU0lTVEVEICAgMgogCiAvKiogUmVxdWVzdGVkIHJlY3VycmVuY2UgbW9kZSBmb3IgR1BTIG9wZXJhdGlvbi4gKi8KIHR5cGVkZWYgdWludDMyX3QgR3BzUG9zaXRpb25SZWN1cnJlbmNlOwotLyogSU1QT1JUQU5UOiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBtYXRjaAotICogY29uc3RhbnRzIGluIEdwc0xvY2F0aW9uUHJvdmlkZXIuamF2YS4gKi8KLS8qKiBSZWNlaXZlIEdQUyBmaXhlcyBvbiBhIHJlY3VycmluZyBiYXNpcyBhdCBhIHNwZWNpZmllZCBwZXJpb2QuICovCi0jZGVmaW5lIEdQU19QT1NJVElPTl9SRUNVUlJFTkNFX1BFUklPRElDICAgIDAKLS8qKiBSZXF1ZXN0IGEgc2luZ2xlIHNob3QgR1BTIGZpeC4gKi8KLSNkZWZpbmUgR1BTX1BPU0lUSU9OX1JFQ1VSUkVOQ0VfU0lOR0xFICAgICAgMQogCiAvKiogR1BTIHN0YXR1cyBldmVudCB2YWx1ZXMuICovCiB0eXBlZGVmIHVpbnQxNl90IEdwc1N0YXR1c1ZhbHVlOwotLyogSU1QT1JUQU5UOiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBtYXRjaAotICogY29uc3RhbnRzIGluIEdwc0xvY2F0aW9uUHJvdmlkZXIuamF2YS4gKi8KLS8qKiBHUFMgc3RhdHVzIHVua25vd24uICovCi0jZGVmaW5lIEdQU19TVEFUVVNfTk9ORSAgICAgICAgICAgICAwCi0vKiogR1BTIGhhcyBiZWd1biBuYXZpZ2F0aW5nLiAqLwotI2RlZmluZSBHUFNfU1RBVFVTX1NFU1NJT05fQkVHSU4gICAgMQotLyoqIEdQUyBoYXMgc3RvcHBlZCBuYXZpZ2F0aW5nLiAqLwotI2RlZmluZSBHUFNfU1RBVFVTX1NFU1NJT05fRU5EICAgICAgMgotLyoqIEdQUyBoYXMgcG93ZXJlZCBvbiBidXQgaXMgbm90IG5hdmlnYXRpbmcuICovCi0jZGVmaW5lIEdQU19TVEFUVVNfRU5HSU5FX09OICAgICAgICAzCi0vKiogR1BTIGlzIHBvd2VyZWQgb2ZmLiAqLwotI2RlZmluZSBHUFNfU1RBVFVTX0VOR0lORV9PRkYgICAgICAgNAogCiAvKiogRmxhZ3MgdG8gaW5kaWNhdGUgd2hpY2ggdmFsdWVzIGFyZSB2YWxpZCBpbiBhIEdwc0xvY2F0aW9uLiAqLwogdHlwZWRlZiB1aW50MTZfdCBHcHNMb2NhdGlvbkZsYWdzOwotLyogSU1QT1JUQU5UOiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBtYXRjaAotICogY29uc3RhbnRzIGluIEdwc0xvY2F0aW9uUHJvdmlkZXIuamF2YS4gKi8KLS8qKiBHcHNMb2NhdGlvbiBoYXMgdmFsaWQgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZS4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19MQVRfTE9ORyAgIDB4MDAwMQotLyoqIEdwc0xvY2F0aW9uIGhhcyB2YWxpZCBhbHRpdHVkZS4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19BTFRJVFVERSAgIDB4MDAwMgotLyoqIEdwc0xvY2F0aW9uIGhhcyB2YWxpZCBzcGVlZC4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19TUEVFRCAgICAgIDB4MDAwNAotLyoqIEdwc0xvY2F0aW9uIGhhcyB2YWxpZCBiZWFyaW5nLiAqLwotI2RlZmluZSBHUFNfTE9DQVRJT05fSEFTX0JFQVJJTkcgICAgMHgwMDA4Ci0vKiogR3BzTG9jYXRpb24gaGFzIHZhbGlkIGFjY3VyYWN5LiAqLwotI2RlZmluZSBHUFNfTE9DQVRJT05fSEFTX0FDQ1VSQUNZICAgMHgwMDEwCi0KLS8qKiBGbGFncyBmb3IgdGhlIGdwc19zZXRfY2FwYWJpbGl0aWVzIGNhbGxiYWNrLiAqLwotCi0vKioKLSAqIEdQUyBIQUwgc2NoZWR1bGVzIGZpeGVzIGZvciBHUFNfUE9TSVRJT05fUkVDVVJSRU5DRV9QRVJJT0RJQyBtb2RlLiBJZiB0aGlzIGlzCi0gKiBub3Qgc2V0LCB0aGVuIHRoZSBmcmFtZXdvcmsgd2lsbCB1c2UgMTAwMG1zIGZvciBtaW5faW50ZXJ2YWwgYW5kIHdpbGwgc3RhcnQKLSAqIGFuZCBjYWxsIHN0YXJ0KCkgYW5kIHN0b3AoKSB0byBzY2hlZHVsZSB0aGUgR1BTLgotICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX1NDSEVEVUxJTkcgICAgICAgKDEgPDwgMCkKLS8qKiBHUFMgc3VwcG9ydHMgTVMtQmFzZWQgQUdQUyBtb2RlICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX01TQiAgICAgICAgICAgICAgKDEgPDwgMSkKLS8qKiBHUFMgc3VwcG9ydHMgTVMtQXNzaXN0ZWQgQUdQUyBtb2RlICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX01TQSAgICAgICAgICAgICAgKDEgPDwgMikKLS8qKiBHUFMgc3VwcG9ydHMgc2luZ2xlLXNob3QgZml4ZXMgKi8KLSNkZWZpbmUgR1BTX0NBUEFCSUxJVFlfU0lOR0xFX1NIT1QgICAgICAoMSA8PCAzKQotLyoqIEdQUyBzdXBwb3J0cyBvbiBkZW1hbmQgdGltZSBpbmplY3Rpb24gKi8KLSNkZWZpbmUgR1BTX0NBUEFCSUxJVFlfT05fREVNQU5EX1RJTUUgICAoMSA8PCA0KQotLyoqIEdQUyBzdXBwb3J0cyBHZW9mZW5jaW5nICAqLwotI2RlZmluZSBHUFNfQ0FQQUJJTElUWV9HRU9GRU5DSU5HICAgICAgICgxIDw8IDUpCi0vKiogR1BTIHN1cHBvcnRzIE1lYXN1cmVtZW50cy4gKi8KLSNkZWZpbmUgR1BTX0NBUEFCSUxJVFlfTUVBU1VSRU1FTlRTICAgICAoMSA8PCA2KQotLyoqIEdQUyBzdXBwb3J0cyBOYXZpZ2F0aW9uIE1lc3NhZ2VzICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX05BVl9NRVNTQUdFUyAgICAgKDEgPDwgNykKIAogLyoqCiAgKiBGbGFncyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggYWlkaW5nIGRhdGEgdG8gZGVsZXRlIHdoZW4gY2FsbGluZwogICogZGVsZXRlX2FpZGluZ19kYXRhKCkuCiAgKi8KIHR5cGVkZWYgdWludDE2X3QgR3BzQWlkaW5nRGF0YTsKLS8qIElNUE9SVEFOVDogTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIG11c3QgbWF0Y2gKLSAqIGNvbnN0YW50cyBpbiBHcHNMb2NhdGlvblByb3ZpZGVyLmphdmEuICovCi0jZGVmaW5lIEdQU19ERUxFVEVfRVBIRU1FUklTICAgICAgICAweDAwMDEKLSNkZWZpbmUgR1BTX0RFTEVURV9BTE1BTkFDICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBHUFNfREVMRVRFX1BPU0lUSU9OICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIEdQU19ERUxFVEVfVElNRSAgICAgICAgICAgICAweDAwMDgKLSNkZWZpbmUgR1BTX0RFTEVURV9JT05PICAgICAgICAgICAgIDB4MDAxMAotI2RlZmluZSBHUFNfREVMRVRFX1VUQyAgICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIEdQU19ERUxFVEVfSEVBTFRIICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgR1BTX0RFTEVURV9TVkRJUiAgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBHUFNfREVMRVRFX1NWU1RFRVIgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIEdQU19ERUxFVEVfU0FEQVRBICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgR1BTX0RFTEVURV9SVEkgICAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBHUFNfREVMRVRFX0NFTExEQl9JTkZPICAgICAgMHg4MDAwCi0jZGVmaW5lIEdQU19ERUxFVEVfQUxMICAgICAgICAgICAgICAweEZGRkYKIAogLyoqIEFHUFMgdHlwZSAqLwogdHlwZWRlZiB1aW50MTZfdCBBR3BzVHlwZTsKLSNkZWZpbmUgQUdQU19UWVBFX1NVUEwgICAgICAgICAgMQotI2RlZmluZSBBR1BTX1RZUEVfQzJLICAgICAgICAgICAyCiAKIHR5cGVkZWYgdWludDE2X3QgQUdwc1NldElEVHlwZTsKLSNkZWZpbmUgQUdQU19TRVRJRF9UWVBFX05PTkUgICAgMAotI2RlZmluZSBBR1BTX1NFVElEX1RZUEVfSU1TSSAgICAxCi0jZGVmaW5lIEFHUFNfU0VUSURfVFlQRV9NU0lTRE4gIDIKIAogdHlwZWRlZiB1aW50MTZfdCBBcG5JcFR5cGU7Ci0jZGVmaW5lIEFQTl9JUF9JTlZBTElEICAgICAgICAgIDAKLSNkZWZpbmUgQVBOX0lQX0lQVjQgICAgICAgICAgICAgMQotI2RlZmluZSBBUE5fSVBfSVBWNiAgICAgICAgICAgICAyCi0jZGVmaW5lIEFQTl9JUF9JUFY0VjYgICAgICAgICAgIDMKIAogLyoqCiAgKiBTdHJpbmcgbGVuZ3RoIGNvbnN0YW50cwpAQCAtMTcxLDcxICsxMTIsMzEgQEAKICAqIEdwc05pVHlwZSBjb25zdGFudHMKICAqLwogdHlwZWRlZiB1aW50MzJfdCBHcHNOaVR5cGU7Ci0jZGVmaW5lIEdQU19OSV9UWVBFX1ZPSUNFICAgICAgICAgICAgICAxCi0jZGVmaW5lIEdQU19OSV9UWVBFX1VNVFNfU1VQTCAgICAgICAgICAyCi0jZGVmaW5lIEdQU19OSV9UWVBFX1VNVFNfQ1RSTF9QTEFORSAgICAzCiAKIC8qKgogICogR3BzTmlOb3RpZnlGbGFncyBjb25zdGFudHMKICAqLwogdHlwZWRlZiB1aW50MzJfdCBHcHNOaU5vdGlmeUZsYWdzOwotLyoqIE5JIHJlcXVpcmVzIG5vdGlmaWNhdGlvbiAqLwotI2RlZmluZSBHUFNfTklfTkVFRF9OT1RJRlkgICAgICAgICAgMHgwMDAxCi0vKiogTkkgcmVxdWlyZXMgdmVyaWZpY2F0aW9uICovCi0jZGVmaW5lIEdQU19OSV9ORUVEX1ZFUklGWSAgICAgICAgICAweDAwMDIKLS8qKiBOSSByZXF1aXJlcyBwcml2YWN5IG92ZXJyaWRlLCBubyBub3RpZmljYXRpb24vbWluaW1hbCB0cmFjZSAqLwotI2RlZmluZSBHUFNfTklfUFJJVkFDWV9PVkVSUklERSAgICAgMHgwMDA0CiAKIC8qKgogICogR1BTIE5JIHJlc3BvbnNlcywgdXNlZCB0byBkZWZpbmUgdGhlIHJlc3BvbnNlIGluCiAgKiBOSSBzdHJ1Y3R1cmVzCiAgKi8KIHR5cGVkZWYgaW50IEdwc1VzZXJSZXNwb25zZVR5cGU7Ci0jZGVmaW5lIEdQU19OSV9SRVNQT05TRV9BQ0NFUFQgICAgICAgICAxCi0jZGVmaW5lIEdQU19OSV9SRVNQT05TRV9ERU5ZICAgICAgICAgICAyCi0jZGVmaW5lIEdQU19OSV9SRVNQT05TRV9OT1JFU1AgICAgICAgICAzCiAKIC8qKgogICogTkkgZGF0YSBlbmNvZGluZyBzY2hlbWUKICAqLwogdHlwZWRlZiBpbnQgR3BzTmlFbmNvZGluZ1R5cGU7Ci0jZGVmaW5lIEdQU19FTkNfTk9ORSAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdQU19FTkNfU1VQTF9HU01fREVGQVVMVCAgICAgICAxCi0jZGVmaW5lIEdQU19FTkNfU1VQTF9VVEY4ICAgICAgICAgICAgICAyCi0jZGVmaW5lIEdQU19FTkNfU1VQTF9VQ1MyICAgICAgICAgICAgICAzCi0jZGVmaW5lIEdQU19FTkNfVU5LTk9XTiAgICAgICAgICAgICAgICAtMQogCiAvKiogQUdQUyBzdGF0dXMgZXZlbnQgdmFsdWVzLiAqLwogdHlwZWRlZiB1aW50MTZfdCBBR3BzU3RhdHVzVmFsdWU7Ci0vKiogR1BTIHJlcXVlc3RzIGRhdGEgY29ubmVjdGlvbiBmb3IgQUdQUy4gKi8KLSNkZWZpbmUgR1BTX1JFUVVFU1RfQUdQU19EQVRBX0NPTk4gIDEKLS8qKiBHUFMgcmVsZWFzZXMgdGhlIEFHUFMgZGF0YSBjb25uZWN0aW9uLiAqLwotI2RlZmluZSBHUFNfUkVMRUFTRV9BR1BTX0RBVEFfQ09OTiAgMgotLyoqIEFHUFMgZGF0YSBjb25uZWN0aW9uIGluaXRpYXRlZCAqLwotI2RlZmluZSBHUFNfQUdQU19EQVRBX0NPTk5FQ1RFRCAgICAgMwotLyoqIEFHUFMgZGF0YSBjb25uZWN0aW9uIGNvbXBsZXRlZCAqLwotI2RlZmluZSBHUFNfQUdQU19EQVRBX0NPTk5fRE9ORSAgICAgNAotLyoqIEFHUFMgZGF0YSBjb25uZWN0aW9uIGZhaWxlZCAqLwotI2RlZmluZSBHUFNfQUdQU19EQVRBX0NPTk5fRkFJTEVEICAgNQogCiB0eXBlZGVmIHVpbnQxNl90IEFHcHNSZWZMb2NhdGlvblR5cGU7Ci0jZGVmaW5lIEFHUFNfUkVGX0xPQ0FUSU9OX1RZUEVfR1NNX0NFTExJRCAgIDEKLSNkZWZpbmUgQUdQU19SRUZfTE9DQVRJT05fVFlQRV9VTVRTX0NFTExJRCAgMgotI2RlZmluZSBBR1BTX1JFRl9MT0NBVElPTl9UWVBFX01BQyAgICAgICAgICAzCi0jZGVmaW5lIEFHUFNfUkVGX0xPQ0FUSU9OX1RZUEVfTFRFX0NFTExJRCAgIDQKIAogLyogRGVwcmVjYXRlZCwgdG8gYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBBbmRyb2lkIHJlbGVhc2UuICovCiAjZGVmaW5lIEFHUFNfUkVHX0xPQ0FUSU9OX1RZUEVfTUFDICAgICAgICAgIDMKIAotLyoqIE5ldHdvcmsgdHlwZXMgZm9yIHVwZGF0ZV9uZXR3b3JrX3N0YXRlICJ0eXBlIiBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UWVBFX01PQklMRSAgICAgICAgMAotI2RlZmluZSBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfV0lGSSAgICAgICAgICAxCi0jZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFlQRV9NT0JJTEVfTU1TICAgIDIKLSNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UWVBFX01PQklMRV9TVVBMICAgMwotI2RlZmluZSBBR1BTX1JJTF9ORVRXT1JLX1RUWVBFX01PQklMRV9EVU4gICA0Ci0jZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFRZUEVfTU9CSUxFX0hJUFJJIDUKLSNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UVFlQRV9XSU1BWCAgICAgICAgNgotCiAvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgdG9nZXRoZXIgd2l0aCBpdHMgY29uc3RhbnRzIGJlbG93IGFyZSBkZXByZWNhdGVkLCBhbmQKICAqIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwogdHlwZWRlZiB1aW50MTZfdCBHcHNDbG9ja0ZsYWdzOwpAQCAtMjUxLDIwICsxNTIsNiBAQAogICogRmxhZ3MgdG8gaW5kaWNhdGUgd2hhdCBmaWVsZHMgaW4gR25zc0Nsb2NrIGFyZSB2YWxpZC4KICAqLwogdHlwZWRlZiB1aW50MTZfdCBHbnNzQ2xvY2tGbGFnczsKLS8qKiBBIHZhbGlkICdsZWFwIHNlY29uZCcgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19DTE9DS19IQVNfTEVBUF9TRUNPTkQgICAgICAgICAgICAgICAoMTw8MCkKLS8qKiBBIHZhbGlkICd0aW1lIHVuY2VydGFpbnR5JyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX0NMT0NLX0hBU19USU1FX1VOQ0VSVEFJTlRZICAgICAgICAgICgxPDwxKQotLyoqIEEgdmFsaWQgJ2Z1bGwgYmlhcycgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19DTE9DS19IQVNfRlVMTF9CSUFTICAgICAgICAgICAgICAgICAoMTw8MikKLS8qKiBBIHZhbGlkICdiaWFzJyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX0NMT0NLX0hBU19CSUFTICAgICAgICAgICAgICAgICAgICAgICgxPDwzKQotLyoqIEEgdmFsaWQgJ2JpYXMgdW5jZXJ0YWludHknIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfQ0xPQ0tfSEFTX0JJQVNfVU5DRVJUQUlOVFkgICAgICAgICAgKDE8PDQpCi0vKiogQSB2YWxpZCAnZHJpZnQnIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfQ0xPQ0tfSEFTX0RSSUZUICAgICAgICAgICAgICAgICAgICAgKDE8PDUpCi0vKiogQSB2YWxpZCAnZHJpZnQgdW5jZXJ0YWludHknIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfQ0xPQ0tfSEFTX0RSSUZUX1VOQ0VSVEFJTlRZICAgICAgICAgKDE8PDYpCiAKIC8qIFRoZSBmb2xsb3dpbmcgdHlwZWRlZiB0b2dldGhlciB3aXRoIGl0cyBjb25zdGFudHMgYmVsb3cgYXJlIGRlcHJlY2F0ZWQsIGFuZAogICogd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuICovCkBAIC0zMDAsMTYgKzE4Nyw2IEBACiAgKiBGbGFncyB0byBpbmRpY2F0ZSB3aGF0IGZpZWxkcyBpbiBHbnNzTWVhc3VyZW1lbnQgYXJlIHZhbGlkLgogICovCiB0eXBlZGVmIHVpbnQzMl90IEduc3NNZWFzdXJlbWVudEZsYWdzOwotLyoqIEEgdmFsaWQgJ3NucicgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9IQVNfU05SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwwKQotLyoqIEEgdmFsaWQgJ2NhcnJpZXIgZnJlcXVlbmN5JyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX0hBU19DQVJSSUVSX0ZSRVFVRU5DWSAgICAgICAgICAgICAgICAgKDE8PDkpCi0vKiogQSB2YWxpZCAnY2FycmllciBjeWNsZXMnIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfSEFTX0NBUlJJRVJfQ1lDTEVTICAgICAgICAgICAgICAgICAgICAoMTw8MTApCi0vKiogQSB2YWxpZCAnY2FycmllciBwaGFzZScgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9IQVNfQ0FSUklFUl9QSEFTRSAgICAgICAgICAgICAgICAgICAgICgxPDwxMSkKLS8qKiBBIHZhbGlkICdjYXJyaWVyIHBoYXNlIHVuY2VydGFpbnR5JyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX0hBU19DQVJSSUVSX1BIQVNFX1VOQ0VSVEFJTlRZICAgICAgICAgKDE8PDEyKQogCiAvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgdG9nZXRoZXIgd2l0aCBpdHMgY29uc3RhbnRzIGJlbG93IGFyZSBkZXByZWNhdGVkLCBhbmQKICAqIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwpAQCAtMzMxLDEyICsyMDgsNiBAQAogICogaW5kaWNhdG9yLgogICovCiB0eXBlZGVmIHVpbnQ4X3QgR25zc011bHRpcGF0aEluZGljYXRvcjsKLS8qKiBUaGUgaW5kaWNhdG9yIGlzIG5vdCBhdmFpbGFibGUgb3IgdW5rbm93bi4gKi8KLSNkZWZpbmUgR05TU19NVUxUSVBBVEhfSU5ESUNBVE9SX1VOS05PV04gICAgICAgICAgICAgICAgIDAKLS8qKiBUaGUgbWVhc3VyZW1lbnQgaXMgaW5kaWNhdGVkIHRvIGJlIGFmZmVjdGVkIGJ5IG11bHRpcGF0aC4gKi8KLSNkZWZpbmUgR05TU19NVUxUSVBBVEhfSU5ESUNBVE9SX1BSRVNFTlQgICAgICAgICAgICAgICAgIDEKLS8qKiBUaGUgbWVhc3VyZW1lbnQgaXMgaW5kaWNhdGVkIHRvIGJlIG5vdCBhZmZlY3RlZCBieSBtdWx0aXBhdGguICovCi0jZGVmaW5lIEdOU1NfTVVMVElQQVRIX0lORElDQVRPUl9OT1RfUFJFU0VOVCAgICAgICAgICAgICAyCiAKIC8qIFRoZSBmb2xsb3dpbmcgdHlwZWRlZiB0b2dldGhlciB3aXRoIGl0cyBjb25zdGFudHMgYmVsb3cgYXJlIGRlcHJlY2F0ZWQsIGFuZAogICogd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuICovCkBAIC0zNjMsMjEgKzIzNCw2IEBACiAgKiBzZXQgdG8gR05TU19NRUFTVVJFTUVOVF9TVEFURV9VTktOT1dOKDApLgogICovCiB0eXBlZGVmIHVpbnQzMl90IEduc3NNZWFzdXJlbWVudFN0YXRlOwotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX1VOS05PV04gICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0NPREVfTE9DSyAgICAgICAgICAgICAoMTw8MCkKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9CSVRfU1lOQyAgICAgICAgICAgICAgKDE8PDEpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfU1VCRlJBTUVfU1lOQyAgICAgICAgICgxPDwyKQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX1RPV19ERUNPREVEICAgICAgICAgICAoMTw8MykKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9NU0VDX0FNQklHVU9VUyAgICAgICAgKDE8PDQpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfU1lNQk9MX1NZTkMgICAgICAgICAgICgxPDw1KQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dMT19TVFJJTkdfU1lOQyAgICAgICAoMTw8NikKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9HTE9fVE9EX0RFQ09ERUQgICAgICAgKDE8PDcpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfQkRTX0QyX0JJVF9TWU5DICAgICAgICgxPDw4KQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0JEU19EMl9TVUJGUkFNRV9TWU5DICAoMTw8OSkKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9HQUxfRTFCQ19DT0RFX0xPQ0sgICAgKDE8PDEwKQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dBTF9FMUNfMk5EX0NPREVfTE9DSyAoMTw8MTEpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0FMX0UxQl9QQUdFX1NZTkMgICAgICgxPDwxMikKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9TQkFTX1NZTkMgICAgICAgICAgICAgKDE8PDEzKQogCiAvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgdG9nZXRoZXIgd2l0aCBpdHMgY29uc3RhbnRzIGJlbG93IGFyZSBkZXByZWNhdGVkLCBhbmQKICAqIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwpAQCAtMzkxLDEwICsyNDcsNiBAQAogICogRmxhZ3MgaW5kaWNhdGluZyB0aGUgQWNjdW11bGF0ZWQgRGVsdGEgUmFuZ2UncyBzdGF0ZXMuCiAgKi8KIHR5cGVkZWYgdWludDE2X3QgR25zc0FjY3VtdWxhdGVkRGVsdGFSYW5nZVN0YXRlOwotI2RlZmluZSBHTlNTX0FEUl9TVEFURV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdOU1NfQURSX1NUQVRFX1ZBTElEICAgICAgICAgICAgICAgICAgICAgKDE8PDApCi0jZGVmaW5lIEdOU1NfQURSX1NUQVRFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgKDE8PDEpCi0jZGVmaW5lIEdOU1NfQURSX1NUQVRFX0NZQ0xFX1NMSVAgICAgICAgICAgICAgICAgKDE8PDIpCiAKIC8qIFRoZSBmb2xsb3dpbmcgdHlwZWRlZiB0b2dldGhlciB3aXRoIGl0cyBjb25zdGFudHMgYmVsb3cgYXJlIGRlcHJlY2F0ZWQsIGFuZAogICogd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuICovCkBAIC00MTQsMjYgKzI2Niw2IEBACiAgKi8KIHR5cGVkZWYgaW50MTZfdCBHbnNzTmF2aWdhdGlvbk1lc3NhZ2VUeXBlOwogCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfVU5LTk9XTiAgICAgICAwCi0vKiogR1BTIEwxIEMvQSBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HUFNfTDFDQSAgICAgIDB4MDEwMQotLyoqIEdQUyBMMi1DTkFWIG1lc3NhZ2UgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR1BTX0wyQ05BViAgICAweDAxMDIKLS8qKiBHUFMgTDUtQ05BViBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19MNUNOQVYgICAgMHgwMTAzCi0vKiogR1BTIENOQVYtMiBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19DTkFWMiAgICAgMHgwMTA0Ci0vKiogR2xvbmFzcyBMMSBDQSBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dMT19MMUNBICAgICAgMHgwMzAxCi0vKiogQmVpZG91IEQxIG1lc3NhZ2UgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfQkRTX0QxICAgICAgICAweDA1MDEKLS8qKiBCZWlkb3UgRDIgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9CRFNfRDIgICAgICAgIDB4MDUwMgotLyoqIEdhbGlsZW8gSS9OQVYgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HQUxfSSAgICAgICAgIDB4MDYwMQotLyoqIEdhbGlsZW8gRi9OQVYgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HQUxfRiAgICAgICAgIDB4MDYwMgotCiAvKioKICAqIFN0YXR1cyBvZiBOYXZpZ2F0aW9uIE1lc3NhZ2UKICAqIFdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHByb3Blcmx5IHdpdGhvdXQgYW55IHBhcml0eSBlcnJvciBpbiBpdHMgbmF2aWdhdGlvbiB3b3JkcywgdGhlCkBAIC00NDQsOSArMjc2LDYgQEAKICAqIGNvcnJlY3RlZC4KICAqLwogdHlwZWRlZiB1aW50MTZfdCBOYXZpZ2F0aW9uTWVzc2FnZVN0YXR1czsKLSNkZWZpbmUgTkFWX01FU1NBR0VfU1RBVFVTX1VOS05PV04gICAgICAgICAgICAgIDAKLSNkZWZpbmUgTkFWX01FU1NBR0VfU1RBVFVTX1BBUklUWV9QQVNTRUQgICAoMTw8MCkKLSNkZWZpbmUgTkFWX01FU1NBR0VfU1RBVFVTX1BBUklUWV9SRUJVSUxUICAoMTw8MSkKIAogLyogVGhpcyBjb25zdGFudCBpcyBkZXByZWNhdGVkLCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuICovCiAjZGVmaW5lIE5BVl9NRVNTQUdFX1NUQVRVU19VTktPTlcgICAgICAgICAgICAgIDAKQEAgLTQ1NSwyMiArMjg0LDExIEBACiAgKiBGbGFncyB0aGF0IGluZGljYXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYXRlbGxpdGUKICAqLwogdHlwZWRlZiB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR25zc1N2RmxhZ3M7Ci0jZGVmaW5lIEdOU1NfU1ZfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdOU1NfU1ZfRkxBR1NfSEFTX0VQSEVNRVJJU19EQVRBICAgICAgICAoMSA8PCAwKQotI2RlZmluZSBHTlNTX1NWX0ZMQUdTX0hBU19BTE1BTkFDX0RBVEEgICAgICAgICAgKDEgPDwgMSkKLSNkZWZpbmUgR05TU19TVl9GTEFHU19VU0VEX0lOX0ZJWCAgICAgICAgICAgICAgICgxIDw8IDIpCiAKIC8qKgogICogQ29uc3RlbGxhdGlvbiB0eXBlIG9mIEduc3NTdkluZm8KICAqLwogdHlwZWRlZiB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgIEduc3NDb25zdGVsbGF0aW9uVHlwZTsKLSNkZWZpbmUgR05TU19DT05TVEVMTEFUSU9OX1VOS05PV04gICAgICAwCi0jZGVmaW5lIEdOU1NfQ09OU1RFTExBVElPTl9HUFMgICAgICAgICAgMQotI2RlZmluZSBHTlNTX0NPTlNURUxMQVRJT05fU0JBUyAgICAgICAgIDIKLSNkZWZpbmUgR05TU19DT05TVEVMTEFUSU9OX0dMT05BU1MgICAgICAzCi0jZGVmaW5lIEdOU1NfQ09OU1RFTExBVElPTl9RWlNTICAgICAgICAgNAotI2RlZmluZSBHTlNTX0NPTlNURUxMQVRJT05fQkVJRE9VICAgICAgIDUKLSNkZWZpbmUgR05TU19DT05TVEVMTEFUSU9OX0dBTElMRU8gICAgICA2CiAKIC8qKgogICogTmFtZSBmb3IgdGhlIEdQUyBYVFJBIGludGVyZmFjZS4KQEAgLTUyMiw3ICszNDAsNiBAQAogICovCiAjZGVmaW5lIEdOU1NfQ09ORklHVVJBVElPTl9JTlRFUkZBQ0UgICAgICJnbnNzX2NvbmZpZ3VyYXRpb24iCiAKLQogLyoqIFJlcHJlc2VudHMgYSBsb2NhdGlvbi4gKi8KIHR5cGVkZWYgc3RydWN0IHsKICAgICAvKiogc2V0IHRvIHNpemVvZihHcHNMb2NhdGlvbikgKi8KQEAgLTExMjYsOSArOTQzLDYgQEAKICAgICBjb25zdCBHcHNJbnRlcmZhY2UqICgqZ2V0X2dwc19pbnRlcmZhY2UpKHN0cnVjdCBncHNfZGV2aWNlX3QqIGRldik7CiB9OwogCi0jZGVmaW5lIEFHUFNfUklMX1JFUVVFU1RfU0VUSURfSU1TSSAgICAgKDE8PDBMKQotI2RlZmluZSBBR1BTX1JJTF9SRVFVRVNUX1NFVElEX01TSVNETiAgICgxPDwxTCkKLQogI2RlZmluZSBBR1BTX1JJTF9SRVFVRVNUX1JFRkxPQ19DRUxMSUQgICgxPDwwTCkKICNkZWZpbmUgQUdQU19SSUxfUkVRVUVTVF9SRUZMT0NfTUFDICAgICAoMTw8MUwpCiAKQEAgLTEyNTEsMTkgKzEwNjUsNiBAQAogICogc3Vic3lzdGVtIGtub3dzIGFib3V0IHRoZSBHZW9mZW5jZS4KICAqCiAgKi8KLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VOVEVSRUQgICAgICgxPDwwTCkKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VYSVRFRCAgICAgICgxPDwxTCkKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX1VOQ0VSVEFJTiAgICgxPDwyTCkKLQotI2RlZmluZSBHUFNfR0VPRkVOQ0VfVU5BVkFJTEFCTEUgKDE8PDBMKQotI2RlZmluZSBHUFNfR0VPRkVOQ0VfQVZBSUxBQkxFICAgKDE8PDFMKQotCi0jZGVmaW5lIEdQU19HRU9GRU5DRV9PUEVSQVRJT05fU1VDQ0VTUyAgICAgICAgICAgMAotI2RlZmluZSBHUFNfR0VPRkVOQ0VfRVJST1JfVE9PX01BTllfR0VPRkVOQ0VTIC0xMDAKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VSUk9SX0lEX0VYSVNUUyAgICAgICAgICAtMTAxCi0jZGVmaW5lIEdQU19HRU9GRU5DRV9FUlJPUl9JRF9VTktOT1dOICAgICAgICAgLTEwMgotI2RlZmluZSBHUFNfR0VPRkVOQ0VfRVJST1JfSU5WQUxJRF9UUkFOU0lUSU9OIC0xMDMKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VSUk9SX0dFTkVSSUMgICAgICAgICAgICAtMTQ5CiAKIC8qKgogICogVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2VvZmVuY2UuCkBAIC0xOTcyLDEwICsxNzczLDYgQEAKICAgICBnbnNzX21lYXN1cmVtZW50X2NhbGxiYWNrIGduc3NfbWVhc3VyZW1lbnRfY2FsbGJhY2s7CiB9IEdwc01lYXN1cmVtZW50Q2FsbGJhY2tzOwogCi0jZGVmaW5lIEdQU19NRUFTVVJFTUVOVF9PUEVSQVRJT05fU1VDQ0VTUyAgICAgICAgICAwCi0jZGVmaW5lIEdQU19NRUFTVVJFTUVOVF9FUlJPUl9BTFJFQURZX0lOSVQgICAgICAtMTAwCi0jZGVmaW5lIEdQU19NRUFTVVJFTUVOVF9FUlJPUl9HRU5FUklDICAgICAgICAgICAtMTAxCi0KIC8qKgogICogRXh0ZW5kZWQgaW50ZXJmYWNlIGZvciBHUFMgTWVhc3VyZW1lbnRzIHN1cHBvcnQuCiAgKi8KQEAgLTIxNDcsMTAgKzE5NDQsNiBAQAogICAgIGduc3NfbmF2aWdhdGlvbl9tZXNzYWdlX2NhbGxiYWNrIGduc3NfbmF2aWdhdGlvbl9tZXNzYWdlX2NhbGxiYWNrOwogfSBHcHNOYXZpZ2F0aW9uTWVzc2FnZUNhbGxiYWNrczsKIAotI2RlZmluZSBHUFNfTkFWSUdBVElPTl9NRVNTQUdFX09QRVJBVElPTl9TVUNDRVNTICAgICAgICAgICAgIDAKLSNkZWZpbmUgR1BTX05BVklHQVRJT05fTUVTU0FHRV9FUlJPUl9BTFJFQURZX0lOSVQgICAgICAgICAtMTAwCi0jZGVmaW5lIEdQU19OQVZJR0FUSU9OX01FU1NBR0VfRVJST1JfR0VORVJJQyAgICAgICAgICAgICAgLTEwMQotCiAvKioKICAqIEV4dGVuZGVkIGludGVyZmFjZSBmb3IgR1BTIG5hdmlnYXRpb24gbWVzc2FnZSByZXBvcnRpbmcgc3VwcG9ydC4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9ncmFsbG9jMS5oIGIvaW5jbHVkZS9oYXJkd2FyZS9ncmFsbG9jMS5oCmluZGV4IGExYTJkNjkuLjQ4NDUwMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvZ3JhbGxvYzEuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2dyYWxsb2MxLmgKQEAgLTM2LDcgKzM2LDE5IEBACiAgICAgICogYWxsb2NhdGUgbWF5IGJlIE5VTEwsIHdoaWNoIGluc3RydWN0cyB0aGUgZGV2aWNlIHRvIHJlcG9ydCB3aGV0aGVyIHRoZQogICAgICAqIGdpdmVuIGFsbG9jYXRpb24gaXMgcG9zc2libGUgb3Igbm90LiAqLwogICAgIEdSQUxMT0MxX0NBUEFCSUxJVFlfVEVTVF9BTExPQ0FURSA9IDEsCi0gICAgR1JBTExPQzFfTEFTVF9DQVBBQklMSVRZID0gMSwKKworICAgIC8qIElmIHRoaXMgY2FwYWJpbGl0eSBpcyBzdXBwb3J0ZWQsIHRoZW4gdGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCisgICAgICogYWxsb2NhdGluZyBidWZmZXJzIHdpdGggbW9yZSB0aGFuIG9uZSBpbWFnZSBsYXllci4gKi8KKyAgICBHUkFMTE9DMV9DQVBBQklMSVRZX0xBWUVSRURfQlVGRkVSUyA9IDIsCisKKyAgICAvKiBJZiB0aGlzIGNhcGFiaWxpdHkgaXMgc3VwcG9ydGVkLCB0aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBhbHdheXMgY2xvc2VzCisgICAgICogYW5kIGRlbGV0ZXMgYSBidWZmZXIgaGFuZGxlIHdoZW5ldmVyIHRoZSBsYXN0IHJlZmVyZW5jZSBpcyByZW1vdmVkLgorICAgICAqCisgICAgICogU3VwcG9ydGluZyB0aGlzIGNhcGFiaWxpdHkgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQuICBJdCB3aWxsIGJlY29tZQorICAgICAqIG1hbmRhdG9yeSBpbiBmdXR1cmUgcmVsZWFzZXMuICovCisgICAgR1JBTExPQzFfQ0FQQUJJTElUWV9SRUxFQVNFX0lNUExZX0RFTEVURSA9IDMsCisKKyAgICBHUkFMTE9DMV9MQVNUX0NBUEFCSUxJVFkgPSAzLAogfSBncmFsbG9jMV9jYXBhYmlsaXR5X3Q7CiAKIHR5cGVkZWYgZW51bSB7CkBAIC03MSw3ICs4Myw3IEBACiAgICAgR1JBTExPQzFfQ09OU1VNRVJfVVNBR0VfRk9SRUlHTl9CVUZGRVJTID0gMVVMTCA8PCAyMSwKIAogICAgIC8qIDFVTEwgPDwgMjIgKi8KLSAgICAvKiAxVUxMIDw8IDIzICovCisgICAgR1JBTExPQzFfQ09OU1VNRVJfVVNBR0VfR1BVX0RBVEFfQlVGRkVSID0gMVVMTCA8PCAyMywKICAgICAvKiAxVUxMIDw8IDI0ICovCiAgICAgLyogMVVMTCA8PCAyNSAqLwogICAgIC8qIDFVTEwgPDwgMjYgKi8KQEAgLTE0MSw3ICsxNTMsOSBAQAogICAgIEdSQUxMT0MxX0ZVTkNUSU9OX0xPQ0sgPSAxOCwKICAgICBHUkFMTE9DMV9GVU5DVElPTl9MT0NLX0ZMRVggPSAxOSwKICAgICBHUkFMTE9DMV9GVU5DVElPTl9VTkxPQ0sgPSAyMCwKLSAgICBHUkFMTE9DMV9MQVNUX0ZVTkNUSU9OID0gMjAsCisgICAgR1JBTExPQzFfRlVOQ1RJT05fU0VUX0xBWUVSX0NPVU5UID0gMjEsCisgICAgR1JBTExPQzFfRlVOQ1RJT05fR0VUX0xBWUVSX0NPVU5UID0gMjIsCisgICAgR1JBTExPQzFfTEFTVF9GVU5DVElPTiA9IDIyLAogfSBncmFsbG9jMV9mdW5jdGlvbl9kZXNjcmlwdG9yX3Q7CiAKIHR5cGVkZWYgZW51bSB7CkBAIC0xODgsNyArMjAyLDcgQEAKICAgICAvKiAxVUxMIDw8IDIwICovCiAgICAgLyogMVVMTCA8PCAyMSAqLwogICAgIEdSQUxMT0MxX1BST0RVQ0VSX1VTQUdFX1ZJREVPX0RFQ09ERVIgPSAxVUxMIDw8IDIyLAotICAgIC8qIDFVTEwgPDwgMjMgKi8KKyAgICBHUkFMTE9DMV9QUk9EVUNFUl9VU0FHRV9TRU5TT1JfRElSRUNUX0RBVEEgPSAxVUxMIDw8IDIzLAogICAgIC8qIDFVTEwgPDwgMjQgKi8KICAgICAvKiAxVUxMIDw8IDI1ICovCiAgICAgLyogMVVMTCA8PCAyNiAqLwpAQCAtNDQwLDYgKzQ1NCwzMCBAQAogICAgICAgICBncmFsbG9jMV9kZXZpY2VfdCogZGV2aWNlLCBncmFsbG9jMV9idWZmZXJfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IsCiAgICAgICAgIGludDMyX3QgLyphbmRyb2lkX3BpeGVsX2Zvcm1hdF90Ki8gZm9ybWF0KTsKIAorLyogc2V0TGF5ZXJDb3VudCguLi4sIGxheWVyQ291bnQpCisgKiBGdW5jdGlvbiBkZXNjcmlwdG9yOiBHUkFMTE9DMV9GVU5DVElPTl9TRVRfTEFZRVJfQ09VTlQKKyAqIE11c3QgYmUgcHJvdmlkZWQgYnkgYWxsIGdyYWxsb2MxIGRldmljZXMgdGhhdCBwcm92aWRlIHRoZQorICogR1JBTExPQzFfQ0FQQUJJTElUWV9MQVlFUkVEX0JVRkZFUlMgY2FwYWJpbGl0eS4KKyAqCisgKiBTZXRzIHRoZSBudW1iZXIgb2YgbGF5ZXJzIGluIHRoZSBidWZmZXIuCisgKgorICogQSBidWZmZXIgd2l0aCBtdWx0aXBsZSBsYXllcnMgbWF5IGJlIHVzZWQgYXMgdGhlIGJhY2tpbmcgc3RvcmUgb2YgYW4gYXJyYXkKKyAqIHRleHR1cmUuIEFsbCBsYXllcnMgb2YgYSBidWZmZXIgc2hhcmUgdGhlIHNhbWUgY2hhcmFjdGVyaXN0aWNzIChlLmcuLAorICogZGltZW5zaW9ucywgZm9ybWF0LCB1c2FnZSkuIERldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydAorICogR1JBTExPQzFfQ0FQQUJJTElUWV9MQVlFUkVEX0JVRkZFUlMgbXVzdCBhbGxvY2F0ZSBvbmx5IGJ1ZmZlcnMgd2l0aCBhIHNpbmdsZQorICogbGF5ZXIuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbGF5ZXJDb3VudCAtIHRoZSBkZXNpcmVkIG51bWJlciBvZiBsYXllcnMsIG11c3QgYmUgbm9uLXplcm8KKyAqCisgKiBSZXR1cm5zIEdSQUxMT0MxX0VSUk9SX05PTkUgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3JzOgorICogICBHUkFMTE9DMV9FUlJPUl9CQURfREVTQ1JJUFRPUiAtIHRoZSBidWZmZXIgZGVzY3JpcHRvciBpcyBpbnZhbGlkCisgKiAgIEdSQUxMT0MxX0VSUk9SX0JBRF9WQUxVRSAtIHRoZSBsYXllciBjb3VudCBpcyBpbnZhbGlkCisgKi8KK3R5cGVkZWYgaW50MzJfdCAvKmdyYWxsb2MxX2Vycm9yX3QqLyAoKkdSQUxMT0MxX1BGTl9TRVRfTEFZRVJfQ09VTlQpKAorICAgICAgICBncmFsbG9jMV9kZXZpY2VfdCogZGV2aWNlLCBncmFsbG9jMV9idWZmZXJfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IsCisgICAgICAgIHVpbnQzMl90IGxheWVyQ291bnQpOworCiAvKiBzZXRQcm9kdWNlclVzYWdlKC4uLiwgdXNhZ2UpCiAgKiBGdW5jdGlvbiBkZXNjcmlwdG9yOiBHUkFMTE9DMV9GVU5DVElPTl9TRVRfUFJPRFVDRVJfVVNBR0UKICAqIE11c3QgYmUgcHJvdmlkZWQgYnkgYWxsIGdyYWxsb2MxIGRldmljZXMKQEAgLTU2NCw2ICs2MDIsMjggQEAKICAgICAgICAgZ3JhbGxvYzFfZGV2aWNlX3QqIGRldmljZSwgYnVmZmVyX2hhbmRsZV90IGRlc2NyaXB0b3IsCiAgICAgICAgIGludDMyX3QqIG91dEZvcm1hdCk7CiAKKy8qIGdldExheWVyQ291bnQoLi4uLCBvdXRMYXllckNvdW50KQorICogRnVuY3Rpb24gZGVzY3JpcHRvcjogR1JBTExPQzFfRlVOQ1RJT05fR0VUX0xBWUVSX0NPVU5UCisgKiBNdXN0IGJlIHByb3ZpZGVkIGJ5IGFsbCBncmFsbG9jMSBkZXZpY2VzIHRoYXQgcHJvdmlkZSB0aGUKKyAqIEdSQUxMT0MxX0NBUEFCSUxJVFlfTEFZRVJFRF9CVUZGRVJTIGNhcGFiaWxpdHkuCisgKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIGxheWVycyBvZiB0aGUgYnVmZmVyLgorICoKKyAqIFNlZSBzZXRMYXllckNvdW50IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgb3V0TGF5ZXJDb3VudCAtIHRoZSBudW1iZXIgb2YgbGF5ZXJzIGluIHRoZSBpbWFnZSwgbXVzdCBiZSBub24tTlVMTAorICoKKyAqIFJldHVybnMgR1JBTExPQzFfRVJST1JfTk9ORSBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyBlcnJvcnM6CisgKiAgIEdSQUxMT0MxX0VSUk9SX0JBRF9IQU5ETEUgLSB0aGUgYnVmZmVyIGhhbmRsZSBpcyBpbnZhbGlkCisgKiAgIEdSQUxMT0MxX0VSUk9SX1VOU1VQUE9SVEVEIC0gdGhlIGRldmljZSBpcyB1bmFibGUgdG8gcmV0cmlldmUgdGhlCisgKiAgICAgICBsYXllciBjb3VudCBmcm9tIHRoZSBidWZmZXI7IHNlZSBub3RlIFsxXSBpbiB0aGlzIHNlY3Rpb24ncyBoZWFkZXIgZm9yCisgKiAgICAgICBtb3JlIGluZm9ybWF0aW9uCisgKi8KK3R5cGVkZWYgaW50MzJfdCAvKmdyYWxsb2MxX2Vycm9yX3QqLyAoKkdSQUxMT0MxX1BGTl9HRVRfTEFZRVJfQ09VTlQpKAorICAgICAgICBncmFsbG9jMV9kZXZpY2VfdCogZGV2aWNlLCBidWZmZXJfaGFuZGxlX3QgYnVmZmVyLAorICAgICAgICB1aW50MzJfdCogb3V0TGF5ZXJDb3VudCk7CisKIC8qIGdldFByb2R1Y2VyVXNhZ2UoLi4uLCBvdXRVc2FnZSkKICAqIEZ1bmN0aW9uIGRlc2NyaXB0b3I6IEdSQUxMT0MxX0ZVTkNUSU9OX0dFVF9QUk9EVUNFUl9VU0FHRQogICogTXVzdCBiZSBwcm92aWRlZCBieSBhbGwgZ3JhbGxvYzEgZGV2aWNlcwpAQCAtNjk2LDYgKzc1NiwxMiBAQAogICogcmVmZXJyaW5nIHRvIGEgcGFydGljdWxhciBiYWNraW5nIHN0b3JlIGlzIGZyZWVkLCB0aGF0IGJhY2tpbmcgc3RvcmUgc2hvdWxkCiAgKiBhbHNvIGJlIGZyZWVkLgogICoKKyAqIFdoZW4gR1JBTExPQzFfQ0FQQUJJTElUWV9SRUxFQVNFX0lNUExZX0RFTEVURSBpcyBzdXBwb3J0ZWQsCisgKiBuYXRpdmVfaGFuZGxlX2Nsb3NlIGFuZCBuYXRpdmVfaGFuZGxlX2RlbGV0ZSBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgYnkgdGhlCisgKiBpbXBsZW1lbnRhdGlvbiB3aGVuZXZlciB0aGUgbGFzdCByZWZlcmVuY2UgaXMgcmVtb3ZlZC4gIE90aGVyd2lzZSwgYSBjYWxsCisgKiB0byByZWxlYXNlKCkgd2lsbCBiZSBmb2xsb3dlZCBieSBuYXRpdmVfaGFuZGxlX2Nsb3NlIGFuZCBuYXRpdmVfaGFuZGxlX2RlbGV0ZQorICogYnkgdGhlIGNhbGxlciB3aGVuIHRoZSBidWZmZXIgaXMgbm90IGFsbG9jYXRlZCBsb2NhbGx5IHRocm91Z2ggYWxsb2NhdGUoKS4KKyAqCiAgKiBQYXJhbWV0ZXJzOgogICogICBidWZmZXIgLSB0aGUgYnVmZmVyIGZyb20gd2hpY2ggYSByZWZlcmVuY2Ugc2hvdWxkIGJlIHJlbW92ZWQKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXIuaCBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlci5oCmluZGV4IDdlY2E3YzEuLjllYjFhYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlci5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlci5oCkBAIC00ODEsNiArNDgxLDcgQEAKICAgICBzdHJ1Y3QgaHdfbW9kdWxlX3QgY29tbW9uOwogfSBod2NfbW9kdWxlX3Q7CiAKKyNkZWZpbmUgSFdDX0VSUk9SICgtMSkKIHR5cGVkZWYgc3RydWN0IGh3Y19jb21wb3Nlcl9kZXZpY2VfMSB7CiAgICAgLyoqCiAgICAgICogQ29tbW9uIG1ldGhvZHMgb2YgdGhlIGhhcmR3YXJlIGNvbXBvc2VyIGRldmljZS4gIFRoaXMgKm11c3QqIGJlIHRoZSBmaXJzdCBtZW1iZXIgb2YKQEAgLTcxNCw5ICs3MTUsOSBAQAogICAgICAqICgqZ2V0QWN0aXZlQ29uZmlnKSgpIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgaXMKICAgICAgKiBjdXJyZW50bHkgYWN0aXZlIG9uIHRoZSBjb25uZWN0ZWQgZGlzcGxheS4gVGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvCiAgICAgICogdGhlIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBoYW5kbGVzIHJldHVybmVkIGJ5IGdldERpc3BsYXlDb25maWdzLiBJZiB0aGVyZQotICAgICAqIGlzIG5vIGFjdGl2ZSBjb25maWd1cmF0aW9uLCAtMSBzaGFsbCBiZSByZXR1cm5lZC4KKyAgICAgKiBpcyBubyBhY3RpdmUgY29uZmlndXJhdGlvbiwgSFdDX0VSUk9SIHNoYWxsIGJlIHJldHVybmVkLgogICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBpbmRleCBvbiBzdWNjZXNzIG9yIC0xIG9uIGVycm9yLgorICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5kZXggb24gc3VjY2VzcyBvciBIV0NfRVJST1Igb24gZXJyb3IuCiAgICAgICoKICAgICAgKiBUaGlzIGZpZWxkIGlzIFJFUVVJUkVEIGZvciBIV0NfREVWSUNFX0FQSV9WRVJTSU9OXzFfNCBhbmQgbGF0ZXIuCiAgICAgICogSXQgc2hhbGwgYmUgTlVMTCBmb3IgcHJldmlvdXMgdmVyc2lvbnMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXIyLmggYi9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXIyLmgKaW5kZXggMzVlZWRiMC4uZDVhMGQ2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9od2NvbXBvc2VyMi5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3NlcjIuaApAQCAtOTQsNiArOTQsMTYgQEAKICAgICAgKiB0aGUgY2xpZW50LiBUaGlzIHdpbGwgcHJldmVudCB0aGUgY2xpZW50IGZyb20gYXBwbHlpbmcgdGhlIGNvbG9yCiAgICAgICogdHJhbnNmb3JtIGR1cmluZyBpdHMgY29tcG9zaXRpb24gc3RlcC4gKi8KICAgICBIV0MyX0NBUEFCSUxJVFlfU0tJUF9DTElFTlRfQ09MT1JfVFJBTlNGT1JNID0gMiwKKworICAgIC8qIFNwZWNpZmllcyB0aGF0IHRoZSBwcmVzZW50IGZlbmNlIG11c3Qgbm90IGJlIHVzZWQgYXMgYW4gYWNjdXJhdGUKKyAgICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWN0dWFsIHByZXNlbnQgdGltZSBvZiBhIGZyYW1lLgorICAgICAqIFRoaXMgY2FwYWJpbGl0eSBtdXN0IG5ldmVyIGJlIHNldCBieSBIV0MyIGRldmljZXMuCisgICAgICogVGhpcyBjYXBhYmlsaXR5IG1heSBiZSBzZXQgZm9yIEhXQzEgZGV2aWNlcyB0aGF0IHVzZSB0aGUKKyAgICAgKiBIV0MyT24xQWRhcHRlciB3aGVyZSBlbXVsYXRpb24gb2YgdGhlIHByZXNlbnQgZmVuY2UgdXNpbmcgdGhlIHJldGlyZQorICAgICAqIGZlbmNlIGlzIG5vdCBmZWFzaWJsZS4KKyAgICAgKiBJbiB0aGUgZnV0dXJlLCBDVFMgdGVzdHMgd2lsbCByZXF1aXJlIHByZXNlbnQgdGltZSB0byBiZSByZWxpYWJsZS4KKyAgICAgKi8KKyAgICBIV0MyX0NBUEFCSUxJVFlfUFJFU0VOVF9GRU5DRV9JU19OT1RfUkVMSUFCTEUgPSAzLAogfSBod2MyX2NhcGFiaWxpdHlfdDsKIAogLyogUG9zc2libGUgY29tcG9zaXRpb24gdHlwZXMgZm9yIGEgZ2l2ZW4gbGF5ZXIgKi8KQEAgLTMzNSw2ICszNDUsOCBAQAogICAgICAgICBjYXNlIEhXQzJfQ0FQQUJJTElUWV9TSURFQkFORF9TVFJFQU06IHJldHVybiAiU2lkZWJhbmRTdHJlYW0iOwogICAgICAgICBjYXNlIEhXQzJfQ0FQQUJJTElUWV9TS0lQX0NMSUVOVF9DT0xPUl9UUkFOU0ZPUk06CiAgICAgICAgICAgICAgICAgcmV0dXJuICJTa2lwQ2xpZW50Q29sb3JUcmFuc2Zvcm0iOworICAgICAgICBjYXNlIEhXQzJfQ0FQQUJJTElUWV9QUkVTRU5UX0ZFTkNFX0lTX05PVF9SRUxJQUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gIlByZXNlbnRGZW5jZUlzTm90UmVsaWFibGUiOwogICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVua25vd24iOwogICAgIH0KIH0KQEAgLTU1MSw2ICs1NjMsNyBAQAogICAgIEludmFsaWQgPSBIV0MyX0NBUEFCSUxJVFlfSU5WQUxJRCwKICAgICBTaWRlYmFuZFN0cmVhbSA9IEhXQzJfQ0FQQUJJTElUWV9TSURFQkFORF9TVFJFQU0sCiAgICAgU2tpcENsaWVudENvbG9yVHJhbnNmb3JtID0gSFdDMl9DQVBBQklMSVRZX1NLSVBfQ0xJRU5UX0NPTE9SX1RSQU5TRk9STSwKKyAgICBQcmVzZW50RmVuY2VJc05vdFJlbGlhYmxlID0gSFdDMl9DQVBBQklMSVRZX1BSRVNFTlRfRkVOQ0VfSVNfTk9UX1JFTElBQkxFLAogfTsKIFRPX1NUUklORyhod2MyX2NhcGFiaWxpdHlfdCwgQ2FwYWJpbGl0eSwgZ2V0Q2FwYWJpbGl0eU5hbWUpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlcl9kZWZzLmggYi9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXJfZGVmcy5oCmluZGV4IDE4YjMwYmMuLjFlODFlNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlcl9kZWZzLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9od2NvbXBvc2VyX2RlZnMuaApAQCAtMTM2LDkgKzEzNiw5IEBACiAgKi8KIGVudW0gewogICAgIC8qCi0gICAgICogSFdDX1NLSVBfTEFZRVIgaXMgc2V0IGJ5IFN1cmZhY2VGbG5nZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgSEFMCisgICAgICogSFdDX1NLSVBfTEFZRVIgaXMgc2V0IGJ5IFN1cmZhY2VGbGluZ2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIEhBTAogICAgICAqIHNoYWxsIG5vdCBjb25zaWRlciB0aGlzIGxheWVyIGZvciBjb21wb3NpdGlvbiBhcyBpdCB3aWxsIGJlIGhhbmRsZWQKLSAgICAgKiBieSBTdXJmYWNlRmxpbmdlciAoanVzdCBhcyBpZiBjb21wb3NpdGlvblR5cGUgd2FzIHNldCB0byBIV0NfT1ZFUkxBWSkuCisgICAgICogYnkgU3VyZmFjZUZsaW5nZXIgKGp1c3QgYXMgaWYgY29tcG9zaXRpb25UeXBlIHdhcyBzZXQgdG8gSFdDX0ZSQU1FQlVGRkVSKS4KICAgICAgKi8KICAgICBIV0NfU0tJUF9MQVlFUiA9IDB4MDAwMDAwMDEsCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUva2V5bWFzdGVyX2RlZnMuaCBiL2luY2x1ZGUvaGFyZHdhcmUva2V5bWFzdGVyX2RlZnMuaAppbmRleCAwZjliYzI3Li43ZDFiMzQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2tleW1hc3Rlcl9kZWZzLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9rZXltYXN0ZXJfZGVmcy5oCkBAIC0xMzUsNiArMTM1LDI2IEBACiAgICAgS01fVEFHX09TX1BBVENITEVWRUwgPSBLTV9VSU5UIHwgNzA2LCAgICAgICAgICAvKiBQYXRjaCBsZXZlbCBvZiBzeXN0ZW0gKGtleW1hc3RlcjIpICovCiAgICAgS01fVEFHX1VOSVFVRV9JRCA9IEtNX0JZVEVTIHwgNzA3LCAgICAgICAgICAgICAvKiBVc2VkIHRvIHByb3ZpZGUgdW5pcXVlIElEIGluIGF0dGVzdGF0aW9uICovCiAgICAgS01fVEFHX0FUVEVTVEFUSU9OX0NIQUxMRU5HRSA9IEtNX0JZVEVTIHwgNzA4LCAvKiBVc2VkIHRvIHByb3ZpZGUgY2hhbGxlbmdlIGluIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0FQUExJQ0FUSU9OX0lEID0gS01fQllURVMgfCA3MDksIC8qIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHNldCBvZiBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcHBsaWNhdGlvbnMgb2Ygd2hpY2ggb25lIGhhcyBpbml0aWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYSBrZXkgYXR0ZXN0YXRpb24gKi8KKyAgICBLTV9UQUdfQVRURVNUQVRJT05fSURfQlJBTkQgPSBLTV9CWVRFUyB8IDcxMCwgIC8qIFVzZWQgdG8gcHJvdmlkZSB0aGUgZGV2aWNlJ3MgYnJhbmQgbmFtZSB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gYXR0ZXN0YXRpb24gKi8KKyAgICBLTV9UQUdfQVRURVNUQVRJT05fSURfREVWSUNFID0gS01fQllURVMgfCA3MTEsIC8qIFVzZWQgdG8gcHJvdmlkZSB0aGUgZGV2aWNlJ3MgZGV2aWNlIG5hbWUgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0lEX1BST0RVQ1QgPSBLTV9CWVRFUyB8IDcxMiwgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBwcm9kdWN0IG5hbWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmNsdWRlZCBpbiBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9TRVJJQUwgPSBLTV9CWVRFUyB8IDcxMywgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBzZXJpYWwgbnVtYmVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmNsdWRlZCBpbiBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9JTUVJID0gS01fQllURVMgfCA3MTQsICAgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBJTUVJIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9NRUlEID0gS01fQllURVMgfCA3MTUsICAgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBNRUlEIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9NQU5VRkFDVFVSRVIgPSBLTV9CWVRFUyB8IDcxNiwgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3R1cmVyIG5hbWUgdG8gYmUgaW5jbHVkZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0lEX01PREVMID0gS01fQllURVMgfCA3MTcsICAvKiBVc2VkIHRvIHByb3ZpZGUgdGhlIGRldmljZSdzIG1vZGVsIG5hbWUgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluIGF0dGVzdGF0aW9uICovCiAKICAgICAvKiBUYWdzIHVzZWQgb25seSB0byBwcm92aWRlIGRhdGEgdG8gb3IgcmVjZWl2ZSBkYXRhIGZyb20gb3BlcmF0aW9ucyAqLwogICAgIEtNX1RBR19BU1NPQ0lBVEVEX0RBVEEgPSBLTV9CWVRFUyB8IDEwMDAsIC8qIFVzZWQgdG8gcHJvdmlkZSBhc3NvY2lhdGVkIGRhdGEgZm9yIEFFQUQgbW9kZXMuICovCkBAIC00MjcsNiArNDQ3LDggQEAKICAgICBLTV9FUlJPUl9LRVlfUkVRVUlSRVNfVVBHUkFERSA9IC02MiwKICAgICBLTV9FUlJPUl9BVFRFU1RBVElPTl9DSEFMTEVOR0VfTUlTU0lORyA9IC02MywKICAgICBLTV9FUlJPUl9LRVlNQVNURVJfTk9UX0NPTkZJR1VSRUQgPSAtNjQsCisgICAgS01fRVJST1JfQVRURVNUQVRJT05fQVBQTElDQVRJT05fSURfTUlTU0lORyA9IC02NSwKKyAgICBLTV9FUlJPUl9DQU5OT1RfQVRURVNUX0lEUyA9IC02NiwKIAogICAgIEtNX0VSUk9SX1VOSU1QTEVNRU5URUQgPSAtMTAwLAogICAgIEtNX0VSUk9SX1ZFUlNJT05fTUlTTUFUQ0ggPSAtMTAxLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9zZW5zb3JzLWJhc2UuaCBiL2luY2x1ZGUvaGFyZHdhcmUvc2Vuc29ycy1iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmNjIyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvc2Vuc29ycy1iYXNlLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IGhpZGwtZ2VuLiBEbyBub3QgZWRpdCBtYW51YWxseS4KKy8vIFNvdXJjZTogYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3JzQDEuMAorLy8gUm9vdDogYW5kcm9pZC5oYXJkd2FyZTpoYXJkd2FyZS9pbnRlcmZhY2VzCisKKyNpZm5kZWYgSElETF9HRU5FUkFURURfQU5EUk9JRF9IQVJEV0FSRV9TRU5TT1JTX1YxXzBfRVhQT1JURURfQ09OU1RBTlRTX0hfCisjZGVmaW5lIEhJRExfR0VORVJBVEVEX0FORFJPSURfSEFSRFdBUkVfU0VOU09SU19WMV8wX0VYUE9SVEVEX0NPTlNUQU5UU19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2VudW0geworICAgIFNFTlNPUl9IQUxfTk9STUFMX01PREUgPSAwLAorICAgIFNFTlNPUl9IQUxfREFUQV9JTkpFQ1RJT05fTU9ERSA9IDEsCit9OworCitlbnVtIHsKKyAgICBTRU5TT1JfVFlQRV9NRVRBX0RBVEEgPSAwLAorICAgIFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIgPSAxLAorICAgIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEID0gMiwKKyAgICBTRU5TT1JfVFlQRV9PUklFTlRBVElPTiA9IDMsCisgICAgU0VOU09SX1RZUEVfR1lST1NDT1BFID0gNCwKKyAgICBTRU5TT1JfVFlQRV9MSUdIVCA9IDUsCisgICAgU0VOU09SX1RZUEVfUFJFU1NVUkUgPSA2LAorICAgIFNFTlNPUl9UWVBFX1RFTVBFUkFUVVJFID0gNywKKyAgICBTRU5TT1JfVFlQRV9QUk9YSU1JVFkgPSA4LAorICAgIFNFTlNPUl9UWVBFX0dSQVZJVFkgPSA5LAorICAgIFNFTlNPUl9UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04gPSAxMCwKKyAgICBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1IgPSAxMSwKKyAgICBTRU5TT1JfVFlQRV9SRUxBVElWRV9IVU1JRElUWSA9IDEyLAorICAgIFNFTlNPUl9UWVBFX0FNQklFTlRfVEVNUEVSQVRVUkUgPSAxMywKKyAgICBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRF9VTkNBTElCUkFURUQgPSAxNCwKKyAgICBTRU5TT1JfVFlQRV9HQU1FX1JPVEFUSU9OX1ZFQ1RPUiA9IDE1LAorICAgIFNFTlNPUl9UWVBFX0dZUk9TQ09QRV9VTkNBTElCUkFURUQgPSAxNiwKKyAgICBTRU5TT1JfVFlQRV9TSUdOSUZJQ0FOVF9NT1RJT04gPSAxNywKKyAgICBTRU5TT1JfVFlQRV9TVEVQX0RFVEVDVE9SID0gMTgsCisgICAgU0VOU09SX1RZUEVfU1RFUF9DT1VOVEVSID0gMTksCisgICAgU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfUk9UQVRJT05fVkVDVE9SID0gMjAsCisgICAgU0VOU09SX1RZUEVfSEVBUlRfUkFURSA9IDIxLAorICAgIFNFTlNPUl9UWVBFX1RJTFRfREVURUNUT1IgPSAyMiwKKyAgICBTRU5TT1JfVFlQRV9XQUtFX0dFU1RVUkUgPSAyMywKKyAgICBTRU5TT1JfVFlQRV9HTEFOQ0VfR0VTVFVSRSA9IDI0LAorICAgIFNFTlNPUl9UWVBFX1BJQ0tfVVBfR0VTVFVSRSA9IDI1LAorICAgIFNFTlNPUl9UWVBFX1dSSVNUX1RJTFRfR0VTVFVSRSA9IDI2LAorICAgIFNFTlNPUl9UWVBFX0RFVklDRV9PUklFTlRBVElPTiA9IDI3LAorICAgIFNFTlNPUl9UWVBFX1BPU0VfNkRPRiA9IDI4LAorICAgIFNFTlNPUl9UWVBFX1NUQVRJT05BUllfREVURUNUID0gMjksCisgICAgU0VOU09SX1RZUEVfTU9USU9OX0RFVEVDVCA9IDMwLAorICAgIFNFTlNPUl9UWVBFX0hFQVJUX0JFQVQgPSAzMSwKKyAgICBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBID0gMzIsCisgICAgU0VOU09SX1RZUEVfQURESVRJT05BTF9JTkZPID0gMzMsCisgICAgU0VOU09SX1RZUEVfTE9XX0xBVEVOQ1lfT0ZGQk9EWV9ERVRFQ1QgPSAzNCwKKyAgICBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSX1VOQ0FMSUJSQVRFRCA9IDM1LAorICAgIFNFTlNPUl9UWVBFX0RFVklDRV9QUklWQVRFX0JBU0UgPSA2NTUzNiwgLy8gMHgxMDAwMAorfTsKKworZW51bSB7CisgICAgU0VOU09SX0ZMQUdfV0FLRV9VUCA9IDF1LCAvLyAxCisgICAgU0VOU09SX0ZMQUdfQ09OVElOVU9VU19NT0RFID0gMHUsIC8vIDAKKyAgICBTRU5TT1JfRkxBR19PTl9DSEFOR0VfTU9ERSA9IDJ1LCAvLyAyCisgICAgU0VOU09SX0ZMQUdfT05FX1NIT1RfTU9ERSA9IDR1LCAvLyA0CisgICAgU0VOU09SX0ZMQUdfU1BFQ0lBTF9SRVBPUlRJTkdfTU9ERSA9IDZ1LCAvLyA2CisgICAgU0VOU09SX0ZMQUdfREFUQV9JTkpFQ1RJT04gPSAxNnUsIC8vIDB4MTAKKyAgICBTRU5TT1JfRkxBR19EWU5BTUlDX1NFTlNPUiA9IDMydSwgLy8gMHgyMAorICAgIFNFTlNPUl9GTEFHX0FERElUSU9OQUxfSU5GTyA9IDY0dSwgLy8gMHg0MAorICAgIFNFTlNPUl9GTEFHX0RJUkVDVF9DSEFOTkVMX0FTSE1FTSA9IDEwMjR1LCAvLyAweDQwMAorICAgIFNFTlNPUl9GTEFHX0RJUkVDVF9DSEFOTkVMX0dSQUxMT0MgPSAyMDQ4dSwgLy8gMHg4MDAKKyAgICBTRU5TT1JfRkxBR19NQVNLX1JFUE9SVElOR19NT0RFID0gMTR1LCAvLyAweEUKKyAgICBTRU5TT1JfRkxBR19NQVNLX0RJUkVDVF9SRVBPUlQgPSA4OTZ1LCAvLyAweDM4MAorICAgIFNFTlNPUl9GTEFHX01BU0tfRElSRUNUX0NIQU5ORUwgPSAzMDcydSwgLy8gMHhDMDAKK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgU0VOU09SX0ZMQUdfU0hJRlRfUkVQT1JUSU5HX01PREUgPSAxLAorICAgIFNFTlNPUl9GTEFHX1NISUZUX0RBVEFfSU5KRUNUSU9OID0gNCwKKyAgICBTRU5TT1JfRkxBR19TSElGVF9EWU5BTUlDX1NFTlNPUiA9IDUsCisgICAgU0VOU09SX0ZMQUdfU0hJRlRfQURESVRJT05BTF9JTkZPID0gNiwKKyAgICBTRU5TT1JfRkxBR19TSElGVF9ESVJFQ1RfUkVQT1JUID0gNywKKyAgICBTRU5TT1JfRkxBR19TSElGVF9ESVJFQ1RfQ0hBTk5FTCA9IDEwLAorfSBzZW5zb3JfZmxhZ19zaGlmdF90OworCitlbnVtIHsKKyAgICBTRU5TT1JfU1RBVFVTX05PX0NPTlRBQ1QgPSAtMSwgLy8gKC0xKQorICAgIFNFTlNPUl9TVEFUVVNfVU5SRUxJQUJMRSA9IDAsCisgICAgU0VOU09SX1NUQVRVU19BQ0NVUkFDWV9MT1cgPSAxLAorICAgIFNFTlNPUl9TVEFUVVNfQUNDVVJBQ1lfTUVESVVNID0gMiwKKyAgICBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0hJR0ggPSAzLAorfTsKKworZW51bSB7CisgICAgTUVUQV9EQVRBX0ZMVVNIX0NPTVBMRVRFID0gMXUsIC8vIDEKK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgQUlORk9fQkVHSU4gPSAwdSwgLy8gMAorICAgIEFJTkZPX0VORCA9IDF1LCAvLyAxCisgICAgQUlORk9fVU5UUkFDS0VEX0RFTEFZID0gNjU1MzZ1LCAvLyAweDEwMDAwCisgICAgQUlORk9fSU5URVJOQUxfVEVNUEVSQVRVUkUgPSA2NTUzN3UsIC8vIDY1NTM3CisgICAgQUlORk9fVkVDM19DQUxJQlJBVElPTiA9IDY1NTM4dSwgLy8gNjU1MzgKKyAgICBBSU5GT19TRU5TT1JfUExBQ0VNRU5UID0gNjU1Mzl1LCAvLyA2NTUzOQorICAgIEFJTkZPX1NBTVBMSU5HID0gNjU1NDB1LCAvLyA2NTU0MAorICAgIEFJTkZPX0NIQU5ORUxfTk9JU0UgPSAxMzEwNzJ1LCAvLyAweDIwMDAwCisgICAgQUlORk9fQ0hBTk5FTF9TQU1QTEVSID0gMTMxMDczdSwgLy8gMTMxMDczCisgICAgQUlORk9fQ0hBTk5FTF9GSUxURVIgPSAxMzEwNzR1LCAvLyAxMzEwNzQKKyAgICBBSU5GT19DSEFOTkVMX0xJTkVBUl9UUkFOU0ZPUk0gPSAxMzEwNzV1LCAvLyAxMzEwNzUKKyAgICBBSU5GT19DSEFOTkVMX05PTkxJTkVBUl9NQVAgPSAxMzEwNzZ1LCAvLyAxMzEwNzYKKyAgICBBSU5GT19DSEFOTkVMX1JFU0FNUExFUiA9IDEzMTA3N3UsIC8vIDEzMTA3NworICAgIEFJTkZPX0xPQ0FMX0dFT01BR05FVElDX0ZJRUxEID0gMTk2NjA4dSwgLy8gMHgzMDAwMAorICAgIEFJTkZPX0xPQ0FMX0dSQVZJVFkgPSAxOTY2MDl1LCAvLyAxOTY2MDkKKyAgICBBSU5GT19ET0NLX1NUQVRFID0gMTk2NjEwdSwgLy8gMTk2NjEwCisgICAgQUlORk9fSElHSF9QRVJGT1JNQU5DRV9NT0RFID0gMTk2NjExdSwgLy8gMTk2NjExCisgICAgQUlORk9fTUFHTkVUSUNfRklFTERfQ0FMSUJSQVRJT04gPSAxOTY2MTJ1LCAvLyAxOTY2MTIKKyAgICBBSU5GT19DVVNUT01fU1RBUlQgPSAyNjg0MzU0NTZ1LCAvLyAweDEwMDAwMDAwCisgICAgQUlORk9fREVCVUdHSU5HX1NUQVJUID0gMTA3Mzc0MTgyNHUsIC8vIDB4NDAwMDAwMDAKK30gYWRkaXRpb25hbF9pbmZvX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTRU5TT1JfRElSRUNUX1JBVEVfU1RPUCA9IDAsCisgICAgU0VOU09SX0RJUkVDVF9SQVRFX05PUk1BTCA9IDEsCisgICAgU0VOU09SX0RJUkVDVF9SQVRFX0ZBU1QgPSAyLAorICAgIFNFTlNPUl9ESVJFQ1RfUkFURV9WRVJZX0ZBU1QgPSAzLAorfSBkaXJlY3RfcmF0ZV9sZXZlbF90OworCit0eXBlZGVmIGVudW0geworICAgIFNFTlNPUl9ESVJFQ1RfTUVNX1RZUEVfQVNITUVNID0gMSwKKyAgICBTRU5TT1JfRElSRUNUX01FTV9UWVBFX0dSQUxMT0MgPSAyLAorfSBkaXJlY3RfbWVtX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTRU5TT1JfRElSRUNUX0ZNVF9TRU5TT1JTX0VWRU5UID0gMSwKK30gZGlyZWN0X2Zvcm1hdF90OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIEhJRExfR0VORVJBVEVEX0FORFJPSURfSEFSRFdBUkVfU0VOU09SU19WMV8wX0VYUE9SVEVEX0NPTlNUQU5UU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9zZW5zb3JzLmggYi9pbmNsdWRlL2hhcmR3YXJlL3NlbnNvcnMuaAppbmRleCAzMjJhYmU2Li5kZGU5OTdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL3NlbnNvcnMuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL3NlbnNvcnMuaApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KIAorI2luY2x1ZGUgInNlbnNvcnMtYmFzZS5oIgorCiBfX0JFR0lOX0RFQ0xTCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU0LDE0ICs1NiwxNSBAQAogI2RlZmluZSBTRU5TT1JTX0hBUkRXQVJFX1BPTEwgICAgICAgInBvbGwiCiAKIC8qKgotICogSGFuZGxlcyBtdXN0IGJlIGhpZ2hlciB0aGFuIFNFTlNPUlNfSEFORExFX0JBU0UgYW5kIG11c3QgYmUgdW5pcXVlLgotICogQSBIYW5kbGUgaWRlbnRpZmllcyBhIGdpdmVuIHNlbnNvcnMuIFRoZSBoYW5kbGUgaXMgdXNlZCB0byBhY3RpdmF0ZQotICogYW5kL29yIGRlYWN0aXZhdGUgc2Vuc29ycy4KLSAqIEluIHRoaXMgdmVyc2lvbiBvZiB0aGUgQVBJIHRoZXJlIGNhbiBvbmx5IGJlIDI1NiBoYW5kbGVzLgorICogU2Vuc29yIGhhbmRsZSBpcyBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIElOVDMyX01BWC4KKyAqCisgKiAqKioqIERlcHJlY2F0ZWQgKioqKgorICogRGVmaW5lZCB2YWx1ZXMgYmVsb3cgYXJlIGtlcHQgZm9yIGNvZGUgY29tcGF0aWJpbGl0eS4gTm90ZSBzZW5zb3IgaGFuZGxlIGNhbiBiZSBhcyBsYXJnZSBhcworICogSU5UMzJfTUFYLgogICovCiAjZGVmaW5lIFNFTlNPUlNfSEFORExFX0JBU0UgICAgICAgICAgICAgMAotI2RlZmluZSBTRU5TT1JTX0hBTkRMRV9CSVRTICAgICAgICAgICAgIDgKLSNkZWZpbmUgU0VOU09SU19IQU5ETEVfQ09VTlQgICAgICAgICAgICAoMTw8U0VOU09SU19IQU5ETEVfQklUUykKKyNkZWZpbmUgU0VOU09SU19IQU5ETEVfQklUUyAgICAgICAgICAgICAzMQorI2RlZmluZSBTRU5TT1JTX0hBTkRMRV9DT1VOVCAgICAgICAgICAgICgxdWxsPDxTRU5TT1JTX0hBTkRMRV9CSVRTKQogCiAKIC8qCkBAIC04Miw3ICs4NSw3IEBACiAgKi8KIGVudW0gewogICAgIC8qIGEgcHJldmlvdXMgZmx1c2ggb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQgKi8KLSAgICBNRVRBX0RBVEFfRkxVU0hfQ09NUExFVEUgPSAxLAorICAgIC8vIE1FVEFfREFUQV9GTFVTSF9DT01QTEVURSA9IDEsCiAgICAgTUVUQV9EQVRBX1ZFUlNJT04gICAvKiBhbHdheXMgbGFzdCwgbGVhdmUgYXV0by1hc3NpZ25lZCAqLwogfTsKIApAQCAtOTQsMjcgKzk3LDExIEBACiAjZGVmaW5lIFNFTlNPUl9QRVJNSVNTSU9OX0JPRFlfU0VOU09SUyAiYW5kcm9pZC5wZXJtaXNzaW9uLkJPRFlfU0VOU09SUyIKIAogLyoKLSAqIEF2YWlsYWJpbGl0eTogU0VOU09SU19ERVZJQ0VfQVBJX1ZFUlNJT05fMV80Ci0gKiBTZW5zb3IgSEFMIG1vZGVzIHVzZWQgaW4gc2V0X29wZXJhdGlvbl9tb2RlIG1ldGhvZAorICogc2Vuc29yIGZsYWdzIGxlZ2FjeSBuYW1lcworICoKKyAqIHBsZWFzZSB1c2UgU0VOU09SX0ZMQUdfKiBkaXJlY3RseSBmb3IgbmV3IGltcGxlbWVudGF0aW9uLgorICogQHNlZSBzZW5zb3JfdAogICovCi1lbnVtIHsKLSAgICAvKgotICAgICAqIE9wZXJhdGluZyBtb2RlcyBmb3IgdGhlIEhBTC4KLSAgICAgKi8KLQotICAgIC8qCi0gICAgICogTm9ybWFsIG1vZGUgb3BlcmF0aW9uLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHN0YXRlIG9mIG9wZXJhdGlvbi4KLSAgICAgKiBUaGUgSEFMIHNoYWxsIGluaXRpYWxpemUgaW50byB0aGlzIG1vZGUgb24gZGV2aWNlIHN0YXJ0dXAuCi0gICAgICovCi0gICAgU0VOU09SX0hBTF9OT1JNQUxfTU9ERSAgICAgICAgPSAwLAotCi0gICAgLyoKLSAgICAgKiBEYXRhIEluamVjdGlvbiBtb2RlLiBJbiB0aGlzIG1vZGUsIHRoZSBkZXZpY2Ugc2hhbGwgbm90IHNvdXJjZSBkYXRhIGZyb20gdGhlCi0gICAgICogcGh5c2ljYWwgc2Vuc29ycyBhcyBpdCB3b3VsZCBpbiBub3JtYWwgbW9kZS4gSW5zdGVhZCBzZW5zb3IgZGF0YSBpcwotICAgICAqIGluamVjdGVkIGJ5IHRoZSBzZW5zb3Igc2VydmljZS4KLSAgICAgKi8KLSAgICBTRU5TT1JfSEFMX0RBVEFfSU5KRUNUSU9OX01PREUgICAgICA9IDB4MQotfTsKIAogI2RlZmluZSBTRU5TT1JfRkxBR19NQVNLKG5iaXQsIHNoaWZ0KSAgICgoKDE8PChuYml0KSktMSk8PChzaGlmdCkpCiAjZGVmaW5lIFNFTlNPUl9GTEFHX01BU0tfMShzaGlmdCkgICAgICAgU0VOU09SX0ZMQUdfTUFTSygxLCBzaGlmdCkKQEAgLTEyMiw3NDkgKzEwOSw4MiBAQAogLyoKICAqIE1hc2sgYW5kIHNoaWZ0IGZvciByZXBvcnRpbmcgbW9kZSBzZW5zb3IgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KICAqLwotI2RlZmluZSBSRVBPUlRJTkdfTU9ERV9TSElGVCAgICAgICAgICAgICgxKQorI2RlZmluZSBSRVBPUlRJTkdfTU9ERV9TSElGVCAgICAgICAgICAgIFNFTlNPUl9GTEFHX1NISUZUX1JFUE9SVElOR19NT0RFCiAjZGVmaW5lIFJFUE9SVElOR19NT0RFX05CSVQgICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFJFUE9SVElOR19NT0RFX01BU0sgICAgICAgICAgICAgU0VOU09SX0ZMQUdfTUFTSyhSRVBPUlRJTkdfTU9ERV9OQklULCBSRVBPUlRJTkdfTU9ERV9TSElGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweEUKKyNkZWZpbmUgUkVQT1JUSU5HX01PREVfTUFTSyAgICAgICAgICAgICBTRU5TT1JfRkxBR19NQVNLX1JFUE9SVElOR19NT0RFCiAKIC8qCiAgKiBNYXNrIGFuZCBzaGlmdCBmb3IgZGF0YV9pbmplY3Rpb24gbW9kZSBzZW5zb3IgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KICAqLwotI2RlZmluZSBEQVRBX0lOSkVDVElPTl9TSElGVCAgICAgICAgICAgICg0KQotI2RlZmluZSBEQVRBX0lOSkVDVElPTl9NQVNLICAgICAgICAgICAgIFNFTlNPUl9GTEFHX01BU0tfMShEQVRBX0lOSkVDVElPTl9TSElGVCkgLy8weDEwCisjZGVmaW5lIERBVEFfSU5KRUNUSU9OX1NISUZUICAgICAgICAgICAgU0VOU09SX0ZMQUdfU0hJRlRfREFUQV9JTkpFQ1RJT04KKyNkZWZpbmUgREFUQV9JTkpFQ1RJT05fTUFTSyAgICAgICAgICAgICBTRU5TT1JfRkxBR19EQVRBX0lOSkVDVElPTgogCiAvKgogICogTWFzayBhbmQgc2hpZnQgZm9yIGR5bmFtaWMgc2Vuc29yIGZsYWcuCiAgKi8KLSNkZWZpbmUgRFlOQU1JQ19TRU5TT1JfU0hJRlQgICAgICAgICAgICAoNSkKLSNkZWZpbmUgRFlOQU1JQ19TRU5TT1JfTUFTSyAgICAgICAgICAgICBTRU5TT1JfRkxBR19NQVNLXzEoRFlOQU1JQ19TRU5TT1JfU0hJRlQpIC8vMHgyMAorI2RlZmluZSBEWU5BTUlDX1NFTlNPUl9TSElGVCAgICAgICAgICAgIFNFTlNPUl9GTEFHX1NISUZUX0RZTkFNSUNfU0VOU09SCisjZGVmaW5lIERZTkFNSUNfU0VOU09SX01BU0sgICAgICAgICAgICAgU0VOU09SX0ZMQUdfRFlOQU1JQ19TRU5TT1IKIAogLyoKICAqIE1hc2sgYW5kIHNoaWZ0IGZvciBzZW5zb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdXBwb3J0LgogICovCi0jZGVmaW5lIEFERElUSU9OQUxfSU5GT19TSElGVCAgICAgICAgICAgKDYpCi0jZGVmaW5lIEFERElUSU9OQUxfSU5GT19NQVNLICAgICAgICAgICAgU0VOU09SX0ZMQUdfTUFTS18xKEFERElUSU9OQUxfSU5GT19TSElGVCkgLy8weDQwCisjZGVmaW5lIEFERElUSU9OQUxfSU5GT19TSElGVCAgICAgICAgICAgU0VOU09SX0ZMQUdfU0hJRlRfQURESVRJT05BTF9JTkZPCisjZGVmaW5lIEFERElUSU9OQUxfSU5GT19NQVNLICAgICAgICAgICAgU0VOU09SX0ZMQUdfQURESVRJT05BTF9JTkZPCiAKIC8qCi0gKiBBdmFpbGFiaWxpdHk6IFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzFfMwotICogU2Vuc29yIGZsYWdzIHVzZWQgaW4gc2Vuc29yX3QuZmxhZ3MuCisgKiBMZWdhY3kgYWxpYXMgb2YgU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQuCisgKgorICogUHJldmlvdXNseSwgdGhlIHR5cGUgb2YgYSBzZW5zb3IgbWVhc3VyaW5nIGxvY2FsIG1hZ25ldGljIGZpZWxkIGlzIG5hbWVkCisgKiBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19GSUVMRCBhbmQgU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQgaXMgaXRzIGFsaWFzLgorICogU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQgaXMgcmVkZWZpbmVkIGFzIHByaW1hcnkgbmFtZSB0byBhdm9pZCBjb25mdXNpb24uCisgKiBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19GSUVMRCBpcyB0aGUgYWxpYXMgYW5kIGlzIGRlcHJlY2F0aW5nLiBOZXcgaW1wbGVtZW50YXRpb24gbXVzdCBub3QgdXNlCisgKiBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19GSUVMRC4KICAqLwotZW51bSB7Ci0gICAgLyoKLSAgICAgKiBXaGV0aGVyIHRoaXMgc2Vuc29yIHdha2VzIHVwIHRoZSBBUCBmcm9tIHN1c3BlbmQgbW9kZSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlLiAgV2hlbmV2ZXIKLSAgICAgKiBzZW5zb3IgZXZlbnRzIGFyZSBkZWxpdmVyZWQgZnJvbSBhIHdha2VfdXAgc2Vuc29yLCB0aGUgZHJpdmVyIG5lZWRzIHRvIGhvbGQgYSB3YWtlX2xvY2sgdGlsbAotICAgICAqIHRoZSBldmVudHMgYXJlIHJlYWQgYnkgdGhlIFNlbnNvclNlcnZpY2UgaS5lIHRpbGwgc2Vuc29yc19wb2xsX2RldmljZV90LnBvbGwoKSBpcyBjYWxsZWQgdGhlCi0gICAgICogbmV4dCB0aW1lLiBPbmNlIHBvbGwgaXMgY2FsbGVkIGFnYWluIGl0IG1lYW5zIGV2ZW50cyBoYXZlIGJlZW4gcmVhZCBieSB0aGUgU2Vuc29yU2VydmljZSwgdGhlCi0gICAgICogZHJpdmVyIGNhbiBzYWZlbHkgcmVsZWFzZSB0aGUgd2FrZV9sb2NrLiBTZW5zb3JTZXJ2aWNlIHdpbGwgY29udGludWUgdG8gaG9sZCBhIHdha2VfbG9jayB0aWxsCi0gICAgICogdGhlIGFwcCBhY3R1YWxseSByZWFkcyB0aGUgZXZlbnRzLgotICAgICAqLwotICAgIFNFTlNPUl9GTEFHX1dBS0VfVVAgPSAxVSA8PCAwLAotICAgIC8qCi0gICAgICogUmVwb3J0aW5nIG1vZGVzIGZvciB2YXJpb3VzIHNlbnNvcnMuIEVhY2ggc2Vuc29yIHdpbGwgaGF2ZSBleGFjdGx5IG9uZSBvZiB0aGVzZSBtb2RlcyBzZXQuCi0gICAgICogVGhlIGxlYXN0IHNpZ25pZmljYW50IDJuZCwgM3JkIGFuZCA0dGggYml0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgZm91ciBwb3NzaWJsZSByZXBvcnRpbmcKLSAgICAgKiBtb2Rlcy4KLSAgICAgKi8KLSAgICBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREUgICAgICAgID0gMCwgICAgLy8gMDAwMAotICAgIFNFTlNPUl9GTEFHX09OX0NIQU5HRV9NT0RFICAgICAgICAgPSAweDIsICAvLyAwMDEwCi0gICAgU0VOU09SX0ZMQUdfT05FX1NIT1RfTU9ERSAgICAgICAgICA9IDB4NCwgIC8vIDAxMDAKLSAgICBTRU5TT1JfRkxBR19TUEVDSUFMX1JFUE9SVElOR19NT0RFID0gMHg2LCAgLy8gMDExMAotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhpcyBmbGFnIGlmIHRoZSBzZW5zb3Igc3VwcG9ydHMgZGF0YV9pbmplY3Rpb24gbW9kZSBhbmQgYWxsb3dzIGRhdGEgdG8gYmUgaW5qZWN0ZWQKLSAgICAgKiBmcm9tIHRoZSBTZW5zb3JTZXJ2aWNlLiBXaGVuIGluIGRhdGFfaW5qZWN0aW9uIE9OTFkgc2Vuc29ycyB3aXRoIHRoaXMgZmxhZyBzZXQgYXJlIGluamVjdGVkCi0gICAgICogc2Vuc29yIGRhdGEgYW5kIG9ubHkgc2Vuc29ycyB3aXRoIHRoaXMgZmxhZyBzZXQgYXJlIGFjdGl2YXRlZC4gRWc6IEFjY2VsZXJvbWV0ZXIgYW5kIFN0ZXAKLSAgICAgKiBDb3VudGVyIHNlbnNvcnMgY2FuIGJlIHNldCB3aXRoIHRoaXMgZmxhZyBhbmQgU2Vuc29yU2VydmljZSB3aWxsIGluamVjdCBhY2NlbGVyb21ldGVyIGRhdGEKLSAgICAgKiBhbmQgcmVhZCB0aGUgY29ycmVzcG9uZGluZyBzdGVwIGNvdW50cy4KLSAgICAgKi8KLSAgICBTRU5TT1JfRkxBR19TVVBQT1JUU19EQVRBX0lOSkVDVElPTiA9IERBVEFfSU5KRUNUSU9OX01BU0ssIC8vIDEgMDAwMAotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhpcyBmbGFnIGlmIHRoZSBzZW5zb3IgaXMgYSBkeW5hbWljYWxseSBjb25uZWN0ZWQgc2Vuc29yLiBTZWUKLSAgICAgKiBkeW5hbWljX3NlbnNvcl9tZXRhX2V2ZW50X3QgYW5kIFNFTlNPUl9UWVBFX0RZTkFNSUNfU0VOU09SX01FVEEgZm9yIGRldGFpbHMuCi0gICAgICovCi0gICAgU0VOU09SX0ZMQUdfRFlOQU1JQ19TRU5TT1IgPSBEWU5BTUlDX1NFTlNPUl9NQVNLLAotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhpcyBmbGFnIGlmIHNlbnNvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIHN1cHBvcnRlZC4gU2VlIFNFTlNPUl9UWVBFX0FERElUSU9OQUxfSU5GTwotICAgICAqIGFuZCBhZGRpdGlvbmFsX2luZm9fZXZlbnRfdCBmb3IgZGV0YWlscy4KLSAgICAgKi8KLSAgICBTRU5TT1JfRkxBR19BRERJVElPTkFMX0lORk8gPSBBRERJVElPTkFMX0lORk9fTUFTSwotfTsKLQorI2RlZmluZSBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19GSUVMRCAgIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxECiAKIC8qCi0gKiBTZW5zb3IgdHlwZQorICogU2Vuc29yIHN0cmluZyB0eXBlcyBmb3IgQW5kcm9pZCBkZWZpbmVkIHNlbnNvciB0eXBlcy4KICAqCi0gKiBFYWNoIHNlbnNvciBoYXMgYSB0eXBlIHdoaWNoIGRlZmluZXMgd2hhdCB0aGlzIHNlbnNvciBtZWFzdXJlcyBhbmQgaG93Ci0gKiBtZWFzdXJlcyBhcmUgcmVwb3J0ZWQuIFNlZSB0aGUgQmFzZSBzZW5zb3JzIGFuZCBDb21wb3NpdGUgc2Vuc29ycyBsaXN0cwotICogZm9yIGNvbXBsZXRlIGRlc2NyaXB0aW9uczoKLSAqIGh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9zZW5zb3JzL2Jhc2VfdHJpZ2dlcnMuaHRtbAotICogaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL3NlbnNvcnMvY29tcG9zaXRlX3NlbnNvcnMuaHRtbAorICogRm9yIEFuZHJvaWQgZGVmaW5lZCBzZW5zb3IgdHlwZXMsIHN0cmluZyB0eXBlIHdpbGwgYmUgb3ZlcnJpZGUgaW4gc2Vuc29yIHNlcnZpY2UgYW5kIHRodXMgbm8KKyAqIGxvbmdlciBuZWVkZWQgdG8gYmUgYWRkZWQgdG8gc2Vuc29yX3QgZGF0YSBzdHJ1Y3R1cmUuCiAgKgotICogRGV2aWNlIG1hbnVmYWN0dXJlcnMgKE9FTXMpIGNhbiBkZWZpbmUgdGhlaXIgb3duIHNlbnNvciB0eXBlcywgZm9yCi0gKiB0aGVpciBwcml2YXRlIHVzZSBieSBhcHBsaWNhdGlvbnMgb3Igc2VydmljZXMgcHJvdmlkZWQgYnkgdGhlbS4gU3VjaAotICogc2Vuc29yIHR5cGVzIGFyZSBzcGVjaWZpYyB0byBhbiBPRU0gYW5kIGNhbid0IGJlIGV4cG9zZWQgaW4gdGhlIFNESy4KLSAqIFRoZXNlIHR5cGVzIG11c3Qgc3RhcnQgYXQgU0VOU09SX1RZUEVfREVWSUNFX1BSSVZBVEVfQkFTRS4KLSAqCi0gKiBBbGwgc2Vuc29ycyBkZWZpbmVkIG91dHNpZGUgb2YgdGhlIGRldmljZSBwcml2YXRlIHJhbmdlIG11c3QgY29ycmVzcG9uZCB0bwotICogYSB0eXBlIGRlZmluZWQgaW4gdGhpcyBmaWxlLCBhbmQgbXVzdCBzYXRpc2Z5IHRoZSBjaGFyYWN0ZXJpc3RpY3MgbGlzdGVkIGluCi0gKiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlbnNvciB0eXBlLgotICoKLSAqIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiBTRU5TT1JTX0RFVklDRV9BUElfVkVSU0lPTl8xXzIsIGVhY2ggc2Vuc29yIGFsc28KLSAqIGhhcyBhIHN0cmluZ1R5cGUuCi0gKiAgLSBTdHJpbmdUeXBlIG9mIHNlbnNvcnMgaW5zaWRlIG9mIHRoZSBkZXZpY2UgcHJpdmF0ZSByYW5nZSBNVVNUIGJlIHByZWZpeGVkCi0gKiAgICBieSB0aGUgc2Vuc29yIHByb3ZpZGVyJ3Mgb3IgT0VNIHJldmVyc2UgZG9tYWluIG5hbWUuIEluIHBhcnRpY3VsYXIsIHRoZXkKLSAqICAgIGNhbm5vdCB1c2UgdGhlICJhbmRyb2lkLnNlbnNvciIgcHJlZml4LgotICogIC0gU3RyaW5nVHlwZSBvZiBzZW5zb3JzIG91dHNpZGUgb2YgdGhlIGRldmljZSBwcml2YXRlIHJhbmdlIE1VU1QgY29ycmVzcG9uZAotICogICAgdG8gdGhlIG9uZSBkZWZpbmVkIGluIHRoaXMgZmlsZSAoc3RhcnRpbmcgd2l0aCAiYW5kcm9pZC5zZW5zb3IiKS4KLSAqICAgIEZvciBleGFtcGxlLCBhY2NlbGVyb21ldGVycyBtdXN0IGhhdmUKLSAqICAgICAgdHlwZT1TRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSIGFuZAotICogICAgICBzdHJpbmdUeXBlPVNFTlNPUl9TVFJJTkdfVFlQRV9BQ0NFTEVST01FVEVSCi0gKgotICogV2hlbiBhbmRyb2lkIGludHJvZHVjZXMgYSBuZXcgc2Vuc29yIHR5cGUgdGhhdCBjYW4gcmVwbGFjZSBhbiBPRU0tZGVmaW5lZAotICogc2Vuc29yIHR5cGUsIHRoZSBPRU0gbXVzdCB1c2UgdGhlIG9mZmljaWFsIHNlbnNvciB0eXBlIGFuZCBzdHJpbmdUeXBlIG9uCi0gKiB2ZXJzaW9ucyBvZiB0aGUgSEFMIHRoYXQgc3VwcG9ydCB0aGlzIG5ldyBvZmZpY2lhbCBzZW5zb3IgdHlwZS4KLSAqCi0gKiBFeGFtcGxlIChtYWRlIHVwKTogU3VwcG9zZSBHb29nbGUncyBHbGFzcyB0ZWFtIHdhbnRzIHRvIHN1cmZhY2UgYSBzZW5zb3IKLSAqIGRldGVjdGluZyB0aGF0IEdsYXNzIGlzIG9uIGEgaGVhZC4KLSAqICAtIFN1Y2ggYSBzZW5zb3IgaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkIGluIGFuZHJvaWQgS2l0S2F0Ci0gKiAgLSBHbGFzcyBkZXZpY2VzIGxhdW5jaGluZyBvbiBLaXRLYXQgY2FuIGltcGxlbWVudCBhIHNlbnNvciB3aXRoCi0gKiAgICB0eXBlID0gMHgxMDAwMSBhbmQgc3RyaW5nVHlwZSA9ICJjb20uZ29vZ2xlLmdsYXNzLm9uaGVhZGRldGVjdG9yIgotICogIC0gSW4gTCBhbmRyb2lkIHJlbGVhc2UsIGlmIGFuZHJvaWQgZGVjaWRlcyB0byBkZWZpbmUKLSAqICAgIFNFTlNPUl9UWVBFX09OX0hFQURfREVURUNUT1IgYW5kIFNUUklOR19TRU5TT1JfVFlQRV9PTl9IRUFEX0RFVEVDVE9SLAotICogICAgdGhvc2UgdHlwZXMgc2hvdWxkIHJlcGxhY2UgdGhlIEdsYXNzLXRlYW0tc3BlY2lmaWMgdHlwZXMgaW4gYWxsIGZ1dHVyZQotICogICAgbGF1bmNoZXMuCi0gKiAgLSBXaGVuIGxhdW5jaGluZyBHbGFzcyBvbiB0aGUgTCByZWxlYXNlLCBHb29nbGUgc2hvdWxkIG5vdyB1c2UgdGhlIG9mZmljaWFsCi0gKiAgICB0eXBlIChTRU5TT1JfVFlQRV9PTl9IRUFEX0RFVEVDVE9SKSBhbmQgc3RyaW5nVHlwZS4KLSAqICAtIFRoaXMgd2F5LCBhbGwgYXBwbGljYXRpb25zIGNhbiBub3cgdXNlIHRoaXMgc2Vuc29yLgorICogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGdvaW5nIHRvIGJlIHJlbW92ZWQgc29vbi4KICAqLwotCi0vKgotICogQmFzZSBmb3IgZGV2aWNlIG1hbnVmYWN0dXJlcnMgcHJpdmF0ZSBzZW5zb3IgdHlwZXMuCi0gKiBUaGVzZSBzZW5zb3IgdHlwZXMgY2FuJ3QgYmUgZXhwb3NlZCBpbiB0aGUgU0RLLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0RFVklDRV9QUklWQVRFX0JBU0UgICAgIDB4MTAwMDAKLQotLyoKLSAqIFNFTlNPUl9UWVBFX01FVEFfREFUQQotICogcmVwb3J0aW5nLW1vZGU6IG4vYQotICogd2FrZS11cCBzZW5zb3I6IG4vYQotICoKLSAqIE5PIFNFTlNPUiBPRiBUSEFUIFRZUEUgTVVTVCBCRSBSRVRVUk5FRCAoKmdldF9zZW5zb3JzX2xpc3QpKCkKLSAqCi0gKiBTRU5TT1JfVFlQRV9NRVRBX0RBVEEgaXMgYSBzcGVjaWFsIHRva2VuIHVzZWQgdG8gcG9wdWxhdGUgdGhlCi0gKiBzZW5zb3JzX21ldGFfZGF0YV9ldmVudCBzdHJ1Y3R1cmUuIEl0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIHBoeXNpY2FsCi0gKiBzZW5zb3IuIHNlbnNvcnNfbWV0YV9kYXRhX2V2ZW50IGFyZSBzcGVjaWFsLCB0aGV5IGV4aXN0IG9ubHkgaW5zaWRlCi0gKiB0aGUgSEFMIGFuZCBhcmUgZ2VuZXJhdGVkIHNwb250YW5lb3VzbHksIGFzIG9wcG9zZWQgdG8gYmUgcmVsYXRlZCB0bwotICogYSBwaHlzaWNhbCBzZW5zb3IuCi0gKgotICogICBzZW5zb3JzX21ldGFfZGF0YV9ldmVudF90LnZlcnNpb24gbXVzdCBiZSBNRVRBX0RBVEFfVkVSU0lPTgotICogICBzZW5zb3JzX21ldGFfZGF0YV9ldmVudF90LnNlbnNvciBtdXN0IGJlIDAKLSAqICAgc2Vuc29yc19tZXRhX2RhdGFfZXZlbnRfdC50eXBlIG11c3QgYmUgU0VOU09SX1RZUEVfTUVUQV9EQVRBCi0gKiAgIHNlbnNvcnNfbWV0YV9kYXRhX2V2ZW50X3QucmVzZXJ2ZWQgbXVzdCBiZSAwCi0gKiAgIHNlbnNvcnNfbWV0YV9kYXRhX2V2ZW50X3QudGltZXN0YW1wIG11c3QgYmUgMAotICoKLSAqIFRoZSBwYXlsb2FkIGlzIGEgbWV0YV9kYXRhX2V2ZW50X3QsIHdoZXJlOgotICogbWV0YV9kYXRhX2V2ZW50X3Qud2hhdCBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqCi0gKiBNRVRBX0RBVEFfRkxVU0hfQ09NUExFVEUKLSAqICAgVGhpcyBldmVudCBpbmRpY2F0ZXMgdGhhdCBhIHByZXZpb3VzICgqZmx1c2gpKCkgY2FsbCBoYXMgY29tcGxldGVkIGZvciB0aGUgc2Vuc29yCi0gKiAgIGhhbmRsZSBzcGVjaWZpZWQgaW4gbWV0YV9kYXRhX2V2ZW50X3Quc2Vuc29yLgotICogICBzZWUgKCpmbHVzaCkoKSBmb3IgbW9yZSBkZXRhaWxzCi0gKgotICogQWxsIG90aGVyIHZhbHVlcyBmb3IgbWV0YV9kYXRhX2V2ZW50X3Qud2hhdCBhcmUgcmVzZXJ2ZWQgYW5kCi0gKiBtdXN0IG5vdCBiZSB1c2VkLgotICoKLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9NRVRBX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLQotLyoKLSAgKiBXYWtlIHVwIHNlbnNvcnMuCi0gICogRWFjaCBzZW5zb3IgbWF5IGhhdmUgZWl0aGVyIG9yIGJvdGggYSB3YWtlLXVwIGFuZCBhIG5vbi13YWtlIHZhcmlhbnQuCi0gICogV2hlbiByZWdpc3RlcmVkIGluIGJhdGNoIG1vZGUsIHdha2UtdXAgc2Vuc29ycyB3aWxsIHdha2UgdXAgdGhlIEFQIHdoZW4KLSAgKiB0aGVpciBGSUZPcyBhcmUgZnVsbCBvciB3aGVuIHRoZSBiYXRjaCB0aW1lb3V0IGV4cGlyZXMuIEEgc2VwYXJhdGUgRklGTyBoYXMKLSAgKiB0byBiZSBtYWludGFpbmVkIGZvciB3YWtlIHVwIHNlbnNvcnMgYW5kIG5vbiB3YWtlIHVwIHNlbnNvcnMuIFRoZSBub24gd2FrZS11cAotICAqIHNlbnNvcnMgbmVlZCB0byBvdmVyd3JpdGUgdGhlaXIgRklGT3Mgd2hlbiB0aGV5IGFyZSBmdWxsIHRpbGwgdGhlIEFQIHdha2VzIHVwCi0gICogYW5kIHRoZSB3YWtlLXVwIHNlbnNvcnMgd2lsbCB3YWtlLXVwIHRoZSBBUCB3aGVuIHRoZWlyIEZJRk9zIGFyZSBmdWxsIG9yIHdoZW4KLSAgKiB0aGUgYmF0Y2ggdGltZW91dCBleHBpcmVzIHdpdGhvdXQgbG9zaW5nIGV2ZW50cy4gV2FrZS11cCBhbmQgbm9uIHdha2UtdXAgdmFyaWFudHMKLSAgKiBvZiBlYWNoIHNlbnNvciBjYW4gYmUgYWN0aXZhdGVkIGF0IGRpZmZlcmVudCByYXRlcyBpbmRlcGVuZGVudGx5IG9mIGVhY2ggb3RoZXIuCi0gICoKLSAgKiBOb3RlOiBQcm94aW1pdHkgc2Vuc29yIGFuZCBzaWduaWZpY2FudCBtb3Rpb24gc2Vuc29yIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiBwcmV2aW91cwotICAqIHJlbGVhc2VzIGFyZSBhbHNvIHdha2UtdXAgc2Vuc29ycyBhbmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc3VjaC4gV2FrZS11cCBvbmUtc2hvdAotICAqIHNlbnNvcnMgbGlrZSBTSUdOSUZJQ0FOVF9NT1RJT04gY2Fubm90IGJlIGJhdGNoZWQsIGhlbmNlIHRoZSB0ZXh0IGFib3V0IGJhdGNoIGFib3ZlCi0gICogZG9lc24ndCBhcHBseSB0byB0aGVtLiBTZWUgdGhlIGRlZmluaXRpb25zIG9mIFNFTlNPUl9UWVBFX1BST1hJTUlUWSBhbmQKLSAgKiBTRU5TT1JfVFlQRV9TSUdOSUZJQ0FOVF9NT1RJT04gZm9yIG1vcmUgaW5mby4KLSAgKgotICAqIFNldCBTRU5TT1JfRkxBR19XQUtFX1VQIGZsYWcgZm9yIGFsbCB3YWtlLXVwIHNlbnNvcnMuCi0gICoKLSAgKiBGb3IgZXhhbXBsZSwgQSBkZXZpY2UgY2FuIGhhdmUgdHdvIHNlbnNvcnMgYm90aCBvZiBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSIGFuZAotICAqIG9uZSBvZiB0aGVtIGNhbiBiZSBhIHdha2VfdXAgc2Vuc29yICh3aXRoIFNFTlNPUl9GTEFHX1dBS0VfVVAgZmxhZyBzZXQpIGFuZCB0aGUgb3RoZXIKLSAgKiBjYW4gYmUgYSByZWd1bGFyIG5vbiB3YWtlX3VwIHNlbnNvci4gQm90aCBvZiB0aGVzZSBzZW5zb3JzIG11c3QgYmUgYWN0aXZhdGVkL2RlYWN0aXZhdGVkCi0gICogaW5kZXBlbmRlbnRseSBvZiB0aGUgb3RoZXIuCi0gICovCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSCi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqICBBbGwgdmFsdWVzIGFyZSBpbiBTSSB1bml0cyAobS9zXjIpIGFuZCBtZWFzdXJlIHRoZSBhY2NlbGVyYXRpb24gb2YgdGhlCi0gKiAgZGV2aWNlIG1pbnVzIHRoZSBmb3JjZSBvZiBncmF2aXR5LgotICoKLSAqICBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiAgICAgICAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9BQ0NFTEVST01FVEVSICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5hY2NlbGVyb21ldGVyIgotCi0vKgotICogU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfRklFTEQKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogIEFsbCB2YWx1ZXMgYXJlIGluIG1pY3JvLVRlc2xhICh1VCkgYW5kIG1lYXN1cmUgdGhlIGdlb21hZ25ldGljCi0gKiAgZmllbGQgaW4gdGhlIFgsIFkgYW5kIFogYXhpcy4KLSAqCi0gKiAgSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqICB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX0ZJRUxEICAgICAgICAgICAgICAgICgyKQotI2RlZmluZSBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCAgU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfRklFTEQKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX01BR05FVElDX0ZJRUxEICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLm1hZ25ldGljX2ZpZWxkIgotCi0vKgotICogU0VOU09SX1RZUEVfT1JJRU5UQVRJT04KLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogQWxsIHZhbHVlcyBhcmUgYW5nbGVzIGluIGRlZ3JlZXMuCi0gKgotICogT3JpZW50YXRpb24gc2Vuc29ycyByZXR1cm4gc2Vuc29yIGV2ZW50cyBmb3IgYWxsIDMgYXhlcyBhdCBhIGNvbnN0YW50Ci0gKiByYXRlIGRlZmluZWQgYnkgc2V0RGVsYXkoKS4KLSAqCi0gKiBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9PUklFTlRBVElPTiAgICAgICAgICAgICAgICAgICAgICAoMykKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX09SSUVOVEFUSU9OICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIgotCi0vKgotICogU0VOU09SX1RZUEVfR1lST1NDT1BFCi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqICBBbGwgdmFsdWVzIGFyZSBpbiByYWRpYW5zL3NlY29uZCBhbmQgbWVhc3VyZSB0aGUgcmF0ZSBvZiByb3RhdGlvbgotICogIGFyb3VuZCB0aGUgWCwgWSBhbmQgWiBheGlzLgotICoKLSAqICBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfR1lST1NDT1BFICAgICAgICAgICAgICAgICAgICAgICAgKDQpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HWVJPU0NPUEUgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5neXJvc2NvcGUiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9MSUdIVAotICogcmVwb3J0aW5nLW1vZGU6IG9uLWNoYW5nZQotICoKLSAqIFRoZSBsaWdodCBzZW5zb3IgdmFsdWUgaXMgcmV0dXJuZWQgaW4gU0kgbHV4IHVuaXRzLgotICoKLSAqIEJvdGggd2FrZS11cCBhbmQgbm9uIHdha2UtdXAgdmVyc2lvbnMgYXJlIHVzZWZ1bC4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9MSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0xJR0hUICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmxpZ2h0IgotCi0vKgotICogU0VOU09SX1RZUEVfUFJFU1NVUkUKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogVGhlIHByZXNzdXJlIHNlbnNvciByZXR1cm4gdGhlIGF0aG1vc3BoZXJpYyBwcmVzc3VyZSBpbiBoZWN0b3Bhc2NhbCAoaFBhKQotICoKLSAqIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1BSRVNTVVJFICAgICAgICAgICAgICAgICAgICAgICAgICg2KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IucHJlc3N1cmUiCi0KLS8qIFNFTlNPUl9UWVBFX1RFTVBFUkFUVVJFIGlzIGRlcHJlY2F0ZWQgaW4gdGhlIEhBTCAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAoNykKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnRlbXBlcmF0dXJlIgotCi0vKgotICogU0VOU09SX1RZUEVfUFJPWElNSVRZCi0gKiByZXBvcnRpbmctbW9kZTogb24tY2hhbmdlCi0gKgotICogVGhlIHByb3hpbWl0eSBzZW5zb3Igd2hpY2ggdHVybnMgdGhlIHNjcmVlbiBvZmYgYW5kIGJhY2sgb24gZHVyaW5nIGNhbGxzIGlzIHRoZQotICogd2FrZS11cCBwcm94aW1pdHkgc2Vuc29yLiBJbXBsZW1lbnQgd2FrZS11cCBwcm94aW1pdHkgc2Vuc29yIGJlZm9yZSBpbXBsZW1lbnRpbmcKLSAqIGEgbm9uIHdha2UtdXAgcHJveGltaXR5IHNlbnNvci4gRm9yIHRoZSB3YWtlLXVwIHByb3hpbWl0eSBzZW5zb3Igc2V0IHRoZSBmbGFnCi0gKiBTRU5TT1JfRkxBR19XQUtFX1VQLgotICogVGhlIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBkaXN0YW5jZSB0byB0aGUgbmVhcmVzdCBvYmplY3QgaW4gY2VudGltZXRlcnMuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfUFJPWElNSVRZICAgICAgICAgICAgICAgICAgICAgICAgKDgpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9QUk9YSU1JVFkgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5wcm94aW1pdHkiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9HUkFWSVRZCi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqIEEgZ3Jhdml0eSBvdXRwdXQgaW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24gb2YgYW5kIG1hZ25pdHVkZSBvZiBncmF2aXR5IGluCi0gKiB0aGUgZGV2aWNlcydzIGNvb3JkaW5hdGVzLgotICoKLSAqIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0dSQVZJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICg5KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR1JBVklUWSAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZ3Jhdml0eSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04KLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogSW5kaWNhdGVzIHRoZSBsaW5lYXIgYWNjZWxlcmF0aW9uIG9mIHRoZSBkZXZpY2UgaW4gZGV2aWNlIGNvb3JkaW5hdGVzLAotICogbm90IGluY2x1ZGluZyBncmF2aXR5LgotICoKLSAqIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04gICAgICAgICAgICAgKDEwKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfTElORUFSX0FDQ0VMRVJBVElPTiAgICAgICJhbmRyb2lkLnNlbnNvci5saW5lYXJfYWNjZWxlcmF0aW9uIgotCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1IKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogVGhlIHJvdGF0aW9uIHZlY3RvciBzeW1ib2xpemVzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHJlbGF0aXZlIHRvIHRoZQotICogRWFzdC1Ob3J0aC1VcCBjb29yZGluYXRlcyBmcmFtZS4KLSAqCi0gKiBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1IgICAgICAgICAgICAgICAgICgxMSkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1JPVEFUSU9OX1ZFQ1RPUiAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iucm90YXRpb25fdmVjdG9yIgotCi0vKgotICogU0VOU09SX1RZUEVfUkVMQVRJVkVfSFVNSURJVFkKLSAqIHJlcG9ydGluZy1tb2RlOiBvbi1jaGFuZ2UKLSAqCi0gKiBBIHJlbGF0aXZlIGh1bWlkaXR5IHNlbnNvciBtZWFzdXJlcyByZWxhdGl2ZSBhbWJpZW50IGFpciBodW1pZGl0eSBhbmQKLSAqIHJldHVybnMgYSB2YWx1ZSBpbiBwZXJjZW50LgotICoKLSAqIEJvdGggd2FrZS11cCBhbmQgbm9uIHdha2UtdXAgdmVyc2lvbnMgYXJlIHVzZWZ1bC4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9SRUxBVElWRV9IVU1JRElUWSAgICAgICAgICAgICAgICgxMikKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1JFTEFUSVZFX0hVTUlESVRZICAgICAgICAiYW5kcm9pZC5zZW5zb3IucmVsYXRpdmVfaHVtaWRpdHkiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9BTUJJRU5UX1RFTVBFUkFUVVJFCi0gKiByZXBvcnRpbmctbW9kZTogb24tY2hhbmdlCi0gKgotICogVGhlIGFtYmllbnQgKHJvb20pIHRlbXBlcmF0dXJlIGluIGRlZ3JlZSBDZWxzaXVzLgotICoKLSAqIEJvdGggd2FrZS11cCBhbmQgbm9uIHdha2UtdXAgdmVyc2lvbnMgYXJlIHVzZWZ1bC4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9BTUJJRU5UX1RFTVBFUkFUVVJFICAgICAgICAgICAgICgxMykKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0FNQklFTlRfVEVNUEVSQVRVUkUgICAgICAiYW5kcm9pZC5zZW5zb3IuYW1iaWVudF90ZW1wZXJhdHVyZSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEX1VOQ0FMSUJSQVRFRAotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiAgU2ltaWxhciB0byBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCwgYnV0IHRoZSBoYXJkIGlyb24gY2FsaWJyYXRpb24gaXMKLSAqICByZXBvcnRlZCBzZXBhcmF0ZWx5IGluc3RlYWQgb2YgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIG1lYXN1cmVtZW50LgotICoKLSAqICBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTERfVU5DQUxJQlJBVEVEICAgICAoMTQpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9NQUdORVRJQ19GSUVMRF9VTkNBTElCUkFURUQgImFuZHJvaWQuc2Vuc29yLm1hZ25ldGljX2ZpZWxkX3VuY2FsaWJyYXRlZCIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0dBTUVfUk9UQVRJT05fVkVDVE9SCi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqICBTaW1pbGFyIHRvIFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUiwgYnV0IG5vdCB1c2luZyB0aGUgZ2VvbWFnbmV0aWMKLSAqICBmaWVsZC4KLSAqCi0gKiAgSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqICB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0dBTUVfUk9UQVRJT05fVkVDVE9SICAgICAgICAgICAgKDE1KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR0FNRV9ST1RBVElPTl9WRUNUT1IgICAgICJhbmRyb2lkLnNlbnNvci5nYW1lX3JvdGF0aW9uX3ZlY3RvciIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0dZUk9TQ09QRV9VTkNBTElCUkFURUQKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogIEFsbCB2YWx1ZXMgYXJlIGluIHJhZGlhbnMvc2Vjb25kIGFuZCBtZWFzdXJlIHRoZSByYXRlIG9mIHJvdGF0aW9uCi0gKiAgYXJvdW5kIHRoZSBYLCBZIGFuZCBaIGF4aXMuCi0gKgotICogIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiAgdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9HWVJPU0NPUEVfVU5DQUxJQlJBVEVEICAgICAgICAgICgxNikKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dZUk9TQ09QRV9VTkNBTElCUkFURUQgICAiYW5kcm9pZC5zZW5zb3IuZ3lyb3Njb3BlX3VuY2FsaWJyYXRlZCIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1NJR05JRklDQU5UX01PVElPTgotICogcmVwb3J0aW5nLW1vZGU6IG9uZS1zaG90Ci0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHRyaWdnZXJzIGFuIGV2ZW50IGVhY2ggdGltZSBzaWduaWZpY2FudCBtb3Rpb24KLSAqIGlzIGRldGVjdGVkIGFuZCBhdXRvbWF0aWNhbGx5IGRpc2FibGVzIGl0c2VsZi4KLSAqIEZvciBTaWduaWZpY2FudCBNb3Rpb24gc2Vuc29yIHRvIGJlIHVzZWZ1bCwgaXQgbXVzdCBiZSBkZWZpbmVkIGFzIGEKLSAqIHdha2UtdXAgc2Vuc29yLiAoc2V0IFNFTlNPUl9GTEFHX1dBS0VfVVApLiBJbXBsZW1lbnQgdGhlIHdha2UtdXAgc2lnbmlmaWNhbnQgbW90aW9uCi0gKiBzZW5zb3IuIEEgbm9uIHdha2UtdXAgdmVyc2lvbiBpcyBub3QgdXNlZnVsLgotICogVGhlIG9ubHkgYWxsb3dlZCB2YWx1ZSB0byByZXR1cm4gaXMgMS4wLgotICovCi0KLSNkZWZpbmUgU0VOU09SX1RZUEVfU0lHTklGSUNBTlRfTU9USU9OICAgICAgICAgICAgICAoMTcpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9TSUdOSUZJQ0FOVF9NT1RJT04gICAgICAgImFuZHJvaWQuc2Vuc29yLnNpZ25pZmljYW50X21vdGlvbiIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1NURVBfREVURUNUT1IKLSAqIHJlcG9ydGluZy1tb2RlOiBzcGVjaWFsCi0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHRyaWdnZXJzIGFuIGV2ZW50IGVhY2ggdGltZSBhIHN0ZXAgaXMgdGFrZW4KLSAqIGJ5IHRoZSB1c2VyLiBUaGUgb25seSBhbGxvd2VkIHZhbHVlIHRvIHJldHVybiBpcyAxLjAgYW5kIGFuIGV2ZW50Ci0gKiBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggc3RlcC4KLSAqCi0gKiBCb3RoIHdha2UtdXAgYW5kIG5vbiB3YWtlLXVwIHZlcnNpb25zIGFyZSB1c2VmdWwuCi0gKi8KLQotI2RlZmluZSBTRU5TT1JfVFlQRV9TVEVQX0RFVEVDVE9SICAgICAgICAgICAgICAgICAgICgxOCkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1NURVBfREVURUNUT1IgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iuc3RlcF9kZXRlY3RvciIKLQotCi0vKgotICogU0VOU09SX1RZUEVfU1RFUF9DT1VOVEVSCi0gKiByZXBvcnRpbmctbW9kZTogb24tY2hhbmdlCi0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHJldHVybnMgdGhlIG51bWJlciBvZiBzdGVwcyB0YWtlbiBieSB0aGUgdXNlciBzaW5jZQotICogdGhlIGxhc3QgcmVib290IHdoaWxlIGFjdGl2YXRlZC4gVGhlIHZhbHVlIGlzIHJldHVybmVkIGFzIGEgdWludDY0X3QgYW5kIGlzCi0gKiByZXNldCB0byB6ZXJvIG9ubHkgb24gYSBzeXN0ZW0gLyBhbmRyb2lkIHJlYm9vdC4KLSAqCi0gKiBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1NURVBfQ09VTlRFUiAgICAgICAgICAgICAgICAgICAgKDE5KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfU1RFUF9DT1VOVEVSICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5zdGVwX2NvdW50ZXIiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19ST1RBVElPTl9WRUNUT1IKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogIFNpbWlsYXIgdG8gU0VOU09SX1RZUEVfUk9UQVRJT05fVkVDVE9SLCBidXQgdXNpbmcgYSBtYWduZXRvbWV0ZXIgaW5zdGVhZAotICogIG9mIHVzaW5nIGEgZ3lyb3Njb3BlLgotICoKLSAqIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX1JPVEFUSU9OX1ZFQ1RPUiAgICAgKDIwKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR0VPTUFHTkVUSUNfUk9UQVRJT05fVkVDVE9SICJhbmRyb2lkLnNlbnNvci5nZW9tYWduZXRpY19yb3RhdGlvbl92ZWN0b3IiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9IRUFSVF9SQVRFCi0gKiByZXBvcnRpbmctbW9kZTogb24tY2hhbmdlCi0gKgotICogIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSByZXR1cm5zIHRoZSBjdXJyZW50IGhlYXJ0IHJhdGUuCi0gKiAgVGhlIGV2ZW50cyBjb250YWluIHRoZSBjdXJyZW50IGhlYXJ0IHJhdGUgaW4gYmVhdHMgcGVyIG1pbnV0ZSAoQlBNKSBhbmQgdGhlCi0gKiAgc3RhdHVzIG9mIHRoZSBzZW5zb3IgZHVyaW5nIHRoZSBtZWFzdXJlbWVudC4gU2VlIGhlYXJ0X3JhdGVfZXZlbnRfdCBmb3IgbW9yZQotICogIGRldGFpbHMuCi0gKgotICogIEJlY2F1c2UgdGhpcyBzZW5zb3IgaXMgb24tY2hhbmdlLCBldmVudHMgbXVzdCBiZSBnZW5lcmF0ZWQgd2hlbiBhbmQgb25seQotICogIHdoZW4gaGVhcnRfcmF0ZS5icG0gb3IgaGVhcnRfcmF0ZS5zdGF0dXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0Ci0gKiAgZXZlbnQuIEluIHBhcnRpY3VsYXIsIHVwb24gdGhlIGZpcnN0IGFjdGl2YXRpb24sIHVubGVzcyB0aGUgZGV2aWNlIGlzIGtub3duCi0gKiAgdG8gbm90IGJlIG9uIHRoZSBib2R5LCB0aGUgc3RhdHVzIGZpZWxkIG9mIHRoZSBmaXJzdCBldmVudCBtdXN0IGJlIHNldCB0bwotICogIFNFTlNPUl9TVEFUVVNfVU5SRUxJQUJMRS4gVGhlIGV2ZW50IHNob3VsZCBiZSBnZW5lcmF0ZWQgbm8gZmFzdGVyIHRoYW4gZXZlcnkKLSAqICBwZXJpb2RfbnMgcGFzc2VkIHRvIHNldERlbGF5KCkgb3IgdG8gYmF0Y2goKS4KLSAqICBTZWUgdGhlIGRlZmluaXRpb24gb2YgdGhlIG9uLWNoYW5nZSByZXBvcnRpbmcgbW9kZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiAgc2Vuc29yX3QucmVxdWlyZWRQZXJtaXNzaW9uIG11c3QgYmUgc2V0IHRvIFNFTlNPUl9QRVJNSVNTSU9OX0JPRFlfU0VOU09SUy4KLSAqCi0gKiAgQm90aCB3YWtlLXVwIGFuZCBub24gd2FrZS11cCB2ZXJzaW9ucyBhcmUgdXNlZnVsLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0hFQVJUX1JBVEUgICAgICAgICAgICAgICAgICAgICAgKDIxKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfSEVBUlRfUkFURSAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5oZWFydF9yYXRlIgotCi0vKgotICogU0VOU09SX1RZUEVfV0FLRV9VUF9USUxUX0RFVEVDVE9SCi0gKiByZXBvcnRpbmctbW9kZTogc3BlY2lhbCAoc2V0RGVsYXkgaGFzIG5vIGltcGFjdCkKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgZ2VuZXJhdGVzIGFuIGV2ZW50IGVhY2ggdGltZSBhIHRpbHQgZXZlbnQgaXMgZGV0ZWN0ZWQuIEEgdGlsdCBldmVudAotICogc2hvdWxkIGJlIGdlbmVyYXRlZCBpZiB0aGUgZGlyZWN0aW9uIG9mIHRoZSAyLXNlY29uZHMgd2luZG93IGF2ZXJhZ2UgZ3Jhdml0eSBjaGFuZ2VkIGJ5IGF0IGxlYXN0Ci0gKiAzNSBkZWdyZWVzIHNpbmNlIHRoZSBhY3RpdmF0aW9uIG9yIHRoZSBsYXN0IHRyaWdnZXIgb2YgdGhlIHNlbnNvci4KLSAqICAgICByZWZlcmVuY2VfZXN0aW1hdGVkX2dyYXZpdHkgPSBhdmVyYWdlIG9mIGFjY2VsZXJvbWV0ZXIgbWVhc3VyZW1lbnRzIG92ZXIgdGhlIGZpcnN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgc2Vjb25kIGFmdGVyIGFjdGl2YXRpb24gb3IgdGhlIGVzdGltYXRlZCBncmF2aXR5IGF0IHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuCi0gKiAgICAgY3VycmVudF9lc3RpbWF0ZWRfZ3Jhdml0eSA9IGF2ZXJhZ2Ugb2YgYWNjZWxlcm9tZXRlciBtZWFzdXJlbWVudHMgb3ZlciB0aGUgbGFzdCAyIHNlY29uZHMuCi0gKiAgICAgdHJpZ2dlciB3aGVuIGFuZ2xlIChyZWZlcmVuY2VfZXN0aW1hdGVkX2dyYXZpdHksIGN1cnJlbnRfZXN0aW1hdGVkX2dyYXZpdHkpID4gMzUgZGVncmVlcwotICoKLSAqIExhcmdlIGFjY2VsZXJhdGlvbnMgd2l0aG91dCBhIGNoYW5nZSBpbiBwaG9uZSBvcmllbnRhdGlvbiBzaG91bGQgbm90IHRyaWdnZXIgYSB0aWx0IGV2ZW50LgotICogRm9yIGV4YW1wbGUsIGEgc2hhcnAgdHVybiBvciBzdHJvbmcgYWNjZWxlcmF0aW9uIHdoaWxlIGRyaXZpbmcgYSBjYXIgc2hvdWxkIG5vdCB0cmlnZ2VyIGEgdGlsdAotICogZXZlbnQsIGV2ZW4gdGhvdWdoIHRoZSBhbmdsZSBvZiB0aGUgYXZlcmFnZSBhY2NlbGVyYXRpb24gbWlnaHQgdmFyeSBieSBtb3JlIHRoYW4gMzUgZGVncmVlcy4KLSAqCi0gKiBUeXBpY2FsbHksIHRoaXMgc2Vuc29yIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIGhlbHAgb2Ygb25seSBhbiBhY2NlbGVyb21ldGVyLiBPdGhlciBzZW5zb3JzIGNhbgotICogYmUgdXNlZCBhcyB3ZWxsIGlmIHRoZXkgZG8gbm90IGluY3JlYXNlIHRoZSBwb3dlciBjb25zdW1wdGlvbiBzaWduaWZpY2FudGx5LiBUaGlzIGlzIGEgbG93IHBvd2VyCi0gKiBzZW5zb3IgdGhhdCBzaG91bGQgYWxsb3cgdGhlIEFQIHRvIGdvIGludG8gc3VzcGVuZCBtb2RlLiBEbyBub3QgZW11bGF0ZSB0aGlzIHNlbnNvciBpbiB0aGUgSEFMLgotICogTGlrZSBvdGhlciB3YWtlIHVwIHNlbnNvcnMsIHRoZSBkcml2ZXIgaXMgZXhwZWN0ZWQgdG8gYSBob2xkIGEgd2FrZV9sb2NrIHdpdGggYSB0aW1lb3V0IG9mIDIwMCBtcwotICogd2hpbGUgcmVwb3J0aW5nIHRoaXMgZXZlbnQuIFRoZSBvbmx5IGFsbG93ZWQgcmV0dXJuIHZhbHVlIGlzIDEuMC4KLSAqCi0gKiBJbXBsZW1lbnQgb25seSB0aGUgd2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1RJTFRfREVURUNUT1IgICAgICAgICAgICAgICAgICAgICAgKDIyKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfVElMVF9ERVRFQ1RPUiAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci50aWx0X2RldGVjdG9yIgotCi0vKgotICogU0VOU09SX1RZUEVfV0FLRV9HRVNUVVJFCi0gKiByZXBvcnRpbmctbW9kZTogb25lLXNob3QKLSAqCi0gKiBBIHNlbnNvciBlbmFibGluZyB3YWtpbmcgdXAgdGhlIGRldmljZSBiYXNlZCBvbiBhIGRldmljZSBzcGVjaWZpYyBtb3Rpb24uCi0gKgotICogV2hlbiB0aGlzIHNlbnNvciB0cmlnZ2VycywgdGhlIGRldmljZSBiZWhhdmVzIGFzIGlmIHRoZSBwb3dlciBidXR0b24gd2FzCi0gKiBwcmVzc2VkLCB0dXJuaW5nIHRoZSBzY3JlZW4gb24uIFRoaXMgYmVoYXZpb3IgKHR1cm5pbmcgb24gdGhlIHNjcmVlbiB3aGVuCi0gKiB0aGlzIHNlbnNvciB0cmlnZ2VycykgbWlnaHQgYmUgZGVhY3RpdmF0ZWQgYnkgdGhlIHVzZXIgaW4gdGhlIGRldmljZQotICogc2V0dGluZ3MuIENoYW5nZXMgaW4gc2V0dGluZ3MgZG8gbm90IGltcGFjdCB0aGUgYmVoYXZpb3Igb2YgdGhlIHNlbnNvcjoKLSAqIG9ubHkgd2hldGhlciB0aGUgZnJhbWV3b3JrIHR1cm5zIHRoZSBzY3JlZW4gb24gd2hlbiBpdCB0cmlnZ2Vycy4KLSAqCi0gKiBUaGUgYWN0dWFsIGdlc3R1cmUgdG8gYmUgZGV0ZWN0ZWQgaXMgbm90IHNwZWNpZmllZCwgYW5kIGNhbiBiZSBjaG9zZW4gYnkKLSAqIHRoZSBtYW51ZmFjdHVyZXIgb2YgdGhlIGRldmljZS4KLSAqIFRoaXMgc2Vuc29yIG11c3QgYmUgbG93IHBvd2VyLCBhcyBpdCBpcyBsaWtlbHkgdG8gYmUgYWN0aXZhdGVkIDI0LzcuCi0gKiBUaGUgb25seSBhbGxvd2VkIHZhbHVlIHRvIHJldHVybiBpcyAxLjAuCi0gKgotICogSW1wbGVtZW50IG9ubHkgdGhlIHdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvci4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9XQUtFX0dFU1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIzKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfV0FLRV9HRVNUVVJFICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLndha2VfZ2VzdHVyZSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0dMQU5DRV9HRVNUVVJFCi0gKiByZXBvcnRpbmctbW9kZTogb25lLXNob3QKLSAqCi0gKiBBIHNlbnNvciBlbmFibGluZyBicmllZmx5IHR1cm5pbmcgdGhlIHNjcmVlbiBvbiB0byBlbmFibGUgdGhlIHVzZXIgdG8KLSAqIGdsYW5jZSBjb250ZW50IG9uIHNjcmVlbiBiYXNlZCBvbiBhIHNwZWNpZmljIG1vdGlvbi4gIFRoZSBkZXZpY2Ugc2hvdWxkCi0gKiB0dXJuIHRoZSBzY3JlZW4gb2ZmIGFmdGVyIGEgZmV3IG1vbWVudHMuCi0gKgotICogV2hlbiB0aGlzIHNlbnNvciB0cmlnZ2VycywgdGhlIGRldmljZSB0dXJucyB0aGUgc2NyZWVuIG9uIG1vbWVudGFyaWx5Ci0gKiB0byBhbGxvdyB0aGUgdXNlciB0byBnbGFuY2Ugbm90aWZpY2F0aW9ucyBvciBvdGhlciBjb250ZW50IHdoaWxlIHRoZQotICogZGV2aWNlIHJlbWFpbnMgbG9ja2VkIGluIGEgbm9uLWludGVyYWN0aXZlIHN0YXRlIChkb3ppbmcpLiBUaGlzIGJlaGF2aW9yCi0gKiAoYnJpZWZseSB0dXJuaW5nIG9uIHRoZSBzY3JlZW4gd2hlbiB0aGlzIHNlbnNvciB0cmlnZ2VycykgbWlnaHQgYmUgZGVhY3RpdmF0ZWQKLSAqIGJ5IHRoZSB1c2VyIGluIHRoZSBkZXZpY2Ugc2V0dGluZ3MuIENoYW5nZXMgaW4gc2V0dGluZ3MgZG8gbm90IGltcGFjdCB0aGUKLSAqIGJlaGF2aW9yIG9mIHRoZSBzZW5zb3I6IG9ubHkgd2hldGhlciB0aGUgZnJhbWV3b3JrIGJyaWVmbHkgdHVybnMgdGhlIHNjcmVlbiBvbgotICogd2hlbiBpdCB0cmlnZ2Vycy4KLSAqCi0gKiBUaGUgYWN0dWFsIGdlc3R1cmUgdG8gYmUgZGV0ZWN0ZWQgaXMgbm90IHNwZWNpZmllZCwgYW5kIGNhbiBiZSBjaG9zZW4gYnkKLSAqIHRoZSBtYW51ZmFjdHVyZXIgb2YgdGhlIGRldmljZS4KLSAqIFRoaXMgc2Vuc29yIG11c3QgYmUgbG93IHBvd2VyLCBhcyBpdCBpcyBsaWtlbHkgdG8gYmUgYWN0aXZhdGVkIDI0LzcuCi0gKiBUaGUgb25seSBhbGxvd2VkIHZhbHVlIHRvIHJldHVybiBpcyAxLjAuCi0gKgotICogSW1wbGVtZW50IG9ubHkgdGhlIHdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvci4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9HTEFOQ0VfR0VTVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDI0KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR0xBTkNFX0dFU1RVUkUgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmdsYW5jZV9nZXN0dXJlIgotCi0vKioKLSAqIFNFTlNPUl9UWVBFX1BJQ0tfVVBfR0VTVFVSRQotICogcmVwb3J0aW5nLW1vZGU6IG9uZS1zaG90Ci0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHRyaWdnZXJzIHdoZW4gdGhlIGRldmljZSBpcyBwaWNrZWQgdXAgcmVnYXJkbGVzcyBvZiB3aGVyZXZlciBpcyB3YXMKLSAqIGJlZm9yZSAoZGVzaywgcG9ja2V0LCBiYWcpLiBUaGUgb25seSBhbGxvd2VkIHJldHVybiB2YWx1ZSBpcyAxLjAuCi0gKiBUaGlzIHNlbnNvciBkZS1hY3RpdmF0ZXMgaXRzZWxmIGltbWVkaWF0ZWx5IGFmdGVyIGl0IHRyaWdnZXJzLgotICoKLSAqIEltcGxlbWVudCBvbmx5IHRoZSB3YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfUElDS19VUF9HRVNUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyNSkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1BJQ0tfVVBfR0VTVFVSRSAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5waWNrX3VwX2dlc3R1cmUiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9XUklTVF9USUxUX0dFU1RVUkUKLSAqIHRyaWdnZXItbW9kZTogc3BlY2lhbAotICogd2FrZS11cCBzZW5zb3I6IHllcwotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSB0cmlnZ2VycyBhbiBldmVudCBlYWNoIHRpbWUgYSB0aWx0IG9mIHRoZSB3cmlzdC13b3JuCi0gKiBkZXZpY2UgaXMgZGV0ZWN0ZWQuCi0gKgotICogVGhpcyBzZW5zb3IgbXVzdCBiZSBsb3cgcG93ZXIsIGFzIGl0IGlzIGxpa2VseSB0byBiZSBhY3RpdmF0ZWQgMjQvNy4KLSAqIFRoZSBvbmx5IGFsbG93ZWQgdmFsdWUgdG8gcmV0dXJuIGlzIDEuMC4KLSAqCi0gKiBJbXBsZW1lbnQgb25seSB0aGUgd2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1dSSVNUX1RJTFRfR0VTVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAoMjYpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9XUklTVF9USUxUX0dFU1RVUkUgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iud3Jpc3RfdGlsdF9nZXN0dXJlIgotCi0vKgotICogU0VOU09SX1RZUEVfREVWSUNFX09SSUVOVEFUSU9OCi0gKiByZXBvcnRpbmctbW9kZTogb24tY2hhbmdlCi0gKgotICogVGhlIGN1cnJlbnQgb3JpZW50YXRpb24gb2YgdGhlIGRldmljZS4gVGhlIHZhbHVlIHNob3VsZCBiZSByZXBvcnRlZCBpbiB0aGUKLSAqIGZpcnN0IGVsZW1lbnQgb2YgdGhlICdkYXRhJyBtZW1iZXIgdmFyaWFibGUgaW4gc2Vuc29yc19ldmVudF90LiBUaGUgb25seQotICogdmFsdWVzIHRoYXQgY2FuIGJlIHJlcG9ydGVkIGFyZSAocGxlYXNlIHJlZmVyIHRvIEFuZHJvaWQgU2Vuc29yIENvb3JkaW5hdGUKLSAqIFN5c3RlbSB0byB1bmRlcnN0YW5kIHRoZSBYIGFuZCBZIGF4aXMgZGlyZWN0aW9uIHdpdGggcmVzcGVjdCB0byBkZWZhdWx0Ci0gKiBvcmllbnRhdGlvbik6Ci0gKiAgLSAwOiBkZXZpY2UgaXMgaW4gZGVmYXVsdCBvcmllbnRhdGlvbiAoWSBheGlzIGlzIHZlcnRpY2FsIGFuZCBwb2ludHMgdXApCi0gKiAgLSAxOiBkZXZpY2UgaXMgcm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gZGVmYXVsdAotICogICAgICAgb3JpZW50YXRpb24gKFggYXhpcyBpcyB2ZXJ0aWNhbCBhbmQgcG9pbnRzIHVwKQotICogIC0gMjogZGV2aWNlIGlzIHJvdGF0ZWQgMTgwIGRlZ3JlZXMgZnJvbSBkZWZhdWx0IG9yaWVudGF0aW9uIChZIGF4aXMgaXMKLSAqICAgICAgIHZlcnRpY2FsIGFuZCBwb2ludHMgZG93bikKLSAqICAtIDM6IGRldmljZSBpcyByb3RhdGVkIDkwIGRlZ3JlZXMgY2xvY2t3aXNlIGZyb20gZGVmYXVsdCBvcmllbnRhdGlvbiAoWCBheGlzCi0gKiAgICAgICBpcyB2ZXJ0aWNhbCBhbmQgcG9pbnRzIGRvd24pCi0gKgotICogTW92aW5nIHRoZSBkZXZpY2UgdG8gYW4gb3JpZW50YXRpb24gd2hlcmUgdGhlIFogYXhpcyBpcyB2ZXJ0aWNhbCAoZWl0aGVyIHVwCi0gKiBvciBkb3duKSBzaG91bGQgbm90IGNhdXNlIGEgbmV3IGV2ZW50IHRvIGJlIHJlcG9ydGVkLgotICoKLSAqIFRvIGltcHJvdmUgdGhlIHVzZXIgZXhwZXJpZW5jZSBvZiB0aGlzIHNlbnNvciwgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW1wbGVtZW50Ci0gKiBzb21lIHBoeXNpY2FsIChpLmUuLCByb3RhdGlvbiBhbmdsZSkgYW5kIHRlbXBvcmFsIChpLmUuLCBkZWxheSkgaHlzdGVyZXNpcy4KLSAqIEluIG90aGVyIHdvcmRzLCBtaW5vciBvciB0cmFuc2llbnQgcm90YXRpb25zIHNob3VsZCBub3QgY2F1c2UgYSBuZXcgZXZlbnQgdG8KLSAqIGJlIHJlcG9ydGVkLgotICoKLSAqIFRoaXMgc2Vuc29yIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIHdpdGggdGhlIGhlbHAgb2YgYW4gYWNjZWxlcm9tZXRlci4KLSAqIFRoaXMgaXMgYSBsb3cgcG93ZXIgc2Vuc29yIHRoYXQgc2hvdWxkIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgb2YgdGhlCi0gKiBBUC4gRG8gbm90IGVtdWxhdGUgdGhpcyBzZW5zb3IgaW4gdGhlIEhBTC4KLSAqCi0gKiBCb3RoIHdha2UtdXAgYW5kIG5vbiB3YWtlLXVwIHZlcnNpb25zIGFyZSB1c2VmdWwuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfREVWSUNFX09SSUVOVEFUSU9OICAgICAgICAgICAgICAgICAoMjcpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9ERVZJQ0VfT1JJRU5UQVRJT04gICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmRldmljZV9vcmllbnRhdGlvbiIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1BPU0VfNkRPRgotICogdHJpZ2dlci1tb2RlOiBjb250aW51b3VzCi0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHJldHVybnMgdGhlIHBvc2Ugb2YgdGhlIGRldmljZS4KLSAqIFBvc2Ugb2YgdGhlIGRldmljZSBpcyBkZWZpbmVkIGFzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZGV2aWNlIGZyb20gYQotICogRWFydGggQ2VudGVyZWQgRWFydGggRml4ZWQgZnJhbWUgYW5kIHRoZSB0cmFuc2xhdGlvbiBmcm9tIGFuIGFyYml0cmFyeQotICogcG9pbnQgYXQgc3Vic2NyaXB0aW9uLgotICoKLSAqIFRoaXMgc2Vuc29yIGNhbiBiZSBoaWdoIHBvd2VyLiBJdCBjYW4gdXNlIGFueSBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgICAgICAuIEFjY2VsZXJvbWV0ZXIKLSAqICAgICAgICAgICAuIEd5cm9zY29wZQotICogICAgICAgICAgIC4gQ2FtZXJhCi0gKiAgICAgICAgICAgLiBEZXB0aCBDYW1lcmEKLSAqCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfUE9TRV82RE9GICAgICAgICAgICAgICAgICAgICAgICAgICgyOCkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1BPU0VfNkRPRiAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5wb3NlXzZkb2YiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9TVEFUSU9OQVJZX0RFVEVDVAotICogdHJpZ2dlciBtb2RlOiBvbmUgc2hvdAotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSByZXR1cm5zIGFuIGV2ZW50IGlmIHRoZSBkZXZpY2UgaXMgc3RpbGwvc3RhdGlvbmFyeSBmb3IKLSAqIGEgd2hpbGUuIFRoZSBwZXJpb2Qgb2YgdGltZSB0byBtb25pdG9yIGZvciBzdGF0aW5hcml0eSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuCi0gKiA1IHNlY29uZHMsIGFuZCBsZXNzIHRoYW4gMTAgc2Vjb25kcy4KLSAqCi0gKiBTdGF0aW9uYXJpdHkgaGVyZSByZWZlcnMgdG8gYWJzb2x1dGUgc3RhdGlvbmFyaXR5LiBlZzogZGV2aWNlIG9uIGRlc2suCi0gKgotICogVGhlIG9ubHkgYWxsb3dlZCB2YWx1ZSB0byByZXR1cm4gaXMgMS4wLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1NUQVRJT05BUllfREVURUNUICAgICAgICAgICAgICAgICAgICgyOSkKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0FDQ0VMRVJPTUVURVIgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmFjY2VsZXJvbWV0ZXIiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9NQUdORVRJQ19GSUVMRCAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5tYWduZXRpY19maWVsZCIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX09SSUVOVEFUSU9OICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR1lST1NDT1BFICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZ3lyb3Njb3BlIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfTElHSFQgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IubGlnaHQiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5wcmVzc3VyZSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnRlbXBlcmF0dXJlIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUFJPWElNSVRZICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IucHJveGltaXR5IgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR1JBVklUWSAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZ3Jhdml0eSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04gICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmxpbmVhcl9hY2NlbGVyYXRpb24iCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9ST1RBVElPTl9WRUNUT1IgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5yb3RhdGlvbl92ZWN0b3IiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9SRUxBVElWRV9IVU1JRElUWSAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5yZWxhdGl2ZV9odW1pZGl0eSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0FNQklFTlRfVEVNUEVSQVRVUkUgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmFtYmllbnRfdGVtcGVyYXR1cmUiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9NQUdORVRJQ19GSUVMRF9VTkNBTElCUkFURUQgICJhbmRyb2lkLnNlbnNvci5tYWduZXRpY19maWVsZF91bmNhbGlicmF0ZWQiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HQU1FX1JPVEFUSU9OX1ZFQ1RPUiAgICAgICAgICJhbmRyb2lkLnNlbnNvci5nYW1lX3JvdGF0aW9uX3ZlY3RvciIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dZUk9TQ09QRV9VTkNBTElCUkFURUQgICAgICAgImFuZHJvaWQuc2Vuc29yLmd5cm9zY29wZV91bmNhbGlicmF0ZWQiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9TSUdOSUZJQ0FOVF9NT1RJT04gICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5zaWduaWZpY2FudF9tb3Rpb24iCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9TVEVQX0RFVEVDVE9SICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5zdGVwX2RldGVjdG9yIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfU1RFUF9DT1VOVEVSICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iuc3RlcF9jb3VudGVyIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR0VPTUFHTkVUSUNfUk9UQVRJT05fVkVDVE9SICAiYW5kcm9pZC5zZW5zb3IuZ2VvbWFnbmV0aWNfcm90YXRpb25fdmVjdG9yIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfSEVBUlRfUkFURSAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuaGVhcnRfcmF0ZSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1RJTFRfREVURUNUT1IgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnRpbHRfZGV0ZWN0b3IiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9XQUtFX0dFU1RVUkUgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci53YWtlX2dlc3R1cmUiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HTEFOQ0VfR0VTVFVSRSAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5nbGFuY2VfZ2VzdHVyZSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1BJQ0tfVVBfR0VTVFVSRSAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnBpY2tfdXBfZ2VzdHVyZSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1dSSVNUX1RJTFRfR0VTVFVSRSAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLndyaXN0X3RpbHRfZ2VzdHVyZSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0RFVklDRV9PUklFTlRBVElPTiAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmRldmljZV9vcmllbnRhdGlvbiIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1BPU0VfNkRPRiAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnBvc2VfNmRvZiIKICNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1NUQVRJT05BUllfREVURUNUICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnN0YXRpb25hcnlfZGV0ZWN0IgotCi0vKgotICogU0VOU09SX1RZUEVfTU9USU9OX0RFVEVDVAotICogdHJpZ2dlciBtb2RlOiBvbmUgc2hvdAotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSByZXR1cm5zIGFuIGV2ZW50IGlmIHRoZSBkZXZpY2UgaXMgbm90IHN0aWxsIGZvcgotICogYSB3aGlsZS4gVGhlIHBlcmlvZCBvZiB0aW1lIHRvIG1vbml0b3IgZm9yIHN0YXRpbmFyaXR5IHNob3VsZCBiZSBncmVhdGVyIHRoYW4KLSAqIDUgc2Vjb25kcywgYW5kIGxlc3MgdGhhbiAxMCBzZWNvbmRzLgotICoKLSAqIE1vdGlvbiBoZXJlIHJlZmVycyB0byBhbnkgbWVjaGFuaXNtIGluIHdoaWNoIHRoZSBkZXZpY2UgaXMgY2F1c2VzIHRvIGJlCi0gKiBtb3ZlZCBpbiBpdHMgaW5lcnRpYWwgZnJhbWUuIGVnOiBQaWNraW4gdXAgdGhlIGRldmljZSBhbmQgd2Fsa2luZyB3aXRoIGl0Ci0gKiB0byBhIG5lYXJieSByb29tIG1heSB0cmlnZ2VyIG1vdGlvbiB3aGVyZXdhcyBrZWVwaW5nIHRoZSBkZXZpY2Ugb24gYSB0YWJsZQotICogb24gYSBzbW9vdGggdHJhaW4gbW92aW5nIGF0IGNvbnN0YW50IHZlbG9jaXR5IG1heSBub3QgdHJpZ2dlciBtb3Rpb24uCi0gKgotICogVGhlIG9ubHkgYWxsb3dlZCB2YWx1ZSB0byByZXR1cm4gaXMgMS4wLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX01PVElPTl9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICgzMCkKICNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX01PVElPTl9ERVRFQ1QgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLm1vdGlvbl9kZXRlY3QiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9IRUFSVF9CRUFUCi0gKiB0cmlnZ2VyIG1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgcmV0dXJucyBhbiBldmVudCBldmVyeXRpbWUgYSBoZWFyIGJlYXQgcGVhayBpcwotICogZGV0ZWN0ZWQuCi0gKgotICogUGVhayBoZXJlIGlkZWFsbHkgY29ycmVzcG9uZHMgdG8gdGhlIHBvc2l0aXZlIHBlYWsgaW4gdGhlIFFSUyBjb21wbGV4IG9mCi0gKiBhbmQgRUNHIHNpZ25hbC4KLSAqCi0gKiBUaGUgc2Vuc29yIGlzIG5vdCBleHBlY3RlZCB0byBiZSBvcHRpbWl6ZWQgZm9yIGxhdGVuY3kuIEFzIGEgZ3VpZGUsIGEKLSAqIGxhdGVuY3kgb2YgdXAgdG8gMTAgc2Vjb25kcyBpcyBhY2NlcHRhYmxlLiBIb3dldmVyIHRoZSB0aW1lc3RhbXAgYXR0YWNoZWQKLSAqIHRvIHRoZSBldmVudCBzaG91bGQgYmUgYWNjdXJhdGUgYW5kIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSB0aW1lIHRoZSBwZWFrCi0gKiBvY2N1cmVkLgotICoKLSAqIFRoZSBzZW5zb3IgZXZlbnQgY29udGFpbnMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBjb25maWRlbmNlIGluIHRoZSBkZXRlY3Rpb24KLSAqIG9mIHRoZSBwZWFrIHdoZXJlIDAuMCByZXByZXNlbnQgbm8gaW5mb3JtYXRpb24gYXQgYWxsLCBhbmQgMS4wIHJlcHJlc2VudHMKLSAqIGNlcnRhaW50eS4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9IRUFSVF9CRUFUICAgICAgICAgICAgICAgICAgICAgICAgICAoMzEpCiAjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9IRUFSVF9CRUFUICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5oZWFydF9iZWF0IgotCi0vKioKLSAqIFNFTlNPUl9UWVBFX0RZTkFNSUNfU0VOU09SX01FVEEKLSAqIHRyaWdnZXItbW9kZTogc3BlY2lhbAotICogd2FrZS11cCBzZW5zb3I6IHllcwotICoKLSAqIEEgc2Vuc29yIGV2ZW50IG9mIHRoaXMgdHlwZSBpcyByZWNlaXZlZCB3aGVuIGEgZHluYW1pYyBzZW5zb3IgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZQotICogc3lzdGVtLiBBdCBtb3N0IG9uZSBzZW5zb3Igb2YgdGhpcyB0eXBlIGNhbiBiZSBwcmVzZW50IGluIG9uZSBzZW5zb3IgSEFMIGltcGxlbWVudGF0aW9uIGFuZAotICogcHJlc2VuY2Ugb2YgYSBzZW5zb3Igb2YgdGhpcyB0eXBlIGluIHNlbnNvciBIQUwgaW1wbGVtZW50YXRpb24gaW5kaWNhdGVzIHRoYXQgdGhpcyBzZW5zb3IgSEFMCi0gKiBzdXBwb3J0cyBkeW5hbWljIHNlbnNvciBmZWF0dXJlLiBPcGVyYXRpb25zLCBzdWNoIGFzIGJhdGNoLCBhY3RpdmF0ZSBhbmQgc2V0RGVsYXksIHRvIHRoaXMKLSAqIHNwZWNpYWwgcHVycG9zZSBzZW5zb3Igc2hvdWxkIGJlIHRyZWF0ZWQgYXMgbm8tb3AgYW5kIHJldHVybiBzdWNjZXNzZnVsLgotICoKLSAqIEEgZHluYW1pYyBzZW5zb3IgY29ubmVjdGlvbiBpbmRpY2F0ZXMgY29ubmVjdGlvbiBvZiBhIHBoeXNpY2FsIGRldmljZSBvciBpbnN0YW50aWF0aW9uIG9mIGEKLSAqIHZpcnR1YWwgc2Vuc29yIGJhY2tlZCBieSBhbGdvcml0aG07IGFuZCBhIGR5bmFtaWMgc2Vuc29yIGRpc2Nvbm5lY3Rpb24gaW5kaWNhdGVzIHRoZSB0aGUKLSAqIG9wcG9zaXRlLiBBIHNlbnNvciBldmVudCBvZiBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBIHR5cGUgc2hvdWxkIGJlIGRlbGl2ZXJlZCByZWdhcmRsZXNzCi0gKiBvZiB0aGUgYWN0aXZhdGlvbiBzdGF0dXMgb2YgdGhlIHNlbnNvciBpbiB0aGUgZXZlbnQgb2YgZHluYW1pYyBzZW5zb3IgY29ubmVjdGlvbiBhbmQKLSAqIGRpc2Nvbm5lY3Rpb24uIEluIHRoZSBzZW5zb3IgZXZlbnQsIGJlc2lkZXMgdGhlIGNvbW1vbiBkYXRhIGVudHJpZXMsICJkeW5hbWljX3NlbnNvcl9tZXRhIiwgd2hpY2gKLSAqIGluY2x1ZGVzIGZpZWxkcyBmb3IgY29ubmVjdGlvbiBzdGF0dXMsIGhhbmRsZSBvZiB0aGUgc2Vuc29yIGludm9sdmVkLCBwb2ludGVyIHRvIHNlbnNvcl90Ci0gKiBzdHJ1Y3R1cmUgYW5kIGEgdXVpZCBmaWVsZCwgc2hvdWxkIGJlIHBvcHVsYXRlZC4KLSAqCi0gKiBBdCBhIGR5bmFtaWMgc2Vuc29yIGNvbm5lY3Rpb24gZXZlbnQsIGZpZWxkcyBvZiBzZW5zb3JfdCBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieSBhIHBvaW50ZXIgaW4KLSAqIGR5bmFtaWNfc2Vuc29yX21ldGEgc2hvdWxkIGJlIGZpbGxlZCBhcyBpZiBpdCB3YXMgcmVndWxhciBzZW5zb3JzLiBTZW5zb3IgSEFMIGlzIHJlc3BvbnNpYmxlIGZvcgotICogcmVjb3Zlcnkgb2YgbWVtb3J5IGlmIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgaXMgZHluYW1pY2lhbGx5IGFsbG9jYXRlZC4gSG93ZXZlciwgdGhlIHRoZSBwb2ludGVyCi0gKiBtdXN0IGJlIHZhbGlkIHVudGlsIHRoZSBmaXJzdCBhY3RpdmF0ZSBjYWxsIHRvIHRoZSBzZW5zb3IgcmVwb3J0ZWQgaW4gdGhpcyBjb25uZWN0aW9uIGV2ZW50LiBBdCBhCi0gKiBkeW5hbWljIHNlbnNvciBkaXNjb25uZWN0aW9uLCB0aGUgc2Vuc29yX3QgcG9pbnRlciBzaG91bGQgYmUgTlVMTC4KLSAqCi0gKiBUaGUgc2Vuc29yIGhhbmRsZSBhc3NpZ25lZCB0byBkeW5hbWljIHNlbnNvcnMgc2hvdWxkIG5ldmVyIGJlIHRoZSBzYW1lIGFzIHRoYXQgb2YgYW55IHJlZ3VsYXIKLSAqIHN0YXRpYyBzZW5zb3JzLCBhbmQgc2hvdWxkIGJlIHVuaXF1ZSB1bnRpbCBuZXh0IGJvb3QuIEluIGFub3RoZXIgd29yZCwgaWYgYSBoYW5kbGUgaCBpcyB1c2VkIGZvcgotICogYSBkeW5hbWljIHNlbnNvciBBLCB0aGF0IHNhbWUgbnVtYmVyIGNhbm5vdCBiZSB1c2VkIGZvciB0aGUgc2FtZSBkeW5hbWljIHNlbnNvciBBIG9yIGFub3RoZXIKLSAqIGR5bmFtaWMgc2Vuc29yIEIgZXZlbiBhZnRlciBkaXNjb25uZWN0aW9uIG9mIEEgdW50aWwgcmVib290LgotICoKLSAqIFRoZSBVVUlEIGZpZWxkIHdpbGwgYmUgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIHNlbnNvciBpbiBhZGRpdGlvbiB0byBuYW1lLCB2ZW5kb3IgYW5kIHZlcnNpb24KLSAqIGFuZCB0eXBlLiBGb3IgcGh5c2ljYWwgc2Vuc29ycyBvZiB0aGUgc2FtZSBtb2RlbCwgYWxsIHNlbnNvcnMgd2lsbCBoYXZlIHRoZSBzYW1lIHZhbHVlcyBpbgotICogc2Vuc29yX3QsIGJ1dCB0aGUgVVVJRCBzaG91bGQgYmUgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGZvciBlYWNoIGluZGl2aWR1YWwgdW5pdC4gQW4gYWxsIHplcm8gVVVJRAotICogaW5kaWNhdGVzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkaWZmZXJlbnRpYXRlIGluZGl2aWR1YWwgc2Vuc29yIHVuaXQuCi0gKgotICogSXQgaXMgcmVjb21tZW5kZWQgdG8gaW1wbGVtZW50IHRoaXMgdHlwZSBhcyB3YWtlIHVwIHNlbnNvci4KLSAqCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfRFlOQU1JQ19TRU5TT1JfTUVUQSAgICAgICAgICAgICAgICAgICAgICAgICAoMzIpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmR5bmFtaWNfc2Vuc29yX21ldGEiCi0KLS8qKgotICogU0VOU09SX1RZUEVfQURESVRJT05BTF9JTkZPCi0gKiByZXBvcnRpbmctbW9kZTogTi9BCi0gKgotICogVGhpcyBzZW5zb3IgdHlwZSBpcyBmb3IgZGVsaXZlcmluZyBhZGRpdGlvbmFsIHNlbnNvciBpbmZvcm1hdGlvbiBhc2lkZSBmcm9tIHNlbnNvciBldmVudCBkYXRhLgotICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgaW5jbHVkZSBzZW5zb3IgZnJvbnQtZW5kIGdyb3VwIGRlbGF5LCBpbnRlcm5hbCBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzLAotICogbm9pc2UgbGV2ZWwgbWV0cmljcywgZGV2aWNlIGludGVybmFsIHRlbXBlcmF0dXJlLCBldGMuCi0gKgotICogVGhpcyB0eXBlIHdpbGwgbmV2ZXIgYmluZCB0byBhIHNlbnNvci4gSW4gb3RoZXIgd29yZHMsIG5vIHNlbnNvciBpbiB0aGUgc2Vuc29yIGxpc3Qgc2hvdWxkIGJlIG9mCi0gKiB0aGUgdHlwZSBTRU5TT1JfVFlQRV9BRERJVElPTkFMX0lORk8uIElmIGEgc2Vuc29yIEhBTCBzdXBwb3J0cyBzZW5zb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogZmVhdHVyZSwgaXQgcmVwb3J0cyBzZW5zb3JfZXZlbnRfdCB3aXRoICJzZW5zb3IiIGZpZWxkIHNldCB0byBoYW5kbGUgb2YgdGhlIHJlcG9ydGluZyBzZW5zb3IgYW5kCi0gKiAidHlwZSIgZmllbGQgc2V0IHRvIFNFTlNPUl9UWVBFX0FERElUSU9OQUxfSU5GTy4gRGVsaXZlcnkgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBldmVudHMgaXMKLSAqIHRyaWdnZXJlZCB1bmRlciB0d28gY29uZGl0aW9uczogYW4gZW5hYmxlIGFjdGl2YXRlKCkgY2FsbCBvciBhIGZsdXNoKCkgY2FsbCB0byB0aGUgY29ycmVzcG9uZGluZwotICogc2Vuc29yLgotICoKLSAqIEEgc2luZ2xlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVwb3J0IGNvbnNpc3RzIG9mIG11bHRpcGxlIGZyYW1lcy4gU2VxdWVuY2VzIG9mIHRoZXNlIGZyYW1lcyBhcmUKLSAqIG9yZGVyZWQgdXNpbmcgdGltZXN0YW1wcywgd2hpY2ggbWVhbnMgdGhlIHRpbWVzdGFtcHMgb2Ygc2VxdWVudGlhbCBmcmFtZXMgaGF2ZSB0byBiZSBhdCBsZWFzdCAxCi0gKiBuYW5vc2Vjb25kIGFwYXJ0IGZyb20gZWFjaCBvdGhlci4gRWFjaCBmcmFtZSBpcyBhIHNlbnNvcl9ldmVudF90IGRlbGl2ZXJlZCB0aHJvdWdoIHRoZSBIQUwKLSAqIGludGVyZmFjZSwgd2l0aCByZWxhdGVkIGRhdGEgc3RvcmVkIGluIHRoZSAiYWRkaXRpb25hbF9pbmZvIiBmaWVsZCwgd2hpY2ggaXMgb2YgdHlwZQotICogYWRkaXRpb25hbF9pbmZvX2V2ZW50X3QuICBUaGUgInR5cGUiIGZpZWxkIG9mIGFkZGl0aW9uYWxfaW5mb19ldmVudF90IGRlbm90ZXMgdGhlIG5hdHVyZSBvZiB0aGUKLSAqIHBheWxvYWQgZGF0YSAoc2VlIGFkZGl0aW9uYWxfaW5mb190eXBlX3QpLiAgVGhlICJzZXJpYWwiIGZpZWxkIGlzIHVzZWQgdG8ga2VlcCB0aGUgc2VxdWVuY2Ugb2YKLSAqIHBheWxvYWQgZGF0YSB0aGF0IHNwYW5zIG11bHRpcGxlIGZyYW1lcy4gVGhlIGZpcnN0IGZyYW1lIG9mIHRoZSBlbnRpcmUgcmVwb3J0IGlzIGFsd2F5cyBvZiB0eXBlCi0gKiBBSU5GT19CRUdJTiwgYW5kIHRoZSBsYXN0IGZyYW1lIGlzIGFsd2F5cyBBSU5GT19FTkQuCi0gKgotICogQWxsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZnJhbWVzIGhhdmUgdG8gYmUgZGVsaXZlcmVkIGFmdGVyIGZsdXNoIGNvbXBsZXRlIGV2ZW50IGlmIGZsdXNoKCkgd2FzCi0gKiB0cmlnZ2VyaW5nIHRoZSByZXBvcnQuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfQURESVRJT05BTF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAoMzMpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9BRERJVElPTkFMX0lORk8gICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmFkZGl0aW9uYWxfaW5mbyIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0RZTkFNSUNfU0VOU09SX01FVEEgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmR5bmFtaWNfc2Vuc29yX21ldGEiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9BRERJVElPTkFMX0lORk8gICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5hZGRpdGlvbmFsX2luZm8iCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9MT1dfTEFURU5DWV9PRkZCT0RZX0RFVEVDVCAgICJhbmRyb2lkLnNlbnNvci5sb3dfbGF0ZW5jeV9vZmZib2R5X2RldGVjdCIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0FDQ0VMRVJPTUVURVJfVU5DQUxJQlJBVEVEICAgImFuZHJvaWQuc2Vuc29yLmFjY2VsZXJvbWV0ZXJfdW5jYWxpYnJhdGVkIgogCiAvKioKICAqIFZhbHVlcyByZXR1cm5lZCBieSB0aGUgYWNjZWxlcm9tZXRlciBpbiB2YXJpb3VzIGxvY2F0aW9ucyBpbiB0aGUgdW5pdmVyc2UuCkBAIC04NzksMTYgKzE5OSw2IEBACiAvKiogTWluaW11bSBtYWduZXRpYyBmaWVsZCBvbiBFYXJ0aCdzIHN1cmZhY2UgKi8KICNkZWZpbmUgTUFHTkVUSUNfRklFTERfRUFSVEhfTUlOICAgICgzMC4wZikKIAotLyoqCi0gKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHN0YXR1cyBmaWVsZCBvZiBzZW5zb3IgZXZlbnRzLgotICovCi0jZGVmaW5lIFNFTlNPUl9TVEFUVVNfTk9fQ09OVEFDVCAgICAgICAgLTEKLSNkZWZpbmUgU0VOU09SX1NUQVRVU19VTlJFTElBQkxFICAgICAgICAwCi0jZGVmaW5lIFNFTlNPUl9TVEFUVVNfQUNDVVJBQ1lfTE9XICAgICAgMQotI2RlZmluZSBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX01FRElVTSAgIDIKLSNkZWZpbmUgU0VOU09SX1NUQVRVU19BQ0NVUkFDWV9ISUdIICAgICAzCi0KLQogc3RydWN0IHNlbnNvcl90OwogCiAvKioKQEAgLTkxMyw3ICsyMjMsNyBAQAogfSBzZW5zb3JzX3ZlY190OwogCiAvKioKLSAqIHVuY2FsaWJyYXRlZCBneXJvc2NvcGUgYW5kIG1hZ25ldG9tZXRlciBldmVudCBkYXRhCisgKiB1bmNhbGlicmF0ZWQgYWNjZWxlcm9tZXRlciwgZ3lyb3Njb3BlIGFuZCBtYWduZXRvbWV0ZXIgZXZlbnQgZGF0YQogICovCiB0eXBlZGVmIHN0cnVjdCB7CiAgIHVuaW9uIHsKQEAgLTk4MCw3NSArMjkwLDYgQEAKICAgICB9OwogfSBhZGRpdGlvbmFsX2luZm9fZXZlbnRfdDsKIAotdHlwZWRlZiBlbnVtIGFkZGl0aW9uYWxfaW5mb190eXBlIHsKLSAgICAvLwotICAgIEFJTkZPX0JFR0lOID0gMHgwLCAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrcyB0aGUgYmVnaW5uaW5nIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZnJhbWVzCi0gICAgQUlORk9fRU5EICAgPSAweDEsICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmtzIHRoZSBlbmQgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcmFtZXMKLSAgICAvLyBCYXNpYyBpbmZvcm1hdGlvbgotICAgIEFJTkZPX1VOVFJBQ0tFRF9ERUxBWSA9ICAweDEwMDAwLCAgICAgICAvLyBFc3RpbWF0aW9uIG9mIHRoZSBkZWxheSB0aGF0IGlzIG5vdCB0cmFja2VkIGJ5IHNlbnNvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lc3RhbXBzLiBUaGlzIGluY2x1ZGVzIGRlbGF5IGludHJvZHVjZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Vuc29yIGZyb250LWVuZCBmaWx0ZXJpbmcsIGRhdGEgdHJhbnNwb3J0LCBldGMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0WzJdOiBkZWxheSBpbiBzZWNvbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZXN0aW1hdGVkIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgQUlORk9fSU5URVJOQUxfVEVNUEVSQVRVUkUsICAgICAgICAgICAgIC8vIGZsb2F0OiBDZWxzaXVzIHRlbXBlcmF0dXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX1ZFQzNfQ0FMSUJSQVRJT04sICAgICAgICAgICAgICAgICAvLyBGaXJzdCB0aHJlZSByb3dzIG9mIGEgaG9tb2dlbmVvdXMgbWF0cml4LCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXByZXNlbnRzIGNhbGlicmF0aW9uIHRvIGEgdGhyZWUtZWxlbWVudCB2ZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmF3IHNlbnNvciByZWFkaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFsxMl06IDN4NCBtYXRyaXggaW4gcm93IG1ham9yIG9yZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgQUlORk9fU0VOU09SX1BMQUNFTUVOVCwgICAgICAgICAgICAgICAgIC8vIExvY2F0aW9uIGFuZCBvcmllbnRhdGlvbiBvZiBzZW5zb3IgZWxlbWVudCBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGZyYW1lOiBvcmlnaW4gaXMgdGhlIGdlb21ldHJpYyBjZW50ZXIgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vYmlsZSBkZXZpY2Ugc2NyZWVuIHN1cmZhY2U7IHRoZSBheGlzIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gQW5kcm9pZCBzZW5zb3IgZGVmaW5pdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0WzEyXTogM3g0IG1hdHJpeCBpbiByb3cgbWFqb3Igb3JkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19TQU1QTElORywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbMl06IHJhdyBzYW1wbGUgcGVyaW9kIGluIHNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBzdGFuZGFyZCBkZXZpYXRpb24gb2Ygc2FtcGxpbmcgcGVyaW9kCi0KLSAgICAvLyBTYW1wbGluZyBjaGFubmVsIG1vZGVsaW5nIGluZm9ybWF0aW9uCi0gICAgQUlORk9fQ0hBTk5FTF9OT0lTRSA9IDB4MjAwMDAsICAgICAgICAgIC8vIGludDMyX3Q6IG5vaXNlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbbl06IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19DSEFOTkVMX1NBTVBMRVIsICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbM106IHNhbXBsZSBwZXJpb2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBzYW1wbGUgcGVyaW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgcXVhbnRpemF0aW9uIHVuaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19DSEFOTkVMX0ZJTFRFUiwgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIGZpbHRlcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBcc3VtX2ogYV9qIHlbbi1qXSA9PSBcc3VtX2kgYl9pIHhbbi1pXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMl90WzNdOiBudW1iZXIgb2YgZmVlZGZvcndhcmQgY29lZmZpY2llbnRzLCBNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBudW1iZXIgb2YgZmVlZGJhY2sgY29lZmZpY2llbnRzLCBOLCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBGSVIgZmlsdGVyLCBOPTEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGJpdCBtYXNrIHRoYXQgcmVwcmVzZW50cyB3aGljaCBlbGVtZW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgd2hpY2ggdGhlIGZpbHRlciBpcyBhcHBsaWVkLCBiaXQgMCA9PSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgbWVhbnMgdGhpcyBmaWx0ZXIgYXBwbGllcyB0byB2ZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBlbGVtZW50IDAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0W00rTl06IGZpbHRlciBjb2VmZmljaWVudHMgKGIwLCBiMSwgLi4uLCBCTS0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgdGhlbiAoYTAsIGExLCAuLi4sIGFOLTEpLCBhMCBpcyBhbHdheXMgMS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgTXVsdGlwbGUgZnJhbWVzIG1heSBiZSBuZWVkZWQgZm9yIGhpZ2hlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBudW1iZXIgb2YgdGFwcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19DSEFOTkVMX0xJTkVBUl9UUkFOU0ZPUk0sICAgICAgICAgLy8gaW50MzJfdFsyXTogc2l6ZSBpbiAocm93LCBjb2x1bW4pIC4uLiAxc3QgZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbbl06IG1hdHJpeCBlbGVtZW50IHZhbHVlcyBpbiByb3cgbWFqb3Igb3JkZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgQUlORk9fQ0hBTk5FTF9OT05MSU5FQVJfTUFQLCAgICAgICAgICAgIC8vIGludDMyX3RbMl06IGV4dHJhcG9sYXRlIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbbl06IG1hcHBpbmcga2V5IHBvaW50cyBpbiBwYWlycywgKGluLCBvdXQpLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAobWF5IGJlIHVzZWQgdG8gbW9kZWwgc2F0dXJhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19DSEFOTkVMX1JFU0FNUExFUiwgICAgICAgICAgICAgICAgLy8gaW50MzJfdDogIHJlc2FtcGxlIG1ldGhvZCAoMC10aCBvcmRlciwgMXN0IG9yZGVyLi4uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFsxXTogcmVzYW1wbGUgcmF0aW8gKHVwc2FtcGxpbmcgaWYgPCAxLjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBkb3duc2FtcGxpbmcgaWYgPiAxLjApLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotCi0gICAgLy8gQ3VzdG9tIGluZm9ybWF0aW9uCi0gICAgQUlORk9fQ1VTVE9NX1NUQVJUID0gICAgMHgxMDAwMDAwMCwgICAgIC8vCi0gICAgLy8gRGVidWdnaW5nCi0gICAgQUlORk9fREVCVUdHSU5HX1NUQVJUID0gMHg0MDAwMDAwMCwgICAgIC8vCi19IGFkZGl0aW9uYWxfaW5mb190eXBlX3Q7Ci0KIC8qKgogICogVW5pb24gb2YgdGhlIHZhcmlvdXMgdHlwZXMgb2Ygc2Vuc29yIGRhdGEKICAqIHRoYXQgY2FuIGJlIHJldHVybmVkLgpAQCAtMTEwNiw2ICszNDcsOSBAQAogICAgICAgICAgICAgLyogdW5jYWxpYnJhdGVkIG1hZ25ldG9tZXRlciB2YWx1ZXMgYXJlIGluIG1pY3JvLVRlc2xhcyAqLwogICAgICAgICAgICAgdW5jYWxpYnJhdGVkX2V2ZW50X3QgdW5jYWxpYnJhdGVkX21hZ25ldGljOwogCisgICAgICAgICAgICAvKiB1bmNhbGlicmF0ZWQgYWNjZWxlcm9tZXRlciB2YWx1ZXMgYXJlIGluICBtZXRlciBwZXIgc2Vjb25kIHBlciBzZWNvbmQgKG0vc14yKSAqLworICAgICAgICAgICAgdW5jYWxpYnJhdGVkX2V2ZW50X3QgdW5jYWxpYnJhdGVkX2FjY2VsZXJvbWV0ZXI7CisKICAgICAgICAgICAgIC8qIGhlYXJ0IHJhdGUgZGF0YSBjb250YWluaW5nIHZhbHVlIGluIGJwbSBhbmQgc3RhdHVzICovCiAgICAgICAgICAgICBoZWFydF9yYXRlX2V2ZW50X3QgaGVhcnRfcmF0ZTsKIApAQCAtMTIyOCwxMyArNDcyLDE0IEBACiAgICAgICovCiAgICAgdWludDMyX3QgICAgICAgIGZpZm9NYXhFdmVudENvdW50OwogCi0gICAgLyogdHlwZSBvZiB0aGlzIHNlbnNvciBhcyBhIHN0cmluZy4gU2V0IHRvIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBTRU5TT1JfU1RSSU5HX1RZUEVfKi4KLSAgICAgKiBXaGVuIGRlZmluaW5nIGFuIE9FTSBzcGVjaWZpYyBzZW5zb3Igb3Igc2Vuc29yIG1hbnVmYWN0dXJlciBzcGVjaWZpYwotICAgICAqIHNlbnNvciwgdXNlIHlvdXIgcmVzZXJ2ZSBkb21haW4gbmFtZSBhcyBhIHByZWZpeC4KLSAgICAgKiBleDogY29tLmdvb2dsZS5nbGFzcy5vbmhlYWRkZXRlY3RvcgotICAgICAqIEZvciBzZW5zb3JzIG9mIGtub3duIHR5cGUsIHRoZSBhbmRyb2lkIGZyYW1ld29yayBtaWdodCBvdmVyd3JpdGUgdGhpcwotICAgICAqIHN0cmluZyBhdXRvbWF0aWNhbGx5LgorICAgIC8qIHR5cGUgb2YgdGhpcyBzZW5zb3IgYXMgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBJZiB0eXBlIGlzIE9FTSBzcGVjaWZpYyBvciBzZW5zb3IgbWFudWZhY3R1cmVyIHNwZWNpZmljIHR5cGUKKyAgICAgKiAoPj1TRU5TT1JfVFlQRV9ERVZJQ0VfUFJJVkFURV9CQVNFKSwgdGhpcyBzdHJpbmcgbXVzdCBiZSBkZWZpbmVkIHdpdGggcmVzZXJ2ZWQgZG9tYWluIG9mCisgICAgICogdmVuZG9yL09FTSBhcyBhIHByZWZpeCwgZS5nLiBjb20uZ29vZ2xlLmdsYXNzLm9uaGVhZGRldGVjdG9yCisgICAgICoKKyAgICAgKiBGb3Igc2Vuc29ycyBvZiBBbmRyb2lkIGRlZmluZWQgdHlwZXMsIEFuZHJvaWQgZnJhbWV3b3JrIHdpbGwgb3ZlcnJpZGUgdGhpcyB2YWx1ZS4gSXQgaXMgb2sgdG8KKyAgICAgKiBsZWF2ZSBpdCBwb2ludGluZyB0byBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICovCiAgICAgY29uc3QgY2hhciogICAgc3RyaW5nVHlwZTsKIApAQCAtMTI4MCw2ICs1MjUsMjMgQEAKICAgICB2b2lkKiAgICAgICAgICAgcmVzZXJ2ZWRbMl07CiB9OwogCisvKioKKyAqIFNoYXJlZCBtZW1vcnkgaW5mb3JtYXRpb24gZm9yIGEgZGlyZWN0IGNoYW5uZWwKKyAqLworc3RydWN0IHNlbnNvcnNfZGlyZWN0X21lbV90IHsKKyAgICBpbnQgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnVtIFNFTlNPUl9ESVJFQ1RfTUVNXy4uLgorICAgIGludCBmb3JtYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudW0gU0VOU09SX0RJUkVDVF9GTVRfLi4uCisgICAgc2l6ZV90IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbiwgaW4gYnl0ZXMKKyAgICBjb25zdCBzdHJ1Y3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlOyAvLyBzaGFyZWQgbWVtb3J5IGhhbmRsZSwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gdHlwZQorfTsKKworLyoqCisgKiBEaXJlY3QgY2hhbm5lbCByZXBvcnQgY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3Qgc2Vuc29yc19kaXJlY3RfY2ZnX3QgeworICAgIGludCByYXRlX2xldmVsOyAgICAgICAgICAgICAvLyBlbnVtIFNFTlNPUl9ESVJFQ1RfUkFURV8uLi4KK307CiAKIC8qCiAgKiBzZW5zb3JzX3BvbGxfZGV2aWNlX3QgaXMgdXNlZCB3aXRoIFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzBfMQpAQCAtMTMzNiw3ICs1OTgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IHNlbnNvcl9oYW5kbGUsIGludDY0X3Qgc2FtcGxpbmdfcGVyaW9kX25zKTsKIAogICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNlbnNvciBkYXRhLgorICAgICAgICAgICAgICogV3JpdGUgYW4gYXJyYXkgb2Ygc2Vuc29yX2V2ZW50X3QgdG8gZGF0YS4gVGhlIHNpemUgb2YgdGhlCisgICAgICAgICAgICAgKiBhdmFpbGFibGUgYnVmZmVyIGlzIHNwZWNpZmllZCBieSBjb3VudC4gUmV0dXJucyBudW1iZXIgb2YKKyAgICAgICAgICAgICAqIHZhbGlkIHNlbnNvcl9ldmVudF90LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJsb2NrIGlmIHRoZXJlIGlzIG5vIHNlbnNvciBldmVudAorICAgICAgICAgICAgICogYXZhaWxhYmxlIHdoZW4gYmVpbmcgY2FsbGVkLiBUaHVzLCByZXR1cm4gdmFsdWUgc2hvdWxkIGFsd2F5cyBiZQorICAgICAgICAgICAgICogcG9zaXRpdmUuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGludCAoKnBvbGwpKHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlX3QgKmRldiwKICAgICAgICAgICAgICAgICAgICAgc2Vuc29yc19ldmVudF90KiBkYXRhLCBpbnQgY291bnQpOwpAQCAtMTM4MSw3ICs2NDksNjEgQEAKICAgICAgKi8KICAgICBpbnQgKCppbmplY3Rfc2Vuc29yX2RhdGEpKHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlXzEgKmRldiwgY29uc3Qgc2Vuc29yc19ldmVudF90ICpkYXRhKTsKIAotICAgIHZvaWQgKCpyZXNlcnZlZF9wcm9jc1s3XSkodm9pZCk7CisgICAgLyoKKyAgICAgKiBSZWdpc3Rlci91bnJlZ2lzdGVyIGRpcmVjdCByZXBvcnQgY2hhbm5lbC4KKyAgICAgKgorICAgICAqIEEgSEFMIGRlY2xhcmVzIHN1cHBvcnQgZm9yIGRpcmVjdCByZXBvcnQgYnkgc2V0dGluZyBub24tTlVMTCB2YWx1ZXMgZm9yIGJvdGgKKyAgICAgKiByZWdpc3Rlcl9kaXJlY3RfY2hhbm5lbCBhbmQgY29uZmlnX2RpcmVjdF9yZXBvcnQuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyB0d28gb3BlcmF0aW9uIG1vZGVzOgorICAgICAqCisgICAgICogUmVnaXN0ZXI6IG1lbSAhPSBOVUxMLCByZWdpc3RlciBhIGNoYW5uZWwgdXNpbmcgc3VwcGxpZWQgc2hhcmVkIG1lbW9yeSBpbmZvcm1hdGlvbi4gQnkgdGhlCisgICAgICogdGltZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHNlbnNvcnMgbXVzdCBmaW5pc2ggaW5pdGlhbGl6aW5nIHNoYXJlZCBtZW1vcnkgY29udGVudAorICAgICAqIChmb3JtYXQgZGVwZW5kZW50LCBzZWUgU0VOU09SX0RJUkVDVF9GTVRfKikuCisgICAgICogICAgICBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgICAgIG1lbSAgICAgICAgICAgICBwb2ludHMgdG8gYSB2YWxpZCBzdHJ1Y3Qgc2Vuc29yc19kaXJlY3RfbWVtX3QuCisgICAgICogICAgICAgICAgY2hhbm5lbF9oYW5kbGUgIGlzIGlnbm9yZWQuCisgICAgICogICAgICBSZXR1cm4gdmFsdWU6CisgICAgICogICAgICAgICAgQSBoYW5kbGUgb2YgY2hhbm5lbCAoPjAsIDxJTlQzMl9NQVgpIHdoZW4gc3VjY2Vzcywgd2hpY2ggbGF0ZXIgY2FuIGJlIHJlZmVycmVkIGluCisgICAgICogICAgICAgICAgdW5yZWdpc3RlciBvciBjb25maWdfZGlyZWN0X3JlcG9ydCBjYWxsLCBvciBlcnJvciBjb2RlICg8MCkgd2hlbiBmYWlsZWQKKyAgICAgKiBVbnJlZ2lzdGVyOiBtZW0gPT0gTlVMTCwgdW5yZWdpc3RlciBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjaGFubmVsLgorICAgICAqICAgICAgUGFyYW1ldGVyczoKKyAgICAgKiAgICAgICAgICBtZW0gICAgICAgICAgICAgc2V0IHRvIE5VTEwKKyAgICAgKiAgICAgICAgICBjaGFubmVsX2hhbmRsZSAgY29udGFpbnMgaGFuZGxlIG9mIGNoYW5uZWwgdG8gYmUgdW5yZWdpc3RlcmVkCisgICAgICogICAgICBSZXR1cm4gdmFsdWU6CisgICAgICogICAgICAgICAgMCwgZXZlbiBpZiB0aGUgY2hhbm5lbF9oYW5kbGUgaXMgaW52YWxpZCwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIGEgbm8tb3AuCisgICAgICovCisgICAgaW50ICgqcmVnaXN0ZXJfZGlyZWN0X2NoYW5uZWwpKHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlXzEgKmRldiwKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzZW5zb3JzX2RpcmVjdF9tZW1fdCogbWVtLCBpbnQgY2hhbm5lbF9oYW5kbGUpOworCisgICAgLyoKKyAgICAgKiBDb25maWd1cmUgZGlyZWN0IHNlbnNvciBldmVudCByZXBvcnQgaW4gZGlyZWN0IGNoYW5uZWwuCisgICAgICoKKyAgICAgKiBTdGFydCwgbW9kaWZ5IHJhdGUgb3Igc3RvcCBkaXJlY3QgcmVwb3J0IG9mIGEgc2Vuc29yIGluIGEgY2VydGFpbiBkaXJlY3QgY2hhbm5lbC4gQSBzcGVjaWFsCisgICAgICogY2FzZSBpcyBzZXR0aW5nIHNlbnNvciBoYW5kbGUgLTEgdG8gc3RvcCBtZWFucyB0byBzdG9wIGFsbCBhY3RpdmUgc2Vuc29yIHJlcG9ydCBvbiB0aGUKKyAgICAgKiBjaGFubmVsIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEEgSEFMIGRlY2xhcmVzIHN1cHBvcnQgZm9yIGRpcmVjdCByZXBvcnQgYnkgc2V0dGluZyBub24tTlVMTCB2YWx1ZXMgZm9yIGJvdGgKKyAgICAgKiByZWdpc3Rlcl9kaXJlY3RfY2hhbm5lbCBhbmQgY29uZmlnX2RpcmVjdF9yZXBvcnQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgc2Vuc29yX2hhbmRsZSAgIHNlbnNvciB0byBiZSBjb25maWd1cmVkLiBUaGUgc2Vuc29yIGhhcyB0byBzdXBwb3J0IGRpcmVjdCByZXBvcnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBtb2RlIGJ5IHNldHRpbmcgZmxhZ3Mgb2Ygc2Vuc29yX3QuIEFsc28sIGRpcmVjdCByZXBvcnQgbW9kZSBpcyBvbmx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBmb3IgY29udGludW91cyByZXBvcnRpbmcgbW9kZSBzZW5zb3JzLgorICAgICAqICAgICAgY2hhbm5lbF9oYW5kbGUgIGNoYW5uZWwgaGFuZGxlIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICogICAgICBjb25maWcgICAgICAgICAgZGlyZWN0IHJlcG9ydCBwYXJhbWV0ZXJzLCBzZWUgc2Vuc29yX2RpcmVjdF9jZmdfdC4KKyAgICAgKiBSZXR1cm4gdmFsdWU6CisgICAgICogICAgICAtIHdoZW4gc2Vuc29yIGlzIHN0YXJ0ZWQgb3Igc2Vuc29yIHJhdGUgbGV2ZWwgaXMgY2hhbmdlZDogcmV0dXJuIHBvc2l0aXZlIGlkZW50aWZpZXIgb2YKKyAgICAgKiAgICAgICAgc2Vuc29yIGluIHNwZWNpZmllZCBjaGFubmVsIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSByZXR1cm4gbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKiAgICAgIC0gd2hlbiBzZW5zb3IgaXMgc3RvcHBlZDogcmV0dXJuIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBpbnQgKCpjb25maWdfZGlyZWN0X3JlcG9ydCkoc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfMSAqZGV2LAorICAgICAgICAgICAgaW50IHNlbnNvcl9oYW5kbGUsIGludCBjaGFubmVsX2hhbmRsZSwgY29uc3Qgc3RydWN0IHNlbnNvcnNfZGlyZWN0X2NmZ190ICpjb25maWcpOworCisgICAgLyoKKyAgICAgKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSwgbXVzdCBiZSB6ZXJvLgorICAgICAqLworICAgIHZvaWQgKCpyZXNlcnZlZF9wcm9jc1s1XSkodm9pZCk7CiAKIH0gc2Vuc29yc19wb2xsX2RldmljZV8xX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvdmVoaWNsZS5oIGIvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlLmgKaW5kZXggYTU5MGZiZC4uOGIyOGU3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlLmgKQEAgLTgzLDcgKzgzLDYgQEAKIAogLyoqCiAgKiBJbnZhbGlkIHByb3BlcnR5IHZhbHVlIHVzZWQgZm9yIGFyZ3VtZW50IHdoZXJlIGludmFsaWQgcHJvcGVydHkgZ2l2ZXMgZGlmZmVyZW50IHJlc3VsdC4KLSAqIEByYW5nZV9zdGFydAogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSU5WQUxJRCAoMHgwKQogCkBAIC0xMjIsNyArMTIxLDcgQEAKICAqIEBkYXRhX21lbWJlciBpbmZvX21vZGVsX3llYXIKICAqIEB1bml0IFZFSElDTEVfVU5JVF9UWVBFX1lFQVIKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lORk9fTU9ERUxfWUVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMTAzKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lORk9fTU9ERUxfWUVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMykKIAogLyoqCiAgKiBGdWVsIGNhcGFjaXR5IG9mIHRoZSB2ZWhpY2xlCkBAIC0yNTMsNyArMjUyLDcgQEAKIAogCiAKLSAvLz09PT0gSFZBQyBQcm9wZXJ0aWVzID09PT0KKy8vPT09PSBIVkFDIFByb3BlcnRpZXMgPT09PQogCiAvKioKICAqIEZhbiBzcGVlZCBzZXR0aW5nCkBAIC0yNjEsOCArMjYwLDcgQEAKICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQogICogQGRhdGFfbWVtYmVyIGh2YWMuZmFuX3NwZWVkCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQotICogQGRhdGFfZW51bSBUT0RPCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBPRkYKICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfRkFOX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwMCkKQEAgLTI3Myw4ICsyNzEsOCBAQAogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5mYW5fZGlyZWN0aW9uCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQotICogQGRhdGFfZW51bSBUT0RPCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKKyAqIEBkYXRhX2VudW0gdmVoaWNsZV9odmFjX2Zhbl9kaXJlY3Rpb24KICAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBPRkYKICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfRkFOX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwMSkKQEAgLTI5Myw5ICsyOTEsOSBAQAogLyoqCiAgKiBIVkFDIGN1cnJlbnQgdGVtcGVyYXR1cmUuCiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfRkxPQVQKLSAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFfFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9DT05USU5VT1VTCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBkYXRhX21lbWJlciBodmFjLnRlbXBlcmF0dXJlX2N1cnJlbnQKICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfVEVNUEVSQVRVUkVfQ1VSUkVOVCAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwMikKQEAgLTMwMyw5ICszMDEsOSBAQAogLyoqCiAgKiBIVkFDLCB0YXJnZXQgdGVtcGVyYXR1cmUgc2V0LgogICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0ZMT0FUCi0gKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRXxWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfQ09OVElOVU9VUworICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy50ZW1wZXJhdHVyZV9zZXQKICAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBNSU4gLyBNQVggLyBPRkYKICAqLwpAQCAtMzE2LDcgKzMxNCw3IEBACiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCi0gKiBAem9uZV90eXBlIFZFSElDTEVfV0lORE9XCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1dJTkRPVwogICogQGRhdGFfbWVtYmVyIGh2YWMuZGVmcm9zdF9vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19ERUZST1NURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTA0KQpAQCAtMzI3LDcgKzMyNSw3IEBACiAgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKICAqIEBjb25maWdfZmxhZ3MgU3VwcG9ydGVkIHpvbmVzCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5hY19vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19BQ19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTA1KQpAQCAtMzM3LDcgKzMzNSw3IEBACiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5tYXhfYWNfb24KICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfTUFYX0FDX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwNikKQEAgLTM0Nyw3ICszNDUsNyBAQAogICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0JPT0xFQU4KICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQotICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQogICogQGRhdGFfbWVtYmVyIGh2YWMubWF4X2RlZnJvc3Rfb24KICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfTUFYX0RFRlJPU1RfT04gICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwNykKQEAgLTM1Nyw3ICszNTUsNyBAQAogICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0JPT0xFQU4KICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQotICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQogICogQGRhdGFfbWVtYmVyIGh2YWMubWF4X3JlY2lyY19vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19SRUNJUkNfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTA4KQpAQCAtMzY3LDEyICszNjUsOTQgQEAKICAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9CT09MRUFOCiAgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBkYXRhX21lbWJlciBodmFjLmR1YWxfb24KICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfRFVBTF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwOSkKIAogLyoqCisgKiBPbi9vZmYgYXV0b21hdGljIG1vZGUKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9CT09MRUFOCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQorICogQGRhdGFfbWVtYmVyIGh2YWMuYXV0b19vbgorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19BVVRPX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTBBKQorCisvKioKKyAqIFNlYXQgdGVtcGVyYXR1cmUKKyAqCisgKiBOZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgY29vbGluZy4KKyAqIDAgaW5kaWNhdGVzIG9mZi4KKyAqIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSBoZWF0aW5nLgorICoKKyAqIFNvbWUgdmVoaWNsZXMgbWF5IGhhdmUgbXVsdGlwbGUgbGV2ZWxzIG9mIGhlYXRpbmcgYW5kIGNvb2xpbmcuIFRoZSBtaW4vbWF4CisgKiByYW5nZSBkZWZpbmVzIHRoZSBhbGxvd2FibGUgcmFuZ2UgYW5kIG51bWJlciBvZiBzdGVwcyBpbiBlYWNoIGRpcmVjdGlvbi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfU0VBVF9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwQikKKworLyoqCisgKiBTaWRlIE1pcnJvciBIZWF0CisgKgorICogSW5jcmVhc2UgdmFsdWVzIGRlbm90ZSBoaWdoZXIgaGVhdGluZyBsZXZlbHMgZm9yIHNpZGUgbWlycm9ycy4KKyAqIDAgaW5kaWNhdGVzIGhlYXRpbmcgaXMgdHVybmVkIG9mZi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9IVkFDX1NJREVfTUlSUk9SX0hFQVQgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA1MEMpCisKKy8qKgorICogU3RlZXJpbmcgV2hlZWwgVGVtcGVyYXR1cmUKKyAqCisgKiBTZXRzIHRoZSB0ZW1wZXJhdHVyZSBmb3IgdGhlIHN0ZWVyaW5nIHdoZWVsCisgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgaGVhdGluZy4KKyAqIE5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBjb29saW5nLgorICogMCBpbmRpY2F0ZXMgdGVtcHJlYXR1cmUgY29udHJvbCBpcyBvZmYuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19TVEVFUklOR19XSEVFTF9URU1QICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTBEKQorCisvKioKKyAqIFRlbXBlcmF0dXJlIHVuaXRzCisgKgorICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRlbXBlcmF0dXJlIGlzIGluIENlbHNpdXMsIEZhaHJlbmhlaXQsIG9yIGEgZGlmZmVyZW50IHVuaXQuCisgKiBUaGlzIHBhcmFtZXRlciBhZmZlY3RzIGFsbCBIVkFDIHRlbXBlcmF0dXJlcyBpbiB0aGUgc3lzdGVtLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFECisgKiBAZGF0YV9lbnVtIHZlaGljbGVfdW5pdF90eXBlCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfVEVNUEVSQVRVUkVfVU5JVFMgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwRSkKKworLyoqCisgKiBBY3R1YWwgZmFuIHNwZWVkCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRAorICogQGRhdGFfbWVtYmVyIGh2YWMuZmFuX3NwZWVkCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKKyAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBPRkYKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfQUNUVUFMX0ZBTl9TUEVFRF9SUE0gICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwRikKKworCisvKioKICAqIFJlcHJlc2VudHMgcG93ZXIgc3RhdGUgZm9yIEhWQUMuIFNvbWUgSFZBQyBwcm9wZXJ0aWVzIHdpbGwgcmVxdWlyZSBtYXRjaGluZyBwb3dlciB0byBiZSB0dXJuZWQgb24KICAqIHRvIGdldCBvdXQgb2YgT0ZGIHN0YXRlLiBGb3Igbm9uLXpvbmVkIEhWQUMgcHJvcGVydGllcywgVkVISUNMRV9BTExfWk9ORSBjb3JyZXNwb25kcyB0bwogICogZ2xvYmFsIHBvd2VyIHN0YXRlLgpAQCAtMzgzLDEyICs0NjMsMzEgQEAKICAqIEBjb25maWdfc3RyaW5nIGxpc3Qgb2YgSFZBQyBwcm9wZXJ0aWVzIHdob3NlIHBvd2VyIGlzIGNvbnRyb2xsZWQgYnkgdGhpcyBwcm9wZXJ0eS4gRm9ybWF0IGlzCiAgKiAgICAgICAgICAgICAgICBoZXhhLWRlY2ltYWwgbnVtYmVyICgweC4uLikgc2VwYXJhdGVkIGJ5IGNvbW1hIGxpa2UgIjB4NTAwLDB4NTAzIi4gQWxsIHpvbmVzCiAgKiAgICAgICAgICAgICAgICBkZWZpbmVkIGluIHRoZXNlIGFmZmVjdGVkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgcHJvcGVydHkuCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5wb3dlcl9vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19QT1dFUl9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTEwKQogCiAvKioKKyAqIEZhbiBQb3NpdGlvbnMgQXZhaWxhYmxlCisgKgorICogVGhpcyBpcyBhIGJpdCBtYXNrIG9mIGZhbiBwb3NpdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgem9uZS4gIEVhY2ggZW50cnkgaW4KKyAqIHZlaGljbGVfaHZhY19mYW5fZGlyZWN0aW9uIGlzIHNlbGVjdGVkIGJ5IGJpdCBwb3NpdGlvbi4gIEZvciBpbnN0YW5jZSwgaWYKKyAqIG9ubHkgdGhlIEZBTl9ESVJFQ1RJT05fRkFDRSAoMHgxKSBhbmQgRkFOX0RJUkVDVElPTl9ERUZST1NUICgweDQpIGFyZSBhdmFpbGFibGUsCisgKiB0aGVuIHRoaXMgdmFsdWUgc2hhbGwgYmUgc2V0IHRvIDB4MTIuCisgKgorICogMHgxMiA9ICgxIDw8IDEpIHwgKDEgPDwgNCkKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfU1RBVElDCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKKyAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBPRkYKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfRkFOX0RJUkVDVElPTl9BVkFJTEFCTEUgICAgICAgICAgICAgICAoMHgwMDAwMDUxMSkKKworLyoqCiAgKiBPdXRzaWRlIHRlbXBlcmF0dXJlCiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfRkxPQVQKICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFfFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9DT05USU5VT1VTCkBAIC0zOTYsOCArNDk1LDcgQEAKICAqIEBkYXRhX21lbWJlciBvdXRzaWRlX3RlbXBlcmF0dXJlCiAgKiBAdW5pdCBWRUhJQ0xFX1VOSVRfVFlQRV9DRUxDSVVTCiAgKi8KLQotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0VOVl9PVVRTSURFX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICgweDAwMDAwNzAzKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0VOVl9PVVRTSURFX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDcwMykKIAogCiAvKioKQEAgLTQwOCw3ICs1MDYsNyBAQAogICogQGRhdGFfbWVtYmVyIGNhYmluX3RlbXBlcmF0dXJlCiAgKiBAdW5pdCBWRUhJQ0xFX1VOSVRfVFlQRV9DRUxDSVVTCiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9FTlZfQ0FCSU5fVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAoMHgwMDAwMDcwNCkKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9FTlZfQ0FCSU5fVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA3MDQpCiAKIAogLyoKQEAgLTQzNCw3ICs1MzIsNyBAQAogICogQGNvbmZpZ19mbGFncyBOdW1iZXIgb2YgcHJlc2V0cyBzdXBwb3J0ZWQKICAqIEBkYXRhX21lbWJlciBpbnQzMl9hcnJheQogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfUkFESU9fUFJFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDA4MDEpCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfUkFESU9fUFJFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwODAxKQogCiAvKioKICAqIENvbnN0YW50cyByZWxldmFudCB0byByYWRpby4KQEAgLTQ5Miw3ICs1OTAsMTMgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICBWRUhJQ0xFX0FVRElPX0VYVF9GT0NVU19DQVJfUEVSTUFORU5UIHdoZW4gY2FyIHNpZGUgaXMgcGxheWluZyBzb21ldGhpbmcKICAqICAgICAgICAgICAgICAgICAgICAgICBwZXJtYW5lbnQuCiAgKiAgICAgICAgICAgICAgICAgICBMT1NTX1RSQU5TSUVOVDogYWx3YXlzIHNob3VsZCBiZSBWRUhJQ0xFX0FVRElPX0VYVF9GT0NVU19DQVJfVFJBTlNJRU5UCi0gKiAgIGludDMyX2FycmF5WzNdOiBzaG91bGQgYmUgemVyby4KKyAqICAgaW50MzJfYXJyYXlbM106IGNvbnRleHQgcmVxdWVzdGVkIGJ5IGFuZHJvaWQgc2lkZSB3aGVuIHJlc3BvbmRpbmcgdG8gZm9jdXMgcmVxdWVzdC4KKyAqICAgICAgICAgICAgICAgICAgIFdoZW4gY2FyIHNpZGUgaXMgdGFraW5nIGZvY3VzIGF3YXksIHRoaXMgc2hvdWxkIGJlIHplcm8uCisgKgorICogQSBmb2N1cyByZXNwb25zZSBzaG91bGQgYmUgc2VudCBwZXIgZWFjaCBmb2N1cyByZXF1ZXN0IGV2ZW4gaWYgdGhlcmUgaXMgbm8gY2hhbmdlIGluCisgKiBmb2N1cyBzdGF0ZS4gVGhpcyBjYW4gaGFwcGVuIGluIGNhc2UgbGlrZSBmb2N1cyByZXF1ZXN0IG9ubHkgaW52b2x2aW5nIGNvbnRleHQgY2hhbmdlCisgKiB3aGVyZSBhbmRyb2lkIHNpZGUgc3RpbGwgbmVlZHMgbWF0Y2hpbmcgZm9jdXMgcmVzcG9uc2UgdG8gY29uZmlybSB0aGF0IGF1ZGlvIG1vZHVsZQorICogaGFzIG1hZGUgbmVjZXNzYXJ5IGNoYW5nZXMuCiAgKgogICogSWYgY2FyIGRvZXMgbm90IHN1cHBvcnQgVkVISUNMRV9QUk9QRVJUWV9BVURJT19GT0NVUywgZm9jdXMgaXMgYXNzdW1lZCB0byBiZSBncmFudGVkIGFsd2F5cy4KICAqCkBAIC01MDEsNyArNjA1LDcgQEAKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCiAgKiBAZGF0YV9tZW1iZXIgaW50MzJfYXJyYXkKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0ZPQ1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTAwKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0ZPQ1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwMCkKIAogZW51bSB2ZWhpY2xlX2F1ZGlvX2ZvY3VzX3JlcXVlc3QgewogICAgIFZFSElDTEVfQVVESU9fRk9DVVNfUkVRVUVTVF9HQUlOID0gMHgxLApAQCAtNjM4LDEzICs3NDIsMjMgQEAKICAgICBWRUhJQ0xFX0FVRElPX0NPTlRFWFRfU1lTVEVNX1NPVU5EX0ZMQUcgICAgICAgICAgICAgICA9IDB4NDAwLAogICAgIC8qKiBSYWRpbyBpcyBwbGF5ZWQgKi8KICAgICBWRUhJQ0xFX0FVRElPX0NPTlRFWFRfUkFESU9fRkxBRyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwLAorICAgIC8qKiBFeHQgc291cmNlIGlzIHBsYXllZC4gVGhpcyBpcyBmb3IgdGFnZ2luZyBnZW5lcmljIGV4dCBzb3VyY2VzLiAqLworICAgIFZFSElDTEVfQVVESU9fQ09OVEVYVF9FWFRfU09VUkNFX0ZMQUcgICAgICAgICAgICAgICAgID0gMHgxMDAwLAogfTsKIAogLyoqCiAgKiBQcm9wZXJ0eSB0byBjb250cm9sIGF1ZGlvIHZvbHVtZSBvZiBlYWNoIGF1ZGlvIGNvbnRleHQuCiAgKgorICogdmVoaWNsZV9wcm9wX2NvbmZpZ190CisgKiAgIGNvbmZpZ19hcnJheVswXSA6IGJpdCBmbGFncyBvZiBhbGwgc3VwcG9ydGVkIGF1ZGlvIGNvbnRleHRzLiBJZiB0aGlzIGlzIDAsCisgKiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHZvbHVtZSBpcyBjb250cm9sbGVkIHBlciBwaHlzaWNhbCBzdHJlYW0KKyAqICAgY29uZmlnX2FycmF5WzFdIDogZmxhZ3MgZGVmaW5lZCBpbiB2ZWhpY2xlX2F1ZGlvX3ZvbHVtZV9jYXBhYmlsaXR5X2ZsYWcgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50IGF1ZGlvIG1vZHVsZSdzIGNhcGFiaWxpdHkuCisgKgogICogRGF0YSB0eXBlIGxvb2tzIGxpa2U6Ci0gKiAgIGludDMyX2FycmF5WzBdIDogc3RyZWFtIGNvbnRleHQgYXMgZGVmaW5lZCBpbiB2ZWhpY2xlX2F1ZGlvX2NvbnRleHRfZmxhZy4KKyAqICAgaW50MzJfYXJyYXlbMF0gOiBzdHJlYW0gY29udGV4dCBhcyBkZWZpbmVkIGluIHZlaGljbGVfYXVkaW9fY29udGV4dF9mbGFnLiBJZiBvbmx5IHBoeXNpY2FsCisgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGlzIHN1cHBvcnRlZCAoY29uZmlnX2FycmF5WzBdID09IDApLCB0aGlzIHdpbGwgcmVwcmVzZW50IHBoeXNpY2FsCisgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIG51bWJlci4KICAqICAgaW50MzJfYXJyYXlbMV0gOiB2b2x1bWUgbGV2ZWwsIHZhbGlkIHJhbmdlIGlzIDAgdG8gaW50MzJfbWF4X3ZhbHVlIGRlZmluZWQgaW4gY29uZmlnLgogICogICAgICAgICAgICAgICAgICAgIDAgd2lsbCBiZSBtdXRlIHN0YXRlLiBpbnQzMl9taW5fdmFsdWUgaW4gY29uZmlnIHNob3VsZCBiZSBhbHdheXMgMC4KICAqICAgaW50MzJfYXJyYXlbMl0gOiBPbmUgb2YgdmVoaWNsZV9hdWRpb192b2x1bWVfc3RhdGUuCkBAIC02NTgsNyArNzcyLDM0IEBACiAgKiBAY29uZmlnX2ZsYWdzIGFsbCBhdWRpbyBjb250ZXh0cyBzdXBwb3J0ZWQuCiAgKiBAZGF0YV9tZW1iZXIgaW50MzJfYXJyYXkKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTAxKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwMSkKKworCisvKioKKyAqIGZsYWdzIHRvIHJlcHJlc2VudCBjYXBhYmlsaXR5IG9mIGF1ZGlvIHZvbHVtZSBwcm9wZXJ0eS4KKyAqIHVzZWQgaW4gY29uZmlnX2FycmF5WzFdIG9mIHZlaGljbGVfcHJvcF9jb25maWdfdC4KKyAqLworZW51bSB2ZWhpY2xlX2F1ZGlvX3ZvbHVtZV9jYXBhYmlsaXR5X2ZsYWcgeworICAgIC8qKgorICAgICAqIEV4dGVybmFsIGF1ZGlvIG1vZHVsZSBvciB2ZWhpY2xlIGhhbCBoYXMgcGVyc2lzdGVudCBzdG9yYWdlCisgICAgICogdG8ga2VlcCB0aGUgdm9sdW1lIGxldmVsLiBUaGlzIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIHBlciBjb250ZXh0CisgICAgICogdm9sdW1lIGxldmVsIGlzIHN1cHByb3RlZC4gV2hlbiB0aGlzIGlzIHNldCwgYXVkaW8gdm9sdW1lIGxldmVsIHBlcgorICAgICAqIGVhY2ggY29udGV4dCB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB3aGVuIHN5c3RlbiBzdGFydHMgdXAuCisgICAgICogQW5kIGV4dGVybmFsIGF1ZGlvIG1vZHVsZSBpcyBhbHNvIGV4cGVjdGVkIHRvIGFkanVzdCB2b2x1bWUgYXV0b21hdGljYWxseQorICAgICAqIHdoZW5ldmVyIHRoZXJlIGlzIGFuIGF1ZGlvIGNvbnRleHQgY2hhbmdlLgorICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIG5vdCBzZXQsIGFuZHJvaWQgc2lkZSB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIG5vCisgICAgICogcGVyc2lzdGVudCBzdG9yYWdlIGFuZCBzdG9yZWQgdmFsdWUgaW4gYW5kcm9pZCBzaWRlIHdpbGwgYmUgdXNlZCB0bworICAgICAqIGluaXRpYWxpemUgdGhlIHZvbHVtZSBsZXZlbC4gQW5kIGFuZHJvaWQgc2lkZSB3aWxsIHNldCB2b2x1bWUgbGV2ZWwKKyAgICAgKiBvZiBlYWNoIHBoeXNpY2FsIHN0cmVhbXMgd2hlbmV2ZXIgdGhlcmUgaXMgYW4gYXVkaW8gY29udGV4dCBjaGFuZ2UuCisgICAgICovCisgICAgVkVISUNMRV9BVURJT19WT0xVTUVfQ0FQQUJJTElUWV9QRVJTSVNURU5UX1NUT1JBR0UgPSAweDEsCisgICAgLyoqCisgICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgSC9XIGNhbiBzdXBwb3J0IG9ubHkgc2luZ2xlIG1hc3RlciB2b2x1bWUgZm9yIGFsbCBzdHJlYW1zLgorICAgICAqIFRoZXJlIGlzIG5vIHdheSB0byBzZXQgdm9sdW1lIGxldmVsIGRpZmZlcmVudGx5IHBlciBlYWNoIHN0cmVhbSBvciBjb250ZXh0LgorICAgICAqLworICAgIFZFSElDTEVfQVVESU9fVk9MVU1FX0NBUEFCSUxJVFlfTUFTVEVSX1ZPTFVNRV9PTkxZID0gMHgyLAorfTsKKwogCiAvKioKICAqIGVudW0gdG8gcmVwcmVzZW50IGF1ZGlvIHZvbHVtZSBzdGF0ZS4KQEAgLTY4Myw4ICs4MjQsMTggQEAKIAogLyoqCiAgKiBQcm9wZXJ0eSBmb3IgaGFuZGxpbmcgdm9sdW1lIGxpbWl0IHNldCBieSB1c2VyLiBUaGlzIGxpbWl0cyBtYXhpbXVtIHZvbHVtZSB0aGF0IGNhbiBiZSBzZXQKLSAqIHBlciBlYWNoIGNvbnRleHQuCi0gKiAgIGludDMyX2FycmF5WzBdIDogc3RyZWFtIGNvbnRleHQgYXMgZGVmaW5lZCBpbiB2ZWhpY2xlX2F1ZGlvX2NvbnRleHRfZmxhZy4KKyAqIHBlciBlYWNoIGNvbnRleHQgb3IgcGh5c2ljYWwgc3RyZWFtLgorICoKKyAqIHZlaGljbGVfcHJvcF9jb25maWdfdAorICogICBjb25maWdfYXJyYXlbMF0gOiBiaXQgZmxhZ3Mgb2YgYWxsIHN1cHBvcnRlZCBhdWRpbyBjb250ZXh0cy4gSWYgdGhpcyBpcyAwLAorICogICAgICAgICAgICAgICAgICAgICBhdWRpbyB2b2x1bWUgaXMgY29udHJvbGxlZCBwZXIgcGh5c2ljYWwgc3RyZWFtCisgKiAgIGNvbmZpZ19hcnJheVsxXSA6IGZsYWdzIGRlZmluZWQgaW4gdmVoaWNsZV9hdWRpb192b2x1bWVfY2FwYWJpbGl0eV9mbGFnIHRvCisgKiAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudCBhdWRpbyBtb2R1bGUncyBjYXBhYmlsaXR5LgorICoKKyAqIERhdGEgdHlwZSBsb29rcyBsaWtlOgorICogICBpbnQzMl9hcnJheVswXSA6IHN0cmVhbSBjb250ZXh0IGFzIGRlZmluZWQgaW4gdmVoaWNsZV9hdWRpb19jb250ZXh0X2ZsYWcuIElmIG9ubHkgcGh5c2ljYWwKKyAqICAgICAgICAgICAgICAgICAgICBzdHJlYW0gaXMgc3VwcG9ydGVkIChjb25maWdfYXJyYXlbMF0gPT0gMCksIHRoaXMgd2lsbCByZXByZXNlbnQgcGh5c2ljYWwKKyAqICAgICAgICAgICAgICAgICAgICBzdHJlYW0gbnVtYmVyLgogICogICBpbnQzMl9hcnJheVsxXSA6IG1heGltdW0gdm9sdW1lIHNldCB0byB0aGUgc3RyZWFtLiBJZiB0aGVyZSBpcyBubyByZXN0cmljdGlvbiwgdGhpcyB2YWx1ZQogICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgIGJpZ2dlciB0aGFuIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fVk9MVU1FJ3MgbWF4IHZhbHVlLgogICoKQEAgLTY5OCw3ICs4NDksNyBAQAogICogQGNvbmZpZ19mbGFncyBhbGwgYXVkaW8gY29udGV4dHMgc3VwcG9ydGVkLgogICogQGRhdGFfbWVtYmVyIGludDMyX2FycmF5CiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19WT0xVTUVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwMikKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19WT0xVTUVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA5MDIpCiAKIC8qKgogICogSW5kZXggaW4gaW50MzJfYXJyYXkgZm9yIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fVk9MVU1FX0xJTUlUIHByb3BlcnR5LgpAQCAtNzI3LDcgKzg3OCw3IEBACiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKICAqIEBkYXRhX21lbWJlciBpbnQzMl9hcnJheQogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fUk9VVElOR19QT0xJQ1kgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA5MDMpCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fUk9VVElOR19QT0xJQ1kgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTAzKQogCiAvKioKICAqIEluZGV4IGluIGludDMyX2FycmF5IGZvciBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX1JPVVRJTkdfUE9MSUNZIHByb3BlcnR5LgpAQCAtNzUwLDcgKzkwMSw3IEBACiAqICAgICAgICAgICAgICAgdGhpcy4KICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCiAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0hXX1ZBUklBTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTA0KQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0hXX1ZBUklBTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwNCkKIAogLyoqCiAgKiBGbGFnIHRvIGJlIHVzZWQgaW4gdmVoaWNsZV9wcm9wX2NvbmZpZy5jb25maWdfZmxhZ3MgZm9yIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fSFdfVkFSSUFOVC4KQEAgLTc2Niw2ICs5MTcsNzAgQEAKICAgICBWRUhJQ0xFX0FVRElPX0hXX1ZBUklBTlRfRkxBR19JTlRFUk5BTF9SQURJT19GTEFHID0gMHgxLAogfTsKIAorLyoqIGF1ZGlvIHJvdXRpbmcgZm9yIEFNL0ZNLiBUaGlzIHNob3VsZCBiZSBhbHNvIGJlIHRoZSB2YWx1ZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lCisgICAgcmFkaW8gbW9kdWxlIGluIHRoZSBzeXN0ZW0uICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX1JBRElPX0FNX0ZNICJSQURJT19BTV9GTSIKKy8qKiBTaG91bGQgYmUgYWRkZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgc2VwYXJhdGUgcmFkaW8gbW9kdWxlIHdpdGggSEQgY2FwYWJpbGl0eS4gKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfUkFESU9fQU1fRk1fSEQgIlJBRElPX0FNX0ZNX0hEIgorLyoqIEZvciBkaWdpYWwgYXVkaW8gYnJvYWRjYXN0aW5nIHR5cGUgb2YgcmFkaW8gKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfUkFESU9fREFCICJSQURJT19EQUIiCisvKiogRm9yIHNhdGVsbGl0ZSB0eXBlIG9mIHJhZGlvICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX1JBRElPX1NBVEVMTElURSAiUkFESU9fU0FURUxMSVRFIgorLyoqIEZvciBDRCBvciBEVkQgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfQ0RfRFZEICJDRF9EVkQiCisvKiogRm9yIDFzdCBhdXhpbGlhcnkgaW5wdXQgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfQVVYX0lOMCAiQVVYX0lOMCIKKy8qKiBGb3IgMm5kIGF1eGlsaWFyeSBpbnB1dCAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX1NPVVJDRV9BVVhfSU4xICJBVVhfSU4xIgorLyoqIEZvciBuYXZpZ2F0aW9uIGd1aWRhbmNlIGZyb20gb3V0c2lkZSBhbmRyb2lkICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX0VYVF9OQVZfR1VJREFOQ0UgIkVYVF9OQVZfR1VJREFOQ0UiCisvKiogRm9yIHZvaWNlIGNvbW1hbmQgZnJvbSBvdXRzaWRlIGFuZHJvaWQgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfRVhUX1ZPSUNFX0NPTU1BTkQgIkVYVF9WT0lDRV9DT01NQU5EIgorLyoqIEZvciB2b2ljZSBjYWxsIGZyb20gb3V0c2lkZSBhbmRyb2lkICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX0VYVF9WT0lDRV9DQUxMICJFWFRfVk9JQ0VfQ0FMTCIKKy8qKiBGb3Igc2FmZXR5IGFsZXJ0IGZyb20gb3V0c2lkZSBhbmRyb2lkICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX0VYVF9TQUZFVFlfQUxFUlQgIkVYVF9TQUZFVFlfQUxFUlQiCisKKy8qKgorKiBQcm9wZXJ0eSB0byBwYXNzIGhpbnQgb24gZXh0ZXJuYWwgYXVkaW8gcm91dGluZy4gV2hlbiBhbmRyb2lkIHNpZGUgcmVxdWVzdCBmb2N1cworKiB3aXRoIFZFSElDTEVfQVVESU9fRVhUX0ZPQ1VTX0NBUl9QTEFZX09OTFlfRkxBRyBmbGFnLCB0aGlzIHByb3BlcnR5IHdpbGwgYmUgc2V0CisqIGJlZm9yZSBzZXR0aW5nIEFVRElPX0ZPQ1VTIHByb3BlcnR5IGFzIGEgaGludCBmb3IgZXh0ZXJuYWwgYXVkaW8gc291cmNlIHJvdXRpbmcuCisqIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgcHJvcGVydHkgYWxvbmUgc2hvdWxkIG5vdCB0cmlnZ2VyIGFueSBjaGFuZ2UuCisqIEF1ZGlvIHJvdXRpbmcgc2hvdWxkIGJlIGNoYW5nZWQgb25seSB3aGVuIEFVRElPX0ZPQ1VTIHByb3BlcnR5IGlzIHNldC4gTm90ZSB0aGF0CisqIHRoaXMgcHJvcGVydHkgYWxsb3dzIHBhc3NpbmcgY3VzdG9tIHZhbHVlIGFzIGxvbmcgYXMgaXQgaXMgZGVmaW5lZCBpbiBjb25maWdfc3RyaW5nLgorKiBUaGlzIGFsbG93cyBzdXBwb3J0aW5nIG5vbi1zdGFuZGFyZCByb3V0aW5nIG9wdGlvbnMgdGhyb3VnaCB0aGlzIHByb3BlcnR5LgorKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2Ugc2VwYXJhdGUgbmFtZSBzcGFjZSBmb3IgY3VzdG9tIHByb3BlcnR5IHRvIHByZXZlbnQgY29uZmxpY3QgaW4gZnV0dXJlCisqIGFuZHJvaWQgcmVsZWFzZXMuCisqIEVuYWJsaW5nIGVhY2ggZXh0ZXJuYWwgcm91dGluZyBvcHRpb24gaXMgZG9uZSBieSBlbmFibGluZyBlYWNoIGJpdCBmbGFnIGZvciB0aGUgcm91dGluZy4KKyogVGhpcyBwcm9wZXJ0eSBjYW4gc3VwcG9ydCB1cCB0byAxMjggZXh0ZXJuYWwgcm91dGluZ3MuCisqIFRvIGdpdmUgZnVsbCBmbGV4aWJpbGl0eSwgdGhlcmUgaXMgbm8gc3RhbmRhcmQgZGVmaW5pdGlvbiBmb3IgZWFjaCBiaXQgZmxhZyBhbmQKKyogYXNzaWduaW5nIGVhY2ggYmlnIGZsYWcgdG8gc3BlY2lmaWMgcm91dGluZyB0eXBlIGlzIGRlY2lkZWQgYnkgY29uZmlnX3N0cmluZy4KKyogY29uZmlnX3N0cmluZyBoYXMgZm9ybWF0IG9mIGVhY2ggZW50cnkgc2VwYXJhdGVkIGJ5ICcsJworKiBhbmQgZWFjaCBlbnRyeSBoYXMgZm9ybWF0IG9mIGJpdEZsYWdQb3NpdG9uOnR5cGVTdHJpbmdbOnBoeXNpY2FsU3RyZWFtTnVtYmVyXS4KKyogIGJpdEZsYWdQb3NpdGlvbjogcmVwcmVzZW50cyB3aGljaCBiaWcgZmxhZyB3aWxsIGJlIHNldCB0byBlbmFibGUgdGhpcyByb3V0aW5nLiAwIG1lYW5zCisqICAgIExTQiBpbiBpbnQzMl9hcnJheVswXS4gMzEgd2lsbCBiZSBNU0IgaW4gaW50MzJfYXJyYXlbMF0uIDEyNyB3aWxsIE1TQiBpbiBpbnQzMl9hcnJheVszXS4KKyogIHR5cGVTdHJpbmc6IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBleHRlcm5hbCByb3V0aW5nLiBTb21lIHR5cGVzIGFyZSBhbHJlYWR5IGRlZmluZWQKKyogICAgaW4gVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfKiBhbmQgdXNlIHRoZW0gZmlyc3QgYmVmb3JlIGFkZGluZyBzb21ldGhpbmcKKyogICAgY3VzdG9tLiBBcHBsaWNhdGlvbnMgd2lsbCBmaW5kIGVhY2ggcm91dGluZyB1c2luZyB0aGlzIHN0cmluZy4KKyogIHBoeXNpY2FsU3RyZWFtTnVtYmVyOiBUaGlzIHBhcnQgaXMgb3B0aW9uYWwgYW5kIHJlcHJlc2VudHMgcGh5c2ljYWwgc3RyZWFtIHRvIGFuZHJvaWQKKyogICAgd2hpY2ggd2lsbCBiZSBkaXNhYmxlZCB3aGVuIHRoaXMgcm91dGluZyBpcyBlbmFibGVkLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIHJvdXRpbmcKKyogICAgc2hvdWxkIG5vdCBhZmZlY3QgcGh5c2ljYWwgc3RyZWFtcyB0byBhbmRyb2lkLgorKiBBcyBhbiBleGFtcGxlLCBsZXQncyBhc3N1bWUgYSBzeXN0ZW0gd2l0aCB0d28gcGh5c2ljYWwgc3RyZWFtcywgMCBmb3IgbWVkaWEgYW5kIDEgZm9yCisqIG5hdiBndWlkYW5jZS4gQW5kIGxldCdzIGFzc3VtZSBleHRlcm5hbCByb3V0aW5nIG9wdGlvbiBvZiBhbSBmbSByYWRpbywgZXh0ZXJuYWwgbmF2aWdhdGlvbgorKiBndWlkYW5jZSwgc2F0ZWxsaXRlIHJhZGlvLCBhbmQgb25lIGN1c3RvbS4gTGV0J3MgYXNzdW1lIHRoYXQgcmFkaW8gYW5kIHNhdGVsbGl0ZSByZXBsYWNlcworKiBwaHlzaWNhbCBzdHJlYW0gMCBhbmQgZXh0ZXJuYWwgbmF2aWdhdGlvbiByZXBsYWNlcyBwaHlzaWNhbCBzdHJlYW0gMS4gQW5kIGJpdCBmbGFnIHdpbGwgYmUKKyogYXNzaWduZWQgaW4gdGhlIG9yZGVyIGxpc3RlZCBhYm92ZS4gVGhpcyBjb25maWd1cmF0aW9uIHdpbGwgbG9vayBsaWtlIHRoaXMgaW4gY29uZmlnX3N0cmluZzoKKyogICIwOlJBRElPX0FNX0ZNOjAsMTpFWFRfTkFWX0dVSURBTkNFOjEsMjpSQURJT19TQVRFTExJVEU6MCwzOmNvbS50ZXN0LlNPTUVUSElOR19DVVNUT00iCisqIFdoZW4gYW5kcm9pZCByZXF1ZXN0cyBSQURJT19BTV9GTSwgaW50MzJfYXJyYXlbMF0gd2lsbCBiZSBzZXQgdG8gMHgxLgorKiBXaGVuIGFuZHJvaWQgcmVxdWVzdHMgUkFESU9fU0FURUxMSVRFICsgRVhUX05BVl9HVUlEQU5DRSwgaW50MzJfYXJyYXlbMF0gd2lsbCBiZSBzZXQgdG8gMHgyfDB4NC4KKyoKKyogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDMyX1ZFQzQKKyogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorKiBAY29uZmlnX3N0cmluZyBMaXN0IG9mIGFsbCBhdmFpYWJsZSBleHRlcm5hbCBzb3VyY2UgaW4gdGhlIHN5c3RlbS4KKyogQGRhdGFfbWVtYmVyIGludDMyX2FycmF5CisqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX0hJTlQgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwNSkKIAogLyoqCiAgKiBQcm9wZXJ0eSB0byBjb250cm9sIHBvd2VyIHN0YXRlIG9mIGFwcGxpY2F0aW9uIHByb2Nlc3Nvci4KQEAgLTc4OCw3ICsxMDAzLDcgQEAKICAqIEBjb25maWdfZmxhZ3MgQWRkaXRpb25hbCBpbmZvIG9uIHBvd2VyIHN0YXRlLiBTaG91bGQgdXNlIHZlaGljbGVfYXBfcG93ZXJfc3RhdGVfY29uZmlnX2ZsYWcuCiAgKiBAZGF0YV9tZW1iZXIgaW50MzJfYXJyYXkKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FQX1BPV0VSX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTAwKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FQX1BPV0VSX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEEwMCkKIAogZW51bSB2ZWhpY2xlX2FwX3Bvd2VyX3N0YXRlX2NvbmZpZ19mbGFnIHsKICAgICAvKioKQEAgLTg5NSw3ICsxMTEwLDcgQEAKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEfFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQogICogQGRhdGFfbWVtYmVyIGludDMyCiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9ESVNQTEFZX0JSSUdIVE5FU1MgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEEwMSkKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9ESVNQTEFZX0JSSUdIVE5FU1MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBBMDEpCiAKIAogLyoqCkBAIC05OTksNyArMTIxNCw3IEBACiAgKiBAY29uZmlnX2FycmF5IDA6dmVoaWNsZV9pbnN0dW1lbnRfY2x1c3Rlcl90eXBlIDE6aHcgdHlwZQogICogQGRhdGFfbWVtYmVyIGludDMyX2FycmF5CiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9JTlNUUlVNRU5UX0NMVVNURVJfSU5GTyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTIwKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lOU1RSVU1FTlRfQ0xVU1RFUl9JTkZPICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEEyMCkKIAogLyoqCiAgKiBSZXByZXNlbnRzIGluc3RydW1lbnQgY2x1c3RlciB0eXBlIGF2YWlsYWJsZSBpbiBzeXN0ZW0KQEAgLTEwMTksNiArMTIzNCw2MjQgQEAKIH07CiAKIC8qKgorICogQ3VycmVudCBkYXRlIGFuZCB0aW1lLCBlbmNvZGVkIGFzIFVuaXggdGltZS4KKyAqIFRoaXMgdmFsdWUgZGVub3RlcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2UgMS8xLzE5NzAuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDY0CisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX1NFVAorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQ2NF92YWx1ZQorICogQHVuaXQgVkVISUNMRV9VTklUX1RZUEVfU0VDUworICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfVU5JWF9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTMwKQorCisvKioKKyAqIEN1cnJlbnQgdGltZSBvbmx5LgorICogU29tZSB2ZWhpY2xlcyBtYXkgbm90IGtlZXAgdHJhY2sgb2YgZGF0ZS4gIFRoaXMgcHJvcGVydHkgb25seSBhZmZlY3RzIHRoZSBjdXJyZW50IHRpbWUsIGluCisgKiBzZWNvbmRzIGR1cmluZyB0aGUgZGF5LiAgVGh1cywgdGhlIG1heCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgODYsNDAwICgyNCAqIDYwICogNjApCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX1NFVAorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICogQHVuaXQgVkVISUNMRV9VTklUX1RZUEVfU0VDUworICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQ1VSUkVOVF9USU1FX0lOX1NFQ09ORFMgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTMxKQorCisKKy8vPT09PSBDYXIgQ2FiaW4gUHJvcGVydGllcyA9PT09CisvKioKKyAqIE1vc3QgQ2FyIENhYmluIHByb3BlcnRpZXMgaGF2ZSBib3RoIGEgTU9WRSBhbmQgUE9TSVRJT04gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorICoKKyAqIFRoZSBNT1ZFIHBhcmFtZXRlciB3aWxsIHN0YXJ0IG1vdmluZyB0aGUgZGV2aWNlIGluIHRoZSBpbmRpY2F0ZWQgZGlyZWN0aW9uLiAgVGhlIG1hZ25pdHVkZQorICogaW5kaWNhdGVzIHRoZSByZWxhdGl2ZSBzcGVlZC4gIEZvciBpbnN0YW5jZSwgc2V0dGluZyB0aGUgV0lORE9XX01PVkUgcGFyYW1ldGVyIHRvICsxIHdpbGwgcm9sbAorICogdGhlIHdpbmRvdyB1cC4gIFNldHRpbmcgaXQgdG8gKzIgKGlmIGF2YWlsYWJsZSkgd2lsbCByb2xsIGl0IHVwIGZhc3Rlci4KKyAqCisgKiBUaGUgUE9TSVRJT04gcGFyYW1ldGVyIHdpbGwgbW92ZSB0aGUgZGV2aWNlIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uLiAgRm9yIGluc3RhbmNlLCBpZiB0aGUKKyAqIFdJTkRPV19QT1MgaGFzIGEgcmFuZ2Ugb2YgMC0xMDAsIHRoZW4gc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byA1MCB3aWxsIG9wZW4gdGhlIHdpbmRvdyBoYWxmd2F5LgorICogRGVwZW5kaW5nIHVwb24gdGhlIGluaXRpYWwgcG9zaXRpb24sIHRoZSB3aW5kb3cgbWF5IG1vdmUgdXAgb3IgZG93biB0byB0aGUgNTAlIHZhbHVlLgorICoKKyAqIE9FTXMgbWF5IGNob29zZSB0byBpbXBsZW1lbnQgb25lIG9yIGJvdGggb2YgdGhlIE1PVkUvUE9TSVRJT04gcGFyYW1ldGVycyBkZXBlbmRpbmcgdXBvbiB0aGUKKyAqIGNhcGFiaWxpdHkgb2YgdGhlIGhhcmR3YXJlLgorICovCisKKy8vIERvb3JzCisvKioKKyAqIERvb3IgcG9zaXRpb24KKyAqCisgKiBUaGlzIGlzIGFuIGludGVnZXIgaW4gY2FzZSBhIGRvb3IgbWF5IGJlIHNldCB0byBhIHBhcnRpY3VsYXIgcG9zaXRpb24uICBNYXgKKyAqIHZhbHVlIGluZGljYXRlcyBmdWxseSBvcGVuLCBtaW4gdmFsdWUgKDApIGluZGljYXRlcyBmdWxseSBjbG9zZWQuCisgKgorICogU29tZSB2ZWhpY2xlcyAobWluaXZhbnMpIGNhbiBvcGVuIHRoZSBkb29yIGVsZWN0cm9uaWNhbGx5LiAgSGVuY2UsIHRoZSBhYmlsaXR5CisgKiB0byB3cml0ZSB0aGlzIHByb3BlcnR5LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfRE9PUgorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9ET09SX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCMDApCisKKy8qKgorICogRG9vciBtb3ZlCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9ET09SCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0RPT1JfTU9WRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEIwMSkKKworCisvKioKKyAqIERvb3IgbG9jaworICoKKyAqICd0cnVlJyBpbmRpY2F0ZXMgZG9vciBpcyBsb2NrZWQKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX0RPT1IKKyAqIEBkYXRhX21lbWJlciBib29sZWFuX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9ET09SX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCMDIpCisKKy8vIE1pcnJvcnMKKy8qKgorICogTWlycm9yIFogUG9zaXRpb24KKyAqCisgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGlsdCB1cHdhcmRzLCBuZWdhdGl2ZSB2YWx1ZSBpcyBkb3dud2FyZHMKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9NSVJST1IKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfTUlSUk9SX1pfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjQwKQorCisvKioKKyAqIE1pcnJvciBaIE1vdmUKKyAqCisgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGlsdCB1cHdhcmRzLCBuZWdhdGl2ZSB2YWx1ZSBpcyBkb3dud2FyZHMKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX01JUlJPUgorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9NSVJST1JfWl9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCNDEpCisKKy8qKgorICogTWlycm9yIFkgUG9zaXRpb24KKyAqCisgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZSB0aWx0IHJpZ2h0LCBuZWdhdGl2ZSB2YWx1ZSBpcyBsZWZ0CisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfTUlSUk9SCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX01JUlJPUl9ZX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI0MikKKworLyoqCisgKiBNaXJyb3IgWSBNb3ZlCisgKgorICogUG9zaXRpdmUgdmFsdWUgaW5kaWNhdGUgdGlsdCByaWdodCwgbmVnYXRpdmUgdmFsdWUgaXMgbGVmdAorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfTUlSUk9SCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX01JUlJPUl9ZX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI0MykKKworLyoqCisgKiBNaXJyb3IgTG9jaworICoKKyAqIFRydWUgaW5kaWNhdGVzIG1pcnJvciBwb3NpdGlvbnMgYXJlIGxvY2tlZCBhbmQgbm90IGNoYW5nZWFibGUKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfQk9PTEVBTgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAZGF0YV9tZW1iZXIgYm9vbGVhbl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfTUlSUk9SX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjQ0KQorCisvKioKKyAqIE1pcnJvciBGb2xkCisgKgorICogVHJ1ZSBpbmRpY2F0ZXMgbWlycm9ycyBhcmUgZm9sZGVkCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0JPT0xFQU4KKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGJvb2xlYW5fdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX01JUlJPUl9GT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI0NSkKKworLy8gU2VhdHMKKy8qKgorICogU2VhdCBtZW1vcnkgc2VsZWN0CisgKgorICogVGhpcyBwYXJhbWV0ZXIgc2VsZWN0cyB0aGUgbWVtb3J5IHByZXNldCB0byB1c2UgdG8gc2VsZWN0IHRoZSBzZWF0IHBvc2l0aW9uLgorICogVGhlIG1pblZhbHVlIGlzIGFsd2F5cyAwLCBhbmQgdGhlIG1heFZhbHVlIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBzZWF0CisgKiBwb3NpdGlvbnMgYXZhaWxhYmxlLgorICoKKyAqIEZvciBpbnN0YW5jZSwgaWYgdGhlIGRyaXZlcidzIHNlYXQgaGFzIDMgbWVtb3J5IHByZXNldHMsIHRoZSBtYXhWYWx1ZSB3aWxsIGJlIDMuCisgKiBXaGVuIHRoZSB1c2VyIHdhbnRzIHRvIHNlbGVjdCBhIHByZXNldCwgdGhlIGRlc2lyZWQgcHJlc2V0IG51bWJlciAoMSwgMiwgb3IgMykKKyAqIGlzIHNldC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX01FTU9SWV9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODApCisKKy8qKgorICogU2VhdCBtZW1vcnkgc2V0CisgKgorICogVGhpcyBzZXR0aW5nIGFsbG93cyB0aGUgdXNlciB0byBzYXZlIHRoZSBjdXJyZW50IHNlYXQgcG9zaXRpb24gc2V0dGluZ3MgaW50bworICogdGhlIHNlbGVjdGVkIHByZXNldCBzbG90LiAgVGhlIG1heFZhbHVlIGZvciBlYWNoIHNlYXQgcG9zaXRpb24gc2hhbGwgbWF0Y2gKKyAqIHRoZSBtYXhWYWx1ZSBmb3IgVkVISUNMRV9QUk9QRVJUWV9TRUFUX01FTU9SWV9TRUxFQ1QuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9NRU1PUllfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjgxKQorCisvKioKKyAqIFNlYXRiZWx0IGJ1Y2tsZWQKKyAqCisgKiBUcnVlIGluZGljYXRlcyBiZWx0IGlzIGJ1Y2tsZWQuCisgKgorICogV3JpdGUgYWNjZXNzIGluZGljYXRlcyBhdXRvbWF0aWMgc2VhdCBidWNrbGluZyBjYXBhYmlsaXRpZXMuICBUaGVyZSBhcmUgbm8ga25vd24gY2FycyBhdCB0aGlzCisgKiB0aW1lLCBidXQgeW91IG5ldmVyIGtub3cuLi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGJvb2xlYW5fdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfQkVMVF9CVUNLTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4MikKKworLyoqCisgKiBTZWF0YmVsdCBoZWlnaHQgcG9zaXRpb24KKyAqCisgKiBBZGp1c3RzIHRoZSBzaG91bGRlciBiZWx0IGFuY2hvciBwb2ludC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgaGlnaGVzdCBwb3NpdGlvbgorICogTWluIHZhbHVlIGluZGljYXRlcyBsb3dlc3QgcG9zaXRpb24KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfQkVMVF9IRUlHSFRfUE9TICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4MykKKworLyoqCisgKiBTZWF0YmVsdCBoZWlnaHQgbW92ZQorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0JFTFRfSEVJR0hUX01PVkUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODQpCisKKy8qKgorICogU2VhdCBmb3JlL2FmdCBwb3NpdGlvbgorICoKKyAqIFNldHMgdGhlIHNlYXQgcG9zaXRpb24gZm9yd2FyZCAoY2xvc2VyIHRvIHN0ZWVyaW5nIHdoZWVsKSBhbmQgYmFja3dhcmRzLgorICogTWF4IHZhbHVlIGluZGljYXRlcyBjbG9zZXN0IHRvIHdoZWVsLCBtaW4gdmFsdWUgaW5kaWNhdGVzIG1vc3QgcmVhcndhcmQKKyAqIHBvc2l0aW9uLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9GT1JFX0FGVF9QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjg1KQorCisvKioKKyAqIFNlYXQgZm9yZS9hZnQgbW92ZQorICoKKyAqIE1vdmVzIHRoZSBzZWF0IHBvc2l0aW9uIGZvcndhcmQgYW5kIGFmdC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9GT1JFX0FGVF9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjg2KQorCisvKioKKyAqIFNlYXQgYmFja3Jlc3QgYW5nbGUgMSBwb3NpdGlvbgorICoKKyAqIEJhY2tyZXN0IGFuZ2xlIDEgaXMgdGhlIGFjdHVhdG9yIGNsb3Nlc3QgdG8gdGhlIGJvdHRvbSBvZiB0aGUgc2VhdC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgYW5nbGluZyBmb3J3YXJkIHRvd2FyZHMgdGhlIHN0ZWVyaW5nIHdoZWVsLgorICogTWluIHZhbHVlIGluZGljYXRlcyBmdWxsIHJlY2xpbmUuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0JBQ0tSRVNUX0FOR0xFXzFfUE9TICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODcpCisKKy8qKgorICogU2VhdCBiYWNrcmVzdCBhbmdsZSAxIG1vdmUKKyAqCisgKiBNb3ZlcyB0aGUgYmFja3Jlc3QgZm9yd2FyZCBvciByZWNsaW5lLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0JBQ0tSRVNUX0FOR0xFXzFfTU9WRSAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODgpCisKKy8qKgorICogU2VhdCBiYWNrcmVzdCBhbmdsZSAyIHBvc2l0aW9uCisgKgorICogQmFja3Jlc3QgYW5nbGUgMiBpcyB0aGUgbmV4dCBhY3R1YXRvciB1cCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHNlYXQuCisgKiBNYXggdmFsdWUgaW5kaWNhdGVzIGFuZ2xpbmcgZm9yd2FyZCB0b3dhcmRzIHRoZSBzdGVlcmluZyB3aGVlbC4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgZnVsbCByZWNsaW5lLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9CQUNLUkVTVF9BTkdMRV8yX1BPUyAgICAgICAgICAgICAgICAgICgweDAwMDAwQjg5KQorCisvKioKKyAqIFNlYXQgYmFja3Jlc3QgYW5nbGUgMiBtb3ZlCisgKgorICogTW92ZXMgdGhlIGJhY2tyZXN0IGZvcndhcmQgb3IgcmVjbGluZS4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9CQUNLUkVTVF9BTkdMRV8yX01PVkUgICAgICAgICAgICAgICAgICgweDAwMDAwQjhBKQorCisvKioKKyAqIFNlYXQgaGVpZ2h0IHBvc2l0aW9uCisgKgorICogU2V0cyB0aGUgc2VhdCBoZWlnaHQuCisgKiBNYXggdmFsdWUgaW5kaWNhdGVzIGhpZ2hlc3QgcG9zaXRpb24uCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIGxvd2VzdCBwb3NpdGlvbi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfSEVJR0hUX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4QikKKworLyoqCisgKiBTZWF0IGhlaWdodCBtb3ZlCisgKgorICogTW92ZXMgdGhlIHNlYXQgaGVpZ2h0LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFSUdIVF9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOEMpCisKKy8qKgorICogU2VhdCBkZXB0aCBwb3NpdGlvbgorICoKKyAqIFNldHMgdGhlIHNlYXQgZGVwdGgsIGRpc3RhbmNlIGZyb20gYmFjayByZXN0IHRvIGZyb250IGVkZ2Ugb2Ygc2VhdC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgbG9uZ2VzdCBkZXB0aCBwb3NpdGlvbi4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgc2hvcnRlc3QgcG9zaXRpb24uCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0RFUFRIX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOEQpCisKKy8qKgorICogU2VhdCBkZXB0aCBtb3ZlCisgKgorICogQWRqdXN0cyB0aGUgc2VhdCBkZXB0aC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9ERVBUSF9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjhFKQorCisvKioKKyAqIFNlYXQgdGlsdCBwb3NpdGlvbgorICoKKyAqIFNldHMgdGhlIHNlYXQgdGlsdC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgZnJvbnQgZWRnZSBvZiBzZWF0IGhpZ2hlciB0aGFuIGJhY2sgZWRnZS4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgZnJvbnQgZWRnZSBvZiBzZWF0IGxvd2VyIHRoYW4gYmFjayBlZGdlLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9USUxUX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjhGKQorCisvKioKKyAqIFNlYXQgdGlsdCBtb3ZlCisgKgorICogVGlsdHMgdGhlIHNlYXQuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfVElMVF9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI5MCkKKworLyoqCisgKiBMdW1iZXIgZm9yZS9hZnQgcG9zaXRpb24KKyAqCisgKiBQdXNoZXMgdGhlIGx1bWJhciBzdXBwb3J0IGZvcndhcmQgYW5kIGJhY2t3YXJkcworICogTWF4IHZhbHVlIGluZGljYXRlcyBtb3N0IGZvcndhcmQgcG9zaXRpb24uCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIG1vc3QgcmVhcndhcmQgcG9zaXRpb24uCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0xVTUJBUl9GT1JFX0FGVF9QT1MgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOTEpCisKKy8qKgorICogTHVtYmFyIGZvcmUvYWZ0IG1vdmUKKyAqCisgKiBBZGp1c3RzIHRoZSBsdW1iYXIgc3VwcG9ydC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9MVU1CQVJfRk9SRV9BRlRfTU9WRSAgICAgICAgICAgICAgICAgICgweDAwMDAwQjkyKQorCisvKioKKyAqIEx1bWJhciBzaWRlIHN1cHBvcnQgcG9zaXRpb24KKyAqCisgKiBTZXRzIHRoZSBhbW91bnQgb2YgbGF0ZXJhbCBsdW1iYXIgc3VwcG9ydC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgd2lkZXN0IGx1bWJhciBzZXR0aW5nIChpLmUuIGxlYXN0IHN1cHBvcnQpCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIHRoaW5uZXN0IGx1bWJhciBzZXR0aW5nLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9MVU1CQVJfU0lERV9TVVBQT1JUX1BPUyAgICAgICAgICAgICAgICgweDAwMDAwQjkzKQorCisvKioKKyAqIEx1bWJhciBzaWRlIHN1cHBvcnQgbW92ZQorICoKKyAqIEFkanVzdHMgdGhlIGFtb3VudCBvZiBsYXRlcmFsIGx1bWJhciBzdXBwb3J0LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0xVTUJBUl9TSURFX1NVUFBPUlRfTU9WRSAgICAgICAgICAgICAgKDB4MDAwMDBCOTQpCisKKy8qKgorICogSGVhZHJlc3QgaGVpZ2h0IHBvc2l0aW9uCisgKgorICogU2V0cyB0aGUgaGVhZHJlc3QgaGVpZ2h0LgorICogTWF4IHZhbHVlIGluZGljYXRlcyB0YWxsZXN0IHNldHRpbmcuCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIHNob3J0ZXN0IHNldHRpbmcuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFQURSRVNUX0hFSUdIVF9QT1MgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOTUpCisKKy8qKgorICogSGVhZHJlc3QgaGVpZ2h0IG1vdmUKKyAqCisgKiBNb3ZlcyB0aGUgaGVhZHJlc3QgdXAgYW5kIGRvd24uCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfSEVBRFJFU1RfSEVJR0hUX01PVkUgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI5NikKKworLyoqCisgKiBIZWFkcmVzdCBhbmdsZSBwb3NpdGlvbgorICoKKyAqIFNldHMgdGhlIGFuZ2xlIG9mIHRoZSBoZWFkcmVzdC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgbW9zdCB1cHJpZ2h0IGFuZ2xlLgorICogTWluIHZhbHVlIGluZGljYXRlcyBzaGFsbG93ZXN0IGhlYWRyZXN0IGFuZ2xlLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9IRUFEUkVTVF9BTkdMRV9QT1MgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjk3KQorCisvKioKKyAqIEhlYWRyZXN0IGFuZ2xlIG1vdmUKKyAqCisgKiBBZGp1c3RzIHRoZSBhbmdsZSBvZiB0aGUgaGVhZHJlc3QKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9IRUFEUkVTVF9BTkdMRV9NT1ZFICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjk4KQorCisvKioKKyAqIEhlYWRyZXN0IGZvcmUvYWZ0IHBvc2l0aW9uCisgKgorICogQWRqdXN0cyB0aGUgaGVhZHJlc3QgZm9yd2FyZHMgYW5kIGJhY2t3YXJkcy4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgcG9zaXRpb24gY2xvc2VzdCB0byBmcm9udCBvZiBjYXIuCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIHBvc2l0aW9uIGNsb3Nlc3QgdG8gcmVhciBvZiBjYXIuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFQURSRVNUX0ZPUkVfQUZUX1BPUyAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOTkpCisKKy8qKgorICogSGVhZHJlc3QgZm9yZS9hZnQgbW92ZQorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFQURSRVNUX0ZPUkVfQUZUX01PVkUgICAgICAgICAgICAgICAgKDB4MDAwMDBCOUEpCisKKworLy8gV2luZG93cworLyoqCisgKiBXaW5kb3cgUG9zaXRpb24KKyAqCisgKiBNYXggPSB3aW5kb3cgdXAgLyBjbG9zZWQKKyAqIE1pbiA9IHdpbmRvdyBkb3duIC8gb3BlbgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1dJTkRPV19QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEJDMCkKKworLyoqCisgKiBXaW5kb3cgTW92ZQorICoKKyAqIE1heCA9IHdpbmRvdyB1cCAvIGNsb3NlZAorICogTWluID0gd2luZG93IGRvd24gLyBvcGVuCisgKiBNYWduaXR1ZGUgZGVub3RlcyByZWxhdGl2ZSBzcGVlZC4gIEkuZS4gKzIgaXMgZmFzdGVyIHRoYW4gKzEgaW4gcmFpc2luZyB0aGUgd2luZG93LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfV0lORE9XX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQkMxKQorCisvKioKKyAqIFdpbmRvdyBWZW50IFBvc2l0aW9uCisgKgorICogVGhpcyBmZWF0dXJlIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgdmVudCBmZWF0dXJlIG9uIGEgc3Vucm9vZi4KKyAqCisgKiBNYXggPSB2ZW50IG9wZW4KKyAqIE1pbiA9IHZlbnQgY2xvc2VkCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfV0lORE9XX1ZFTlRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQkMyKQorCisvKioKKyAqIFdpbmRvdyBWZW50IE1vdmUKKyAqCisgKiBUaGlzIGZlYXR1cmUgaXMgdXNlZCB0byBjb250cm9sIHRoZSB2ZW50IGZlYXR1cmUgb24gYSBzdW5yb29mLgorICoKKyAqIE1heCA9IHZlbnQgb3BlbgorICogTWluID0gdmVudCBjbG9zZWQKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1dJTkRPV19WRU5UX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEJDMykKKworLyoqCisgKiBXaW5kb3cgTG9jaworICoKKyAqIFRydWUgaW5kaWNhdGVzIHdpbmRvd3MgYXJlIGxvY2tlZCBhbmQgY2FuJ3QgYmUgbW92ZWQuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0JPT0xFQU4KKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGJvb2xlYW5fdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1dJTkRPV19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEJDNCkKKworCisKKy8qKgogICogIEgvVyBzcGVjaWZpYywgbm9uLXN0YW5kYXJkIHByb3BlcnR5IGNhbiBiZSBhZGRlZCBhcyBuZWNlc3NhcnkuIFN1Y2ggcHJvcGVydHkgc2hvdWxkIHVzZQogICogIHByb3BlcnR5IG51bWJlciBpbiByYW5nZSBvZiBbVkVISUNMRV9QUk9QRVJUWV9DVVNUT01fU1RBUlQsIFZFSElDTEVfUFJPUEVSVFlfQ1VTVE9NX0VORF0uCiAgKiAgRGVmaW5pdGlvbiBvZiBwcm9wZXJ0eSBpbiB0aGlzIHJhbmdlIGlzIGNvbXBsZXRlbHkgdXAgdG8gZWFjaCBIQUwgaW1wbGVtZW50YXRpb24uCkBAIC0xMDI3LDIwICsxODYwLDIwIEBACiAgKiAgaW5jbHVkZSBjb25maWdfc3RyaW5nIG9mICJjb20uWFlaLnNvbWVfZnVydGhlcl9kZXRhaWxzIi4KICAqICBAcmFuZ2Vfc3RhcnQKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0NVU1RPTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgKDB4NzAwMDAwMDApCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQ1VTVE9NX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDcwMDAwMDAwKQogLyoqIEByYW5nZV9lbmQgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9DVVNUT01fRU5EICAgICAgICAgICAgICAgICAgICAgICAgICgweDczZmZmZmZmKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0NVU1RPTV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg3M2ZmZmZmZikKIAogLyoqCiAgKiBQcm9wZXJ0eSByYW5nZSBhbGxvY2F0ZWQgZm9yIHN5c3RlbSdzIGludGVybmFsIHVzYWdlIGxpa2UgdGVzdGluZy4gSEFMIHNob3VsZCBuZXZlciBkZWNsYXJlCiAgKiBwcm9wZXJ0eSBpbiB0aGlzIHJhbmdlLgogICogQHJhbmdlX3N0YXJ0CiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9JTlRFUk5BTF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICgweDc0MDAwMDAwKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lOVEVSTkFMX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg3NDAwMDAwMCkKIC8qKgogICogQHJhbmdlX2VuZAogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSU5URVJOQUxfRU5EICAgICAgICAgICAgICAgICAgICAgICAoMHg3NGZmZmZmZikKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9JTlRFUk5BTF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NzRmZmZmZmYpCiAKIC8qKgogICogVmFsdWUgdHlwZXMgZm9yIHZhcmlvdXMgcHJvcGVydGllcy4KQEAgLTEwODYsMTIgKzE5MTksMTQgQEAKICAgICBWRUhJQ0xFX1VOSVRfVFlQRV9NRVRFUiAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDIxLAogICAgIFZFSElDTEVfVU5JVF9UWVBFX0tJTE9NRVRFUiAgICAgICAgICAgICA9IDB4MDAwMDAwMjMsCiAgICAgLy8gdGVtcGVyYXR1cmUKLSAgICBWRUhJQ0xFX1VOSVRfVFlQRV9DRUxDSVVTICAgICAgICAgICAgICAgPSAweDAwMDAwMDMwLAorICAgIFZFSElDTEVfVU5JVF9UWVBFX0NFTFNJVVMgICAgICAgICAgICAgICA9IDB4MDAwMDAwMzAsCisgICAgVkVISUNMRV9VTklUX1RZUEVfRkFIUkVOSEVJVCAgICAgICAgICAgID0gMHgwMDAwMDAzMSwKKyAgICBWRUhJQ0xFX1VOSVRfVFlQRV9LRUxWSU4gICAgICAgICAgICAgICAgPSAweDAwMDAwMDMyLAogICAgIC8vIHZvbHVtZQogICAgIFZFSElDTEVfVU5JVF9UWVBFX01JTExJTElURVIgICAgICAgICAgICA9IDB4MDAwMDAwNDAsCiAgICAgLy8gdGltZQogICAgIFZFSElDTEVfVU5JVF9UWVBFX05BTk9fU0VDUyAgICAgICAgICAgICA9IDB4MDAwMDAwNTAsCi0gICAgVkVISUNMRV9VTk9UX1RZUEVfU0VDUyAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA1MywKKyAgICBWRUhJQ0xFX1VOSVRfVFlQRV9TRUNTICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDUzLAogICAgIFZFSElDTEVfVU5JVF9UWVBFX1lFQVIgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwNTksCiB9OwogCkBAIC0xMTA1LDggKzE5NDAsMTIgQEAKICAgICAgKi8KICAgICBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfU1RBVElDICAgICAgICAgPSAweDAwLAogICAgIC8qKgotICAgICAqIFByb3BlcnR5IG9mIHRoaXMgdHlwZSB3aWxsIGJlIHJlcG9ydGVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UuIGdldCBzaG91bGQgcmV0dXJuIHRoZQotICAgICAqIGN1cnJlbnQgdmFsdWUuCisgICAgICogUHJvcGVydHkgb2YgdGhpcyB0eXBlIHdpbGwgYmUgcmVwb3J0ZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZS4KKyAgICAgKiBnZXQgY2FsbCBzaG91bGQgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLgorICAgICAqIFNldCBvcGVyYXRpb24gZm9yIHRoaXMgcHJvcGVydHkgaXMgYXNzdW1lZCB0byBiZSBhc3luY2hyb25vdXMuIFdoZW4gdGhlIHByb3BlcnR5IGlzIHJlYWQKKyAgICAgKiAoZ2V0KSBhZnRlciBzZXQsIGl0IG1heSBzdGlsbCByZXR1cm4gb2xkIHZhbHVlIHVudGlsIHVuZGVybHlpbmcgSC9XIGJhY2tpbmcgdGhpcyBwcm9wZXJ0eQorICAgICAqIGhhcyBhY3R1YWxseSBjaGFuZ2VkIHRoZSBzdGF0ZS4gT25jZSBzdGF0ZSBpcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgd2lsbCBkaXNwYXRjaCBjaGFuZ2VkCisgICAgICogdmFsdWUgYXMgZXZlbnQuCiAgICAgICovCiAgICAgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRSAgICAgID0gMHgwMSwKICAgICAvKioKQEAgLTExMTQsNiArMTk1MywxOCBAQAogICAgICAqIHRoZSBkYXRhLgogICAgICAqLwogICAgIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9DT05USU5VT1VTICAgICA9IDB4MDIsCisgICAgLyoqCisgICAgICogUHJvcGVydHkgb2YgdGhpcyB0eXBlIG1heSBiZSBwb2xsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHZhbHVlLgorICAgICAqLworICAgIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9QT0xMICAgICAgICAgICA9IDB4MDMsCisgICAgLyoqCisgICAgICogVGhpcyBpcyBmb3IgcHJvcGVydHkgd2hlcmUgY2hhbmdlIGV2ZW50IHNob3VsZCBiZSBzZW50IG9ubHkgd2hlbiB0aGUgdmFsdWUgaXMKKyAgICAgKiBzZXQgZnJvbSBleHRlcm5hbCBjb21wb25lbnQuIE5vcm1hbCB2YWx1ZSBjaGFuZ2Ugd2lsbCBub3QgdHJpZ2dlciBldmVudC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgY2xvY2sgcHJvcGVydHkgY2FuIHNlbmQgY2hhbmdlIGV2ZW50IG9ubHkgd2hlbiBpdCBpcyBzZXQsIG91dHNpZGUgYW5kcm9pZCwKKyAgICAgKiBmb3IgY2FzZSBsaWtlIHVzZXIgc2V0dGluZyB0aW1lIG9yIHRpbWUgZ2V0dGluZyB1cGRhdGUuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBpdAorICAgICAqIHBlciBldmVyeSB2YWx1ZSBjaGFuZ2UuCisgICAgICovCisgICAgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX1NFVCAgICAgICAgID0gMHgwNCwKIH07CiAKIC8qKgpAQCAtMTIzOCwxNyArMjA4OSwxNSBAQAogICogVmFyaW91cyBTZWF0cyBpbiB0aGUgY2FyLgogICovCiBlbnVtIHZlaGljbGVfc2VhdCB7Ci0gICAgVkVISUNMRV9TRUFUX0RSSVZFUl9MSEQgICAgICAgICAgICAgPSAweDAwMDEsCi0gICAgVkVISUNMRV9TRUFUX0RSSVZFUl9SSEQgICAgICAgICAgICAgPSAweDAwMDIsCi0gICAgVkVISUNMRV9TRUFUX1JPV18xX1BBU1NFTkdFUl9MRUZUICAgPSAweDAwMTAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18xX1BBU1NFTkdFUl9DRU5URVIgPSAweDAwMjAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18xX1BBU1NFTkdFUl9SSUdIVCAgPSAweDAwNDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18yX1BBU1NFTkdFUl9MRUZUICAgPSAweDAxMDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18yX1BBU1NFTkdFUl9DRU5URVIgPSAweDAyMDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18yX1BBU1NFTkdFUl9SSUdIVCAgPSAweDA0MDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18zX1BBU1NFTkdFUl9MRUZUICAgPSAweDEwMDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18zX1BBU1NFTkdFUl9DRU5URVIgPSAweDIwMDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18zX1BBU1NFTkdFUl9SSUdIVCAgPSAweDQwMDAKKyAgICBWRUhJQ0xFX1NFQVRfUk9XXzFfTEVGVCAgID0gMHgwMDAxLAorICAgIFZFSElDTEVfU0VBVF9ST1dfMV9DRU5URVIgPSAweDAwMDIsCisgICAgVkVISUNMRV9TRUFUX1JPV18xX1JJR0hUICA9IDB4MDAwNCwKKyAgICBWRUhJQ0xFX1NFQVRfUk9XXzJfTEVGVCAgID0gMHgwMDEwLAorICAgIFZFSElDTEVfU0VBVF9ST1dfMl9DRU5URVIgPSAweDAwMjAsCisgICAgVkVISUNMRV9TRUFUX1JPV18yX1JJR0hUICA9IDB4MDA0MCwKKyAgICBWRUhJQ0xFX1NFQVRfUk9XXzNfTEVGVCAgID0gMHgwMTAwLAorICAgIFZFSElDTEVfU0VBVF9ST1dfM19DRU5URVIgPSAweDAyMDAsCisgICAgVkVISUNMRV9TRUFUX1JPV18zX1JJR0hUICA9IDB4MDQwMAogfTsKIAogLyoqCkBAIC0xMjgyLDYgKzIxMzEsNyBAQAogICAgIFZFSElDTEVfTUlSUk9SX0RSSVZFUl9SSUdIVCAgPSAweDAwMDAwMDAyLAogICAgIFZFSElDTEVfTUlSUk9SX0RSSVZFUl9DRU5URVIgPSAweDAwMDAwMDA0LAogfTsKKwogZW51bSB2ZWhpY2xlX3R1cm5fc2lnbmFsIHsKICAgICBWRUhJQ0xFX1NJR05BTF9OT05FICAgICAgICAgPSAweDAwLAogICAgIFZFSElDTEVfU0lHTkFMX1JJR0hUICAgICAgICA9IDB4MDEsCkBAIC0xMjg5LDYgKzIxMzksMTUgQEAKICAgICBWRUhJQ0xFX1NJR05BTF9FTUVSR0VOQ1kgICAgPSAweDA0CiB9OwogCitlbnVtIHZlaGljbGVfem9uZV90eXBlIHsKKyAgICBWRUhJQ0xFX1pPTkVfVFlQRV9OT05FICAgICAgPSAweDAwLAorICAgIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUgICAgPSAweDAxLAorICAgIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQgICAgICA9IDB4MDIsCisgICAgVkVISUNMRV9aT05FX1RZUEVfRE9PUiAgICAgID0gMHgwNCwKKyAgICBWRUhJQ0xFX1pPTkVfVFlQRV9XSU5ET1cgICAgPSAweDEwLAorICAgIFZFSElDTEVfWk9ORV9UWVBFX01JUlJPUiAgICA9IDB4MjAsCit9OworCiAvKgogICogQm9vbGVhbiB0eXBlLgogICovCkBAIC0xNDY4LDYgKzIzMjcsNyBAQAogICAgICAgICB2ZWhpY2xlX2Jvb2xlYW5fdCBtYXhfZGVmcm9zdF9vbjsKICAgICAgICAgdmVoaWNsZV9ib29sZWFuX3QgcmVjaXJjX29uOwogICAgICAgICB2ZWhpY2xlX2Jvb2xlYW5fdCBkdWFsX29uOworICAgICAgICB2ZWhpY2xlX2Jvb2xlYW5fdCBhdXRvX29uOwogICAgICAgICB2ZWhpY2xlX2Jvb2xlYW5fdCBwb3dlcl9vbjsKIAogICAgICAgICBmbG9hdCB0ZW1wZXJhdHVyZV9jdXJyZW50OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlX2NhbWVyYS5oIGIvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlX2NhbWVyYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc1YWVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvdmVoaWNsZV9jYW1lcmEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFSElDTEVfQ0FNRVJBX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfVkVISUNMRV9DQU1FUkFfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL2NkZWZzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotCi1fX0JFR0lOX0RFQ0xTCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBWRUhJQ0xFX0NBTUVSQV9IRUFERVJfVkVSU0lPTiAgICAgICAgICAxCi0jZGVmaW5lIFZFSElDTEVfQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8xXzAgIEhBUkRXQVJFX01PRFVMRV9BUElfVkVSU0lPTigxLCAwKQotI2RlZmluZSBWRUhJQ0xFX0NBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wICBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT05fMigxLCAwLCBWRUhJQ0xFX0NBTUVSQV9IRUFERVJfVkVSU0lPTikKLQotLyoqCi0gKiBWZWhpY2xlIENhbWVyYSB0byBwcm92aWRlIGludGVyZmFjZXMgZm9yIGNvbnRyb2xsaW5nIGNhbWVyYXMKLSAqLwotCi0vKioKLSAqIFRoZSBpZCBvZiB0aGlzIG1vZHVsZQotICovCi0jZGVmaW5lIFZFSElDTEVfQ0FNRVJBX0hBUkRXQVJFX01PRFVMRV9JRCAgInZlaGljbGVfY2FtZXJhIgotCi0vKioKLSAqICBOYW1lIG9mIHRoZSB2ZWhpY2xlIGRldmljZSB0byBvcGVuLiAgRXh0ZW5kIHRoaXMgbGlzdCBhcwotICogIG1vcmUgY2FtZXJhcyBhcmUgYWRkZWQuICBFYWNoIGNhbWVyYSBkZWZpbmVkIGluIHZlaGljbGVfY2FtZXJhX3R5cGVfdAotICogIHNoYWxsIGhhdmUgYSBzdHJpbmcgZGVmaW5lZCBmb3IgaXQuCi0gKi8KLSNkZWZpbmUgVkVISUNMRV9DQU1FUkFfUlZDX0RFVklDRSAgICAgICAidmVoaWNsZV9jYW1lcmFfcnZjX2RldmljZSIKLQotLyoqCi0gKiBFYWNoIGNhbWVyYSBvbiB0aGUgY2FyIHNoYWxsIGJlIGVudW1lcmF0ZWQKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBWRUhJQ0xFX0NBTUVSQV9SVkMgPSAxLAotfSB2ZWhpY2xlX2NhbWVyYV90eXBlX3Q7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGNhbWVyYSBkZXZpY2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQzMl90IG92ZXJsYXlfb247Ci0gICAgdWludDMyX3QgY2FtZXJhX29uOwotfSB2ZWhpY2xlX2NhbWVyYV9zdGF0ZV90OwotCi0vKioKLSAqIEJpdG1hc2sgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IGEgY2FtZXJhIG1vZHVsZQotICovCi1lbnVtIHsKLSAgICBWRUhJQ0xFX0NBTUVSQV9DT05GSUdfRkxBR19BTkRST0lEX09WRVJMQVlfU1VQUE9SVCAgICAgID0gMHgxLAotICAgIFZFSElDTEVfQ0FNRVJBX0NPTkZJR19GTEFHX0NBTUVSQV9DUk9QX1NVUFBPUlQgICAgICAgICAgPSAweDIsCi0gICAgVkVISUNMRV9DQU1FUkFfQ09ORklHX0ZMQUdfQ0FNRVJBX1BPU0lUSU9OSU5HX1NVUFBPUlQgICA9IDB4NAotfSB2ZWhpY2xlX2NhbWVyYV9jb25maWdfZmxhZzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQzMl90IGNhcGFiaWxpdGVzX2ZsYWdzOwotICAgIHVpbnQzMl90IGNhbWVyYV93aWR0aDsKLSAgICB1aW50MzJfdCBjYW1lcmFfaGVpZ2h0OwotICAgIHVpbnQzMl90IGRpc3BsYXlfd2lkdGg7Ci0gICAgdWludDMyX3QgZGlzcGxheV9oZWlnaHQ7Ci19IHZlaGljbGVfY2FtZXJhX2NhcF90OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEV2ZXJ5IGhhcmR3YXJlIG1vZHVsZSBtdXN0IGhhdmUgYSBkYXRhIHN0cnVjdHVyZSBuYW1lZCBIQUxfTU9EVUxFX0lORk9fU1lNCi0gKiBhbmQgdGhlIGZpZWxkcyBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIG11c3QgYmVnaW4gd2l0aCBod19tb2R1bGVfdAotICogZm9sbG93ZWQgYnkgbW9kdWxlIHNwZWNpZmljIGluZm9ybWF0aW9uLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3RydWN0IGh3X21vZHVsZV90IGNvbW1vbjsKLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSBIVyBmb3IgdGhlIGNhbWVyYXMgaW5zdGFsbGVkIG9uIHRoZSB2ZWhpY2xlCi0gICAgICogQHBhcmFtIG51bV9jYW1lcmFzIC0gbnVtYmVyIG9mIGNhbWVyYSBkZXZpY2VzIGF2YWlsYWJsZS4gIElmCi0gICAgICogICAgICAgICAgICAgICAgICAgIDAgaXMgcmV0dXJuZWQsIGFuIGVycm9yIGhhcyBvY2N1cnJlZCBhbmQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHJldHVybiBwb2ludGVyIHNoYWxsIGJlIE5VTEwuCi0gICAgICogQHJldHVybiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZlaGljbGVfY2FtZXJhX3R5cGVfdCB0bwotICAgICAqICAgICAgICAgZGVub3RlIHdoaWNoIGNhbWVyYXMgYXJlIGluc3RhbGxlZC4gIFRoaXMgcG9pbnRlciBpcwotICAgICAqICAgICAgICAgb25seSB2YWxpZCB3aGlsZSB0aGUgdmVoaWNsZSBoYWwgaXMgbG9hZGVkLiAgSWYgdGhlCi0gICAgICogICAgICAgICBwb2ludGVyIGlzIE5VTEwsIHRoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkIGFuZAotICAgICAqICAgICAgICAgbnVtX2NhbWVyYXMgc2hhbGwgYmUgMC4KLSAgICAgKi8KLSAgICBjb25zdCB1aW50MzJfdCAqICgqZ2V0X2NhbWVyYV9kZXZpY2VfbGlzdCkodWludDMyX3QgKm51bV9jYW1lcmFzKTsKLX0gdmVoaWNsZV9jYW1lcmFfbW9kdWxlX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgdmVoaWNsZV9jYW1lcmFfZGV2aWNlX3QgewotICAgIHN0cnVjdCBod19kZXZpY2VfdCBjb21tb247Ci0KLSAgICBjb25zdCB1aW50MzJfdCBjYW1lcmFfdHlwZTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIGNhbWVyYS4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIC0gZGV2aWNlIGhhbmRsZQotICAgICAqIEBwYXJhbSBjYXAgLSBwb2ludGVyIHRvIGNhcGFiaWxpdGllcyBmbGFncyBiZWluZyByZXR1cm5lZAotICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCi0gICAgICogICAgICAgICAgLUVQRVJNIGlmIGRldmljZSBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZAotICAgICAqLwotICAgIGludCAoKmdldF9jYXBhYmlsaXRpZXMpKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCB2ZWhpY2xlX2NhbWVyYV9jYXBfdCAqY2FwKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgY2FtZXJhIGNyb3Agc2V0dGluZ3MuCi0gICAgICogQHBhcmFtIGRldmljZSAtIGRldmljZSBoYW5kbGUKLSAgICAgKiBAcGFyYW0gcmVjdCAtIGN1cnJlbnQgY2FtZXJhIGNyb3Agc2V0dGluZ3MKLSAgICAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcwotICAgICAqICAgICAgICAgIC1FUEVSTSBpZiBkZXZpY2UgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICogICAgICAgICAgLWVycm5vIG9uIGVycm9yCi0gICAgICovCi0gICAgaW50ICgqZ2V0X2NhbWVyYV9jcm9wKShzdHJ1Y3QgdmVoaWNsZV9jYW1lcmFfZGV2aWNlX3QgKmRldmljZSwgYW5kcm9pZF9uYXRpdmVfcmVjdF90ICpyZWN0KTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNhbWVyYSBjcm9wLgotICAgICAqIEBwYXJhbSBkZXZpY2UgLSBkZXZpY2UgaGFuZGxlCi0gICAgICogQHBhcmFtIHJlY3QgLSBhcmVhIG9mIGNhbWVyYSBpbnB1dCB0byBjcm9wLiAgTXVzdCBmaXQgd2l0aGluCi0gICAgICogICAgICAgICAgICAgY2FtZXJhIHdpZHRoIGFuZCBoZWlnaHQgZnJvbSBjYW1lcmEgY2FwYWJpbGl0aWVzLgotICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCi0gICAgICogICAgICAgICAgLUVQRVJNIGlmIGRldmljZSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKiAgICAgICAgICAtZXJybm8gb24gZXJyb3IKLSAgICAgKi8KLSAgICBpbnQgKCpzZXRfY2FtZXJhX2Nyb3ApKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCBjb25zdCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgKnJlY3QpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBwb3NpdGlvbiBvZiB0aGUgY2FtZXJhIG9uIHRoZSBkaXNwbGF5LgotICAgICAqIEBwYXJhbSBkZXZpY2UgLSBkZXZpY2UgaGFuZGxlCi0gICAgICogQHBhcmFtIHJlY3QgLSBhcmVhIG9mIGRpc3BsYXkgdGhlIGNhbWVyYSB3aWxsIGFwcGVhciB3aGVuIG9uCi0gICAgICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKLSAgICAgKiAgICAgICAgICAtRVBFUk0gaWYgZGV2aWNlIGlzIG5vdCBpbml0aWFsaXplZAotICAgICAqICAgICAgICAgIC1lcnJubyBvbiBlcnJvcgotICAgICAqLwotICAgIGludCAoKmdldF9jYW1lcmFfcG9zaXRpb24pKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgKnJlY3QpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyBwb3NpdGlvbiBvZiB0aGUgY2FtZXJhIG9uIHRoZSBkaXNwbGF5LgotICAgICAqIEBwYXJhbSBkZXZpY2UgLSBkZXZpY2UgaGFuZGxlCi0gICAgICogQHBhcmFtIHJlY3QgLSBhcmVhIG9mIGRpc3BsYXkgdGhlIGNhbWVyYSB3aWxsIGFwcGVhciB3aGVuIG9uLgotICAgICAqICAgICAgICAgICAgIE11c3QgZml0IHdpdGhpbiBkaXNwbGF5IHdpZHRoIGFuZCBoZWlnaHQgZnJvbQotICAgICAqICAgICAgICAgICAgIGNhbWVyYSBjYXBhYmlsaXRpZXMuCi0gICAgICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKLSAgICAgKiAgICAgICAgICAtRVBFUk0gaWYgZGV2aWNlIGlzIG5vdCBpbml0aWFsaXplZAotICAgICAqICAgICAgICAgIC1lcnJubyBvbiBlcnJvcgotICAgICAqLwotICAgIGludCAoKnNldF9jYW1lcmFfcG9zaXRpb24pKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCBjb25zdCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgKnJlY3QpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBjYW1lcmEgc3RhdGUuCi0gICAgICogQHBhcmFtIGRldmljZSAtIGRldmljZSBoYW5kbGUKLSAgICAgKiBAcGFyYW0gc3RhdGUgLSBsYXN0IHNldHRpbmcgZm9yIHRoZSBjYW1lcmEKLSAgICAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcwotICAgICAqICAgICAgICAgIC1FUEVSTSBpZiBkZXZpY2UgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICovCi0gICAgaW50ICgqZ2V0X2NhbWVyYV9zdGF0ZSkoc3RydWN0IHZlaGljbGVfY2FtZXJhX2RldmljZV90ICpkZXZpY2UsIHZlaGljbGVfY2FtZXJhX3N0YXRlX3QgKnN0YXRlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNhbWVyYSBzdGF0ZS4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIC0gZGV2aWNlIGhhbmRsZQotICAgICAqIEBwYXJhbSBzdGF0ZSAtIGRlc2lyZWQgc2V0dGluZyBmb3IgdGhlIGNhbWVyYQotICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCi0gICAgICogICAgICAgICAgLUVQRVJNIGlmIGRldmljZSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKiAgICAgICAgICAtZXJybm8gb24gZXJyb3IKLSAgICAgKi8KLSAgICBpbnQgKCpzZXRfY2FtZXJhX3N0YXRlKShzdHJ1Y3QgdmVoaWNsZV9jYW1lcmFfZGV2aWNlX3QgKmRldmljZSwgY29uc3QgdmVoaWNsZV9jYW1lcmFfc3RhdGVfdCAqc3RhdGUpOwotfSB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdDsKLQotX19FTkRfREVDTFMKLQotI2VuZGlmICAvLyBBTkRST0lEX1ZFSElDTEVfQ0FNRVJBX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9tb2R1bGVzL1JFQURNRS5hbmRyb2lkIGIvbW9kdWxlcy9SRUFETUUuYW5kcm9pZAppbmRleCA1N2FiYjcyLi43ZmZjMGY0IDEwMDY0NAotLS0gYS9tb2R1bGVzL1JFQURNRS5hbmRyb2lkCisrKyBiL21vZHVsZXMvUkVBRE1FLmFuZHJvaWQKQEAgLTQsMTMgKzQsMTMgQEAKIGxpYmhhcmR3YXJlLnNvIGV2ZW50dWFsbHkgc2hvdWxkIGNvbnRhaW4gKmp1c3QqIHRoZSBIQUwgaHViCiAoaGFyZHdhcmUuYyksIGV2ZXJ5dGhpbmcgaW4gaXQgc2hvdWxkIGJlIHJld3JpdHRlbiBhcyBtb2R1bGVzLgogCi1Nb2R1bGVzIGFyZSAuc28gaW4gL3N5c3RlbS9saWJzL2h3LyBhbmQgaGF2ZSBhIHdlbGwgZGVmaW5lZCBuYW1pbmcKK01vZHVsZXMgYXJlIC5zbyBpbiAvdmVuZG9yL2xpYi9ody8gYW5kIGhhdmUgYSB3ZWxsIGRlZmluZWQgbmFtaW5nCiBjb252ZW50aW9uOgogCi0gICAgL3N5c3RlbS9saWJzL2h3LzwqX0hBUkRXQVJFX01PRFVMRV9JRD4uPHJvLnByb2R1Y3QuYm9hcmQ+LnNvCi0gICAgL3N5c3RlbS9saWJzL2h3LzwqX0hBUkRXQVJFX01PRFVMRV9JRD4uPHJvLmJvYXJkLnBsYXRmb3JtPi5zbwotICAgIC9zeXN0ZW0vbGlicy9ody88Kl9IQVJEV0FSRV9NT0RVTEVfSUQ+Ljxyby5hcmNoPi5zbwotICAgIC9zeXN0ZW0vbGlicy9ody88Kl9IQVJEV0FSRV9NT0RVTEVfSUQ+LmRlZmF1bHQuc28KKyAgICAvdmVuZG9yL2xpYi9ody88Kl9IQVJEV0FSRV9NT0RVTEVfSUQ+Ljxyby5wcm9kdWN0LmJvYXJkPi5zbworICAgIC92ZW5kb3IvbGliL2h3LzwqX0hBUkRXQVJFX01PRFVMRV9JRD4uPHJvLmJvYXJkLnBsYXRmb3JtPi5zbworICAgIC92ZW5kb3IvbGliL2h3LzwqX0hBUkRXQVJFX01PRFVMRV9JRD4uPHJvLmFyY2g+LnNvCisgICAgL3ZlbmRvci9saWIvaHcvPCpfSEFSRFdBUkVfTU9EVUxFX0lEPi5kZWZhdWx0LnNvCiAKIFRoZXkgYWxzbyBoYXZlIGEgd2VsbCBkZWZpbmVkIGludGVyZmFjZSB3aGljaCBsaXZlcyBpbiBpbmNsdWRlL2hhcmR3YXJlLy4KIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hdWRpby9BbmRyb2lkLmJwIGIvbW9kdWxlcy9hdWRpby9BbmRyb2lkLmJwCmluZGV4IDgwY2FiMTkuLjg0ZGFlYWQgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvYXVkaW8vQW5kcm9pZC5icAorKysgYi9tb2R1bGVzL2F1ZGlvL0FuZHJvaWQuYnAKQEAgLTIxLDExICsyMSwxMiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJhdWRpby5wcmltYXJ5LmRlZmF1bHQiLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKICAgICBzcmNzOiBbImF1ZGlvX2h3LmMiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICBdLAotICAgIGNmbGFnczogWyItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciIsICItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKIH0KIAogLy8gVGhlIHN0dWIgYXVkaW8gSEFMIG1vZHVsZSwgaWRlbnRpY2FsIHRvIHRoZSBkZWZhdWx0IGF1ZGlvIGhhbCwgYnV0IHdpdGgKQEAgLTM3LDExICszOCwxMiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJhdWRpby5zdHViLmRlZmF1bHQiLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKICAgICBzcmNzOiBbImF1ZGlvX2h3LmMiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICBdLAotICAgIGNmbGFnczogWyItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciIsICItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKIH0KIAogLy8gVGhlIHN0dWIgYXVkaW8gcG9saWN5IEhBTCBtb2R1bGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHNrZWxldG9uIGZvcgpAQCAtNDksOSArNTEsMTAgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAiYXVkaW9fcG9saWN5LnN0dWIiLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKICAgICBzcmNzOiBbImF1ZGlvX3BvbGljeS5jIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKLSAgICBjZmxhZ3M6IFsiLVduby11bnVzZWQtcGFyYW1ldGVyIl0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiLCAiLVduby11bnVzZWQtcGFyYW1ldGVyIl0sCiB9CmRpZmYgLS1naXQgYS9tb2R1bGVzL2F1ZGlvL2F1ZGlvX2h3LmMgYi9tb2R1bGVzL2F1ZGlvL2F1ZGlvX2h3LmMKaW5kZXggM2MyODhjYS4uOGY3M2YxMSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9hdWRpby9hdWRpb19ody5jCisrKyBiL21vZHVsZXMvYXVkaW8vYXVkaW9faHcuYwpAQCAtMzAwLDExICszMDAsOSBAQAogewogICAgIEFMT0dWKCJhZGV2X29wZW5fb3V0cHV0X3N0cmVhbS4uLiIpOwogCi0gICAgc3RydWN0IHN0dWJfYXVkaW9fZGV2aWNlICpsYWRldiA9IChzdHJ1Y3Qgc3R1Yl9hdWRpb19kZXZpY2UgKilkZXY7Ci0gICAgc3RydWN0IHN0dWJfc3RyZWFtX291dCAqb3V0OwotICAgIGludCByZXQ7Ci0KLSAgICBvdXQgPSAoc3RydWN0IHN0dWJfc3RyZWFtX291dCAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHN0dWJfc3RyZWFtX291dCkpOworICAgICpzdHJlYW1fb3V0ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3R1Yl9zdHJlYW1fb3V0ICpvdXQgPQorICAgICAgICAgICAgKHN0cnVjdCBzdHViX3N0cmVhbV9vdXQgKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzdHViX3N0cmVhbV9vdXQpKTsKICAgICBpZiAoIW91dCkKICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAKQEAgLTMyOCwxMSArMzI2LDYgQEAKIAogICAgICpzdHJlYW1fb3V0ID0gJm91dC0+c3RyZWFtOwogICAgIHJldHVybiAwOwotCi1lcnJfb3BlbjoKLSAgICBmcmVlKG91dCk7Ci0gICAgKnN0cmVhbV9vdXQgPSBOVUxMOwotICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFkZXZfY2xvc2Vfb3V0cHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlICpkZXYsCkBAIC00MjcsMTEgKzQyMCw4IEBACiB7CiAgICAgQUxPR1YoImFkZXZfb3Blbl9pbnB1dF9zdHJlYW0uLi4iKTsKIAotICAgIHN0cnVjdCBzdHViX2F1ZGlvX2RldmljZSAqbGFkZXYgPSAoc3RydWN0IHN0dWJfYXVkaW9fZGV2aWNlICopZGV2OwotICAgIHN0cnVjdCBzdHViX3N0cmVhbV9pbiAqaW47Ci0gICAgaW50IHJldDsKLQotICAgIGluID0gKHN0cnVjdCBzdHViX3N0cmVhbV9pbiAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHN0dWJfc3RyZWFtX2luKSk7CisgICAgKnN0cmVhbV9pbiA9IE5VTEw7CisgICAgc3RydWN0IHN0dWJfc3RyZWFtX2luICppbiA9IChzdHJ1Y3Qgc3R1Yl9zdHJlYW1faW4gKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzdHViX3N0cmVhbV9pbikpOwogICAgIGlmICghaW4pCiAgICAgICAgIHJldHVybiAtRU5PTUVNOwogCkBAIC00NTMsMTEgKzQ0Myw2IEBACiAKICAgICAqc3RyZWFtX2luID0gJmluLT5zdHJlYW07CiAgICAgcmV0dXJuIDA7Ci0KLWVycl9vcGVuOgotICAgIGZyZWUoaW4pOwotICAgICpzdHJlYW1faW4gPSBOVUxMOwotICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFkZXZfY2xvc2VfaW5wdXRfc3RyZWFtKHN0cnVjdCBhdWRpb19od19kZXZpY2UgKmRldiwKQEAgLTQ4Niw3ICs0NzEsNiBAQAogICAgIEFMT0dWKCJhZGV2X29wZW46ICVzIiwgbmFtZSk7CiAKICAgICBzdHJ1Y3Qgc3R1Yl9hdWRpb19kZXZpY2UgKmFkZXY7Ci0gICAgaW50IHJldDsKIAogICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfSU5URVJGQUNFKSAhPSAwKQogICAgICAgICByZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXVkaW8vYXVkaW9fcG9saWN5LmMgYi9tb2R1bGVzL2F1ZGlvL2F1ZGlvX3BvbGljeS5jCmluZGV4IDkzMzU2NTQuLjRmOWNkNWEgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvYXVkaW8vYXVkaW9fcG9saWN5LmMKKysrIGIvbW9kdWxlcy9hdWRpby9hdWRpb19wb2xpY3kuYwpAQCAtMjQxLDkgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb2xpY3kgKiphcCkKIHsKLSAgICBzdHJ1Y3QgZGVmYXVsdF9hcF9kZXZpY2UgKmRldjsKICAgICBzdHJ1Y3QgZGVmYXVsdF9hdWRpb19wb2xpY3kgKmRhcDsKLSAgICBpbnQgcmV0OwogCiAgICAgKmFwID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hdWRpb19yZW1vdGVfc3VibWl4L0FuZHJvaWQubWsgYi9tb2R1bGVzL2F1ZGlvX3JlbW90ZV9zdWJtaXgvQW5kcm9pZC5tawppbmRleCA5MGRhMzk2Li5jOWU4NTFmIDEwMDY0NAotLS0gYS9tb2R1bGVzL2F1ZGlvX3JlbW90ZV9zdWJtaXgvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL2F1ZGlvX3JlbW90ZV9zdWJtaXgvQW5kcm9pZC5tawpAQCAtMTgsMTEgKzE4LDEzIEBACiAKIExPQ0FMX01PRFVMRSA6PSBhdWRpby5yX3N1Ym1peC5kZWZhdWx0CiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJYXVkaW9faHcuY3BwCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKIAlmcmFtZXdvcmtzL2F2L2luY2x1ZGUvIFwKLQlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlLworCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGlidXRpbHMgbGlibmJhaW8KIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlibWVkaWFfaGVscGVyCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvM18wL0FuZHJvaWQubWsgYi9tb2R1bGVzL2NhbWVyYS8zXzAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTY4ZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9jYW1lcmEvM18wL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IGNhbWVyYS5kZWZhdWx0CitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwlzeXN0ZW0vY29yZS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCUNhbWVyYUhBTC5jcHAgXAorCUNhbWVyYS5jcHAgXAorCUV4YW1wbGVDYW1lcmEuY3BwIFwKKwlNZXRhZGF0YS5jcHAgXAorCVN0cmVhbS5jcHAgXAorCVZlbmRvclRhZ3MuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY2FtZXJhX21ldGFkYXRhIFwKKwlsaWJjdXRpbHMgXAorCWxpYmxvZyBcCisJbGlic3luYyBcCisJbGlidXRpbHMgXAorCitMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtZnZpc2liaWxpdHk9aGlkZGVuCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL0NhbWVyYS5jcHAgYi9tb2R1bGVzL2NhbWVyYS8zXzAvQ2FtZXJhLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvQ2FtZXJhLmNwcApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYS5jcHAKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL0NhbWVyYS5oIGIvbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtb2R1bGVzL2NhbWVyYS9DYW1lcmEuaApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYS5oCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9DYW1lcmFIQUwuY3BwIGIvbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYUhBTC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL0NhbWVyYUhBTC5jcHAKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9DYW1lcmFIQUwuY3BwCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9DYW1lcmFIQUwuaCBiL21vZHVsZXMvY2FtZXJhLzNfMC9DYW1lcmFIQUwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvQ2FtZXJhSEFMLmgKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9DYW1lcmFIQUwuaApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvRXhhbXBsZUNhbWVyYS5jcHAgYi9tb2R1bGVzL2NhbWVyYS8zXzAvRXhhbXBsZUNhbWVyYS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL0V4YW1wbGVDYW1lcmEuY3BwCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvRXhhbXBsZUNhbWVyYS5jcHAKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL0V4YW1wbGVDYW1lcmEuaCBiL21vZHVsZXMvY2FtZXJhLzNfMC9FeGFtcGxlQ2FtZXJhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL0V4YW1wbGVDYW1lcmEuaApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL0V4YW1wbGVDYW1lcmEuaApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvTWV0YWRhdGEuY3BwIGIvbW9kdWxlcy9jYW1lcmEvM18wL01ldGFkYXRhLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvTWV0YWRhdGEuY3BwCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvTWV0YWRhdGEuY3BwCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9NZXRhZGF0YS5oIGIvbW9kdWxlcy9jYW1lcmEvM18wL01ldGFkYXRhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL01ldGFkYXRhLmgKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9NZXRhZGF0YS5oCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9TdHJlYW0uY3BwIGIvbW9kdWxlcy9jYW1lcmEvM18wL1N0cmVhbS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL1N0cmVhbS5jcHAKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9TdHJlYW0uY3BwCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9TdHJlYW0uaCBiL21vZHVsZXMvY2FtZXJhLzNfMC9TdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvU3RyZWFtLmgKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9TdHJlYW0uaApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvVmVuZG9yVGFncy5jcHAgYi9tb2R1bGVzL2NhbWVyYS8zXzAvVmVuZG9yVGFncy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL1ZlbmRvclRhZ3MuY3BwCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvVmVuZG9yVGFncy5jcHAKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL1ZlbmRvclRhZ3MuaCBiL21vZHVsZXMvY2FtZXJhLzNfMC9WZW5kb3JUYWdzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL1ZlbmRvclRhZ3MuaApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL1ZlbmRvclRhZ3MuaApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvQW5kcm9pZC5tayBiL21vZHVsZXMvY2FtZXJhL0FuZHJvaWQubWsKaW5kZXggYWU2OGVkNS4uNzEzODhhYSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9jYW1lcmEvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL2NhbWVyYS9BbmRyb2lkLm1rCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsMzQgKzEyLDQgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGNhbWVyYS5kZWZhdWx0Ci1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodwotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLQlzeXN0ZW0vY29yZS9pbmNsdWRlIFwKLQlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCUNhbWVyYUhBTC5jcHAgXAotCUNhbWVyYS5jcHAgXAotCUV4YW1wbGVDYW1lcmEuY3BwIFwKLQlNZXRhZGF0YS5jcHAgXAotCVN0cmVhbS5jcHAgXAotCVZlbmRvclRhZ3MuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY2FtZXJhX21ldGFkYXRhIFwKLQlsaWJjdXRpbHMgXAotCWxpYmxvZyBcCi0JbGlic3luYyBcCi0JbGlidXRpbHMgXAotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtZnZpc2liaWxpdHk9aGlkZGVuCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jb25zdW1lcmlyL0FuZHJvaWQuYnAgYi9tb2R1bGVzL2NvbnN1bWVyaXIvQW5kcm9pZC5icAppbmRleCA0ZWU1ZmIxLi5iMTM5NDkyIDEwMDY0NAotLS0gYS9tb2R1bGVzL2NvbnN1bWVyaXIvQW5kcm9pZC5icAorKysgYi9tb2R1bGVzL2NvbnN1bWVyaXIvQW5kcm9pZC5icApAQCAtMTUsNiArMTUsNyBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJjb25zdW1lcmlyLmRlZmF1bHQiLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKICAgICBzcmNzOiBbImNvbnN1bWVyaXIuYyJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9maW5nZXJwcmludC9BbmRyb2lkLmJwIGIvbW9kdWxlcy9maW5nZXJwcmludC9BbmRyb2lkLmJwCmluZGV4IGE2NmY5ZjkuLmJhNzQ5ZTQgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvZmluZ2VycHJpbnQvQW5kcm9pZC5icAorKysgYi9tb2R1bGVzL2ZpbmdlcnByaW50L0FuZHJvaWQuYnAKQEAgLTE1LDYgKzE1LDcgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAiZmluZ2VycHJpbnQuZGVmYXVsdCIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIHNyY3M6IFsiZmluZ2VycHJpbnQuYyJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmxvZyJdLAogfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9ncmFsbG9jL0FuZHJvaWQubWsgYi9tb2R1bGVzL2dyYWxsb2MvQW5kcm9pZC5tawppbmRleCA2YjZlNjBkLi5mZjU4MDhkIDEwMDY0NAotLS0gYS9tb2R1bGVzL2dyYWxsb2MvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL2dyYWxsb2MvQW5kcm9pZC5tawpAQCAtMjAsNiArMjAsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliY3V0aWxzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAJXApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9ncmFsbG9jL2dyYWxsb2MuY3BwIGIvbW9kdWxlcy9ncmFsbG9jL2dyYWxsb2MuY3BwCmluZGV4IGY4ZDNjNzguLjA3YmJmYmEgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvZ3JhbGxvYy9ncmFsbG9jLmNwcAorKysgYi9tb2R1bGVzL2dyYWxsb2MvZ3JhbGxvYy5jcHAKQEAgLTIwOSw2ICsyMDksOSBAQAogCiAgICAgaW50IGJ5dGVzUGVyUGl4ZWwgPSAwOwogICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBX0ZQMTY6CisgICAgICAgICAgICBieXRlc1BlclBpeGVsID0gODsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OgogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9od2NvbXBvc2VyL0FuZHJvaWQubWsgYi9tb2R1bGVzL2h3Y29tcG9zZXIvQW5kcm9pZC5tawppbmRleCAzNWMwZmFlLi5kYTBmNmRiIDEwMDY0NAotLS0gYS9tb2R1bGVzL2h3Y29tcG9zZXIvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL2h3Y29tcG9zZXIvQW5kcm9pZC5tawpAQCAtMjAsNiArMjAsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliRUdMCiBMT0NBTF9TUkNfRklMRVMgOj0gaHdjb21wb3Nlci5jcHAKIExPQ0FMX01PRFVMRSA6PSBod2NvbXBvc2VyLmRlZmF1bHQKZGlmZiAtLWdpdCBhL21vZHVsZXMvaHdjb21wb3Nlci9od2NvbXBvc2VyLmNwcCBiL21vZHVsZXMvaHdjb21wb3Nlci9od2NvbXBvc2VyLmNwcAppbmRleCAyOTdjYWZkLi5mZDRlOTBkIDEwMDY0NAotLS0gYS9tb2R1bGVzL2h3Y29tcG9zZXIvaHdjb21wb3Nlci5jcHAKKysrIGIvbW9kdWxlcy9od2NvbXBvc2VyL2h3Y29tcG9zZXIuY3BwCkBAIC0zNywxOCArMzcsMTggQEAKICAgICAgICAgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKTsKIAogc3RhdGljIHN0cnVjdCBod19tb2R1bGVfbWV0aG9kc190IGh3Y19tb2R1bGVfbWV0aG9kcyA9IHsKLSAgICBvcGVuOiBod2NfZGV2aWNlX29wZW4KKyAgICAub3BlbiA9IGh3Y19kZXZpY2Vfb3BlbgogfTsKIAogaHdjX21vZHVsZV90IEhBTF9NT0RVTEVfSU5GT19TWU0gPSB7Ci0gICAgY29tbW9uOiB7Ci0gICAgICAgIHRhZzogSEFSRFdBUkVfTU9EVUxFX1RBRywKLSAgICAgICAgdmVyc2lvbl9tYWpvcjogMSwKLSAgICAgICAgdmVyc2lvbl9taW5vcjogMCwKLSAgICAgICAgaWQ6IEhXQ19IQVJEV0FSRV9NT0RVTEVfSUQsCi0gICAgICAgIG5hbWU6ICJTYW1wbGUgaHdjb21wb3NlciBtb2R1bGUiLAotICAgICAgICBhdXRob3I6ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKLSAgICAgICAgbWV0aG9kczogJmh3Y19tb2R1bGVfbWV0aG9kcywKKyAgICAuY29tbW9uID0geworICAgICAgICAudGFnID0gSEFSRFdBUkVfTU9EVUxFX1RBRywKKyAgICAgICAgLnZlcnNpb25fbWFqb3IgPSAxLAorICAgICAgICAudmVyc2lvbl9taW5vciA9IDAsCisgICAgICAgIC5pZCA9IEhXQ19IQVJEV0FSRV9NT0RVTEVfSUQsCisgICAgICAgIC5uYW1lID0gIlNhbXBsZSBod2NvbXBvc2VyIG1vZHVsZSIsCisgICAgICAgIC5hdXRob3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgICAgIC5tZXRob2RzID0gJmh3Y19tb2R1bGVfbWV0aG9kcywKICAgICB9CiB9OwogCkBAIC02Nyw4ICs2Nyw4IEBACiAgICAgICAgICAgICBsLT5kaXNwbGF5RnJhbWUuYm90dG9tKTsKIH0KIAotc3RhdGljIGludCBod2NfcHJlcGFyZShod2NfY29tcG9zZXJfZGV2aWNlXzFfdCAqZGV2LAotICAgICAgICBzaXplX3QgbnVtRGlzcGxheXMsIGh3Y19kaXNwbGF5X2NvbnRlbnRzXzFfdCoqIGRpc3BsYXlzKSB7CitzdGF0aWMgaW50IGh3Y19wcmVwYXJlKGh3Y19jb21wb3Nlcl9kZXZpY2VfMV90ICogLypkZXYqLywKKyAgICAgICAgc2l6ZV90IC8qbnVtRGlzcGxheXMqLywgaHdjX2Rpc3BsYXlfY29udGVudHNfMV90KiogZGlzcGxheXMpIHsKICAgICBpZiAoZGlzcGxheXMgJiYgKGRpc3BsYXlzWzBdLT5mbGFncyAmIEhXQ19HRU9NRVRSWV9DSEFOR0VEKSkgewogICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGRpc3BsYXlzWzBdLT5udW1Id0xheWVycyA7IGkrKykgewogICAgICAgICAgICAgLy9kdW1wX2xheWVyKCZsaXN0LT5od0xheWVyc1tpXSk7CkBAIC03OCwxNiArNzgsMTYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBod2Nfc2V0KGh3Y19jb21wb3Nlcl9kZXZpY2VfMV90ICpkZXYsCi0gICAgICAgIHNpemVfdCBudW1EaXNwbGF5cywgaHdjX2Rpc3BsYXlfY29udGVudHNfMV90KiogZGlzcGxheXMpCitzdGF0aWMgaW50IGh3Y19zZXQoaHdjX2NvbXBvc2VyX2RldmljZV8xX3QgKiAvKmRldiovLAorICAgICAgICBzaXplX3QgLypudW1EaXNwbGF5cyovLCBod2NfZGlzcGxheV9jb250ZW50c18xX3QqKiBkaXNwbGF5cykKIHsKICAgICAvL2ZvciAoc2l6ZV90IGk9MCA7IGk8bGlzdC0+bnVtSHdMYXllcnMgOyBpKyspIHsKICAgICAvLyAgICBkdW1wX2xheWVyKCZsaXN0LT5od0xheWVyc1tpXSk7CiAgICAgLy99CiAKLSAgICBFR0xCb29sZWFuIHN1Y2VzcyA9IGVnbFN3YXBCdWZmZXJzKChFR0xEaXNwbGF5KWRpc3BsYXlzWzBdLT5kcHksCisgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsU3dhcEJ1ZmZlcnMoKEVHTERpc3BsYXkpZGlzcGxheXNbMF0tPmRweSwKICAgICAgICAgICAgIChFR0xTdXJmYWNlKWRpc3BsYXlzWzBdLT5zdXIpOwotICAgIGlmICghc3VjZXNzKSB7CisgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgIHJldHVybiBIV0NfRUdMX0VSUk9SOwogICAgIH0KICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21vZHVsZXMvaW5wdXQvZXZkZXYvQW5kcm9pZC5tayBiL21vZHVsZXMvaW5wdXQvZXZkZXYvQW5kcm9pZC5tawppbmRleCA5YTVkMDkyLi5iZTRkYjZiIDEwMDY0NAotLS0gYS9tb2R1bGVzL2lucHV0L2V2ZGV2L0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy9pbnB1dC9ldmRldi9BbmRyb2lkLm1rCkBAIC00NSw2ICs0NSw3IEBACiAKIExPQ0FMX01PRFVMRSA6PSBpbnB1dC5ldmRldi5kZWZhdWx0CiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKICAgICBFdmRldk1vZHVsZS5jcHAKZGlmZiAtLWdpdCBhL21vZHVsZXMvbG9jYWxfdGltZS9BbmRyb2lkLmJwIGIvbW9kdWxlcy9sb2NhbF90aW1lL0FuZHJvaWQuYnAKaW5kZXggZGYzMjMyNS4uNjQzYWZhNSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9sb2NhbF90aW1lL0FuZHJvaWQuYnAKKysrIGIvbW9kdWxlcy9sb2NhbF90aW1lL0FuZHJvaWQuYnAKQEAgLTI0LDYgKzI0LDcgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibG9jYWxfdGltZS5kZWZhdWx0IiwKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCiAgICAgc3JjczogWyJsb2NhbF90aW1lX2h3LmMiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL21vZHVsZXMvbG9jYWxfdGltZS9sb2NhbF90aW1lX2h3LmMgYi9tb2R1bGVzL2xvY2FsX3RpbWUvbG9jYWxfdGltZV9ody5jCmluZGV4IDRiMjE2NTYuLmIzOGQ4YTUgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvbG9jYWxfdGltZS9sb2NhbF90aW1lX2h3LmMKKysrIGIvbW9kdWxlcy9sb2NhbF90aW1lL2xvY2FsX3RpbWVfaHcuYwpAQCAtMjgsNiArMjgsOSBAQAogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvbG9jYWxfdGltZV9oYWwuaD4KIAorLy8gV2Ugb25seSBzdXBwb3J0IGdjYyBhbmQgY2xhbmcsIGJvdGggb2Ygd2hpY2ggc3VwcG9ydCB0aGlzIGF0dHJpYnV0ZS4KKyNkZWZpbmUgVU5VU0VEX0FSR1VNRU5UIF9fYXR0cmlidXRlKCh1bnVzZWQpKQorCiBzdHJ1Y3Qgc3R1Yl9sb2NhbF90aW1lX2RldmljZSB7CiAgICAgc3RydWN0IGxvY2FsX3RpbWVfaHdfZGV2aWNlIGRldmljZTsKIH07CkBAIC01MSw3ICs1NCw4IEBACiAgICAgcmV0dXJuIChpbnQ2NF90KW5vdzsKIH0KIAotc3RhdGljIHVpbnQ2NF90IGx0ZGV2X2dldF9sb2NhbF9mcmVxKHN0cnVjdCBsb2NhbF90aW1lX2h3X2RldmljZSogZGV2KQorc3RhdGljIHVpbnQ2NF90IGx0ZGV2X2dldF9sb2NhbF9mcmVxKAorICAgICAgICBzdHJ1Y3QgbG9jYWxfdGltZV9od19kZXZpY2UqIGRldiBVTlVTRURfQVJHVU1FTlQpCiB7CiAgICAgLy8gRm9yIGJldHRlciBvciB3b3JzZSwgbGludXggY2xvY2tfZ2V0dGltZSByb3V0aW5lcyBub3JtYWxpemUgYWxsIGNsb2NrCiAgICAgLy8gZnJlcXVlbmNpZXMgdG8gMUdIegpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9uZmMtbmNpL0FuZHJvaWQuYnAgYi9tb2R1bGVzL25mYy1uY2kvQW5kcm9pZC5icAppbmRleCBmYzczNzYxLi45MGQyYTI4IDEwMDY0NAotLS0gYS9tb2R1bGVzL25mYy1uY2kvQW5kcm9pZC5icAorKysgYi9tb2R1bGVzL25mYy1uY2kvQW5kcm9pZC5icApAQCAtMTUsNiArMTUsNyBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJuZmNfbmNpLmRlZmF1bHQiLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKICAgICBzcmNzOiBbIm5mY19uY2lfZXhhbXBsZS5jIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9tb2R1bGVzL25mYy1uY2kvbmZjX25jaV9leGFtcGxlLmMgYi9tb2R1bGVzL25mYy1uY2kvbmZjX25jaV9leGFtcGxlLmMKaW5kZXggY2RmZDdkNy4uZjNmNjBmNiAxMDA2NDQKLS0tIGEvbW9kdWxlcy9uZmMtbmNpL25mY19uY2lfZXhhbXBsZS5jCisrKyBiL21vZHVsZXMvbmZjLW5jaS9uZmNfbmNpX2V4YW1wbGUuYwpAQCAtMjMsNDQgKzIzLDYxIEBACiAjaW5jbHVkZSA8aGFyZHdhcmUvbmZjLmg+CiAKIC8qCisgKiBXZSB3YW50IHRvIHNpbGVuY2UgdGhlICJ1bnVzZWQgYXJndW1lbnQiIHRoYXQgZ2NjIGFuZCBjbGFuZyBnaXZlLgorICogT3RoZXIgY29tcGlsZXJzIGdlbmVyYXRpbmcgdGhpcyB3YXJuaW5nIHdpbGwgbmVlZCB0byBwcm92aWRlIHRoZWlyCisgKiBjdXN0b20gYXR0cmlidXRlIHRvIHNpbGVuY2UgdGhpcy4KKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19jbGFuZ19fKQorI2RlZmluZSBVTlVTRURfQVJHVU1FTlQgX19hdHRyaWJ1dGUoKHVudXNlZCkpCisjZWxzZQorI2RlZmluZSBVTlVTRURfQVJHVU1FTlQKKyNlbmRpZgorCisvKgogICogTkNJIEhBTCBtZXRob2QgaW1wbGVtZW50YXRpb25zLiBUaGVzZSBtdXN0IGJlIG92ZXJyaWRlbgogICovCi1zdGF0aWMgaW50IGhhbF9vcGVuKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2LAotICAgICAgICBuZmNfc3RhY2tfY2FsbGJhY2tfdCAqcF9jYmFjaywgbmZjX3N0YWNrX2RhdGFfY2FsbGJhY2tfdCAqcF9kYXRhX2NiYWNrKSB7CitzdGF0aWMgaW50IGhhbF9vcGVuKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2IFVOVVNFRF9BUkdVTUVOVCwKKyAgICAgICAgbmZjX3N0YWNrX2NhbGxiYWNrX3QgKnBfY2JhY2sgVU5VU0VEX0FSR1VNRU5ULAorICAgICAgICBuZmNfc3RhY2tfZGF0YV9jYWxsYmFja190ICpwX2RhdGFfY2JhY2sgVU5VU0VEX0FSR1VNRU5UKSB7CiAgICAgQUxPR0UoIk5GQy1OQ0kgSEFMOiAlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGFsX3dyaXRlKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2LAotICAgICAgICB1aW50MTZfdCBkYXRhX2xlbiwgY29uc3QgdWludDhfdCAqcF9kYXRhKSB7CitzdGF0aWMgaW50IGhhbF93cml0ZShjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldiBVTlVTRURfQVJHVU1FTlQsCisgICAgICAgIHVpbnQxNl90IGRhdGFfbGVuIFVOVVNFRF9BUkdVTUVOVCwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcF9kYXRhIFVOVVNFRF9BUkdVTUVOVCkgewogICAgIEFMT0dFKCJORkMtTkNJIEhBTDogJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhhbF9jb3JlX2luaXRpYWxpemVkKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2LAotICAgICAgICB1aW50OF90KiBwX2NvcmVfaW5pdF9yc3BfcGFyYW1zKSB7CitzdGF0aWMgaW50IGhhbF9jb3JlX2luaXRpYWxpemVkKAorICAgICAgICBjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldiBVTlVTRURfQVJHVU1FTlQsCisgICAgICAgIHVpbnQ4X3QqIHBfY29yZV9pbml0X3JzcF9wYXJhbXMgVU5VU0VEX0FSR1VNRU5UKSB7CiAgICAgQUxPR0UoIk5GQy1OQ0kgSEFMOiAlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGFsX3ByZV9kaXNjb3Zlcihjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldikgeworc3RhdGljIGludCBoYWxfcHJlX2Rpc2NvdmVyKAorICAgICAgICBjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldiBVTlVTRURfQVJHVU1FTlQpIHsKICAgICBBTE9HRSgiTkZDLU5DSSBIQUw6ICVzIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoYWxfY2xvc2UoY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYpIHsKK3N0YXRpYyBpbnQgaGFsX2Nsb3NlKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2IFVOVVNFRF9BUkdVTUVOVCkgewogICAgIEFMT0dFKCJORkMtTkNJIEhBTDogJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhhbF9jb250cm9sX2dyYW50ZWQgKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqcF9kZXYpCitzdGF0aWMgaW50IGhhbF9jb250cm9sX2dyYW50ZWQgKAorICAgICAgICBjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKnBfZGV2IFVOVVNFRF9BUkdVTUVOVCkKIHsKICAgICBBTE9HRSgiTkZDLU5DSSBIQUw6ICVzIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gMDsKIH0KIAogCi1zdGF0aWMgaW50IGhhbF9wb3dlcl9jeWNsZSAoY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpwX2RldikKK3N0YXRpYyBpbnQgaGFsX3Bvd2VyX2N5Y2xlICgKKyAgICAgICAgY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpwX2RldiBVTlVTRURfQVJHVU1FTlQpCiB7CiAgICAgQUxPR0UoIk5GQy1OQ0kgSEFMOiAlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9tb2R1bGVzL25mYy9BbmRyb2lkLmJwIGIvbW9kdWxlcy9uZmMvQW5kcm9pZC5icAppbmRleCA1M2FiMzA5Li4xMGRjMmMxIDEwMDY0NAotLS0gYS9tb2R1bGVzL25mYy9BbmRyb2lkLmJwCisrKyBiL21vZHVsZXMvbmZjL0FuZHJvaWQuYnAKQEAgLTE1LDYgKzE1LDcgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibmZjLmRlZmF1bHQiLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKICAgICBzcmNzOiBbIm5mY19wbjU0NF9leGFtcGxlLmMiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL21vZHVsZXMvcG93ZXIvQW5kcm9pZC5icCBiL21vZHVsZXMvcG93ZXIvQW5kcm9pZC5icAppbmRleCAyYjg2YzhiLi5mNGM3NGNlIDEwMDY0NAotLS0gYS9tb2R1bGVzL3Bvd2VyL0FuZHJvaWQuYnAKKysrIGIvbW9kdWxlcy9wb3dlci9BbmRyb2lkLmJwCkBAIC0xNSw2ICsxNSw3IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogInBvd2VyLmRlZmF1bHQiLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKICAgICBzcmNzOiBbInBvd2VyLmMiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJsb2ciXSwKIH0KZGlmZiAtLWdpdCBhL21vZHVsZXMvcmFkaW8vcmFkaW9faGFsX3Rvb2wuYyBiL21vZHVsZXMvcmFkaW8vcmFkaW9faGFsX3Rvb2wuYwppbmRleCBiYWEyZWZlLi4wMTE3ZjI4IDEwMDY0NAotLS0gYS9tb2R1bGVzL3JhZGlvL3JhZGlvX2hhbF90b29sLmMKKysrIGIvbW9kdWxlcy9yYWRpby9yYWRpb19oYWxfdG9vbC5jCkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgcmFkaW9fbWV0YWRhdGFfa2V5X3Qga2V5OwogICAgICAgICByYWRpb19tZXRhZGF0YV90eXBlX3QgdHlwZTsKICAgICAgICAgdm9pZCAqdmFsdWU7Ci0gICAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICAgIHNpemVfdCBzaXplOwogCiAgICAgICAgIHJhZGlvX21ldGFkYXRhX2dldF9hdF9pbmRleChpbmZvLm1ldGFkYXRhLCBpLCAma2V5LCAmdHlwZSwgJnZhbHVlLCAmc2l6ZSk7CiAKZGlmZiAtLWdpdCBhL21vZHVsZXMvcmFkaW8vcmFkaW9faHcuYyBiL21vZHVsZXMvcmFkaW8vcmFkaW9faHcuYwppbmRleCBjZjQ3ZTNjLi40Mzc2YmYwIDEwMDY0NAotLS0gYS9tb2R1bGVzL3JhZGlvL3JhZGlvX2h3LmMKKysrIGIvbW9kdWxlcy9yYWRpby9yYWRpb19ody5jCkBAIC01MSw3ICs1MSw3IEBACiAgICAgLmJhbmRzID0gewogICAgICAgICB7CiAgICAgICAgICAgICAudHlwZSA9IFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICAuYW50ZW5uYV9jb25uZWN0ZWQgPSBmYWxzZSwKKyAgICAgICAgICAgIC5hbnRlbm5hX2Nvbm5lY3RlZCA9IHRydWUsCiAgICAgICAgICAgICAubG93ZXJfbGltaXQgPSA4NzkwMCwKICAgICAgICAgICAgIC51cHBlcl9saW1pdCA9IDEwNzkwMCwKICAgICAgICAgICAgIC5udW1fc3BhY2luZ3MgPSAxLApAQCAtMjI0LDYgKzIyNCw3IEBACiAgICAgKm1ldGFkYXRhID0gTlVMTDsKIAogICAgIHJldCA9IHJhZGlvX21ldGFkYXRhX2FsbG9jYXRlKG1ldGFkYXRhLCB0dW5lci0+cHJvZ3JhbS5jaGFubmVsLCAwKTsKKwogICAgIGlmIChyZXQgIT0gMCkKICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtMjM1LDE0ICsyMzYsMTQgQEAKICAgICAgICAgaWYgKHJldCAhPSAwKQogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICByZXQgPSBhZGRfYml0bWFwX21ldGFkYXRhKG1ldGFkYXRhLCBSQURJT19NRVRBREFUQV9LRVlfSUNPTiwgQklUTUFQX0ZJTEVfUEFUSCk7Ci0gICAgICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgaWYgKHJldCAhPSAwICYmIHJldCAhPSAtRVBJUEUpCiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIHJldCA9IHJhZGlvX21ldGFkYXRhX2FkZF9jbG9jayhtZXRhZGF0YSwgUkFESU9fTUVUQURBVEFfS0VZX0NMT0NLLCAmaHdfY2xvY2spOwogICAgICAgICBpZiAocmV0ICE9IDApCiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0ID0gYWRkX2JpdG1hcF9tZXRhZGF0YShtZXRhZGF0YSwgUkFESU9fTUVUQURBVEFfS0VZX0FSVCwgQklUTUFQX0ZJTEVfUEFUSCk7Ci0gICAgICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgaWYgKHJldCAhPSAwICYmIHJldCAhPSAtRVBJUEUpCiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCkBAIC0zNzAsNiArMzcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHR1bmVyLT5wcm9ncmFtLnN0ZXJlbyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lci0+cHJvZ3JhbS5zdGVyZW8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZV9tZXRhZGF0YSh0dW5lciwgJnR1bmVyLT5wcm9ncmFtLm1ldGFkYXRhLCB0dW5lci0+cHJvZ3JhbS50dW5lZCk7CiAKICAgICAgICAgICAgICAgICAgICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1RVTkVEOwogICAgICAgICAgICAgICAgICAgICBldmVudC5pbmZvID0gdHVuZXItPnByb2dyYW07CkBAIC0zOTYsNiArMzk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgdHVuZXItPnByb2dyYW0uc3RlcmVvID0gdHVuZXItPmNvbmZpZy5hbS5zdGVyZW87CiAgICAgICAgICAgICAgICAgICAgIHR1bmVyLT5wcm9ncmFtLnNpZ25hbF9zdHJlbmd0aCA9IDUwOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlX21ldGFkYXRhKHR1bmVyLCAmdHVuZXItPnByb2dyYW0ubWV0YWRhdGEsIHR1bmVyLT5wcm9ncmFtLnR1bmVkKTsKIAogICAgICAgICAgICAgICAgICAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfVFVORUQ7CiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmluZm8gPSB0dW5lci0+cHJvZ3JhbTsKQEAgLTQwOCwxMiArNDExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0dW5lci0+Y29uZmlnLnNwYWNpbmdzWzBdICogNSkpICUgMjsKIAogICAgICAgICAgICAgICAgICAgICBpZiAodHVuZXItPnByb2dyYW0udHVuZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVfbWV0YWRhdGEodHVuZXIsICZ0dW5lci0+cHJvZ3JhbS5tZXRhZGF0YSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2NvbW1hbmRfbCh0dW5lciwgQ01EX0FOTk9VTkNFTUVOVFMsIHRocmVhZF9jbWRfZGVsYXlfbXNbQ01EX0FOTk9VTkNFTUVOVFNdLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dW5lci0+cHJvZ3JhbS5tZXRhZGF0YSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2RlYWxsb2NhdGUodHVuZXItPnByb2dyYW0ubWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHVuZXItPnByb2dyYW0ubWV0YWRhdGEgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHR1bmVyLT5wcm9ncmFtLnNpZ25hbF9zdHJlbmd0aCA9IDEwMDsKICAgICAgICAgICAgICAgICAgICAgaWYgKHR1bmVyLT5jb25maWcudHlwZSA9PSBSQURJT19CQU5EX0ZNKQpAQCAtNDIyLDYgKzQyMCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIHR1bmVyLT5wcm9ncmFtLnN0ZXJlbyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVuZXItPnByb2dyYW0udHVuZWQgPyB0dW5lci0+Y29uZmlnLmFtLnN0ZXJlbyA6IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlX21ldGFkYXRhKHR1bmVyLCAmdHVuZXItPnByb2dyYW0ubWV0YWRhdGEsIHR1bmVyLT5wcm9ncmFtLnR1bmVkKTsKKwogICAgICAgICAgICAgICAgICAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfVFVORUQ7CiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmluZm8gPSB0dW5lci0+cHJvZ3JhbTsKICAgICAgICAgICAgICAgICAgICAgc2VuZF9tZXRhX2RhdGEgPSB0cnVlOwpAQCAtNDMzLDcgKzQzMyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfTUVUQURBVEE7CiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5tZXRhZGF0YSA9IG1ldGFkYXRhOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRfbWV0YV9kYXRhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBDTURfQ0FOQ0VMOiB7CkBAIC01MTcsNiArNTE2LDEwIEBACiAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CisgICAgaWYgKGNvbmZpZy0+bG93ZXJfbGltaXQgPiBjb25maWctPnVwcGVyX2xpbWl0KSB7CisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgc2VuZF9jb21tYW5kX2woc3R1Yl90dW5lciwgQ01EX0NBTkNFTCwgdGhyZWFkX2NtZF9kZWxheV9tc1tDTURfQ0FOQ0VMXSwgTlVMTCk7CiAgICAgc2VuZF9jb21tYW5kX2woc3R1Yl90dW5lciwgQ01EX0NPTkZJRywgdGhyZWFkX2NtZF9kZWxheV9tc1tDTURfQ09ORklHXSwgKHZvaWQgKiljb25maWcpOwogCkBAIC02MjksNyArNjMyLDEyIEBACiAgICAgbWV0YWRhdGEgPSBpbmZvLT5tZXRhZGF0YTsKICAgICAqaW5mbyA9IHN0dWJfdHVuZXItPnByb2dyYW07CiAgICAgaW5mby0+bWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICBpZiAobWV0YWRhdGEgIT0gTlVMTCAmJiBzdHViX3R1bmVyLT5wcm9ncmFtLm1ldGFkYXRhICE9IE5VTEwpCisgICAgaWYgKG1ldGFkYXRhID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzIG1ldGFkYXRhIGlzIGEgbnVsbHB0ciIsIF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBpZiAoc3R1Yl90dW5lci0+cHJvZ3JhbS5tZXRhZGF0YSAhPSBOVUxMKQogICAgICAgICByYWRpb19tZXRhZGF0YV9hZGRfbWV0YWRhdGEoJmluZm8tPm1ldGFkYXRhLCBzdHViX3R1bmVyLT5wcm9ncmFtLm1ldGFkYXRhKTsKIAogZXhpdDoKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9BbmRyb2lkLmJwIGIvbW9kdWxlcy9zZW5zb3JzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxNTA2NQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTUgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibXVsdGloYWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJtdWx0aWhhbC5jcHAiLAorICAgICAgICAiU2Vuc29yRXZlbnRRdWV1ZS5jcHAiCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJkbCIKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL0FuZHJvaWQubWsgYi9tb2R1bGVzL3NlbnNvcnMvQW5kcm9pZC5tawppbmRleCA1MzRlNmU5Li5jYTI3N2U2IDEwMDY0NAotLS0gYS9tb2R1bGVzL3NlbnNvcnMvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL3NlbnNvcnMvQW5kcm9pZC5tawpAQCAtMjMsNiArMjMsNyBAQAogTE9DQUxfTU9EVUxFIDo9IHNlbnNvcnMuJChUQVJHRVRfREVWSUNFKQogCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ETE9HX1RBRz1cIk11bHRpSGFsXCIKIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0FuZHJvaWQubWsgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDg1NDJhCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMzAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK0NPTU1PTl9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvciAtV2V4dHJhCisKK2R5bmFtaWNfc2Vuc29yX3NyYyA6PSBcCisgICAgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uY3BwIFwKKyAgICBCYXNlU2Vuc29yT2JqZWN0LmNwcCBcCisgICAgQ29ubmVjdGlvbkRldGVjdG9yLmNwcCBcCisgICAgRHVtbXlEeW5hbWljQWNjZWxEYWVtb24uY3BwIFwKKyAgICBEeW5hbWljU2Vuc29yTWFuYWdlci5jcHAgXAorICAgIEhpZFJhd0RldmljZS5jcHAgXAorICAgIEhpZFJhd1NlbnNvci5jcHAgXAorICAgIEhpZFJhd1NlbnNvckRhZW1vbi5jcHAgXAorICAgIEhpZFJhd1NlbnNvckRldmljZS5jcHAgXAorICAgIFJpbmdCdWZmZXIuY3BwCisKK2R5bmFtaWNfc2Vuc29yX3NoYXJlZF9saWIgOj0gXAorICAgIGxpYmJhc2UgXAorICAgIGxpYmN1dGlscyBcCisgICAgbGliaGlkcGFyc2VyIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYnV0aWxzCisjCisjIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1dGlsaXplIHRoZSBkeW5hbWljIHNlbnNvciBtb2R1bGU6CisjICAgMS4gVXNlIGFzIGFuIGV4dGVuc2lvbiBpbiBhbiBleGlzdGluZyBoYWw6IGRlY2xhcmUgZGVwZW5kZW5jeSBvbiBsaWJkeW5hbWljX3NlbnNvcl9leHQgc2hhcmVkCisjICAgICAgbGlicmFyeSBpbiBleGlzdGluZyBzZW5zb3IgaGFsLgorIyAgIDIuIFVzZSBhcyBhIHN0YW5kYWxvbmUgc2Vuc29yIEhBTCBhbmQgY29uZmlndXJlIG11bHRpaGFsIHRvIGNvbWJpbmUgaXQgd2l0aCBzZW5zb3IgaGFsIHRoYXQKKyMgICAgICBob3N0cyBvdGhlciBzZW5zb3JzOiBhZGQgZGVwZW5kZW5jeSBvbiBzZW5zb3JzLmR5bmFtaWNfc2Vuc29yX2hhbCBpbiBkZXZpY2UgbGV2ZWwgbWFrZWZpbGUgYW5kCisjICAgICAgd3JpdGUgbXVsdGloYWwgY29uZmlndXJhdGlvbiBmaWxlIGFjY29yZGluZ2x5LgorIworIyBQbGVhc2UgdGFrZSBvbmx5IG9uZSBvZiB0aGVzZSB0d28gb3B0aW9ucyB0byBhdm9pZCBjb25mbGljdCBvdmVyIGhhcmR3YXJlIHJlc291cmNlLgorIworIworIyBPcHRpb24gMTogc2Vuc29yIGV4dGVuc2lvbiBtb2R1bGUKKyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYmR5bmFtaWNfc2Vuc29yX2V4dAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKyMgaW50ZW5kZWQgdG8gYmUgaW50ZWdyYXRlZCBpbnRvIGhhbCwgdGh1cyBwcm9wcmlldGFyeQorTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKKworTE9DQUxfQ0ZMQUdTICs9ICQoQ09NTU9OX0NGTEFHUykgLURMT0dfVEFHPVwiRHluYW1pY1NlbnNvckV4dFwiCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGR5bmFtaWNfc2Vuc29yX3NyYykKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAkKGR5bmFtaWNfc2Vuc29yX3NoYXJlZF9saWIpCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIworIyBPcHRpb24gMjogaW5kZXBlbmRlbnQgc2Vuc29yIGhhbAorIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gc2Vuc29ycy5keW5hbWljX3NlbnNvcl9oYWwKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorIyBoYWwgbW9kdWxlLCB0aHVzIHByb3ByaWV0YXJ5CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQorCitMT0NBTF9DRkxBR1MgKz0gJChDT01NT05fQ0ZMQUdTKSAtRExPR19UQUc9XCJEeW5hbWljU2Vuc29ySGFsXCIKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoZHluYW1pY19zZW5zb3Jfc3JjKSBzZW5zb3JzLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICQoZHluYW1pY19zZW5zb3Jfc2hhcmVkX2xpYikKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjCisjIEhvc3QgdGVzdCBmb3IgSGlkUmF3U2Vuc29yLiBUZXN0IHdpdGggZHVtbXkgdGVzdCBISUQgZGVzY3JpcHRvcnMuCisjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBoaWRyYXdzZW5zb3JfaG9zdF90ZXN0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorIyBob3N0IHRlc3QgaXMgdGFyZ2V0aW5nIGxpbnV4IGhvc3Qgb25seQorTE9DQUxfTU9EVUxFX0hPU1RfT1MgOj0gbGludXgKKworTE9DQUxfQ0ZMQUdTICs9ICQoQ09NTU9OX0NGTEFHUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBIaWRSYXdTZW5zb3IuY3BwIFwKKyAgICBCYXNlU2Vuc29yT2JqZWN0LmNwcCBcCisgICAgSGlkVXRpbHMvdGVzdC9UZXN0SGlkRGVzY3JpcHRvci5jcHAgXAorICAgIHRlc3QvSGlkUmF3U2Vuc29yVGVzdC5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJoaWRwYXJzZXJfaG9zdAorCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvdGVzdCAkKExPQ0FMX1BBVEgpL0hpZFV0aWxzL3Rlc3QKK2luY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCisKKyMKKyMgSG9zdCB0ZXN0IGZvciBIaWRSYXdEZXZpY2UgYW5kIEhpZFJhd1NlbnNvci4gVGVzdCB3aXRoIGhpZHJhdworIyBkZXZpY2Ugbm9kZS4KKyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGhpZHJhd2RldmljZV9ob3N0X3Rlc3QKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisjIGhvc3QgdGVzdCBpcyB0YXJnZXRpbmcgbGludXggaG9zdCBvbmx5CitMT0NBTF9NT0RVTEVfSE9TVF9PUyA6PSBsaW51eAorCitMT0NBTF9DRkxBR1MgKz0gJChDT01NT05fQ0ZMQUdTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEhpZFJhd0RldmljZS5jcHAgXAorICAgIEhpZFJhd1NlbnNvci5jcHAgXAorICAgIEJhc2VTZW5zb3JPYmplY3QuY3BwIFwKKyAgICB0ZXN0L0hpZFJhd0RldmljZVRlc3QuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliaGlkcGFyc2VyX2hvc3QKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3Rlc3QgJChMT0NBTF9QQVRIKS9IaWRVdGlscy90ZXN0CitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvSGlkVXRpbHMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VEeW5hbWljU2Vuc29yRGFlbW9uLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlRHluYW1pY1NlbnNvckRhZW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5ZjIxNwotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlRHluYW1pY1NlbnNvckRhZW1vbi5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oIgorI2luY2x1ZGUgIkR5bmFtaWNTZW5zb3JNYW5hZ2VyLmgiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCitib29sIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uOjpvbkNvbm5lY3Rpb25DaGFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSwgYm9vbCBjb25uZWN0ZWQpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gaSA9IG1EZXZpY2VLZXlTZW5zb3JNYXAuZmluZChkZXZpY2VLZXkpOworICAgIGlmIChjb25uZWN0ZWQpIHsKKyAgICAgICAgaWYgKGkgPT0gbURldmljZUtleVNlbnNvck1hcC5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1YoImRldmljZSAlcyBpcyBjb25uZWN0ZWQiLCBkZXZpY2VLZXkuY19zdHIoKSk7CisgICAgICAgICAgICAvLyBnZXQgc2Vuc29ycyBmcm9tIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBCYXNlU2Vuc29yVmVjdG9yIHNlbnNvcnMgPSBjcmVhdGVTZW5zb3IoZGV2aWNlS2V5KTsKKyAgICAgICAgICAgIGlmIChzZW5zb3JzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgibm8gdmFsaWQgc2Vuc29yIGlzIGRlZmluZWQgaW4gZGV2aWNlICVzLCBpZ25vcmUiLCBkZXZpY2VLZXkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJkaXNjb3ZlcmVkICV6dSBzZW5zb3JzIGZyb20gZGV2aWNlIiwgc2Vuc29ycy5zaXplKCkpOworICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGludGVybmFsIHRhYmxlIGZpcnN0CisgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtRGV2aWNlS2V5U2Vuc29yTWFwLmVtcGxhY2UoZGV2aWNlS2V5LCBzdGQ6Om1vdmUoc2Vuc29ycykpOworICAgICAgICAgICAgICAgIC8vIHRoZW4gcmVnaXN0ZXIgc2Vuc29yIHRvIGR5bmFtaWMgc2Vuc29yIG1hbmFnZXIsIHJlc3VsdC5maXJzdCBpcyB0aGUgaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAvLyBvZiBrZXktdmFsdWUgcGFpcjsgcmVzdWx0LmZpcnN0LT5zZWNvbmQgaXMgdGhlIHZhbHVlLCB3aGljaCBpcyBzLgorICAgICAgICAgICAgICAgIGZvciAoYXV0byAmaSA6IHJlc3VsdC5maXJzdC0+c2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlZ2lzdGVyU2Vuc29yKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiZGV2aWNlICVzIGlzIHJlZ2lzdGVyZWQiLCBkZXZpY2VLZXkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZXZpY2UgJXMgYWxyZWFkeSBhZGRlZCBhbmQgaXMgY29ubmVjdGVkIGFnYWluLCBpZ25vcmUiLCBkZXZpY2VLZXkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZGV2aWNlICVzIGlzIGRpc2Nvbm5lY3RlZCIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGkgIT0gbURldmljZUtleVNlbnNvck1hcC5lbmQoKSkgeworICAgICAgICAgICAgQmFzZVNlbnNvclZlY3RvciBzZW5zb3JzID0gaS0+c2Vjb25kOworICAgICAgICAgICAgZm9yIChhdXRvICZzZW5zb3IgOiBzZW5zb3JzKSB7CisgICAgICAgICAgICAgICAgbU1hbmFnZXIudW5yZWdpc3RlclNlbnNvcihzZW5zb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURldmljZUtleVNlbnNvck1hcC5lcmFzZShpKTsKKyAgICAgICAgICAgIC8vIG5vdGlmeSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgcmVtb3ZlU2Vuc29yKGRldmljZUtleSk7CisgICAgICAgICAgICBBTE9HVigiZGV2aWNlICVzIGlzIHVucmVnaXN0ZXJlZCIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiZGV2aWNlIG5vdCBmb3VuZCBpbiByZWdpc3RyeSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWM5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfQkFTRV9EWU5BTUlDX1NFTlNPUl9EQUVNT05fSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfQkFTRV9EWU5BTUlDX1NFTlNPUl9EQUVNT05fSAorCisjaW5jbHVkZSAiQmFzZVNlbnNvck9iamVjdC5oIgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgRHluYW1pY1NlbnNvck1hbmFnZXI7CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8c3A8QmFzZVNlbnNvck9iamVjdD4+IEJhc2VTZW5zb3JWZWN0b3I7CisKK2NsYXNzIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uKER5bmFtaWNTZW5zb3JNYW5hZ2VyJiBtYW5hZ2VyKSA6IG1NYW5hZ2VyKG1hbmFnZXIpIHt9CisgICAgdmlydHVhbCB+QmFzZUR5bmFtaWNTZW5zb3JEYWVtb24oKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGJvb2wgb25Db25uZWN0aW9uQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXksIGJvb2wgY29ubmVjdGVkKTsKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIEJhc2VTZW5zb3JWZWN0b3IgY3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICYvKmRldmljZUtleSovKSB7fTsKKworICAgIER5bmFtaWNTZW5zb3JNYW5hZ2VyICZtTWFuYWdlcjsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIEJhc2VTZW5zb3JWZWN0b3I+IG1EZXZpY2VLZXlTZW5zb3JNYXA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9CQVNFX0RZTkFNSUNfU0VOU09SX0RBRU1PTl9ICisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlU2Vuc29yT2JqZWN0LmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlU2Vuc29yT2JqZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWM3NmIyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VTZW5zb3JPYmplY3QuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQmFzZVNlbnNvck9iamVjdC5oIgorI2luY2x1ZGUgIlNlbnNvckV2ZW50Q2FsbGJhY2suaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK0Jhc2VTZW5zb3JPYmplY3Q6OkJhc2VTZW5zb3JPYmplY3QoKSA6IG1DYWxsYmFjayhudWxscHRyKSB7Cit9CisKK2Jvb2wgQmFzZVNlbnNvck9iamVjdDo6c2V0RXZlbnRDYWxsYmFjayhTZW5zb3JFdmVudENhbGxiYWNrKiBjYWxsYmFjaykgeworICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJhc2VTZW5zb3JPYmplY3Q6OmdldFV1aWQodWludDhfdCogdXVpZCkgY29uc3QgeworICAgIC8vIGRlZmF1bHQgdXVpZCBkZW5vdGluZyB1dWlkIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHNlbnNvci4KKyAgICBtZW1zZXQodXVpZCwgMCwgMTYpOworfQorCitpbnQgQmFzZVNlbnNvck9iamVjdDo6Zmx1c2goKSB7CisgICAgc3RhdGljIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCBldmVudCA9IHsKKyAgICAgICAgLnR5cGUgPSBTRU5TT1JfVFlQRV9NRVRBX0RBVEEsCisgICAgICAgIC50aW1lc3RhbXAgPSBUSU1FU1RBTVBfQVVUT19GSUxMICAvLyB0aW1lc3RhbXAgd2lsbCBiZSBmaWxsZWQgYXQgZGlzcGF0Y2hlcgorICAgIH07CisgICAgZ2VuZXJhdGVFdmVudChldmVudCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQmFzZVNlbnNvck9iamVjdDo6Z2VuZXJhdGVFdmVudChjb25zdCBzZW5zb3JzX2V2ZW50X3QgJmUpIHsKKyAgICBpZiAobUNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjay0+c3VibWl0RXZlbnQoU1BfVEhJUywgZSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VTZW5zb3JPYmplY3QuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlU2Vuc29yT2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkMWE1ZAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlU2Vuc29yT2JqZWN0LmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfQkFTRV9TRU5TT1JfT0JKRUNUX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfQkFTRV9TRU5TT1JfT0JKRUNUX0gKKworI2luY2x1ZGUgIlV0aWxzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworc3RydWN0IHNlbnNvcl90Oworc3RydWN0IHNlbnNvcnNfZXZlbnRfdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK2NsYXNzIFNlbnNvckV2ZW50Q2FsbGJhY2s7CisKK2NsYXNzIEJhc2VTZW5zb3JPYmplY3QgOiB2aXJ0dWFsIHB1YmxpYyBSRUZfQkFTRShCYXNlU2Vuc29yT2JqZWN0KSB7CitwdWJsaWM6CisgICAgQmFzZVNlbnNvck9iamVjdCgpOworICAgIHZpcnR1YWwgfkJhc2VTZW5zb3JPYmplY3QoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBhbHdheXMgY2FsbGVkIGJ5IER5bmFtaWNTZW5zb3JNYW5hZ2VyLCBjYWxsYmFjayBtdXN0IHBvaW50IHRvCisgICAgLy8gdmFsaWQgb2JqZWN0IHRocm91Z2hvdXQgbGlmZSBjeWNsZSBvZiBCYXNlU2Vuc29yT2JqZWN0CisgICAgYm9vbCBzZXRFdmVudENhbGxiYWNrKFNlbnNvckV2ZW50Q2FsbGJhY2sqIGNhbGxiYWNrKTsKKworICAgIC8vIHZpcnR1YWwgZnVuY3Rpb25zIHRvIGdldCBzZW5zb3IgaW5mb3JtYXRpb24gYW5kIG9wZXJhdGUgc2Vuc29yCisgICAgdmlydHVhbCBjb25zdCBzZW5zb3JfdCogZ2V0U2Vuc29yKCkgY29uc3QgPSAwOworCisgICAgLy8gZ2V0IHV1aWQgb2Ygc2Vuc29yLCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNldCBpdCB0byBhbGwgemVybywgbWVhbnMgZG9lcyBub3QgaGF2ZSBhIHV1aWQuCisgICAgdmlydHVhbCB2b2lkIGdldFV1aWQodWludDhfdCogdXVpZCkgY29uc3Q7CisKKyAgICAvLyBlbmFibGUgc2Vuc29yCisgICAgdmlydHVhbCBpbnQgZW5hYmxlKGJvb2wgZW5hYmxlKSA9IDA7CisKKyAgICAvLyBzZXQgc2FtcGxlIHBlcmlvZCBhbmQgYmF0Y2hpbmcgcGVyaW9kIG9mIHNlbnNvci4KKyAgICAvLyBib3RoIHNhbXBsZSBwZXJpb2QgYW5kIGJhdGNoIHBlcmlvZCBhcmUgaW4gbmFuby1zZWNvbmRzLgorICAgIHZpcnR1YWwgaW50IGJhdGNoKGludDY0X3Qgc2FtcGxlUGVyaW9kLCBpbnQ2NF90IGJhdGNoUGVyaW9kKSA9IDA7CisKKyAgICAvLyBmbHVzaCBzZW5zb3IsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2lsbCBzZW5kIGEgZmx1c2ggY29tcGxldGUgZXZlbnQgYmFjay4KKyAgICB2aXJ0dWFsIGludCBmbHVzaCgpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gdXRpbGl0eSBmdW5jdGlvbiBmb3Igc3ViLWNsYXNzCisgICAgdm9pZCBnZW5lcmF0ZUV2ZW50KGNvbnN0IHNlbnNvcnNfZXZlbnRfdCAmZSk7Citwcml2YXRlOgorICAgIFNlbnNvckV2ZW50Q2FsbGJhY2sqIG1DYWxsYmFjazsKK307CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JIQUxfQkFTRV9TRU5TT1JfT0JKRUNUX0gKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Nvbm5lY3Rpb25EZXRlY3Rvci5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQ29ubmVjdGlvbkRldGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTFlOTEyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Nvbm5lY3Rpb25EZXRlY3Rvci5jcHAKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29ubmVjdGlvbkRldGVjdG9yLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy9pbm90aWZ5Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKKy8vIFNvY2tldENvbm5lY3Rpb25EZXRlY3RvciBmdW5jdGlvbnMKK1NvY2tldENvbm5lY3Rpb25EZXRlY3Rvcjo6U29ja2V0Q29ubmVjdGlvbkRldGVjdG9yKEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uICpkLCBpbnQgcG9ydCkKKyAgICAgICAgOiBDb25uZWN0aW9uRGV0ZWN0b3IoZCksIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pIHsKKyAgICAvLyBpbml0aWFsaXplIHNvY2tldCB0aGF0IGFjY2VwdCBjb25uZWN0aW9uIHRvIGxvY2FsaG9zdDpwb3J0CisgICAgbUxpc3RlbkZkID0gOjpzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgIGlmIChtTGlzdGVuRmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBzb2NrZXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXJBZGRyZXNzID0geworICAgICAgICAuc2luX2ZhbWlseSA9IEFGX0lORVQsCisgICAgICAgIC5zaW5fcG9ydCA9IGh0b25zKHBvcnQpLAorICAgICAgICAuc2luX2FkZHIgPSB7CisgICAgICAgICAgICAuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKQorICAgICAgICB9CisgICAgfTsKKworICAgIDo6YmluZChtTGlzdGVuRmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzZXJ2ZXJBZGRyZXNzLCBzaXplb2Yoc2VydmVyQWRkcmVzcykpOworICAgIGlmICg6Omxpc3RlbihtTGlzdGVuRmQsIDApICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgbGlzdGVuIHRvIHBvcnQgJWQiLCBwb3J0KTsKKyAgICAgICAgbUxpc3RlbkZkID0gLTE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gczsKKyAgICBzIDw8ICJzb2NrZXQ6IiA8PCBwb3J0OworICAgIG1EZXZpY2UgPSBzLnN0cigpOworCisgICAgcnVuKCJkZGFkX3NvY2tldCIpOworfQorCitTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3I6On5Tb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IoKSB7CisgICAgaWYgKG1MaXN0ZW5GZCA+PSAwKSB7CisgICAgICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgIH0KK30KKworaW50IFNvY2tldENvbm5lY3Rpb25EZXRlY3Rvcjo6d2FpdEZvckNvbm5lY3Rpb24oKSB7CisgICAgcmV0dXJuIDo6YWNjZXB0KG1MaXN0ZW5GZCwgbnVsbHB0ciwgbnVsbHB0cik7Cit9CisKK3ZvaWQgU29ja2V0Q29ubmVjdGlvbkRldGVjdG9yOjp3YWl0Rm9yRGlzY29ubmVjdGlvbihpbnQgY29ubkZkKSB7CisgICAgY2hhciBidWZmZXJbMTZdOworICAgIHdoaWxlICg6OnJlYWQoY29ubkZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSA+IDApIHsKKyAgICAgICAgLy8gZGlzY2FyZCBkYXRhIGJ1dCByZXNwb25zZSBzb21ldGhpbmcgdG8gZGVub3RlIHRocmVhZCBhbGl2ZQorICAgICAgICA6OndyaXRlKGNvbm5GZCwgIi4iLCAxKTsKKyAgICB9CisgICAgLy8gcmVhZCBmYWlsdXJlIG1lYW5zIGRpc2Nvbm5lY3Rpb24KKyAgICA6OmNsb3NlKGNvbm5GZCk7Cit9CisKK2Jvb2wgU29ja2V0Q29ubmVjdGlvbkRldGVjdG9yOjp0aHJlYWRMb29wKCkgeworICAgIHdoaWxlICghVGhyZWFkOjpleGl0UGVuZGluZygpKSB7CisgICAgICAgIC8vIGJsb2NrIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24KKyAgICAgICAgaW50IGNvbm5GZCA9IHdhaXRGb3JDb25uZWN0aW9uKCk7CisKKyAgICAgICAgaWYgKGNvbm5GZCA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIGNvbm5lY3Rpb24sIHJlZ2lzdGVyIGR5bmFtaWMgYWNjZWwgc2Vuc29yIik7CisgICAgICAgIG1EYWVtb24tPm9uQ29ubmVjdGlvbkNoYW5nZShtRGV2aWNlLCB0cnVlKTsKKworICAgICAgICB3YWl0Rm9yRGlzY29ubmVjdGlvbihjb25uRmQpOworICAgICAgICBBTE9HVigiQ29ubmVjdGlvbiBicmVhaywgdW5yZWdpc3RlciBkeW5hbWljIGFjY2VsIHNlbnNvciIpOworICAgICAgICBtRGFlbW9uLT5vbkNvbm5lY3Rpb25DaGFuZ2UobURldmljZSwgZmFsc2UpOworICAgIH0KKyAgICBtRGFlbW9uLT5vbkNvbm5lY3Rpb25DaGFuZ2UobURldmljZSwgZmFsc2UpOworICAgIEFMT0dEKCJTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IgdGhyZWFkIGV4aXRlZCIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gRmlsZUNvbm5lY3Rpb25EZXRlY3RvciBmdW5jdGlvbnMKK0ZpbGVDb25uZWN0aW9uRGV0ZWN0b3I6OkZpbGVDb25uZWN0aW9uRGV0ZWN0b3IgKAorICAgICAgICBCYXNlRHluYW1pY1NlbnNvckRhZW1vbiAqZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWdleCkKKyAgICAgICAgICAgIDogQ29ubmVjdGlvbkRldGVjdG9yKGQpLCBUaHJlYWQoZmFsc2UgLypjYWxsQ2FsbEphdmEqLyksIG1QYXRoKHBhdGgpLCBtUmVnZXgocmVnZXgpLAorICAgICAgICAgICAgICBtTG9vcGVyKG5ldyBMb29wZXIodHJ1ZSAvKmFsbG93Tm9uQ2FsbGJhY2sqLykpLCBtSW5vdGlmeUZkKC0xKSB7CisgICAgaWYgKG1Mb29wZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUlub3RpZnlGZCA9IDo6aW5vdGlmeV9pbml0MShJTl9OT05CTE9DSyk7CisgICAgaWYgKG1Jbm90aWZ5RmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgaW5pdCBpbm90aWZ5Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgd2QgPSA6Omlub3RpZnlfYWRkX3dhdGNoKG1Jbm90aWZ5RmQsIHBhdGguY19zdHIoKSwgSU5fQ1JFQVRFIHwgSU5fREVMRVRFKTsKKyAgICBpZiAod2QgPCAwIHx8ICFtTG9vcGVyLT5hZGRGZChtSW5vdGlmeUZkLCBQT0xMX0lERU5ULCBMb29wZXI6OkVWRU5UX0lOUFVULCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgICA6OmNsb3NlKG1Jbm90aWZ5RmQpOworICAgICAgICBtSW5vdGlmeUZkID0gLTE7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0dXAgd2F0Y2ggb24gZGlyICVzIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIG1Mb29wZXIgIT0gbnVsbCAmJiBtSW5vdGlmeUZkIGFkZGVkIHRvIGxvb3BlcgorICAgIHJ1bigiZGRhZF9maWxlIik7Cit9CisKK0ZpbGVDb25uZWN0aW9uRGV0ZWN0b3I6On5GaWxlQ29ubmVjdGlvbkRldGVjdG9yKCkgeworICAgIGlmIChtSW5vdGlmeUZkID4gMCkgeworICAgICAgICByZXF1ZXN0RXhpdCgpOworICAgICAgICBtTG9vcGVyLT53YWtlKCk7CisgICAgICAgIGpvaW4oKTsKKyAgICAgICAgOjpjbG9zZShtSW5vdGlmeUZkKTsKKyAgICB9Cit9CisKK2Jvb2wgRmlsZUNvbm5lY3Rpb25EZXRlY3Rvcjo6bWF0Y2hlcyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnJlZ2V4X21hdGNoKG5hbWUsIG1SZWdleCk7Cit9CisKK3N0ZDo6c3RyaW5nIEZpbGVDb25uZWN0aW9uRGV0ZWN0b3I6OmdldEZ1bGxOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBhdGggKyBuYW1lOworfQorCit2b2lkIEZpbGVDb25uZWN0aW9uRGV0ZWN0b3I6OnByb2Nlc3NFeGlzdGluZ0ZpbGVzKCkgY29uc3QgeworICAgIGF1dG8gZGlycCA9IDo6b3BlbmRpcihtUGF0aC5jX3N0cigpKTsKKyAgICBzdHJ1Y3QgZGlyZW50ICpkcDsKKyAgICB3aGlsZSAoKGRwID0gOjpyZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUoZHAtPmRfbmFtZSk7CisgICAgICAgIGlmIChtYXRjaGVzKG5hbWUpKSB7CisgICAgICAgICAgICBtRGFlbW9uLT5vbkNvbm5lY3Rpb25DaGFuZ2UoZ2V0RnVsbE5hbWUobmFtZSksIHRydWUgLypjb25uZWN0ZWQqLyk7CisgICAgICAgIH0KKyAgICB9CisgICAgOjpjbG9zZWRpcihkaXJwKTsKK30KKwordm9pZCBGaWxlQ29ubmVjdGlvbkRldGVjdG9yOjpoYW5kbGVJbm90aWZ5RGF0YShzc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqZGF0YSkgeworICAgIGNvbnN0IGNoYXIgKmRhdGFFbmQgPSBkYXRhICsgbGVuOworICAgIGNvbnN0IHN0cnVjdCBpbm90aWZ5X2V2ZW50ICpldjsKKworICAgIC8vIGlub3RpZnkgYWRkcyBwYWRkaW5ncyB0byBndWFyYW50ZWUgdGhlIG5leHQgcmVhZCBpcyBhbGlnbmVkCisgICAgZm9yICg7IGRhdGEgPCBkYXRhRW5kOyBkYXRhICs9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkgKyBldi0+bGVuKSB7CisgICAgICAgIGV2ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3QgaW5vdGlmeV9ldmVudCo+KGRhdGEpOworICAgICAgICBpZiAoZXYtPm1hc2sgJiBJTl9JU0RJUikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lKGV2LT5uYW1lKTsKKyAgICAgICAgaWYgKG1hdGNoZXMobmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChldi0+bWFzayAmIElOX0NSRUFURSkgeworICAgICAgICAgICAgICAgIG1EYWVtb24tPm9uQ29ubmVjdGlvbkNoYW5nZShnZXRGdWxsTmFtZShuYW1lKSwgdHJ1ZSAvKmNvbm5lY3RlZCovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChldi0+bWFzayAmIElOX0RFTEVURSkgeworICAgICAgICAgICAgICAgIG1EYWVtb24tPm9uQ29ubmVjdGlvbkNoYW5nZShnZXRGdWxsTmFtZShuYW1lKSwgZmFsc2UgLypjb25uZWN0ZWQqLyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgRmlsZUNvbm5lY3Rpb25EZXRlY3Rvcjo6cmVhZElub3RpZnlEYXRhKCkgeworICAgIHN0cnVjdCB7CisgICAgICAgIHN0cnVjdCBpbm90aWZ5X2V2ZW50IGV2OworICAgICAgICBjaGFyIHBhZGRpbmdbTkFNRV9NQVggKyAxXTsKKyAgICB9IGJ1ZmZlcjsKKworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzc2l6ZV90IGxlbiA9IDo6cmVhZChtSW5vdGlmeUZkLCAmYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgIGlmIChsZW4gPT0gLTEgJiYgZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgICAvLyBubyBtb3JlIGRhdGEKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IHN0YXRpY19jYXN0PHNzaXplX3Q+KHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkpKSB7CisgICAgICAgICAgICBoYW5kbGVJbm90aWZ5RGF0YShsZW4sIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZidWZmZXIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCBlcnJvcjogJXMiLCA6OnN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gMCA8PSBsZW4gPD0gc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KQorICAgICAgICAgICAgQUxPR0UoInJlYWQgcmV0dXJuICV6ZCwgc2hvcnRlciB0aGFuIGlub3RpZnlfZXZlbnQgc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgICAgbGVuLCBzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpKTsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBGaWxlQ29ubmVjdGlvbkRldGVjdG9yOjp0aHJlYWRMb29wKCkgeworICAgIExvb3Blcjo6c2V0Rm9yVGhyZWFkKG1Mb29wZXIpOworICAgIHByb2Nlc3NFeGlzdGluZ0ZpbGVzKCk7CisgICAgd2hpbGUoIVRocmVhZDo6ZXhpdFBlbmRpbmcoKSkgeworICAgICAgICBpbnQgcmV0ID0gbUxvb3Blci0+cG9sbE9uY2UoLTEpOworCisgICAgICAgIGlmIChyZXQgIT0gTG9vcGVyOjpQT0xMX1dBS0UgJiYgcmV0ICE9IFBPTExfSURFTlQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIHZhbHVlICVkIGZyb20gcG9sbE9uY2UsIHF1aXQiLCByZXQpOworICAgICAgICAgICAgcmVxdWVzdEV4aXQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCA9PSBQT0xMX0lERU5UKSB7CisgICAgICAgICAgICBpZiAoIXJlYWRJbm90aWZ5RGF0YSgpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdEV4aXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1Mb29wZXItPnJlbW92ZUZkKG1Jbm90aWZ5RmQpOworICAgIEFMT0dEKCJGaWxlQ29ubmVjdGlvbkRldGVjdGlvbiB0aHJlYWQgZXhpdGVkIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9Db25uZWN0aW9uRGV0ZWN0b3IuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9Db25uZWN0aW9uRGV0ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWUxZGYyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Nvbm5lY3Rpb25EZXRlY3Rvci5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9DT05ORUNUSU9OX0RFVEVDVE9SX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0NPTk5FQ1RJT05fREVURUNUT1JfSAorCisjaW5jbHVkZSAiQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uaCIKKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb29wZXIuaD4KKworI2luY2x1ZGUgPHJlZ2V4PgorCisjaW5jbHVkZSA8cG9sbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworLy8gQWJzdHJhY3Rpb24gb2YgY29ubmVjdGlvbiBkZXRlY3RvcjogYW4gZW50aXR5IHRoYXQgY2FsbHMKKy8vIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uOjpvbkNvbm5lY3Rpb25DaGFuZ2UoKSB3aGVuIG5lY2Vzc2FyeS4KK2NsYXNzIENvbm5lY3Rpb25EZXRlY3RvciA6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIENvbm5lY3Rpb25EZXRlY3RvcihCYXNlRHluYW1pY1NlbnNvckRhZW1vbiAqZCkgOiBtRGFlbW9uKGQpIHsgfQorICAgIHZpcnR1YWwgfkNvbm5lY3Rpb25EZXRlY3RvcigpID0gZGVmYXVsdDsKK3Byb3RlY3RlZDoKKyAgICBCYXNlRHluYW1pY1NlbnNvckRhZW1vbiogbURhZW1vbjsKK307CisKKy8vIE9wZW4gYSBzb2NrZXQgdGhhdCBsaXN0ZW4gdG8gbG9jYWxob3N0OnBvcnQgYW5kIG5vdGlmeSBzZW5zb3IgZGFlbW9uIG9mIGNvbm5lY3Rpb24gYW5kCisvLyBkaXNjb25uZWN0aW9uIGV2ZW50IHdoZW4gc29ja2V0IGlzIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQsIHJlc3BlY3RpdmVseS4gT25seSBvbmUgY29uY3VycmVudAorLy8gY2xpZW50IGlzIGFjY2VwdGVkLgorY2xhc3MgU29ja2V0Q29ubmVjdGlvbkRldGVjdG9yIDogcHVibGljIENvbm5lY3Rpb25EZXRlY3RvciwgcHVibGljIFRocmVhZCB7CitwdWJsaWM6CisgICAgU29ja2V0Q29ubmVjdGlvbkRldGVjdG9yKEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uICpkLCBpbnQgcG9ydCk7CisgICAgdmlydHVhbCB+U29ja2V0Q29ubmVjdGlvbkRldGVjdG9yKCk7Citwcml2YXRlOgorICAgIC8vIGltcGxlbWVudCB2aXJ0dWFsIG9mIFRocmVhZAorICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CisgICAgaW50IHdhaXRGb3JDb25uZWN0aW9uKCk7CisgICAgc3RhdGljIHZvaWQgd2FpdEZvckRpc2Nvbm5lY3Rpb24oaW50IGNvbm5GZCk7CisKKyAgICBpbnQgbUxpc3RlbkZkOworICAgIHN0ZDo6c3RyaW5nIG1EZXZpY2U7Cit9OworCisvLyBEZXRlY3QgZmlsZSBjaGFuZ2UgdW5kZXIgcGF0aCBhbmQgbm90aWZ5IHNlbnNvciBkYWVtb24gb2YgY29ubmVjdGlvbiBhbmQgZGlzY29ubmVjdGlvbiBldmVudCB3aGVuCisvLyBmaWxlIGlzIGNyZWF0ZWQgaW4gb3IgcmVtb3ZlZCBmcm9tIHRoZSBkaXJlY3RvcnksIHJlc3BlY3RpdmVseS4KK2NsYXNzIEZpbGVDb25uZWN0aW9uRGV0ZWN0b3IgOiBwdWJsaWMgQ29ubmVjdGlvbkRldGVjdG9yLCBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBGaWxlQ29ubmVjdGlvbkRldGVjdG9yKAorICAgICAgICAgICAgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24gKmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVnZXgpOworICAgIHZpcnR1YWwgfkZpbGVDb25uZWN0aW9uRGV0ZWN0b3IoKTsKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgUE9MTF9JREVOVCA9IDE7CisgICAgLy8gaW1wbGVtZW50IHZpcnR1YWwgb2YgVGhyZWFkCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKKworICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3Q7CisgICAgdm9pZCBwcm9jZXNzRXhpc3RpbmdGaWxlcygpIGNvbnN0OworICAgIHZvaWQgaGFuZGxlSW5vdGlmeURhdGEoc3NpemVfdCBsZW4sIGNvbnN0IGNoYXIgKmRhdGEpOworICAgIGJvb2wgcmVhZElub3RpZnlEYXRhKCk7CisgICAgc3RkOjpzdHJpbmcgZ2V0RnVsbE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSkgY29uc3Q7CisKKyAgICBzdGQ6OnN0cmluZyBtUGF0aDsKKyAgICBzdGQ6OnJlZ2V4IG1SZWdleDsKKyAgICBzcDxMb29wZXI+IG1Mb29wZXI7CisgICAgaW50IG1Jbm90aWZ5RmQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9EWU5BTUlDX1NFTlNPUl9EQUVNT05fSApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R1bW15RHluYW1pY0FjY2VsRGFlbW9uLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EdW1teUR5bmFtaWNBY2NlbERhZW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhNDdlOAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EdW1teUR5bmFtaWNBY2NlbERhZW1vbi5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQmFzZVNlbnNvck9iamVjdC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb25EZXRlY3Rvci5oIgorI2luY2x1ZGUgIkR1bW15RHluYW1pY0FjY2VsRGFlbW9uLmgiCisjaW5jbHVkZSAiRHluYW1pY1NlbnNvck1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4gICAgICAgICAgICAvL3N0ZDo6bWF4CisKKyNkZWZpbmUgU1lTUFJPUF9QUkVGSVggICAgICAgICAgICAgICAgICAiZHluYW1pY19zZW5zb3IuZHVtbXkiCisjZGVmaW5lIEZJTEVfTkFNRV9CQVNFICAgICAgICAgICAgICAgICAgImR1bW15X2FjY2VsX2ZpbGUiCisjZGVmaW5lIEZJTEVfTkFNRV9SRUdFWCAgICAgICAgICAgICAgICAgKCJeIiBGSUxFX05BTUVfQkFTRSAiWzAtOV0kIikKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK0R1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teUR5bmFtaWNBY2NlbERhZW1vbihEeW5hbWljU2Vuc29yTWFuYWdlciYgbWFuYWdlcikKKyAgICAgICAgOiBCYXNlRHluYW1pY1NlbnNvckRhZW1vbihtYW5hZ2VyKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVgrMV07CisKKyAgICBwcm9wZXJ0eV9nZXQoU1lTUFJPUF9QUkVGSVggIi5maWxlIiwgcHJvcGVydHksICIiKTsKKyAgICBpZiAoc3RyY21wKHByb3BlcnR5LCAiIikgIT0gMCkgeworICAgICAgICBtRmlsZURldGVjdG9yID0gbmV3IEZpbGVDb25uZWN0aW9uRGV0ZWN0b3IoCisgICAgICAgICAgICAgICAgdGhpcywgc3RkOjpzdHJpbmcocHJvcGVydHkpLCBzdGQ6OnN0cmluZyhGSUxFX05BTUVfUkVHRVgpKTsKKyAgICB9CisKKyAgICBwcm9wZXJ0eV9nZXQoU1lTUFJPUF9QUkVGSVggIi5zb2NrZXQiLCBwcm9wZXJ0eSwgIiIpOworICAgIGlmIChzdHJjbXAocHJvcGVydHksICIiKSAhPSAwKSB7CisgICAgICAgIG1Tb2NrZXREZXRlY3RvciA9IG5ldyBTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IodGhpcywgYXRvaShwcm9wZXJ0eSkpOworICAgIH0KK30KKworQmFzZVNlbnNvclZlY3RvciBEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6Y3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpIHsKKyAgICBCYXNlU2Vuc29yVmVjdG9yIHJldDsKKyAgICBpZiAoZGV2aWNlS2V5LmNvbXBhcmUoMCwgMSwgIi8iKSA9PSAwKSB7CisgICAgICAgIC8vIGZpbGUgZGV0ZWN0b3IgcmVzdWx0LCBkZXZpY2VLZXkgaXMgZmlsZSBhYnNvbHV0ZSBwYXRoCisgICAgICAgIGNvbnN0IHNpemVfdCBsZW4gPSA6OnN0cmxlbihGSUxFX05BTUVfQkFTRSkgKyAxOyAvLyArMSBmb3IgbnVtYmVyCisgICAgICAgIGlmIChkZXZpY2VLZXkubGVuZ3RoKCkgPCBsZW4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbGxlZ2FsIGZpbGUgZGV2aWNlIGtleSAlcyIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBzdGFydCA9IGRldmljZUtleS5sZW5ndGgoKSAtIGxlbjsKKyAgICAgICAgICAgIHJldC5lbXBsYWNlX2JhY2sobmV3IER1bW15U2Vuc29yKGRldmljZUtleS5zdWJzdHIoc3RhcnQpKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRldmljZUtleS5jb21wYXJlKDAsIDo6c3RybGVuKCJzb2NrZXQ6IiksICJzb2NrZXQ6IikgPT0gMCkgeworICAgICAgICByZXQuZW1wbGFjZV9iYWNrKG5ldyBEdW1teVNlbnNvcihkZXZpY2VLZXkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB1bmtub3duIGRldmljZUtleQorICAgICAgICBBTE9HRSgidW5rbm93biBkZXZpY2VLZXk6ICVzIiwgZGV2aWNlS2V5LmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6RHVtbXlTZW5zb3I6OkR1bW15U2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgICAgICA6IFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLCBtUnVuU3RhdGUoZmFsc2UpIHsKKyAgICBtU2Vuc29yTmFtZSA9ICJEdW1teSBBY2NlbCAtICIgKyBuYW1lOworICAgIC8vIGZha2Ugc2Vuc29yIGluZm9ybWF0aW9uIGZvciBkdW1teSBzZW5zb3IKKyAgICBtU2Vuc29yID0gKHN0cnVjdCBzZW5zb3JfdCkgeworICAgICAgICBtU2Vuc29yTmFtZS5jX3N0cigpLAorICAgICAgICAiRGVtb1NlbnNlLCBJbmMuIiwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24KKyAgICAgICAgLTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSwgZHVtbXkgbnVtYmVyIGhlcmUKKyAgICAgICAgU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiwKKyAgICAgICAgOS44ICogOC4wZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heFJhbmdlCisgICAgICAgIDkuOCAqIDguMGYgLyAzMjc2OC4wZiwgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHV0aW9uCisgICAgICAgIDAuNWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3dlcgorICAgICAgICAoaW50MzJfdCkoMS4wRTZmIC8gNTApLCAgICAgICAgICAgICAgICAgICAgLy8gbWluRGVsYXkKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpZm9SZXNlcnZlZEV2ZW50Q291bnQKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpZm9NYXhFdmVudENvdW50CisgICAgICAgIFNFTlNPUl9TVFJJTkdfVFlQRV9BQ0NFTEVST01FVEVSLAorICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWRQZXJtaXNzaW9uCisgICAgICAgIChsb25nKSgxLjBFNmYgLyA1MCksICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEZWxheQorICAgICAgICBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREUsCisgICAgICAgIHsgTlVMTCwgTlVMTCB9CisgICAgfTsKKyAgICBtUnVuTG9jay5sb2NrKCk7CisgICAgcnVuKCJEdW1teVNlbnNvciIpOworfQorCitEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6RHVtbXlTZW5zb3I6On5EdW1teVNlbnNvcigpIHsKKyAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAvLyB1bmxvY2sgbVJ1bkxvY2sgc28gdGhyZWFkIGNhbiBiZSB1bmJsb2NrZWQKKyAgICBtUnVuTG9jay51bmxvY2soKTsKK30KKworY29uc3Qgc2Vuc29yX3QqIER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6Z2V0U2Vuc29yKCkgY29uc3QgeworICAgIHJldHVybiAmbVNlbnNvcjsKK30KKwordm9pZCBEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6RHVtbXlTZW5zb3I6OmdldFV1aWQodWludDhfdCogdXVpZCkgY29uc3QgeworICAgIC8vIGF0IG1heGltdW0sIHRoZXJlIHdpbGwgYmUgYWx3YXlzIG9uZSBpbnN0YW5jZSwgc28gd2UgY2FuIGhhcmRjb2RlCisgICAgc2l6ZV90IGhhc2ggPSBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+KCkobVNlbnNvck5hbWUpOworICAgIG1lbXNldCh1dWlkLCAneCcsIDE2KTsKKyAgICBtZW1jcHkodXVpZCwgJmhhc2gsIHNpemVvZihoYXNoKSk7Cit9CisKK2ludCBEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6RHVtbXlTZW5zb3I6OmVuYWJsZShib29sIGVuYWJsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsayhtTG9jayk7CisgICAgaWYgKG1SdW5TdGF0ZSAhPSBlbmFibGUpIHsKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgbVJ1bkxvY2sudW5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUnVuTG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgbVJ1blN0YXRlID0gZW5hYmxlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6YmF0Y2goaW50NjRfdCAvKnNhbXBsZVBlcmlvZCovLCBpbnQ2NF90IC8qYmF0Y2hQZXJpb2QqLykgeworICAgIC8vIER1bW15IHNlbnNvciBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nIHJhdGUgYW5kIGJhdGNoaW5nLiBCdXQgcmV0dXJuIHN1Y2Nlc3NmdWwgYW55d2F5LgorICAgIHJldHVybiAwOworfQorCit2b2lkIER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6d2FpdFVudGlsTmV4dFNhbXBsZSgpIHsKKyAgICAvLyBibG9jayB3aGVuIGRpc2FibGVkIChtUnVuTG9jayBsb2NrZWQpCisgICAgbVJ1bkxvY2subG9jaygpOworICAgIG1SdW5Mb2NrLnVubG9jaygpOworCisgICAgaWYgKCFUaHJlYWQ6OmV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgLy8gc2xlZXAgMjAgbXMgKDUwSHopCisgICAgICAgIHVzbGVlcCgyMDAwMCk7CisgICAgfQorfQorCitib29sIER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6dGhyZWFkTG9vcCgpIHsKKyAgICAvLyBkZXNpZ25hdGVkIGludGlhbGl6YXRpb24gd2lsbCBsZWF2ZSB0aGUgdW5zcGVjaWZpZWQgZmllbGRzIHplcm9lZAorICAgIHNlbnNvcnNfZXZlbnRfdCBldmVudCA9IHsKKyAgICAgICAgLnZlcnNpb24gPSBzaXplb2YoZXZlbnQpLAorICAgICAgICAuc2Vuc29yID0gLTEsCisgICAgICAgIC50eXBlID0gU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiwKKyAgICB9OworCisgICAgaW50NjRfdCBzdGFydFRpbWVOcyA9IGVsYXBzZWRSZWFsdGltZU5hbm8oKTsKKworICAgIEFMT0dJKCJEeW5hbWljIER1bW15IEFjY2VsIHN0YXJ0ZWQgZm9yIHNlbnNvciAlcyIsIG1TZW5zb3JOYW1lLmNfc3RyKCkpOworICAgIHdoaWxlICghVGhyZWFkOjpleGl0UGVuZGluZygpKSB7CisgICAgICAgIHdhaXRVbnRpbE5leHRTYW1wbGUoKTsKKworICAgICAgICBpZiAoVGhyZWFkOjpleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IG5vd1RpbWVOcyA9IGVsYXBzZWRSZWFsdGltZU5hbm8oKTsKKyAgICAgICAgZmxvYXQgdCA9IChub3dUaW1lTnMgLSBzdGFydFRpbWVOcykgLyAxZTlmOworCisgICAgICAgIGV2ZW50LmRhdGFbMF0gPSAyICogOjpzaW4oMyAqIE1fUEkgKiB0KTsKKyAgICAgICAgZXZlbnQuZGF0YVsxXSA9IDMgKiA6OmNvcygzICogTV9QSSAqIHQpOworICAgICAgICBldmVudC5kYXRhWzJdID0gMS41ICogOjpzaW4oNiAqIE1fUEkgKiB0KTsKKyAgICAgICAgZXZlbnQudGltZXN0YW1wID0gbm93VGltZU5zOworICAgICAgICBnZW5lcmF0ZUV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBBTE9HSSgiRHluYW1pYyBEdW1teSBBY2NlbCB0aHJlYWQgZW5kZWQgZm9yIHNlbnNvciAlcyIsIG1TZW5zb3JOYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EdW1teUR5bmFtaWNBY2NlbERhZW1vbi5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R1bW15RHluYW1pY0FjY2VsRGFlbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhNTczMAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EdW1teUR5bmFtaWNBY2NlbERhZW1vbi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9EVU1NWV9EWU5BTUlDX0FDQ0VMX0RBRU1PTl9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9EVU1NWV9EWU5BTUlDX0FDQ0VMX0RBRU1PTl9ICisKKyNpbmNsdWRlICJCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oIgorI2luY2x1ZGUgIkJhc2VTZW5zb3JPYmplY3QuaCIKKworI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgQ29ubmVjdGlvbkRldGVjdG9yOworCisvKioKKyAqIFRoaXMgZGFlbW9uIHNpbXVsYXRlcyBkeW5hbWljIHNlbnNvciBjb25uZWN0aW9uIHdpdGhvdXQgdGhlIG5lZWQgb2YgYWN0dWFsbHkgY29ubmVjdCBwZXJpcGhlcmFsCisgKiB0byBBbmRyb2lkLiBJdCBpcyBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nLiBJdCBjYW4gaGFuZGxlIG9uZSBjb25jdXJyZW50IGNvbm5lY3Rpb25zIGF0IG1heGltdW0uCisgKi8KK2NsYXNzIER1bW15RHluYW1pY0FjY2VsRGFlbW9uIDogcHVibGljIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uIHsKK3B1YmxpYzoKKyAgICBEdW1teUR5bmFtaWNBY2NlbERhZW1vbihEeW5hbWljU2Vuc29yTWFuYWdlciYgbWFuYWdlcik7CisgICAgdmlydHVhbCB+RHVtbXlEeW5hbWljQWNjZWxEYWVtb24oKSA9IGRlZmF1bHQ7Citwcml2YXRlOgorICAgIGNsYXNzIER1bW15U2Vuc29yIDogcHVibGljIEJhc2VTZW5zb3JPYmplY3QsIHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKyAgICAgICAgRHVtbXlTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgICAgICB+RHVtbXlTZW5zb3IoKTsKKyAgICAgICAgdmlydHVhbCBjb25zdCBzZW5zb3JfdCogZ2V0U2Vuc29yKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgdm9pZCBnZXRVdWlkKHVpbnQ4X3QqIHV1aWQpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGludCBlbmFibGUoYm9vbCBlbmFibGUpOworICAgICAgICB2aXJ0dWFsIGludCBiYXRjaChuc2Vjc190IHNhbXBsZV9wZXJpb2QsIG5zZWNzX3QgYmF0Y2hfcGVyaW9kKTsKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBpbXBsZW1lbnQgVGhyZWFkIGZ1bmN0aW9uCisgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCB3YWl0VW50aWxOZXh0U2FtcGxlKCk7CisKKyAgICAgICAgc2Vuc29yX3QgbVNlbnNvcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbVNlbnNvck5hbWU7CisKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjptdXRleCBtUnVuTG9jazsKKyAgICAgICAgYm9vbCBtUnVuU3RhdGU7CisgICAgfTsKKyAgICAvLyBpbXBsZW1lbnQgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24gZnVuY3Rpb24KKyAgICB2aXJ0dWFsIEJhc2VTZW5zb3JWZWN0b3IgY3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpIG92ZXJyaWRlOworCisgICAgc3A8Q29ubmVjdGlvbkRldGVjdG9yPiBtRmlsZURldGVjdG9yOworICAgIHNwPENvbm5lY3Rpb25EZXRlY3Rvcj4gbVNvY2tldERldGVjdG9yOworfTsKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0RZTkFNSUNfU0VOU09SX0RBRU1PTl9ICisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EeW5hbWljU2Vuc29yTWFuYWdlci5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvRHluYW1pY1NlbnNvck1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzQwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvRHluYW1pY1NlbnNvck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJhc2VEeW5hbWljU2Vuc29yRGFlbW9uLmgiCisjaW5jbHVkZSAiQmFzZVNlbnNvck9iamVjdC5oIgorI2luY2x1ZGUgIkR1bW15RHluYW1pY0FjY2VsRGFlbW9uLmgiCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yRGFlbW9uLmgiCisjaW5jbHVkZSAiRHluYW1pY1NlbnNvck1hbmFnZXIuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworRHluYW1pY1NlbnNvck1hbmFnZXIqIER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpjcmVhdGVJbnN0YW5jZSgKKyAgICAgICAgaW50IGhhbmRsZUJhc2UsIGludCBoYW5kbGVDb3VudCwgU2Vuc29yRXZlbnRDYWxsYmFjayAqY2FsbGJhY2spIHsKKyAgICBhdXRvIG0gPSBuZXcgRHluYW1pY1NlbnNvck1hbmFnZXIoaGFuZGxlQmFzZSwgaGFuZGxlQmFzZSArIGhhbmRsZUNvdW50IC0gMSwgY2FsbGJhY2spOworICAgIG0tPm1EYWVtb25WZWN0b3IucHVzaF9iYWNrKG5ldyBEdW1teUR5bmFtaWNBY2NlbERhZW1vbigqbSkpOworICAgIG0tPm1EYWVtb25WZWN0b3IucHVzaF9iYWNrKG5ldyBIaWRSYXdTZW5zb3JEYWVtb24oKm0pKTsKKyAgICByZXR1cm4gbTsKK30KKworRHluYW1pY1NlbnNvck1hbmFnZXI6OkR5bmFtaWNTZW5zb3JNYW5hZ2VyKAorICAgICAgICBpbnQgaGFuZGxlQmFzZSwgaW50IGhhbmRsZU1heCwgU2Vuc29yRXZlbnRDYWxsYmFjayogY2FsbGJhY2spIDoKKyAgICAgICAgbUhhbmRsZVJhbmdlKGhhbmRsZUJhc2UsIGhhbmRsZU1heCksCisgICAgICAgIG1DYWxsYmFjayhjYWxsYmFjayksCisgICAgICAgIG1GaWZvKGNhbGxiYWNrID8gMCA6IGtGaWZvU2l6ZSksCisgICAgICAgIG1OZXh0SGFuZGxlKGhhbmRsZUJhc2UrMSkgeworICAgIGFzc2VydChoYW5kbGVCYXNlID4gMCAmJiBoYW5kbGVNYXggPiBoYW5kbGVCYXNlICsgMSk7IC8vIGhhbmRsZUJhc2UgaXMgcmVzZXJ2ZWQKKworICAgIG1NZXRhU2Vuc29yID0gKGNvbnN0IHNlbnNvcl90KSB7CisgICAgICAgICJEeW5hbWljIFNlbnNvciBNYW5hZ2VyIiwKKyAgICAgICAgIkdvb2dsZSIsCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbgorICAgICAgICBoYW5kbGVCYXNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZQorICAgICAgICBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBLAorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heFJhbmdlCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x1dGlvbgorICAgICAgICAxZS02ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvd2VyLCB2ZXJ5IHNtYWxsIG51bWJlciBpbnN0ZWFkIG9mIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBzaWd1bGFyaXR5IGluIGFwcAorICAgICAgICAoaW50MzJfdCkoMTAwMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbkRlbGF5CisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlmb1Jlc2VydmVkRXZlbnRDb3VudAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpZm9NYXhFdmVudENvdW50CisgICAgICAgIFNFTlNPUl9TVFJJTkdfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBLAorICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVkUGVybWlzc2lvbgorICAgICAgICAobG9uZykoMTAwMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heERlbGF5CisgICAgICAgIFNFTlNPUl9GTEFHX1NQRUNJQUxfUkVQT1JUSU5HX01PREUgfCBTRU5TT1JfRkxBR19XQUtFX1VQLAorICAgICAgICB7IE5VTEwsIE5VTEwgfQorICAgIH07Cit9CisKK0R5bmFtaWNTZW5zb3JNYW5hZ2VyOjp+RHluYW1pY1NlbnNvck1hbmFnZXIoKSB7CisgICAgLy8gZnJlZSBhbGwgZGFlbW9ucyBmaXJzdAorICAgIG1EYWVtb25WZWN0b3IuY2xlYXIoKTsKK30KKworYm9vbCBEeW5hbWljU2Vuc29yTWFuYWdlcjo6b3ducyhpbnQgaGFuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhbmRsZSA+PSBtSGFuZGxlUmFuZ2UuZmlyc3QgJiYgaGFuZGxlIDwgbUhhbmRsZVJhbmdlLnNlY29uZDsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjphY3RpdmF0ZShpbnQgaGFuZGxlLCBib29sIGVuYWJsZSkgeworICAgIGlmIChoYW5kbGUgPT0gbUhhbmRsZVJhbmdlLmZpcnN0KSB7CisgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gaW4gY2FzZSB0aGVyZSBpcyBhIHBlbmRpbmcgcmVwb3J0LCBub3cgaXQgaXMgdGltZSB0byByZW1vdmUgaXQgYXMgaXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsayhtTG9jayk7CisgICAgICAgIG1QZW5kaW5nUmVwb3J0LmVyYXNlKGhhbmRsZSk7CisgICAgfQorCisgICAgcmV0dXJuIG9wZXJhdGVTZW5zb3IoaGFuZGxlLAorICAgICAgICAgICAgWyZlbmFibGVdIChzcDxCYXNlU2Vuc29yT2JqZWN0PiBzKS0+aW50IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcy0+ZW5hYmxlKGVuYWJsZSk7CisgICAgICAgICAgICB9KTsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpiYXRjaChpbnQgaGFuZGxlLCBuc2Vjc190IHNhbXBsZV9wZXJpb2QsIG5zZWNzX3QgYmF0Y2hfcGVyaW9kKSB7CisgICAgaWYgKGhhbmRsZSA9PSBtSGFuZGxlUmFuZ2UuZmlyc3QpIHsKKyAgICAgICAgLy8gaWdub3JlZAorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG9wZXJhdGVTZW5zb3IoaGFuZGxlLAorICAgICAgICAgICAgWyZzYW1wbGVfcGVyaW9kLCAmYmF0Y2hfcGVyaW9kXSAoc3A8QmFzZVNlbnNvck9iamVjdD4gcyktPmludCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHMtPmJhdGNoKHNhbXBsZV9wZXJpb2QsIGJhdGNoX3BlcmlvZCk7CisgICAgICAgICAgICB9KTsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpzZXREZWxheShpbnQgaGFuZGxlLCBuc2Vjc190IHNhbXBsZV9wZXJpb2QpIHsKKyAgICByZXR1cm4gYmF0Y2goaGFuZGxlLCBzYW1wbGVfcGVyaW9kLCAwKTsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpmbHVzaChpbnQgaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZSA9PSBtSGFuZGxlUmFuZ2UuZmlyc3QpIHsKKyAgICAgICAgLy8gc3VibWl0IGEgZmx1c2ggY29tcGxldGUgaGVyZQorICAgICAgICBzdGF0aWMgY29uc3Qgc2Vuc29yc19ldmVudF90IGV2ZW50ID0geworICAgICAgICAgICAgLnR5cGUgPSBTRU5TT1JfVFlQRV9NRVRBX0RBVEEsCisgICAgICAgICAgICAuc2Vuc29yID0gbUhhbmRsZVJhbmdlLmZpcnN0LAorICAgICAgICAgICAgLnRpbWVzdGFtcCA9IFRJTUVTVEFNUF9BVVRPX0ZJTEwsICAvLyB0aW1lc3RhbXAgd2lsbCBiZSBmaWxsZWQgYXQgZGlzcGF0Y2hlcgorICAgICAgICB9OworICAgICAgICBzdWJtaXRFdmVudChudWxscHRyLCBldmVudCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gb3BlcmF0ZVNlbnNvcihoYW5kbGUsIFtdIChzcDxCYXNlU2Vuc29yT2JqZWN0PiBzKS0+aW50IHtyZXR1cm4gcy0+Zmx1c2goKTt9KTsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpwb2xsKHNlbnNvcnNfZXZlbnRfdCAqIGRhdGEsIGludCBjb3VudCkgeworICAgIGFzc2VydChtQ2FsbGJhY2sgPT0gbnVsbHB0cik7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1GaWZvTG9jayk7CisgICAgcmV0dXJuIG1GaWZvLnJlYWQoZGF0YSwgY291bnQpOworfQorCitib29sIER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpyZWdpc3RlclNlbnNvcihzcDxCYXNlU2Vuc29yT2JqZWN0PiBzZW5zb3IpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGsobUxvY2spOworICAgIGlmIChtUmV2ZXJzZU1hcC5maW5kKHNlbnNvci5nZXQoKSkgIT0gbVJldmVyc2VNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoInRyeWluZyB0byBhZGQgdGhlIHNhbWUgc2Vuc29yIHR3aWNlLCBpZ25vcmUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgaGFuZGxlID0gZ2V0TmV4dEF2YWlsYWJsZUhhbmRsZSgpOworICAgIGlmIChoYW5kbGUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJSdW5uaW5nIG91dCBvZiBoYW5kbGUsIHF1aXQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyB0aGVzZSBlbXBsYWNlIHdpbGwgYWx3YXlzIGJlIHN1Y2Nlc3NmdWwKKyAgICBtTWFwLmVtcGxhY2UoaGFuZGxlLCBzZW5zb3IpOworICAgIG1SZXZlcnNlTWFwLmVtcGxhY2Uoc2Vuc29yLmdldCgpLCBoYW5kbGUpOworICAgIHNlbnNvci0+c2V0RXZlbnRDYWxsYmFjayh0aGlzKTsKKworICAgIGF1dG8gZW50cnkgPSBtUGVuZGluZ1JlcG9ydC5lbXBsYWNlKAorICAgICAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGhhbmRsZSksCisgICAgICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoaGFuZGxlLCBzZW5zb3IpKTsKKyAgICBpZiAoZW50cnkuc2Vjb25kKSB7CisgICAgICAgIHN1Ym1pdEV2ZW50KG51bGxwdHIsIGVudHJ5LmZpcnN0LT5zZWNvbmQuZ2VuZXJhdGVDb25uZWN0aW9uRXZlbnQobUhhbmRsZVJhbmdlLmZpcnN0KSk7CisgICAgfQorICAgIHJldHVybiBlbnRyeS5zZWNvbmQ7Cit9CisKK3ZvaWQgRHluYW1pY1NlbnNvck1hbmFnZXI6OnVucmVnaXN0ZXJTZW5zb3Ioc3A8QmFzZVNlbnNvck9iamVjdD4gc2Vuc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1Mb2NrKTsKKyAgICBhdXRvIGkgPSBtUmV2ZXJzZU1hcC5maW5kKHNlbnNvci5nZXQoKSk7CisgICAgaWYgKGkgPT0gbVJldmVyc2VNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoImNhbm5vdCByZW1vdmUgYSBub24tZXhpc3Qgc2Vuc29yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IGhhbmRsZSA9IGktPnNlY29uZDsKKyAgICBtUmV2ZXJzZU1hcC5lcmFzZShpKTsKKyAgICBtTWFwLmVyYXNlKGhhbmRsZSk7CisKKyAgICAvLyB3aWxsIG5vdCBjbGVhbiB1cCBtUGVuZGluZ1JlcG9ydCBoZXJlLCBpdCB3aWxsIGJlIGNsZWFuZWQgdXAgd2hlbiBhdCBmaXJzdCBhY3RpdmF0ZSBjYWxsLgorICAgIC8vIHNlbnNvcnNlcnZpY2UgaXMgZ3VyYW50ZWVkIHRvIGNhbGwgYWN0aXZhdGUgdXBvbiBhcnJpdmFsIG9mIGR5bmFtaWMgc2Vuc29yIG1ldGEgY29ubmVjdGlvbgorICAgIC8vIGV2ZW50LgorCisgICAgLy8gc2VuZCBkaXNjb25uZWN0aW9uIGV2ZW50CisgICAgc2Vuc29yc19ldmVudF90IGV2ZW50OworICAgIENvbm5lY3Rpb25SZXBvcnQ6OmZpbGxEaXNjb25uZWN0aW9uRXZlbnQoJmV2ZW50LCBtSGFuZGxlUmFuZ2UuZmlyc3QsIGhhbmRsZSk7CisgICAgc3VibWl0RXZlbnQobnVsbHB0ciwgZXZlbnQpOworfQorCitpbnQgRHluYW1pY1NlbnNvck1hbmFnZXI6OnN1Ym1pdEV2ZW50KHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNvdXJjZSwgY29uc3Qgc2Vuc29yc19ldmVudF90ICZlKSB7CisgICAgaW50IGhhbmRsZTsKKyAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgaGFuZGxlID0gbUhhbmRsZVJhbmdlLmZpcnN0OworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsayhtTG9jayk7CisgICAgICAgIGF1dG8gaSA9IG1SZXZlcnNlTWFwLmZpbmQoc291cmNlLmdldCgpKTsKKyAgICAgICAgaWYgKGkgPT0gbVJldmVyc2VNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjYW5ub3Qgc3VibWl0IGV2ZW50IGZvciBzZW5zb3IgdGhhdCBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGhhbmRsZSA9IGktPnNlY29uZDsKKyAgICB9CisKKyAgICAvLyBtYWtpbmcgYSBjb3B5IG9mIGV2ZW50cywgcHJlcGFyZSBmb3IgZWRpdGluZworICAgIHNlbnNvcnNfZXZlbnRfdCBldmVudCA9IGU7CisgICAgZXZlbnQudmVyc2lvbiA9IHNpemVvZihldmVudCk7CisKKyAgICAvLyBzcGVjaWFsIGNhc2Ugb2YgZmx1c2ggY29tcGxldGUKKyAgICBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9NRVRBX0RBVEEpIHsKKyAgICAgICAgZXZlbnQuc2Vuc29yID0gMDsKKyAgICAgICAgZXZlbnQubWV0YV9kYXRhLnNlbnNvciA9IGhhbmRsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBldmVudC5zZW5zb3IgPSBoYW5kbGU7CisgICAgfQorCisgICAgLy8gc2V0IHRpbWVzdGFtcCBpZiBpdCBpcyBkZWZhdWx0IHZhbHVlCisgICAgaWYgKGV2ZW50LnRpbWVzdGFtcCA9PSBUSU1FU1RBTVBfQVVUT19GSUxMKSB7CisgICAgICAgIGV2ZW50LnRpbWVzdGFtcCA9IGVsYXBzZWRSZWFsdGltZU5hbm8oKTsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrKSB7CisgICAgICAgIC8vIGV4dGVudGlvbiBtb2RlLCBjYWxsaW5nIGNhbGxiYWNrIGRpcmVjdGx5CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgcmV0ID0gbUNhbGxiYWNrLT5zdWJtaXRFdmVudChudWxscHRyLCBldmVudCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiRHluYW1pY1NlbnNvck1hbmFnZXIgY2FsbGJhY2sgZmFpbGVkLCByZXQ6ICVkIiwgcmV0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHN0YW5kYWxvbmUgbW9kZSwgYWRkIGV2ZW50IHRvIGludGVybmFsIGJ1ZmZlciBmb3IgcG9sbCgpIHRvIHBpY2sgdXAKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1GaWZvTG9jayk7CisgICAgICAgIGlmIChtRmlmby53cml0ZSgmZXZlbnQsIDEpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIkR5bmFtaWNTZW5zb3JNYW5hZ2VyIGZpZm8gZnVsbCIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgRHluYW1pY1NlbnNvck1hbmFnZXI6OmdldE5leHRBdmFpbGFibGVIYW5kbGUoKSB7CisgICAgaWYgKG1OZXh0SGFuZGxlID09IG1IYW5kbGVSYW5nZS5zZWNvbmQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbU5leHRIYW5kbGUrKzsKK30KKworY29uc3Qgc2Vuc29yX3QmIER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpnZXREeW5hbWljTWV0YVNlbnNvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1ldGFTZW5zb3I7Cit9CisKK0R5bmFtaWNTZW5zb3JNYW5hZ2VyOjpDb25uZWN0aW9uUmVwb3J0OjpDb25uZWN0aW9uUmVwb3J0KAorICAgICAgICBpbnQgaGFuZGxlLCBzcDxCYXNlU2Vuc29yT2JqZWN0PiBzZW5zb3IpIDoKKyAgICAgICAgbVNlbnNvcigqKHNlbnNvci0+Z2V0U2Vuc29yKCkpKSwKKyAgICAgICAgbU5hbWUobVNlbnNvci5uYW1lKSwKKyAgICAgICAgbVZlbmRvcihtU2Vuc29yLnZlbmRvciksCisgICAgICAgIG1QZXJtaXNzaW9uKG1TZW5zb3IucmVxdWlyZWRQZXJtaXNzaW9uKSwKKyAgICAgICAgbVN0cmluZ1R5cGUobVNlbnNvci5zdHJpbmdUeXBlKSwKKyAgICAgICAgbUdlbmVyYXRlZChmYWxzZSkgeworICAgIG1TZW5zb3IubmFtZSA9IG1OYW1lLmNfc3RyKCk7CisgICAgbVNlbnNvci52ZW5kb3IgPSBtVmVuZG9yLmNfc3RyKCk7CisgICAgbVNlbnNvci5yZXF1aXJlZFBlcm1pc3Npb24gPSBtUGVybWlzc2lvbi5jX3N0cigpOworICAgIG1TZW5zb3Iuc3RyaW5nVHlwZSA9IG1TdHJpbmdUeXBlLmNfc3RyKCk7CisgICAgbVNlbnNvci5oYW5kbGUgPSBoYW5kbGU7CisgICAgbWVtc2V0KCZtRXZlbnQsIDAsIHNpemVvZihtRXZlbnQpKTsKKyAgICBtRXZlbnQudmVyc2lvbiA9IHNpemVvZihtRXZlbnQpOworICAgIHNlbnNvci0+Z2V0VXVpZChtVXVpZCk7CisgICAgQUxPR1YoIkNvbm5lY3Rpb24gcmVwb3J0IGluaXQ6IG5hbWUgPSAlcywgaGFuZGxlID0gJWQiLCBtU2Vuc29yLm5hbWUsIG1TZW5zb3IuaGFuZGxlKTsKK30KKworRHluYW1pY1NlbnNvck1hbmFnZXI6OkNvbm5lY3Rpb25SZXBvcnQ6On5Db25uZWN0aW9uUmVwb3J0KCkgeworICAgIEFMT0dWKCJDb25uZWN0aW9uIHJlcG9ydCBkdG9yOiBuYW1lID0gJXMsIGhhbmRsZSA9ICVkIiwgbVNlbnNvci5uYW1lLCBtU2Vuc29yLmhhbmRsZSk7Cit9CisKK2NvbnN0IHNlbnNvcnNfZXZlbnRfdCYgRHluYW1pY1NlbnNvck1hbmFnZXI6OkNvbm5lY3Rpb25SZXBvcnQ6OgorICAgICAgICBnZW5lcmF0ZUNvbm5lY3Rpb25FdmVudChpbnQgbWV0YUhhbmRsZSkgeworICAgIGlmICghbUdlbmVyYXRlZCkgeworICAgICAgICBtRXZlbnQuc2Vuc29yID0gbWV0YUhhbmRsZTsKKyAgICAgICAgbUV2ZW50LnR5cGUgPSBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBOworICAgICAgICBtRXZlbnQudGltZXN0YW1wID0gZWxhcHNlZFJlYWx0aW1lTmFubygpOworICAgICAgICBtRXZlbnQuZHluYW1pY19zZW5zb3JfbWV0YSA9CisgICAgICAgICAgICAgICAgKGR5bmFtaWNfc2Vuc29yX21ldGFfZXZlbnRfdCkge3RydWUsIG1TZW5zb3IuaGFuZGxlLCAmbVNlbnNvciwgezB9fTsKKyAgICAgICAgbWVtY3B5KCZtRXZlbnQuZHluYW1pY19zZW5zb3JfbWV0YS51dWlkLCAmbVV1aWQsIHNpemVvZihtRXZlbnQuZHluYW1pY19zZW5zb3JfbWV0YS51dWlkKSk7CisgICAgICAgIG1HZW5lcmF0ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gbUV2ZW50OworfQorCit2b2lkIER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpDb25uZWN0aW9uUmVwb3J0OjoKKyAgICAgICAgZmlsbERpc2Nvbm5lY3Rpb25FdmVudChzZW5zb3JzX2V2ZW50X3QqIGV2ZW50LCBpbnQgbWV0YUhhbmRsZSwgaW50IGhhbmRsZSkgeworICAgIG1lbXNldChldmVudCwgMCwgc2l6ZW9mKHNlbnNvcnNfZXZlbnRfdCkpOworICAgIGV2ZW50LT52ZXJzaW9uID0gc2l6ZW9mKHNlbnNvcnNfZXZlbnRfdCk7CisgICAgZXZlbnQtPnNlbnNvciA9IG1ldGFIYW5kbGU7CisgICAgZXZlbnQtPnR5cGUgPSBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBOworICAgIGV2ZW50LT50aW1lc3RhbXAgPSBlbGFwc2VkUmVhbHRpbWVOYW5vKCk7CisgICAgZXZlbnQtPmR5bmFtaWNfc2Vuc29yX21ldGEuY29ubmVjdGVkID0gZmFsc2U7CisgICAgZXZlbnQtPmR5bmFtaWNfc2Vuc29yX21ldGEuaGFuZGxlID0gaGFuZGxlOworfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EeW5hbWljU2Vuc29yTWFuYWdlci5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R5bmFtaWNTZW5zb3JNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmMzlkYQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EeW5hbWljU2Vuc29yTWFuYWdlci5oCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfRFlOQU1JQ19TRU5TT1JfTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9EWU5BTUlDX1NFTlNPUl9NQU5BR0VSX0gKKworI2luY2x1ZGUgIlNlbnNvckV2ZW50Q2FsbGJhY2suaCIKKyNpbmNsdWRlICJSaW5nQnVmZmVyLmgiCisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK2NsYXNzIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uOworCitjbGFzcyBEeW5hbWljU2Vuc29yTWFuYWdlciA6IHB1YmxpYyBTZW5zb3JFdmVudENhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICAvLyBoYW5kbGVCYXNlIGlzIHJlc2VydmVkIGZvciB0aGUgZHluYW1pYyBzZW5zb3IgbWV0YSBzZW5zb3IuCisgICAgLy8gaGFuZGxlTWF4IG11c3QgYmUgZ3JlYXRlciB0aGFuIGhhbmRsZUJhc2UgKyAxLgorICAgIC8vIFRoaXMgY2xhc3MgaGFzIHR3byBvcGVyYXRpb24gbW9kZSBkZXBlbmRpbmcgb24gY2FsbGJhY2s6IDEpIGV4dGVuc2lvbiwgMikgc3RhbmQtYWxvbmUuCisgICAgLy8gSW4gZXh0ZW5zaW9uIG1vZGUsIGNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGxwdHIuIFNlbnNvciBldmVudCBnZW5lcmF0ZWQgd2lsbCBiZSBzdWJtaXR0ZWQgdG8KKyAgICAvLyBidWZmZXIgb2YgcHJpbWFyeSBzZW5zb3IgSEFMIGltcGxlbWVudGF0aW9uLiBJbiBzdGFuZC1hbG9uZSBtb2RlLCBjYWxsYmFjayBtdXN0IGJlIG51bGxwdHIuCisgICAgLy8gR2VuZXJhdGVkIHNlbnNvciBldmVudHMgd2lsbCBiZSBhZGRlZCBpbnRvIGludGVybmFsIGJ1ZmZlciB3YWl0aW5nIGZvciBwb2xsKCkgZnVuY3Rpb24gdG8KKyAgICAvLyBwaWNrIHVwLgorICAgIC8vCisgICAgc3RhdGljIER5bmFtaWNTZW5zb3JNYW5hZ2VyKiBjcmVhdGVJbnN0YW5jZSgKKyAgICAgICAgICAgIGludCBoYW5kbGVCYXNlLCBpbnQgaGFuZGxlQ291bnQsIFNlbnNvckV2ZW50Q2FsbGJhY2sgKmNhbGxiYWNrKTsKKyAgICB2aXJ0dWFsIH5EeW5hbWljU2Vuc29yTWFuYWdlcigpOworCisgICAgLy8gY2FsbHMgdG8gYWRkIG9yIHJlbW92ZSBzZW5zb3IsIGNhbGxlZCBmcm9tIHNlbnNvciBkYWVtb24KKyAgICBib29sIHJlZ2lzdGVyU2Vuc29yKHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNlbnNvcik7CisgICAgdm9pZCB1bnJlZ2lzdGVyU2Vuc29yKHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNlbnNvcik7CisKKyAgICAvLyBEZXRlcm1pbmUgaWYgYSBzZW5zb3IgaGFuZGxlIGlzIGluIHRoZSByYW5nZSBkZWZpbmVkIGluIGNvbnN0cnVjdG9yLgorICAgIC8vIEl0IGRvZXMgbm90IHRlc3QgaWYgc2Vuc29yIGhhbmRsZSBpcyB2YWxpZC4KKyAgICBib29sIG93bnMoaW50IGhhbmRsZSkgY29uc3Q7CisKKyAgICAvLyBoYW5kbGVzIHNlbnNvciBoYWwgcmVxdWVzdHMuCisgICAgaW50IGFjdGl2YXRlKGludCBoYW5kbGUsIGJvb2wgZW5hYmxlKTsKKyAgICBpbnQgYmF0Y2goaW50IGhhbmRsZSwgbnNlY3NfdCBzYW1wbGVfcGVyaW9kLCBuc2Vjc190IGJhdGNoX3BlcmlvZCk7CisgICAgaW50IHNldERlbGF5KGludCBoYW5kbGUsIG5zZWNzX3Qgc2FtcGxlX3BlcmlvZCk7CisgICAgaW50IGZsdXNoKGludCBoYW5kbGUpOworICAgIGludCBwb2xsKHNlbnNvcnNfZXZlbnRfdCAqIGRhdGEsIGludCBjb3VudCk7CisKKyAgICAvLyBTZW5zb3JFdmVudENhbGxiYWNrCisgICAgdmlydHVhbCBpbnQgc3VibWl0RXZlbnQoc3A8QmFzZVNlbnNvck9iamVjdD4sIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCAmZSkgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgbWV0YSBzZW5zb3Igc3RydWN0CisgICAgY29uc3Qgc2Vuc29yX3QmIGdldER5bmFtaWNNZXRhU2Vuc29yKCkgY29uc3Q7Citwcm90ZWN0ZWQ6CisgICAgRHluYW1pY1NlbnNvck1hbmFnZXIoaW50IGhhbmRsZUJhc2UsIGludCBoYW5kbGVNYXgsIFNlbnNvckV2ZW50Q2FsbGJhY2sqIGNhbGxiYWNrKTsKK3ByaXZhdGU6CisgICAgLy8gYSBoZWxwZXIgY2xhc3MgdXNlZCBmb3IgZ2VuZXJhdGUgY29ubmVjdGlvbiBhbmQgZGlzY29ubmVjdGlvbiByZXBvcnQKKyAgICBjbGFzcyBDb25uZWN0aW9uUmVwb3J0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIENvbm5lY3Rpb25SZXBvcnQoKSB7fQorICAgICAgICBDb25uZWN0aW9uUmVwb3J0KGludCBoYW5kbGUsIHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNlbnNvcik7CisgICAgICAgIH5Db25uZWN0aW9uUmVwb3J0KCk7CisgICAgICAgIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCYgZ2VuZXJhdGVDb25uZWN0aW9uRXZlbnQoaW50IG1ldGFIYW5kbGUpOworICAgICAgICBzdGF0aWMgdm9pZCBmaWxsRGlzY29ubmVjdGlvbkV2ZW50KHNlbnNvcnNfZXZlbnRfdCogZXZlbnQsIGludCBtZXRhSGFuZGxlLCBpbnQgaGFuZGxlKTsKKyAgICBwcml2YXRlOgorICAgICAgICBzZW5zb3JfdCBtU2Vuc29yOworICAgICAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbVZlbmRvcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbVBlcm1pc3Npb247CisgICAgICAgIHN0ZDo6c3RyaW5nIG1TdHJpbmdUeXBlOworICAgICAgICBzZW5zb3JzX2V2ZW50X3QgbUV2ZW50OworICAgICAgICB1aW50OF90IG1VdWlkWzE2XTsKKyAgICAgICAgYm9vbCBtR2VuZXJhdGVkOworICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb25uZWN0aW9uUmVwb3J0KTsKKyAgICB9OworCisgICAgLy8gcmV0dXJucyBuZXh0IGF2YWlsYWJsZSBoYW5kbGUgdG8gdXNlIHVwb24gYSBuZXcgc2Vuc29yIGNvbm5lY3Rpb24sIG9yIC0xIGlmIHdlIHJ1biBvdXQuCisgICAgaW50IGdldE5leHRBdmFpbGFibGVIYW5kbGUoKTsKKworICAgIC8vIFRGOiAgaW50IGZvbyhzcDxCYXNlU2Vuc29yT2JqZWN0PiBvYmopOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBURj4KKyAgICBpbnQgb3BlcmF0ZVNlbnNvcihpbnQgaGFuZGxlLCBURiBmKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsayhtTG9jayk7CisgICAgICAgIGNvbnN0IGF1dG8gaSA9IG1NYXAuZmluZChoYW5kbGUpOworICAgICAgICBpZiAoaSA9PSBtTWFwLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHNwPEJhc2VTZW5zb3JPYmplY3Q+IHMgPSBpLT5zZWNvbmQucHJvbW90ZSgpOworICAgICAgICBpZiAocyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBzZW5zb3Igb2JqZWN0IGlzIGFscmVhZHkgZ29uZQorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZihzKTsKKyAgICB9CisKKyAgICAvLyBhdmFpbGFibGUgc2Vuc29yIGhhbmRsZSBzcGFjZQorICAgIGNvbnN0IHN0ZDo6cGFpcjxpbnQsIGludD4gbUhhbmRsZVJhbmdlOworICAgIHNlbnNvcl90IG1NZXRhU2Vuc29yOworCisgICAgLy8gaW1tdXRhYmxlIHBvaW50ZXIgdG8gZXZlbnQgY2FsbGJhY2ssIHVzZWQgaW4gZXh0ZW50aW9uIG1vZGUuCisgICAgU2Vuc29yRXZlbnRDYWxsYmFjayAqIGNvbnN0IG1DYWxsYmFjazsKKworICAgIC8vIFJpbmdCdWZmZXIgdXNlZCBpbiBzdGFuZGFsb25lIG1vZGUKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrRmlmb1NpemUgPSA0MDk2OyAvLzRLIGV2ZW50cworICAgIG11dGFibGUgc3RkOjptdXRleCBtRmlmb0xvY2s7CisgICAgUmluZ0J1ZmZlciBtRmlmbzsKKworICAgIC8vIG1hcHBpbmcgYmV0d2VlbiBoYW5kbGUgYW5kIFNlbnNvck9iamVjdHMKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgaW50IG1OZXh0SGFuZGxlOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHdwPEJhc2VTZW5zb3JPYmplY3Q+PiBtTWFwOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIGludD4gbVJldmVyc2VNYXA7CisgICAgbXV0YWJsZSBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBDb25uZWN0aW9uUmVwb3J0PiBtUGVuZGluZ1JlcG9ydDsKKworICAgIC8vIGRhZW1vbnMKKyAgICBzdGQ6OnZlY3RvcjxzcDxCYXNlRHluYW1pY1NlbnNvckRhZW1vbj4+IG1EYWVtb25WZWN0b3I7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9EWU5BTUlDX1NFTlNPUl9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWREZXZpY2UuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWREZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDgzNTkzCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZERldmljZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURfREVWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0hJRF9ERVZJQ0VfSAorI2luY2x1ZGUgIlV0aWxzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgSGlkRGV2aWNlIDogdmlydHVhbCBwdWJsaWMgUkVGX0JBU0UoSGlkRGV2aWNlKSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SGlkRGV2aWNlKCkgPSBkZWZhdWx0OworCisgICAgc3RydWN0IEhpZERldmljZUluZm8geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbFBhdGg7CisgICAgICAgIHN0ZDo6c3RyaW5nIGJ1c1R5cGU7CisgICAgICAgIHVpbnQxNl90IHZlbmRvcklkOworICAgICAgICB1aW50MTZfdCBwcm9kdWN0SWQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlc2NyaXB0b3I7CisgICAgfTsKKworICAgIHZpcnR1YWwgY29uc3QgSGlkRGV2aWNlSW5mbyYgZ2V0RGV2aWNlSW5mbygpID0gMDsKKworICAgIC8vIGdldCBmZWF0dXJlIGZyb20gZGV2aWNlCisgICAgdmlydHVhbCBib29sIGdldEZlYXR1cmUodWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKm91dCkgPSAwOworCisgICAgLy8gd3JpdGUgZmVhdHVyZSB0byBkZXZpY2UKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RmVhdHVyZSh1aW50OF90IGlkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaW4pID0gMDsKKworICAgIC8vIHNlbmQgcmVwb3J0IHRvIGRlZmF1bHQgb3V0cHV0IGVuZHBvaW50CisgICAgdmlydHVhbCBib29sIHNlbmRSZXBvcnQodWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmRhdGEpID0gMDsKKworICAgIC8vIHJlY2VpdmUgZnJvbSBkZWZhdWx0IGlucHV0IGVuZHBvaW50CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVSZXBvcnQodWludDhfdCAqaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpkYXRhKSA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEX0RFVklDRV9ICmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3RGV2aWNlLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODg0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3RGV2aWNlLmNwcApAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkUmF3RGV2aWNlLmgiCisjaW5jbHVkZSAiSGlkTG9nLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWRyYXcuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWRkZXYuaD4gIC8vIEhJRF9TVFJJTkdfU0laRQorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKwordXNpbmcgSGlkVXRpbDo6SGlkSXRlbTsKKworSGlkUmF3RGV2aWNlOjpIaWRSYXdEZXZpY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZOYW1lLCBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiAmdXNhZ2VTZXQpCisgICAgICAgIDogbURldkZkKC0xKSwgbU11bHRpSWREZXZpY2UoZmFsc2UpLCBtVmFsaWQoZmFsc2UpIHsKKyAgICAvLyBvcGVuIGRldmljZQorICAgIG1EZXZGZCA9IDo6b3BlbihkZXZOYW1lLmNfc3RyKCksIE9fUkRXUik7IC8vIHJlYWQgd3JpdGU/CisgICAgaWYgKG1EZXZGZCA8IDApIHsKKyAgICAgICAgTE9HX0UgPDwgIkVycm9yIGluIG9wZW4gZGV2aWNlIG5vZGU6ICIgPDwgZXJybm8gPDwgIiAoIiA8PCA6OnN0cmVycm9yKGVycm5vKSA8PCAiKSIKKyAgICAgICAgICAgICAgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBnZXQgZGV2aWNlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgaGlkIGRlc2NyaXB0b3IKKyAgICBpZiAoIXBvcHVsYXRlRGV2aWNlSW5mbygpKSB7CisgICAgICAgIExPR19FIDw8ICJFcnJvciBvYnRhaW5pbmcgSGlkUmF3IGRldmljZSBpbmZvcm1hdGlvbiIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWdlbmVyYXRlRGlnZXN0KHVzYWdlU2V0KSkgeworICAgICAgICBMT0dfRSA8PCAiQ2Fubm90IHBhcnNlIGhpZCBkZXNjcmlwdG9yIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGRpZ2VzdCBlcnJvciBjaGVja2luZworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+IHJlcG9ydElkU2V0OworICAgIGZvciAoYXV0byBjb25zdCAmZGlnZXN0IDogbURpZ2VzdFZlY3RvcikgeworICAgICAgICBmb3IgKGF1dG8gY29uc3QgJnBhY2tldCA6IGRpZ2VzdC5wYWNrZXRzKSB7CisgICAgICAgICAgICBpZiAobVJlcG9ydFR5cGVJZE1hcC5lbXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIocGFja2V0LnR5cGUsIHBhY2tldC5pZCksICZwYWNrZXQpLnNlY29uZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJTYW1lIHR5cGUgLSByZXBvcnQgaWQgcGFpciAoIiA8PCBwYWNrZXQudHlwZSA8PCAiLCAiIDw8IHBhY2tldC5pZCA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiaXMgdXNlZCBieSBtb3JlIHRoYW4gb25lIHVzYWdlIGNvbGxlY3Rpb24iIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydElkU2V0Lmluc2VydChwYWNrZXQuaWQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtUmVwb3J0VHlwZUlkTWFwLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyZXBvcnRJZFNldC5zaXplKCkgPiAxKSB7CisgICAgICAgIGlmIChyZXBvcnRJZFNldC5maW5kKDApICE9IHJlcG9ydElkU2V0LmVuZCgpKSB7CisgICAgICAgICAgICBMT0dfRSA8PCAiRGVmYXVsdCByZXBvcnQgaWQgMCBpcyBub3QgZXhwZWN0ZWQgd2hlbiBtb3JlIHRoYW4gb25lIHJlcG9ydCBpZCBpcyBmb3VuZC4iCisgICAgICAgICAgICAgICAgICA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTXVsdGlJZERldmljZSA9IHRydWU7CisgICAgfSBlbHNlIHsgLy8gcmVwb3J0SWRTZXQuc2l6ZSgpID09IDEKKyAgICAgICAgbU11bHRpSWREZXZpY2UgPSAhKHJlcG9ydElkU2V0LmZpbmQoMCkgIT0gcmVwb3J0SWRTZXQuZW5kKCkpOworICAgIH0KKyAgICBtVmFsaWQgPSB0cnVlOworfQorCitIaWRSYXdEZXZpY2U6On5IaWRSYXdEZXZpY2UoKSB7CisgICAgaWYgKG1EZXZGZCA+IDApIHsKKyAgICAgICAgOjpjbG9zZShtRGV2RmQpOworICAgICAgICBtRGV2RmQgPSAtMTsKKyAgICB9Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjpwb3B1bGF0ZURldmljZUluZm8oKSB7CisgICAgSGlkRGV2aWNlSW5mbyBpbmZvOworICAgIGNoYXIgYnVmZmVyW0hJRF9TVFJJTkdfU0laRSArIDFdOworCisgICAgaWYgKG1EZXZGZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIG5hbWUKKyAgICBpZiAoaW9jdGwobURldkZkLCBISURJT0NHUkFXTkFNRShzaXplb2YoYnVmZmVyKSAtIDEpLCBidWZmZXIpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJ1ZmZlcltzaXplb2YoYnVmZmVyKSAtIDFdID0gJ1wwJzsKKyAgICBpbmZvLm5hbWUgPSBidWZmZXI7CisKKyAgICAvLyBwaHlzaWNhbCBwYXRoCisgICAgaWYgKGlvY3RsKG1EZXZGZCwgSElESU9DR1JBV1BIWVMoc2l6ZW9mKGJ1ZmZlcikgLSAxKSwgYnVmZmVyKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBidWZmZXJbc2l6ZW9mKGJ1ZmZlcikgLSAxXSA9ICdcMCc7CisgICAgaW5mby5waHlzaWNhbFBhdGggPSBidWZmZXI7CisKKyAgICAvLyByYXcgZGV2aWNlIGluZm8KKyAgICBoaWRyYXdfZGV2aW5mbyBkZXZJbmZvOworICAgIGlmIChpb2N0bChtRGV2RmQsIEhJRElPQ0dSQVdJTkZPLCAmZGV2SW5mbykgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRldkluZm8uYnVzdHlwZSkgeworICAgIGNhc2UgQlVTX1VTQjoKKyAgICAgICAgaW5mby5idXNUeXBlID0gIlVTQiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX0hJTDoKKyAgICAgICAgaW5mby5idXNUeXBlID0gIkhJTCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX0JMVUVUT09USDoKKyAgICAgICAgaW5mby5idXNUeXBlID0gIkJsdWV0b290aCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1ZJUlRVQUw6CisgICAgICAgIGluZm8uYnVzVHlwZSA9ICJWaXJ0dWFsIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaW5mby5idXNUeXBlID0gIk90aGVyIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW5mby52ZW5kb3JJZCA9IGRldkluZm8udmVuZG9yOworICAgIGluZm8ucHJvZHVjdElkID0gZGV2SW5mby52ZW5kb3I7CisKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yU2l6ZTsKKyAgICAvKiBHZXQgUmVwb3J0IERlc2NyaXB0b3IgU2l6ZSAqLworICAgIGlmIChpb2N0bChtRGV2RmQsIEhJRElPQ0dSREVTQ1NJWkUsICZkZXNjcmlwdG9yU2l6ZSkgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgaGlkcmF3X3JlcG9ydF9kZXNjcmlwdG9yIHJlcG9ydERlc2NyaXB0b3I7CisgICAgbWVtc2V0KCZyZXBvcnREZXNjcmlwdG9yLCAwLCBzaXplb2YocmVwb3J0RGVzY3JpcHRvcikpOworICAgIGluZm8uZGVzY3JpcHRvci5yZXNpemUoZGVzY3JpcHRvclNpemUpOworICAgIHJlcG9ydERlc2NyaXB0b3Iuc2l6ZSA9IGRlc2NyaXB0b3JTaXplOworICAgIGlmIChpb2N0bChtRGV2RmQsIEhJRElPQ0dSREVTQywgJnJlcG9ydERlc2NyaXB0b3IpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6Y29weShyZXBvcnREZXNjcmlwdG9yLnZhbHVlLCByZXBvcnREZXNjcmlwdG9yLnZhbHVlICsgZGVzY3JpcHRvclNpemUsCisgICAgICAgICAgICAgIGluZm8uZGVzY3JpcHRvci5iZWdpbigpKTsKKyAgICBtRGV2aWNlSW5mbyA9IGluZm87CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjpnZW5lcmF0ZURpZ2VzdChjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiAmdXNhZ2UpIHsKKyAgICBpZiAobURldmljZUluZm8uZGVzY3JpcHRvci5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxIaWRJdGVtPiB0b2tlbnMgPSBIaWRJdGVtOjp0b2tlbml6ZShtRGV2aWNlSW5mby5kZXNjcmlwdG9yKTsKKyAgICBIaWRQYXJzZXIgcGFyc2VyOworICAgIGlmICghcGFyc2VyLnBhcnNlKHRva2VucykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBhcnNlci5maWx0ZXJUcmVlKCk7CisgICAgbURpZ2VzdFZlY3RvciA9IHBhcnNlci5nZW5lcmF0ZURpZ2VzdCh1c2FnZSk7CisKKyAgICByZXR1cm4gbURpZ2VzdFZlY3Rvci5zaXplKCkgPiAwOworfQorCitib29sIEhpZFJhd0RldmljZTo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZSh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqb3V0KSB7CisgICAgaWYgKG1EZXZGZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChvdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQgKnBhY2tldCA9IGdldFJlcG9ydFBhY2tldChIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0ZFQVRVUkUsIGlkKTsKKyAgICBpZiAocGFja2V0ID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZTogdW5rbm93biBmZWF0dXJlICIgPDwgaWQgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSA9IHBhY2tldC0+Z2V0Qnl0ZVNpemUoKSArIDE7IC8vIHJlcG9ydCBpZCBzaXplCisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtSW9CdWZmZXJMb2NrKTsKKyAgICBpZiAobUlvQnVmZmVyLnNpemUoKSA8IHNpemUpIHsKKyAgICAgICAgbUlvQnVmZmVyLnJlc2l6ZShzaXplKTsKKyAgICB9CisgICAgbUlvQnVmZmVyWzBdID0gaWQ7CisgICAgaW50IHJlcyA9IDo6aW9jdGwobURldkZkLCBISURJT0NHRkVBVFVSRShzaXplKSwgbUlvQnVmZmVyLmRhdGEoKSk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZTogZmVhdHVyZSAiIDw8IHN0YXRpY19jYXN0PGludD4oaWQpCisgICAgICAgICAgICAgIDw8ICIgaW9jdGwgcmV0dXJucyAiIDw8IHJlcyA8PCAiICgiIDw8IDo6c3RyZXJyb3IocmVzKSA8PCAiKSIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXMpICE9IHNpemUpIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZTogZ2V0IGZlYXR1cmUgIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGlkKQorICAgICAgICAgICAgICA8PCAiIHJldHVybmVkICIgPDwgcmVzIDw8ICIgYnl0ZXMsIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICIgPDwgc2l6ZSA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobUlvQnVmZmVyLmZyb250KCkgIT0gaWQpIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZTogZ2V0IGZlYXR1cmUgIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGlkKQorICAgICAgICAgICAgICA8PCAiIHJlc3VsdCBoYXMgaGVhZGVyICIgPDwgbUlvQnVmZmVyLmZyb250KCkgPDwgTE9HX0VOREw7CisgICAgfQorICAgIG91dC0+cmVzaXplKHNpemUgLSAxKTsKKyAgICBzdGQ6OmNvcHkobUlvQnVmZmVyLmJlZ2luKCkgKyAxLCBtSW9CdWZmZXIuYmVnaW4oKSArIHNpemUsIG91dC0+YmVnaW4oKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjpzZXRGZWF0dXJlKHVpbnQ4X3QgaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpbikgeworICAgIGlmIChtRGV2RmQgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqcGFja2V0ID0gZ2V0UmVwb3J0UGFja2V0KEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfRkVBVFVSRSwgaWQpOworICAgIGlmIChwYWNrZXQgPT0gbnVsbHB0cikgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpzZXRGZWF0dXJlOiBVbmtub3duIGZlYXR1cmUgIiA8PCBpZCA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gcGFja2V0LT5nZXRCeXRlU2l6ZSgpOworICAgIGlmIChzaXplICE9IGluLnNpemUoKSkgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpzZXRGZWF0dXJlOiBzZXQgZmVhdHVyZSAiIDw8IGlkIDw8ICIgc2l6ZSBtaXNtYXRjaCwgbmVlZCAiCisgICAgICAgICAgICAgIDw8IHNpemUgPDwgIiBieXRlcywgaGF2ZSAiIDw8IGluLnNpemUoKSA8PCAiIGJ5dGVzIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICsrc2l6ZTsgLy8gcmVwb3J0IGlkIGJ5dGUKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtSW9CdWZmZXJMb2NrKTsKKyAgICBpZiAobUlvQnVmZmVyLnNpemUoKSA8IHNpemUpIHsKKyAgICAgICAgbUlvQnVmZmVyLnJlc2l6ZShzaXplKTsKKyAgICB9CisgICAgbUlvQnVmZmVyWzBdID0gaWQ7CisgICAgc3RkOjpjb3B5KGluLmJlZ2luKCksIGluLmVuZCgpLCAmbUlvQnVmZmVyWzFdKTsKKyAgICBpbnQgcmVzID0gOjppb2N0bChtRGV2RmQsIEhJRElPQ1NGRUFUVVJFKHNpemUpLCBtSW9CdWZmZXIuZGF0YSgpKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpzZXRGZWF0dXJlOiBmZWF0dXJlICIgPDwgaWQgPDwgIiBpb2N0bCByZXR1cm5zICIgPDwgcmVzCisgICAgICAgICAgICAgIDw8ICIgKCIgPDwgOjpzdHJlcnJvcihyZXMpIDw8ICIpIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRSYXdEZXZpY2U6OnNlbmRSZXBvcnQodWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmRhdGEpIHsKKyAgICBpZiAobURldkZkIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQgKnBhY2tldCA9IGdldFJlcG9ydFBhY2tldChIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX09VVFBVVCwgaWQpOworICAgIGlmIChwYWNrZXQgPT0gbnVsbHB0cikgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpzZW5kUmVwb3J0OiB1bmtub3duIG91dHB1dCAiIDw8IGlkIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBwYWNrZXQtPmdldEJ5dGVTaXplKCk7CisgICAgaWYgKHNpemUgIT0gZGF0YS5zaXplKCkpIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6c2VuZFJlcG9ydDogc2VuZCByZXBvcnQgIiA8PCBpZCA8PCAiIHNpemUgbWlzbWF0Y2gsIG5lZWQgIgorICAgICAgICAgICAgICA8PCBzaXplIDw8ICIgYnl0ZXMsIGhhdmUgIiA8PCBkYXRhLnNpemUoKSA8PCAiIGJ5dGVzIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgcmVzOworICAgIGlmIChtTXVsdGlJZERldmljZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtSW9CdWZmZXJMb2NrKTsKKyAgICAgICAgKytzaXplOworICAgICAgICBpZiAobUlvQnVmZmVyLnNpemUoKSA8IHNpemUpIHsKKyAgICAgICAgICAgIG1Jb0J1ZmZlci5yZXNpemUoc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUlvQnVmZmVyWzBdID0gaWQ7CisgICAgICAgIHN0ZDo6Y29weShtSW9CdWZmZXIuYmVnaW4oKSArIDEsIG1Jb0J1ZmZlci5lbmQoKSwgZGF0YS5iZWdpbigpKTsKKyAgICAgICAgcmVzID0gOjp3cml0ZShtRGV2RmQsIG1Jb0J1ZmZlci5kYXRhKCksIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IDo6d3JpdGUobURldkZkLCBkYXRhLmRhdGEoKSwgc2l6ZSk7CisgICAgfQorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIExPR19FIDw8ICJIaWRSYXdEZXZpY2U6OnNlbmRSZXBvcnQ6IG91dHB1dCAiIDw8IGlkIDw8ICIgd3JpdGUgcmV0dXJucyAiIDw8IHJlcworICAgICAgICAgICAgICA8PCAiICgiIDw8IDo6c3RyZXJyb3IocmVzKSA8PCAiKSIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjpyZWNlaXZlUmVwb3J0KHVpbnQ4X3QgKmlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqZGF0YSkgeworICAgIGlmIChtRGV2RmQgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IGJ1ZmZlclsyNTZdOworICAgIGludCByZXMgPSA6OnJlYWQobURldkZkLCBidWZmZXIsIDI1Nik7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6cmVjZWl2ZVJlcG9ydDogcmVhZCByZXR1cm5zICIgPDwgcmVzCisgICAgICAgICAgICAgIDw8ICIgKCIgPDwgOjpzdHJlcnJvcihyZXMpIDw8ICIpIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtTXVsdGlJZERldmljZSkgeworICAgICAgICBpZiAoIShyZXMgPiAxKSkgeworICAgICAgICAgICAgTE9HX0UgPDwgInJlYWQgaGlkcmF3IHJldHVybnMgZGF0YSB0b28gc2hvcnQsIGxlbjogIiA8PCByZXMgPDwgTE9HX0VOREw7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS0+cmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4ocmVzIC0gMSkpOworICAgICAgICBzdGQ6OmNvcHkoYnVmZmVyICsgMSwgYnVmZmVyICsgcmVzLCBkYXRhLT5iZWdpbigpKTsKKyAgICAgICAgKmlkID0gYnVmZmVyWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEtPnJlc2l6ZShzdGF0aWNfY2FzdDxzaXplX3Q+KHJlcykpOworICAgICAgICBzdGQ6OmNvcHkoYnVmZmVyLCBidWZmZXIgKyByZXMsIGRhdGEtPmJlZ2luKCkpOworICAgICAgICAqaWQgPSAwOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQgKkhpZFJhd0RldmljZTo6Z2V0UmVwb3J0UGFja2V0KHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgaWQpIHsKKyAgICBhdXRvIGkgPSBtUmVwb3J0VHlwZUlkTWFwLmZpbmQoc3RkOjptYWtlX3BhaXIodHlwZSwgaWQpKTsKKyAgICByZXR1cm4gKGkgPT0gbVJlcG9ydFR5cGVJZE1hcC5lbmQoKSkgPyBudWxscHRyIDogaS0+c2Vjb25kOworfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdEZXZpY2UuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdkZmZmCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd0RldmljZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX0RFVklDRV9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfREVWSUNFX0gKKworI2luY2x1ZGUgIkhpZERldmljZS5oIgorCisjaW5jbHVkZSA8SGlkUGFyc2VyLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCit1c2luZyBIaWRVdGlsOjpIaWRQYXJzZXI7Cit1c2luZyBIaWRVdGlsOjpIaWRSZXBvcnQ7CisKK2NsYXNzIEhpZFJhd0RldmljZSA6IHB1YmxpYyBIaWREZXZpY2UgeworICAgIGZyaWVuZCBjbGFzcyBIaWRSYXdEZXZpY2VUZXN0OworcHVibGljOgorICAgIEhpZFJhd0RldmljZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2TmFtZSwgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVuc2lnbmVkIGludD4gJnVzYWdlU2V0KTsKKyAgICB2aXJ0dWFsIH5IaWRSYXdEZXZpY2UoKTsKKworICAgIC8vIHRlc3QgaWYgdGhlIGRldmljZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8vIGltcGxlbWVudCBIaWREZXZpY2UgcHVyZSB2aXJ0dWFscworICAgIHZpcnR1YWwgSGlkRGV2aWNlSW5mbyYgZ2V0RGV2aWNlSW5mbygpIG92ZXJyaWRlIHsgcmV0dXJuIG1EZXZpY2VJbmZvOyB9CisgICAgdmlydHVhbCBib29sIGdldEZlYXR1cmUodWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKm91dCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHNldEZlYXR1cmUodWludDhfdCBpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmluKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFJlcG9ydCh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmZGF0YSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVSZXBvcnQodWludDhfdCAqaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpkYXRhKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIGJvb2wgcG9wdWxhdGVEZXZpY2VJbmZvKCk7CisgICAgc2l6ZV90IGdldFJlcG9ydFNpemUoaW50IHR5cGUsIHVpbnQ4X3QgaWQpOworICAgIGJvb2wgZ2VuZXJhdGVEaWdlc3QoY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiAmdXNhZ2UpOworICAgIHNpemVfdCBjYWxjdWxhdGVSZXBvcnRCaXRTaXplKGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFJlcG9ydD4gJnJlcG9ydEl0ZW1zKTsKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqZ2V0UmVwb3J0UGFja2V0KHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgaWQpOworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8dW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQ+IFJlcG9ydFR5cGVJZFBhaXI7CisgICAgc3RydWN0IFVuc2lnbmVkSW50UGFpckhhc2ggeworICAgICAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBSZXBvcnRUeXBlSWRQYWlyJiB2KSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Omhhc2g8dW5zaWduZWQgaW50PiBoYXNoOworICAgICAgICAgICAgcmV0dXJuIGhhc2godi5maXJzdCkgXiBoYXNoKHYuc2Vjb25kKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8UmVwb3J0VHlwZUlkUGFpciwgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQgKiwgVW5zaWduZWRJbnRQYWlySGFzaD4KKyAgICAgICAgICAgIG1SZXBvcnRUeXBlSWRNYXA7CisKKyAgICBIaWRQYXJzZXI6OkRpZ2VzdFZlY3RvciBtRGlnZXN0VmVjdG9yOworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1Jb0J1ZmZlckxvY2s7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbUlvQnVmZmVyOworCisgICAgaW50IG1EZXZGZDsKKyAgICBIaWREZXZpY2VJbmZvIG1EZXZpY2VJbmZvOworICAgIGJvb2wgbU11bHRpSWREZXZpY2U7CisgICAgaW50IG1WYWxpZDsKKworICAgIEhpZFJhd0RldmljZShjb25zdCBIaWRSYXdEZXZpY2UgJikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSGlkUmF3RGV2aWNlICYpID0gZGVsZXRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX0RFVklDRV9ICisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3IuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0ZDdhNgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3IuY3BwCkBAIC0wLDAgKzEsMTA0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yLmgiCisjaW5jbHVkZSAiSGlkU2Vuc29yRGVmLmgiCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlICJIaWRMb2cuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y29kZWN2dD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCituYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcgQ1VTVE9NX1RZUEVfUFJFRklYKCJjb20uZ29vZ2xlLmhhcmR3YXJlLnNlbnNvci5oaWRfZHluYW1pYy4iKTsKK30KKworSGlkUmF3U2Vuc29yOjpIaWRSYXdTZW5zb3IoCisgICAgICAgIFNQKEhpZERldmljZSkgZGV2aWNlLCB1aW50MzJfdCB1c2FnZSwgY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKQorICAgICAgICA6IG1SZXBvcnRpbmdTdGF0ZUlkKC0xKSwgbVBvd2VyU3RhdGVJZCgtMSksIG1SZXBvcnRJbnRlcnZhbElkKC0xKSwgbUlucHV0UmVwb3J0SWQoLTEpLAorICAgICAgICBtRW5hYmxlZChmYWxzZSksIG1TYW1wbGluZ1BlcmlvZCgxMDAwbGwqMTAwMCoxMDAwKSwgbUJhdGNoaW5nUGVyaW9kKDApLAorICAgICAgICBtRGV2aWNlKGRldmljZSksIG1WYWxpZChmYWxzZSkgeworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1lbXNldCgmbVNlbnNvciwgMCwgc2l6ZW9mKG1TZW5zb3IpKTsKKworICAgIGNvbnN0IEhpZERldmljZTo6SGlkRGV2aWNlSW5mbyAmaW5mbyA9ICBkZXZpY2UtPmdldERldmljZUluZm8oKTsKKyAgICBpbml0RmVhdHVyZVZhbHVlRnJvbUhpZERldmljZUluZm8oJm1GZWF0dXJlSW5mbywgaW5mbyk7CisKKyAgICBpZiAoIXBvcHVsYXRlRmVhdHVyZVZhbHVlRnJvbUZlYXR1cmVSZXBvcnQoJm1GZWF0dXJlSW5mbywgcGFja2V0cykpIHsKKyAgICAgICAgTE9HX0UgPDwgInBvcHVsYXRlIGZlYXR1cmUgZnJvbSBmZWF0dXJlIHJlcG9ydCBmYWlsZWQiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFmaW5kU2Vuc29yQ29udHJvbFVzYWdlKHBhY2tldHMpKSB7CisgICAgICAgIExPR19FIDw8ICJmaW5kaW5nIHNlbnNvciBjb250cm9sIHVzYWdlIGZhaWxlZCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBidWlsZCB0cmFuc2xhdGlvbiB0YWJsZQorICAgIGJvb2wgdHJhbnNsYXRpb25UYWJsZVZhbGlkID0gZmFsc2U7CisgICAgc3dpdGNoICh1c2FnZSkgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlNlbnNvclR5cGVVc2FnZTsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpSZXBvcnRVc2FnZTsKKyAgICAgICAgY2FzZSBBQ0NFTEVST01FVEVSXzNEOgorICAgICAgICAgICAgLy8gSGlkIHVuaXQgZGVmYXVsdCBnCisgICAgICAgICAgICAvLyBBbmRyb2lkIHVuaXQgbS9zXjIKKyAgICAgICAgICAgIC8vIDFnID0gOS44MSBtL3NeMgorICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcgPSBTRU5TT1JfU1RSSU5HX1RZUEVfQUNDRUxFUk9NRVRFUjsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUjsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc1dha2VVcCA9IGZhbHNlOworCisgICAgICAgICAgICB0cmFuc2xhdGlvblRhYmxlVmFsaWQgPSBwcm9jZXNzVHJpQXhpc1VzYWdlKHBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDQ0VMRVJBVElPTl9YX0FYSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDQ0VMRVJBVElPTl9ZX0FYSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDQ0VMRVJBVElPTl9aX0FYSVMsIDkuODEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1lST01FVEVSXzNEOgorICAgICAgICAgICAgLy8gSGlkIHVuaXQgZGVmYXVsdCBkZWdyZWUvcworICAgICAgICAgICAgLy8gQW5kcm9pZCB1bml0IHJhZC9zCisgICAgICAgICAgICAvLyAxIGRlZ3JlZS9zID0gcGkvMTgwIHJhZC9zCisgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9HWVJPU0NPUEU7CisgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZSA9IFNFTlNPUl9UWVBFX0dZUk9TQ09QRTsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc1dha2VVcCA9IGZhbHNlOworCisgICAgICAgICAgICB0cmFuc2xhdGlvblRhYmxlVmFsaWQgPSBwcm9jZXNzVHJpQXhpc1VzYWdlKHBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOR1VMQVJfVkVMT0NJVFlfWF9BWElTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkdVTEFSX1ZFTE9DSVRZX1lfQVhJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5HVUxBUl9WRUxPQ0lUWV9aX0FYSVMsIE1fUEkvMTgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTVBBU1NfM0Q6IHsKKyAgICAgICAgICAgIC8vIEhpZCB1bml0IGRlZmF1bHQgbUdhdXNzCisgICAgICAgICAgICAvLyBBbmRyb2lkIHVuaXQgdVQKKyAgICAgICAgICAgIC8vIDF1VCAgPSAwLjEgbkdhdXNzCisgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9NQUdORVRJQ19GSUVMRDsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQ7CisKKyAgICAgICAgICAgIGlmICghcHJvY2Vzc1RyaUF4aXNVc2FnZShwYWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BR05FVElDX0ZMVVhfWF9BWElTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BR05FVElDX0ZMVVhfWV9BWElTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BR05FVElDX0ZMVVhfWl9BWElTLCAwLjEpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKnBSZXBvcnRBY2N1cmFjeSA9IGZpbmQocGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BR05FVE9NRVRFUl9BQ0NVUkFDWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfSU5QVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRSZXBvcnRJZCk7CisKKyAgICAgICAgICAgIGlmIChwUmVwb3J0QWNjdXJhY3kgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJDYW5ub3QgZmluZCBhY2N1cmFjeSBmaWVsZCBpbiB1c2FnZSAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgdXNhZ2UgPDwgc3RkOjpkZWMgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBSZXBvcnRBY2N1cmFjeS0+aXNCeXRlQWxpZ25lZCgpKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkFjY3VyYWN5IGZpZWxkIG11c3QgYWxpZ24gdG8gYnl0ZSIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFJlcG9ydEFjY3VyYWN5LT5taW5SYXcgIT0gMCB8fCBwUmVwb3J0QWNjdXJhY3ktPm1heFJhdyAhPSAyKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkFjY3VyYWN5IGZpZWxkIHZhbHVlIHJhbmdlIG11c3QgYmUgWzAsIDJdIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlcG9ydFRyYW5zbGF0ZVJlY29yZCBhY2N1cmFjeVJlY29yZCA9IHsKKyAgICAgICAgICAgICAgICAudHlwZSA9IFRZUEVfQUNDVVJBQ1ksCisgICAgICAgICAgICAgICAgLm1heFZhbHVlID0gMiwKKyAgICAgICAgICAgICAgICAubWluVmFsdWUgPSAwLAorICAgICAgICAgICAgICAgIC5ieXRlT2Zmc2V0ID0gcFJlcG9ydEFjY3VyYWN5LT5iaXRPZmZzZXQgLyA4LAorICAgICAgICAgICAgICAgIC5ieXRlU2l6ZSA9IHBSZXBvcnRBY2N1cmFjeS0+Yml0U2l6ZSAvIDgsCisgICAgICAgICAgICAgICAgLmEgPSAxLAorICAgICAgICAgICAgICAgIC5iID0gMX07CisgICAgICAgICAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKGFjY3VyYWN5UmVjb3JkKTsKKyAgICAgICAgICAgIHRyYW5zbGF0aW9uVGFibGVWYWxpZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERFVklDRV9PUklFTlRBVElPTjoKKyAgICAgICAgICAgIHRyYW5zbGF0aW9uVGFibGVWYWxpZCA9IHByb2Nlc3NRdWF0ZXJuaW9uVXNhZ2UocGFja2V0cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVVNUT006IHsKKyAgICAgICAgICAgIGlmICghbUZlYXR1cmVJbmZvLmlzQW5kcm9pZEN1c3RvbSkgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJJbnZhbGlkIGFuZHJvaWQgY3VzdG9tIHNlbnNvciIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqcFBhY2tldCA9IG51bGxwdHI7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB1c2FnZXNbXSA9IHsKKyAgICAgICAgICAgICAgICBDVVNUT01fVkFMVUVfMSwgQ1VTVE9NX1ZBTFVFXzIsIENVU1RPTV9WQUxVRV8zLAorICAgICAgICAgICAgICAgIENVU1RPTV9WQUxVRV80LCBDVVNUT01fVkFMVUVfNSwgQ1VTVE9NX1ZBTFVFXzYKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhY2tldCA6IHBhY2tldHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFja2V0LnR5cGUgPT0gSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9JTlBVVCAmJiBzdGQ6OmFueV9vZigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC5yZXBvcnRzLmJlZ2luKCksIHBhY2tldC5yZXBvcnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZ1c2FnZXNdIChjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gJmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKHN0ZDo6YmVnaW4odXNhZ2VzKSwgc3RkOjplbmQodXNhZ2VzKSwgZC51c2FnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHN0ZDo6ZW5kKHVzYWdlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KSkgeworICAgICAgICAgICAgICAgICAgICBwUGFja2V0ID0gJnBhY2tldDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocFBhY2tldCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkNhbm5vdCBmaW5kIENVU1RPTV9WQUxVRV9YIGluIGN1c3RvbSBzZW5zb3IiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkb3VibGUgcmFuZ2UgPSAwOworICAgICAgICAgICAgZG91YmxlIHJlc29sdXRpb24gPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRpZ2VzdCA6IHBQYWNrZXQtPnJlcG9ydHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlnZXN0Lm1pblJhdyA+PSBkaWdlc3QubWF4UmF3KSB7CisgICAgICAgICAgICAgICAgICAgIExPR19FIDw8ICJDdXN0b21lIHVzYWdlICIgPDwgZGlnZXN0LnVzYWdlIDw8ICIsIG1pbiBtdXN0IDwgbWF4IiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghZGlnZXN0LmlzQnl0ZUFsaWduZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRpZ2VzdC5iaXRTaXplICE9IDggJiYgZGlnZXN0LmJpdFNpemUgIT0gMTYgJiYgZGlnZXN0LmJpdFNpemUgIT0gMzIpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR19FIDw8ICJDdXN0b21lIHVzYWdlICIgPDwgc3RkOjpoZXggPDwgZGlnZXN0LnVzYWdlIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGVhY2ggaW5wdXQgbXVzdCBiZSA4LzE2LzMyIGJpdHMgYW5kIG11c3QgYWxpZ24gdG8gYnl0ZSBib3VuZGFyeSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBSZXBvcnRUcmFuc2xhdGVSZWNvcmQgcmVjb3JkID0geworICAgICAgICAgICAgICAgICAgICAubWluVmFsdWUgPSBkaWdlc3QubWluUmF3LAorICAgICAgICAgICAgICAgICAgICAubWF4VmFsdWUgPSBkaWdlc3QubWF4UmF3LAorICAgICAgICAgICAgICAgICAgICAuYnl0ZU9mZnNldCA9IGRpZ2VzdC5iaXRPZmZzZXQgLyA4LAorICAgICAgICAgICAgICAgICAgICAuYnl0ZVNpemUgPSBkaWdlc3QuYml0U2l6ZSAvIDgsCisgICAgICAgICAgICAgICAgICAgIC5hID0gZGlnZXN0LmEsCisgICAgICAgICAgICAgICAgICAgIC5iID0gZGlnZXN0LmIsCisgICAgICAgICAgICAgICAgICAgIC50eXBlID0gVFlQRV9GTE9BVAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiByYW5nZSBhbmQgcmVzb2x1dGlvbgorICAgICAgICAgICAgICAgIHJhbmdlID0gc3RkOjptYXgoc3RkOjptYXgoc3RkOjphYnMoKGRpZ2VzdC5tYXhSYXcgKyBkaWdlc3QuYikgKiBkaWdlc3QuYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFicygoZGlnZXN0Lm1pblJhdyArIGRpZ2VzdC5iKSAqIGRpZ2VzdC5hKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSk7CisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHN0ZDo6bWluKGRpZ2VzdC5hLCByZXNvbHV0aW9uKTsKKworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGlnZXN0LmNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2xhdGVUYWJsZS5zaXplKCkgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19JIDw8ICJDdXN0b20gdXNhZ2UgaGFzIG1vcmUgdGhhbiAxNiBpbnB1dHMsIGlnbm9yZSB0aGUgcmVzdCIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZWNvcmQuaW5kZXggPSBtVHJhbnNsYXRlVGFibGUuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKHJlY29yZCk7CisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5ieXRlT2Zmc2V0ICs9IGRpZ2VzdC5iaXRTaXplIC8gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2xhdGVUYWJsZS5zaXplKCkgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZlYXR1cmVJbmZvLm1heFJhbmdlID0gcmFuZ2U7CisgICAgICAgICAgICBtRmVhdHVyZUluZm8ucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgICBtSW5wdXRSZXBvcnRJZCA9IHBQYWNrZXQtPmlkOworICAgICAgICAgICAgdHJhbnNsYXRpb25UYWJsZVZhbGlkID0gIW1UcmFuc2xhdGVUYWJsZS5lbXB0eSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19JIDw8ICJ1bnN1cHBvcnRlZCBzZW5zb3IgdXNhZ2UgIiA8PCB1c2FnZSA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICBib29sIHNlbnNvclZhbGlkID0gdmFsaWRhdGVGZWF0dXJlVmFsdWVBbmRCdWlsZFNlbnNvcigpOworICAgIG1WYWxpZCA9IHRyYW5zbGF0aW9uVGFibGVWYWxpZCAmJiBzZW5zb3JWYWxpZDsKKyAgICBMT0dfViA8PCAiSGlkUmF3U2Vuc29yIGluaXQsIHRyYW5zbGF0aW9uVGFibGVWYWxpZDogIiA8PCB0cmFuc2xhdGlvblRhYmxlVmFsaWQKKyAgICAgICAgICA8PCAiLCBzZW5zb3JWYWxpZDogIiA8PCBzZW5zb3JWYWxpZCA8PCBMT0dfRU5ETDsKK30KKworYm9vbCBIaWRSYXdTZW5zb3I6OnByb2Nlc3NRdWF0ZXJuaW9uVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKSB7CisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpwUmVwb3J0UXVhdGVybmlvbgorICAgICAgICAgICAgPSBmaW5kKHBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgSGlkOjpTZW5zb3I6OlJlcG9ydFVzYWdlOjpPUklFTlRBVElPTl9RVUFURVJOSU9OLAorICAgICAgICAgICAgICAgICAgIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfSU5QVVQpOworCisgICAgaWYgKHBSZXBvcnRRdWF0ZXJuaW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAmcXVhdCA9ICpwUmVwb3J0UXVhdGVybmlvbjsKKyAgICBpZiAoKHF1YXQuYml0U2l6ZSAhPSAxNiAmJiBxdWF0LmJpdFNpemUgIT0gMzIpIHx8ICFxdWF0LmlzQnl0ZUFsaWduZWQoKSkgeworICAgICAgICBMT0dfRSA8PCAiUXVhdGVybmlvbiB1c2FnZSBpbnB1dCBtdXN0IGJlIDE2IG9yIDMyIGJpdHMgYW5kIGFsaWduZWQgYXQgYnl0ZSBib3VuZGFyeSIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkb3VibGUgbWluLCBtYXg7CisgICAgcXVhdC5kZWNvZGUocXVhdC5tYXNrKHF1YXQubWluUmF3KSwgJm1pbik7CisgICAgcXVhdC5kZWNvZGUocXVhdC5tYXNrKHF1YXQubWF4UmF3KSwgJm1heCk7CisgICAgaWYgKHF1YXQuY291bnQgIT0gNCB8fCBtaW4gPiAtMSB8fCBtYXggPCAxKSB7CisgICAgICAgIExPR19FIDw8ICJRdWF0ZXJuaW9uIHVzYWdlIG5lZWQgNCBpbnB1dHMgd2l0aCByYW5nZSBbLTEsIDFdIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChxdWF0Lm1pblJhdyA+IHF1YXQubWF4UmF3KSB7CisgICAgICAgIExPR19FIDw8ICJRdWF0ZXJuaW9uIHVzYWdlIG1pbiBtdXN0IDw9IG1heCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBSZXBvcnRUcmFuc2xhdGVSZWNvcmQgcmVjb3JkID0geworICAgICAgICAubWluVmFsdWUgPSBxdWF0Lm1pblJhdywKKyAgICAgICAgLm1heFZhbHVlID0gcXVhdC5tYXhSYXcsCisgICAgICAgIC5ieXRlT2Zmc2V0ID0gcXVhdC5iaXRPZmZzZXQgLyA4LAorICAgICAgICAuYnl0ZVNpemUgPSBxdWF0LmJpdFNpemUgLyA4LAorICAgICAgICAuYiA9IHF1YXQuYiwKKyAgICAgICAgLnR5cGUgPSBUWVBFX0ZMT0FULAorICAgIH07CisKKyAgICAvLyBBbmRyb2lkIFggWSBaIG1hcHMgdG8gSElEIFggLVogWQorICAgIC8vIEFuZHJvaWQgb3JkZXIgeHl6dywgSElEIG9yZGVyIHd4eXoKKyAgICAvLyBYCisgICAgcmVjb3JkLmluZGV4ID0gMDsKKyAgICByZWNvcmQuYSA9IHF1YXQuYTsKKyAgICByZWNvcmQuYnl0ZU9mZnNldCA9IChxdWF0LmJpdE9mZnNldCArIHF1YXQuYml0U2l6ZSkgLyA4OworICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2socmVjb3JkKTsKKyAgICAvLyBZCisgICAgcmVjb3JkLmluZGV4ID0gMTsKKyAgICByZWNvcmQuYSA9IC1xdWF0LmE7CisgICAgcmVjb3JkLmJ5dGVPZmZzZXQgPSAocXVhdC5iaXRPZmZzZXQgKyAzICogcXVhdC5iaXRTaXplKSAvIDg7CisgICAgbVRyYW5zbGF0ZVRhYmxlLnB1c2hfYmFjayhyZWNvcmQpOworICAgIC8vIFoKKyAgICByZWNvcmQuaW5kZXggPSAyOworICAgIHJlY29yZC5hID0gcXVhdC5hOworICAgIHJlY29yZC5ieXRlT2Zmc2V0ID0gKHF1YXQuYml0T2Zmc2V0ICsgMiAqIHF1YXQuYml0U2l6ZSkgLyA4OworICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2socmVjb3JkKTsKKyAgICAvLyBXCisgICAgcmVjb3JkLmluZGV4ID0gMzsKKyAgICByZWNvcmQuYSA9IHF1YXQuYTsKKyAgICByZWNvcmQuYnl0ZU9mZnNldCA9IHF1YXQuYml0T2Zmc2V0IC8gODsKKyAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKHJlY29yZCk7CisKKyAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9ST1RBVElPTl9WRUNUT1I7CisgICAgbUZlYXR1cmVJbmZvLnR5cGUgPSBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1I7CisgICAgbUZlYXR1cmVJbmZvLm1heFJhbmdlID0gMTsKKyAgICBtRmVhdHVyZUluZm8ucmVzb2x1dGlvbiA9IHF1YXQuYTsKKyAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPSBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREU7CisKKyAgICBtSW5wdXRSZXBvcnRJZCA9IHF1YXQuaWQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRSYXdTZW5zb3I6OnByb2Nlc3NUcmlBeGlzVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzLAorICAgICAgICB1aW50MzJfdCB1c2FnZVgsIHVpbnQzMl90IHVzYWdlWSwgdWludDMyX3QgdXNhZ2VaLCBkb3VibGUgZGVmYXVsdFNjYWxpbmcpIHsKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKnBSZXBvcnRYID0gZmluZChwYWNrZXRzLCB1c2FnZVgsIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfSU5QVVQpOworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAqcFJlcG9ydFkgPSBmaW5kKHBhY2tldHMsIHVzYWdlWSwgSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9JTlBVVCk7CisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpwUmVwb3J0WiA9IGZpbmQocGFja2V0cywgdXNhZ2VaLCBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0lOUFVUKTsKKworICAgIGlmIChwUmVwb3J0WCA9PSBudWxscHRyIHx8IHBSZXBvcnRZID09IG51bGxwdHJ8fCBwUmVwb3J0WiA9PSBudWxscHRyKSB7CisgICAgICAgIExPR19FIDw8ICJUaHJlZSBheGlzIHNlbnNvciBkb2VzIG5vdCBmaW5kIGFsbCAzIGF4aXMiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICZyZXBvcnRYID0gKnBSZXBvcnRYOworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAmcmVwb3J0WSA9ICpwUmVwb3J0WTsKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gJnJlcG9ydFogPSAqcFJlcG9ydFo7CisgICAgaWYgKHJlcG9ydFguaWQgIT0gcmVwb3J0WS5pZCB8fCByZXBvcnRZLmlkICE9IHJlcG9ydFouaWQpIHsKKyAgICAgICAgTE9HX0UgPDwgIkFsbCAzIGF4aXMgc2hvdWxkIGJlIGluIHRoZSBzYW1lIHJlcG9ydCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHJlcG9ydFgubWluUmF3ID49IHJlcG9ydFgubWF4UmF3CisgICAgICAgICAgICB8fCByZXBvcnRYLm1pblJhdyAhPSByZXBvcnRZLm1pblJhdworICAgICAgICAgICAgfHwgcmVwb3J0WC5tYXhSYXcgIT0gcmVwb3J0WS5tYXhSYXcKKyAgICAgICAgICAgIHx8IHJlcG9ydFkubWluUmF3ICE9IHJlcG9ydFoubWluUmF3CisgICAgICAgICAgICB8fCByZXBvcnRZLm1heFJhdyAhPSByZXBvcnRaLm1heFJhdykgeworICAgICAgICBMT0dfRSA8PCAiQWxsIDMgYXhpcyBzaG91bGQgaGF2ZSBzYW1lIG1pbiBhbmQgbWF4IHZhbHVlIGFuZCBtaW4gbXVzdCA8IG1heCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHJlcG9ydFguYSAhPSByZXBvcnRZLmEgfHwgcmVwb3J0WS5hICE9IHJlcG9ydFkuYSkgeworICAgICAgICBMT0dfRSA8PCAiQWxsIDMgYXhpcyBzaG91bGQgaGF2ZSBzYW1lIHJlc29sdXRpb24iIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChyZXBvcnRYLmNvdW50ICE9IDEgfHwgcmVwb3J0WS5jb3VudCAhPSAxIHx8IHJlcG9ydFouY291bnQgIT0gMQorICAgICAgICAgICAgfHwgKHJlcG9ydFguYml0U2l6ZSAhPSAxNiAmJiByZXBvcnRYLmJpdFNpemUgIT0gMzIpCisgICAgICAgICAgICB8fCByZXBvcnRYLmJpdFNpemUgIT0gcmVwb3J0WS5iaXRTaXplIHx8IHJlcG9ydFkuYml0U2l6ZSAhPSByZXBvcnRaLmJpdFNpemUKKyAgICAgICAgICAgIHx8ICFyZXBvcnRYLmlzQnl0ZUFsaWduZWQoKQorICAgICAgICAgICAgfHwgIXJlcG9ydFkuaXNCeXRlQWxpZ25lZCgpCisgICAgICAgICAgICB8fCAhcmVwb3J0Wi5pc0J5dGVBbGlnbmVkKCkgKSB7CisgICAgICAgIExPR19FIDw8ICJBbGwgMyBheGlzIHNob3VsZCBoYXZlIGNvdW50ID09IDEsIHNhbWUgc2l6ZSA9PSAxNiBvciAzMiAiCisgICAgICAgICAgICAgICJhbmQgYWxpZ24gYXQgYnl0ZSBib3VuZGFyeSIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAocmVwb3J0WC51bml0ICE9IDAgfHwgcmVwb3J0WS51bml0ICE9IDAgfHwgcmVwb3J0Wi51bml0ICE9IDApIHsKKyAgICAgICAgTE9HX0UgPDwgIlNwZWNpZmllZCB1bml0IGZvciB1c2FnZSBpcyBub3Qgc3VwcG9ydGVkIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChyZXBvcnRYLmEgIT0gcmVwb3J0WS5hIHx8IHJlcG9ydFkuYSAhPSByZXBvcnRaLmEKKyAgICAgICAgfHwgcmVwb3J0WC5iICE9IHJlcG9ydFkuYiB8fCByZXBvcnRZLmIgIT0gcmVwb3J0Wi5iKSB7CisgICAgICAgIExPR19XIDw8ICJTY2FsaW5nIGZvciAzIGF4aXMgYXJlIGRpZmZlcmVudC4gSXQgaXMgcmVjb21tZW5kZWQgdG8ga2VlcCB0aGVtIHRoZSBzYW1lIiA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICAvLyBzZXQgZmVhdHVyZXMKKyAgICBtRmVhdHVyZUluZm8ubWF4UmFuZ2UgPSBzdGQ6Om1heCgKKyAgICAgICAgc3RkOjphYnMoKHJlcG9ydFgubWF4UmF3ICsgcmVwb3J0WC5iKSAqIHJlcG9ydFguYSksCisgICAgICAgIHN0ZDo6YWJzKChyZXBvcnRYLm1pblJhdyArIHJlcG9ydFguYikgKiByZXBvcnRYLmEpKTsKKyAgICBtRmVhdHVyZUluZm8ucmVzb2x1dGlvbiA9IHJlcG9ydFguYSAqIGRlZmF1bHRTY2FsaW5nOworICAgIG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyA9IFNFTlNPUl9GTEFHX0NPTlRJTlVPVVNfTU9ERTsKKworICAgIFJlcG9ydFRyYW5zbGF0ZVJlY29yZCByZWNvcmQgPSB7CisgICAgICAgIC5taW5WYWx1ZSA9IHJlcG9ydFgubWluUmF3LAorICAgICAgICAubWF4VmFsdWUgPSByZXBvcnRYLm1heFJhdywKKyAgICAgICAgLmJ5dGVTaXplID0gcmVwb3J0WC5iaXRTaXplIC8gOCwKKyAgICAgICAgLnR5cGUgPSBUWVBFX0ZMT0FUCisgICAgfTsKKworICAgIC8vIFJlb3JkZXIgYW5kIHN3YXAgYXhpcworICAgIC8vCisgICAgLy8gSElEIGNsYXNzIGRldmljZXMgYXJlIGVuY291cmFnZWQsIHdoZXJlIHBvc3NpYmxlLCB0byB1c2UgYSByaWdodC1oYW5kZWQKKyAgICAvLyBjb29yZGluYXRlIHN5c3RlbS4gSWYgYSB1c2VyIGlzIGZhY2luZyBhIGRldmljZSwgcmVwb3J0IHZhbHVlcyBzaG91bGQgaW5jcmVhc2UgYXMKKyAgICAvLyBjb250cm9scyBhcmUgbW92ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IChYKSwgZnJvbSBmYXIgdG8gbmVhciAoWSkgYW5kIGZyb20gaGlnaCB0bworICAgIC8vIGxvdyAoWikuCisgICAgLy8KKworICAgIC8vIEFuZHJvaWQgWCBheGlzID0gSGlkIFggYXhpcworICAgIHJlY29yZC5pbmRleCA9IDA7CisgICAgcmVjb3JkLmEgPSByZXBvcnRYLmEgKiBkZWZhdWx0U2NhbGluZzsKKyAgICByZWNvcmQuYiA9IHJlcG9ydFguYjsKKyAgICByZWNvcmQuYnl0ZU9mZnNldCA9IHJlcG9ydFguYml0T2Zmc2V0IC8gODsKKyAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKHJlY29yZCk7CisKKyAgICAvLyBBbmRyb2lkIFkgYXhpcyA9IC0gSGlkIFogYXhpcworICAgIHJlY29yZC5pbmRleCA9IDE7CisgICAgcmVjb3JkLmEgPSAtcmVwb3J0Wi5hICogZGVmYXVsdFNjYWxpbmc7CisgICAgcmVjb3JkLmIgPSByZXBvcnRaLmI7CisgICAgcmVjb3JkLmJ5dGVPZmZzZXQgPSByZXBvcnRaLmJpdE9mZnNldCAvIDg7CisgICAgbVRyYW5zbGF0ZVRhYmxlLnB1c2hfYmFjayhyZWNvcmQpOworCisgICAgLy8gQW5kcm9pZCBaIGF4aXMgPSBIaWQgWSBheGlzCisgICAgcmVjb3JkLmluZGV4ID0gMjsKKyAgICByZWNvcmQuYSA9IHJlcG9ydFkuYSAqIGRlZmF1bHRTY2FsaW5nOworICAgIHJlY29yZC5iID0gcmVwb3J0WS5iOworICAgIHJlY29yZC5ieXRlT2Zmc2V0ID0gcmVwb3J0WS5iaXRPZmZzZXQgLyA4OworICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2socmVjb3JkKTsKKworICAgIG1JbnB1dFJlcG9ydElkID0gcmVwb3J0WC5pZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpIaWRSYXdTZW5zb3I6OmZpbmQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0PiAmcGFja2V0cywKKyAgICAgICAgdW5zaWduZWQgaW50IHVzYWdlLCBpbnQgdHlwZSwgaW50IGlkKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZwYWNrZXQgOiBwYWNrZXRzKSB7CisgICAgICAgIGlmIChwYWNrZXQudHlwZSAhPSB0eXBlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGkgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgcGFja2V0LnJlcG9ydHMuYmVnaW4oKSwgcGFja2V0LnJlcG9ydHMuZW5kKCksCisgICAgICAgICAgICAgICAgW3VzYWdlLCBpZF0oY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICZwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLnVzYWdlID09IHVzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGlkID09IC0xIHx8IHAuaWQgPT0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpZCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaSAhPSBwYWNrZXQucmVwb3J0cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuICYoKmkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfTsKKwordm9pZCBIaWRSYXdTZW5zb3I6OmluaXRGZWF0dXJlVmFsdWVGcm9tSGlkRGV2aWNlSW5mbygKKyAgICAgICAgRmVhdHVyZVZhbHVlICpmZWF0dXJlVmFsdWUsIGNvbnN0IEhpZERldmljZTo6SGlkRGV2aWNlSW5mbyAmaW5mbykgeworICAgIGZlYXR1cmVWYWx1ZS0+bmFtZSA9IGluZm8ubmFtZTsKKworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBpbmZvLmJ1c1R5cGUgPDwgIiAiCisgICAgICAgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDQpIDw8IGluZm8udmVuZG9ySWQKKyAgICAgICA8PCAiOiIgPDwgc3RkOjpzZXR3KDQpIDw8IGluZm8ucHJvZHVjdElkOworICAgIGZlYXR1cmVWYWx1ZS0+dmVuZG9yID0gc3Muc3RyKCk7CisKKyAgICBmZWF0dXJlVmFsdWUtPnBlcm1pc3Npb24gPSAiIjsKKyAgICBmZWF0dXJlVmFsdWUtPnR5cGVTdHJpbmcgPSAiIjsKKyAgICBmZWF0dXJlVmFsdWUtPnR5cGUgPSAtMTsgLy8gaW52YWxpZCB0eXBlCisgICAgZmVhdHVyZVZhbHVlLT52ZXJzaW9uID0gMTsKKworICAgIGZlYXR1cmVWYWx1ZS0+bWF4UmFuZ2UgPSAtMS5mOworICAgIGZlYXR1cmVWYWx1ZS0+cmVzb2x1dGlvbiA9IEZMVF9NQVg7CisgICAgZmVhdHVyZVZhbHVlLT5wb3dlciA9IDEuZjsgLy8gZGVmYXVsdCB2YWx1ZSwgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHNvdXJjZSB5ZXQKKworICAgIGZlYXR1cmVWYWx1ZS0+bWluRGVsYXkgPSAwOworICAgIGZlYXR1cmVWYWx1ZS0+bWF4RGVsYXkgPSAwOworCisgICAgZmVhdHVyZVZhbHVlLT5maWZvU2l6ZSA9IDA7CisgICAgZmVhdHVyZVZhbHVlLT5maWZvTWF4U2l6ZSA9IDA7CisKKyAgICBmZWF0dXJlVmFsdWUtPnJlcG9ydE1vZGVGbGFnID0gU0VOU09SX0ZMQUdfU1BFQ0lBTF9SRVBPUlRJTkdfTU9ERTsKKyAgICBmZWF0dXJlVmFsdWUtPmlzV2FrZVVwID0gZmFsc2U7CisgICAgbWVtc2V0KGZlYXR1cmVWYWx1ZS0+dXVpZCwgMCwgc2l6ZW9mKGZlYXR1cmVWYWx1ZS0+dXVpZCkpOworICAgIGZlYXR1cmVWYWx1ZS0+aXNBbmRyb2lkQ3VzdG9tID0gZmFsc2U7Cit9CisKK2Jvb2wgSGlkUmF3U2Vuc29yOjpwb3B1bGF0ZUZlYXR1cmVWYWx1ZUZyb21GZWF0dXJlUmVwb3J0KAorICAgICAgICBGZWF0dXJlVmFsdWUgKmZlYXR1cmVWYWx1ZSwgY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKSB7CisgICAgU1AoSGlkRGV2aWNlKSBkZXZpY2UgPSBQUk9NT1RFKG1EZXZpY2UpOworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyOworICAgIGZvciAoY29uc3QgYXV0byAmcGFja2V0IDogcGFja2V0cykgeworICAgICAgICBpZiAocGFja2V0LnR5cGUgIT0gSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9GRUFUVVJFKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZGV2aWNlLT5nZXRGZWF0dXJlKHBhY2tldC5pZCwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICB1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlByb3BlcnR5VXNhZ2U7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmIHIgOiBwYWNrZXQucmVwb3J0cykgeworICAgICAgICAgICAgc3dpdGNoIChyLnVzYWdlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGUklFTkRMWV9OQU1FOgorICAgICAgICAgICAgICAgICAgICBpZiAoIXIuaXNCeXRlQWxpZ25lZCgpIHx8IHIuYml0U2l6ZSAhPSAxNiB8fCByLmNvdW50IDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCBmcmllbmRseSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlU3RyaW5nKHIsIGJ1ZmZlciwgJnN0cikgJiYgIXN0ci5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWUtPm5hbWUgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfTUFOVUZBQ1RVUkVSOgorICAgICAgICAgICAgICAgICAgICBpZiAoIXIuaXNCeXRlQWxpZ25lZCgpIHx8IHIuYml0U2l6ZSAhPSAxNiB8fCByLmNvdW50IDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCBtYW51ZmFjdHVyZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVTdHJpbmcociwgYnVmZmVyLCAmc3RyKSAmJiAhc3RyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZS0+dmVuZG9yID0gc3RyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUEVSU0lTVEVOVF9VTklRVUVfSUQ6CisgICAgICAgICAgICAgICAgICAgIGlmICghci5pc0J5dGVBbGlnbmVkKCkgfHwgci5iaXRTaXplICE9IDE2IHx8IHIuY291bnQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIHVuaXF1ZSBpZCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVTdHJpbmcociwgYnVmZmVyLCAmc3RyKSAmJiAhc3RyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZS0+dW5pcXVlSWQgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfREVTQ1JJUFRJT046CisgICAgICAgICAgICAgICAgICAgIGlmICghci5pc0J5dGVBbGlnbmVkKCkgfHwgci5iaXRTaXplICE9IDE2IHx8IHIuY291bnQgPCAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHIuYml0T2Zmc2V0IC8gOCArIHIuY291bnQgKiAyKSA+IGJ1ZmZlci5zaXplKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlU3RyaW5nKHIsIGJ1ZmZlciwgJnN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc0FuZHJvaWRDdXN0b20gPSBkZXRlY3RBbmRyb2lkQ3VzdG9tU2Vuc29yKHN0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGNhcmUgYWJvdXQgb3RoZXJzCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhpZFJhd1NlbnNvcjo6dmFsaWRhdGVGZWF0dXJlVmFsdWVBbmRCdWlsZFNlbnNvcigpIHsKKyAgICBpZiAobUZlYXR1cmVJbmZvLm5hbWUuZW1wdHkoKSB8fCBtRmVhdHVyZUluZm8udmVuZG9yLmVtcHR5KCkgfHwgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcuZW1wdHkoKQorICAgICAgICAgICAgfHwgbUZlYXR1cmVJbmZvLnR5cGUgPD0gMCB8fCBtRmVhdHVyZUluZm8ubWF4UmFuZ2UgPD0gMAorICAgICAgICAgICAgfHwgbUZlYXR1cmVJbmZvLnJlc29sdXRpb24gPD0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3dpdGNoIChtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcpIHsKKyAgICAgICAgY2FzZSBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREU6CisgICAgICAgIGNhc2UgU0VOU09SX0ZMQUdfT05fQ0hBTkdFX01PREU6CisgICAgICAgICAgICBpZiAobUZlYXR1cmVJbmZvLm1pbkRlbGF5IDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRmVhdHVyZUluZm8ubWF4RGVsYXkgIT0gMCAmJiBtRmVhdHVyZUluZm8ubWF4RGVsYXkgPCBtRmVhdHVyZUluZm8ubWluRGVsYXkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRU5TT1JfRkxBR19PTkVfU0hPVF9NT0RFOgorICAgICAgICAgICAgaWYgKG1GZWF0dXJlSW5mby5taW5EZWxheSAhPSAtMSAmJiBtRmVhdHVyZUluZm8ubWF4RGVsYXkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFTlNPUl9GTEFHX1NQRUNJQUxfUkVQT1JUSU5HX01PREU6CisgICAgICAgICAgICBpZiAobUZlYXR1cmVJbmZvLm1pbkRlbGF5ICE9IC0xICYmIG1GZWF0dXJlSW5mby5tYXhEZWxheSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobUZlYXR1cmVJbmZvLmZpZm9NYXhTaXplIDwgbUZlYXR1cmVJbmZvLmZpZm9TaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIHV1aWQgZmllbGQsIHVzZSBuYW1lLCB2ZW5kb3IgYW5kIHVuaXF1ZUlkCisgICAgaWYgKG1GZWF0dXJlSW5mby5uYW1lLnNpemUoKSA+PSA0CisgICAgICAgICAgICAmJiBtRmVhdHVyZUluZm8udmVuZG9yLnNpemUoKSA+PSA0CisgICAgICAgICAgICAmJiBtRmVhdHVyZUluZm8udHlwZVN0cmluZy5zaXplKCkgPj0gNAorICAgICAgICAgICAgJiYgbUZlYXR1cmVJbmZvLnVuaXF1ZUlkLnNpemUoKSA+PSA0KSB7CisgICAgICAgIHVpbnQzMl90IHRtcFs0XSwgaDsKKyAgICAgICAgc3RkOjpoYXNoPHN0ZDo6c3RyaW5nPiBzdHJpbmdIYXNoOworICAgICAgICBoID0gc3RyaW5nSGFzaChtRmVhdHVyZUluZm8udW5pcXVlSWQpOworICAgICAgICB0bXBbMF0gPSBzdHJpbmdIYXNoKG1GZWF0dXJlSW5mby5uYW1lKSBeIGg7CisgICAgICAgIHRtcFsxXSA9IHN0cmluZ0hhc2gobUZlYXR1cmVJbmZvLnZlbmRvcikgXiBoOworICAgICAgICB0bXBbMl0gPSBzdHJpbmdIYXNoKG1GZWF0dXJlSW5mby50eXBlU3RyaW5nKSBeIGg7CisgICAgICAgIHRtcFszXSA9IHRtcFswXSBeIHRtcFsxXSBeIHRtcFsyXTsKKyAgICAgICAgbWVtY3B5KG1GZWF0dXJlSW5mby51dWlkLCB0bXAsIHNpemVvZihtRmVhdHVyZUluZm8udXVpZCkpOworICAgIH0KKworICAgIG1TZW5zb3IgPSAoc2Vuc29yX3QpIHsKKyAgICAgICAgbUZlYXR1cmVJbmZvLm5hbWUuY19zdHIoKSwgICAgICAgICAgICAgICAgIC8vIG5hbWUKKyAgICAgICAgbUZlYXR1cmVJbmZvLnZlbmRvci5jX3N0cigpLCAgICAgICAgICAgICAgIC8vIHZlbmRvcgorICAgICAgICBtRmVhdHVyZUluZm8udmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbgorICAgICAgICAtMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlLCBkdW1teSBudW1iZXIgaGVyZQorICAgICAgICBtRmVhdHVyZUluZm8udHlwZSwKKyAgICAgICAgbUZlYXR1cmVJbmZvLm1heFJhbmdlLCAgICAgICAgICAgICAgICAgICAgIC8vIG1heFJhbmdlCisgICAgICAgIG1GZWF0dXJlSW5mby5yZXNvbHV0aW9uLCAgICAgICAgICAgICAgICAgICAvLyByZXNvbHV0aW9uCisgICAgICAgIG1GZWF0dXJlSW5mby5wb3dlciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3dlcgorICAgICAgICBtRmVhdHVyZUluZm8ubWluRGVsYXksICAgICAgICAgICAgICAgICAgICAgLy8gbWluRGVsYXkKKyAgICAgICAgKHVpbnQzMl90KW1GZWF0dXJlSW5mby5maWZvU2l6ZSwgICAgICAgICAgIC8vIGZpZm9SZXNlcnZlZEV2ZW50Q291bnQKKyAgICAgICAgKHVpbnQzMl90KW1GZWF0dXJlSW5mby5maWZvTWF4U2l6ZSwgICAgICAgIC8vIGZpZm9NYXhFdmVudENvdW50CisgICAgICAgIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nLmNfc3RyKCksICAgICAgICAgICAvLyB0eXBlIHN0cmluZworICAgICAgICBtRmVhdHVyZUluZm8ucGVybWlzc2lvbi5jX3N0cigpLCAgICAgICAgICAgLy8gcmVxdWlyZWRQZXJtaXNzaW9uCisgICAgICAgIChsb25nKW1GZWF0dXJlSW5mby5tYXhEZWxheSwgICAgICAgICAgICAgICAvLyBtYXhEZWxheQorICAgICAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgfCAobUZlYXR1cmVJbmZvLmlzV2FrZVVwID8gMSA6IDApLAorICAgICAgICB7IE5VTEwsIE5VTEwgfQorICAgIH07CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkUmF3U2Vuc29yOjpkZWNvZGVTdHJpbmcoCisgICAgICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAmcmVwb3J0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYnVmZmVyLCBzdGQ6OnN0cmluZyAqZCkgeworICAgIGlmICghcmVwb3J0LmlzQnl0ZUFsaWduZWQoKSB8fCByZXBvcnQuYml0U2l6ZSAhPSAxNiB8fCByZXBvcnQuY291bnQgPCAxKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gcmVwb3J0LmJpdE9mZnNldCAvIDg7CisgICAgaWYgKG9mZnNldCArIHJlcG9ydC5jb3VudCAqIDIgPiBidWZmZXIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gZGF0YShyZXBvcnQuY291bnQpOworICAgIGF1dG8gaSA9IGRhdGEuYmVnaW4oKTsKKyAgICBhdXRvIGogPSBidWZmZXIuYmVnaW4oKSArIG9mZnNldDsKKyAgICBmb3IgKCA7IGkgIT0gZGF0YS5lbmQoKTsgKytpLCBqICs9IHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgLy8gaGlkIHNwZWNpZmllZCBsaXR0bGUgZW5kaWFuCisgICAgICAgICppID0gKmogKyAoKihqICsgMSkgPDwgOCk7CisgICAgfQorICAgIHN0ZDo6d3N0cmluZyB3c3RyKGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7CisKKyAgICBzdGQ6OndzdHJpbmdfY29udmVydDxzdGQ6OmNvZGVjdnRfdXRmODx3Y2hhcl90Piwgd2NoYXJfdD4gY29udmVydGVyOworICAgICpkID0gY29udmVydGVyLnRvX2J5dGVzKHdzdHIpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3BsaXQoY29uc3Qgc3RkOjpzdHJpbmcgJnRleHQsIGNoYXIgc2VwKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKKyAgICBzaXplX3Qgc3RhcnQgPSAwLCBlbmQgPSAwOworICAgIHdoaWxlICgoZW5kID0gdGV4dC5maW5kKHNlcCwgc3RhcnQpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBpZiAoZW5kICE9IHN0YXJ0KSB7CisgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKHRleHQuc3Vic3RyKHN0YXJ0LCBlbmQgLSBzdGFydCkpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKKyAgICB9CisgICAgaWYgKGVuZCAhPSBzdGFydCkgeworICAgICAgICB0b2tlbnMucHVzaF9iYWNrKHRleHQuc3Vic3RyKHN0YXJ0KSk7CisgICAgfQorICAgIHJldHVybiB0b2tlbnM7Cit9CisKK2Jvb2wgSGlkUmF3U2Vuc29yOjpkZXRlY3RBbmRyb2lkQ3VzdG9tU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXNjcmlwdGlvbikgeworICAgIHNpemVfdCBudWxsUG9zaXRpb24gPSBkZXNjcmlwdGlvbi5maW5kKCdcMCcpOworICAgIGlmIChudWxsUG9zaXRpb24gPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXgoIiNBTkRST0lEIyIpOworICAgIGlmIChkZXNjcmlwdGlvbi5maW5kKHByZWZpeCwgbnVsbFBvc2l0aW9uICsgMSkgIT0gbnVsbFBvc2l0aW9uICsgMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc3RyKGRlc2NyaXB0aW9uLmNfc3RyKCkgKyBudWxsUG9zaXRpb24gKyAxICsgcHJlZml4LnNpemUoKSk7CisKKyAgICAvLyBGb3JtYXQgZm9yIHByZWRlZmluZWQgc2Vuc29yIHR5cGVzOgorICAgIC8vICNBTkRST0lEI25uLFtDfFh8VHxTXSxbQnwwXSxbV3xOXQorICAgIC8vIEZvcm1hdCBmb3IgdmVuZG9yIHR5cGUgc2Vuc29yCisgICAgLy8gI0FORFJPSUQjeHh4Lnl5eS56enosW0N8WHxUfFNdLFtCfDBdLFtXfE5dCisgICAgLy8KKyAgICAvLyBDOiBjb250aW51b3VzCisgICAgLy8gWDogb24tY2hhbmdlCisgICAgLy8gVDogb25lLXNob3QKKyAgICAvLyBTOiBzcGVjaWFsIHRyaWdnZXIKKyAgICAvLworICAgIC8vIEI6IGJvZHkgcGVybWlzc2lvbgorICAgIC8vIDA6IG5vIHBlcm1pc3Npb24gcmVxdWlyZWQKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2VnbWVudHM7CisgICAgc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gMDsKKyAgICB3aGlsZSAoKGVuZCA9IHN0ci5maW5kKCcsJywgc3RhcnQpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBpZiAoZW5kICE9IHN0YXJ0KSB7CisgICAgICAgICAgICBzZWdtZW50cy5wdXNoX2JhY2soc3RyLnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydCA9IGVuZCArIDE7CisgICAgfQorICAgIGlmIChlbmQgIT0gc3RhcnQpIHsKKyAgICAgICAgc2VnbWVudHMucHVzaF9iYWNrKHN0ci5zdWJzdHIoc3RhcnQpKTsKKyAgICB9CisKKyAgICBpZiAoc2VnbWVudHMuc2l6ZSgpIDwgNCkgeworICAgICAgICBMT0dfRSA8PCAiTm90IGVub3VnaCBzZWdtZW50cyBpbiBhbmRyb2lkIGN1c3RvbSBkZXNjcmlwdGlvbiIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyB0eXBlCisgICAgYm9vbCB0eXBlUGFyc2VkID0gZmFsc2U7CisgICAgaWYgKCFzZWdtZW50c1swXS5lbXB0eSgpKSB7CisgICAgICAgIGlmICg6OmlzZGlnaXQoc2VnbWVudHNbMF1bMF0pKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IDo6YXRvaShzZWdtZW50c1swXS5jX3N0cigpKTsKKyAgICAgICAgICAgIC8vIGFsbCBzdXBwb3J0ZWQgdHlwZXMgaGVyZQorICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfVFlQRV9IRUFSVF9SQVRFOgorICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZSA9IFNFTlNPUl9UWVBFX0hFQVJUX1JBVEU7CisgICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nID0gU0VOU09SX1NUUklOR19UWVBFX0hFQVJUX1JBVEU7CisgICAgICAgICAgICAgICAgICAgIHR5cGVQYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX0FNQklFTlRfVEVNUEVSQVRVUkU6CisgICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRTsKKyAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcgPSBTRU5TT1JfU1RSSU5HX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfVFlQRV9MSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGUgPSBTRU5TT1JfVFlQRV9MSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcgPSBTRU5TT1JfU1RSSU5HX1RZUEVfTElHSFQ7CisgICAgICAgICAgICAgICAgICAgIHR5cGVQYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX1BSRVNTVVJFOgorICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZSA9IFNFTlNPUl9UWVBFX1BSRVNTVVJFOworICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9QUkVTU1VSRTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR19XIDw8ICJBbmRyb2lkIHR5cGUgIiA8PCB0eXBlIDw8ICIgaGFzIG5vdCBiZWVuIHN1cHBvcnRlZCB5ZXQiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGFzc3VtZSBhIHh4eC55eXkuenp6IGZvcm1hdAorICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHM7CisgICAgICAgICAgICBib29sIGxhc3RJc0RvdCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGF1dG8gYyA6IHNlZ21lbnRzWzBdKSB7CisgICAgICAgICAgICAgICAgaWYgKDo6aXNhbHBoYShjKSkgeworICAgICAgICAgICAgICAgICAgICBzIDw8IHN0YXRpY19jYXN0PGNoYXI+KGMpOworICAgICAgICAgICAgICAgICAgICBsYXN0SXNEb3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFsYXN0SXNEb3QgJiYgYyA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCBzdGF0aWNfY2FzdDxjaGFyPihjKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdElzRG90ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy5zdHIoKSA9PSBzZWdtZW50c1swXSkgeworICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfREVWSUNFX1BSSVZBVEVfQkFTRTsKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IENVU1RPTV9UWVBFX1BSRUZJWCArIHMuc3RyKCk7CisgICAgICAgICAgICAgICAgdHlwZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZXBvcnRpbmcgdHlwZQorICAgIGJvb2wgcmVwb3J0aW5nTW9kZVBhcnNlZCA9IGZhbHNlOworICAgIGlmIChzZWdtZW50c1sxXS5zaXplKCkgPT0gMSkgeworICAgICAgICBzd2l0Y2ggKHNlZ21lbnRzWzFdWzBdKSB7CisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPSBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREU7CisgICAgICAgICAgICAgICAgcmVwb3J0aW5nTW9kZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPSBTRU5TT1JfRkxBR19PTl9DSEFOR0VfTU9ERTsKKyAgICAgICAgICAgICAgICByZXBvcnRpbmdNb2RlUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyA9IFNFTlNPUl9GTEFHX09ORV9TSE9UX01PREU7CisgICAgICAgICAgICAgICAgcmVwb3J0aW5nTW9kZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPSBTRU5TT1JfRkxBR19TUEVDSUFMX1JFUE9SVElOR19NT0RFOworICAgICAgICAgICAgICAgIHJlcG9ydGluZ01vZGVQYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiVW5kZWZpbmVkIHJlcG9ydGluZyBtb2RlIGRlc2lnbmF0aW9uICIgPDwgc2VnbWVudHNbMV0gPDwgTE9HX0VOREw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBwZXJtaXNzaW9uIHBhcnNlZAorICAgIGJvb2wgcGVybWlzc2lvblBhcnNlZCA9IGZhbHNlOworICAgIGlmIChzZWdtZW50c1syXS5zaXplKCkgPT0gMSkgeworICAgICAgICBzd2l0Y2ggKHNlZ21lbnRzWzJdWzBdKSB7CisgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8ucGVybWlzc2lvbiA9IFNFTlNPUl9QRVJNSVNTSU9OX0JPRFlfU0VOU09SUzsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5wZXJtaXNzaW9uID0gIiI7CisgICAgICAgICAgICAgICAgcGVybWlzc2lvblBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19FIDw8ICJVbmRlZmluZWQgcGVybWlzc2lvbiBkZXNpZ25hdGlvbiAiIDw8IHNlZ21lbnRzWzJdIDw8IExPR19FTkRMOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2FrZSB1cAorICAgIGJvb2wgd2FrZVVwUGFyc2VkID0gZmFsc2U7CisgICAgaWYgKHNlZ21lbnRzWzNdLnNpemUoKSA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAoc2VnbWVudHNbM11bMF0pIHsKKyAgICAgICAgICAgIGNhc2UgJ1cnOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc1dha2VVcCA9IHRydWU7CisgICAgICAgICAgICAgICAgd2FrZVVwUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ04nOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc1dha2VVcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdha2VVcFBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19FIDw8ICJVbmRlZmluZWQgd2FrZSB1cCBkZXNpZ25hdGlvbiAiIDw8IHNlZ21lbnRzWzNdIDw8IExPR19FTkRMOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IHJldCA9IHR5cGVQYXJzZWQgJiYgcmVwb3J0aW5nTW9kZVBhcnNlZCAmJiBwZXJtaXNzaW9uUGFyc2VkICYmIHdha2VVcFBhcnNlZDsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBMT0dfRCA8PCAiZGV0ZWN0QW5kcm9pZEN1c3RvbVNlbnNvciB0eXBlUGFyc2VkOiAiIDw8IHR5cGVQYXJzZWQKKyAgICAgICAgICAgICAgPDwgIiByZXBvcnRpbmdNb2RlUGFyc2VkOiAiICA8PCByZXBvcnRpbmdNb2RlUGFyc2VkCisgICAgICAgICAgICAgIDw8ICIgcGVybWlzc2lvblBhcnNlZDogIiA8PCBwZXJtaXNzaW9uUGFyc2VkCisgICAgICAgICAgICAgIDw8ICIgd2FrZVVwUGFyc2VkOiAiIDw8IHdha2VVcFBhcnNlZCA8PCBMT0dfRU5ETDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBIaWRSYXdTZW5zb3I6OmZpbmRTZW5zb3JDb250cm9sVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpQcm9wZXJ0eVVzYWdlOworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWQ6OlNlbnNvcjo6UmF3TWluTWF4OworCisgICAgLy9SRVBPUlRJTkdfU1RBVEUKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKnJlcG9ydGluZ1N0YXRlCisgICAgICAgICAgICA9IGZpbmQocGFja2V0cywgUkVQT1JUSU5HX1NUQVRFLCBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0ZFQVRVUkUpOworCisgICAgaWYgKHJlcG9ydGluZ1N0YXRlID09IG51bGxwdHIKKyAgICAgICAgICAgIHx8ICFyZXBvcnRpbmdTdGF0ZS0+aXNCeXRlQWxpZ25lZCgpCisgICAgICAgICAgICB8fCByZXBvcnRpbmdTdGF0ZS0+Yml0U2l6ZSAhPSA4CisgICAgICAgICAgICB8fCByZXBvcnRpbmdTdGF0ZS0+bWluUmF3ICE9IFJFUE9SVElOR19TVEFURV9NSU4KKyAgICAgICAgICAgIHx8IHJlcG9ydGluZ1N0YXRlLT5tYXhSYXcgIT0gUkVQT1JUSU5HX1NUQVRFX01BWCkgeworICAgICAgICBMT0dfVyA8PCAiQ2Fubm90IGZpbmQgdmFsaWQgcmVwb3J0aW5nIHN0YXRlIGZlYXR1cmUiIDw8IExPR19FTkRMOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZXBvcnRpbmdTdGF0ZUlkID0gcmVwb3J0aW5nU3RhdGUtPmlkOworICAgICAgICBtUmVwb3J0aW5nU3RhdGVPZmZzZXQgPSByZXBvcnRpbmdTdGF0ZS0+Yml0T2Zmc2V0IC8gODsKKyAgICB9CisKKyAgICAvL1BPV0VSX1NUQVRFCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpwb3dlclN0YXRlCisgICAgICAgICAgICA9IGZpbmQocGFja2V0cywgUE9XRVJfU1RBVEUsIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfRkVBVFVSRSk7CisgICAgaWYgKHBvd2VyU3RhdGUgPT0gbnVsbHB0cgorICAgICAgICAgICAgfHwgIXBvd2VyU3RhdGUtPmlzQnl0ZUFsaWduZWQoKQorICAgICAgICAgICAgfHwgcG93ZXJTdGF0ZS0+Yml0U2l6ZSAhPSA4CisgICAgICAgICAgICB8fCBwb3dlclN0YXRlLT5taW5SYXcgIT0gUE9XRVJfU1RBVEVfTUlOCisgICAgICAgICAgICB8fCBwb3dlclN0YXRlLT5tYXhSYXcgIT0gUE9XRVJfU1RBVEVfTUFYKSB7CisgICAgICAgIExPR19XIDw8ICJDYW5ub3QgZmluZCB2YWxpZCBwb3dlciBzdGF0ZSBmZWF0dXJlIiA8PCBMT0dfRU5ETDsKKyAgICB9IGVsc2UgeworICAgICAgICBtUG93ZXJTdGF0ZUlkID0gcG93ZXJTdGF0ZS0+aWQ7CisgICAgICAgIG1Qb3dlclN0YXRlT2Zmc2V0ID0gcG93ZXJTdGF0ZS0+Yml0T2Zmc2V0IC8gODsKKyAgICB9CisKKyAgICAvL1JFUE9SVF9JTlRFUlZBTAorICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAqcmVwb3J0SW50ZXJ2YWwKKyAgICAgICAgICAgID0gZmluZChwYWNrZXRzLCBSRVBPUlRfSU5URVJWQUwsIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfRkVBVFVSRSk7CisgICAgaWYgKHJlcG9ydEludGVydmFsID09IG51bGxwdHIKKyAgICAgICAgICAgIHx8ICFyZXBvcnRJbnRlcnZhbC0+aXNCeXRlQWxpZ25lZCgpCisgICAgICAgICAgICB8fCByZXBvcnRJbnRlcnZhbC0+bWluUmF3IDwgMAorICAgICAgICAgICAgfHwgKHJlcG9ydEludGVydmFsLT5iaXRTaXplICE9IDE2ICYmIHJlcG9ydEludGVydmFsLT5iaXRTaXplICE9IDMyKSkgeworICAgICAgICBMT0dfVyA8PCAiQ2Fubm90IGZpbmQgdmFsaWQgcmVwb3J0IGludGVydmFsIGZlYXR1cmUiIDw8IExPR19FTkRMOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZXBvcnRJbnRlcnZhbElkID0gcmVwb3J0SW50ZXJ2YWwtPmlkOworICAgICAgICBtUmVwb3J0SW50ZXJ2YWxPZmZzZXQgPSByZXBvcnRJbnRlcnZhbC0+Yml0T2Zmc2V0IC8gODsKKyAgICAgICAgbVJlcG9ydEludGVydmFsU2l6ZSA9IHJlcG9ydEludGVydmFsLT5iaXRTaXplIC8gODsKKworICAgICAgICBtRmVhdHVyZUluZm8ubWluRGVsYXkgPSBzdGQ6Om1heChzdGF0aWNfY2FzdDxpbnQ2NF90PigxKSwgcmVwb3J0SW50ZXJ2YWwtPm1pblJhdykgKiAxMDAwOworICAgICAgICBtRmVhdHVyZUluZm8ubWF4RGVsYXkgPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDxpbnQ2NF90PigxMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydEludGVydmFsLT5tYXhSYXcpICogMTAwMDsgLy8gbWF4aW11bSAxMDAwIHNlY29uZAorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gKG1Qb3dlclN0YXRlSWQgPj0gMCB8fCBtUmVwb3J0aW5nU3RhdGVJZCA+PSAwKSAmJiBtUmVwb3J0SW50ZXJ2YWxJZCA+PSAwOworfQorCitjb25zdCBzZW5zb3JfdCogSGlkUmF3U2Vuc29yOjpnZXRTZW5zb3IoKSBjb25zdCB7CisgICAgcmV0dXJuICZtU2Vuc29yOworfQorCit2b2lkIEhpZFJhd1NlbnNvcjo6Z2V0VXVpZCh1aW50OF90KiB1dWlkKSBjb25zdCB7CisgICAgbWVtY3B5KHV1aWQsIG1GZWF0dXJlSW5mby51dWlkLCBzaXplb2YobUZlYXR1cmVJbmZvLnV1aWQpKTsKK30KKworaW50IEhpZFJhd1NlbnNvcjo6ZW5hYmxlKGJvb2wgZW5hYmxlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpTdGF0ZVZhbHVlOworICAgIFNQKEhpZERldmljZSkgZGV2aWNlID0gUFJPTU9URShtRGV2aWNlKTsKKworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlID09IG1FbmFibGVkKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXI7CisgICAgYm9vbCBzZXRQb3dlck9rID0gdHJ1ZTsKKyAgICBpZiAobVBvd2VyU3RhdGVJZCA+PSAwKSB7CisgICAgICAgIHNldFBvd2VyT2sgPSBmYWxzZTsKKyAgICAgICAgdWludDhfdCBpZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1Qb3dlclN0YXRlSWQpOworICAgICAgICBpZiAoZGV2aWNlLT5nZXRGZWF0dXJlKGlkLCAmYnVmZmVyKQorICAgICAgICAgICAgICAgICYmIGJ1ZmZlci5zaXplKCkgPiBtUG93ZXJTdGF0ZU9mZnNldCkgeworICAgICAgICAgICAgYnVmZmVyW21Qb3dlclN0YXRlT2Zmc2V0XSA9IGVuYWJsZSA/IFBPV0VSX1NUQVRFX0ZVTExfUE9XRVIgOiBQT1dFUl9TVEFURV9QT1dFUl9PRkY7CisgICAgICAgICAgICBzZXRQb3dlck9rID0gZGV2aWNlLT5zZXRGZWF0dXJlKGlkLCBidWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HX0UgPDwgImVuYWJsZTogY2hhbmdpbmcgUE9XRVIgU1RBVEUgZmFpbGVkIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgc2V0UmVwb3J0aW5nT2sgPSB0cnVlOworICAgIGlmIChtUmVwb3J0aW5nU3RhdGVJZCA+PSAwKSB7CisgICAgICAgIHNldFJlcG9ydGluZ09rID0gZmFsc2U7CisgICAgICAgIHVpbnQ4X3QgaWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtUmVwb3J0aW5nU3RhdGVJZCk7CisgICAgICAgIGlmIChkZXZpY2UtPmdldEZlYXR1cmUoaWQsICZidWZmZXIpCisgICAgICAgICAgICAgICAgJiYgYnVmZmVyLnNpemUoKSA+IG1SZXBvcnRpbmdTdGF0ZU9mZnNldCkgeworICAgICAgICAgICAgYnVmZmVyW21SZXBvcnRpbmdTdGF0ZU9mZnNldF0KKyAgICAgICAgICAgICAgICAgICAgPSBlbmFibGUgPyBSRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UIDogUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UOworICAgICAgICAgICAgc2V0UmVwb3J0aW5nT2sgPSBkZXZpY2UtPnNldEZlYXR1cmUoaWQsIGJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dfRSA8PCAiZW5hYmxlOiBjaGFuZ2luZyBSRVBPUlRJTkcgU1RBVEUgZmFpbGVkIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzZXRQb3dlck9rICYmIHNldFJlcG9ydGluZ09rKSB7CisgICAgICAgIG1FbmFibGVkID0gZW5hYmxlOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworaW50IEhpZFJhd1NlbnNvcjo6YmF0Y2goaW50NjRfdCBzYW1wbGluZ1BlcmlvZCwgaW50NjRfdCBiYXRjaGluZ1BlcmlvZCkgeworICAgIFNQKEhpZERldmljZSkgZGV2aWNlID0gUFJPTU9URShtRGV2aWNlKTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKHNhbXBsaW5nUGVyaW9kIDwgMCB8fCBiYXRjaGluZ1BlcmlvZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBib29sIG5lZWRSZWZyZXNoID0gbVNhbXBsaW5nUGVyaW9kICE9IHNhbXBsaW5nUGVyaW9kIHx8IG1CYXRjaGluZ1BlcmlvZCAhPSBiYXRjaGluZ1BlcmlvZDsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXI7CisKKyAgICBib29sIG9rID0gdHJ1ZTsKKyAgICBpZiAobmVlZFJlZnJlc2ggJiYgbVJlcG9ydEludGVydmFsSWQgPj0gMCkgeworICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB1aW50OF90IGlkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obVJlcG9ydEludGVydmFsSWQpOworICAgICAgICBpZiAoZGV2aWNlLT5nZXRGZWF0dXJlKGlkLCAmYnVmZmVyKQorICAgICAgICAgICAgICAgICYmIGJ1ZmZlci5zaXplKCkgPj0gbVJlcG9ydEludGVydmFsT2Zmc2V0ICsgbVJlcG9ydEludGVydmFsU2l6ZSkgeworICAgICAgICAgICAgaW50NjRfdCBwZXJpb2RNcyA9IHNhbXBsaW5nUGVyaW9kIC8gMTAwMDAwMDsgLy9ucyAtPiBtcworICAgICAgICAgICAgc3dpdGNoIChtUmVwb3J0SW50ZXJ2YWxTaXplKSB7CisgICAgICAgICAgICAgICAgY2FzZSBzaXplb2YodWludDE2X3QpOgorICAgICAgICAgICAgICAgICAgICBwZXJpb2RNcyA9IHN0ZDo6bWluKHBlcmlvZE1zLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihVSU5UMTZfTUFYKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclttUmVwb3J0SW50ZXJ2YWxPZmZzZXRdID0gcGVyaW9kTXMgJiAweEZGOworICAgICAgICAgICAgICAgICAgICBidWZmZXJbbVJlcG9ydEludGVydmFsT2Zmc2V0ICsgMV0gPSAocGVyaW9kTXMgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIGNhc2Ugc2l6ZW9mKHVpbnQzMl90KToKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kTXMgPSBzdGQ6Om1pbihwZXJpb2RNcywgc3RhdGljX2Nhc3Q8aW50NjRfdD4oVUlOVDMyX01BWCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXJbbVJlcG9ydEludGVydmFsT2Zmc2V0XSA9IHBlcmlvZE1zICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW21SZXBvcnRJbnRlcnZhbE9mZnNldCArIDFdID0gKHBlcmlvZE1zID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW21SZXBvcnRJbnRlcnZhbE9mZnNldCArIDJdID0gKHBlcmlvZE1zID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclttUmVwb3J0SW50ZXJ2YWxPZmZzZXQgKyAzXSA9IChwZXJpb2RNcyA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2sgPSBkZXZpY2UtPnNldEZlYXR1cmUoaWQsIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob2spIHsKKyAgICAgICAgbVNhbXBsaW5nUGVyaW9kID0gc2FtcGxpbmdQZXJpb2Q7CisgICAgICAgIG1CYXRjaGluZ1BlcmlvZCA9IGJhdGNoaW5nUGVyaW9kOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKwordm9pZCBIaWRSYXdTZW5zb3I6OmhhbmRsZUlucHV0KHVpbnQ4X3QgaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZtZXNzYWdlKSB7CisgICAgaWYgKGlkICE9IG1JbnB1dFJlcG9ydElkIHx8IG1FbmFibGVkID09IGZhbHNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2Vuc29yc19ldmVudF90IGV2ZW50ID0geworICAgICAgICAudmVyc2lvbiA9IHNpemVvZihldmVudCksCisgICAgICAgIC5zZW5zb3IgPSAtMSwKKyAgICAgICAgLnR5cGUgPSBtU2Vuc29yLnR5cGUKKyAgICB9OworICAgIGJvb2wgdmFsaWQgPSB0cnVlOworICAgIGZvciAoY29uc3QgYXV0byAmcmVjIDogbVRyYW5zbGF0ZVRhYmxlKSB7CisgICAgICAgIGludDY0X3QgdiA9IChtZXNzYWdlW3JlYy5ieXRlT2Zmc2V0ICsgcmVjLmJ5dGVTaXplIC0gMV0gJiAweDgwKSA/IC0xIDogMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4ocmVjLmJ5dGVTaXplKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICB2ID0gKHYgPDwgOCkgfCBtZXNzYWdlW3JlYy5ieXRlT2Zmc2V0ICsgaV07IC8vIEhJRCBpcyBsaXR0bGUgZW5kaWFuCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHJlYy50eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgaWYgKHYgPiByZWMubWF4VmFsdWUgfHwgdiA8IHJlYy5taW5WYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBldmVudC5kYXRhW3JlYy5pbmRleF0gPSByZWMuYSAqICh2ICsgcmVjLmIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX0lOVDY0OgorICAgICAgICAgICAgICAgIGlmICh2ID4gcmVjLm1heFZhbHVlIHx8IHYgPCByZWMubWluVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXZlbnQudTY0LmRhdGFbcmVjLmluZGV4XSA9IHYgKyByZWMuYjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9BQ0NVUkFDWToKKyAgICAgICAgICAgICAgICBldmVudC5tYWduZXRpYy5zdGF0dXMgPSAodiAmIDB4RkYpICsgcmVjLmI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCF2YWxpZCkgeworICAgICAgICBMT0dfViA8PCAiUmFuZ2UgZXJyb3Igb2JzZXJ2ZWQgaW4gZGVjb2RpbmcsIGRpc2NhcmQiIDw8IExPR19FTkRMOworICAgIH0KKyAgICBldmVudC50aW1lc3RhbXAgPSAtMTsKKyAgICBnZW5lcmF0ZUV2ZW50KGV2ZW50KTsKK30KKworc3RkOjpzdHJpbmcgSGlkUmF3U2Vuc29yOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCAiRmVhdHVyZSBWYWx1ZXMgIiA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIG5hbWU6ICIgPDwgbUZlYXR1cmVJbmZvLm5hbWUgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICB2ZW5kb3I6ICIgPDwgbUZlYXR1cmVJbmZvLnZlbmRvciA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHBlcm1pc3Npb246ICIgPDwgbUZlYXR1cmVJbmZvLnBlcm1pc3Npb24gPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICB0eXBlU3RyaW5nOiAiIDw8IG1GZWF0dXJlSW5mby50eXBlU3RyaW5nIDw8IExPR19FTkRMCisgICAgICAgICAgPDwgIiAgdHlwZTogIiA8PCBtRmVhdHVyZUluZm8udHlwZSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIG1heFJhbmdlOiAiIDw8IG1GZWF0dXJlSW5mby5tYXhSYW5nZSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHJlc29sdXRpb246ICIgPDwgbUZlYXR1cmVJbmZvLnJlc29sdXRpb24gPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBwb3dlcjogIiA8PCBtRmVhdHVyZUluZm8ucG93ZXIgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBtaW5EZWxheTogIiA8PCBtRmVhdHVyZUluZm8ubWluRGVsYXkgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBtYXhEZWxheTogIiA8PCBtRmVhdHVyZUluZm8ubWF4RGVsYXkgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBmaWZvU2l6ZTogIiA8PCBtRmVhdHVyZUluZm8uZmlmb1NpemUgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBmaWZvTWF4U2l6ZTogIiA8PCBtRmVhdHVyZUluZm8uZmlmb01heFNpemUgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICByZXBvcnRNb2RlRmxhZzogIiA8PCBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBpc1dha2VVcDogIiA8PCAobUZlYXR1cmVJbmZvLmlzV2FrZVVwID8gInRydWUiIDogImZhbHNlIikgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICB1bmlxdWVJZDogIiA8PCBtRmVhdHVyZUluZm8udW5pcXVlSWQgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICB1dWlkOiAiOworCisgICAgc3MgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJyk7CisgICAgZm9yIChhdXRvIGQgOiBtRmVhdHVyZUluZm8udXVpZCkgeworICAgICAgICAgIHNzIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGF0aWNfY2FzdDxpbnQ+KGQpIDw8ICIgIjsKKyAgICB9CisgICAgc3MgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykgPDwgTE9HX0VOREw7CisKKyAgICBzcyA8PCAiSW5wdXQgcmVwb3J0IGlkOiAiIDw8IG1JbnB1dFJlcG9ydElkIDw8IExPR19FTkRMOworICAgIGZvciAoY29uc3QgYXV0byAmdCA6IG1UcmFuc2xhdGVUYWJsZSkgeworICAgICAgICBzcyA8PCAiICB0eXBlLCBpbmRleDogIiA8PCB0LnR5cGUgPDwgIiwgIiA8PCB0LmluZGV4CisgICAgICAgICAgICAgIDw8ICI7IG1pbixtYXg6ICIgPDwgdC5taW5WYWx1ZSA8PCAiLCAiIDw8IHQubWF4VmFsdWUKKyAgICAgICAgICAgICAgPDwgIjsgYnl0ZS1vZmZzZXQsc2l6ZTogIiA8PCB0LmJ5dGVPZmZzZXQgPDwgIiwgIiA8PCB0LmJ5dGVTaXplCisgICAgICAgICAgICAgIDw8ICI7IHNjYWxpbmcsYmlhczogIiA8PCB0LmEgPDwgIiwgIiA8PCB0LmIgPDwgTE9HX0VOREw7CisgICAgfQorCisgICAgc3MgPDwgIkNvbnRyb2wgZmVhdHVyZXM6ICIgPDwgTE9HX0VOREw7CisgICAgc3MgPDwgIiAgUG93ZXIgc3RhdGUgIjsKKyAgICBpZiAobVBvd2VyU3RhdGVJZCA+PSAwKSB7CisgICAgICAgIHNzIDw8ICJmb3VuZCwgaWQ6ICIgPDwgbVBvd2VyU3RhdGVJZAorICAgICAgICAgICAgICA8PCAiIG9mZnNldDogIiA8PCBtUG93ZXJTdGF0ZU9mZnNldCA8PCBMT0dfRU5ETDsKKyAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCAibm90IGZvdW5kIiA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICBzcyA8PCAiICBSZXBvcnRpbmcgc3RhdGUgIjsKKyAgICBpZiAobVJlcG9ydGluZ1N0YXRlSWQgPj0gMCkgeworICAgICAgICBzcyA8PCAiZm91bmQsIGlkOiAiIDw8IG1SZXBvcnRpbmdTdGF0ZUlkCisgICAgICAgICAgICAgIDw8ICIgb2Zmc2V0OiAiIDw8IG1SZXBvcnRpbmdTdGF0ZU9mZnNldCA8PCBMT0dfRU5ETDsKKyAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCAibm90IGZvdW5kIiA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICBzcyA8PCAiICBSZXBvcnQgaW50ZXJ2YWwgIjsKKyAgICBpZiAobVJlcG9ydEludGVydmFsSWQgPj0gMCkgeworICAgICAgICBzcyA8PCAiZm91bmQsIGlkOiAiIDw8IG1SZXBvcnRJbnRlcnZhbElkCisgICAgICAgICAgICAgIDw8ICIgb2Zmc2V0OiAiIDw8IG1SZXBvcnRJbnRlcnZhbE9mZnNldAorICAgICAgICAgICAgICA8PCAiIHNpemU6ICIgPDwgbVJlcG9ydEludGVydmFsU2l6ZSA8PCBMT0dfRU5ETDsKKyAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCAibm90IGZvdW5kIiA8PCBMT0dfRU5ETDsKKyAgICB9CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3IuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQzMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvci5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0hJRFJBV19TRU5TT1JfSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9ICisKKyNpbmNsdWRlICJCYXNlU2Vuc29yT2JqZWN0LmgiCisjaW5jbHVkZSAiSGlkRGV2aWNlLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgPEhpZFBhcnNlci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK3VzaW5nIEhpZFV0aWw6OkhpZFBhcnNlcjsKK3VzaW5nIFJlcG9ydFBhY2tldCA9IEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0OwordXNpbmcgUmVwb3J0SXRlbSA9IEhpZFBhcnNlcjo6UmVwb3J0SXRlbTsKKworY2xhc3MgSGlkUmF3U2Vuc29yIDogcHVibGljIEJhc2VTZW5zb3JPYmplY3QgeworICAgIGZyaWVuZCBjbGFzcyBIaWRSYXdTZW5zb3JUZXN0OworICAgIGZyaWVuZCBjbGFzcyBIaWRSYXdEZXZpY2VUZXN0OworcHVibGljOgorICAgIEhpZFJhd1NlbnNvcihTUChIaWREZXZpY2UpIGRldmljZSwgdWludDMyX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0PiAmcmVwb3J0KTsKKworICAgIC8vIGltcGxlbWVudHMgQmFzZVNlbnNvck9iamVjdAorICAgIHZpcnR1YWwgY29uc3Qgc2Vuc29yX3QqIGdldFNlbnNvcigpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBnZXRVdWlkKHVpbnQ4X3QqIHV1aWQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGVuYWJsZShib29sIGVuYWJsZSk7CisgICAgdmlydHVhbCBpbnQgYmF0Y2goaW50NjRfdCBzYW1wbGVQZXJpb2QsIGludDY0X3QgYmF0Y2hQZXJpb2QpOyAvLyB1bml0IG5hbm8tc2Vjb25kcworCisgICAgLy8gaGFuZGxlIGlucHV0IHJlcG9ydCByZWNlaXZlZAorICAgIHZvaWQgaGFuZGxlSW5wdXQodWludDhfdCBpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm1lc3NhZ2UpOworCisgICAgLy8gaW5kaWNhdGUgaWYgdGhlIEhpZFJhd1NlbnNvciBpcyBhIHZhbGlkIG9uZQorICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1WYWxpZDsgfTsKKworcHJpdmF0ZToKKworICAgIC8vIHN0cnVjdHVyZSB1c2VkIGZvciBob2xkaW5nIGRlc2NyaXB0b3IgcGFyc2UgcmVzdWx0IGZvciBlYWNoIHJlcG9ydCBmaWVsZAorICAgIGVudW0geworICAgICAgICBUWVBFX0ZMT0FULAorICAgICAgICBUWVBFX0lOVDY0LAorICAgICAgICBUWVBFX0FDQ1VSQUNZCisgICAgfTsKKyAgICBzdHJ1Y3QgUmVwb3J0VHJhbnNsYXRlUmVjb3JkIHsKKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgaW50NjRfdCBtYXhWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBtaW5WYWx1ZTsKKyAgICAgICAgc2l6ZV90IGJ5dGVPZmZzZXQ7CisgICAgICAgIHNpemVfdCBieXRlU2l6ZTsKKyAgICAgICAgZG91YmxlIGE7CisgICAgICAgIGludDY0X3QgYjsKKyAgICB9OworCisgICAgLy8gc2Vuc29yIHJlbGF0ZWQgaW5mb3JtYXRpb24gcGFyc2VkIGZyb20gSElEIGRlc2NyaXB0b3IKKyAgICBzdHJ1Y3QgRmVhdHVyZVZhbHVlIHsKKyAgICAgICAgLy8gaW5mb3JtYXRpb24gbmVlZGVkIHRvIGZ1cm5pc2ggc2Vuc29yX3Qgc3RydWN0dXJlIChzZWUgaGFyZHdhcmUvc2Vuc29ycy5oKQorICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyB2ZW5kb3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBlcm1pc3Npb247CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVTdHJpbmc7CisgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgaW50IHZlcnNpb247CisgICAgICAgIGZsb2F0IG1heFJhbmdlOworICAgICAgICBmbG9hdCByZXNvbHV0aW9uOworICAgICAgICBmbG9hdCBwb3dlcjsKKyAgICAgICAgaW50MzJfdCBtaW5EZWxheTsKKyAgICAgICAgaW50NjRfdCBtYXhEZWxheTsKKyAgICAgICAgc2l6ZV90IGZpZm9TaXplOworICAgICAgICBzaXplX3QgZmlmb01heFNpemU7CisgICAgICAgIHVpbnQzMl90IHJlcG9ydE1vZGVGbGFnOworICAgICAgICBib29sIGlzV2FrZVVwOworCisgICAgICAgIC8vIGR5bmFtaWMgc2Vuc29yIHNwZWNpZmljCisgICAgICAgIHN0ZDo6c3RyaW5nIHVuaXF1ZUlkOworICAgICAgICB1aW50OF90IHV1aWRbMTZdOworCisgICAgICAgIC8vIGlmIHRoZSBkZXZpY2UgaXMgY3VzdG9tIHNlbnNvciBISUQgZGV2aWNlIHRoYXQgZnVybmlzaGVkIGFuZHJvaWQgc3BlY2lmaWMgZGVzY3JpcHRvcnMKKyAgICAgICAgYm9vbCBpc0FuZHJvaWRDdXN0b207CisgICAgfTsKKworICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCByZXBvcnQgaXRlbSB3aXRoIHNwZWNpZmllZCB1c2FnZSwgdHlwZSBhbmQgaWQuCisgICAgLy8gaWYgcGFyYW1ldGVyIGlkIGlzIG9taXR0ZWQsIHRoaXMgZnVuY3Rpb24gbG9va3MgZm9yIHVzYWdlIHdpdGggYWxsIGlkcy4KKyAgICAvLyByZXR1cm4gbnVsbHB0ciBpZiBub3RoaW5nIGlzIGZvdW5kLgorICAgIHN0YXRpYyBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0qIGZpbmQKKyAgICAgICAgICAgIChjb25zdCBzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gJnBhY2tldHMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdXNhZ2UsIGludCB0eXBlLCBpbnQgaWQgPSAtMSk7CisKKyAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGVjb2RlIHN0ZDo6c3RyaW5nIGZyb20gSElEIGZlYXR1cmUgcmVwb3J0IGJ1ZmZlci4KKyAgICBzdGF0aWMgYm9vbCBkZWNvZGVTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gJnJlcG9ydCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZidWZmZXIsIHN0ZDo6c3RyaW5nICpkKTsKKworICAgIC8vIGluaXRpYWxpemUgZGVmYXVsdCBmZWF0dXJlIHZhbHVlcyBkZWZhdWx0IGJhc2VkIG9uIGhpZCBkZXZpY2UgaW5mbworICAgIHN0YXRpYyB2b2lkIGluaXRGZWF0dXJlVmFsdWVGcm9tSGlkRGV2aWNlSW5mbygKKyAgICAgICAgICAgIEZlYXR1cmVWYWx1ZSAqZmVhdHVyZVZhbHVlLCBjb25zdCBIaWREZXZpY2U6OkhpZERldmljZUluZm8gJmluZm8pOworCisgICAgLy8gcG9wdWxhdGVzIGZlYXR1cmUgdmFsdWVzIGZyb20gZGVzY3JpcGl0b3JzIGFuZCBoaWQgZmVhdHVyZSByZXBvcnRzCisgICAgYm9vbCBwb3B1bGF0ZUZlYXR1cmVWYWx1ZUZyb21GZWF0dXJlUmVwb3J0KAorICAgICAgICAgICAgRmVhdHVyZVZhbHVlICpmZWF0dXJlVmFsdWUsIGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0PiAmcGFja2V0cyk7CisKKyAgICAvLyB2YWxpZGF0ZSBmZWF0dXJlIHZhbHVlcyBhbmQgY29uc3RydWN0IHNlbnNvcl90IHN0cnVjdHVyZSBpZiB2YWx1ZXMgYXJlIG9rLgorICAgIGJvb2wgdmFsaWRhdGVGZWF0dXJlVmFsdWVBbmRCdWlsZFNlbnNvcigpOworCisgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgc2Vuc29yIGNvbnRyb2wgZmVhdHVyZSB1c2FnZSBmcm9tIHBhY2tldHMKKyAgICBib29sIGZpbmRTZW5zb3JDb250cm9sVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKTsKKworICAgIC8vIHRyeSB0byBwYXJzZSBzZW5zb3IgZGVzY3JpcHRpb24gZmVhdHVyZSB2YWx1ZSB0byBzZWUgaWYgaXQgbWF0Y2hlcworICAgIC8vIGFuZHJvaWQgc3BlY2lmaWVkIGN1c3RvbSBzZW5zb3IgZGVmaW5pdGlvbi4KKyAgICBib29sIGRldGVjdEFuZHJvaWRDdXN0b21TZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRlc2NyaXB0aW9uKTsKKworICAgIC8vIHByb2Nlc3MgSElEIHNlbnNvciBzcGVjIGRlZmluZWQgdGhyZWUgYXhpcyBzZW5zb3JzIHVzYWdlczogYWNjZWwsIGd5cm8sIG1hZy4KKyAgICBib29sIHByb2Nlc3NUcmlBeGlzVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzLAorICAgICAgICAgICAgdWludDMyX3QgdXNhZ2VYLCB1aW50MzJfdCB1c2FnZVksIHVpbnQzMl90IHVzYWdlWiwgZG91YmxlIGRlZmF1bHRTY2FsaW5nID0gMSk7CisKKyAgICAvLyBwcm9jZXNzIEhJRCBzbmVzb3Igc3BlYyBkZWZpbmVkIG9yaWVudGF0aW9uKHF1YXRlcm5pb24pIHNlbnNvciB1c2FnZXMuCisgICAgYm9vbCBwcm9jZXNzUXVhdGVybmlvblVzYWdlKGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0PiAmcGFja2V0cyk7CisKKyAgICAvLyBkdW1wIGRhdGEgZm9yIHRlc3QvZGVidWcgcHVycG9zZQorICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKKworICAgIC8vIEZlYXR1cmVzIGZvciBjb250cm9sIHNlbnNvcgorICAgIGludCBtUmVwb3J0aW5nU3RhdGVJZDsKKyAgICB1bnNpZ25lZCBpbnQgbVJlcG9ydGluZ1N0YXRlT2Zmc2V0OworCisgICAgaW50IG1Qb3dlclN0YXRlSWQ7CisgICAgdW5zaWduZWQgaW50IG1Qb3dlclN0YXRlT2Zmc2V0OworCisgICAgaW50IG1SZXBvcnRJbnRlcnZhbElkOworICAgIHVuc2lnbmVkIGludCBtUmVwb3J0SW50ZXJ2YWxPZmZzZXQ7CisgICAgdW5zaWduZWQgaW50IG1SZXBvcnRJbnRlcnZhbFNpemU7CisKKyAgICAvLyBJbnB1dCByZXBvcnQgdHJhbnNsYXRlIHRhYmxlCisgICAgc3RkOjp2ZWN0b3I8UmVwb3J0VHJhbnNsYXRlUmVjb3JkPiBtVHJhbnNsYXRlVGFibGU7CisgICAgdW5zaWduZWQgbUlucHV0UmVwb3J0SWQ7CisKKyAgICBGZWF0dXJlVmFsdWUgbUZlYXR1cmVJbmZvOworICAgIHNlbnNvcl90IG1TZW5zb3I7CisKKyAgICAvLyBydW50aW1lIHN0YXRlcyB2YXJpYWJsZQorICAgIGJvb2wgbUVuYWJsZWQ7CisgICAgaW50NjRfdCBtU2FtcGxpbmdQZXJpb2Q7ICAgIC8vIG5zCisgICAgaW50NjRfdCBtQmF0Y2hpbmdQZXJpb2Q7ICAgIC8vIG5zCisKKyAgICBXUChIaWREZXZpY2UpIG1EZXZpY2U7CisgICAgYm9vbCBtVmFsaWQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9ICisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEYWVtb24uY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvckRhZW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmMzRiYwotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEYWVtb24uY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkhpZFJhd1NlbnNvckRhZW1vbi5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb25EZXRlY3Rvci5oIgorI2luY2x1ZGUgIkR5bmFtaWNTZW5zb3JNYW5hZ2VyLmgiCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yRGV2aWNlLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TeXN0ZW1DbG9jay5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjZGVmaW5lIERFVl9QQVRIICAgICAgICAgICAgICAgICIvZGV2LyIKKyNkZWZpbmUgREVWX05BTUVfUkVHRVggICAgICAgICAgIl5oaWRyYXdbMC05XSskIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworSGlkUmF3U2Vuc29yRGFlbW9uOjpIaWRSYXdTZW5zb3JEYWVtb24oRHluYW1pY1NlbnNvck1hbmFnZXImIG1hbmFnZXIpCisgICAgICAgIDogQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24obWFuYWdlcikgeworICAgIG1EZXRlY3RvciA9IG5ldyBGaWxlQ29ubmVjdGlvbkRldGVjdG9yKAorICAgICAgICAgICAgdGhpcywgc3RkOjpzdHJpbmcoREVWX1BBVEgpLCBzdGQ6OnN0cmluZyhERVZfTkFNRV9SRUdFWCkpOworfQorCitCYXNlU2Vuc29yVmVjdG9yIEhpZFJhd1NlbnNvckRhZW1vbjo6Y3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpIHsKKyAgICBCYXNlU2Vuc29yVmVjdG9yIHJldDsKKyAgICBzcDxIaWRSYXdTZW5zb3JEZXZpY2U+IGRldmljZShIaWRSYXdTZW5zb3JEZXZpY2U6OmNyZWF0ZShkZXZpY2VLZXkpKTsKKworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiY3JlYXRlZCBIaWRSYXdTZW5zb3JEZXZpY2UoJXApIHN1Y2Nlc3NmdWxseSBvbiBkZXZpY2UgJXMgY29udGFpbnMgJXp1IHNlbnNvcnMiLAorICAgICAgICAgICAgICBkZXZpY2UuZ2V0KCksIGRldmljZUtleS5jX3N0cigpLCBkZXZpY2UtPmdldFNlbnNvcnMoKS5zaXplKCkpOworCisgICAgICAgIC8vIGNvbnZlcnQgdHlwZQorICAgICAgICBmb3IgKGF1dG8gJmkgOiBkZXZpY2UtPmdldFNlbnNvcnMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2hfYmFjayhpKTsKKyAgICAgICAgfQorICAgICAgICBtSGlkUmF3U2Vuc29yRGV2aWNlcy5lbXBsYWNlKGRldmljZUtleSwgZGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBIaWRSYXdTZW5zb3JEZXZpY2Ugb2JqZWN0Iik7CisgICAgfQorCisgICAgQUxPR0UoInJldHVybiAlenUgc2Vuc29ycyIsIHJldC5zaXplKCkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgSGlkUmF3U2Vuc29yRGFlbW9uOjpyZW1vdmVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSkgeworICAgIG1IaWRSYXdTZW5zb3JEZXZpY2VzLmVyYXNlKGRldmljZUtleSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGFlbW9uLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGFlbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0YjJhMgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEYWVtb24uaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9EQUVNT05fSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9EQUVNT05fSAorCisjaW5jbHVkZSAiQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uaCIKKworI2luY2x1ZGUgPEhpZFBhcnNlci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworCit1c2luZyBIaWRVdGlsOjpIaWRQYXJzZXI7Cit1c2luZyBIaWRVdGlsOjpIaWRSZXBvcnQ7Cit1c2luZyBIaWRVdGlsOjpIaWRJdGVtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgSGlkUmF3U2Vuc29yRGV2aWNlOworY2xhc3MgQ29ubmVjdGlvbkRldGVjdG9yOworCitjbGFzcyBIaWRSYXdTZW5zb3JEYWVtb24gOiBwdWJsaWMgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24geworICAgIGZyaWVuZCBjbGFzcyBIaWRSYXdTZW5zb3JEYWVtb25UZXN0OworcHVibGljOgorICAgIEhpZFJhd1NlbnNvckRhZW1vbihEeW5hbWljU2Vuc29yTWFuYWdlciYgbWFuYWdlcik7CisgICAgdmlydHVhbCB+SGlkUmF3U2Vuc29yRGFlbW9uKCkgPSBkZWZhdWx0OworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIEJhc2VTZW5zb3JWZWN0b3IgY3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSk7CisKKyAgICBjbGFzcyBIaWRSYXdTZW5zb3I7CisgICAgdm9pZCByZWdpc3RlckV4aXN0aW5nKCk7CisKKyAgICBzcDxDb25uZWN0aW9uRGV0ZWN0b3I+IG1EZXRlY3RvcjsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPEhpZFJhd1NlbnNvckRldmljZT4+IG1IaWRSYXdTZW5zb3JEZXZpY2VzOworfTsKKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9EQUVNT05fSAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGV2aWNlLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTRjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGV2aWNlLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJIaWRSYXdTZW5zb3JEZXZpY2UuaCIKKyNpbmNsdWRlICJIaWRSYXdTZW5zb3IuaCIKKyNpbmNsdWRlICJIaWRTZW5zb3JEZWYuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWRyYXcuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK3VzaW5nIG5hbWVzcGFjZSBIaWQ6OlNlbnNvcjo6U2Vuc29yVHlwZVVzYWdlOwordXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpQcm9wZXJ0eVVzYWdlOworCitjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiBIaWRSYXdTZW5zb3JEZXZpY2U6OnNJbnRlcmVzdGVkeworICAgICAgICBBQ0NFTEVST01FVEVSXzNELCBHWVJPTUVURVJfM0QsIENPTVBBU1NfM0QsIENVU1RPTX07CisKK3NwPEhpZFJhd1NlbnNvckRldmljZT4gSGlkUmF3U2Vuc29yRGV2aWNlOjpjcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcgJmRldk5hbWUpIHsKKyAgICBzcDxIaWRSYXdTZW5zb3JEZXZpY2U+IGRldmljZShuZXcgSGlkUmF3U2Vuc29yRGV2aWNlKGRldk5hbWUpKTsKKyAgICAvLyBvZmZzZXQgKzEgc3Ryb25nIGNvdW50IGFkZGVkIGJ5IGNvbnN0cnVjdG9yCisgICAgZGV2aWNlLT5kZWNTdHJvbmcoZGV2aWNlLmdldCgpKTsKKworICAgIGlmIChkZXZpY2UtPm1WYWxpZCkgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK30KKworSGlkUmF3U2Vuc29yRGV2aWNlOjpIaWRSYXdTZW5zb3JEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcgJmRldk5hbWUpCisgICAgICAgIDogUmVmQmFzZSgpLCBIaWRSYXdEZXZpY2UoZGV2TmFtZSwgc0ludGVyZXN0ZWQpLAorICAgICAgICAgIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLCBtVmFsaWQoZmFsc2UpIHsKKyAgICAvLyBjcmVhdGUgSGlkUmF3U2Vuc29yIG9iamVjdHMgZnJvbSBkaWdlc3QKKyAgICAvLyBIaWRSYXdTZW5zb3Igb2JqZWN0IHdpbGwgdGFrZSBzcDxIaWRSYXdTZW5zb3JEZXZpY2U+IGFzIHBhcmFtZXRlciwgc28gaW5jcmVtZW50IHN0cm9uZyBjb3VudAorICAgIC8vIHRvIHByZXZlbnQgInRoaXMiIGJlaW5nIGRlc3RydWN0ZWQuCisgICAgdGhpcy0+aW5jU3Ryb25nKHRoaXMpOworCisgICAgaWYgKCFIaWRSYXdEZXZpY2U6OmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZkaWdlc3QgOiBtRGlnZXN0VmVjdG9yKSB7IC8vIGZvciBlYWNoIHVzYWdlIC0gdmVjPFJlcG9ydFBhY2tldD4gcGFpcgorICAgICAgICB1aW50MzJfdCB1c2FnZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkaWdlc3QuZnVsbFVzYWdlKTsKKyAgICAgICAgc3A8SGlkUmF3U2Vuc29yPiBzKG5ldyBIaWRSYXdTZW5zb3IodGhpcywgdXNhZ2UsIGRpZ2VzdC5wYWNrZXRzKSk7CisgICAgICAgIGlmIChzLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFja2V0IDogZGlnZXN0LnBhY2tldHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFja2V0LnR5cGUgPT0gSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9JTlBVVCkgeyAvLyBvbmx5IHVzZWQgZm9yIGlucHV0IG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgbVNlbnNvcnMuZW1wbGFjZShwYWNrZXQuaWQvKiByZXBvcnQgaWQqLywgcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtU2Vuc29ycy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcnVuKCJIaWRSYXdTZW5zb3IiKTsKKyAgICBtVmFsaWQgPSB0cnVlOworfQorCitIaWRSYXdTZW5zb3JEZXZpY2U6On5IaWRSYXdTZW5zb3JEZXZpY2UoKSB7CisgICAgQUxPR1YoIn5IaWRSYXdTZW5zb3JEZXZpY2UgJXAiLCB0aGlzKTsKKyAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICBBTE9HVigifkhpZFJhd1NlbnNvckRldmljZSAlcCwgdGhyZWFkIGV4aXRlZCIsIHRoaXMpOworfQorCitib29sIEhpZFJhd1NlbnNvckRldmljZTo6dGhyZWFkTG9vcCgpIHsKKyAgICBBTE9HVigiSGlkIFJhdyBEZXZpY2UgdGhyZWFkIHN0YXJ0ZWQgJXAiLCB0aGlzKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXI7CisgICAgYm9vbCByZXQ7CisgICAgdWludDhfdCB1c2FnZUlkOworCisgICAgd2hpbGUoIVRocmVhZDo6ZXhpdFBlbmRpbmcoKSkgeworICAgICAgICByZXQgPSByZWNlaXZlUmVwb3J0KCZ1c2FnZUlkLCAmYnVmZmVyKTsKKyAgICAgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBpID0gbVNlbnNvcnMuZmluZCh1c2FnZUlkKTsKKyAgICAgICAgaWYgKGkgPT0gbVNlbnNvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBvZiB1bmtub3cgdXNhZ2UgaWQgJXUgcmVjZWl2ZWQiLCB1c2FnZUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaS0+c2Vjb25kLT5oYW5kbGVJbnB1dCh1c2FnZUlkLCBidWZmZXIpOworICAgIH0KKworICAgIEFMT0dJKCJIaWQgUmF3IERldmljZSB0aHJlYWQgZW5kZWQgZm9yICVwIiwgdGhpcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitCYXNlU2Vuc29yVmVjdG9yIEhpZFJhd1NlbnNvckRldmljZTo6Z2V0U2Vuc29ycygpIGNvbnN0IHsKKyAgICBCYXNlU2Vuc29yVmVjdG9yIHJldDsKKyAgICBzdGQ6OnNldDxzcDxCYXNlU2Vuc29yT2JqZWN0Pj4gc2V0OworICAgIGZvciAoY29uc3QgYXV0byAmcyA6IG1TZW5zb3JzKSB7CisgICAgICAgIGlmIChzZXQuZmluZChzLnNlY29uZCkgPT0gc2V0LmVuZCgpKSB7CisgICAgICAgICAgICByZXQucHVzaF9iYWNrKHMuc2Vjb25kKTsKKyAgICAgICAgICAgIHNldC5pbnNlcnQocy5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvckRldmljZS5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvckRldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZDQzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGV2aWNlLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfU0VOU09SX0RFVklDRV9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfU0VOU09SX0RFVklDRV9ICisKKyNpbmNsdWRlICJCYXNlU2Vuc29yT2JqZWN0LmgiCisjaW5jbHVkZSAiQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uaCIgLy8gQmFzZVNlbnNvclZlY3RvcgorI2luY2x1ZGUgIkhpZFJhd0RldmljZS5oIgorI2luY2x1ZGUgIkhpZFJhd1NlbnNvci5oIgorCisjaW5jbHVkZSA8SGlkUGFyc2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK2NsYXNzIEhpZFJhd1NlbnNvckRldmljZSA6IHB1YmxpYyBIaWRSYXdEZXZpY2UsIHB1YmxpYyBUaHJlYWQgeworcHVibGljOgorICAgIHN0YXRpYyBzcDxIaWRSYXdTZW5zb3JEZXZpY2U+IGNyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2TmFtZSk7CisgICAgdmlydHVhbCB+SGlkUmF3U2Vuc29yRGV2aWNlKCk7CisKKyAgICAvLyBnZXQgYSBsaXN0IG9mIHNlbnNvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV2aWNlCisgICAgQmFzZVNlbnNvclZlY3RvciBnZXRTZW5zb3JzKCkgY29uc3Q7Citwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiBzSW50ZXJlc3RlZDsKKworICAgIC8vIGNvbnN0cnVjdG9yIHdpbGwgcmVzdWx0IGluICsxIHN0cm9uZyBjb3VudAorICAgIGV4cGxpY2l0IEhpZFJhd1NlbnNvckRldmljZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2TmFtZSk7CisgICAgLy8gaW1wbGVtZW50IGZ1bmN0aW9uIG9mIFRocmVhZAorICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVuc2lnbmVkIGludC8qcmVwb3J0SWQqLywgc3A8SGlkUmF3U2Vuc29yPj4gbVNlbnNvcnM7CisgICAgYm9vbCBtVmFsaWQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfREVWSUNFX0gKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFNlbnNvckRlZi5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFNlbnNvckRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MjhiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkU2Vuc29yRGVmLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBISURfU0VOU09SX0RFRl9IXworI2RlZmluZSBISURfU0VOU09SX0RFRl9IXworbmFtZXNwYWNlIEhpZCB7CituYW1lc3BhY2UgU2Vuc29yIHsKK25hbWVzcGFjZSBHZW5lcmFsVXNhZ2UgeworZW51bSB7CisgICAgU1RBVEUgPSAweDIwMDIwMSwKKyAgICBFVkVOVCA9IDB4MjAwMjAyLAorfTsKKworfSAvL25hbWVzcGFjZSBVc2FnZQorbmFtZXNwYWNlIFByb3BlcnR5VXNhZ2UgeworZW51bSB7CisgICAgRlJJRU5ETFlfTkFNRSA9IDB4MjAwMzAxLAorICAgIE1JTklNVU1fUkVQT1JUX0lOVEVSVkFMID0gMHgyMDAzMDQsCisgICAgUEVSU0lTVEVOVF9VTklRVUVfSUQgPSAweDIwMDMwMiwKKyAgICBQT1dFUl9TVEFURSA9IDB4MjAwMzE5LAorICAgIFJBTkdFX01BWElNVU0gPSAweDIwMDMxNCwKKyAgICBSQU5HRV9NSU5JTVVNID0gMHgyMDAzMTUsCisgICAgUkVQT1JUSU5HX1NUQVRFID0gMHgyMDAzMTYsCisgICAgUkVQT1JUX0lOVEVSVkFMID0gMHgyMDAzMEUsCisgICAgUkVTT0xVVElPTiA9IDB4MjAwMzEzLAorICAgIFNBTVBMSU5HX1JBVEUgPTB4MjAwMzE3LAorICAgIFNFTlNPUl9DT05ORUNUSU9OX1RZUEUgPSAweDIwMDMwOSwKKyAgICBTRU5TT1JfREVTQ1JJUFRJT04gPSAweDIwMDMwOCwKKyAgICBTRU5TT1JfTUFOVUZBQ1RVUkVSID0gMHgyMDAzMDUsCisgICAgU0VOU09SX01PREVMID0gMHgyMDAzMDYsCisgICAgU0VOU09SX1NFUklBTF9OVU1CRVIgPSAweDIwMDMwNywKKyAgICBTRU5TT1JfU1RBVFVTID0gMHgyMDAzMDMsCit9OworfSAvLyBuc21lc3BhY2UgUHJvcGVydHlVc2FnZQorCituYW1lc3BhY2UgU2Vuc29yVHlwZVVzYWdlIHsKK2VudW0geworICAgIEFDQ0VMRVJPTUVURVJfM0QgPSAweDIwMDA3MywKKyAgICBDT01QQVNTXzNEID0gMHgyMDAwODMsCisgICAgQ1VTVE9NID0gMHgyMDAwRTEsCisgICAgREVWSUNFX09SSUVOVEFUSU9OID0gMHgyMDAwOEEsCisgICAgR1lST01FVEVSXzNEID0gMHgyMDAwNzYsCit9OworfSAvLyBuYW1lc3BhY2UgU2Vuc29yVHlwZVVzYWdlCisKK25hbWVzcGFjZSBSZXBvcnRVc2FnZSB7CitlbnVtIHsKKyAgICBBQ0NFTEVSQVRJT05fWF9BWElTID0gMHgyMDA0NTMsCisgICAgQUNDRUxFUkFUSU9OX1lfQVhJUyA9IDB4MjAwNDU0LAorICAgIEFDQ0VMRVJBVElPTl9aX0FYSVMgPSAweDIwMDQ1NSwKKyAgICBBTkdVTEFSX1ZFTE9DSVRZX1hfQVhJUyA9IDB4MjAwNDU3LAorICAgIEFOR1VMQVJfVkVMT0NJVFlfWV9BWElTID0gMHgyMDA0NTgsCisgICAgQU5HVUxBUl9WRUxPQ0lUWV9aX0FYSVMgPSAweDIwMDQ1OSwKKyAgICBDVVNUT01fVkFMVUVfMSA9IDB4MjAwNTQ0LAorICAgIENVU1RPTV9WQUxVRV8yID0gMHgyMDA1NDUsCisgICAgQ1VTVE9NX1ZBTFVFXzMgPSAweDIwMDU0NiwKKyAgICBDVVNUT01fVkFMVUVfNCA9IDB4MjAwNTQ3LAorICAgIENVU1RPTV9WQUxVRV81ID0gMHgyMDA1NDgsCisgICAgQ1VTVE9NX1ZBTFVFXzYgPSAweDIwMDU0OSwKKyAgICBNQUdORVRJQ19GTFVYX1hfQVhJUyA9IDB4MjAwNDg1LAorICAgIE1BR05FVElDX0ZMVVhfWV9BWElTID0gMHgyMDA0ODYsCisgICAgTUFHTkVUSUNfRkxVWF9aX0FYSVMgPSAweDIwMDQ4NywKKyAgICBNQUdORVRPTUVURVJfQUNDVVJBQ1kgPSAweDIwMDQ4OCwKKyAgICBPUklFTlRBVElPTl9RVUFURVJOSU9OID0gMHgyMDA0ODMsCit9OworfSAvLyBuYW1lc3BhY2UgUmVwb3J0VXNhZ2UKKworbmFtZXNwYWNlIFJhd01pbk1heCB7CitlbnVtIHsKKyAgICBSRVBPUlRJTkdfU1RBVEVfTUlOID0gMCwKKyAgICBSRVBPUlRJTkdfU1RBVEVfTUFYID0gNSwKKyAgICBQT1dFUl9TVEFURV9NSU4gPSAwLAorICAgIFBPV0VSX1NUQVRFX01BWCA9IDUsCit9OworfSAvLyBuYW1lc3BhY2UgUmF3TWluTWF4CisKK25hbWVzcGFjZSBTdGF0ZVZhbHVlIHsKK2VudW0geworICAgIFBPV0VSX1NUQVRFX0ZVTExfUE9XRVIgPSAxLAorICAgIFBPV0VSX1NUQVRFX1BPV0VSX09GRiA9IDUsCisKKyAgICBSRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UID0gMSwKKyAgICBSRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlQgPSAwLAorfTsKK30gLy8gU3RhdGVWYWx1ZQorfSAvLyBuYW1lc3BhY2UgU2Vuc29yCit9IC8vIG5hbWVzcGFjZSBIaWQKKyNlbmRpZiAvLyBISURfU0VOU09SX0RFRl9IXworCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvQW5kcm9pZC5tayBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMWQ4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDk5IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitDT01NT05fQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IgLVdleHRyYQorCitoaWRwYXJzZXJfc3JjIDo9IFwKKyAgICBIaWRHbG9iYWwuY3BwIFwKKyAgICBIaWRJdGVtLmNwcCBcCisgICAgSGlkTG9jYWwuY3BwIFwKKyAgICBIaWRQYXJzZXIuY3BwIFwKKyAgICBIaWRSZXBvcnQuY3BwIFwKKyAgICBIaWRUcmVlLmNwcAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJoaWRwYXJzZXIKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisjIGluZGVuZGVkIHRvIGJlIHVzZWQgYnkgaGFsIGNvbXBvbmVudHMsIHRodXMgcHJvcGlldGFyeQorTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKKworTE9DQUxfQ0ZMQUdTICs9ICQoQ09NTU9OX0NGTEFHUykgLURMT0dfVEFHPVwiSGlkVXRpbFwiCitMT0NBTF9TUkNfRklMRVMgOj0gJChoaWRwYXJzZXJfc3JjKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJiYXNlCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjCisjIGhvc3Qgc2lkZSBzaGFyZWQgbGlicmFyeSAoZm9yIGhvc3QgdGVzdCwgZXhhbXBsZSwgZXRjKQorIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliaGlkcGFyc2VyX2hvc3QKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyArPSAkKENPTU1PTl9DRkxBR1MpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGhpZHBhcnNlcl9zcmMpCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCitpbmNsdWRlICQoQlVJTERfSE9TVF9TSEFSRURfTElCUkFSWSkKKworIworIyBFeGFtcGxlIG9mIEhpZFBhcnNlcgorIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gaGlkcGFyc2VyX2V4YW1wbGUKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyArPSAkKENPTU1PTl9DRkxBR1MpCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoaGlkcGFyc2VyX3NyYykgXAorICAgIHRlc3QvSGlkUGFyc2VyRXhhbXBsZS5jcHAgXAorICAgIHRlc3QvVGVzdEhpZERlc2NyaXB0b3IuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS90ZXN0CitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCisjCisjIEFub3RoZXIgZXhhbXBsZSBvZiBIaWRQYXJzZXIKKyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGhpZHBhcnNlcl9leGFtcGxlMgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ0ZMQUdTICs9ICQoQ09NTU9OX0NGTEFHUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChoaWRwYXJzZXJfc3JjKSBcCisgICAgdGVzdC9IaWRQYXJzZXJFeGFtcGxlMi5jcHAgXAorICAgIHRlc3QvVGVzdEhpZERlc2NyaXB0b3IuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS90ZXN0CitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCisjCisjIFRlc3QgZm9yIFRyaVN0YXRlIHRlbXBsYXRlCisjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSB0cmlzdGF0ZV90ZXN0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgKz0gJChDT01NT05fQ0ZMQUdTKQorTE9DQUxfU1JDX0ZJTEVTIDo9IHRlc3QvVHJpU3RhdGVUZXN0LmNwcAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAgbGliZ3Rlc3QgXAorICAgICBsaWJndGVzdF9tYWluCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS90ZXN0CitpbmNsdWRlICQoQlVJTERfSE9TVF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWREZWZzLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkRGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDQ1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkRGVmcy5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSElEVVRJTF9ISURERUZTX0hfCisjZGVmaW5lIEhJRFVUSUxfSElEREVGU19IXworCituYW1lc3BhY2UgSGlkVXRpbCB7CisKKy8vIEhJRCBzcGVjaWZpY2F0aW9uIGNvbnN0YW50cyBkZWZpbml0aW9uCisvLworLy8gRGVmaW5pdGlvbnMgYXJlIGZyb20gSElEIHNwZWNpZmljYXRpb24gdjEuMTEsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGh0dHA6Ly93d3cudXNiLm9yZworLy8KKy8vIFByZWZlcnJlZCBuYW1lc3BhY2UgZm9yIG5hbWVzcGFjZSByZXN0cmljdGlvbiB0aGFuIGVudW0gY2xhc3MgYXMgZW51bSBjbGFzcyBoYXMgc3Ryb25nIHR5cGUKKy8vIHdoaWNoIGlzIGluY29udmVuaWVudCBpbiBhIHBhcnNlciwgaW4gd2hpY2ggaW5wdXQgYmluYXJ5IHZhbHVlcyBoYXMgdG8gYmUgY29tcGFyZWQgd2l0aCB0aGVzZQorLy8gZGVmaW5pdGlvbnMgZnJlcXVuZXRseS4KK25hbWVzcGFjZSBIaWREZWYgeworLy8gSGlkIHNwZWMgNi4yLjIuMworbmFtZXNwYWNlIFRhZ1R5cGUgeworZW51bSB7CisgICAgTUFJTiwKKyAgICBHTE9CQUwsCisgICAgTE9DQUwsCisgICAgUkVTRVJWRUQKK307Cit9IC8vIG5hbWVzcGFjZSBUYWdUeXBlCisKKy8vIEhJRCBzcGVjIDYuMi4yLjQKK25hbWVzcGFjZSBSZXBvcnRGbGFnIHsKK2VudW0geworICAgIERBVEFfQ09OU1QgPSAxLAorICAgIEFSUkFZX1ZBUklBQkxFID0gMiwKKyAgICBXUkFQID0gNCwKKyAgICBOT05MSU5FQVIgPSA4LAorICAgIE5PX1BSRUZFUlJFRCA9IDB4MTAsCisgICAgTlVMTF9TVEFURSA9IDB4MjAsCisgICAgVk9MQVRJTEUgPSAweDQwLAorICAgIC8vIGJpdCA3IHJlc2VydmVkCisgICAgQlVGRkVSRURfQllURVMgPSAweDEwMAorfTsKK30gLy8gbmFtZXNwYWNlIFJlcG9ydEZsYWcKKworLy8gSElEIHNwZWMgNi4yLjIuNQorbmFtZXNwYWNlIE1haW5UYWcgeworZW51bSB7CisgICAgSU5QVVQgPSA4LAorICAgIE9VVFBVVCA9IDksCisgICAgQ09MTEVDVElPTiA9IDEwLAorICAgIEZFQVRVUkUgPSAxMSwKKyAgICBFTkRfQ09MTEVDVElPTiA9IDEyLAorICAgIExPTkdfSVRFTSA9IDE1LAorfTsKK30gLy8gbmFtZXNwYWNlIE1haW5UYWcKKworLy8gSElEIHNwZWMgNi4yLjIuNgorbmFtZXNwYWNlIENvbGxlY3Rpb25UeXBlIHsKK2VudW0geworICAgIFBIWVNJQ0FMID0gMCwKKyAgICBBUFBMSUNBVElPTiwKKyAgICBMT0dJQ0FMLAorICAgIFJFUE9SVCwKKyAgICBOQU1FRF9BUlJBWSwKKyAgICBVU0FHRV9TV0lUQ0gsCisgICAgVVNBR0VfTU9ESUZJRVIKK307Cit9IC8vIG5hbWVzcGFjZSBDb2xsZWN0aW9uVHlwZQorCisvLyBISUQgc3BlYyA2LjIuMi43CituYW1lc3BhY2UgR2xvYmFsVGFnIHsKK2VudW0geworICAgIFVTQUdFX1BBR0UsCisgICAgTE9HSUNBTF9NSU5JTVVNLAorICAgIExPR0lDQUxfTUFYSU1VTSwKKyAgICBQSFlTSUNBTF9NSU5JTVVNLAorICAgIFBIWVNJQ0FMX01BWElNVU0sCisgICAgVU5JVF9FWFBPTkVOVCwKKyAgICBVTklULAorICAgIFJFUE9SVF9TSVpFLAorICAgIFJFUE9SVF9JRCwKKyAgICBSRVBPUlRfQ09VTlQsCisgICAgUFVTSCwKKyAgICBQT1AKK307Cit9IC8vbmFtZXNwYWNlIEdsb2JhbFRhZworCisvLyBISUQgc3BlYyA2LjIuMi44CituYW1lc3BhY2UgTG9jYWxUYWcgeworZW51bSBIaWRMb2NhbFRhZyB7CisgICAgVVNBR0UsCisgICAgVVNBR0VfTUlOSU1VTSwKKyAgICBVU0FHRV9NQVhJTVVNLAorICAgIERFU0lHTkFUT1JfSU5ERVgsCisgICAgREVTSUdOQVRPUl9NSU5JTVVNLAorICAgIERFU0lHTkFUT1JfTUFYSU1VTSwKKyAgICAvLyB0aGVyZSBpcyBhIGhvbGUgaGVyZSBpbiB0aGUgc3BlYworICAgIFNUUklOR19JTkRFWCA9IDcsCisgICAgU1RSSU5HX01JTklNVU0sCisgICAgU1RSSU5HX01BWElNVU0sCisgICAgREVMSU1JVE9SCit9OworfSAvLyBuYW1lc3BhY2UgTG9jYWxUYWcKKworfSAvL25hbWVzcGFjZSBIaWREZWYKK30gLy9uYW1lc3BhY2UgSGlkVXRpbAorCisjZW5kaWYgLy8gSElEVVRJTF9ISURERUZTX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkR2xvYmFsLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRHbG9iYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDcxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkR2xvYmFsLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkRGVmcy5oIgorI2luY2x1ZGUgIkhpZEdsb2JhbC5oIgorI2luY2x1ZGUgIkhpZExvZy5oIgorCituYW1lc3BhY2UgSGlkVXRpbCB7Cit1c2luZyBuYW1lc3BhY2UgSGlkRGVmOjpHbG9iYWxUYWc7CisKK2Jvb2wgSGlkR2xvYmFsOjphcHBlbmQoY29uc3QgSGlkSXRlbSAmaSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6OlRhZ1R5cGU7CisgICAgaWYgKGkudHlwZSAhPSBHTE9CQUwpIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZEdsb2JhbDo6YXBwZW5kIGNhbm5vdCBwcm9jZXNzIHRhZyB0aGF0IGlzIG5vdCBnbG9iYWwsICIgPDwgaSA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpLnRhZyA9PSBQVVNIIHx8IGkudGFnID09IFBPUCkgeworICAgICAgICBMT0dfRSA8PCAiUFVTSCBhbmQgUE9QIHNob3VsZCBiZSBoYW5kbGVkIGluIEhpZEdsb2JhbFN0YWNrLCAiIDw8IGkgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgc2lnbmVkSW50ZWdlcjsKKyAgICB1bnNpZ25lZCB1bnNpZ25lZEludGVnZXI7CisgICAgYm9vbCBzaWduZWRFcnJvciA9ICFpLmRhdGFBc1NpZ25lZCgmc2lnbmVkSW50ZWdlcik7CisgICAgYm9vbCB1bnNpZ25lZEVycm9yID0gIWkuZGF0YUFzVW5zaWduZWQoJnVuc2lnbmVkSW50ZWdlcik7CisKKyAgICBib29sIHZhbHVlRXJyb3IgPSBmYWxzZTsKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgc3dpdGNoIChpLnRhZykgeworICAgICAgICBjYXNlIFVTQUdFX1BBR0U6CisgICAgICAgICAgICB1c2FnZVBhZ2UgPSB1bnNpZ25lZEludGVnZXI7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gdW5zaWduZWRFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExPR0lDQUxfTUlOSU1VTToKKyAgICAgICAgICAgIGxvZ2ljYWxNaW4gPSBzaWduZWRJbnRlZ2VyOworICAgICAgICAgICAgdmFsdWVFcnJvciA9IHNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTE9HSUNBTF9NQVhJTVVNOgorICAgICAgICAgICAgbG9naWNhbE1heCA9IHNpZ25lZEludGVnZXI7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gc2lnbmVkRXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQSFlTSUNBTF9NSU5JTVVNOgorICAgICAgICAgICAgcGh5c2ljYWxNaW4gPSBzaWduZWRJbnRlZ2VyOworICAgICAgICAgICAgdmFsdWVFcnJvciA9IHNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEhZU0lDQUxfTUFYSU1VTToKKyAgICAgICAgICAgIHBoeXNpY2FsTWF4ID0gc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSBzaWduZWRFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVOSVRfRVhQT05FTlQ6CisgICAgICAgICAgICBleHBvbmVudCA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSB1bnNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVU5JVDoKKyAgICAgICAgICAgIHVuaXQgPSB1bnNpZ25lZEludGVnZXI7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gdW5zaWduZWRFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFUE9SVF9TSVpFOgorICAgICAgICAgICAgcmVwb3J0U2l6ZSA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSB1bnNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVQT1JUX0lEOgorICAgICAgICAgICAgcmVwb3J0SWQgPSB1bnNpZ25lZEludGVnZXI7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gdW5zaWduZWRFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFUE9SVF9DT1VOVDoKKyAgICAgICAgICAgIHJlcG9ydENvdW50ID0gdW5zaWduZWRJbnRlZ2VyOworICAgICAgICAgICAgdmFsdWVFcnJvciA9IHVuc2lnbmVkRXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19FIDw8ICJ1bmtub3duIGdsb2JhbCB0YWcsICIgPDwgaSA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICh2YWx1ZUVycm9yKSB7CisgICAgICAgIExPR19FIDw8ICJDYW5ub3QgZ2V0IHNpZ25lZCAvIHVuc2lnbmVkIGRhdGEgYXQgIiA8PCBpIDw8IExPR19FTkRMOworICAgICAgICByZXQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBIaWRHbG9iYWxTdGFjazo6YXBwZW5kKGNvbnN0IEhpZEl0ZW0gJmkpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgSGlkRGVmOjpUYWdUeXBlOworICAgIGlmIChpLnR5cGUgIT0gR0xPQkFMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgaWYgKGkudGFnID09IFBVU0gpIHsKKyAgICAgICAgbVN0YWNrLnB1c2hfYmFjayh0b3AoKSk7CisgICAgfSBlbHNlIGlmIChpLnRhZyA9PSBQT1ApIHsKKyAgICAgICAgbVN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIGlmIChtU3RhY2suc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1TdGFjay5wdXNoX2JhY2soSGlkR2xvYmFsKCkpOyAvLyBmYWlsLXNhZmUKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbVN0YWNrLmJhY2soKS5hcHBlbmQoaSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK0hpZEdsb2JhbFN0YWNrOjpIaWRHbG9iYWxTdGFjaygpIHsKKyAgICAvLyBkZWZhdWx0IGVsZW1lbnQKKyAgICBtU3RhY2sucHVzaF9iYWNrKEhpZEdsb2JhbCgpKTsKK30KKworY29uc3QgSGlkR2xvYmFsJiBIaWRHbG9iYWxTdGFjazo6dG9wKCkgY29uc3QgeworICAgIHJldHVybiBtU3RhY2suYmFjaygpOworfQorCit9IC8vIG5hbWVzcGFjZSBIaWRVdGlsCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkR2xvYmFsLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkR2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxMzlkMAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRHbG9iYWwuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSElEVVRJTF9ISURHTE9CQUxfSF8KKyNkZWZpbmUgSElEVVRJTF9ISURHTE9CQUxfSF8KKworI2luY2x1ZGUgIkhpZEl0ZW0uaCIKKyNpbmNsdWRlICJUcmlTdGF0ZS5oIgorCituYW1lc3BhY2UgSGlkVXRpbCB7CisvLyBBIHNldCBvZiBnbG9iYWwgc3RhdGVzIHRoYXQgcGFyc2VyIGhhcyB0byBrZWVwIHRyYWNrIGR1cmluZyBwYXJzaW5nLgorLy8gVGhleSBhcmUgYWxsIHNwZWNpZmllZCBpbiBISUQgc3BlYyB2MS4xMSBzZWN0aW9uIDYuMi4yLjcKK3N0cnVjdCBIaWRHbG9iYWwgeworICAgIC8vIGFkZCBhIHRva2VuIGFuZCBjaGFuZ2UgZ2xvYmFsIHN0YXRlcywgcmV0dXJucyB2YWx1ZSBpbmRpY2F0ZXMgaWYgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKKyAgICBib29sIGFwcGVuZChjb25zdCBIaWRJdGVtICZpKTsKKworICAgIHRyaV91aW50IHVzYWdlUGFnZTsKKyAgICB0cmlfaW50ICBsb2dpY2FsTWluOworICAgIHRyaV9pbnQgIGxvZ2ljYWxNYXg7CisgICAgdHJpX2ludCAgcGh5c2ljYWxNaW47CisgICAgdHJpX2ludCAgcGh5c2ljYWxNYXg7CisgICAgdHJpX3VpbnQgZXhwb25lbnQ7CisgICAgdHJpX3VpbnQgdW5pdDsKKyAgICB0cmlfdWludCByZXBvcnRTaXplOworICAgIHRyaV91aW50IHJlcG9ydElkOworICAgIHRyaV91aW50IHJlcG9ydENvdW50OworfTsKKworLy8gSElEIHNwZWNzIGFsbG93cyBQVVNIIGFuZCBQT1AgdG8gc2F2ZSBhIHNuYXBzaG90IG9mIGN1cnJlbnQgZ2xvYmFsIHN0YXRlcyBhbmQgY29tZSBiYWNrIHRvIHRoZQorLy8gc2F2ZWQgc2F0ZXMgbGF0ZXIuIEhpZFN0YWNrIG1hbmFnZXMgdGhpcyBsb2dpYy4gTm90ZSB0aGF0IFBVU0ggYW5kIFBPUCBhcmUgYWxzbyBIaWRJdGVtcywgc28KKy8vIHRoZXJlIGlzIG5vIGV4cGxpY2l0IHB1c2ggYW5kIHBvcCBmdW5jdGlvbiBpbiB0aGlzIHN0YWNrIGltcGxlbWVudGF0aW9uLgorY2xhc3MgSGlkR2xvYmFsU3RhY2sgeworcHVibGljOgorICAgIEhpZEdsb2JhbFN0YWNrKCk7CisKKyAgICAvLyBhZGQgYSB0b2tlbiBhbmQgY2hhbmdlIGdsb2JhbCBzdGF0ZXMsIHJldHVybnMgdmFsdWUgaW5kaWNhdGVzIGlmIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsCisgICAgLy8gaXQgdGhlIHRva2VuIGlzIHB1c2gvcG9wLCB0aGUgc3RhY2sgcHVzaC9wb3AgYWNjb3JkaW5nbHkuCisgICAgYm9vbCBhcHBlbmQoY29uc3QgSGlkSXRlbSAmaSk7CisKKyAgICAvLyBnZXQgcmVmZXJlbmNlIHRvIHRvcCBlbGVtZW50IG9uIHRoZSBzdGFjaworICAgIGNvbnN0IEhpZEdsb2JhbCYgdG9wKCkgY29uc3Q7Citwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPEhpZEdsb2JhbD4gbVN0YWNrOworfTsKKworfSAvL25hbWVzcGFjZSBIaWRVdGlsCisKKyNlbmRpZiAvLyBISURVVElMX0hJREdMT0FCTF9IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZEl0ZW0uY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZEl0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MDRkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkSXRlbS5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkhpZEl0ZW0uaCIKKyNpbmNsdWRlICJIaWREZWZzLmgiCisjaW5jbHVkZSAiU3RyZWFtSW9VdGlsLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBIaWRVdGlsIHsKKworYm9vbCBIaWRJdGVtOjpkYXRhQXNVbnNpZ25lZCh1bnNpZ25lZCBpbnQgKm91dCkgY29uc3QgIHsKKyAgICBpZiAoZGF0YS5zaXplKCkgPiA0IHx8IGRhdGEuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpvdXQgPSAwOworICAgIGludCBzaGlmdCA9IDA7CisKKyAgICBmb3IgKGF1dG8gaSA6IGRhdGEpIHsKKyAgICAgICAgKm91dCB8PSAoaSA8PCBzaGlmdCk7CisgICAgICAgIHNoaWZ0ICs9IDg7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhpZEl0ZW06OmRhdGFBc1NpZ25lZChpbnQgKm91dCkgY29uc3QgeworICAgIHVuc2lnbmVkIGludCB1OworICAgIGlmICghZGF0YUFzVW5zaWduZWQoJnUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2l6ZV90IGJpdFNpemVfMSA9IGRhdGEuc2l6ZSgpICogOCAtIDE7CisgICAgdW5zaWduZWQgaW50IHNpZ24gPSB1ICYgKDEgPDwgYml0U2l6ZV8xKTsKKyAgICAqb3V0ID0gdSB8ICgoc2lnbiA9PSAwKSA/IDAgOiAoIH4wIDw8IGJpdFNpemVfMSkpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnZlY3RvcjxIaWRJdGVtPiBIaWRJdGVtOjp0b2tlbml6ZShjb25zdCB1aW50OF90ICpiZWdpbiwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBjb25zdHJ1Y3QgYSBzdHJlYW0KKyAgICBjaGFydmVjdG9yYnVmPHVuc2lnbmVkIGNoYXI+IGJ1ZihiZWdpbiwgc2l6ZSk7CisgICAgc3RkOjppc3RyZWFtIGlzKCZidWYpOworICAgIHJldHVybiB0b2tlbml6ZShpcyk7Cit9CisKK3N0ZDo6dmVjdG9yPEhpZEl0ZW0+IEhpZEl0ZW06OnRva2VuaXplKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZkZXNjcmlwdG9yKSB7CisgICAgLy8gY29uc3RydWN0IGEgc3RyZWFtCisgICAgY2hhcnZlY3RvcmJ1Zjx1bnNpZ25lZCBjaGFyPiBidWYoZGVzY3JpcHRvcik7CisgICAgc3RkOjppc3RyZWFtIGlzKCZidWYpOworICAgIHJldHVybiB0b2tlbml6ZShpcyk7Cit9CisKK3N0ZDo6dmVjdG9yPEhpZEl0ZW0+IEhpZEl0ZW06OnRva2VuaXplKHN0ZDo6aXN0cmVhbSAmaXMpIHsKKyAgICBzdGQ6OnZlY3RvcjxIaWRJdGVtPiBoaWRUb2tlbjsKKworICAgIC8vIHRoaXMgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHNraXBwaW5nIGNoYXJhY3RlcnMKKyAgICBpcy51bnNldGYoc3RkOjppb3NfYmFzZTo6c2tpcHdzKTsKKyAgICB3aGlsZSAoIWlzLmVvZigpKSB7CisgICAgICAgIEhpZEl0ZW0gaTsKKyAgICAgICAgaXMgPj4gaTsKKyAgICAgICAgaWYgKGkudmFsaWQpIHsKKyAgICAgICAgICAgIGhpZFRva2VuLnB1c2hfYmFjayhpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBoaWRUb2tlbjsKK30KKworc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSAmaXMsIEhpZFV0aWw6OkhpZEl0ZW0gJmgpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgSGlkVXRpbDo6SGlkRGVmOjpNYWluVGFnOworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWRVdGlsOjpIaWREZWY6OlRhZ1R5cGU7CisKKyAgICBoLnZhbGlkID0gZmFsc2U7CisgICAgaC5vZmZzZXQgPSBpcy50ZWxsZygpOworICAgIGguYnl0ZVNpemUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgZmlyc3Q7CisgICAgaXMgPj4gZmlyc3Q7CisgICAgaWYgKCFpcy5lb2YoKSkgeworICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGxlblRhYmxlW10gPSB7IDAsIDEsIDIsIDQgfTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IGxlblRhYmxlW2ZpcnN0ICYgMHgzXTsgLy8gbG93IDIgYml0cyBhcmUgbGVuZ3RoIGRlc2NyaXB0b3IKKyAgICAgICAgaC50YWcgPSAoZmlyc3QgPj4gNCk7CisgICAgICAgIGgudHlwZSA9IChmaXJzdCAmIDB4QykgPj4gMjsKKworICAgICAgICBpZiAoaC50YWcgPT0gTE9OR19JVEVNICYmIGgudHlwZSA9PSBSRVNFUlZFRCkgeyAvLyBsb25nIGl0ZW0KKyAgICAgICAgICAgIC8vbG9uZyBpdGVtCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGIgPSAwOworICAgICAgICAgICAgaXMgPj4gYjsKKyAgICAgICAgICAgIGxlbiA9IGI7CisgICAgICAgICAgICBpcyA+PiBiOworICAgICAgICAgICAgaC50YWcgPSBiOworICAgICAgICB9CisKKyAgICAgICAgaC5kYXRhLnJlc2l6ZShsZW4pOworICAgICAgICBmb3IgKGF1dG8gJmkgOiBoLmRhdGEpIHsKKyAgICAgICAgICAgIGlmIChpcy5lb2YoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMgPj4gaTsKKyAgICAgICAgfQorICAgICAgICBoLmJ5dGVTaXplID0gKHNzaXplX3QpIGlzLnRlbGxnKCkgLSBoLm9mZnNldDsKKyAgICAgICAgaC52YWxpZCA9ICFpcy5lb2YoKTsKKyAgICB9CisKKyAgICByZXR1cm4gaXM7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBIaWRVdGlsOjpIaWRJdGVtICZoKSB7CisgICAgb3MgPDwgIm9mZnNldDogIiA8PCBoLm9mZnNldCA8PCAiLCBzaXplOiAiIDw8IGguYnl0ZVNpemUKKyAgICAgICA8PCAiLCB0YWc6ICIgPDwgaC50YWcgPDwgIiwgdHlwZTogIiA8PCBoLnR5cGUgPDwgIiwgZGF0YTogIjsKKyAgICBpZiAoaC5kYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgb3MgPDwgIltlbXB0eV0iOworICAgIH0gZWxzZSB7CisgICAgICAgIG9zIDw8IGguZGF0YS5zaXplKCkgPDwgIiBieXRlKHMpIHsiOworICAgICAgICBmb3IgKGF1dG8gaSA6IGguZGF0YSkgeworICAgICAgICAgICAgb3MgPDwgKGludCkgaSA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIG9zIDw8ICJ9IjsKKyAgICB9CisgICAgcmV0dXJuIG9zOworfQorfSAvLyBuYW1lc3BhY2UgSGlkVXRpbApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZEl0ZW0uaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRJdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjNzllOQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRJdGVtLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEhJRFVUSUxfSElESVRFTV9IXworI2RlZmluZSBISURVVElMX0hJRElURU1fSF8KKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworbmFtZXNwYWNlIEhpZFV0aWwgeworCitzdHJ1Y3QgSGlkSXRlbSB7CisgICAgYm9vbCB2YWxpZDsKKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgdGFnOworICAgIHNzaXplX3Qgb2Zmc2V0OworICAgIHNzaXplX3QgYnl0ZVNpemU7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTsKKworICAgIGJvb2wgZGF0YUFzVW5zaWduZWQodW5zaWduZWQgaW50ICpvdXQpIGNvbnN0OworICAgIGJvb2wgZGF0YUFzU2lnbmVkKGludCAqb3V0KSBjb25zdDsKKworICAgIC8vIGZyaWVuZCBzdHJlYW0gZnVuY3Rpb25zCisgICAgZnJpZW5kIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PihzdGQ6OmlzdHJlYW0gJmlzLCBIaWRJdGVtICZoKTsKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEhpZEl0ZW0gJmgpOworCisgICAgLy8gdG9rZW5pemUgZnJvbSBhIHVuc2lnbmVkIGNoYXIgdmVjdG9yCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEhpZEl0ZW0+IHRva2VuaXplKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZkZXNjcmlwdG9yKTsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8SGlkSXRlbT4gdG9rZW5pemUoY29uc3QgdWludDhfdCAqYmVnaW4sIHNpemVfdCBzaXplKTsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8SGlkSXRlbT4gdG9rZW5pemUoc3RkOjppc3RyZWFtICZpcyk7Cit9OworCisvLyBwYXJzaW5nIGluIGZyb20gYmluYXJ5IHN0cmVhbQorc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSAmaXMsIEhpZFV0aWw6OkhpZEl0ZW0gJmgpOworCisvLyBvdXRwdXQgYXMgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHRvIHN0cmVhbQorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEhpZFV0aWw6OkhpZEl0ZW0gJmgpOworfSAvL25hbWVzcGFjZSBIaWRVdGlsCisKKyNlbmRpZiAvLyBISURVVElMX0hJRElURU1fSF8KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRMb2NhbC5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTdhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkTG9jYWwuY3BwCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJIaWREZWZzLmgiCisjaW5jbHVkZSAiSGlkTG9jYWwuaCIKKyNpbmNsdWRlICJIaWRMb2cuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgSGlkVXRpbCB7CisKK2NvbnN0ZXhwciB1aW50MzJfdCBJTlZBTElEX1VTQUdFID0gMHhGRkZGOworY29uc3RleHByIHVpbnQzMl90IElOVkFMSURfREVTSUdOQVRPUiA9IDB4RkZGRjsKK2NvbnN0ZXhwciB1aW50MzJfdCBJTlZBTElEX1NUUklORyA9IDB4RkZGRjsKKwordWludDMyX3QgSGlkTG9jYWw6OmdldFVzYWdlKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmICh1c2FnZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX1VTQUdFOworICAgIH0KKyAgICByZXR1cm4gKGluZGV4ID49IHVzYWdlLnNpemUoKSkgPyB1c2FnZS5iYWNrKCkgOiB1c2FnZVtpbmRleF07Cit9CisKK3VpbnQzMl90IEhpZExvY2FsOjpnZXREZXNpZ25hdG9yKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmIChkZXNpZ25hdG9yLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfREVTSUdOQVRPUjsKKyAgICB9CisgICAgcmV0dXJuIChpbmRleCA+PSBkZXNpZ25hdG9yLnNpemUoKSkgPyBkZXNpZ25hdG9yLmJhY2soKSA6IGRlc2lnbmF0b3JbaW5kZXhdOworfQorCit1aW50MzJfdCBIaWRMb2NhbDo6Z2V0U3RyaW5nKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmIChzdHJpbmcuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9TVFJJTkc7CisgICAgfQorICAgIHJldHVybiAoaW5kZXggPj0gc3RyaW5nLnNpemUoKSkgPyBzdHJpbmcuYmFjaygpIDogc3RyaW5nW2luZGV4XTsKK30KKwordm9pZCBIaWRMb2NhbDo6Y2xlYXIoKSB7CisgICAgKnRoaXMgPSBIaWRMb2NhbCgpOworfQorCitib29sIEhpZExvY2FsOjphcHBlbmQoY29uc3QgSGlkSXRlbSAmaSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6OkxvY2FsVGFnOworCisgICAgYm9vbCByZXQgPSB0cnVlOworICAgIHVuc2lnbmVkIHVuc2lnbmVkSW50ZWdlcjsKKyAgICBib29sIHVuc2lnbmVkRXJyb3IgPSAhaS5kYXRhQXNVbnNpZ25lZCgmdW5zaWduZWRJbnRlZ2VyKTsKKyAgICBib29sIHZhbHVlRXJyb3IgPSBmYWxzZTsKKworICAgIHN3aXRjaCAoaS50YWcpIHsKKyAgICAgICAgY2FzZSBVU0FHRToKKyAgICAgICAgICAgIHVzYWdlLnB1c2hfYmFjayh1bnNpZ25lZEludGVnZXIpOworICAgICAgICAgICAgdmFsdWVFcnJvciA9IHVuc2lnbmVkRXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVU0FHRV9NSU5JTVVNOgorICAgICAgICAgICAgdXNhZ2VNaW4gPSB1bnNpZ25lZEludGVnZXI7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gdW5zaWduZWRFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVTQUdFX01BWElNVU06CisgICAgICAgICAgICBpZiAoIXVzYWdlTWluLmlzU2V0KCkpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAidXNhZ2UgbWluIG5vdCBzZXQgd2hlbiBzYXcgdXNhZ2UgbWF4ICIgPDwgaSA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdXNhZ2VtYXggPSB1bnNpZ25lZEludGVnZXI7CisgICAgICAgICAgICAgICAgdmFsdWVFcnJvciA9IHVuc2lnbmVkRXJyb3I7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IHVzYWdlTWluLmdldCgwKTsgaiA8PSB1c2FnZW1heDsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIHVzYWdlLnB1c2hfYmFjayhqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXNhZ2VNaW4uY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUklOR19JTkRFWDoKKyAgICAgICAgICAgIHN0cmluZy5wdXNoX2JhY2sodW5zaWduZWRJbnRlZ2VyKTsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSB1bnNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSSU5HX01JTklNVU06CisgICAgICAgICAgICBzdHJpbmdNaW4gPSB1bnNpZ25lZEludGVnZXI7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gdW5zaWduZWRFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUklOR19NQVhJTVVNOiB7CisgICAgICAgICAgICBpZiAoIXVzYWdlTWluLmlzU2V0KCkpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAic3RyaW5nIG1pbiBub3Qgc2V0IHdoZW4gc2F3IHN0cmluZyBtYXggIiA8PCBpIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpbmdNYXggPSB1bnNpZ25lZEludGVnZXI7CisgICAgICAgICAgICAgICAgdmFsdWVFcnJvciA9IHVuc2lnbmVkRXJyb3I7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IHN0cmluZ01pbi5nZXQoMCk7IGogPD0gc3RyaW5nTWF4OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nLnB1c2hfYmFjayhqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyaW5nTWluLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERFTElNSVRPUjoKKyAgICAgICAgICAgIGRlbGltZXRlciA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSB1bnNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfRSA8PCAidW5rbm93biBsb2NhbCB0YWcsICIgPDwgaSA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAodmFsdWVFcnJvcikgeworICAgICAgICBMT0dfRSA8PCAiQ2Fubm90IGdldCB1bnNpZ25lZCBkYXRhIGF0ICIgPDwgaSA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9Cit9IC8vbmFtZXNwYWNlIEhpZFV0aWwKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRMb2NhbC5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzMGIzMAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRMb2NhbC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBISURVVElMX0hJRExPQ0FMX0hfCisjZGVmaW5lIEhJRFVUSUxfSElETE9DQUxfSF8KKworI2luY2x1ZGUgIkhpZEl0ZW0uaCIKKyNpbmNsdWRlICJUcmlTdGF0ZS5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgSGlkVXRpbCB7CisKKy8vIEEgc2V0IG9mIGxvY2FsIHN0YXRlcyB0aGF0IHBhcnNlciBoYXMgdG8ga2VlcCB0cmFjayBkdXJpbmcgcGFyc2luZy4KKy8vIFRoZXkgYXJlIGFsbCBzcGVjaWZpZWQgaW4gSElEIHNwZWMgdjEuMTEgc2VjdGlvbiA2LjIuMi44CitzdHJ1Y3QgSGlkTG9jYWwgeworICAgIC8vIGFkZCBhIHRva2VuIHRvIGNoYW5nZSBsb2NhbCBzdGF0ZXMsIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKKyAgICBib29sIGFwcGVuZChjb25zdCBIaWRJdGVtICZpKTsKKyAgICAvLyBjbGVhciBhbGwgbG9jYWwgc3RhdGVzLiBUaGlzIG5lZWQgdG8gYmUgZG9uZSBhZnRlciBlYWNoIG1haW4gdGFnCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLy8gbXVsdGlwbGUgdXNhZ2UsIGRlc2lnbmF0b3Igb3Igc3RyaW5ncyBtYXkgZXhpc3QgZm9yIHNpbmdsZSBpbnB1dC9vdXRwdXQvZmVhdHVyZSByZXBvcnQKKyAgICB1aW50MzJfdCBnZXRVc2FnZShzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIHVpbnQzMl90IGdldERlc2lnbmF0b3Ioc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRTdHJpbmcoc2l6ZV90IGluZGV4KSBjb25zdDsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB1c2FnZTsKKyAgICAvLyBrZWVwIHRyYWNrIG9mIHVzYWdlIG1pbiB3aGVuIGV4cGVjdGluZyBhIHVzYWdlIG1heAorICAgIHRyaV91aW50IHVzYWdlTWluOworCisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGRlc2lnbmF0b3I7CisgICAgLy8ga2VlcCB0cmFjayBvZiBkZXNpZ25hdG9yIG1pbiB3aGVuIGV4cGVjdGluZyBkZXNpZ25hdG9yIG1heAorICAgIHRyaV91aW50IGRlc2lnbmF0b3JNaW47CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gc3RyaW5nOworICAgIC8vIGtlZXAgdHJhY2sgb2Ygc3RyaW5nIG1pbiB3aGVuIGV4cGVjdGluZyBzdHJpbmcgbWF4CisgICAgdHJpX3VpbnQgc3RyaW5nTWluOworCisgICAgdHJpX3VpbnQgZGVsaW1ldGVyOworfTsKK30gLy8gbmFtZXNwYWNlIEhpZFV0aWwKKworI2VuZGlmIC8vIEhJRFVUSUxfSElETE9DQUxfSF8KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRMb2cuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdkZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZExvZy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBISURVVElMX0hJRExPR19IXworI2RlZmluZSBISURVVElMX0hJRExPR19IXworCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoTE9HX1RPX0NPTlNPTEUpCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNkZWZpbmUgTE9HX0VOREwgIiIKKyNkZWZpbmUgTE9HX0UgTE9HKEVSUk9SKQorI2RlZmluZSBMT0dfVyBMT0coV0FSTklORykKKyNkZWZpbmUgTE9HX0kgTE9HKElORk8pCisjZGVmaW5lIExPR19EIExPRyhERUJVRykKKyNkZWZpbmUgTE9HX1YgTE9HKFZFUkJPU0UpCisjZWxzZQorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2RlZmluZSBMT0dfRU5ETCBzdGQ6OmVuZGwKKyNkZWZpbmUgTE9HX0UgKHN0ZDo6Y2VyciA8PCAiRTogIikKKyNkZWZpbmUgTE9HX1cgKHN0ZDo6Y2VyciA8PCAiVzogIikKKyNkZWZpbmUgTE9HX0kgKHN0ZDo6Y2VyciA8PCAiSTogIikKKyNkZWZpbmUgTE9HX0QgKHN0ZDo6Y2VyciA8PCAiRDogIikKKyNkZWZpbmUgTE9HX1YgKHN0ZDo6Y2VyciA8PCAiVjogIikKKyNlbmRpZgorCisjZW5kaWYgLy8gSElEVVRJTF9ISURMT0dfSF8KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRQYXJzZXIuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmYWY2NQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJIaWREZWZzLmgiCisjaW5jbHVkZSAiSGlkUGFyc2VyLmgiCisjaW5jbHVkZSAiSGlkTG9nLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIEhpZFV0aWwgeworCit2b2lkIEhpZFBhcnNlcjo6cmVzZXQoKSB7CisgICAgbUdsb2JhbFN0YWNrID0gSGlkR2xvYmFsU3RhY2soKTsKKyAgICBtTG9jYWwgPSBIaWRMb2NhbCgpOworICAgIG1UcmVlID0gc3RkOjptYWtlX3NoYXJlZDxIaWRUcmVlTm9kZT4oKTsKKyAgICBtQ3VycmVudCA9IG1UcmVlOworfQorCitib29sIEhpZFBhcnNlcjo6cGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkSXRlbT4gJnRva2VuKSB7CisgICAgLy8gQ2xlYW4gdXAgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBwYXJzZXIgZm9yIGEgbmV3IHN0cmVhbSBvZiBkZXNjcmlwdG9yIHRva2VuCisgICAgcmVzZXQoKTsKKworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICB1c2luZyBuYW1lc3BhY2UgSGlkRGVmOjpUYWdUeXBlOworCisgICAgZm9yIChhdXRvICZpIDogdG9rZW4pIHsKKyAgICAgICAgc3dpdGNoIChpLnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTUFJTjoKKyAgICAgICAgICAgICAgICByZXQgPSBwcm9jZXNzTWFpblRhZyhpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xPQkFMOgorICAgICAgICAgICAgICAgIHJldCA9IG1HbG9iYWxTdGFjay5hcHBlbmQoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExPQ0FMOgorICAgICAgICAgICAgICAgIHJldCA9IG1Mb2NhbC5hcHBlbmQoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19FIDw8ICJIaWRQYXJzZXIgZm91bmQgaWxsZWdhbCBIaWRJdGVtOiAiIDw8IGkgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbiBjYXNlIGEgcGFyc2UgZmFpbHVyZSwgcXVpdCBwcmVtYXR1cmVseQorICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBIaWRQYXJzZXI6OnByb2Nlc3NNYWluVGFnKGNvbnN0IEhpZEl0ZW0gJmkpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgSGlkRGVmOjpNYWluVGFnOworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6OlJlcG9ydEZsYWc7CisKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgc3dpdGNoIChpLnRhZykgeworICAgICAgICBjYXNlIENPTExFQ1RJT046IHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb2xsZWN0aW9uVHlwZTsKKyAgICAgICAgICAgIGlmICghaS5kYXRhQXNVbnNpZ25lZCgmY29sbGVjdGlvblR5cGUpKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkNhbm5vdCBnZXQgY29sbGVjdGlvbiB0eXBlIGF0IG9mZnNldCAiIDw8IGkub2Zmc2V0IDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IGZ1bGxVc2FnZSA9CisgICAgICAgICAgICAgICAgICAgIG1HbG9iYWxTdGFjay50b3AoKS51c2FnZVBhZ2UuZ2V0KDApIDw8IDE2IHwgbUxvY2FsLmdldFVzYWdlKDApOworICAgICAgICAgICAgbUN1cnJlbnQgPSBtQ3VycmVudC0+YWRkQ2hpbGQoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8SGlkVHJlZU5vZGU+KG1DdXJyZW50LCBjb2xsZWN0aW9uVHlwZSwgZnVsbFVzYWdlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEVORF9DT0xMRUNUSU9OOgorICAgICAgICAgICAgbUN1cnJlbnQgPSBtQ3VycmVudC0+Z2V0UGFyZW50KCk7CisgICAgICAgICAgICBpZiAoIW1DdXJyZW50KSB7CisgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBwYXJzZSBmYWlsdXJlIHNvIHRoYXQgbUN1cnJlbnQgd2lsbCBub3QgYmUgYWNjZXNzZWQKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAidW5tYXRjaGVkIEVORF9DT0xMRUNUSU9OIGF0ICIgPDwgaS5vZmZzZXQgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlBVVDoKKyAgICAgICAgY2FzZSBPVVRQVVQ6CisgICAgICAgIGNhc2UgRkVBVFVSRTogeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlcG9ydFR5cGUgPSBpLnRhZzsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnOworICAgICAgICAgICAgaWYgKCFpLmRhdGFBc1Vuc2lnbmVkKCZmbGFnKSkgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJDYW5ub3QgZ2V0IHJlcG9ydCBmbGFnIGF0IG9mZnNldCAiIDw8IGkub2Zmc2V0IDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgSGlkR2xvYmFsICZ0b3AgPSBtR2xvYmFsU3RhY2sudG9wKCk7CisKKyAgICAgICAgICAgIC8vIHVzYWdlIHBhZ2UsIGxvY2FsIG1pbi9tYXgsIHJlcG9ydCBzaXplIGFuZCBjb3VudCBoYXZlIHRvIGJlIGRlZmluZWQgYXQgcmVwb3J0CisgICAgICAgICAgICAvLyBkZWZpbml0aW9uLgorICAgICAgICAgICAgaWYgKCEodG9wLnVzYWdlUGFnZS5pc1NldCgpICYmIHRvcC5sb2dpY2FsTWluLmlzU2V0KCkgJiYgdG9wLmxvZ2ljYWxNYXguaXNTZXQoKQorICAgICAgICAgICAgICAgICAgJiYgdG9wLnJlcG9ydFNpemUuaXNTZXQoKSAmJiB0b3AucmVwb3J0Q291bnQuaXNTZXQoKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiUmVwb3J0IGRlZmluZWQgYXQgIiA8PCBpLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZG9lcyBub3QgaGF2ZSBhbGwgbWFuZGF0b3J5IGZpZWxkcyBzZXQiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRvcC5yZXBvcnRTaXplLmdldCgwKSA+IDMyKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIlJlcG9ydCBkZWZpbmVkIGF0ICIgPDwgaS5vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGhhcyB1bnN1cHBvcnRlZCByZXBvcnQgc2l6ZSg+IDMyIGJpdCkiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBIaWRSZXBvcnQgcmVwb3J0KHJlcG9ydFR5cGUsIGZsYWcsIHRvcCwgbUxvY2FsKTsKKyAgICAgICAgICAgIG1SZXBvcnQucHVzaF9iYWNrKHJlcG9ydCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IG5vZGUobmV3IEhpZFJlcG9ydE5vZGUobUN1cnJlbnQsIHJlcG9ydCkpOworICAgICAgICAgICAgbUN1cnJlbnQtPmFkZENoaWxkKG5vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19FIDw8ICJ1bmtub3duIG1haW4gdGFnLCAiIDw8IGkgPDwgTE9HX0VOREw7CisgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICB9CisgICAgLy8gbG9jYWxzIGlzIGNsZWFyZWQgYWZ0ZXIgYW55IG1haW4gdGFnIGFjY29yZGluZyB0byBISUQgc3BlYworICAgIG1Mb2NhbC5jbGVhcigpOworICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgSGlkUGFyc2VyOjpwYXJzZShjb25zdCB1bnNpZ25lZCBjaGFyICpiZWdpbiwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6OnZlY3RvcjxIaWRJdGVtPiBoaWRJdGVtVmVjdG9yID0gSGlkSXRlbTo6dG9rZW5pemUoYmVnaW4sIHNpemUpOworICAgIHJldHVybiBwYXJzZShoaWRJdGVtVmVjdG9yKTsKK30KKwordm9pZCBIaWRQYXJzZXI6OmZpbHRlclRyZWUoKSB7CisgICAgaWYgKG1UcmVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgZmlsdGVyVHJlZShtVHJlZSk7CisgICAgfQorfQorCit2b2lkIEhpZFBhcnNlcjo6ZmlsdGVyVHJlZShzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+ICZub2RlKSB7CisgICAgaWYgKG5vZGUtPmlzUmVwb3J0Q29sbGVjdGlvbigpKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIaWRSZXBvcnROb2RlPiByZXBvcnROb2RlID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SGlkUmVwb3J0Tm9kZT4obm9kZS0+Z2V0Q2hpbGRyZW4oKS5mcm9udCgpKTsKKyAgICAgICAgaWYgKHJlcG9ydE5vZGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmVwb3J0Tm9kZS0+Y29sbGFwc2Uobm9kZS0+Z2V0RnVsbFVzYWdlKCkpOworICAgICAgICAgICAgbm9kZSA9IHJlcG9ydE5vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGF1dG8gJmkgOiBub2RlLT5nZXRDaGlsZHJlbigpKSB7CisgICAgICAgICAgICBmaWx0ZXJUcmVlKGkpOworICAgICAgICB9CisgICAgfQorfQorCitIaWRQYXJzZXI6OkRpZ2VzdFZlY3RvciBIaWRQYXJzZXI6OmdlbmVyYXRlRGlnZXN0KAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiAmaW50ZXJlc3RlZFVzYWdlKSB7CisgICAgRGlnZXN0VmVjdG9yIGRpZ2VzdFZlY3RvcjsKKyAgICBkaWdlc3QoJmRpZ2VzdFZlY3RvciwgbVRyZWUsIGludGVyZXN0ZWRVc2FnZSk7CisgICAgcmV0dXJuIGRpZ2VzdFZlY3RvcjsKK30KKwordm9pZCBIaWRQYXJzZXI6OmRpZ2VzdChIaWRQYXJzZXI6OkRpZ2VzdFZlY3RvciAqZGlnZXN0VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+ICZub2RlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiAmaW50ZXJlc3RlZFVzYWdlKSB7CisgICAgaWYgKGRpZ2VzdFZlY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobm9kZS0+aXNVc2FnZUNvbGxlY3Rpb24oKQorICAgICAgICAgICAgJiYgaW50ZXJlc3RlZFVzYWdlLmZpbmQobm9kZS0+Z2V0RnVsbFVzYWdlKCkpICE9IGludGVyZXN0ZWRVc2FnZS5lbmQoKSkgeworICAgICAgICAvLyB0aGlzIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIHVzYWdlIGludGVyZXN0ZWQKKyAgICAgICAgUmVwb3J0U2V0R3JvdXAgcmVwb3J0U2V0R3JvdXA7CisKKyAgICAgICAgLy8gb25lIGxheWVyIGRlZXAgc2VhcmNoCisgICAgICAgIGZvciAoYXV0byAmaSA6IG5vZGUtPmdldENoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgIC8vIHNraXAgYWxsIG5vZGVzIHRoYXQgaXMgbm90IGEgcmVwb3J0IG5vZGUKKyAgICAgICAgICAgIGlmIChpLT5nZXROb2RlVHlwZSgpICE9IEhpZFRyZWVOb2RlOjpUWVBFX1JFUE9SVCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgSGlkUmVwb3J0ICZyZXBvcnQgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SGlkUmVwb3J0Tm9kZT4oaSktPmdldFJlcG9ydCgpOworCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWQgPSByZXBvcnQuZ2V0UmVwb3J0SWQoKTs7CisgICAgICAgICAgICBpZiAocmVwb3J0U2V0R3JvdXAuZmluZChpZCkgPT0gcmVwb3J0U2V0R3JvdXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gaWQgZ3JvdXAgaWYgaXQgaXMgbm90IGNyZWF0ZWQKKyAgICAgICAgICAgICAgICByZXBvcnRTZXRHcm91cC5lbXBsYWNlKGlkLCBSZXBvcnRTZXQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFJlcG9ydFNldCAmcmVwb3J0R3JvdXAgPSByZXBvcnRTZXRHcm91cFtpZF07CisgICAgICAgICAgICBzd2l0Y2gocmVwb3J0LmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6Ok1haW5UYWc7CisgICAgICAgICAgICAgICAgY2FzZSBGRUFUVVJFOgorICAgICAgICAgICAgICAgICAgICByZXBvcnRHcm91cFtSRVBPUlRfVFlQRV9GRUFUVVJFXS5wdXNoX2JhY2socmVwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTlBVVDoKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0R3JvdXBbUkVQT1JUX1RZUEVfSU5QVVRdLnB1c2hfYmFjayhyZXBvcnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9VVFBVVDoKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0R3JvdXBbUkVQT1JUX1RZUEVfT1VUUFVUXS5wdXNoX2JhY2socmVwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUmVwb3J0RGlnZXN0IGRpZ2VzdCA9IHsKKyAgICAgICAgICAgIC5mdWxsVXNhZ2UgPSBub2RlLT5nZXRGdWxsVXNhZ2UoKSwKKyAgICAgICAgICAgIC5wYWNrZXRzID0gY29udmVydEdyb3VwVG9QYWNrZXQocmVwb3J0U2V0R3JvdXApCisgICAgICAgIH07CisgICAgICAgIGRpZ2VzdFZlY3Rvci0+ZW1wbGFjZV9iYWNrKGRpZ2VzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjaGlsZCA6IG5vZGUtPmdldENoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgIGlmIChjaGlsZC0+Z2V0Tm9kZVR5cGUoKSA9PSBIaWRUcmVlTm9kZTo6VFlQRV9OT1JNQUwpIHsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IGZvbGxvdyBpbnRvIGNvbGxlY3Rpb24gbm9kZXMKKyAgICAgICAgICAgICAgICBkaWdlc3QoZGlnZXN0VmVjdG9yLCBjaGlsZCwgaW50ZXJlc3RlZFVzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+IEhpZFBhcnNlcjo6Y29udmVydEdyb3VwVG9QYWNrZXQoCisgICAgICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0U2V0R3JvdXAgJmdyb3VwKSB7CisgICAgc3RkOjp2ZWN0b3I8UmVwb3J0UGFja2V0PiBwYWNrZXRzOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiB0eXBlcyA9IHtSRVBPUlRfVFlQRV9GRUFUVVJFLCBSRVBPUlRfVFlQRV9JTlBVVCwgUkVQT1JUX1RZUEVfT1VUUFVUfTsKKworICAgIGZvciAoY29uc3QgYXV0byAmc2V0UGFpciA6IGdyb3VwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBpZCA9IHNldFBhaXIuZmlyc3Q7CisgICAgICAgIGZvciAoYXV0byB0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJnJlcG9ydHMgPSBzZXRQYWlyLnNlY29uZFt0eXBlXTsgLy8gZmVhdHVyZQorCisgICAgICAgICAgICAvLyB0ZW1wbGF0ZQorICAgICAgICAgICAgUmVwb3J0UGFja2V0IHBhY2tldCA9IHsKKyAgICAgICAgICAgICAgICAudHlwZSA9IHR5cGUsCisgICAgICAgICAgICAgICAgLmlkID0gaWQsCisgICAgICAgICAgICAgICAgLmJpdFNpemUgPSAwCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnIgOiByZXBvcnRzKSB7CisgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsID0gci5nZXRMb2dpY2FsUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICBhdXRvIHBoeXNpY2FsID0gci5nZXRQaHlzaWNhbFJhbmdlKCk7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IHBoeXNpY2FsLmZpcnN0IC0gbG9naWNhbC5maXJzdDsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KChwaHlzaWNhbC5zZWNvbmQgLSBwaHlzaWNhbC5maXJzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAvIChsb2dpY2FsLnNlY29uZCAtIGxvZ2ljYWwuZmlyc3QpOworICAgICAgICAgICAgICAgIHNjYWxlICo9IHIuZ2V0RXhwb25lbnRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgUmVwb3J0SXRlbSBkaWdlc3QgPSB7CisgICAgICAgICAgICAgICAgICAgIC51c2FnZSA9IHIuZ2V0RnVsbFVzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIC5pZCA9IGlkLAorICAgICAgICAgICAgICAgICAgICAubWluUmF3ID0gbG9naWNhbC5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgLm1heFJhdyA9IGxvZ2ljYWwuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAuYSA9IHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAuYiA9IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgLmJpdE9mZnNldCA9IHBhY2tldC5iaXRTaXplLAorICAgICAgICAgICAgICAgICAgICAuYml0U2l6ZSA9IHIuZ2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAuY291bnQgPSByLmdldENvdW50KCksCisgICAgICAgICAgICAgICAgICAgIC51bml0ID0gci5nZXRVbml0KCksCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBwYWNrZXQucmVwb3J0cy5wdXNoX2JhY2soZGlnZXN0KTsKKyAgICAgICAgICAgICAgICBwYWNrZXQuYml0U2l6ZSArPSBkaWdlc3QuYml0U2l6ZSAqIGRpZ2VzdC5jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcGFja2V0LnJlcG9ydHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHBhY2tldHMucHVzaF9iYWNrKHN0ZDo6bW92ZShwYWNrZXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGFja2V0czsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIHJlcG9ydFR5cGVUb1N0cmluZyhpbnQgcmVwb3J0VHlwZSkgeworICAgIHN3aXRjaCAocmVwb3J0VHlwZSkgeworICAgICAgICBjYXNlIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfSU5QVVQ6CisgICAgICAgICAgICByZXR1cm4gIklOUFVUIjsKKyAgICAgICAgY2FzZSBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX09VVFBVVDoKKyAgICAgICAgICAgIHJldHVybiAiT1VUUFVUIjsKKyAgICAgICAgY2FzZSBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0ZFQVRVUkU6CisgICAgICAgICAgICByZXR1cm4gIkZFQVRVUkUiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJJTlZBTElEIFJFUE9SVCI7CisgICAgfQorfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgSGlkUGFyc2VyOjpEaWdlc3RWZWN0b3IgJmRpZ2VzdHMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmkgOiBkaWdlc3RzKSB7CisgICAgICAgIG9zIDw8ICJVc2FnZTogMHgiIDw8IHN0ZDo6aGV4ICA8PCBpLmZ1bGxVc2FnZSA8PCBzdGQ6OmRlYworICAgICAgICAgICA8PCAiLCAiIDw8IGkucGFja2V0cy5zaXplKCkgPDwgIiByZXBvcnQgcGFja2V0OiIgPDwgTE9HX0VOREw7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFja2V0IDogaS5wYWNrZXRzKSB7CisgICAgICAgICAgICBvcyA8PCByZXBvcnRUeXBlVG9TdHJpbmcocGFja2V0LnR5cGUpIDw8ICIgaWQ6ICIgPDwgcGFja2V0LmlkCisgICAgICAgICAgICAgICA8PCAiIHNpemU6ICIgPDwgcGFja2V0LmJpdFNpemUKKyAgICAgICAgICAgICAgIDw8ICJiKCIgPDwgcGFja2V0LmdldEJ5dGVTaXplKCkgPDwgIkIpLCAiCisgICAgICAgICAgICAgICA8PCBwYWNrZXQucmVwb3J0cy5zaXplKCkgPDwgIiBlbnRyaWVzIiA8PCBMT0dfRU5ETDsKKworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZyZXBvcnQgOiBwYWNrZXQucmVwb3J0cykgeworICAgICAgICAgICAgICAgIGRvdWJsZSBtaW4sIG1heDsKKyAgICAgICAgICAgICAgICByZXBvcnQuZGVjb2RlKHJlcG9ydC5tYXNrKHJlcG9ydC5taW5SYXcpLCAmbWluKTsKKyAgICAgICAgICAgICAgICByZXBvcnQuZGVjb2RlKHJlcG9ydC5tYXNrKHJlcG9ydC5tYXhSYXcpLCAmbWF4KTsKKworICAgICAgICAgICAgICAgIG9zIDw8ICIgICIgPDwgcmVwb3J0LmJpdE9mZnNldCA8PCAiIHNpemU6ICIgPDwgcmVwb3J0LmJpdFNpemUKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBjb3VudDogIiA8PCByZXBvcnQuY291bnQKKyAgICAgICAgICAgICAgICAgICA8PCAiLCB1c2FnZTogIiA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoOCkKKyAgICAgICAgICAgICAgICAgICA8PCByZXBvcnQudXNhZ2UgPDwgc3RkOjpkZWMKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBtaW46ICIgPDwgcmVwb3J0Lm1pblJhdyA8PCAiLCBtYXg6ICIgPDwgcmVwb3J0Lm1heFJhdworICAgICAgICAgICAgICAgICAgIDw8ICIsIG1pbkRlY29kZWQ6ICIgPDwgbWluCisgICAgICAgICAgICAgICAgICAgPDwgIiwgbWF4RGVjb2RlZDogIiA8PCBtYXgKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBhOiAiIDw8IHJlcG9ydC5hIDw8ICIsIGI6ICIgPDwgcmVwb3J0LmIKKyAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgIDw8ICIsIG1pblJhd0hleDogMHgiIDw8IHJlcG9ydC5tYXNrKHJlcG9ydC5taW5SYXcpCisgICAgICAgICAgICAgICAgICAgPDwgIiwgbWF4UmF3SGV4OiAweCIgPDwgcmVwb3J0Lm1hc2socmVwb3J0Lm1heFJhdykKKyAgICAgICAgICAgICAgICAgICA8PCAiLCByYXdNYXNrZWQ6IDB4IiA8PCByZXBvcnQucmF3TWFzaygpCisgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgTE9HX0VOREw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3MgPDwgTE9HX0VOREw7CisgICAgfQorICAgIG9zIDw8IExPR19FTkRMOworICAgIHJldHVybiBvczsKK30KK30gLy8gbmFtZXNwYWNlIEhpZFV0aWwKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRQYXJzZXIuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY1ZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFBhcnNlci5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSElEVVRJTF9ISURQQVJTRVJfSF8KKyNkZWZpbmUgSElEVVRJTF9ISURQQVJTRVJfSF8KKworI2luY2x1ZGUgIkhpZEl0ZW0uaCIKKyNpbmNsdWRlICJIaWRUcmVlLmgiCisjaW5jbHVkZSAiSGlkR2xvYmFsLmgiCisjaW5jbHVkZSAiSGlkTG9jYWwuaCIKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPG9zdHJlYW0+CisKK25hbWVzcGFjZSBIaWRVdGlsIHsKK2NsYXNzIEhpZFBhcnNlciB7CitwdWJsaWM6CisgICAgZW51bSB7CisgICAgICAgIFJFUE9SVF9UWVBFX0ZFQVRVUkUgPSAwLAorICAgICAgICBSRVBPUlRfVFlQRV9JTlBVVCA9IDEsCisgICAgICAgIFJFUE9SVF9UWVBFX09VVFBVVCA9IDIKKyAgICB9OworCisgICAgc3RydWN0IFJlcG9ydEl0ZW07CisgICAgc3RydWN0IFJlcG9ydFBhY2tldDsKKworICAgIC8vIHJlcG9ydCAoaW5jbHVkaW5nIGlucHV0IG91dHB1dCBhbmQgZmVhdHVyZSkgZ3JvdXBlZCBieSBmdWxsIHVzYWdlCisgICAgc3RydWN0IFJlcG9ydERpZ2VzdCB7CisgICAgICAgIHVuc2lnbmVkIGludCBmdWxsVXNhZ2U7CisgICAgICAgIHN0ZDo6dmVjdG9yPFJlcG9ydFBhY2tldD4gcGFja2V0czsKKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxSZXBvcnREaWdlc3Q+IERpZ2VzdFZlY3RvcjsKKworICAgIC8vIHBhcnNlIEhJRCBkZXNjcmlwdG9yCisgICAgYm9vbCBwYXJzZShjb25zdCBzdGQ6OnZlY3RvcjxIaWRJdGVtPiAmdG9rZW4pOworICAgIGJvb2wgcGFyc2UoY29uc3QgdW5zaWduZWQgY2hhciAqYmVnaW4sIHNpemVfdCBzaXplKTsKKworICAgIC8vIGZpbHRlciB0aGUgdHJlZSB0byBlbGltaW5hdGUgc2luZ2xlIGNoaWxkIHJlcG9ydCBsZWFmIG5vZGUgY2F1c2VzIGJ5IHVzYWdlIGFycmF5IHR5cGUKKyAgICAvLyByZXBvcnRzCisgICAgdm9pZCBmaWx0ZXJUcmVlKCk7CisKKyAgICAvLyBnZW5lcmF0ZSBhIGxpc3Qgb2YgcmVwb3J0IGRpZ2VzdCBmb3IgYWxsIGludGVyZXN0ZWQgdXNhZ2UuIEl0IHdpbGwgYXV0b21hdGljYWxseQorICAgIC8vIGNhbGwgZmlsdGVyVHJlZSgpLgorICAgIERpZ2VzdFZlY3RvciBnZW5lcmF0ZURpZ2VzdChjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiAmaW50ZXJlc3RlZFVzYWdlKTsKKworICAgIC8vIGdldCBwYXJzZWQgdHJlZSAoZmlsdGVyZWQgb3Igbm90IGZpbHRlcmVkKQorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gZ2V0VHJlZSgpIGNvbnN0IHsgcmV0dXJuIG1UcmVlOyB9CisKKyAgICAvLyBnZXQgYWxsIHBhcnNlZCByZXBvcnQgaW4gYSBwYXJzZWQgZm9ybS4KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxIaWRSZXBvcnQ+JiBnZXRSZXBvcnQoKSBjb25zdCB7IHJldHVybiBtUmVwb3J0OyB9CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OmFycmF5PHN0ZDo6dmVjdG9yPEhpZFJlcG9ydD4sIDM+IFJlcG9ydFNldDsKKyAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDx1bnNpZ25lZCBpbnQgLyogcmVwb3J0SWQgKi8sIFJlcG9ydFNldD4gUmVwb3J0U2V0R3JvdXA7CisKKyAgICAvLyBoZWxwZXIgc3Vicm91dGluZXMKKyAgICB2b2lkIHJlc2V0KCk7CisgICAgYm9vbCBwcm9jZXNzTWFpblRhZyhjb25zdCBIaWRJdGVtICZpKTsKKyAgICBzdGF0aWMgdm9pZCBmaWx0ZXJUcmVlKHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gJm5vZGUpOworICAgIHN0YXRpYyB2b2lkIGRpZ2VzdCgKKyAgICAgICAgICAgIERpZ2VzdFZlY3RvciAqZGlnZXN0VmVjdG9yLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiAmbm9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+ICZpbnRlcmVzdGVkVXNhZ2UpOworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxSZXBvcnRQYWNrZXQ+IGNvbnZlcnRHcm91cFRvUGFja2V0KGNvbnN0IFJlcG9ydFNldEdyb3VwICZncm91cCk7CisKKyAgICBIaWRHbG9iYWxTdGFjayBtR2xvYmFsU3RhY2s7CisgICAgSGlkTG9jYWwgbUxvY2FsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gbVRyZWU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBtQ3VycmVudDsKKyAgICBzdGQ6OnZlY3RvcjxIaWRSZXBvcnQ+IG1SZXBvcnQ7Cit9OworCitzdHJ1Y3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtIHsKKyAgICB1bnNpZ25lZCBpbnQgdXNhZ2U7CisgICAgdW5zaWduZWQgaW50IGlkOworICAgIGludCB0eXBlOyAvLyBmZWF0dXJlLCBpbnB1dCBvciBvdXRwdXQKKworICAgIGludDY0X3QgbWluUmF3OworICAgIGludDY0X3QgbWF4UmF3OworCisgICAgLy8gY29udmVyc2lvbiBmb3IgZmxvYXQgcG9pbnQgdmFsdWVzCisgICAgLy8gcmVhbCB2YWx1ZSA9IChzaWduRXh0ZW5kSWZOZWVkZWQocmF3KSArIGIpICogYQorICAgIC8vIHJhdyB2YWx1ZSA9IG1hc2socmVhbC9hIC0gYik7CisgICAgLy8KKyAgICAvLyBjb252ZXJzaW9uIGZvciBpbnRlZ2VyIHZhbHVlcworICAgIC8vIHJlYWwgdmFsdWUgPSBzaWduRXh0ZW5kZWRJZk5lZWRlZChyYXcpICsgYjsKKyAgICAvLyByYXcgdmFsdWUgPSBtYXNrKHJlYWwgLSBiKTsKKyAgICBkb3VibGUgYTsgLy8gc2NhbGluZworICAgIGludDY0X3QgYjsgLy8gb2Zmc2V0CisgICAgdW5zaWduZWQgaW50IHVuaXQ7CisKKyAgICBzaXplX3QgYml0T2Zmc2V0OworICAgIHNpemVfdCBiaXRTaXplOyAvLyBiaXQgbGVuZ3RoIHBlciB1bml0CisgICAgc2l6ZV90IGNvdW50OworCisgICAgLy8gaGVscGVyIGZ1bmN0aW9uCisgICAgYm9vbCBpc1NpZ25lZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1pblJhdyA8IDA7CisgICAgfQorCisgICAgYm9vbCBpc0J5dGVBbGlnbmVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKGJpdE9mZnNldCAmIDcpID09IDAgJiYgKGJpdFNpemUgJiA3KSA9PSAwOworICAgIH0KKworICAgIC8vIGNvbnZlcnQgcmF3IHZhbHVlcyB0byB1bnNpZ25lZCBmb3JtYXQKKyAgICB1aW50MzJfdCBtYXNrKGludDY0X3QgaW5wdXQpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbnB1dCAmIHJhd01hc2soKSk7CisgICAgfQorCisgICAgYm9vbCBkZWNvZGUodWludDMyX3QgaW5wdXQsIGRvdWJsZSAqb3V0cHV0KSBjb25zdCB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgcyA9IHNpZ25FeHRlbmRJZk5lZWRlZChpbnB1dCk7CisgICAgICAgIGlmIChzIDwgbWluUmF3IHx8IHMgPiBtYXhSYXcpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqb3V0cHV0ID0gKHMgKyBiKSAqIGE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZW5jb2RlKGRvdWJsZSBpbnB1dCwgdWludDMyX3QgKm91dHB1dCkgY29uc3QgeworICAgICAgICBpZiAob3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dCA9IGlucHV0IC8gYSAtIGI7CisgICAgICAgIGlmIChpbnB1dCA8IG1pblJhdyB8fCBpbnB1dCA+IG1heFJhdykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICpvdXRwdXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8aW50NjRfdD4oaW5wdXQpICYgcmF3TWFzaygpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaW50NjRfdCByYXdNYXNrKCkgY29uc3QgeworICAgICAgICBjb25zdGV4cHIgaW50NjRfdCBvbmUgPSAxOworICAgICAgICByZXR1cm4gKG9uZSA8PCBiaXRTaXplKSAtIDE7CisgICAgfQorCisgICAgaW50NjRfdCBzaWduRXh0ZW5kSWZOZWVkZWQoaW50NjRfdCB2YWx1ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gdmFsdWUgfCAoKGlzU2lnbmVkKCkgJiYgaXNOZWdhdGl2ZSh2YWx1ZSkpID8gfnJhd01hc2soKSA6IDApOworICAgIH0KKworICAgIGJvb2wgaXNOZWdhdGl2ZShpbnQ2NF90IHZhbHVlKSBjb25zdCB7CisgICAgICAgIGNvbnN0ZXhwciBpbnQ2NF90IG9uZSA9IDE7CisgICAgICAgIHJldHVybiAoKG9uZSA8PCAoYml0U2l6ZSAtIDEpKSAmIHZhbHVlKSAhPSAwOworICAgIH0KK307CisKKy8vIGEgY29sbGVjdGlvbiBvZiByZXBvcnQgaXRlbSB0aGF0IGZvcm1zIGEgcGFja2V0CisvLyB0aGlzIGlzIHRoZSBpbnB1dCBvdXRwdXQgdW5pdCB3aXRoIEhJRCBoYXJkd2FyZQorc3RydWN0IEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0IHsKKyAgICBzdGQ6OnZlY3RvcjxSZXBvcnRJdGVtPiByZXBvcnRzOworICAgIHNpemVfdCBiaXRTaXplOworICAgIGludCB0eXBlOyAvLyBSRVBPUlRfVFlQRV9GRUFUVVJFL0lOUFVUL09VVFBVVAorICAgIHVuc2lnbmVkIGludCBpZDsKKworICAgIHNpemVfdCBnZXRCeXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIChiaXRTaXplICsgNykgLyA4OyB9OworfTsKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEhpZFBhcnNlcjo6RGlnZXN0VmVjdG9yICZkaWdlc3QyKTsKK30gLy8gbmFtZXNwYWNlIEhpZFV0aWwKKworI2VuZGlmIC8vIEhJRFVUSUxfSElEUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkUmVwb3J0LmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRSZXBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMmI3OGIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkUmVwb3J0LmNwcApAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkUmVwb3J0LmgiCisjaW5jbHVkZSAiSGlkRGVmcy5oIgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIEhpZFV0aWwgeworSGlkUmVwb3J0OjpIaWRSZXBvcnQodWludDMyX3QgdHlwZSwgdWludDMyX3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhpZEdsb2JhbCAmZ2xvYmFsLCBjb25zdCBIaWRMb2NhbCAmbG9jYWwpCisgICAgICAgIDogbVJlcG9ydFR5cGUodHlwZSksCisgICAgICAgICAgbUZsYWcoZGF0YSksCisgICAgICAgICAgbVVzYWdlUGFnZShnbG9iYWwudXNhZ2VQYWdlLmdldCgwKSksICAgLy8gZGVmYXVsdCB2YWx1ZSAwCisgICAgICAgICAgbVVzYWdlKGxvY2FsLmdldFVzYWdlKDApKSwKKyAgICAgICAgICBtVXNhZ2VWZWN0b3IobG9jYWwudXNhZ2UpLAorICAgICAgICAgIG1Mb2dpY2FsTWluKGdsb2JhbC5sb2dpY2FsTWluLmdldCgwKSksIC8vIGRlZmF1bHQgdmFsdWUgMAorICAgICAgICAgIG1Mb2dpY2FsTWF4KGdsb2JhbC5sb2dpY2FsTWF4LmdldCgwKSksCisgICAgICAgICAgbVJlcG9ydFNpemUoZ2xvYmFsLnJlcG9ydFNpemUpLAorICAgICAgICAgIG1SZXBvcnRDb3VudChnbG9iYWwucmVwb3J0Q291bnQpLAorICAgICAgICAgIG1QaHlzaWNhbE1pbihnbG9iYWwucGh5c2ljYWxNaW4pLAorICAgICAgICAgIG1QaHlzaWNhbE1heChnbG9iYWwucGh5c2ljYWxNYXgpLAorICAgICAgICAgIG1FeHBvbmVudChnbG9iYWwuZXhwb25lbnQpLAorICAgICAgICAgIG1Vbml0KGdsb2JhbC51bml0KSwKKyAgICAgICAgICBtUmVwb3J0SWQoZ2xvYmFsLnJlcG9ydElkKSB7IH0KKworc3RkOjpzdHJpbmcgSGlkUmVwb3J0OjpnZXRTdHJpbmdUeXBlKCkgY29uc3QgeworICAgIHJldHVybiByZXBvcnRUeXBlVG9TdHJpbmcobVJlcG9ydFR5cGUpOworfQorCitzdGQ6OnN0cmluZyBIaWRSZXBvcnQ6OnJlcG9ydFR5cGVUb1N0cmluZyhpbnQgdHlwZSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6Ok1haW5UYWc7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgY2FzZSBJTlBVVDoKKyAgICAgICAgICAgIHJldHVybiAiSU5QVVQiOworICAgICAgICBjYXNlIE9VVFBVVDoKKyAgICAgICAgICAgIHJldHVybiAiT1VUUFVUIjsKKyAgICAgICAgY2FzZSBGRUFUVVJFOgorICAgICAgICAgICAgcmV0dXJuICJGRUFUVVJFIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiPDxVTktOT1dOPj4iOworICAgIH0KK30KKworZG91YmxlIEhpZFJlcG9ydDo6Z2V0RXhwb25lbnRWYWx1ZSgpIGNvbnN0IHsKKyAgICBpZiAoIW1FeHBvbmVudC5pc1NldCgpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvLyBkZWZhdWx0IGV4cG9uZW50IGlzIDAKKyAgICBpbnQgZXhwb25lbnRJbnQgPSBtRXhwb25lbnQuZ2V0KDApOworICAgIGlmIChleHBvbmVudEludCA+IDE1IHx8IGV4cG9uZW50SW50IDwgMCkgeworICAgICAgICByZXR1cm4gTkFOOworICAgIH0KKyAgICByZXR1cm4gcG93KDEwLjAsIHN0YXRpY19jYXN0PGRvdWJsZT4oKGV4cG9uZW50SW50IDw9IDcpID8gZXhwb25lbnRJbnQgOiBleHBvbmVudEludCAtIDE2KSk7Cit9CisKK3N0ZDo6c3RyaW5nIEhpZFJlcG9ydDo6Z2V0RXhwb25lbnRTdHJpbmcoKSBjb25zdCB7CisgICAgaW50IGV4cG9uZW50SW50ID0gbUV4cG9uZW50LmdldCgwKTsKKyAgICBpZiAoZXhwb25lbnRJbnQgPiAxNSB8fCBleHBvbmVudEludCA8IDApIHsKKyAgICAgICAgcmV0dXJuICJbZXJyb3JdIjsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJ4MTBeIikKKyAgICAgICAgICAgICsgc3RkOjp0b19zdHJpbmcoKGV4cG9uZW50SW50IDw9IDcpID8gZXhwb25lbnRJbnQgOiBleHBvbmVudEludCAtIDE2KTsKK30KKworc3RkOjpzdHJpbmcgSGlkUmVwb3J0OjpnZXRVbml0U3RyaW5nKCkgY29uc3QgeworICAgIGlmICghbVVuaXQuaXNTZXQoKSkgeworICAgICAgICByZXR1cm4gImRlZmF1bHQiOworICAgIH0KKyAgICByZXR1cm4gIltub3QgaW1wbGVtZW50ZWRdIjsKKworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXQ7CisgICAgcmV0IDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygyKSA8PCBtVW5pdC5nZXQoMCk7CisgICAgcmV0dXJuIHJldC5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgSGlkUmVwb3J0OjpnZXRGbGFnU3RyaW5nKCkgY29uc3QgeworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6OlJlcG9ydEZsYWc7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIHJldCArPSAobUZsYWcgJiBEQVRBX0NPTlNUKSA/ICJDb25zdCAiIDogIkRhdGEgIjsKKyAgICByZXQgKz0gKG1GbGFnICYgQVJSQVlfVkFSSUFCTEUpID8gIlZhcmlhYmxlICIgOiAiQXJyYXkgIjsKKyAgICByZXQgKz0gKG1GbGFnICYgV1JBUCkgPyAiV3JhcCAiIDogIiI7CisgICAgcmV0ICs9IChtRmxhZyAmIE5PTkxJTkVBUikgPyAiTm9ubGluZWFyICIgOiAiIjsKKyAgICByZXQgKz0gKG1GbGFnICYgTk9fUFJFRkVSUkVEKSA/ICJOb1ByZWZlcnJlZCAiIDogIiI7CisgICAgcmV0ICs9IChtRmxhZyAmIE5VTExfU1RBVEUpID8gIk51bGxTdGF0ZSAiIDogIiI7CisgICAgcmV0ICs9IChtRmxhZyAmIFZPTEFUSUxFKSA/ICJWb2xhdGlsZSAiIDogIiI7CisgICAgcmV0ICs9IChtRmxhZyAmIEJVRkZFUkVEX0JZVEVTKSA/ICJCdWZmZXJlZEJ5dGVzICIgOiAiIjsKKyAgICByZXR1cm4gcmV0OworfQorCisvLyBpc0FycmF5KCkgd2lsbCByZXR1cm4gdHJ1ZSBmb3IgcmVwb3J0cyB0aGF0IG1heSBjb250YWlucyBtdWx0aXBsZSB2YWx1ZXMsIGUuZy4ga2V5Ym9hcmQgc2NhbgorLy8gY29kZSwgd2hpY2ggY2FuIGhhdmUgbXVsdGlwbGUgdmFsdWUsIGVhY2ggZGVub3RpbmcgYSBrZXkgcHJlc3NlZCBkb3duIGF0IHRoZSBzYW1lIHRpbWUuIEl0IHdpbGwKKy8vIHJldHVybiBmYWxzZSBpZiByZXBvciByZXByZXNlbnQgYSB2ZWN0b3Igb3IgbWF0cml4LgorLy8KKy8vIFRoaXMgc2xpZ2h0bHkgZGV2aWF0ZXMgZnJvbSBISUQncyBkZWZpbml0aW9uLCBpdCBpcyBtb3JlIGNvbnZlbmllbnQgdGhpcyB3YXkgYXMgbWF0cml4L3ZlY3RvcgorLy8gaW5wdXQgaXMgdHJlYXRlZCBzaW1pbGFybHkgYXMgdmFyaWFibGVzLgorYm9vbCBIaWRSZXBvcnQ6OmlzQXJyYXkoKSBjb25zdCB7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZERlZjo6UmVwb3J0RmxhZzsKKyAgICByZXR1cm4gKG1GbGFnICYgQVJSQVlfVkFSSUFCTEUpID09IDAgJiYgbUlzQ29sbGFwc2VkOworfQorCitib29sIEhpZFJlcG9ydDo6aXNWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIWlzQXJyYXkoKTsKK30KKworYm9vbCBIaWRSZXBvcnQ6OmlzRGF0YSgpIGNvbnN0IHsKKyAgICB1c2luZyBuYW1lc3BhY2UgSGlkRGVmOjpSZXBvcnRGbGFnOworICAgIHJldHVybiAobUZsYWcgJiBEQVRBX0NPTlNUKSA9PSAwOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSGlkUmVwb3J0JiBoKSB7CisgICAgb3MgPDwgaC5nZXRTdHJpbmdUeXBlKCkgPDwgIiwgIgorICAgICAgIDw8ICJ1c2FnZTogIiA8PCBzdGQ6OmhleCA8PCBoLmdldEZ1bGxVc2FnZSgpIDw8IHN0ZDo6ZGVjIDw8ICIsICI7CisKKyAgICBpZiAoaC5pc0RhdGEoKSkgeworICAgICAgICBhdXRvIHJhbmdlID0gaC5nZXRMb2dpY2FsUmFuZ2UoKTsKKyAgICAgICAgb3MgPDwgImxvZ01pbjogIiA8PCByYW5nZS5maXJzdCA8PCAiLCAiCisgICAgICAgICAgIDw8ICJsb2dNYXg6ICIgPDwgcmFuZ2Uuc2Vjb25kIDw8ICIsICI7CisKKyAgICAgICAgaWYgKHJhbmdlID09IGguZ2V0UGh5c2ljYWxSYW5nZSgpKSB7CisgICAgICAgICAgICBvcyA8PCAicGh5PT09bG9nLCAiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmFuZ2UgPSBoLmdldFBoeXNpY2FsUmFuZ2UoKTsKKyAgICAgICAgICAgIG9zIDw8ICJwaHlNaW46ICIgPDwgcmFuZ2UuZmlyc3QgPDwgIiwgIgorICAgICAgICAgICAgICAgPDwgInBoeU1heDogIiA8PCByYW5nZS5zZWNvbmQgPDwgIiwgIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgb3MgPDwgIm1hcDogKCIgPDwgc3RkOjpoZXg7CisgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IGguZ2V0VXNhZ2VWZWN0b3IoKSkgeworICAgICAgICAgICAgICAgIG9zIDw8IGkgPDwgIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3MgPDwgIiksICIgPDwgc3RkOjpkZWM7CisgICAgICAgIH0KKworICAgICAgICBvcyA8PCAiZXhwb25lbnQ6ICIgPDwgaC5nZXRFeHBvbmVudFN0cmluZygpIDw8ICIsICIKKyAgICAgICAgICAgPDwgInVuaXQ6ICIgPDwgaC5nZXRVbml0U3RyaW5nKCkgPDwgIiwgIjsKKyAgICB9IGVsc2UgeworICAgICAgICBvcyA8PCAiY29uc3RhbnQ6ICI7CisgICAgfQorICAgIG9zIDw8ICJzaXplOiAiIDw8IGguZ2V0U2l6ZSgpIDw8ICJiaXQgeCAiIDw8IGguZ2V0Q291bnQoKSA8PCAiLCAiCisgICAgICAgPDwgImlkOiAiIDw8IGgubVJlcG9ydElkOworCisgICAgcmV0dXJuIG9zOworfQorCitzdGQ6OnBhaXI8aW50NjRfdCwgaW50NjRfdD4gSGlkUmVwb3J0OjpnZXRMb2dpY2FsUmFuZ2UoKSBjb25zdCB7CisgICAgaW50NjRfdCBhID0gbUxvZ2ljYWxNaW47CisgICAgaW50NjRfdCBiID0gbUxvZ2ljYWxNYXg7CisKKyAgICBpZiAoYSA+IGIpIHsKKyAgICAgICAgLy8gbWlnaHQgYmUgdW5zaWduZWQKKyAgICAgICAgYSA9IGEgJiAoKHN0YXRpY19jYXN0PGludDY0X3Q+KDEpIDw8IGdldFNpemUoKSkgLSAxKTsKKyAgICAgICAgYiA9IGIgJiAoKHN0YXRpY19jYXN0PGludDY0X3Q+KDEpIDw8IGdldFNpemUoKSkgLSAxKTsKKyAgICAgICAgaWYgKGEgPiBiKSB7CisgICAgICAgICAgICAvLyBiYWQgaGlkIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIHJldHVybiB7MCwgMH07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHthLCBifTsKK30KKworc3RkOjpwYWlyPGludDY0X3QsIGludDY0X3Q+IEhpZFJlcG9ydDo6Z2V0UGh5c2ljYWxSYW5nZSgpIGNvbnN0IHsKKyAgICBpZiAoIShtUGh5c2ljYWxNaW4uaXNTZXQoKSAmJiBtUGh5c2ljYWxNYXguaXNTZXQoKSkpIHsKKyAgICAgICAgLy8gcGh5c2ljYWwgcmFuZ2UgdW5kZWZpbmVkLCB1c2UgbG9naWNhbCByYW5nZQorICAgICAgICByZXR1cm4gZ2V0TG9naWNhbFJhbmdlKCk7CisgICAgfQorCisgICAgaW50NjRfdCBhID0gbVBoeXNpY2FsTWluLmdldCgwKTsKKyAgICBpbnQ2NF90IGIgPSBtUGh5c2ljYWxNYXguZ2V0KDApOworCisgICAgaWYgKGEgPiBiKSB7CisgICAgICAgIGEgPSBhICYgKChzdGF0aWNfY2FzdDxpbnQ2NF90PigxKSA8PCBnZXRTaXplKCkpIC0gMSk7CisgICAgICAgIGIgPSBiICYgKChzdGF0aWNfY2FzdDxpbnQ2NF90PigxKSA8PCBnZXRTaXplKCkpIC0gMSk7CisgICAgICAgIGlmIChhID4gYikgeworICAgICAgICAgICAgcmV0dXJuIHswLCAwfTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ge2EsIGJ9OworfQorCit1bnNpZ25lZCBpbnQgSGlkUmVwb3J0OjpnZXRGdWxsVXNhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Vc2FnZSB8IChtVXNhZ2VQYWdlIDw8IDE2KTsKK30KKworc2l6ZV90IEhpZFJlcG9ydDo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJlcG9ydFNpemU7Cit9CisKK3NpemVfdCBIaWRSZXBvcnQ6OmdldENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtUmVwb3J0Q291bnQ7Cit9CisKK3Vuc2lnbmVkIGludCBIaWRSZXBvcnQ6OmdldFVuaXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Vbml0LmdldCgwKTsgLy8gZGVmYXVsdCB1bml0IGlzIDAgbWVhbnMgZGVmYXVsdCB1bml0Cit9CisKK3Vuc2lnbmVkIEhpZFJlcG9ydDo6Z2V0UmVwb3J0SWQoKSBjb25zdCB7CisgICAgLy8gaWYgcmVwb3J0IGlkIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHplcm8KKyAgICByZXR1cm4gbVJlcG9ydElkLmdldCgwKTsKK30KKwordW5zaWduZWQgSGlkUmVwb3J0OjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBtUmVwb3J0VHlwZTsKK30KKwordm9pZCBIaWRSZXBvcnQ6OnNldENvbGxhcHNlZCh1aW50MzJfdCBmdWxsVXNhZ2UpIHsKKyAgICBtVXNhZ2UgPSBmdWxsVXNhZ2UgJiAweEZGRkY7CisgICAgbVVzYWdlUGFnZSA9IGZ1bGxVc2FnZSA+PiAxNjsKKyAgICBtSXNDb2xsYXBzZWQgPSB0cnVlOworfQorCitjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+JiBIaWRSZXBvcnQ6OmdldFVzYWdlVmVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBtVXNhZ2VWZWN0b3I7Cit9Cit9IC8vIG5hbWVzcGFjZSBIaWRVdGlsCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkUmVwb3J0LmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkUmVwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwMWI2OAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRSZXBvcnQuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEhJRFVUSUxfSElEUkVQT1JUX0hfCisjZGVmaW5lIEhJRFVUSUxfSElEUkVQT1JUX0hfCisKKyNpbmNsdWRlICJIaWRHbG9iYWwuaCIKKyNpbmNsdWRlICJIaWRMb2NhbC5oIgorI2luY2x1ZGUgIlRyaVN0YXRlLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIEhpZFV0aWwgeworCitjbGFzcyBIaWRQYXJzZXI7CitjbGFzcyBIaWRUcmVlTm9kZTsKKworLy8gSGlkUmVwb3J0IHJlcHJlc2VudCBhbiBpbnB1dCwgb3V0cHV0IG9yIGZlYXR1cmUgcmVwb3J0CitjbGFzcyBIaWRSZXBvcnQgeworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSGlkUmVwb3J0JiBoKTsKK3B1YmxpYzoKKyAgICBIaWRSZXBvcnQodWludDMyX3QgdHlwZV8sIHVpbnQzMl90IGRhdGEsIGNvbnN0IEhpZEdsb2JhbCAmZ2xvYmFsLCBjb25zdCBIaWRMb2NhbCAmbG9jYWwpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHBhcnNpbmcgcHJvY2VzcyB3aGVuIHRoZSBwYXJzZXIgcmVncm91cHMgbXVsdGktdmFsdWVkIHJlcG9ydCBpbnRvIG9uZQorICAgIHZvaWQgc2V0Q29sbGFwc2VkKHVpbnQzMl90IGZ1bGxVc2FnZSk7CisKKyAgICAvLyBnZXQgcmVwb3J0IGlkCisgICAgdW5zaWduZWQgaW50IGdldFJlcG9ydElkKCkgY29uc3Q7CisgICAgLy8gZ2V0IHR5cGUgb2YgcmVwb3J0LCByZXR1cm4gY29uc3RhbnQgb2YgSGlkRGVmOjpNYWluVGFnCisgICAgdW5zaWduZWQgaW50IGdldFR5cGUoKSBjb25zdDsKKyAgICAvLyBGdWxsIHNlbnNvciB1c2FnZQorICAgIHVuc2lnbmVkIGludCBnZXRGdWxsVXNhZ2UoKSBjb25zdDsKKworICAgIC8vIGJpbmFyeSBwcm9wZXJ0aWVzCisgICAgYm9vbCBpc0FycmF5KCkgY29uc3Q7CisgICAgYm9vbCBpc0RhdGEoKSBjb25zdDsKKyAgICBib29sIGlzVmFyaWFibGUoKSBjb25zdDsKKworICAgIC8vIGxvZ2ljYWwgYW5kIHBoeXNpY2FsIHZhbHVlIHJhbmdlCisgICAgc3RkOjpwYWlyPGludDY0X3QsIGludDY0X3Q+IGdldExvZ2ljYWxSYW5nZSgpIGNvbnN0OworICAgIHN0ZDo6cGFpcjxpbnQ2NF90LCBpbnQ2NF90PiBnZXRQaHlzaWNhbFJhbmdlKCkgY29uc3Q7CisgICAgZG91YmxlIGdldEV4cG9uZW50VmFsdWUoKSBjb25zdDsKKworICAgIC8vIHJldHVybiBISUQgdW5pdCBuaWJibGVzIGluIGFuIHVuc2lnbmVkIGludAorICAgIHVuc2lnbmVkIGludCBnZXRVbml0KCkgY29uc3Q7CisKKyAgICAvLyBzaXplIGluIGJpdHMKKyAgICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworICAgIC8vIGRpbWVuc2lvbiAoaWYgaXQgaXMgdmVjdG9yL21hdHJpeCkgb3IgbnVtYmVyIG9mIGNvbmN1cnJlbnQgaW5wdXQgdmFsdWVzCisgICAgLy8gaXQgaXMgYWxzbyB1c2VkIHRvIGNhbGN1bGF0ZSBtZW1vcnkgZm9vdCBwcmludAorICAgIHNpemVfdCBnZXRDb3VudCgpIGNvbnN0OworCisgICAgLy8gZm9yIG91dHB1dCB0byBzdHJlYW0KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgcmVwb3J0VHlwZVRvU3RyaW5nKGludCB0eXBlKTsKKyAgICBzdGQ6OnN0cmluZyBnZXRTdHJpbmdUeXBlKCkgY29uc3Q7CisgICAgc3RkOjpzdHJpbmcgZ2V0RXhwb25lbnRTdHJpbmcoKSBjb25zdDsKKyAgICBzdGQ6OnN0cmluZyBnZXRVbml0U3RyaW5nKCkgY29uc3Q7CisgICAgc3RkOjpzdHJpbmcgZ2V0RmxhZ1N0cmluZygpIGNvbnN0OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4mIGdldFVzYWdlVmVjdG9yKCkgY29uc3Q7Citwcml2YXRlOgorICAgIGJvb2wgbUlzQ29sbGFwc2VkOworCisgICAgLy8gbWFuZGF0YXJ5IGZpZWxkcworICAgIHVuc2lnbmVkIGludCBtUmVwb3J0VHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgbUZsYWc7CisgICAgdW5zaWduZWQgaW50IG1Vc2FnZVBhZ2U7CisgICAgdW5zaWduZWQgaW50IG1Vc2FnZTsKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+IG1Vc2FnZVZlY3RvcjsKKworICAgIGludCBtTG9naWNhbE1pbjsgICAgICAgIC8vIDMyIGJpdCBpcyBlbm91Z2gKKyAgICBpbnQgbUxvZ2ljYWxNYXg7CisgICAgdW5zaWduZWQgaW50IG1SZXBvcnRTaXplOworICAgIHVuc2lnbmVkIGludCBtUmVwb3J0Q291bnQ7CisKKyAgICAvLyB0aGVzZSBiZWxvdyBhcmUgb3B0aW9uYWwKKyAgICB0cmlfaW50IG1QaHlzaWNhbE1pbjsKKyAgICB0cmlfaW50IG1QaHlzaWNhbE1heDsKKworICAgIHRyaV91aW50IG1FeHBvbmVudDsKKyAgICB0cmlfdWludCBtVW5pdDsKKyAgICB0cmlfdWludCBtUmVwb3J0SWQ7Cit9OworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSGlkUmVwb3J0JiBoKTsKK30gLy8gbmFtZXNwYWNlIEhpZFV0aWwKKyNlbmRpZiAvLyBISURVVElMX0hJRFJFUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFRyZWUuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDQxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkVHJlZS5jcHAKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkhpZERlZnMuaCIKKyNpbmNsdWRlICJIaWRMb2cuaCIKKyNpbmNsdWRlICJIaWRUcmVlLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgSGlkVXRpbCB7CisKKy8vIEhpZFRyZWVOb2RlCitIaWRUcmVlTm9kZTo6SGlkVHJlZU5vZGUoKSA6IG1Ob2RlVHlwZShUWVBFX1VOSU5JVElBTElaRUQpLCBtRGF0YSgwKSwgbUZ1bGxVc2FnZSgwKSB7Cit9CisKK0hpZFRyZWVOb2RlOjpIaWRUcmVlTm9kZShzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBmdWxsVXNhZ2UsIGludCBub2RlVHlwZSkKKyAgICAgICAgOiBtTm9kZVR5cGUobm9kZVR5cGUpLCBtRGF0YShkYXRhKSwKKyAgICAgICAgbUZ1bGxVc2FnZShmdWxsVXNhZ2UpLCBtUGFyZW50KHBhcmVudCkgeworfQorCitIaWRUcmVlTm9kZTo6SGlkVHJlZU5vZGUoc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YSwgdWludDMyX3QgZnVsbFVzYWdlKQorICAgICAgICA6IG1Ob2RlVHlwZShUWVBFX05PUk1BTCksIG1EYXRhKGRhdGEpLAorICAgICAgICBtRnVsbFVzYWdlKGZ1bGxVc2FnZSksIG1QYXJlbnQocGFyZW50KSB7Cit9CisKK3ZvaWQgSGlkVHJlZU5vZGU6Om91dHB1dFJlY3Vyc2l2ZShzdGQ6Om9zdHJlYW0gJm9zLCBpbnQgbGV2ZWwpIGNvbnN0IHsKKyAgICBpbnNlcnRJbmRlbnRhdGlvbihvcywgbGV2ZWwpOworICAgIG9zIDw8ICJOb2RlIGRhdGE6ICIgPDwgbURhdGEKKyAgICAgICA8PCAiLCB1c2FnZSAiIDw8IHN0ZDo6aGV4IDw8IG1GdWxsVXNhZ2UgPDwgc3RkOjpkZWMgPDwgTE9HX0VOREw7CisKKyAgICBmb3IgKGF1dG8gJmNoaWxkIDogbUNoaWxkcmVuKSB7CisgICAgICAgIGNoaWxkLT5vdXRwdXRSZWN1cnNpdmUob3MsIGxldmVsICsgMSk7CisgICAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IEhpZFRyZWVOb2RlOjpkZWVwQ29weSgKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBwYXJlbnQpIGNvbnN0IHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IGNvcHkobmV3IEhpZFRyZWVOb2RlKHBhcmVudCwgbURhdGEsIG1GdWxsVXNhZ2UsIG1Ob2RlVHlwZSkpOworICAgIGZvciAoYXV0byAmaSA6IG1DaGlsZHJlbikgeworICAgICAgICBjb3B5LT5tQ2hpbGRyZW4ucHVzaF9iYWNrKGktPmRlZXBDb3B5KGNvcHkpKTsKKyAgICB9CisgICAgcmV0dXJuIGNvcHk7Cit9CisKK3ZvaWQgSGlkVHJlZU5vZGU6Omluc2VydEluZGVudGF0aW9uKHN0ZDo6b3N0cmVhbSAmb3MsIGludCBsZXZlbCkgY29uc3QgeworICAgIGNvbnN0ZXhwciBjaGFyIGluZGVudENoYXJhY3RlciA9ICdcdCc7CisgICAgc3RkOjpmaWxsX24oc3RkOjpvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KG9zKSwgbGV2ZWwsIGluZGVudENoYXJhY3Rlcik7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gSGlkVHJlZU5vZGU6OmFkZENoaWxkKHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gY2hpbGQpIHsKKyAgICBtQ2hpbGRyZW4ucHVzaF9iYWNrKGNoaWxkKTsKKyAgICByZXR1cm4gY2hpbGQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gSGlkVHJlZU5vZGU6OmdldFBhcmVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBhcmVudC5sb2NrKCk7Cit9CisKK2Jvb2wgSGlkVHJlZU5vZGU6OmlzUmVwb3J0Q29sbGVjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5vZGVUeXBlID09IFRZUEVfTk9STUFMICYmIG1DaGlsZHJlbi5zaXplKCkgPT0gMQorICAgICAgICAgICAgJiYgbUNoaWxkcmVuLmZyb250KCktPm1Ob2RlVHlwZSA9PSBUWVBFX1JFUE9SVDsKK30KKwordW5zaWduZWQgaW50IEhpZFRyZWVOb2RlOjpnZXRGdWxsVXNhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1GdWxsVXNhZ2U7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4+JiBIaWRUcmVlTm9kZTo6Z2V0Q2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIG1DaGlsZHJlbjsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPj4mIEhpZFRyZWVOb2RlOjpnZXRDaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNoaWxkcmVuOworfQorCitib29sIEhpZFRyZWVOb2RlOjppc1VzYWdlQ29sbGVjdGlvbigpIGNvbnN0IHsKKyAgICB1c2luZyBuYW1lc3BhY2UgSGlkRGVmOjpDb2xsZWN0aW9uVHlwZTsKKyAgICByZXR1cm4gbU5vZGVUeXBlID09IFRZUEVfTk9STUFMICYmIChtRGF0YSA9PSBQSFlTSUNBTCB8fCBtRGF0YSA9PSBBUFBMSUNBVElPTik7Cit9CisKK2ludCBIaWRUcmVlTm9kZTo6Z2V0Tm9kZVR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Ob2RlVHlwZTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEhpZFRyZWVOb2RlJiBuKSB7CisgICAgbi5vdXRwdXRSZWN1cnNpdmUob3MsIDApOworICAgIHJldHVybiBvczsKK30KKworLy8gSGlkUmVwb3J0Tm9kZQorSGlkUmVwb3J0Tm9kZTo6SGlkUmVwb3J0Tm9kZShzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IHBhcmVudCwgY29uc3QgSGlkUmVwb3J0ICZyZXBvcnQpCisgICAgOiBIaWRUcmVlTm9kZShwYXJlbnQsIDAgLypkYXRhKi8sIDAgLypmdWxsVXNhZ2UqLywgVFlQRV9SRVBPUlQpLCBtUmVwb3J0KHJlcG9ydCkgeworfQorCit2b2lkIEhpZFJlcG9ydE5vZGU6Om91dHB1dFJlY3Vyc2l2ZShzdGQ6Om9zdHJlYW0gJm9zLCBpbnQgbGV2ZWwpIGNvbnN0IHsKKyAgICBpbnNlcnRJbmRlbnRhdGlvbihvcywgbGV2ZWwpOworICAgIG9zIDw8IG1SZXBvcnQgPDwgTE9HX0VOREw7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gSGlkUmVwb3J0Tm9kZTo6ZGVlcENvcHkoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gcGFyZW50KSBjb25zdCB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBjb3B5KG5ldyBIaWRSZXBvcnROb2RlKHBhcmVudCwgbVJlcG9ydCkpOworICAgIHJldHVybiBjb3B5OworfQorCitjb25zdCBIaWRSZXBvcnQmIEhpZFJlcG9ydE5vZGU6OmdldFJlcG9ydCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJlcG9ydDsKK30KKwordm9pZCBIaWRSZXBvcnROb2RlOjpjb2xsYXBzZSh1bnNpZ25lZCBpbnQgbmV3VXNhZ2UpIHsKKyAgICBtUmVwb3J0LnNldENvbGxhcHNlZChuZXdVc2FnZSk7Cit9CisKK30gLy9uYW1lc3BhY2UgSGlkVXRpbApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFRyZWUuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRUcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1MjAwNwotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRUcmVlLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBISURVVElMX0hJRFRSRUVfSF8KKyNkZWZpbmUgSElEVVRJTF9ISURUUkVFX0hfCisKKyNpbmNsdWRlICJIaWRSZXBvcnQuaCIKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgSGlkVXRpbCB7CisKKy8vIEhJRCByZXBvcnQgcGFyc2VyIG91dHB1dCB0cmVlIG5vZGUKK2NsYXNzIEhpZFRyZWVOb2RlIHsKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEhpZFRyZWVOb2RlJiBuKTsKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgVFlQRV9VTklOSVRJQUxJWkVEID0gMCwKKyAgICAgICAgVFlQRV9OT1JNQUwgPSAxLAorICAgICAgICBUWVBFX1JFUE9SVCA9IDIgICAgIC8vIGNhbiBiZSBjYXN0IHRvIEhpZFJlcG9ydE5vZGUKKyAgICB9OworICAgIEhpZFRyZWVOb2RlKCk7CisgICAgSGlkVHJlZU5vZGUoc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBwYXJlbnQsIHVpbnQzMl90IGRhdGEsIHVpbnQzMl90IGZ1bGxVc2FnZSk7CisKKyAgICB2aXJ0dWFsIH5IaWRUcmVlTm9kZSgpID0gZGVmYXVsdDsKKworICAgIC8vIG1ha2UgYSBkZWVwIGNvcHkgb2YgdHJlZSBhdCBhbmQgYmVsb3cgdGhpcyBub2RlIGFuZCBhdHRhY2ggaXQgdG8gc3BlY2lmaWVkIHBhcmVudCBub2RlCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IGRlZXBDb3B5KAorICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gcGFyZW50ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgICAvLyBhZGQgY2hpbGQgdG8gdGhpcyBub2RlCisgICAgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBhZGRDaGlsZChzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IGNoaWxkKTsKKworICAgIC8vIGdldCBhbGwgY2hpbGRyZW4gb2YgYSBub2RlCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPj4mIGdldENoaWxkcmVuKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPj4mIGdldENoaWxkcmVuKCkgY29uc3Q7CisKKyAgICAvLyBnZXQgcGFyZW50IChudWxscHRyIGlmIGl0IGlzIHJvb3Qgbm9kZSBvciBpZiBsb2NrIHdlYWtfcHRyIGZhaWxlZCkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IGdldFBhcmVudCgpIGNvbnN0OworCisgICAgLy8gYWNjZXNzIHVzYWdlIG9mIHRoaXMgbm9kZQorICAgIHVuc2lnbmVkIGludCBnZXRGdWxsVXNhZ2UoKSBjb25zdDsKKworICAgIGJvb2wgaXNSZXBvcnRDb2xsZWN0aW9uKCkgY29uc3Q7CisgICAgYm9vbCBpc1VzYWdlQ29sbGVjdGlvbigpIGNvbnN0OworICAgIGludCBnZXROb2RlVHlwZSgpIGNvbnN0OworcHJvdGVjdGVkOgorICAgIC8vIGZvciBkZXJpdmVkIGNsYXNzIHRvIGRlZmluZSBkaWZmZXJlbnQgbm9kZVR5cGUKKyAgICBIaWRUcmVlTm9kZShzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IHBhcmVudCwKKyAgICAgICAgICAgICAgdWludDMyX3QgZGF0YSwgdWludDMyX3QgZnVsbFVzYWdlLCBpbnQgbm9kZVR5cGUpOworCisgICAgLy8gaGVscGVyIGZvciBzdHJlYW0gb3V0cHV0CisgICAgdm9pZCBpbnNlcnRJbmRlbnRhdGlvbihzdGQ6Om9zdHJlYW0gJm9zLCBpbnQgbGV2ZWwpIGNvbnN0OworcHJpdmF0ZToKKyAgICAvLyBoZWxwZXIgZm9yIHN0cmVhbSBvdXRwdXQKKyAgICB2aXJ0dWFsIHZvaWQgb3V0cHV0UmVjdXJzaXZlKHN0ZDo6b3N0cmVhbSYgb3MsIGludCBsZXZlbCkgY29uc3Q7CisKKyAgICBpbnQgbU5vZGVUeXBlOworICAgIHVpbnQzMl90IG1EYXRhOworICAgIHVpbnQzMl90IG1GdWxsVXNhZ2U7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+PiBtQ2hpbGRyZW47CisgICAgc3RkOjp3ZWFrX3B0cjxIaWRUcmVlTm9kZT4gbVBhcmVudDsKK307CisKKy8vIFRyZWUgbm9kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGFuIGlucHV0LCBvdXRwdXQgb3IgZmVhdHVyZSByZXBvcnQKK2NsYXNzIEhpZFJlcG9ydE5vZGUgOiBwdWJsaWMgSGlkVHJlZU5vZGUgeworcHVibGljOgorICAgIEhpZFJlcG9ydE5vZGUoc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBwYXJlbnQsIGNvbnN0IEhpZFJlcG9ydCAmcmVwb3J0KTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBkZWVwQ29weSgKKyAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IHBhcmVudCA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gb2J0YWluIEhpZFJlcG9ydCBhdHRhY2hlZCB0byB0aGlzIG5vZGUKKyAgICBjb25zdCBIaWRSZXBvcnQmIGdldFJlcG9ydCgpIGNvbnN0OworCisgICAgLy8gcmVzZXQgdXNhZ2Ugb2Ygbm9kZSBhbmQgc2V0IHVuZGVybHlpbmcgcmVwb3J0IHRvIGNvbGxhcHNlZAorICAgIHZvaWQgY29sbGFwc2UodW5zaWduZWQgaW50IG5ld1VzYWdlKTsKK3ByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkIG91dHB1dFJlY3Vyc2l2ZShzdGQ6Om9zdHJlYW0gJm9zLCBpbnQgbGV2ZWwpIGNvbnN0IG92ZXJyaWRlOworCisgICAgSGlkUmVwb3J0IG1SZXBvcnQ7Cit9OworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSGlkVHJlZU5vZGUmIG4pOworCit9IC8vIG5hbWVzcGFjZSBIaWRVdGlsCisKKyNlbmRpZiAvLyBISURVVElMX0hJRFRSRUVfSF8KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9TdHJlYW1Jb1V0aWwuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9TdHJlYW1Jb1V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWE5NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL1N0cmVhbUlvVXRpbC5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSElEVVRJTF9TVFJFQU1fSU9fVVRJTF9IXworI2RlZmluZSBISURVVElMX1NUUkVBTV9JT19VVElMX0hfCisKKyNpbmNsdWRlICJIaWRMb2cuaCIKKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIEhpZFV0aWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVD4KK2NsYXNzIGNoYXJ2ZWN0b3JidWYgOiBwdWJsaWMgc3RkOjpzdHJlYW1idWYgeyAvLyBjbGFzcyBuYW1lIGlzIGNvbnNpc3RlbnQgd2l0aCBzdGQgbGliCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2NvbnN0PENoYXJUPjo6dmFsdWUgPT0gZmFsc2UsICJjYW5ub3QgdXNlIGNvbnN0IHR5cGUiKTsKK3B1YmxpYzoKKyAgICAvLyByL3cgYnVmZmVyIGNvbnN0cnVjdG9ycworICAgIGNoYXJ2ZWN0b3JidWYoc3RkOjp2ZWN0b3I8Q2hhclQ+ICZ2ZWMpIHsKKyAgICAgICAgaW5pdCh2ZWMuZGF0YSgpLCB2ZWMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBjaGFydmVjdG9yYnVmKENoYXJUICpiZWdpbiwgQ2hhclQgKmVuZCkgeworICAgICAgICBhc3NlcnQoZW5kID49IGJlZ2luKTsKKyAgICAgICAgaW5pdChiZWdpbiwgZW5kIC0gYmVnaW4pOworICAgIH0KKworICAgIGNoYXJ2ZWN0b3JidWYoQ2hhclQgKmJlZ2luLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpbml0KGJlZ2luLCBzaXplKTsKKyAgICB9CisKKyAgICAvLyByL28gYnVmZmVyIGNvbnN0cnVjdG9yCisgICAgY2hhcnZlY3RvcmJ1Zihjb25zdCBzdGQ6OnZlY3RvcjxDaGFyVD4gJnZlYykgeworICAgICAgICBpbml0KHZlYy5kYXRhKCksIHZlYy5zaXplKCkpOworICAgIH0KKworICAgIGNoYXJ2ZWN0b3JidWYoY29uc3QgQ2hhclQgKmJlZ2luLCBjb25zdCBDaGFyVCAqZW5kKSB7CisgICAgICAgIGFzc2VydChlbmQgPj0gYmVnaW4pOworICAgICAgICBpbml0KGJlZ2luLCBlbmQgLSBiZWdpbik7CisgICAgfQorCisgICAgY2hhcnZlY3RvcmJ1Zihjb25zdCBDaGFyVCAqYmVnaW4sIHNpemVfdCBzaXplKSB7CisgICAgICAgIGluaXQoYmVnaW4sIHNpemUpOworICAgIH0KKyBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBzdGQ6OnN0cmVhbXBvcyBzZWVrcG9zKAorICAgICAgICAgICAgc3RkOjpzdHJlYW1wb3Mgc3AsIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIHdoaWNoID0KKyAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6OmluIHwgc3RkOjppb3NfYmFzZTo6b3V0KSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzZWVrb2ZmKHN0ZDo6c3RyZWFtb2ZmKHNwKSwgc3RkOjppb3NfYmFzZTo6YmVnLCB3aGljaCk7CisgICAgfQorCisgICAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gdXNlIGZ0ZWxsKCkgb24gc3RyZWFtCisgICAgdmlydHVhbCBzdGQ6OnN0cmVhbXBvcyBzZWVrb2ZmKAorICAgICAgICAgICAgc3RkOjpzdHJlYW1vZmYgb2ZmLCBzdGQ6Omlvc19iYXNlOjpzZWVrZGlyIHdheSwKKyAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIHdoaWNoID0KKyAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6OmluIHwgc3RkOjppb3NfYmFzZTo6b3V0KSBvdmVycmlkZSB7CisKKyAgICAgICAgLy8gcHB0cigpID09IG51bGxwdHI6IHJlYWQtb25seQorICAgICAgICBhc3NlcnQocHB0cigpID09IG51bGxwdHIgfHwgZWdwdHIoKSAtIGViYWNrKCkgPT0gZXBwdHIoKSAtIHBiYXNlKCkpOworICAgICAgICBib29sIGluID0gd2hpY2ggJiBzdGQ6Omlvc19iYXNlOjppbjsKKyAgICAgICAgYm9vbCBvdXQgPSB3aGljaCAmIHN0ZDo6aW9zX2Jhc2U6Om91dDsKKyAgICAgICAgcG9zX3R5cGUgZW5kID0gZWdwdHIoKSAtIGViYWNrKCk7CisKKyAgICAgICAgaWYgKCFpbiAmJiAhb3V0KSB7CisgICAgICAgICAgICByZXR1cm4gcG9zX3R5cGUoLTEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluICYmIG91dCAmJiB3YXkgPT0gc3RkOjppb3NfYmFzZTo6Y3VyKSB7CisgICAgICAgICAgICByZXR1cm4gcG9zX3R5cGUoLTEpOworICAgICAgICB9CisKKyAgICAgICAgb2ZmX3R5cGUgbm9mZjsKKyAgICAgICAgc3dpdGNoICh3YXkpIHsKKyAgICAgICAgICAgIGNhc2Ugc3RkOjppb3NfYmFzZTo6YmVnOgorICAgICAgICAgICAgICAgIG5vZmYgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzdGQ6Omlvc19iYXNlOjpjdXI6CisgICAgICAgICAgICAgICAgaWYgKGluKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZmYgPSBncHRyKCkgLSBlYmFjaygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5vZmYgPSBwcHRyKCkgLSBwYmFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugc3RkOjppb3NfYmFzZTo6ZW5kOgorICAgICAgICAgICAgICAgIG5vZmYgPSBlbmQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBwb3NfdHlwZSgtMSk7CisgICAgICAgIH0KKyAgICAgICAgbm9mZiArPSBvZmY7CisgICAgICAgIGlmIChub2ZmIDwgMCB8fCAgbm9mZiA+IGVuZCkgeworICAgICAgICAgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChub2ZmICE9IDAgJiYgKChpbiAmJiBncHRyKCkgPT0gbnVsbHB0cikgfHwgKG91dCAmJiBwcHRyKCkgPT0gbnVsbHB0cikpKSB7CisgICAgICAgICAgICByZXR1cm4gcG9zX3R5cGUoLTEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluKSB7CisgICAgICAgICAgICBzZXRnKGViYWNrKCksIGViYWNrKCkgKyBub2ZmLCBlZ3B0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXQpIHsKKyAgICAgICAgICAgIHNldHAocGJhc2UoKSwgZXBwdHIoKSk7CisgICAgICAgICAgICBwYnVtcChub2ZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwb3NfdHlwZShub2ZmKTsKKyAgICB9Citwcml2YXRlOgorICAgIC8vIHJlYWQgb25seSBidWZmZXIgaW5pdAorICAgIHZvaWQgaW5pdChjb25zdCBDaGFyVCAqYmFzZSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgc2V0ZygoY2hhciopYmFzZSwgKGNoYXIqKWJhc2UsIChjaGFyKikoYmFzZSArIHNpemUpKTsKKyAgICB9CisKKyAgICAvLyByZWFkIHdyaXRlIGJ1ZmZlciBpbml0CisgICAgdm9pZCBpbml0KENoYXJUICpiYXNlLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBzZXRnKChjaGFyKiliYXNlLCAoY2hhciopYmFzZSwgKGNoYXIqKShiYXNlICsgc2l6ZSkpOworICAgICAgICBzZXRwKChjaGFyKiliYXNlLCAoY2hhciopKGJhc2UgKyBzaXplKSk7CisgICAgfQorfTsKKworLy8gZHVtcCBiaW5hcnkgdmFsdWVzCit0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yPgordm9pZCBoZXhkdW1wVG9TdHJlYW0oc3RkOjpvc3RyZWFtICZvcywgY29uc3QgRm9yd2FyZEl0ZXJhdG9yICZmaXJzdCwgY29uc3QgRm9yd2FyZEl0ZXJhdG9yICZsYXN0KSB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZz46OnZhbHVlCisgICAgICAgICAgICAmJiBzdGQ6OmlzX2NvbnZlcnRpYmxlPAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcj46OnZhbHVlCisgICAgICAgICAgICAmJiBzaXplb2YodHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSkKKyAgICAgICAgICAgICAgICA9PSBzaXplb2YodW5zaWduZWQgY2hhciksCisgICAgICAgICAgICAiT25seSBhY2NlcHRzIGZvcndhcmQgaXRlcmF0b3Igb2YgYSB0eXBlIG9mIHNpemUgMSAiCisgICAgICAgICAgICAgICAgInRoYXQgY2FuIGJlIGNvbnZlcnQgdG8gdW5zaWduZWQgY2hhci5cbiIpOworICAgIHNpemVfdCBjID0gMDsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgICAgZm9yIChGb3J3YXJkSXRlcmF0b3IgaSA9IGZpcnN0OyBpICE9IGxhc3Q7ICsraSwgKytjKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdiA9ICppOworICAgICAgICAvLyBmb3JtYXR0aW5nCisgICAgICAgIHN3aXRjaCAoYyAmIDB4ZikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIC8vIGFkZHJlc3MKKyAgICAgICAgICAgICAgICBvcyA8PCBzcy5zdHIoKSA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICBzcy5zdHIoIiIpOworICAgICAgICAgICAgICAgIHNzIDw8IHN0ZDo6aGV4OworICAgICAgICAgICAgICAgIHNzIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyg0KSA8PCBjIDw8ICI6ICI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgLy8gc3BhY2UKKyAgICAgICAgICAgICAgICBzcyA8PCAiICI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpCisgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPih2KSkgPDwgIiAiOworICAgIH0KKyAgICBvcyA8PCBzcy5zdHIoKSA8PCBMT0dfRU5ETDsKK30KK30gLy9uYW1lc3BhY2UgSGlkVXRpbAorCisjZW5kaWYgLy8gSElEVVRJTF9TVFJFQU1fSU9fVVRJTF9IXworCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvVHJpU3RhdGUuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9UcmlTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDQ4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvVHJpU3RhdGUuaApAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEhJRFVUSUxfVFJJU1RBVEVfSF8KKyNkZWZpbmUgSElEVVRJTF9UUklTVEFURV9IXworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIEhpZFV0aWwgewordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFRyaVN0YXRlIHsKK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3RvcgorICAgIFRyaVN0YXRlKCkgOiBtSXNTZXQoZmFsc2UpIHsgfQorICAgIFRyaVN0YXRlKGNvbnN0IFRyaVN0YXRlPFQ+ICZvdGhlcikgOiBtSXNTZXQob3RoZXIubUlzU2V0KSwgbVZhbHVlKG90aGVyLm1WYWx1ZSkgeyB9CisgICAgZXhwbGljaXQgVHJpU3RhdGUoY29uc3QgVCAmdmFsdWUpIDogbUlzU2V0KHRydWUpLCBtVmFsdWUodmFsdWUpIHsgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbVZhbHVlID0gVCgpOworICAgICAgICBtSXNTZXQgPSBmYWxzZTsKKyAgICB9CisgICAgYm9vbCBpc1NldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc1NldDsKKyAgICB9CisKKyAgICBjb25zdCBUIGdldChjb25zdCBUICZkZWZhdWx0VmFsdWUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzU2V0KCkgPyBtVmFsdWUgOiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgLy8gb3BlcmF0b3Igb3ZlcmxvYWRpbmcKKyAgICBleHBsaWNpdCBvcGVyYXRvciBUICgpIGNvbnN0IHsKKyAgICAgICAgYXNzZXJ0KG1Jc1NldCk7CisgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgfQorCisgICAgVHJpU3RhdGU8VD4mIG9wZXJhdG9yPShjb25zdCBUcmlTdGF0ZTxUPiAmb3RoZXIpIHsKKyAgICAgICAgbUlzU2V0ID0gb3RoZXIubUlzU2V0OworICAgICAgICBtVmFsdWUgPSBvdGhlci5tVmFsdWU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBUcmlTdGF0ZTxUPiYgb3BlcmF0b3I9KGNvbnN0IFQmIHZhbHVlKSB7CisgICAgICAgIG1Jc1NldCA9IHRydWU7CisgICAgICAgIG1WYWx1ZSA9IHZhbHVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVHJpU3RhdGU8VD4mIG9wZXJhdG9yKysoKSAgeworICAgICAgICBpZiAobUlzU2V0KSB7CisgICAgICAgICAgICBtVmFsdWUrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVHJpU3RhdGU8VD4gb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgICAgVHJpU3RhdGU8VD4gdG1wKCp0aGlzKTsKKyAgICAgICAgb3BlcmF0b3IrKygpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIFRyaVN0YXRlPFQ+JiBvcGVyYXRvci0tKCkgIHsKKyAgICAgICAgaWYgKG1Jc1NldCkgeworICAgICAgICAgICAgbVZhbHVlLS07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFRyaVN0YXRlPFQ+IG9wZXJhdG9yLS0oaW50KSB7CisgICAgICAgIFRyaVN0YXRlPFQ+IHRtcCgqdGhpcyk7CisgICAgICAgIG9wZXJhdG9yLS0oKTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyNkZWZpbmUgVU5BUllfT1Aob3ApIFwKKyAgICBUcmlTdGF0ZTxUPiBvcGVyYXRvciBvcCgpIHsgXAorICAgICAgICBUcmlTdGF0ZTxUPiB0bXAoKnRoaXMpOyBcCisgICAgICAgIGlmIChtSXNTZXQpIHsgXAorICAgICAgICAgICAgdG1wLm1WYWx1ZSA9IG9wIHRtcC5tVmFsdWU7IFwKKyAgICAgICAgfSBcCisgICAgICAgIHJldHVybiB0bXA7IFwKKyAgICB9CisKKyAgICBVTkFSWV9PUCghKTsKKyAgICBVTkFSWV9PUCgtKTsKKyAgICBVTkFSWV9PUCh+KTsKKyN1bmRlZiBVTkFSWV9PUAorCisjZGVmaW5lIENPTVBPVU5EX0FTU0lHTl9PUChvcCkgXAorICAgIFRyaVN0YXRlPFQ+JiBvcGVyYXRvciBvcCAoY29uc3QgVHJpU3RhdGU8VD4mIHJocykgeyBcCisgICAgICAgIGlmIChtSXNTZXQgJiYgcmhzLm1Jc1NldCkgeyBcCisgICAgICAgICAgICBtVmFsdWUgb3AgcmhzLm1WYWx1ZTsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICBtSXNTZXQgPSBmYWxzZTsgXAorICAgICAgICB9IFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgfSBcCisgICAgVHJpU3RhdGU8VD4mIG9wZXJhdG9yIG9wKGNvbnN0IFQmIHJocykgeyBcCisgICAgICAgIGlmIChtSXNTZXQpIHsgXAorICAgICAgICAgICAgbVZhbHVlIG9wIHJoczsgXAorICAgICAgICB9IFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgfQorCisgICAgQ09NUE9VTkRfQVNTSUdOX09QKCs9KTsKKyAgICBDT01QT1VORF9BU1NJR05fT1AoLT0pOworICAgIENPTVBPVU5EX0FTU0lHTl9PUCgqPSk7CisgICAgQ09NUE9VTkRfQVNTSUdOX09QKC89KTsKKyAgICBDT01QT1VORF9BU1NJR05fT1AoJT0pOworICAgIENPTVBPVU5EX0FTU0lHTl9PUCgmPSk7CisgICAgQ09NUE9VTkRfQVNTSUdOX09QKHw9KTsKKyAgICBDT01QT1VORF9BU1NJR05fT1AoXj0pOworI3VuZGVmIENPTVBPVU5EX0FTU0lHTl9PUAorCisgICAgVHJpU3RhdGU8VD4mIG9wZXJhdG9yID4+PShpbnQgaSkgeworICAgICAgICBpZiAobUlzU2V0KSB7CisgICAgICAgICAgICBtVmFsdWUgPj49IGk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgfQorCisgICAgVHJpU3RhdGU8VD4mIG9wZXJhdG9yIDw8PShpbnQgaSkgeworICAgICAgICBpZiAobUlzU2V0KSB7CisgICAgICAgICAgICBtVmFsdWUgPDw9IGk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgfQorCisgICAgVHJpU3RhdGU8VD4gb3BlcmF0b3IgPDwoaW50IGkpIHsgXAorICAgICAgICBUcmlTdGF0ZTxUPiB0bXAoKnRoaXMpOworICAgICAgICBvcGVyYXRvcjw8KGkpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIFRyaVN0YXRlPFQ+IG9wZXJhdG9yID4+KGludCBpKSB7IFwKKyAgICAgICAgVHJpU3RhdGU8VD4gdG1wKCp0aGlzKTsKKyAgICAgICAgb3BlcmF0b3I+PihpKTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyNkZWZpbmUgQklOQVJZX09QKG9wLCBjb21wb3VuZF9vcCkgXAorICAgIGZyaWVuZCBUcmlTdGF0ZTxUPiBvcGVyYXRvciBvcChUcmlTdGF0ZTxUPiBsaHMsIGNvbnN0IFRyaVN0YXRlPFQ+JiByaHMpIHsgXAorICAgICAgICBsaHMgY29tcG91bmRfb3AgcmhzOyBcCisgICAgcmV0dXJuIGxoczsgXAorICAgIH1cCisgICAgICAgIGZyaWVuZCBUcmlTdGF0ZTxUPiBvcGVyYXRvciBvcChUcmlTdGF0ZTxUPiBsaHMsIGNvbnN0IFQmIHJocykgeyBcCisgICAgbGhzIGNvbXBvdW5kX29wIHJoczsgXAorICAgICAgICByZXR1cm4gbGhzOyBcCisgICAgfVwKKyAgICBmcmllbmQgVHJpU3RhdGU8VD4gb3BlcmF0b3Igb3AoY29uc3QgVCAmbGhzLCBjb25zdCBUcmlTdGF0ZTxUPiYgcmhzKSB7IFwKKyAgICAgICAgVHJpU3RhdGU8VD4gdG1wKGxocyk7IFwKKyAgICAgICAgcmV0dXJuIHRtcCBvcCByaHM7IFwKKyAgICB9CisKKyAgICBCSU5BUllfT1AoKywgKz0pOworICAgIEJJTkFSWV9PUCgtLCAtPSk7CisgICAgQklOQVJZX09QKCosICo9KTsKKyAgICBCSU5BUllfT1AoLywgLz0pOworICAgIEJJTkFSWV9PUCglLCAlPSk7CisgICAgQklOQVJZX09QKCYsICY9KTsKKyAgICBCSU5BUllfT1AofCwgfD0pOworICAgIEJJTkFSWV9PUCheLCBePSk7CisjdW5kZWYgQklOQVJZX09QCisKKyNkZWZpbmUgUkVMQVRJT05fT1Aob3ApIFwKKyAgICBmcmllbmQgVHJpU3RhdGU8Ym9vbD4gb3BlcmF0b3Igb3AoY29uc3QgVHJpU3RhdGU8VD4mIGxocywgY29uc3QgVHJpU3RhdGU8VD4mIHJocykgeyBcCisgICAgICAgIGlmIChsaHMubUlzU2V0ICYmIHJocy5tSXNTZXQpIHsgXAorICAgICAgICAgICAgcmV0dXJuIFRyaVN0YXRlPGJvb2w+KGxocy5tVmFsdWUgb3AgcmhzLm1WYWx1ZSk7IFwKKyAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICByZXR1cm4gVHJpU3RhdGU8Ym9vbD4oKTsgXAorICAgICAgICB9IFwKKyAgICB9IFwKKyAgICBmcmllbmQgVHJpU3RhdGU8Ym9vbD4gb3BlcmF0b3Igb3AoY29uc3QgVHJpU3RhdGU8VD4mIGxocywgY29uc3QgVCYgcmhzKSB7IFwKKyAgICAgICAgaWYgKGxocy5tSXNTZXQpIHsgXAorICAgICAgICAgICAgcmV0dXJuIFRyaVN0YXRlPGJvb2w+KGxocy5tVmFsdWUgb3AgcmhzKTsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICByZXR1cm4gVHJpU3RhdGU8Ym9vbD4oKTsgXAorICAgICAgICB9IFwKKyAgICB9IFwKKyAgICBmcmllbmQgVHJpU3RhdGU8Ym9vbD4gb3BlcmF0b3Igb3AoY29uc3QgVCYgbGhzLCBjb25zdCBUcmlTdGF0ZTxUPiYgcmhzKSB7IFwKKyAgICAgICAgaWYgKHJocy5tSXNTZXQpIHsgXAorICAgICAgICAgICAgcmV0dXJuIFRyaVN0YXRlPGJvb2w+KGxocyBvcCByaHMubVZhbHVlKTsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICByZXR1cm4gVHJpU3RhdGU8Ym9vbD4oKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyAgICBSRUxBVElPTl9PUCg9PSk7CisgICAgUkVMQVRJT05fT1AoIT0pOworICAgIFJFTEFUSU9OX09QKD49KTsKKyAgICBSRUxBVElPTl9PUCg8PSk7CisgICAgUkVMQVRJT05fT1AoPik7CisgICAgUkVMQVRJT05fT1AoPCk7CisjdW5kZWYgUkVMQVRJT05fT1AKKworICAgIGZyaWVuZCBUcmlTdGF0ZTxib29sPiBvcGVyYXRvciAmJihUcmlTdGF0ZTxUPiYgbGhzLCBjb25zdCBUcmlTdGF0ZTxUPiYgcmhzKSB7CisgICAgICAgIGlmIChsaHMubUlzU2V0ICYmIHJocy5tSXNTZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBUcmlTdGF0ZTxib29sPihsaHMubVZhbHVlICYmIHJocy5tVmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFRyaVN0YXRlPGJvb2w+KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmllbmQgVHJpU3RhdGU8Ym9vbD4gb3BlcmF0b3IgfHwoVHJpU3RhdGU8VD4mIGxocywgY29uc3QgVHJpU3RhdGU8VD4mIHJocykgeworICAgICAgICBpZiAobGhzLm1Jc1NldCAmJiByaHMubUlzU2V0KSB7CisgICAgICAgICAgICByZXR1cm4gVHJpU3RhdGU8Ym9vbD4obGhzLm1WYWx1ZSB8fCByaHMubVZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBUcmlTdGF0ZTxib29sPigpOworICAgICAgICB9CisgICAgfQorCisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgVHJpU3RhdGU8VD4gJnYpIHsKKyAgICAgICAgaWYgKHYubUlzU2V0KSB7CisgICAgICAgICAgICBvcyA8PCB2Lm1WYWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9zIDw8ICJbbm90IHNldF0iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBmcmllbmQgc3RkOjppc3RyZWFtJiBvcGVyYXRvciA+PihzdGQ6OmlzdHJlYW0gJmlzLCBjb25zdCBUcmlTdGF0ZTxUPiAmdikgeworICAgICAgICBUIGE7CisgICAgICAgIGlzID4+IGE7CisgICAgICAgIHYgPSBUcmlTdGF0ZTxUPihhKTsKKyAgICAgICAgcmV0dXJuIGlzOworICAgIH0KK3ByaXZhdGU6CisgICAgYm9vbCBtSXNTZXQ7CisgICAgVCBtVmFsdWU7Cit9OworCisvLyBjb21tb25seSB1c2VkIG9uZXMKK3R5cGVkZWYgVHJpU3RhdGU8dW5zaWduZWQ+IHRyaV91aW50OwordHlwZWRlZiBUcmlTdGF0ZTxpbnQ+IHRyaV9pbnQ7CisKK3R5cGVkZWYgVHJpU3RhdGU8dWludDMyX3Q+IHRyaV91aW50MzJfdDsKK3R5cGVkZWYgVHJpU3RhdGU8aW50MzJfdD4gdHJpX2ludDMyX3Q7Cit0eXBlZGVmIFRyaVN0YXRlPHVpbnQ4X3Q+IHRyaV91aW50OF90OwordHlwZWRlZiBUcmlTdGF0ZTx1aW50MTZfdD4gdHJpX3VpbnQxNl90OworfQorCisjZW5kaWYgLy8gSElEVVRJTF9UUklTVEFURV9IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvSGlkUGFyc2VyRXhhbXBsZS5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9IaWRQYXJzZXJFeGFtcGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzcyNDNlCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvSGlkUGFyc2VyRXhhbXBsZS5jcHAKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkhpZExvZy5oIgorI2luY2x1ZGUgIkhpZFBhcnNlci5oIgorI2luY2x1ZGUgIlRlc3RIaWREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKwordXNpbmcgSGlkVXRpbDo6SGlkUGFyc2VyOworCitib29sIGRvUGFyc2UoKSB7CisgICAgSGlkUGFyc2VyIGhpZFBhcnNlcjsKKyAgICBib29sIHJldCA9IHRydWU7CisKKyAgICBmb3IgKGNvbnN0IFRlc3RIaWREZXNjcmlwdG9yICpwID0gZ0Rlc2NyaXB0b3JBcnJheTsgOyArK3ApIHsKKyAgICAgICAgaWYgKHAtPmRhdGEgPT0gbnVsbHB0ciB8fCBwLT5sZW4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHAtPm5hbWUgIT0gbnVsbHB0ciA/IHAtPm5hbWUgOiAidW5uYW1lZCI7CisgICAgICAgIGJvb2wgcGFyc2VSZXN1bHQgPSBoaWRQYXJzZXIucGFyc2UocC0+ZGF0YSwgcC0+bGVuKTsKKworICAgICAgICBpZiAocGFyc2VSZXN1bHQpIHsKKyAgICAgICAgICAgIExPR19WIDw8IG5hbWUgPDwgIiAgZmlsdGVyZWQgdHJlZTogIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIExPR19WIDw8ICooaGlkUGFyc2VyLmdldFRyZWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIExPR19FIDw8IG5hbWUgPDwgIiBwYXJzaW5nIGVycm9yISIgPDwgTE9HX0VOREw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBkb1BhcnNlQW5kRmlsdGVyKCkgeworICAgIEhpZFBhcnNlciBoaWRQYXJzZXI7CisgICAgYm9vbCByZXQgPSB0cnVlOworCisgICAgZm9yIChjb25zdCBUZXN0SGlkRGVzY3JpcHRvciAqcCA9IGdEZXNjcmlwdG9yQXJyYXk7IDsgKytwKSB7CisgICAgICAgIGlmIChwLT5kYXRhID09IG51bGxwdHIgfHwgcC0+bGVuID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBwLT5uYW1lICE9IG51bGxwdHIgPyBwLT5uYW1lIDogInVubmFtZWQiOworICAgICAgICBib29sIHBhcnNlUmVzdWx0ID0gaGlkUGFyc2VyLnBhcnNlKHAtPmRhdGEsIHAtPmxlbik7CisKKyAgICAgICAgaWYgKHBhcnNlUmVzdWx0KSB7CisgICAgICAgICAgICBoaWRQYXJzZXIuZmlsdGVyVHJlZSgpOworICAgICAgICAgICAgTE9HX1YgPDwgbmFtZSA8PCAiICBmaWx0ZXJlZCB0cmVlOiAiIDw8IExPR19FTkRMOworICAgICAgICAgICAgTE9HX1YgPDwgKihoaWRQYXJzZXIuZ2V0VHJlZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgTE9HX0UgPDwgbmFtZSA8PCAiIHBhcnNpbmcgZXJyb3IhIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIGRvRGlnZXN0KCkgeworICAgIEhpZFBhcnNlciBoaWRQYXJzZXI7CisgICAgYm9vbCByZXQgPSB0cnVlOworCisgICAgLy8gdmFsdWUgZnJvbSBISUQgc2Vuc29yIHVzYWdlIHBhZ2Ugc3BlYworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+IGludGVyZXN0ZWRVc2FnZSA9IHsKKyAgICAgICAgMHgyMDAwNzMsIC8vIGFjY2VsZXJvbWV0ZXIgM2QKKyAgICAgICAgMHgyMDAwNzYsIC8vIGd5cm8gM2QKKyAgICAgICAgMHgyMDAwODMsIC8vIG1hZyAzZAorICAgICAgICAweDIwMDA4YSwgLy8gZGV2aWNlIG9yaWVudGF0aW9uIChyb3RhdGlvbiB2ZWN0b3IpCisgICAgfTsKKworICAgIGZvciAoY29uc3QgVGVzdEhpZERlc2NyaXB0b3IgKnAgPSBnRGVzY3JpcHRvckFycmF5OyA7ICsrcCkgeworICAgICAgICBpZiAocC0+ZGF0YSA9PSBudWxscHRyIHx8IHAtPmxlbiA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gcC0+bmFtZSAhPSBudWxscHRyID8gcC0+bmFtZSA6ICJ1bm5hbWVkIjsKKyAgICAgICAgYm9vbCBwYXJzZVJlc3VsdCA9IGhpZFBhcnNlci5wYXJzZShwLT5kYXRhLCBwLT5sZW4pOworCisgICAgICAgIGlmICghcGFyc2VSZXN1bHQpIHsKKyAgICAgICAgICAgIExPR19FIDw8IG5hbWUgPDwgIiBwYXJzaW5nIGVycm9yISIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaGlkUGFyc2VyLmZpbHRlclRyZWUoKTsKKyAgICAgICAgTE9HX1YgPDwgbmFtZSA8PCAiICBkaWdlc3Q6ICIgPDwgTE9HX0VOREw7CisgICAgICAgIEhpZFBhcnNlcjo6RGlnZXN0VmVjdG9yIGRpZ2VzdFZlY3RvciA9IGhpZFBhcnNlci5nZW5lcmF0ZURpZ2VzdChpbnRlcmVzdGVkVXNhZ2UpOworICAgICAgICBMT0dfViA8PCBkaWdlc3RWZWN0b3I7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgcHJpbnRVc2FnZShjaGFyICphcmd2MCkgeworICAgIExPR19WIDw8ICJVc2FnZTogIiA8PCBhcmd2MCA8PCAiIHRlc3RfbmFtZSIgPDwgTE9HX0VOREw7CisgICAgTE9HX1YgPDwgIiAgdGVzdF9uYW1lIGNhbiBiZSBwYXJzZSwgcGFyc2VfZmlsdGVyLCBkaWdlc3QuIiA8PCBMT0dfRU5ETDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXJnYyAhPSAyKSB7CisgICAgICAgIExPR19FIDw8ICJFcnJvcjogbmVlZCBwYXJhbSIgPDwgTE9HX0VOREw7CisgICAgICAgIHByaW50VXNhZ2UoYXJndlswXSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChzdHJjbXAoYXJndlsxXSwgInBhcnNlIikgPT0gMCkgeworICAgICAgICByZXQgPSBkb1BhcnNlKCkgPyAwIDogMTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAicGFyc2VfZmlsdGVyIikgPT0gMCkgeworICAgICAgICByZXQgPSBkb1BhcnNlQW5kRmlsdGVyKCkgPyAwIDogMTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiZGlnZXN0IikgPT0gMCkgeworICAgICAgICByZXQgPSBkb0RpZ2VzdCgpID8gMCA6IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HX0UgPDwgIkVycm9yOiB1bmtub3duIHRlc3QgbmFtZSIgPDwgTE9HX0VOREw7CisgICAgICAgIHByaW50VXNhZ2UoYXJndlswXSk7CisgICAgICAgIHJldCA9IC1FTk9FTlQ7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy90ZXN0L0hpZFBhcnNlckV4YW1wbGUyLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy90ZXN0L0hpZFBhcnNlckV4YW1wbGUyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTUxZGZmCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvSGlkUGFyc2VyRXhhbXBsZTIuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVGVzdEhpZERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJIaWRMb2cuaCIKKyNpbmNsdWRlICJIaWRQYXJzZXIuaCIKKyNpbmNsdWRlICJTdHJlYW1Jb1V0aWwuaCIKKwordXNpbmcgbmFtZXNwYWNlIEhpZFV0aWw7CisKK3ZvaWQgcHJpbnRSYXdWYWx1ZShjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiAmZGVzY3JpcHRvcikgeworICAgIExPR19EIDw8ICJEZXNjcmlwdG9yIFsiIDw8IGRlc2NyaXB0b3Iuc2l6ZSgpIDw8ICJdOiAiIDw8IHN0ZDo6aGV4OworICAgIGhleGR1bXBUb1N0cmVhbShMT0dfRCwgZGVzY3JpcHRvci5iZWdpbigpLCBkZXNjcmlwdG9yLmVuZCgpKTsKK30KKwordm9pZCBwcmludFRva2VuKGNvbnN0IHN0ZDo6dmVjdG9yPEhpZEl0ZW0+ICZoaWRJdGVtVmVjdG9yKSB7CisgICAgTE9HX1YgPDwgIlRvdGFsICIgPDwgaGlkSXRlbVZlY3Rvci5zaXplKCkgPDwgIiB0b2tlbnMiIDw8IExPR19FTkRMOworICAgIGZvciAoYXV0byAmaSA6IGhpZEl0ZW1WZWN0b3IpIHsKKyAgICAgICAgTE9HX1YgPDwgaSA8PCBMT0dfRU5ETDsKKyAgICB9Cit9CisKK2ludCBtYWluKCkgeworICAgIGNvbnN0IFRlc3RIaWREZXNjcmlwdG9yICp0ID0gZmluZFRlc3REZXNjcmlwdG9yKCJhY2NlbDMiKTsKKyAgICBjb25zdGV4cHIgdW5zaWduZWQgaW50IEFDQ0VMXzNEX1VTQUdFID0gMHgyMDAwNzM7CisKKyAgICBhc3NlcnQodCAhPSBudWxscHRyKTsKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBkZXNjcmlwdG9yKHQtPmRhdGEsIHQtPmRhdGEgKyB0LT5sZW4pOworCisgICAgLy8gcGFyc2UgY2FuIGJlIGRvbmUgaW4gb25lIHN0ZXAgd2l0aCBIaWRQYXJzZXI6OnBhcnNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJlZ2luLCBzaXplX3Qgc2l6ZSk7CisgICAgLy8gaGVyZSBpdCBpcyBkb25lIGluIG11bHRpcGxlIHN0ZXBzIGZvciBpbGx1c3RyYXRpb24gcHVycG9zZQorICAgIEhpZFBhcnNlciBoaWRQYXJzZXI7CisgICAgLy8gcHJpbnQgb3V0IHJhdyB2YWx1ZQorICAgIHByaW50UmF3VmFsdWUoZGVzY3JpcHRvcik7CisKKyAgICAvLyB0b2tlbml6ZSBpdAorICAgIHN0ZDo6dmVjdG9yPEhpZEl0ZW0+IGhpZEl0ZW1WZWN0b3IgPSBIaWRJdGVtOjp0b2tlbml6ZShkZXNjcmlwdG9yKTsKKworICAgIC8vIHByaW50IG91dCB0b2tlbnMKKyAgICBwcmludFRva2VuKGhpZEl0ZW1WZWN0b3IpOworCisgICAgLy8gcGFyc2UgaXQKKyAgICBpZiAoaGlkUGFyc2VyLnBhcnNlKGhpZEl0ZW1WZWN0b3IpKSB7CisgICAgICAgIC8vIG1ha2luZyBhIGRlZXBjb3B5IG9mIHRyZWUgKG5vdCBuZWNlc3NhcnksIGJ1dCBmb3IgaWxsdXN0cmF0aW9uKQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IHRyZWUgPSBoaWRQYXJzZXIuZ2V0VHJlZSgpLT5kZWVwQ29weSgpOworCisgICAgICAgIExPR19WIDw8ICJUcmVlOiAiIDw8IExPR19FTkRMOworICAgICAgICBMT0dfViA8PCAqdHJlZTsKKyAgICAgICAgTE9HX1YgPDwgTE9HX0VOREw7CisKKyAgICAgICAgaGlkUGFyc2VyLmZpbHRlclRyZWUoKTsKKyAgICAgICAgTE9HX1YgPDwgIkZpbHRlcmVkVHJlZTogIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgTE9HX1YgPDwgKihoaWRQYXJzZXIuZ2V0VHJlZSgpKTsKKworICAgICAgICBMT0dfViA8PCAiRGlnZXN0VmVjdG9yOiAiIDw8IExPR19FTkRMOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiBpbnRlcmVzdGVkID0ge0FDQ0VMXzNEX1VTQUdFfTsKKyAgICAgICAgSGlkUGFyc2VyOjpEaWdlc3RWZWN0b3IgZGlnZXN0VmVjdG9yID0gaGlkUGFyc2VyLmdlbmVyYXRlRGlnZXN0KGludGVyZXN0ZWQpOworICAgICAgICBMT0dfViA8PCBkaWdlc3RWZWN0b3I7CisKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dfViA8PCAiUGFyc2luZyBFcnJvciIgPDwgTE9HX0VOREw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy90ZXN0L1Rlc3RIaWREZXNjcmlwdG9yLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy90ZXN0L1Rlc3RIaWREZXNjcmlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzU3ZDRmCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvVGVzdEhpZERlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsMjYwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiVGVzdEhpZERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJUZXN0SGlkU2Vuc29yU3BlYy5oIgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKy8qKgorICogRXhhbXBsZSBISUQgc2Vuc29yIGRlc2NyaXB0b3JzIGluIHRoaXMgZmlsZSBpcyBleHRyYWN0ZWQgZnJvbSBwdWJsaXNoZWQgZG9jdW1lbnQKKyAqICJISUQgU2Vuc29ycyBVc2FnZSIgKGhpZC1zZW5zb3JzLXVzYWdlLmRvY3gpLiBUaGV5IGFyZSBhZGRlZCBmb3IgdGVzdGluZyBvZiBIaWRQYXJzZXIuCisgKgorICogSXQgaXMgc2xpZ2h0bHkgbW9kaWZpZWQgaW4gb3JkZXIgdG8gY29tcGlsZS4KKyAqLworbmFtZXNwYWNlIHsKKy8qKgorICogVHdvIHNlbnNvcnMgY29sbGVjdGlvbiBza2VsZXRvbiBleGFtcGxlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGNvbDFfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0NPTExFQ1RJT04sCisgICAgSElEX0NPTExFQ1RJT04oQXBwbGljYXRpb24pLAorCisgICAgSElEX1JFUE9SVF9JRCgxKSwKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0FDQ0VMRVJPTUVURVJfM0QsCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9GZWF0dXJlIFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMQorCisgICAgLy9JbnB1dCBSZXBvcnQgRGVzY3JpcHRvciBmb3IgU2Vuc29yIFJlcG9ydCBJRCA9IDEKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTiwgLy9mb3IgUmVwb3J0IElEID0gMQorCisgICAgSElEX1JFUE9SVF9JRCgyKSwKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9HWVJPTUVURVJfM0QsCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9GZWF0dXJlIFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMgorCisgICAgLy9JbnB1dCBSZXBvcnQgRGVzY3JpcHRvciBmb3IgU2Vuc29yIFJlcG9ydCBJRCA9IDIKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTiwgLy9mb3IgUmVwb3J0IElEID0gMgorCisgICAgLy9Nb3JlIHNlbnNvcnMgZm9sbG93IHVzaW5nIHRoZSBzYW1lIHBhdHRlcm4KKworICAgIEhJRF9FTkRfQ09MTEVDVElPTiAvL0FwcGxpY2F0aW9uCit9OworCisKKy8qKgorICogQ29tcG9zaXRlIGRldmljZSBkZXNjcmlwdG9yIGV4YW1wbGU6IHR3byBzZW5zb3JzIHdpdGggYSBrZXlib2FyZCBhbmQgYSBtb3VzZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBjb2wyX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgLy9rZXlib2FyZAorICAgIDB4MDVVLCAweDAxVSwgICAgICAgICAvLyBVU0FHRSBQQUdFIChHZW5lcmljIERlc2t0b3ApCisgICAgMHgwOVUsIDB4MDZVLCAgICAgICAgIC8vIFVTQUdFIChLZXlib2FyZCkKKyAgICAweEExVSwgMHgwMVUsICAgICAgICAgLy8gQ09MTEVDVElPTiAoQXBwbGljYXRpb24pCisKKyAgICAweDg1VSwgMHgwM1UsICAgICAgICAgLy8gUkVQT1JUX0lEICgxKQorCisgICAgMHgxNVUsIDB4MDBVLCAgICAgICAgIC8vICAgTE9HSUNBTCBNSU5JTVVNICgwKQorICAgIDB4MjVVLCAweDAxVSwgICAgICAgICAvLyAgIExPR0lDQUwgTUFYSU1VTSAoMSkKKyAgICAweDc1VSwgMHgwMVUsICAgICAgICAgLy8gICBSRVBPUlQgU0laRSAoMSkKKyAgICAweDk1VSwgMHgwOFUsICAgICAgICAgLy8gICBSRVBPUlQgQ09VTlQgKDgpCisgICAgMHgwNVUsIDB4MDdVLCAgICAgICAgIC8vICAgVVNBR0UgUEFHRSAoS2V5Ym9hcmQpCisgICAgMHgxOVUsIDB4RTBVLCAgICAgICAgIC8vICAgVVNBR0UgTUlOSU1VTSAoS2V5Ym9hcmQgTGVmdENvbnRyb2wpCisgICAgMHgyOVUsIDB4RTdVLCAgICAgICAgIC8vICAgVVNBR0UgTUFYSU1VTSAoS2V5Ym9hcmQgUmlnaHQgR1VJKQorICAgIDB4ODFVLCAweDAyVSwgICAgICAgICAvLyAgIElOUFVUIChWYXIpCisKKyAgICAweDc1VSwgMHgwOFUsICAgICAgICAgLy8gICBSRVBPUlQgU0laRSAoOCkKKyAgICAweDk1VSwgMHgwQVUsICAgICAgICAgLy8gICBSRVBPUlQgQ09VTlQgKDEwKQorICAgIDB4MTlVLCAweDAwVSwgICAgICAgICAvLyAgIFVTQUdFIE1JTklNVU0gKE5vIGV2ZW50KQorICAgIDB4MjlVLCAweDkxVSwgICAgICAgICAvLyAgIFVTQUdFIE1BWElNVU0gKEtleWJvYXJkIExBTkcyKQorICAgIDB4MjZVLCAweEZGVSwgMHgwMFUsICAvLyAgIExPR0lDQUwgTUFYSU1VTSAoMHhGRikKKyAgICAweDgxVSwgMHgwMFUsICAgICAgICAgLy8gICBJTlBVVCAoRGF0YSxBcnksQWJzKQorCisgICAgMHhDMFUsICAgICAgICAgICAgICAgIC8vIEVORCBDT0xMRUNUSU9OLCAvL2tleWJvYXJkCisKKyAgICAvLyBUd28gc2Vuc29yIGNvbGxlY3Rpb24gc2tlbGV0b24gZXhhbXBsZToKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0NPTExFQ1RJT04sCisgICAgSElEX0NPTExFQ1RJT04oQXBwbGljYXRpb24pLAorCisgICAgSElEX1JFUE9SVF9JRCgyKSwKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0FDQ0VMRVJPTUVURVJfM0QsCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9GZWF0dXJlIFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMgorCisgICAgLy9JbnB1dCBSZXBvcnQgRGVzY3JpcHRvciBmb3IgU2Vuc29yIFJlcG9ydCBJRCA9IDIKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTiwgLy9mb3IgUmVwb3J0IElEID0gMgorCisgICAgSElEX1JFUE9SVF9JRCgzKSwKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9HWVJPTUVURVJfM0QsCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9GZWF0dXJlIFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMworCisgICAgLy9JbnB1dCBSZXBvcnQgRGVzY3JpcHRvciBmb3IgU2Vuc29yIFJlcG9ydCBJRCA9IDMKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTiwgLy9mb3IgUmVwb3J0IElEID0gMworCisgICAgLy9Nb3JlIHNlbnNvcnMgZm9sbG93IHVzaW5nIHRoZSBzYW1lIHBhdHRlcm4KKworICAgIEhJRF9FTkRfQ09MTEVDVElPTiwgLy9TZW5zb3IgY29sbGVjdGlvbgorCisgICAgLy9tb3VzZQorICAgIDB4MDVVLCAweDAxVSwgICAgICAgICAvLyBVU0FHRSBQQUdFIChHZW5lcmljIERlc2t0b3ApCisgICAgMHgwOVUsIDB4MDJVLCAgICAgICAgIC8vIFVTQUdFIChNb3VzZSkKKyAgICAweEExVSwgMHgwMVUsICAgICAgICAgLy8gQ09MTEVDVElPTiAoQXBwbGljYXRpb24pCisgICAgMHg4NVUsIDB4MDRVLCAgICAgICAgIC8vIFJFUE9SVF9JRCAoNCkKKworICAgIC8vIDUgbW91c2UgYnV0dG9ucworICAgIDB4MDVVLCAweDA5VSwgICAgICAgICAvLyAgIFVTQUdFIFBBR0UgKEJ1dHRvbikKKyAgICAweDE5VSwgMHgwMVUsICAgICAgICAgLy8gICBVU0FHRSBNSU5JTVVNIChCdXR0b24gMSkKKyAgICAweDI5VSwgMHgwNVUsICAgICAgICAgLy8gICBVU0FHRSBNQVhJTVVNIChCdXR0b24gNSkKKyAgICAweDE1VSwgMHgwMFUsICAgICAgICAgLy8gICBMT0dJQ0FMIE1JTklNVU0gKDApCisgICAgMHgyNVUsIDB4MDFVLCAgICAgICAgIC8vICAgTE9HSUNBTCBNQVhJTVVNICgxKQorICAgIDB4OTVVLCAweDA1VSwgICAgICAgICAvLyAgIFJFUE9SVCBDT1VOVCAoNSkKKyAgICAweDc1VSwgMHgwMVUsICAgICAgICAgLy8gICBSRVBPUlQgU0laRSAoMSkKKyAgICAweDgxVSwgMHgwMlUsICAgICAgICAgLy8gICBJTlBVVCAoRGF0YSxWYXIsQWJzKQorCisgICAgLy8gIDMgdW51c2VkIGJ1dHRvbnM6CisgICAgMHg5NVUsIDB4MDFVLCAgICAgICAgIC8vICAgUkVQT1JUIENPVU5UICgxKQorICAgIDB4NzVVLCAweDAzVSwgICAgICAgICAvLyAgIFJFUE9SVCBTSVpFICgzKQorICAgIDB4ODFVLCAweDAzVSwgICAgICAgICAvLyAgIElOUFVUIChDbnN0LFZhcixBYnMpCisKKyAgICAvLyBtb3VzZSAoZGVsdGEgeCwgZGVsdGEgeSkgcG9zaXRpb24KKyAgICAweDE1VSwgMHg4MVUsICAgICAgICAgLy8gICBMT0dJQ0FMIE1JTklNVU0gKC0xMjcpCisgICAgMHgyNVUsIDB4N2ZVLCAgICAgICAgIC8vICAgTE9HSUNBTCBNQVhJTVVNICgrMTI3KQorICAgIDB4NzVVLCAweDA4VSwgICAgICAgICAvLyAgIFJFUE9SVCBTSVpFICg4KQorICAgIDB4OTVVLCAweDAyVSwgICAgICAgICAvLyAgIFJFUE9SVCBDT1VOVCAoMikKKyAgICAweDA1VSwgMHgwMVUsICAgICAgICAgLy8gICBVU0FHRSBQQUdFIChHZW5lcmljIERlc2t0b3ApCisgICAgMHgwOVUsIDB4MzBVLCAgICAgICAgIC8vICAgVVNBR0UoWCkKKyAgICAweDA5VSwgMHgzMVUsICAgICAgICAgLy8gICBVU0FHRSAoWSkKKyAgICAweDgxVSwgMHgwNlUsICAgICAgICAgLy8gICBJTlBVVCAoRGF0YSxWYXIsUmVsKQorCisgICAgMHhDMFUsICAgICAgICAgICAgICAgIC8vIEVORCBDT0xMRUNUSU9OIC8vbW91c2UKK307CisKKworLyoqCisgKiBDb21wb3NpdGUgZGV2aWNlIGRlc2NyaXB0b3IgZXhhbXBsZTogb25lIHNlbnNvciB3aXRoIGEga2V5Ym9hcmQgYW5kIGEgbW91c2UuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgY29sM19yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIC8va2V5Ym9hcmQKKyAgICAweDA1VSwgMHgwMVUsICAgICAgICAgLy8gVVNBR0UgUEFHRSAoR2VuZXJpYyBEZXNrdG9wKQorICAgIDB4MDlVLCAweDA2VSwgICAgICAgICAvLyBVU0FHRSAoS2V5Ym9hcmQpCisgICAgMHhBMVUsIDB4MDFVLCAgICAgICAgIC8vIENPTExFQ1RJT04gKEFwcGxpY2F0aW9uKQorCisgICAgMHg4NVUsIDB4MDNVLCAgICAgICAgIC8vIFJFUE9SVF9JRCAoMSkKKworICAgIDB4MTVVLCAweDAwVSwgICAgICAgICAvLyAgIExPR0lDQUwgTUlOSU1VTSAoMCkKKyAgICAweDI1VSwgMHgwMVUsICAgICAgICAgLy8gICBMT0dJQ0FMIE1BWElNVU0gKDEpCisgICAgMHg3NVUsIDB4MDFVLCAgICAgICAgIC8vICAgUkVQT1JUIFNJWkUgKDEpCisgICAgMHg5NVUsIDB4MDhVLCAgICAgICAgIC8vICAgUkVQT1JUIENPVU5UICg4KQorICAgIDB4MDVVLCAweDA3VSwgICAgICAgICAvLyAgIFVTQUdFIFBBR0UgKEtleWJvYXJkKQorICAgIDB4MTlVLCAweEUwVSwgICAgICAgICAvLyAgIFVTQUdFIE1JTklNVU0gKEtleWJvYXJkIExlZnRDb250cm9sKQorICAgIDB4MjlVLCAweEU3VSwgICAgICAgICAvLyAgIFVTQUdFIE1BWElNVU0gKEtleWJvYXJkIFJpZ2h0IEdVSSkKKyAgICAweDgxVSwgMHgwMlUsICAgICAgICAgLy8gICBJTlBVVCAoVmFyKQorCisgICAgMHg3NVUsIDB4MDhVLCAgICAgICAgIC8vICAgUkVQT1JUIFNJWkUgKDgpCisgICAgMHg5NVUsIDB4MEFVLCAgICAgICAgIC8vICAgUkVQT1JUIENPVU5UICgxMCkKKyAgICAweDE5VSwgMHgwMFUsICAgICAgICAgLy8gICBVU0FHRSBNSU5JTVVNIChObyBldmVudCkKKyAgICAweDI5VSwgMHg5MVUsICAgICAgICAgLy8gICBVU0FHRSBNQVhJTVVNIChLZXlib2FyZCBMQU5HMikKKyAgICAweDI2VSwgMHhGRlUsIDB4MDBVLCAgLy8gICBMT0dJQ0FMIE1BWElNVU0gKDB4RkYpCisgICAgMHg4MVUsIDB4MDBVLCAgICAgICAgIC8vICAgSU5QVVQgKERhdGEsQXJ5LEFicykKKworICAgIDB4QzBVLCAgICAgICAgICAgICAgICAvLyBFTkQgQ09MTEVDVElPTiwgLy9rZXlib2FyZAorCisgICAgLy8gT25lIHNlbnNvciBjb2xsZWN0aW9uIHNrZWxldG9uIGV4YW1wbGU6CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9DT0xMRUNUSU9OLAorICAgIEhJRF9DT0xMRUNUSU9OKEFwcGxpY2F0aW9uKSwKKworICAgIEhJRF9SRVBPUlRfSUQoMiksCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9HWVJPTUVURVJfM0QsCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9GZWF0dXJlIFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMgorCisgICAgLy9JbnB1dCBSZXBvcnQgRGVzY3JpcHRvciBmb3IgU2Vuc29yIFJlcG9ydCBJRCA9IDIKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTiwgLy9mb3IgUmVwb3J0IElEID0gMgorCisgICAgSElEX0VORF9DT0xMRUNUSU9OLCAvL1NlbnNvciBjb2xsZWN0aW9uCisKKyAgICAvL21vdXNlCisgICAgMHgwNVUsIDB4MDFVLCAgICAgICAgIC8vIFVTQUdFIFBBR0UgKEdlbmVyaWMgRGVza3RvcCkKKyAgICAweDA5VSwgMHgwMlUsICAgICAgICAgLy8gVVNBR0UgKE1vdXNlKQorICAgIDB4QTFVLCAweDAxVSwgICAgICAgICAvLyBDT0xMRUNUSU9OIChBcHBsaWNhdGlvbikKKyAgICAweDg1VSwgMHgwNFUsICAgICAgICAgLy8gUkVQT1JUX0lEICgzKQorCisgICAgLy8gNSBtb3VzZSBidXR0b25zCisgICAgMHgwNVUsIDB4MDlVLCAgICAgICAgIC8vICAgVVNBR0UgUEFHRSAoQnV0dG9uKQorICAgIDB4MTlVLCAweDAxVSwgICAgICAgICAvLyAgIFVTQUdFIE1JTklNVU0gKEJ1dHRvbiAxKQorICAgIDB4MjlVLCAweDA1VSwgICAgICAgICAvLyAgIFVTQUdFIE1BWElNVU0gKEJ1dHRvbiA1KQorICAgIDB4MTVVLCAweDAwVSwgICAgICAgICAvLyAgIExPR0lDQUwgTUlOSU1VTSAoMCkKKyAgICAweDI1VSwgMHgwMVUsICAgICAgICAgLy8gICBMT0dJQ0FMIE1BWElNVU0gKDEpCisgICAgMHg5NVUsIDB4MDVVLCAgICAgICAgIC8vICAgUkVQT1JUIENPVU5UICg1KQorICAgIDB4NzVVLCAweDAxVSwgICAgICAgICAvLyAgIFJFUE9SVCBTSVpFICgxKQorICAgIDB4ODFVLCAweDAyVSwgICAgICAgICAvLyAgIElOUFVUIChEYXRhLFZhcixBYnMpCisKKyAgICAvLyAgMyB1bnVzZWQgYnV0dG9uczoKKyAgICAweDk1VSwgMHgwMVUsICAgICAgICAgLy8gICBSRVBPUlQgQ09VTlQgKDEpCisgICAgMHg3NVUsIDB4MDNVLCAgICAgICAgIC8vICAgUkVQT1JUIFNJWkUgKDMpCisgICAgMHg4MVUsIDB4MDNVLCAgICAgICAgIC8vICAgSU5QVVQgKENuc3QsVmFyLEFicykKKworICAgIC8vIG1vdXNlIChkZWx0YSB4LCBkZWx0YSB5KSBwb3NpdGlvbgorICAgIDB4MTVVLCAweDgxVSwgICAgICAgICAvLyAgIExPR0lDQUwgTUlOSU1VTSAoLTEyNykKKyAgICAweDI1VSwgMHg3ZlUsICAgICAgICAgLy8gICBMT0dJQ0FMIE1BWElNVU0gKCsxMjcpCisgICAgMHg3NVUsIDB4MDhVLCAgICAgICAgIC8vICAgUkVQT1JUIFNJWkUgKDgpCisgICAgMHg5NVUsIDB4MDJVLCAgICAgICAgIC8vICAgUkVQT1JUIENPVU5UICgyKQorICAgIDB4MDVVLCAweDAxVSwgICAgICAgICAvLyAgIFVTQUdFIFBBR0UgKEdlbmVyaWMgRGVza3RvcCkKKyAgICAweDA5VSwgMHgzMFUsICAgICAgICAgLy8gICBVU0FHRShYKQorICAgIDB4MDlVLCAweDMxVSwgICAgICAgICAvLyAgIFVTQUdFIChZKQorICAgIDB4ODFVLCAweDA2VSwgICAgICAgICAvLyAgIElOUFVUIChEYXRhLFZhcixSZWwpCisKKyAgICAweEMwVSwgICAgICAgICAgICAgICAgIC8vICAgRU5EIENPTExFQ1RJT04gLy9tb3VzZQorfTsKKworCisvKioKKyAqIFNpbXBsZSBjdXN0b20gc2Vuc29yIGV4YW1wbGUuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgY3VzMV9yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwgICAgICAgICAvLyBVU0FHRV9QQUdFIChTZW5zb3IpCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09USEVSX0NVU1RPTSwgLy8gVVNBR0UgKFNpbXBsZSBDdXN0b20pCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksIC8vID0gSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9TUEVFRCB2YWx1ZQorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogTW9yZSBjb21wbGV4IGN1c3RvbSBzZW5zb3IgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBjdXMyX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLCAgICAgICAgIC8vIFVTQUdFX1BBR0UgKFNlbnNvcikKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfT1RIRVJfQ1VTVE9NLCAvLyBVU0FHRSAoU2ltcGxlIEN1c3RvbSkKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2lucHV0IHJlcG9ydHMgKHRyYW5zbWl0KQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1VTQUdFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwgLy8gPSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX1NQRUVET01FVEVSCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9CT09MRUFOX0FSUkFZLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwgLy8gPSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX1NQRUVET01FVEVSCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksIC8vID0gSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9TUEVFRCB2YWx1ZQorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMiwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLCAvLyA9IEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fU1BFRUQgdmFsdWUKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzMsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwgLy8gPSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX1NQRUVEIHZhbHVlCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV80LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksIC8vID0gSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9TUEVFRCB2YWx1ZQorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfNSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLCAvLyA9IEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fU1BFRUQgdmFsdWUKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzYsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwgLy8gPSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX1NQRUVEIHZhbHVlCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiBDdXN0b20gc2Vuc29yIGV4YW1wbGUgd2l0aCBmZWF0dXJlcworICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGN1czNfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsICAgICAgICAgLy8gVVNBR0VfUEFHRSAoU2Vuc29yKQorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PVEhFUl9DVVNUT00sIC8vIFVTQUdFIChTaW1wbGUgQ3VzdG9tKQorICAgIEhJRF9DT0xMRUNUSU9OKFBoeXNpY2FsKSwKKworICAgIC8vZmVhdHVyZSByZXBvcnRzICh4bWl0L3JlY2VpdmUpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSwgIC8vIE5BcnkKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzMyKDB4RkYsMHhGRiwweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgzMiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgwKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMpLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NLEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT00sSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5wdXQgcmVwb3J0cyAodHJhbnNtaXQpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlQsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1NUQVRFX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9EQVRBX1VQREFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DSEFOR0VfU0VOU0lUSVZJVFlfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1VTQUdFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwgLy8gPSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX1NQRUVET01FVEVSCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksIC8vID0gSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9TUEVFRCB2YWx1ZQorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogRnVsbCBjdXN0b20gc2Vuc29yIGV4YW1wbGUgd2l0aCBmZWF0dXJlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGN1czRfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsICAgICAgICAgLy8gVVNBR0VfUEFHRSAoU2Vuc29yKQorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PVEhFUl9DVVNUT00sIC8vIFVTQUdFIChTaW1wbGUgQ3VzdG9tKQorICAgIEhJRF9DT0xMRUNUSU9OKEFwcGxpY2F0aW9uKSwKKworICAgIC8vZmVhdHVyZSByZXBvcnRzICh4bWl0L3JlY2VpdmUpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSwgIC8vIE5BcnkKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzMyKDB4RkYsMHhGRiwweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgzMiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgwKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMpLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NLEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT00sSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5wdXQgcmVwb3J0cyAodHJhbnNtaXQpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlQsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1NUQVRFX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9EQVRBX1VQREFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DSEFOR0VfU0VOU0lUSVZJVFlfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1VTQUdFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX0JPT0xFQU5fQVJSQVksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMiwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfNCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfNSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfNiwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorCisjaWYgMSAvL2RlZmluZSB2ZW5kb3Itc3BlY2lmaWMgKG5vbi1zcGVjKSBjdXN0b20gZGF0YWZpZWxkcworICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfNywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfOCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfOSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTAsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzExLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xMiwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTMsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzE0LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xNSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTYsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzE3LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xOCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzIwLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yMSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjIsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzIzLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yNCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjUsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzI2LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yNywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjgsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyNlbmRpZgorICAgIEhJRF9FTkRfQ09MTEVDVElPTgorfTsKKworCisvKioKKyAqIEh1bWFuIHByZXNlbmNlIHNlbnNvciBleGFtcGxlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIHByZXNfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0JJT01FVFJJQ19QUkVTRU5DRSwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5wdXQgcmVwb3J0cyAodHJhbnNtaXQpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlQsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1NUQVRFX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9EQVRBX1VQREFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DSEFOR0VfU0VOU0lUSVZJVFlfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQklPTUVUUklDX0hVTUFOX1BSRVNFTkNFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLCAvLyBGYWxzZQorICAgIEhJRF9MT0dJQ0FMX01BWF84KDEpLCAvLyBUcnVlCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiBQcm94aW1pdHkgc2Vuc29yIGV4YW1wbGUuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgcHJveF9yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfQklPTUVUUklDX1BST1hJTUlUWSwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0JJT01FVFJJQ19IVU1BTl9QUk9YSU1JVFlfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEQpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIm1ldGVyIiB0byAiY2VudGltZXRlciIKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9CSU9NRVRSSUNfSFVNQU5fUFJPWElNSVRZX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBEKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0ICJtZXRlciIgdG8gImNlbnRpbWV0ZXIiCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfQklPTUVUUklDX0hVTUFOX1BST1hJTUlUWV9SQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRCksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCAibWV0ZXIiIHRvICJjZW50aW1ldGVyIgorICAgIC8vIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5wdXQgcmVwb3J0cyAodHJhbnNtaXQpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlQsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1NUQVRFX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9EQVRBX1VQREFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DSEFOR0VfU0VOU0lUSVZJVFlfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQklPTUVUUklDX0hVTUFOX1BST1hJTUlUWV9PVVRfT0ZfUkFOR0UsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksIC8vIEZhbHNlCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMSksIC8vIFRydWUKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQklPTUVUUklDX0hVTUFOX1BST1hJTUlUWV9SQU5HRSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEQpLCAgLy8gc2NhbGUgZGVmYXVsdCB1bml0ICJtZXRlciIgdG8gImNlbnRpbWV0ZXIiCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTgorfTsKKworCisvKioKKyAqIEJhcm9tZXRlciBzZW5zb3IgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBiYXJfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0VOVklST05NRU5UQUxfQVRNT1NQSEVSSUNfUFJFU1NVUkUsCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9mZWF0dXJlIHJlcG9ydHMgKHhtaXQvcmVjZWl2ZSkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfQ09OTkVDVElPTl9UWVBFLCAgLy8gTkFyeQorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDIpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0lOVEVHUkFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0FUVEFDSEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19FWFRFUk5BTF9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9VTkRFRklORURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDBfRlVMTF9QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMV9MT1dfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDJfU1RBTkRCWV9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDNfU0xFRVBfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0Q0X1BPV0VSX09GRl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVF9JTlRFUlZBTCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMzIoMHhGRiwweEZGLDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDMyKSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDApLAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMX0FUTU9TUEhFUklDX1BSRVNTVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMpLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0ICJCYXIiIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMX0FUTU9TUEhFUklDX1BSRVNTVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIkJhciIgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfQVRNT1NQSEVSSUNfUFJFU1NVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUlOKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCAiQmFyIiB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMX0FUTU9TUEhFUklDX1BSRVNTVVJFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0ICJCYXIiIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogSHVtaWRpdHkgc2Vuc29yIGV4YW1wbGUuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgaHVtaV9yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfRU5WSVJPTk1FTlRBTF9IVU1JRElUWSwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfUkVMQVRJVkVfSFVNSURJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4MTAsMHgyNyksIC8vIDEwMDAwID0gMC4wMCB0byAxMDAuMDAgcGVyY2VudCB3aXRoIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMX1JFTEFUSVZFX0hVTUlESVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4MTAsMHgyNyksIC8vIDEwMDAwID0gMC4wMCB0byAxMDAuMDAgcGVyY2VudCB3aXRoIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMX1JFTEFUSVZFX0hVTUlESVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01JTiksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4MTAsMHgyNyksIC8vIDEwMDAwID0gMC4wMCB0byAxMDAuMDAgcGVyY2VudCB3aXRoIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICAvL2lucHV0IHJlcG9ydHMgKHRyYW5zbWl0KQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5ULAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9TVEFURV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BST1BFUlRZX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BPTExfUkVTUE9OU0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfUkVMQVRJVkVfSFVNSURJVFksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4MTAsMHgyNyksIC8vIDEwMDAwID0gMC4wMCB0byAxMDAuMDAgcGVyY2VudCB3aXRoIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0ICJwZXJjZW50IgorICAgIC8vIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogVGVtcGVyYXR1cmUgc2Vuc29yIGV4YW1wbGUuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgdGVtcF9yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfRU5WSVJPTk1FTlRBTF9URU1QRVJBVFVSRSwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfVEVNUEVSQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIkNlbHNpdXMiCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfVEVNUEVSQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIkNlbHNpdXMiCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfVEVNUEVSQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUlOKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIkNlbHNpdXMiCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5wdXQgcmVwb3J0cyAodHJhbnNtaXQpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlQsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMTYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9TVEFURV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BST1BFUlRZX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BPTExfUkVTUE9OU0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfVEVNUEVSQVRVUkUsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0ICJDZWxzaXVzIgorICAgIC8vIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogQW1iaWVudCBsaWdodCBzZW5zb3IgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBhbHNfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsICAgICAgICAgLy8gVVNBR0VfUEFHRSAoU2Vuc29yKQorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9MSUdIVF9BTUJJRU5UTElHSFQsIC8vIFVTQUdFIChBbWJpZW50TGlnaHQpCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9mZWF0dXJlIHJlcG9ydHMgKHhtaXQvcmVjZWl2ZSkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfQ09OTkVDVElPTl9UWVBFLCAgLy8gTkFyeQorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDIpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0lOVEVHUkFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0FUVEFDSEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19FWFRFUk5BTF9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9VTkRFRklORURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDBfRlVMTF9QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMV9MT1dfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDJfU1RBTkRCWV9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDNfU0xFRVBfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0Q0X1BPV0VSX09GRl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVF9JTlRFUlZBTCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMzIoMHhGRiwweEZGLDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDMyKSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDApLAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9JTExVTUlOQU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfUkVMX1BDVCksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4MTAsMHgyNyksIC8vIDEwMDAwID0gMC4wMCB0byAxMDAuMDAgcGVyY2VudCB3aXRoIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9JTExVTUlOQU5DRSxISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEYpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAxIGRpZ2l0IHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9JTExVTUlOQU5DRSxISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01JTiksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEYpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAxIGRpZ2l0IHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICAvL2FkZCB0aGlzIGRlZmluaXRpb24gaWYgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmljIGFwcGxpY2F0aW9uCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVNQT05TRV9DVVJWRSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEwKSwgLy9hcyByZXF1aXJlZCBmb3IgbiBwYWlyIG9mIHZhbHVlcworICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MCksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDAgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9JTExVTUlOQU5DRSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBGKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMSBkaWdpdCBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUX0NPTE9SX1RFTVBFUkFUVVJFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDApLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTElHSFRfQ0hST01BVElDSVRZX1gsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwQyksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDQgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTElHSFRfQ0hST01BVElDSVRZX1ksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwQyksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDQgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTgorfTsKKworCisvKioKKyAqIDNEIGFjY2VsZXJvbWV0ZXIgc2Vuc29yIGV4YW1wbGUuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWNjZWwzX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NT1RJT05fQUNDRUxFUk9NRVRFUl8zRCwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FDQ0VMRVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksICAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgR3MgdG8gY2VudGktR3MKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgR3MgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BQ0NFTEVSQVRJT04sSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksICAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgR3MgdG8gY2VudGktR3MKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgR3MgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BQ0NFTEVSQVRJT04sSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksICAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgR3MgdG8gY2VudGktR3MKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgR3MgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICAvL2lucHV0IHJlcG9ydHMgKHRyYW5zbWl0KQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5ULAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9TVEFURV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BST1BFUlRZX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BPTExfUkVTUE9OU0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BQ0NFTEVSQVRJT05fWF9BWElTLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksICAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgR3MgdG8gY2VudGktR3MKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgR3MgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQUNDRUxFUkFUSU9OX1lfQVhJUywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAgLy8gc2NhbGUgZGVmYXVsdCB1bml0IEdzIHRvIGNlbnRpLUdzCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IEdzIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FDQ0VMRVJBVElPTl9aX0FYSVMsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCBHcyB0byBjZW50aS1HcworICAgIC8vIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBHcyBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisKKyAgICAvL2luY2x1ZGUgdGhlIGZvbGxvd2luZyBkYXRhZmllbGQgaWYgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGUgk3NoYWtllCBldmVudAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksIC8vIEZhbHNlID0gU3RpbGwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgxKSwgLy8gVHJ1ZSA9IEluIE1vdGlvbgorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogM0QgZ3lyb3Njb3BlIHNlbnNvciBleGFtcGxlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGd5cm8zX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NT1RJT05fR1lST01FVEVSXzNELAorICAgIEhJRF9DT0xMRUNUSU9OKFBoeXNpY2FsKSwKKworICAgIC8vZmVhdHVyZSByZXBvcnRzICh4bWl0L3JlY2VpdmUpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSwgIC8vIE5BcnkKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzMyKDB4RkYsMHhGRiwweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgzMiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgwKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfVkVMT0NJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfVkVMT0NJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfVkVMT0NJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUlOKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9WRUxPQ0lUWV9YX0FYSVMsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BTkdVTEFSX1ZFTE9DSVRZX1lfQVhJUywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfVkVMT0NJVFlfWl9BWElTLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogM0QgY29tcGFzcyBzZW5zb3IgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBjb21wM19yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfT1JJRU5UQVRJT05fQ09NUEFTU18zRCwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0hFQURJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfSEVBRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRiksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDEgZGlnaXQgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0hFQURJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUlOKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEYpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAxIGRpZ2l0IHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19GTFVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMpLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0ZMVVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEYpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAxIGRpZ2l0IHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19GTFVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01JTiksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBGKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMSBkaWdpdCBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9DT01QRU5TQVRFRF9NQUdORVRJQ19OT1JUSCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEYpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAxIGRpZ2l0IHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9DT01QRU5TQVRFRF9UUlVFX05PUlRILAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRiksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDEgZGlnaXQgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX05PUlRILAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRiksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDEgZGlnaXQgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RSVUVfTk9SVEgsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBGKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMSBkaWdpdCBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfRkxVWF9YX0FYSVMsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBEKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvICJtaWxsaUdhdXNzIgorICAgIC8vIHRvIHByb3ZpZGUgMyBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0ZMVVhfWV9BWElTLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRCksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byAibWlsbGlHYXVzcyIKKyAgICAvLyB0byBwcm92aWRlIDMgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19GTFVYX1pfQVhJUywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEQpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gIm1pbGxpR2F1c3MiCisgICAgLy8gdG8gcHJvdmlkZSAzIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDIpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRPTUVURVJfQUNDVVJBQ1lfTE9XLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRPTUVURVJfQUNDVVJBQ1lfTUVESVVNLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRPTUVURVJfQUNDVVJBQ1lfSElHSCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiAzRCBpbmNsaW5vbWF0ZXIgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBpbmMzX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9JTkNMSU5PTUVURVJfM0QsCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9mZWF0dXJlIHJlcG9ydHMgKHhtaXQvcmVjZWl2ZSkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfQ09OTkVDVElPTl9UWVBFLCAgLy8gTkFyeQorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDIpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0lOVEVHUkFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0FUVEFDSEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19FWFRFUk5BTF9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9VTkRFRklORURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDBfRlVMTF9QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMV9MT1dfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDJfU1RBTkRCWV9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDNfU0xFRVBfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0Q0X1BPV0VSX09GRl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVF9JTlRFUlZBTCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMzIoMHhGRiwweEZGLDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDMyKSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDApLAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9USUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMpLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RJTFQsSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9USUxULEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUlOKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9USUxUX1gsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RJTFRfWSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fVElMVF9aLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRPTUVURVJfQUNDVVJBQ1ksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWV9MT1csCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWV9NRURJVU0sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWV9ISUdILAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTgorfTsKKworCisvKioKKyAqIERldmljZSBvcmllbnRhdGlvbiBzZW5zb3IgZXhhbXBsZS4gTm90ZSB0aGlzIG1hcHMgdG8gcm90YXRpb24gdmVjdG9yIHNlbnNvciBpbiBhbmRyb2lkLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGRldm9yX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9ERVZJQ0VfT1JJRU5UQVRJT04sCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9mZWF0dXJlIHJlcG9ydHMgKHhtaXQvcmVjZWl2ZSkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfQ09OTkVDVElPTl9UWVBFLCAgLy8gTkFyeQorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDIpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0lOVEVHUkFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0FUVEFDSEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19FWFRFUk5BTF9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9VTkRFRklORURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDBfRlVMTF9QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMV9MT1dfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDJfU1RBTkRCWV9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDNfU0xFRVBfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0Q0X1BPV0VSX09GRl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVF9JTlRFUlZBTCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMzIoMHhGRiwweEZGLDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDMyKSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDApLAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0ICJtZXRlciIgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1FVQVRFUk5JT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUVVBVEVSTklPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwMSksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1FVQVRFUk5JT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUlOKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MDEpLAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICAvL2luY2x1ZGUgdGhpcyBpZiB0aGUgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGluIGZpcm13YXJlCisgICAgLy9vdGhlcndpc2UsIHRoZSBkcml2ZXIgd2lsbCBjYWxjdWxhdGUgdGhlc2UgdmFsdWVzIGZyb20gdGhlIFF1YXRlcm5pb24KKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1JPVEFUSU9OX01BVFJJWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1JPVEFUSU9OX01BVFJJWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1JPVEFUSU9OX01BVFJJWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5wdXQgcmVwb3J0cyAodHJhbnNtaXQpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlQsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1NUQVRFX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9EQVRBX1VQREFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DSEFOR0VfU0VOU0lUSVZJVFlfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUVVBVEVSTklPTiwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDQpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorCisgICAgLy9pbmNsdWRlIHRoaXMgaWYgdGhlIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBpbiBmaXJtd2FyZQorICAgIC8vb3RoZXJ3aXNlLCB0aGUgZHJpdmVyIHdpbGwgY2FsY3VsYXRlIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBRdWF0ZXJuaW9uCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1JPVEFUSU9OX01BVFJJWCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDkpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEYpLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZX0xPVywKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZX01FRElVTSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZX0hJR0gsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworfSAvLyBhbm5veW1vdXMgbmFtZXNwYWNlCisKKy8qKgorICogR2xvYmFsIHRlc3QgdmVjdG9yIGVudHJ5LgorICovCisjZGVmaW5lIFRFU1RfREVTQ1JJUFRPUihuYW1lKSBcCisgICAgeyBuYW1lICMjIF9yZXBvcnRfZGVzY3JpcHRvciwgc2l6ZW9mKG5hbWUgIyMgX3JlcG9ydF9kZXNjcmlwdG9yKSwgI25hbWUgfQorCitjb25zdCBUZXN0SGlkRGVzY3JpcHRvciBnRGVzY3JpcHRvckFycmF5W10gPSB7CisgICAgVEVTVF9ERVNDUklQVE9SKGFjY2VsMyksCisgICAgVEVTVF9ERVNDUklQVE9SKGNvbDEpLAorICAgIFRFU1RfREVTQ1JJUFRPUihjb2wyKSwKKyAgICBURVNUX0RFU0NSSVBUT1IoY29sMyksCisgICAgVEVTVF9ERVNDUklQVE9SKGN1czEpLAorICAgIFRFU1RfREVTQ1JJUFRPUihjdXMyKSwKKyAgICBURVNUX0RFU0NSSVBUT1IoY3VzMyksCisgICAgVEVTVF9ERVNDUklQVE9SKGN1czQpLAorICAgIFRFU1RfREVTQ1JJUFRPUihwcmVzKSwKKyAgICBURVNUX0RFU0NSSVBUT1IocHJveCksCisgICAgVEVTVF9ERVNDUklQVE9SKGJhciksCisgICAgVEVTVF9ERVNDUklQVE9SKGh1bWkpLAorICAgIFRFU1RfREVTQ1JJUFRPUih0ZW1wKSwKKyAgICBURVNUX0RFU0NSSVBUT1IoYWxzKSwKKyAgICBURVNUX0RFU0NSSVBUT1IoZ3lybzMpLAorICAgIFRFU1RfREVTQ1JJUFRPUihjb21wMyksCisgICAgVEVTVF9ERVNDUklQVE9SKGluYzMpLAorICAgIFRFU1RfREVTQ1JJUFRPUihkZXZvciksCisgICAge251bGxwdHIsIDAsIG51bGxwdHJ9IC8vc2VudGluZWwKK307CisjdW5kZWYgVEVTVF9ERVNDUklQVE9SCisKK2NvbnN0IFRlc3RIaWREZXNjcmlwdG9yICpmaW5kVGVzdERlc2NyaXB0b3IoY29uc3QgY2hhciAqbmFtZSkgeworICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgZm9yIChjb25zdCBUZXN0SGlkRGVzY3JpcHRvciAqcCA9IGdEZXNjcmlwdG9yQXJyYXk7IDsgKytwKSB7CisgICAgICAgIGlmIChwLT5kYXRhID09IG51bGxwdHIgfHwgcC0+bGVuID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAocC0+bmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UZXN0SGlkRGVzY3JpcHRvci5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvVGVzdEhpZERlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdjYjcyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvVGVzdEhpZERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSElEVVRJTF9URVNUX0hJRERFU0NSSVBUT1JfSF8KKyNkZWZpbmUgSElEVVRJTF9URVNUX0hJRERFU0NSSVBUT1JfSF8KKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK3N0cnVjdCBUZXN0SGlkRGVzY3JpcHRvciB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBzaXplX3QgbGVuOworICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitleHRlcm4gY29uc3QgVGVzdEhpZERlc2NyaXB0b3IgZ0Rlc2NyaXB0b3JBcnJheVtdOworY29uc3QgVGVzdEhpZERlc2NyaXB0b3IgKmZpbmRUZXN0RGVzY3JpcHRvcihjb25zdCBjaGFyICpuYW1lKTsKKworI2VuZGlmIC8vIEhJRFVUSUxfVEVTVF9ISURERVNDUklQVE9SX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UZXN0SGlkU2Vuc29yU3BlYy5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvVGVzdEhpZFNlbnNvclNwZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJjYjZjCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvVGVzdEhpZFNlbnNvclNwZWMuaApAQCAtMCwwICsxLDg1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEhJRFVUSUxfVEVTVF9ISURTRU5TT1JTUEVDX0gKKyNkZWZpbmUgSElEVVRJTF9URVNUX0hJRFNFTlNPUlNQRUNfSAorLyoqCisgKiBFeGFtcGxlIEhJRCBzZW5zb3IgZGVmaW5pdGlvbiBpbiBmcm9tIHB1Ymxpc2hlZCBkb2N1bWVudCAiSElEIFNlbnNvcnMgVXNhZ2UiCisgKiAoaGlkLXNlbnNvcnMtdXNhZ2UuZG9jeCkuIFRoaXMgZmlsZSBpcyBhZGRlZCBhcyBwYXJ0IG9mIHRoZSB0ZXN0IGNhc2UuCisgKgorICogSXQgaXMgc2xpZ2h0bHkgbW9kaWZpZWQgaW4gb3JkZXIgdG8gY29tcGlsZS4KKyAqLworI2RlZmluZSBISURfVVNBR0VfUEFHRV9TRU5TT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUsMHgyMAorCisvL3NlbnNvciBjYXRlZ29yeSB1c2FnZXMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0NPTExFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4MDEKKy8vc2Vuc29yIGNhdGVnb3J5IGJpb21ldHJpYworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0NBVEVHT1JZX0JJT01FVFJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgxMAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfQklPTUVUUklDX1BSRVNFTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgxMQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfQklPTUVUUklDX1BST1hJTUlUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgxMgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfQklPTUVUUklDX1RPVUNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgxMworLy9zZW5zb3IgY2F0ZWdvcnkgZWxlY3RyaWNhbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0NBVEVHT1JZX0VMRUNUUklDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyMAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRUxFQ1RSSUNBTF9DQVBBQ0lUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyMQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRUxFQ1RSSUNBTF9DVVJSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyMgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRUxFQ1RSSUNBTF9QT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRUxFQ1RSSUNBTF9JTkRVQ1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRUxFQ1RSSUNBTF9SRVNJU1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRUxFQ1RSSUNBTF9WT0xUQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyNgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRUxFQ1RSSUNBTF9QT1RFTlRJT01FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyNworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRUxFQ1RSSUNBTF9GUkVRVUVOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyOAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRUxFQ1RSSUNBTF9QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgyOQorLy9zZW5zb3IgY2F0ZWdvcnkgZW52aXJvbm1lbnRhbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0NBVEVHT1JZX0VOVklST05NRU5UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgzMAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRU5WSVJPTk1FTlRBTF9BVE1PU1BIRVJJQ19QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgzMQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRU5WSVJPTk1FTlRBTF9IVU1JRElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgzMgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRU5WSVJPTk1FTlRBTF9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgzMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRU5WSVJPTk1FTlRBTF9XSU5EX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgzNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfRU5WSVJPTk1FTlRBTF9XSU5EX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgzNQorLy9zZW5zb3IgY2F0ZWdvcnkgbGlnaHQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9DQVRFR09SWV9MSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NDAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xJR0hUX0FNQklFTlRMSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NDEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xJR0hUX0NPTlNVTUVSX0lORlJBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NDIKKy8vc2Vuc29yIGNhdGVnb3J5IGxvY2F0aW9uCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQ0FURUdPUllfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDUwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9MT0NBVElPTl9CUk9BRENBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDUxCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9MT0NBVElPTl9ERUFEX1JFQ0tPTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDUyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9MT0NBVElPTl9HUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDUzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9MT0NBVElPTl9MT09LVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDU0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9MT0NBVElPTl9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDU1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9MT0NBVElPTl9TVEFUSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDU2CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9MT0NBVElPTl9UUklBTkdVTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDU3CisvL3NlbnNvciBjYXRlZ29yeSBtZWNoYW5pY2FsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQ0FURUdPUllfTUVDSEFOSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDYwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NRUNIQU5JQ0FMX0JPT0xFQU5fU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDYxCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NRUNIQU5JQ0FMX0JPT0xFQU5fU1dJVENIX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDYyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NRUNIQU5JQ0FMX01VTFRJVkFMVUVfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDYzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NRUNIQU5JQ0FMX0ZPUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDY0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NRUNIQU5JQ0FMX1BSRVNTVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDY1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NRUNIQU5JQ0FMX1NUUkFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDY2CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NRUNIQU5JQ0FMX1NDQUxFX1dFSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDY3CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NRUNIQU5JQ0FMX1ZJQlJBVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDY4CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NRUNIQU5JQ0FMX0hBTExfRUZGRUNUX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDY5CisvL3NlbnNvciBjYXRlZ29yeSBtb3Rpb24KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9DQVRFR09SWV9NT1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9BQ0NFTEVST01FVEVSXzFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9BQ0NFTEVST01FVEVSXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9BQ0NFTEVST01FVEVSXzNEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9HWVJPTUVURVJfMUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9HWVJPTUVURVJfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9HWVJPTUVURVJfM0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzYKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9NT1RJT05fREVURUNUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzcKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9TUEVFRE9NRVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzgKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9BQ0NFTEVST01FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NzkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9HWVJPTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4N0EKKy8vc2Vuc29yIGNhdGVnb3J5IG9yaWVudGF0aW9uCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQ0FURUdPUllfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDgwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9DT01QQVNTXzFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDgxCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9DT01QQVNTXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDgyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9DT01QQVNTXzNEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDgzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9JTkNMSU5PTUVURVJfMUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDg0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9JTkNMSU5PTUVURVJfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDg1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9JTkNMSU5PTUVURVJfM0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDg2CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9ESVNUQU5DRV8xRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDg3CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9ESVNUQU5DRV8yRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDg4CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9ESVNUQU5DRV8zRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDg5CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9ERVZJQ0VfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDhBCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9DT01QQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDhCCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9JTkNMSU5PTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDhDCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDhECisvL3NlbnNvciBjYXRlZ29yeSBzY2FubmVyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQ0FURUdPUllfU0NBTk5FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDkwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9TQ0FOTkVSX0JBUkNPREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDkxCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9TQ0FOTkVSX1JGSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDkyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9TQ0FOTkVSX05GQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDkzCisvL3NlbnNvciBjYXRlZ29yeSB0aW1lCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQ0FURUdPUllfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweEEwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9USU1FX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweEExCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9USU1FX1JUQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweEEyCisvL3NlbnNvciBjYXRlZ29yeSBvdGhlcgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0NBVEVHT1JZX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHhFMAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfT1RIRVJfQ1VTVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHhFMQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfT1RIRVJfR0VORVJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHhFMgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfT1RIRVJfR0VORVJJQ19FTlVNRVJBVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHhFMworCisvL3VuaXQgdXNhZ2VzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfTk9UX1NQRUNJRklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NSwweDAwICAgICAgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19MVVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY3LDB4RTEsMHgwMCwweDAwLDB4MDEgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0tFTFZJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsMHgwMSwweDAwLDB4MDEsMHgwMCAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfRkFIUkVOSEVJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NywweDAzLDB4MDAsMHgwMSwweDAwIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19QQVNDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY2LDB4RjEsMHhFMSAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX05FV1RPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHgxMSwweEUxICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfTUVURVJTX1BFUl9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NiwweDExLDB4RjAgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19NRVRFUlNfUEVSX1NFQ19TUVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY2LDB4MTEsMHhFMCAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0ZBUkFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsMHhFMSwweDRGLDB4MjAsMHgwMCAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfQU1QRVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NywweDAxLDB4MDAsMHgxMCwweDAwIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19XQVRUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY2LDB4MjEsMHhEMSAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0hFTlJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsMHgyMSwweEUxLDB4RTAsMHgwMCAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfT0hNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NywweDIxLDB4RDEsMHhFMCwweDAwIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19WT0xUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY3LDB4MjEsMHhEMSwweEYwLDB4MDAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0hFUlRaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHgwMSwweEYwICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVHUkVFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NSwweDE0ICAgICAgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERUdSRUVTX1BFUl9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY2LDB4MTQsMHhGMCAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFR1JFRVNfUEVSX1NFQ19TUVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHgxNCwweEUwICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfUkFESUFOUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NSwweDEyICAgICAgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19SQURJQU5TX1BFUl9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY2LDB4MTIsMHhGMCAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX1JBRElBTlNfUEVSX1NFQ19TUVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHgxMiwweEUwICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfU0VDT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NiwweDAxLDB4MTAgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19HQVVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY3LDB4MDEsMHhFMSwweEYwLDB4MDAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0dSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHgwMSwweDAxICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfQ0VOVElNRVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NSwweDExICAgICAgICAgICAgICAgIC8vIFVuaXQKKyNpZmRlZiBERUZJTkVfTk9OX0hJRF9VTklUUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0NFTFNJVVMgICAgICAgICAgICAgICJVc2UgVW5pdChLZWx2aW4pIGFuZCBzdWJ0cmFjdCAyNzMuMTUiCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfS0lMT0dSQU0gICAgICAgICAgICAgIlVzZSBVbml0KGdyYW0pIGFuZCBVbml0RXhwb25lbnQoMHgwMykiCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfTUVURVIgICAgICAgICAgICAgICAgIlVzZSBVbml0KGNlbnRpbWV0ZXIpIGFuZCBVbml0RXhwb25lbnQoMHgwMikiCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfQkFSICAgICAgICAgICAgICAgICAgIlVzZSBVbml0KFBhc2NhbCkgYW5kIFVuaXRFeHBvbmVudCgweDA1KSIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19LTk9UICAgICAgICAgICAgICAgICAiVXNlIFVuaXQobS9zKSBhbmQgbXVsdGlwbHkgYnkgMTg1Mi8zNjAwIgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX1BFUkNFTlQgICAgICAgICAgICAgICJVc2UgVW5pdChOb3RfU3BlY2lmaWVkKSIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19HICAgICAgICAgICAgICAgICAgICAiVXNlIFVuaXQobS9zMikgYW5kIGRpdmlkZSBieSA5LjgiCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfTUlMTElTRUNPTkQgICAgICAgICAgIlVzZSBVbml0KHNlY29uZCkgYW5kIFVuaXRFeHBvbmVudCgweDBEKSIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19NSUxMSUdBVVNTICAgICAgICAgICAiVXNlIFVuaXQoR2F1c3MpIGFuZCBVbml0RXhwb25lbnQoMHgwRCkiCisjZW5kaWYKKy8vdW5pdCBkZXByZWNhdGVkIHVzYWdlcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfTFVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX0tFTFZJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9DRUxTSVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfUEFTQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX05FV1RPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9NRVRFUlNfUEVSX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfS0lMT0dSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX01FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9NRVRFUlNfUEVSX1NFQ19TUVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfRkFSQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX0FNUEVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9XQVRUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfSEVOUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX09ITSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9WT0xUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfSEVSVFogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX0JBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9ERUdSRUVTX0FOVElfQ0xPQ0tXSVNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfREVHUkVFU19DTE9DS1dJU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX0RFR1JFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9ERUdSRUVTX1BFUl9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfS05PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX1BFUkNFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE3CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfTUlMTElTRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfTUlMTElHQVVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMKKworLy9kYXRhIHR5cGUgdXNhZ2UgbW9kaWZpZXJzIC0tIHdlIHVzZSB0aGVtIGFzIG1vZGlmaWVycyBmb3Igc2Vuc29yIHByb3BlcnRpZXMgJiBkYXRhIGZpZWxkcworLy90byBjcmVhdGUgdGhyZXNob2xkcywgZm9yIGV4YW1wbGUuCisvL05PVEU6IHRoZSB1c2FnZSB0YWJsZXMgYWN0dWFsbHkgZGVmaW5lIHRoZXNlIGFzIHR3byBieXRlcywgYnV0IGluIG9yZGVyCisvL3RvIGdldCB0aGUgZGVmaW5lIG1hY3JvcyB0byB3b3JrIHNvIHRoZXNlIGFyZSCRb3ItZWSSIHRoZXNlIGFyZSBkZWZpbmVkCisvL2hlcmUgYXMgb25seSBvbmUgYnl0ZS4KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQUNDVVJBQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX1JFU09MVVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9USFJFU0hPTERfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfVEhSRVNIT0xEX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NBTElCUkFUSU9OX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DQUxJQlJBVElPTl9NVUxUSVBMSUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfUkVQT1JUX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0ZSRVFVRU5DWV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9QRVJJT0RfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX1JBTkdFX1BDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEMCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9SRUxfUENUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9WRU5ET1JfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEYwIC8vIFVTCisKKworLy9zdGF0ZSB1c2FnZXMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDEsMHgwMiAvLyBOQXJ5CisvL3N0YXRlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMiwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMywweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNiwweDA4IC8vIFNlbAorLy9zdGF0ZSBlbnVtcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcgLy8gRW51bQorLy9zdGF0ZSBkZXByZWNhdGVkIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfREVQUkVDQVRFRF9VTktOT1dOX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0RFUFJFQ0FURURfTk9UX0FWQUlMQUJMRV9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9ERVBSRUNBVEVEX1JFQURZX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfREVQUkVDQVRFRF9OT19EQVRBX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0RFUFJFQ0FURURfSU5JVElBTElaSU5HX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9ERVBSRUNBVEVEX0FDQ0VTU19ERU5JRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfREVQUkVDQVRFRF9FUlJPUl9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNgorCisvL2V2ZW50IHVzYWdlcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMiwweDAyIC8vIE5BcnkKKy8vZXZlbnQgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDEwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDExLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDEyLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDEzLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE0LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE1LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTUFYX1JFQUNIRURfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE2LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTUlOX1JFQUNIRURfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE3LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USFJFU0hPTERfQ1JPU1NfVVBXQVJEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE4LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USEVTSE9MRF9DUk9TU19BQk9WRV9TRUwgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USFJFU0hPTERfQ1JPU1NfVVBXQVJEX1NFTAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0hJR0hfVEhSRVNIT0xEX0NST1NTX0RPV05XQVJEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxOSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0hJR0hfVEhSRVNIT0xEX0NST1NTX0JFTE9XX1NFTCAgICAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0hJR0hfVEhSRVNIT0xEX0NST1NTX0RPV05XQVJEX1NFTAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfVVBXQVJEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxQSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfQUJPVkVfU0VMICAgICAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfVVBXQVJEX1NFTAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfU0VMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxQiwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfQkVMT1dfU0VMICAgICAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfU0VMCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfVVBXQVJEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFDLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfQUJPVkVfU0VMICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfVVBXQVJEX1NFTAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1pFUk9fVEhSRVNIT0xEX0NST1NTX0RPV05XQVJEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxRCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1pFUk9fVEhSRVNIT0xEX0NST1NTX0JFTE9XX1NFTCAgICAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1pFUk9fVEhSRVNIT0xEX0NST1NTX0RPV05XQVJEX1NFTAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BFUklPRF9FWENFRURFRF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxRSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0ZSRVFVRU5DWV9FWENFRURFRF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxRiwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NPTVBMRVhfVFJJR0dFUl9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyMCwweDA4IC8vIFNlbAorLy9ldmVudCBlbnVtcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1NUQVRFX0NIQU5HRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BST1BFUlRZX0NIQU5HRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BPTExfUkVTUE9OU0VfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX01BWF9SRUFDSEVEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX01JTl9SRUFDSEVEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDggLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0hJR0hfVEhSRVNIT0xEX0NST1NTX1VQV0FSRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0hJR0hfVEhFU0hPTERfQ1JPU1NfQUJPVkVfRU5VTSAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USFJFU0hPTERfQ1JPU1NfVVBXQVJEX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ISUdIX1RIUkVTSE9MRF9DUk9TU19ET1dOV0FSRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAweDBBIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ISUdIX1RIUkVTSE9MRF9DUk9TU19CRUxPV19FTlVNICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0hJR0hfVEhSRVNIT0xEX0NST1NTX0RPV05XQVJEX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9MT1dfVEhSRVNIT0xEX0NST1NTX1VQV0FSRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9MT1dfVEhSRVNIT0xEX0NST1NTX0FCT1ZFX0VOVU0gICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfVVBXQVJEX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9MT1dfVEhSRVNIT0xEX0NST1NTX0RPV05XQVJEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAweDBDIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9MT1dfVEhSRVNIT0xEX0NST1NTX0JFTE9XX0VOVU0gICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfRU5VTQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1pFUk9fVEhSRVNIT0xEX0NST1NTX1VQV0FSRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1pFUk9fVEhSRVNIT0xEX0NST1NTX0FCT1ZFX0VOVU0gIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfVVBXQVJEX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9aRVJPX1RIUkVTSE9MRF9DUk9TU19ET1dOV0FSRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAweDBFIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9aRVJPX1RIUkVTSE9MRF9DUk9TU19CRUxPV19FTlVNICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1pFUk9fVEhSRVNIT0xEX0NST1NTX0RPV05XQVJEX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QRVJJT0RfRVhDRUVERURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9GUkVRVUVOQ1lfRVhDRUVERURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DT01QTEVYX1RSSUdHRVJfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExIC8vIEVudW0KKy8vZXZlbnQgZGVwcmVjYXRlZCBlbnVtcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfVU5LTk9XTl9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX1NUQVRFX0NIQU5HRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9QUk9QRVJUWV9DSEFOR0VEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfREFUQV9VUERBVEVfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX1BPTExfUkVTUE9OU0VfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9DSEFOR0VfU0VOU0lUSVZJVFlfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfTUFYX1JFQUNIRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX01JTl9SRUFDSEVEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9ISUdIX1RIUkVTSEhPTERfQ1JPU1NfQUJPVkVfRU5VTSAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfSElHSF9USFJFU0hIT0xEX0NST1NTX0JFTE9XX0VOVU0gICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX0xPV19USFJFU0hIT0xEX0NST1NTX0FCT1ZFX0VOVU0gICAgICAgICAgICAgICAweDBBCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9MT1dfVEhSRVNISE9MRF9DUk9TU19CRUxPV19FTlVNICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfWkVST19USFJFU0hPTERfQ1JPU1NfQUJPVkVfRU5VTSAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX1pFUk9fVEhSRVNIT0xEX0NST1NTX0JFTE9XX0VOVU0gICAgICAgICAgICAgICAweDBECisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9QRVJJT0RfRVhDRUVERURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfRlJFUVVFTkNZX0VYQ0VFREVEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgIDB4MEYKKworLy9wcm9wZXJ0eSB1c2FnZXMgKGdldC9zZXQgZmVhdHVyZSByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAwLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9GUklFTkRMWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDEsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BFUlNJU1RFTlRfVU5JUVVFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMiwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAzLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9NSU5JTVVNX1JFUE9SVF9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDQsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9NQU5VRkFDVFVSRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNSwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX01PREVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA2LDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDcsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9ERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwOCwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA5LDB4MDMgLy8gTkFyeQorLy9iZWdpbiBjb25uZWN0aW9uIHR5cGUgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0lOVEVHUkFURURfU0VMICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDMwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0FUVEFDSEVEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDMxLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDMyLDB4MDggLy8gU2VsCisvL2VuZCBjb25uZWN0aW9uIHR5cGUgc2VsZWN0b3JzCisvL2JlZ2luIGNvbm5lY3Rpb24gdHlwZSBlbnVtcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX0VOVU0gICAgICAgICAgICAgICAgICAgIDB4MDEgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgIDB4MDIgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19FWFRFUk5BTF9FTlVNICAgICAgICAgICAgICAgICAgICAgIDB4MDMgLy8gRW51bQorLy9lbmQgY29ubmVjdGlvbiB0eXBlIGVudW1zCisvL2JlZ2luIGNvbm5lY3Rpb24gdHlwZSBkZXByZWNhdGVkIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9FTlVNICAgICAgICAgMHgwMCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfRU5VTSAgICAgICAgICAgMHgwMSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfRU5VTSAgICAgICAgICAgMHgwMiAvLyBFbnVtCisvL2VuZCBjb25uZWN0aW9uIHR5cGUgZGVwcmVjYXRlZCBlbnVtcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwQSwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfSEFSRFdBUkVfUkVWSVNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBCLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9GSVJNV0FSRV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MEMsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFTEVBU0VfREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwRCwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBFLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MEYsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NIQU5HRV9TRU5TSVRJVklUWV9SQU5HRV9QQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMCwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ0hBTkdFX1NFTlNJVElWSVRZX1JFTF9QQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDExLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9BQ0NVUkFDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTIsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFU09MVVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMywweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkFOR0VfTUFYSU1VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE0LDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SQU5HRV9NSU5JTVVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTUsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxNiwweDAzIC8vIE5BcnkKKy8vYmVnaW4gcmVwb3J0aW5nIHN0YXRlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfUkVQT1JUSU5HX1NUQVRFX09OX05PTkVfU0VMICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDEsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1JFUE9SVElOR19TVEFURV9PTl9BTExfU0VMICAgICAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1NFTCAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MiwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfUkVQT1JUSU5HX1NUQVRFX09OX1RIUkVTSE9MRF9TRUwgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQzLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwgICAgICAgICAgICAgICAgICAgMHgwQSwweDQ0LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwgICAgICAgICAgICAgMHgwQSwweDQ1LDB4MDggLy8gU2VsCisvL2VuZCByZXBvcnRpbmcgc3RhdGUgc2VsZWN0b3JzCisvL2JlZ2luIHJlcG9ydGluZyBzdGF0ZSBlbnVtcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfUkVQT1JUSU5HX1NUQVRFX09OX05PTkVfRU5VTSAgICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19FTlVNCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgMHgwMiAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9SRVBPUlRJTkdfU1RBVEVfT05fQUxMX0VOVU0gICAgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19FTlVNCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfRU5VTSAgICAgICAgICAgICAgICAgMHgwMyAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9SRVBPUlRJTkdfU1RBVEVfT05fVEhSRVNIT0xEX0VOVU0gSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19FTlVNCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUxfV0FLRV9FTlVNICAgICAgICAgICAgICAgICAgIDB4MDQgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTF9XQUtFX0VOVU0gICAgICAgICAgICAgICAgICAweDA1IC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX0VOVU0gICAgICAgICAgICAweDA2IC8vIEVudW0KKy8vZW5kIHJlcG9ydGluZyBzdGF0ZSBlbnVtcworLy9iZWdpbiByZXBvcnRpbmcgc3RhdGUgZGVwcmVjYXRlZCBlbnVtcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0RFUFJFQ0FURURfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19FTlVNICAgICAgICAgICAgIDB4MDAgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfREVQUkVDQVRFRF9SRVBPUlRJTkdfU1RBVEVfT05fTk9ORV9FTlVNICAgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfRU5VTQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0RFUFJFQ0FURURfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfRU5VTSAgICAgICAgICAgIDB4MDEgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfREVQUkVDQVRFRF9SRVBPUlRJTkdfU1RBVEVfT05fQUxMX0VOVU0gICAgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX0VOVU0gICAgICAweDAyIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX0RFUFJFQ0FURURfUkVQT1JUSU5HX1NUQVRFX09OX1RIUkVTSE9MRF9FTlVNIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19FTlVNCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfRU5VTSAgICAgICAgMHgwMyAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19XQUtFX0VOVU0gICAgICAgMHgwNCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX0VOVU0gMHgwNSAvLyBFbnVtCisvL2VuZCByZXBvcnRpbmcgc3RhdGUgZGVwcmVjYXRlZCBlbnVtcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NBTVBMSU5HX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxNywweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVTUE9OU0VfQ1VSVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE4LDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTksMHgwMyAvLyBOQXJ5CisvL2JlZ2luIHBvd2VyIHN0YXRlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MiwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MywweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0Q0X1BPV0VSX09GRl9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NSwweDA4IC8vIFNlbAorLy9lbmQgcG93ZXIgc3RhdGUgc2VsZWN0b3JzCisvL2JlZ2luIHBvd2VyIHN0YXRlIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDBfRlVMTF9QT1dFUl9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMyAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDJfU1RBTkRCWV9XSVRIX1dBS0VfRU5VTSAgICAgICAgICAgICAgICAgMHgwNCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDNfU0xFRVBfV0lUSF9XQUtFX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiAvLyBFbnVtCisvL2VuZCBwb3dlciBzdGF0ZSBlbnVtcworLy9iZWdpbiBkZXByZWNhdGVkIHBvd2VyIHN0YXRlIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9QT1dFUl9TVEFURV9VTkRFRklORURfRU5VTSAgICAgICAgICAgICAgICAgMHgwMCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX0VOVU0gICAgICAgICAgICAgMHgwMSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9QT1dFUl9TVEFURV9EMV9MT1dfUE9XRVJfRU5VTSAgICAgICAgICAgICAgMHgwMiAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9FTlVNICAgICAgMHgwMyAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfRU5VTSAgICAgICAgMHgwNCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfRU5VTSAgICAgICAgICAgICAgMHgwNSAvLyBFbnVtCisvL2VuZCBkZXByZWNhdGVkIHBvd2VyIHN0YXRlIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9GRUFUVVJFX1BBR0VfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFBLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX0ZFQVRVUkVfUEFHRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MUIsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0RFUFJFQ0FURURfSU5QVVRfUEFHRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxQywweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9JTlBVVF9QQUdFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFELDB4MDMKKworLy9kYXRhIHR5cGUgbG9jYXRpb24KKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fREVTSVJFRF9BQ0NVUkFDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9BTFRJVFVERV9BTlRFTk5BX1NFQUxFVkVMICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAyLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0RJRkZFUkVOVElBTF9SRUZFUkVOQ0VfU1RBVElPTl9JRCAgICAgICAgICAgICAgICAweDBBLDB4MDMsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fQUxUSVRJREVfRUxJUFNPSURfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9BTFRJVElERV9FTElQU09JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA1LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0FMVElUVURFX1NFQUxFVkVMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDYsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fQUxUSVRVREVfU0VBTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9ER1BTX0RBVEFfQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA4LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0VSUk9SX1JBRElVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDksMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fRklYX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwQSwweDA0IC8vIE5BcnkKKy8vYmVnaW4gZml4IHF1YWxpdHkgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfUVVBTElUWV9OT19GSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfUVVBTElUWV9HUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcxLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfUVVBTElUWV9ER1BTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcyLDB4MDggLy8gU2VsCisvL2VuZCBmaXggcXVhbGl0eSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0ZJWF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MEIsMHgwNCAvLyBOQXJ5CisvL2JlZ2luIGZpeCB0eXBlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRklYX1RZUEVfTk9fRklYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4MCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRklYX1RZUEVfR1BTX1NQU19NT0RFX0ZJWF9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4MSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRklYX1RZUEVfREdQU19TUFNfTU9ERV9GSVhfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4MiwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRklYX1RZUEVfR1BTX1BQU19NT0RFX0ZJWF9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4MywweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRklYX1RZUEVfUkVBTF9USU1FX0tJTkVNQVRJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4NCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRklYX1RZUEVfRkxPQVRfUlRLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4NSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRklYX1RZUEVfRVNUSU1BVEVEX0RFQURfUkVDS09OSU5HICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4NiwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRklYX1RZUEVfTUFOVUFMX0lOUFVUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4NywweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRklYX1RZUEVfU0lNVUxBVE9SX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4OCwweDA4IC8vIFNlbAorLy9lbmQgZml4IHR5cGUgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9HRU9JREFMX1NFUEFSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBDLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0dQU19PUEVSQVRJT05fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MEQsMHgwNCAvLyBOQXJ5CisvL2JlZ2luIGdwcyBvcGVyYXRpb24gbW9kZSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19PUF9NT0RFX01BTlVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4OTAsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19PUF9NT0RFX0FVVE9NQVRJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4OTEsMHgwOCAvLyBTZWwKKy8vZW5kIGdwcyBvcGVyYXRpb24gbW9kZSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0dQU19TRUxFQ1RJT05fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MEUsMHgwNCAvLyBOQXJ5CisvL2JlZ2luIGdwcyBzZWxlY3Rpb24gbW9kZSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19TRUxfTU9ERV9BVVRPTk9NT1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QTAsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19TRUxfTU9ERV9ER1BTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QTEsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19TRUxfTU9ERV9FU1RJTUFURURfREVBRF9SRUNLT05JTkcgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QTIsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19TRUxfTU9ERV9NQU5VQUxfSU5QVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QTMsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19TRUxfTU9ERV9TSU1VTEFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QTQsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19TRUxfTU9ERV9EQVRBX05PVF9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QTUsMHgwOCAvLyBTZWwKKy8vZW5kIGdwcyBzZWxlY3Rpb24gbW9kZSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0dQU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MEYsMHgwNCAvLyBOQXJ5CisvL2JlZ2luIGdwcyBzdGF0dXMgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HUFNfU1RBVFVTX0RBVEFfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEIwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HUFNfU1RBVFVTX0RBVEFfTk9UX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEIxLDB4MDggLy8gU2VsCisvL2VuZCBncHMgc3RhdHVzIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fUE9TSVRJT05fRElMVVRJT05fT0ZfUFJFQ0lTSU9OICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9IT1JJWk9OVEFMX0RJTFVUSU9OX09GX1BSRUNJU0lPTiAgICAgICAgICAgICAgICAgMHgwQSwweDExLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX1ZFUlRJQ0FMX0RJTFVUSU9OX09GX1BSRUNJU0lPTiAgICAgICAgICAgICAgICAgICAweDBBLDB4MTIsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fTEFUSVRVREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9MT05HSVRVREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE0LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX1RSVUVfSEVBRElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTUsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fTUFHTkVUSUNfSEVBRElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxNiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9NQUdORVRJQ19WQVJJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE3LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTgsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fU0FURUxMSVRFU19JTl9WSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxOSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9TQVRFTExJVEVTX0lOX1ZJRVdfQVpJTVVUSCAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFBLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX1NBVEVMTElURVNfSU5fVklFV19FTEVWQVRJT04gICAgICAgICAgICAgICAgICAgICAweDBBLDB4MUIsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fU0FURUxMSVRFU19JTl9WSUVXX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxQywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9TQVRFTExJVEVTX0lOX1ZJRVdfUFJOcyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFELDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX1NBVEVMTElURVNfSU5fVklFV19TVE5fUkFUSU8gICAgICAgICAgICAgICAgICAgICAweDBBLDB4MUUsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fU0FURUxMSVRFU19VU0VEX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxRiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9TQVRFTExJVEVTX1VTRURfUFJOcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX05NRUFfU0VOVEVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fQUREUkVTU19MSU5FXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyMiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9BRERSRVNTX0xJTkVfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIzLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0NJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjQsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fU1RBVEVfT1JfUFJPVklOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9DT1VOVFJZX09SX1JFR0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI2LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX1BPU1RBTF9DT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjcsMHgwNAorLy9wcm9wZXJ0eSB1c2FnZXMgKGdldC9zZXQgZmVhdHVyZSByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDJBLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9MT0NBVElPTl9ERVNJUkVEX0FDQ1VSQUNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MkIsMHgwNCAvLyBOQXJ5CisvL2JlZ2luIGxvY2F0aW9uIGRlc2lyZWQgYWNjdXJhY3kgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREVTSVJFRF9BQ0NVUkFDWV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDYwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREVTSVJFRF9BQ0NVUkFDWV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDYxLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREVTSVJFRF9BQ0NVUkFDWV9NRURJVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDYyLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREVTSVJFRF9BQ0NVUkFDWV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDYzLDB4MDggLy8gU2VsCisvL2VuZCBsb2NhdGlvbiBkZXNpcmVkIGFjY3VyYWN5IHNlbGVjdG9ycworCisvL2RhdGEgdHlwZSBlbnZpcm9ubWVudGFsCisvL2RhdGEgZmllbGQgdXNhZ2VzIChpbnB1dCByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDMwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfQVRNT1NQSEVSSUNfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9SRUZFUkVOQ0VfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgzMiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMX1JFTEFUSVZFX0hVTUlESVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDMzLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzQsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9XSU5EX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgzNSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMX1dJTkRfU1BFRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDM2LDB4MDQKKy8vcHJvcGVydHkgdXNhZ2VzIChnZXQvc2V0IGZlYXR1cmUgcmVwb3J0KQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0VOVklST05NRU5UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfRU5WSVJPTk1FTlRBTF9SRUZFUkVOQ0VfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQxLDB4MDQKKworLy9kYXRhIHR5cGUgbW90aW9uCisvL2RhdGEgZmllbGQgdXNhZ2VzIChpbnB1dCByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDUwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FDQ0VMRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQUNDRUxFUkFUSU9OX1hfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDUzLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BQ0NFTEVSQVRJT05fWV9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTQsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FDQ0VMRVJBVElPTl9aX0FYSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9WRUxPQ0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU2LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BTkdVTEFSX1ZFTE9DSVRZX1hfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTcsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfVkVMT0NJVFlfWV9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1OCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9WRUxPQ0lUWV9aX0FYSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU5LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BTkdVTEFSX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfUE9TSVRJT05fWF9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1QiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9QT1NJVElPTl9ZX0FYSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDVDLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BTkdVTEFSX1BPU0lUSU9OX1pfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUQsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1RSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fSU5URU5TSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDVGLDB4MDQKKworLy9kYXRhIHR5cGUgb3JpZW50YXRpb24KKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfSEVBRElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3MSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19IRUFESU5HX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcyLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0hFQURJTkdfWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzMsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfSEVBRElOR19aICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3NCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9DT01QRU5TQVRFRF9NQUdORVRJQ19OT1JUSCAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc1LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX0NPTVBFTlNBVEVEX1RSVUVfTk9SVEggICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzYsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfTk9SVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3NywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9UUlVFX05PUlRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc4LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzksMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fRElTVEFOQ0VfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3QSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9ESVNUQU5DRV9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdCLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX0RJU1RBTkNFX1ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0MsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fRElTVEFOQ0VfT1VUX09GX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3RCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9USUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdFLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RJTFRfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0YsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fVElMVF9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4MCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9USUxUX1ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDgxLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1JPVEFUSU9OX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4ODIsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUVVBVEVSTklPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4MywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19GTFVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDg0LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0ZMVVhfWF9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4ODUsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfRkxVWF9ZX0FYSVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4NiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19GTFVYX1pfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDg3LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDg4LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEUwLDB4MDgKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWV9NRURJVU0gICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEUxLDB4MDgKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEUyLDB4MDgKKworLy9kYXRhIHR5cGUgbWVjaGFuaWNhbAorLy9kYXRhIGZpZWxkIHVzYWdlcyAoaW5wdXQgcmVwb3J0KQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTUVDSEFOSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg5MCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NRUNIQU5JQ0FMX0JPT0xFQU5fU1dJVENIX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDkxLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01FQ0hBTklDQUxfQk9PTEVBTl9TV0lUQ0hfQVJSQVlfU1RBVEVTICAgICAgICAgICAgICAgICAgICAweDBBLDB4OTIsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTUVDSEFOSUNBTF9NVUxUSVZBTFVFX1NXSVRDSF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg5MywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NRUNIQU5JQ0FMX0ZPUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDk0LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01FQ0hBTklDQUxfQUJTT0xVVEVfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4OTUsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTUVDSEFOSUNBTF9HQVVHRV9QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg5NiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NRUNIQU5JQ0FMX1NUUkFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDk3LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01FQ0hBTklDQUxfV0VJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4OTgsMHgwNAorLy9wcm9wZXJ0eSB1c2FnZXMgKGdldC9zZXQgZmVhdHVyZSByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfTUVDSEFOSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEEwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9NRUNIQU5JQ0FMX1ZJQlJBVElPTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QTEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTUVDSEFOSUNBTF9WSUJSQVRJT05fU1BFRURfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhBMiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NRUNIQU5JQ0FMX1ZJQlJBVElPTl9TUEVFRF9CQUNLV0FSRCAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEEzLDB4MDQKKworLy9kYXRhIHR5cGUgYmlvbWV0cmljCisvL2RhdGEgZmllbGQgdXNhZ2VzIChpbnB1dCByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9CSU9NRVRSSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEIwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0JJT01FVFJJQ19IVU1BTl9QUkVTRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QjEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQklPTUVUUklDX0hVTUFOX1BST1hJTUlUWV9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhCMiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9CSU9NRVRSSUNfSFVNQU5fUFJPWElNSVRZX09VVF9PRl9SQU5HRSAgICAgICAgICAgICAgICAgICAgMHgwQSwweEIzLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0JJT01FVFJJQ19IVU1BTl9UT1VDSF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QjQsMHgwNAorCisvL2RhdGEgdHlwZSBsaWdodCBzZW5zb3IKKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RDAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTElHSFRfSUxMVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhEMSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9DT0xPUl9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEQyLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUX0NIUk9NQVRJQ0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RDMsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTElHSFRfQ0hST01BVElDSVRZX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhENCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9DSFJPTUFUSUNJVFlfWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEQ1LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUX0NPTlNVTUVSX0lSX1NFTlRFTkNFX1JFQ0VJVkUgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RDYsMHgwNAorLy9wcm9wZXJ0eSB1c2FnZXMgKGdldC9zZXQgZmVhdHVyZSByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfTElHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEUwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9MSUdIVF9DT05TVU1FUl9JUl9TRU5URU5DRV9TRU5EICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RTEsMHgwNAorCisvL2RhdGEgdHlwZSBzY2FubmVyCisvL2RhdGEgZmllbGQgdXNhZ2VzIChpbnB1dCByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9TQ0FOTkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEYwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1NDQU5ORVJfUkZJRF9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RjEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfU0NBTk5FUl9ORkNfU0VOVEVOQ0VfUkVDRUlWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhGMiwweDA0CisvL3Byb3BlcnR5IHVzYWdlcyAoZ2V0L3NldCBmZWF0dXJlIHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TQ0FOTkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RjgsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NDQU5ORVJfTkZDX1NFTlRFTkNFX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhGOSwweDA0CisKKy8vZGF0YSB0eXBlIGVsZWN0cmljYWwKKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VMRUNUUklDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDAsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRUxFQ1RSSUNBTF9DQVBBQ0lUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTEVDVFJJQ0FMX0NVUlJFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAyLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VMRUNUUklDQUxfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDMsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRUxFQ1RSSUNBTF9JTkRVQ1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTEVDVFJJQ0FMX1JFU0lTVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA1LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VMRUNUUklDQUxfVk9MVEFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDYsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRUxFQ1RSSUNBTF9GUkVRVUVOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNywweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTEVDVFJJQ0FMX1BFUklPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA4LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VMRUNUUklDQUxfUEVSQ0VOVF9PRl9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDksMHgwNQorCisvL2RhdGEgdHlwZSB0aW1lCisvL2RhdGEgZmllbGQgdXNhZ2VzIChpbnB1dCByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIwLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1RJTUVfWUVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjEsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfVElNRV9NT05USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyMiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9USU1FX0RBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIzLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1RJTUVfREFZX09GX1dFRUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjQsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfVElNRV9IT1VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9USU1FX01JTlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI2LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1RJTUVfU0VDT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjcsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfVElNRV9NSUxMSVNFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyOCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9USU1FX1RJTUVTVEFNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI5LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1RJTUVfSlVMSUFOX0RBWV9PRl9ZRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MkEsMHgwNQorLy9wcm9wZXJ0eSB1c2FnZXMgKGdldC9zZXQgZmVhdHVyZSByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDMwLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9USU1FX1RJTUVfWk9ORV9PRkZTRVRfRlJPTV9VVEMgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzEsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1RJTUVfVElNRV9aT05FX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgzMiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfVElNRV9EQVlMSUdIVF9TQVZJTkdTX1RJTUVfT0JTRVJWRUQgICAgICAgICAgICAgICAgICAgMHgwQSwweDMzLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9USU1FX1RJTUVfVFJJTV9BREpVU1RNRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzQsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1RJTUVfQVJNX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgzNSwweDA1CisKKy8vZGF0YSB0eXBlIGN1c3RvbQorLy9kYXRhIGZpZWxkIHVzYWdlcyAoaW5wdXQgcmVwb3J0KQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQxLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9CT09MRUFOX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDIsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MywweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQ0LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDUsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0NiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQ3LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDgsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0OSwweDA1CisKKyNpZiAxIC8vZGVmaW5lIHZlbmRvci1zcGVjaWZpYyAobm9uLXNwZWMpIGN1c3RvbSBkYXRhZmllbGRzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDRBLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEIsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0QywweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDRELDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEUsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0RiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDUwLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTEsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDUzLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTQsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU2LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTcsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1OCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU5LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUEsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1QiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDVDLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUQsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1RSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDVGLDB4MDUKKyNlbmRpZgorCisvL2RhdGEgdHlwZSBnZW5lcmljCisvL2RhdGEgZmllbGQgdXNhZ2VzIChpbnB1dCByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDYwLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfR1VJRF9PUl9QUk9QRVJUWUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjEsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19DQVRFR09SWV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2MiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX1RZUEVfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDYzLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfRVZFTlRfUFJPUEVSVFlLRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjQsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19QUk9QRVJUWV9QUk9QRVJUWUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2NSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX0RBVEFGSUVMRF9QUk9QRVJUWUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDY2LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjcsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19QUk9QRVJUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2OCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX0RBVEFGSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDY5LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVU1FUkFUT1JfVEFCTEVfUk9XX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NkEsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRU5VTUVSQVRPUl9UQUJMRV9ST1dfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2QiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX0dVSURfT1JfUFJPUEVSVFlLRVlfS0lORCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDZDLDB4MDUgLy8gTkFyeQorLy9iZWdpbiBHb3JQSyBraW5kIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dPUlBLX0tJTkRfQ0FURUdPUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhEMCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dPUlBLX0tJTkRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhEMSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dPUlBLX0tJTkRfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhEMiwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dPUlBLX0tJTkRfUFJPUEVSVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhEMywweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dPUlBLX0tJTkRfREFUQUZJRUxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhENCwweDA4IC8vIFNlbAorLy9lbmQgR29yUEsga2luZCBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NkQsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19QUk9QRVJUWUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2RSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX1RPUF9MRVZFTF9DT0xMRUNUSU9OX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDZGLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfUkVQT1JUX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzAsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19SRVBPUlRfSVRFTV9QT1NJVElPTl9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3MSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX0ZJUk1XQVJFX1ZBUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcyLDB4MDUgLy8gTkFyeQorLy9iZWdpbiBmaXJtd2FyZSB2YXJ0eXBlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfVUkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfSTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfVUkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfSTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfVUk0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfSTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfVUk4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwOCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfSTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwOSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwQSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfUjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwQiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfV1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwQywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwRCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfQ0xTSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwRSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfVkVDVE9SX1ZUX1VJMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwRiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxNCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxNSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxNiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxNywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxOCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxOSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxQSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxQiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxQywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxRCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxRSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjE2RUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxRiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyMCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyMSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyMiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyMywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyOCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyOSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyQSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyQiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyQywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyRCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyRSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0ZJUk1XQVJFX1ZBUlRZUEVfVlRfRjMyRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyRiwweDA5IC8vIFNlbAorLy9lbmQgZmlybXdhcmUgdmFydHlwZSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfVU5JVF9PRl9NRUFTVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzMsMHgwNSAvLyBOQXJ5CisvL2JlZ2luIHVuaXQgb2YgbWVhc3VyZSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfTk9UX1NQRUNJRklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDAsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfTFVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDEsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfREVHUkVFU19LRUxWSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDIsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfREVHUkVFU19DRUxTSVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDMsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfUEFTQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDQsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfTkVXVE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDUsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfTUVURVJTX1BFUl9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDYsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfS0lMT0dSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDcsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDgsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfTUVURVJTX1BFUl9TRUNfU1FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDksMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfRkFSQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEEsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfQU1QRVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEIsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfV0FUVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEMsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfSEVOUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEQsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfT0hNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEUsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfVk9MVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEYsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfSEVSVFogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTAsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfQkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTEsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfREVHUkVFU19BTlRJX0NMT0NLV0lTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTIsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfREVHUkVFU19DTE9DS1dJU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTMsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfREVHUkVFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTQsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfREVHUkVFU19QRVJfU0VDT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTUsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfREVHUkVFU19QRVJfU0VDX1NRUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTYsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfS05PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTcsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfUEVSQ0VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTgsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfU0VDT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTksMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfTUlMTElTRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUEsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUIsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUMsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfTUlMTElHQVVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUQsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX1VOSVRfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUUsMHgwOSAvLyBTZWwKKy8vZW5kIHVuaXQgb2YgbWVhc3VyZSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfVU5JVF9FWFBPTkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzQsMHgwNSAvLyBOQXJ5CisvL2JlZ2luIHVuaXQgZXhwb25lbnQgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcwLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcxLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcyLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDczLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc0LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc1LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc2LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc3LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc4LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF85ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc5LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdBLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdCLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdDLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdELDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdFLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR0VORVJJQ19FWFBPTkVOVF9GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdGLDB4MDkgLy8gU2VsCisvL2VuZCB1bml0IGV4cG9uZW50IHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19SRVBPUlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3NSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX1JFUE9SVF9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc2LDB4MDUKKy8vcHJvcGVydHkgdXNhZ2VzIChnZXQvc2V0IGZlYXR1cmUgcmVwb3J0KQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0dFTkVSSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4MCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfRU5VTUVSQVRPUl9UQUJMRV9ST1dfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDgxLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9FTlVNRVJBVE9SX1RBQkxFX1JPV19DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4ODIsMHgwNQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIE90aGVyIEhJRCBkZWZpbml0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvL05PVEU6IFRoZXNlIGRlZmluaXRpb25zIGFyZSBkZXNpZ25lZCB0byBwZXJtaXQgY29tcGlsaW5nIHRoZSBISUQgcmVwb3J0IGRlc2NyaXB0b3JzCisvLyB3aXRoIHNvbWV3aGF0IHNlbGYtZXhwbGFuYXRvcnkgaW5mb3JtYXRpb24gdG8gaGVscCByZWFkYWJpbGl0eSBhbmQgcmVkdWNlIGVycm9ycworCisvL2lucHV0LG91dHB1dCxmZWF0dXJlIGZsYWdzCisjZGVmaW5lIERhdGFfQXJyX0FicyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENvbnN0X0Fycl9BYnMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIERhdGFfVmFyX0FicyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIENvbnN0X1Zhcl9BYnMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIERhdGFfVmFyX1JlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2CisvL2NvbGxlY3Rpb24gZmxhZ3MKKyNkZWZpbmUgUGh5c2ljYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQXBwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTG9naWNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTmFtZWRBcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgVXNhZ2VTd2l0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKy8vb3RoZXIKKyNkZWZpbmUgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKworI2RlZmluZSBISURfVVNBR0VfUEFHRShhKSAgICAgICAgICAgICAgICAgICAgICAgMHgwNSxhCisjZGVmaW5lIEhJRF9VU0FHRShhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LGEKKyNkZWZpbmUgSElEX1VTQUdFMTYoYSxiKSAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsYSxiCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQShhLGIpICAgICAgICAgICAgICBhfGIgICAgIC8vVGhpcyBvci1zIHRoZSBtb2QgaW50byB1c2FnZQorI2RlZmluZSBISURfQ09MTEVDVElPTihhKSAgICAgICAgICAgICAgICAgICAgICAgMHhBMSxhCisjZGVmaW5lIEhJRF9SRVBPUlRfSUQoYSkgICAgICAgICAgICAgICAgICAgICAgICAweDg1LGEKKyNkZWZpbmUgSElEX1JFUE9SVF9TSVpFKGEpICAgICAgICAgICAgICAgICAgICAgIDB4NzUsYQorI2RlZmluZSBISURfUkVQT1JUX0NPVU5UKGEpICAgICAgICAgICAgICAgICAgICAgMHg5NSxhCisjZGVmaW5lIEhJRF9VU0FHRV9NSU5fOChhKSAgICAgICAgICAgICAgICAgICAgICAweDE5LGEKKyNkZWZpbmUgSElEX1VTQUdFX01JTl8xNihhLGIpICAgICAgICAgICAgICAgICAgIDB4MUEsYSxiCisjZGVmaW5lIEhJRF9VU0FHRV9NQVhfOChhKSAgICAgICAgICAgICAgICAgICAgICAweDI5LGEKKyNkZWZpbmUgSElEX1VTQUdFX01BWF8xNihhLGIpICAgICAgICAgICAgICAgICAgIDB4MkEsYSxiCisjZGVmaW5lIEhJRF9MT0dJQ0FMX01JTl84KGEpICAgICAgICAgICAgICAgICAgICAweDE1LGEKKyNkZWZpbmUgSElEX0xPR0lDQUxfTUlOXzE2KGEsYikgICAgICAgICAgICAgICAgIDB4MTYsYSxiCisjZGVmaW5lIEhJRF9MT0dJQ0FMX01JTl8zMihhLGIsYyxkKSAgICAgICAgICAgICAweDE3LGEsYixjLGQKKyNkZWZpbmUgSElEX0xPR0lDQUxfTUFYXzgoYSkgICAgICAgICAgICAgICAgICAgIDB4MjUsYQorI2RlZmluZSBISURfTE9HSUNBTF9NQVhfMTYoYSxiKSAgICAgICAgICAgICAgICAgMHgyNixhLGIKKyNkZWZpbmUgSElEX0xPR0lDQUxfTUFYXzMyKGEsYixjLGQpICAgICAgICAgICAgIDB4MjcsYSxiLGMsZAorI2RlZmluZSBISURfVU5JVF9FWFBPTkVOVChhKSAgICAgICAgICAgICAgICAgICAgMHg1NSxhCisjZGVmaW5lIEhJRF9JTlBVVChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxLGEKKyNkZWZpbmUgSElEX09VVFBVVChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEsYQorI2RlZmluZSBISURfRkVBVFVSRShhKSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMSxhCisjZGVmaW5lIEhJRF9FTkRfQ09MTEVDVElPTiAgICAgICAgICAgICAgICAgICAgICAweEMwCisKKyNlbmRpZiAvLyBISURVVElMX1RFU1RfSElEU0VOU09SU1BFQ19ICmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UcmlTdGF0ZVRlc3QuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvVHJpU3RhdGVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGNkZjBiCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvVHJpU3RhdGVUZXN0LmNwcApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiVHJpU3RhdGUuaCIKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgSGlkVXRpbDo6VHJpU3RhdGU7Cit0eXBlZGVmIFRyaVN0YXRlPHVpbnQzMl90PiB0cmlfdWludDMyX3Q7Cit0eXBlZGVmIFRyaVN0YXRlPGludDMyX3Q+IHRyaV9pbnQzMl90OwordHlwZWRlZiBUcmlTdGF0ZTxpbnQxNl90PiB0cmlfaW50MTZfdDsKKworVEVTVChUcmlTdGF0ZVRlc3QsIENvbnN0cnVjdG9yKSB7CisgICAgdHJpX3VpbnQzMl90IGE7CisgICAgRVhQRUNUX0ZBTFNFKGEuaXNTZXQoKSk7CisKKyAgICBhICs9IDE7CisgICAgRVhQRUNUX0ZBTFNFKGEuaXNTZXQoKSk7CisKKyAgICBhIC09IDE7CisgICAgRVhQRUNUX0ZBTFNFKGEuaXNTZXQoKSk7CisKKyAgICBhICo9IDE7CisgICAgRVhQRUNUX0ZBTFNFKGEuaXNTZXQoKSk7CisKKyAgICBhIC89IDE7CisgICAgRVhQRUNUX0ZBTFNFKGEuaXNTZXQoKSk7CisKKyAgICB0cmlfdWludDMyX3QgYjsKKyAgICBiID0gYTsKKyAgICBFWFBFQ1RfRkFMU0UoYi5pc1NldCgpKTsKKworICAgIGEgPSAxOworICAgIEVYUEVDVF9UUlVFKGEuaXNTZXQoKSk7CisKKyAgICBiID0gYTsKKyAgICBFWFBFQ1RfVFJVRShiLmlzU2V0KCkpOworCisgICAgYS5jbGVhcigpOworICAgIEVYUEVDVF9GQUxTRShhLmlzU2V0KCkpOworICAgIEVYUEVDVF9UUlVFKGIuaXNTZXQoKSk7CisKKyAgICB0cmlfdWludDMyX3QgYyhiKTsKKyAgICBFWFBFQ1RfVFJVRShjLmlzU2V0KCkpOworCisgICAgYy5jbGVhcigpOworICAgIEVYUEVDVF9GQUxTRShjLmlzU2V0KCkpOworCisgICAgdHJpX3VpbnQzMl90IGQoYSk7CisgICAgRVhQRUNUX0ZBTFNFKGMuaXNTZXQoKSk7Cit9CisKK1RFU1QoVHJpU3RhdGVUZXN0LCBJbmNBbmREZWNPcGVyYXRpb24pIHsKKyAgICB0cmlfaW50MzJfdCBhKDEpOworCisgICAgRVhQRUNUX0VRKDIsICgrK2EpLmdldCgwKSk7CisgICAgRVhQRUNUX0VRKDIsIChhKyspLmdldCgwKSk7CisgICAgRVhQRUNUX0VRKDMsIGEuZ2V0KDApKTsKKworICAgIEVYUEVDVF9FUSgyLCAoLS1hKS5nZXQoMCkpOworICAgIEVYUEVDVF9FUSgyLCAoYS0tKS5nZXQoMCkpOworICAgIEVYUEVDVF9FUSgxLCBhLmdldCgwKSk7CisKKyAgICB0cmlfdWludDMyX3QgYjsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEwMCksICgrK2IpLmdldCgxMDApKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEwMSksIChiKyspLmdldCgxMDEpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEwMiksIGIuZ2V0KDEwMikpOworICAgIEVYUEVDVF9GQUxTRShiLmlzU2V0KCkpOworCisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHVpbnQzMl90PigxMDMpLCAoLS1iKS5nZXQoMTAzKSk7CisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHVpbnQzMl90PigxMDQpLCAoYi0tKS5nZXQoMTA0KSk7CisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHVpbnQzMl90PigxMDUpLCBiLmdldCgxMDUpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYi5pc1NldCgpKTsKK30KKworVEVTVChUcmlTdGF0ZVRlc3QsIENvbXBhcmlzb24pIHsKKyAgICB0cmlfaW50MzJfdCBhKDEpOworICAgIHRyaV9pbnQzMl90IGIoMSk7CisgICAgdHJpX2ludDMyX3QgYygyKTsKKyAgICB0cmlfaW50MzJfdCBkOworCisgICAgRVhQRUNUX0VRKGEsIGIpOworICAgIEVYUEVDVF9GQUxTRSgoYSAhPSBiKSk7CisgICAgRVhQRUNUX1RSVUUoIShhICE9IGIpKTsKKyAgICBFWFBFQ1RfTkUoLTEsIGEpOworCisgICAgRVhQRUNUX0xUKGEsIGMpOworICAgIEVYUEVDVF9MVChhLCAzKTsKKworICAgIEVYUEVDVF9HVChjLCBiKTsKKyAgICBFWFBFQ1RfR1QoYywgMCk7CisKKyAgICBFWFBFQ1RfTEUoYSwgMSk7CisgICAgRVhQRUNUX0xFKGEsIGMpOworICAgIEVYUEVDVF9MRShhLCAzKTsKKyAgICBFWFBFQ1RfTEUoYSwgYik7CisKKyAgICBFWFBFQ1RfR0UoYywgYik7CisgICAgRVhQRUNUX0dFKGIsIGEpOworICAgIEVYUEVDVF9HRShjLCAwKTsKKyAgICBFWFBFQ1RfR0UoYywgMik7CisKKyAgICBFWFBFQ1RfRkFMU0UoKGEgPT0gZCkuaXNTZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKChhID49IGQpLmlzU2V0KCkpOworICAgIEVYUEVDVF9GQUxTRSgoYSA8PSBkKS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoKGEgIT0gZCkuaXNTZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKChhID4gZCkuaXNTZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKChhIDwgZCkuaXNTZXQoKSk7CisKKyAgICAvL0VYUEVDVF9FUShhLCBkKTsgLy8gd2lsbCBjYXVzZSBydW50aW1lIGZhaWx1cmUKKyAgICAvLyBkdWUgdG8gY29udmVydGluZyBhIG5vdC1zZXQgVHJpU3RhdGU8Ym9vbD4gdG8gYm9vbAorfQorCitURVNUKFRyaVN0YXRlVGVzdCwgQ29tcG91bmRBc3NpZ24pIHsKKyAgICB0cmlfdWludDMyX3QgeDsKKworICAgIHggKz0gMTA7CisgICAgRVhQRUNUX0ZBTFNFKHguaXNTZXQoKSk7CisgICAgeCAtPSAxMDsKKyAgICBFWFBFQ1RfRkFMU0UoeC5pc1NldCgpKTsKKyAgICB4ICo9IDEwOworICAgIEVYUEVDVF9GQUxTRSh4LmlzU2V0KCkpOworICAgIHggLz0gMTA7CisgICAgRVhQRUNUX0ZBTFNFKHguaXNTZXQoKSk7CisgICAgeCAmPSAxMDsKKyAgICBFWFBFQ1RfRkFMU0UoeC5pc1NldCgpKTsKKyAgICB4IHw9IDEwOworICAgIEVYUEVDVF9GQUxTRSh4LmlzU2V0KCkpOworICAgIHggJT0gMTA7CisgICAgRVhQRUNUX0ZBTFNFKHguaXNTZXQoKSk7CisgICAgeCA8PD0gMTA7CisgICAgRVhQRUNUX0ZBTFNFKHguaXNTZXQoKSk7CisgICAgeCA+Pj0gMTA7CisgICAgRVhQRUNUX0ZBTFNFKHguaXNTZXQoKSk7CisKKyAgICB0cmlfaW50MzJfdCB5LCB6LCB3OworI2RlZmluZSBURVNUX0NPTVBPVU5EX0FTU0lHTihhLCBvcCwgb3BfYywgYikgXAorICAgIHkgPSB6ID0gYTsgXAorICAgIHcgPSBiOyBcCisgICAgeSBvcF9jIGI7IFwKKyAgICBFWFBFQ1RfVFJVRSh5LmlzU2V0KCkpOyBcCisgICAgRVhQRUNUX0VRKHksIChhIG9wIGIpKTsgXAorICAgIEVYUEVDVF9FUSh5LCAoeiBvcCBiKSk7IFwKKyAgICBFWFBFQ1RfRVEoeSwgKGEgb3AgdykpOworCisgICAgVEVTVF9DT01QT1VORF9BU1NJR04oMTIzLCArLCArPSwgNDU2KTsKKyAgICBURVNUX0NPTVBPVU5EX0FTU0lHTigxMjMsIC0sIC09LCA0NTYpOworICAgIFRFU1RfQ09NUE9VTkRfQVNTSUdOKDEyMywgKiwgKj0sIDQ1Nik7CisgICAgVEVTVF9DT01QT1VORF9BU1NJR04oMTIzLCAvLCAvPSwgNDU2KTsKKyAgICBURVNUX0NPTVBPVU5EX0FTU0lHTigxMjMsIHwsIHw9LCA0NTYpOworICAgIFRFU1RfQ09NUE9VTkRfQVNTSUdOKDEyMywgJiwgJj0sIDQ1Nik7CisgICAgVEVTVF9DT01QT1VORF9BU1NJR04oMTIzLCBeLCBePSwgNDU2KTsKKyAgICBURVNUX0NPTVBPVU5EX0FTU0lHTigxMjMsICUsICU9LCA0NTYpOworI3VuZGVmIFRFU1RfQ09NUE9VTkRfQVNTSUdOCisgICAgeSA9IHogPSAxMjM7CisgICAgdyA9IDEwOworICAgIHkgPDw9IDEwOworICAgIEVYUEVDVF9UUlVFKHkuaXNTZXQoKSk7CisgICAgRVhQRUNUX0VRKDEyMyA8PCAxMCwgeSk7CisKKyAgICB5ID0geiA9IDEyMzQ1OworICAgIHcgPSAxMDsKKyAgICB5ID4+PSAxMDsKKyAgICBFWFBFQ1RfVFJVRSh5LmlzU2V0KCkpOworICAgIEVYUEVDVF9FUSgxMjM0NSA+PiAxMCwgeSk7Cit9CisKK1RFU1QoVHJpU3RhdGVUZXN0LCBVbmFyeU9wZXJhdGlvbikgeworICAgIHRyaV9pbnQxNl90IHA7CisgICAgRVhQRUNUX0ZBTFNFKCghcCkuaXNTZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKCgtcCkuaXNTZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKCh+cCkuaXNTZXQoKSk7CisKKyAgICB0cmlfaW50MTZfdCBxKDEyMzQpOworICAgIEVYUEVDVF9UUlVFKCghcSkuaXNTZXQoKSk7CisgICAgRVhQRUNUX0VRKCFzdGF0aWNfY2FzdDxpbnQxNl90PigxMjM0KSwgKCFxKSk7CisKKyAgICB0cmlfaW50MTZfdCByKDEyMzQpOworICAgIEVYUEVDVF9UUlVFKCgtcikuaXNTZXQoKSk7CisgICAgRVhQRUNUX0VRKC0xMjM0LCAoLXIpKTsKKworICAgIHRyaV9pbnQxNl90IHMoMTIzNCk7CisgICAgRVhQRUNUX1RSVUUoKH5zKS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRVEofnN0YXRpY19jYXN0PGludDE2X3Q+KDEyMzQpLCB+cyk7Cit9CisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9SaW5nQnVmZmVyLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9SaW5nQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU3YTdjCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1JpbmdCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlJpbmdCdWZmZXIuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1JpbmdCdWZmZXI6OlJpbmdCdWZmZXIoc2l6ZV90IHNpemUpCisgICAgOiBtU2l6ZShzaXplKSwKKyAgICAgIG1EYXRhKChzZW5zb3JzX2V2ZW50X3QgKiltYWxsb2Moc2l6ZW9mKHNlbnNvcnNfZXZlbnRfdCkgKiBtU2l6ZSkpLAorICAgICAgbVJlYWRQb3MoMCksCisgICAgICBtV3JpdGVQb3MoMCkgeworfQorCitSaW5nQnVmZmVyOjp+UmluZ0J1ZmZlcigpIHsKKyAgICBmcmVlKG1EYXRhKTsKKyAgICBtRGF0YSA9IE5VTEw7Cit9CisKK3NzaXplX3QgUmluZ0J1ZmZlcjo6d3JpdGUoY29uc3Qgc2Vuc29yc19ldmVudF90ICpldiwgc2l6ZV90IHNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc2l6ZV90IG51bUF2YWlsYWJsZVRvUmVhZCA9IG1Xcml0ZVBvcyAtIG1SZWFkUG9zOworICAgIHNpemVfdCBudW1BdmFpbGFibGVUb1dyaXRlID0gbVNpemUgLSBudW1BdmFpbGFibGVUb1JlYWQ7CisKKyAgICBpZiAoc2l6ZSA+IG51bUF2YWlsYWJsZVRvV3JpdGUpIHsKKyAgICAgICAgc2l6ZSA9IG51bUF2YWlsYWJsZVRvV3JpdGU7CisgICAgfQorCisgICAgc2l6ZV90IHdyaXRlUG9zID0gKG1Xcml0ZVBvcyAlIG1TaXplKTsKKyAgICBzaXplX3QgY29weSA9IG1TaXplIC0gd3JpdGVQb3M7CisKKyAgICBpZiAoY29weSA+IHNpemUpIHsKKyAgICAgICAgY29weSA9IHNpemU7CisgICAgfQorCisgICAgbWVtY3B5KCZtRGF0YVt3cml0ZVBvc10sIGV2LCBjb3B5ICogc2l6ZW9mKHNlbnNvcnNfZXZlbnRfdCkpOworCisgICAgaWYgKHNpemUgPiBjb3B5KSB7CisgICAgICAgIG1lbWNweShtRGF0YSwgJmV2W2NvcHldLCAoc2l6ZSAtIGNvcHkpICogc2l6ZW9mKHNlbnNvcnNfZXZlbnRfdCkpOworICAgIH0KKworICAgIG1Xcml0ZVBvcyArPSBzaXplOworCisgICAgaWYgKG51bUF2YWlsYWJsZVRvUmVhZCA9PSAwICYmIHNpemUgPiAwKSB7CisgICAgICAgIG1Ob3RFbXB0eUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3NpemVfdCBSaW5nQnVmZmVyOjpyZWFkKHNlbnNvcnNfZXZlbnRfdCAqZXYsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNpemVfdCBudW1BdmFpbGFibGVUb1JlYWQ7CisgICAgZm9yICg7OykgeworICAgICAgICBudW1BdmFpbGFibGVUb1JlYWQgPSBtV3JpdGVQb3MgLSBtUmVhZFBvczsKKyAgICAgICAgaWYgKG51bUF2YWlsYWJsZVRvUmVhZCA+IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbU5vdEVtcHR5Q29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIGlmIChzaXplID4gbnVtQXZhaWxhYmxlVG9SZWFkKSB7CisgICAgICAgIHNpemUgPSBudW1BdmFpbGFibGVUb1JlYWQ7CisgICAgfQorCisgICAgc2l6ZV90IHJlYWRQb3MgPSAobVJlYWRQb3MgJSBtU2l6ZSk7CisgICAgc2l6ZV90IGNvcHkgPSBtU2l6ZSAtIHJlYWRQb3M7CisKKyAgICBpZiAoY29weSA+IHNpemUpIHsKKyAgICAgICAgY29weSA9IHNpemU7CisgICAgfQorCisgICAgbWVtY3B5KGV2LCAmbURhdGFbcmVhZFBvc10sIGNvcHkgKiBzaXplb2Yoc2Vuc29yc19ldmVudF90KSk7CisKKyAgICBpZiAoc2l6ZSA+IGNvcHkpIHsKKyAgICAgICAgbWVtY3B5KCZldltjb3B5XSwgbURhdGEsIChzaXplIC0gY29weSkgKiBzaXplb2Yoc2Vuc29yc19ldmVudF90KSk7CisgICAgfQorCisgICAgbVJlYWRQb3MgKz0gc2l6ZTsKKworICAgIHJldHVybiBzaXplOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvUmluZ0J1ZmZlci5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1JpbmdCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTZiOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1JpbmdCdWZmZXIuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSSU5HX0JVRkZFUl9IXworCisjZGVmaW5lIFJJTkdfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFJpbmdCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IFJpbmdCdWZmZXIoc2l6ZV90IHNpemUpOworICAgIH5SaW5nQnVmZmVyKCk7CisKKyAgICBzc2l6ZV90IHdyaXRlKGNvbnN0IHNlbnNvcnNfZXZlbnRfdCAqZXYsIHNpemVfdCBzaXplKTsKKyAgICBzc2l6ZV90IHJlYWQoc2Vuc29yc19ldmVudF90ICpldiwgc2l6ZV90IHNpemUpOworCitwcml2YXRlOgorICAgIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtTm90RW1wdHlDb25kaXRpb247CisKKyAgICBzaXplX3QgbVNpemU7CisgICAgc2Vuc29yc19ldmVudF90ICptRGF0YTsKKyAgICBzaXplX3QgbVJlYWRQb3MsIG1Xcml0ZVBvczsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJpbmdCdWZmZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBSSU5HX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1NlbnNvckV2ZW50Q2FsbGJhY2suaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9TZW5zb3JFdmVudENhbGxiYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3OTUyOQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9TZW5zb3JFdmVudENhbGxiYWNrLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfRFNFX1NFTlNPUl9FVkVOVF9DQUxMQkFDS19ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0RTRV9TRU5TT1JfRVZFTlRfQ0FMTEJBQ0tfSAorCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworY2xhc3MgQmFzZVNlbnNvck9iamVjdDsKKworLy8gaWYgdGltZXN0YW1wIGluIHNlbnNvcnNfZXZlbnRfdCBoYXMgdGhpcyB2YWx1ZSwgaXQgd2lsbCBiZSBmaWxsZWQgYXQgZGlzcGF0Y2hlci4KK2NvbnN0ZXhwciBpbnQ2NF90IFRJTUVTVEFNUF9BVVRPX0ZJTEwgPSAtMTsKKworY2xhc3MgU2Vuc29yRXZlbnRDYWxsYmFjayB7CitwdWJsaWM6CisgICAgdmlydHVhbCBpbnQgc3VibWl0RXZlbnQoU1AoQmFzZVNlbnNvck9iamVjdCkgc2Vuc29yLCBjb25zdCBzZW5zb3JzX2V2ZW50X3QgJmUpID0gMDsKKyAgICB2aXJ0dWFsIH5TZW5zb3JFdmVudENhbGxiYWNrKCkgPSBkZWZhdWx0OworfTsKKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9EU0VfU0VOU09SX0VWRU5UX0NBTExCQUNLX0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9VdGlscy5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2YzE0NwotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9VdGlscy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfVVRJTFNfSAorCisvLyBIb3N0IGJ1aWxkIGRvZXMgbm90IGhhdmUgUmVmQmFzZQorI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2RlZmluZSBSRUZfQkFTRShhKSA6OmFuZHJvaWQ6OlJlZkJhc2UKKyNkZWZpbmUgU1AoYSkgc3A8YT4KKyNkZWZpbmUgV1AoYSkgd3A8YT4KKyNkZWZpbmUgU1BfVEhJUyB0aGlzCisjZGVmaW5lIFBST01PVEUoYSkgKGEpLnByb21vdGUoKQorI2Vsc2UKKyNpbmNsdWRlIDxtZW1vcnk+CisjZGVmaW5lIFJFRl9CQVNFKGEpIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8YT4KKyNkZWZpbmUgU1AoYSkgc3RkOjpzaGFyZWRfcHRyPGE+CisjZGVmaW5lIFdQKGEpIHN0ZDo6d2Vha19wdHI8YT4KKyNkZWZpbmUgU1BfVEhJUyBzaGFyZWRfZnJvbV90aGlzKCkKKyNkZWZpbmUgUFJPTU9URShhKSAoYSkubG9jaygpCisjZW5kaWYKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9VVElMU19ICmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3Ivc2Vuc29ycy5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3Ivc2Vuc29ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyMDNiMgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9zZW5zb3JzLmNwcApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgIkR5bmFtaWNTZW5zb3JNYW5hZ2VyLmgiCisjaW5jbHVkZSAic2Vuc29ycy5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTZW5zb3JDb250ZXh0OjpTZW5zb3JDb250ZXh0KGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCAqbW9kdWxlKSB7CisgICAgbWVtc2V0KCZkZXZpY2UsIDAsIHNpemVvZihkZXZpY2UpKTsKKworICAgIGRldmljZS5jb21tb24udGFnID0gSEFSRFdBUkVfREVWSUNFX1RBRzsKKyAgICBkZXZpY2UuY29tbW9uLnZlcnNpb24gPSBTRU5TT1JTX0RFVklDRV9BUElfVkVSU0lPTl8xXzM7CisgICAgZGV2aWNlLmNvbW1vbi5tb2R1bGUgPSBjb25zdF9jYXN0PGh3X21vZHVsZV90ICo+KG1vZHVsZSk7CisgICAgZGV2aWNlLmNvbW1vbi5jbG9zZSA9IENsb3NlV3JhcHBlcjsKKyAgICBkZXZpY2UuYWN0aXZhdGUgPSBBY3RpdmF0ZVdyYXBwZXI7CisgICAgZGV2aWNlLnNldERlbGF5ID0gU2V0RGVsYXlXcmFwcGVyOworICAgIGRldmljZS5wb2xsID0gUG9sbFdyYXBwZXI7CisgICAgZGV2aWNlLmJhdGNoID0gQmF0Y2hXcmFwcGVyOworICAgIGRldmljZS5mbHVzaCA9IEZsdXNoV3JhcHBlcjsKKworICAgIC8vIGluaXRpYWxpemUgZHluYW1pYyBzZW5zb3IgbWFuYWdlcgorICAgIGludDMyX3QgYmFzZSA9IHByb3BlcnR5X2dldF9pbnQzMigic2Vuc29yLmR5bmFtaWNfc2Vuc29yX2hhbC5oYW5kbGVfYmFzZSIsIGtEeW5hbWljSGFuZGxlQmFzZSk7CisgICAgaW50MzJfdCBjb3VudCA9CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfaW50MzIoInNlbnNvci5keW5hbWljX3NlbnNvcl9oYWwuaGFuZGxlX2NvdW50Iiwga01heER5bmFtaWNIYW5kbGVDb3VudCk7CisgICAgbUR5bmFtaWNTZW5zb3JNYW5hZ2VyLnJlc2V0KER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpjcmVhdGVJbnN0YW5jZShiYXNlLCBjb3VudCwgbnVsbHB0cikpOworfQorCitpbnQgU2Vuc29yQ29udGV4dDo6Y2xvc2UoKSB7CisgICAgZGVsZXRlIHRoaXM7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBTZW5zb3JDb250ZXh0OjphY3RpdmF0ZShpbnQgaGFuZGxlLCBpbnQgZW5hYmxlZCkgeworICAgIHJldHVybiBtRHluYW1pY1NlbnNvck1hbmFnZXItPmFjdGl2YXRlKGhhbmRsZSwgZW5hYmxlZCk7Cit9CisKK2ludCBTZW5zb3JDb250ZXh0OjpzZXREZWxheShpbnQgaGFuZGxlLCBpbnQ2NF90IGRlbGF5TnMpIHsKKyAgICByZXR1cm4gbUR5bmFtaWNTZW5zb3JNYW5hZ2VyLT5zZXREZWxheShoYW5kbGUsIGRlbGF5TnMpOworfQorCitpbnQgU2Vuc29yQ29udGV4dDo6cG9sbChzZW5zb3JzX2V2ZW50X3QgKmRhdGEsIGludCBjb3VudCkgeworICAgIHJldHVybiBtRHluYW1pY1NlbnNvck1hbmFnZXItPnBvbGwoZGF0YSwgY291bnQpOworfQorCitpbnQgU2Vuc29yQ29udGV4dDo6YmF0Y2goCisgICAgICAgIGludCBoYW5kbGUsCisgICAgICAgIGludDY0X3Qgc2FtcGxpbmdfcGVyaW9kX25zLAorICAgICAgICBpbnQ2NF90IG1heF9yZXBvcnRfbGF0ZW5jeV9ucykgeworICAgIHJldHVybiBtRHluYW1pY1NlbnNvck1hbmFnZXItPmJhdGNoKGhhbmRsZSwgc2FtcGxpbmdfcGVyaW9kX25zLCBtYXhfcmVwb3J0X2xhdGVuY3lfbnMpOworfQorCitpbnQgU2Vuc29yQ29udGV4dDo6Zmx1c2goaW50IGhhbmRsZSkgeworICAgIHJldHVybiBtRHluYW1pY1NlbnNvck1hbmFnZXItPmZsdXNoKGhhbmRsZSk7Cit9CisKKy8vIHN0YXRpYworaW50IFNlbnNvckNvbnRleHQ6OkNsb3NlV3JhcHBlcihzdHJ1Y3QgaHdfZGV2aWNlX3QgKmRldikgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNlbnNvckNvbnRleHQgKj4oZGV2KS0+Y2xvc2UoKTsKK30KKworLy8gc3RhdGljCitpbnQgU2Vuc29yQ29udGV4dDo6QWN0aXZhdGVXcmFwcGVyKAorICAgICAgICBzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV90ICpkZXYsIGludCBoYW5kbGUsIGludCBlbmFibGVkKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2Vuc29yQ29udGV4dCAqPihkZXYpLT5hY3RpdmF0ZShoYW5kbGUsIGVuYWJsZWQpOworfQorCisvLyBzdGF0aWMKK2ludCBTZW5zb3JDb250ZXh0OjpTZXREZWxheVdyYXBwZXIoCisgICAgICAgIHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlX3QgKmRldiwgaW50IGhhbmRsZSwgaW50NjRfdCBkZWxheU5zKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2Vuc29yQ29udGV4dCAqPihkZXYpLT5zZXREZWxheShoYW5kbGUsIGRlbGF5TnMpOworfQorCisvLyBzdGF0aWMKK2ludCBTZW5zb3JDb250ZXh0OjpQb2xsV3JhcHBlcigKKyAgICAgICAgc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfdCAqZGV2LCBzZW5zb3JzX2V2ZW50X3QgKmRhdGEsIGludCBjb3VudCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNlbnNvckNvbnRleHQgKj4oZGV2KS0+cG9sbChkYXRhLCBjb3VudCk7Cit9CisKKy8vIHN0YXRpYworaW50IFNlbnNvckNvbnRleHQ6OkJhdGNoV3JhcHBlcigKKyAgICAgICAgc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfMSAqZGV2LAorICAgICAgICBpbnQgaGFuZGxlLAorICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgIGludDY0X3Qgc2FtcGxpbmdfcGVyaW9kX25zLAorICAgICAgICBpbnQ2NF90IG1heF9yZXBvcnRfbGF0ZW5jeV9ucykgeworICAgICh2b2lkKSBmbGFnczsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTZW5zb3JDb250ZXh0ICo+KGRldiktPmJhdGNoKAorICAgICAgICAgICAgaGFuZGxlLCBzYW1wbGluZ19wZXJpb2RfbnMsIG1heF9yZXBvcnRfbGF0ZW5jeV9ucyk7Cit9CisKKy8vIHN0YXRpYworaW50IFNlbnNvckNvbnRleHQ6OkZsdXNoV3JhcHBlcihzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV8xICpkZXYsIGludCBoYW5kbGUpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTZW5zb3JDb250ZXh0ICo+KGRldiktPmZsdXNoKGhhbmRsZSk7Cit9CisKK3NpemVfdCBTZW5zb3JDb250ZXh0OjpnZXRTZW5zb3JMaXN0KHNlbnNvcl90IGNvbnN0ICoqbGlzdCkgeworICAgICpsaXN0ID0gJihtRHluYW1pY1NlbnNvck1hbmFnZXItPmdldER5bmFtaWNNZXRhU2Vuc29yKCkpOworICAgIHJldHVybiAxOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgc2Vuc29yX3QgY29uc3QgKnNlbnNvcl9saXN0OworCitzdGF0aWMgaW50IG9wZW5fc2Vuc29ycygKKyAgICAgICAgY29uc3Qgc3RydWN0IGh3X21vZHVsZV90ICptb2R1bGUsCisgICAgICAgIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgc3RydWN0IGh3X2RldmljZV90ICoqZGV2KSB7CisgICAgU2Vuc29yQ29udGV4dCAqY3R4ID0gbmV3IFNlbnNvckNvbnRleHQobW9kdWxlKTsKKyAgICBjdHgtPmdldFNlbnNvckxpc3QoJnNlbnNvcl9saXN0KTsKKyAgICAqZGV2ID0gJmN0eC0+ZGV2aWNlLmNvbW1vbjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBod19tb2R1bGVfbWV0aG9kc190IHNlbnNvcnNfbW9kdWxlX21ldGhvZHMgPSB7CisgICAgLm9wZW4gPSBvcGVuX3NlbnNvcnMKK307CisKK3N0YXRpYyBpbnQgZ2V0X3NlbnNvcnNfbGlzdCgKKyAgICAgICAgc3RydWN0IHNlbnNvcnNfbW9kdWxlX3QgKiwKKyAgICAgICAgc3RydWN0IHNlbnNvcl90IGNvbnN0ICoqbGlzdCkgeworICAgICpsaXN0ID0gc2Vuc29yX2xpc3Q7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X29wZXJhdGlvbl9tb2RlKHVuc2lnbmVkIGludCBtb2RlKSB7CisgICAgcmV0dXJuIChtb2RlKSA/IC1FSU5WQUwgOiAwOworfQorCitzdHJ1Y3Qgc2Vuc29yc19tb2R1bGVfdCBIQUxfTU9EVUxFX0lORk9fU1lNID0geworICAgIC5jb21tb24gPSB7CisgICAgICAgICAgICAudGFnID0gSEFSRFdBUkVfTU9EVUxFX1RBRywKKyAgICAgICAgICAgIC52ZXJzaW9uX21ham9yID0gMSwKKyAgICAgICAgICAgIC52ZXJzaW9uX21pbm9yID0gMCwKKyAgICAgICAgICAgIC5pZCA9IFNFTlNPUlNfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgICAgICAgICAgLm5hbWUgPSAiR29vZ2xlIER5bmFtaWMgU2Vuc29yIE1hbmFnZXIiLAorICAgICAgICAgICAgLmF1dGhvciA9ICJHb29nbGUiLAorICAgICAgICAgICAgLm1ldGhvZHMgPSAmc2Vuc29yc19tb2R1bGVfbWV0aG9kcywKKyAgICAgICAgICAgIC5kc28gID0gTlVMTCwKKyAgICAgICAgICAgIC5yZXNlcnZlZCA9IHswfSwKKyAgICB9LAorICAgIC5nZXRfc2Vuc29yc19saXN0ID0gZ2V0X3NlbnNvcnNfbGlzdCwKKyAgICAuc2V0X29wZXJhdGlvbl9tb2RlID0gc2V0X29wZXJhdGlvbl9tb2RlLAorfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9zZW5zb3JzLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3Ivc2Vuc29ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDg3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3Ivc2Vuc29ycy5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNFTlNPUlNfSF8KKyNkZWZpbmUgU0VOU09SU19IXworCisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworICAgIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworICAgICAgICBjbGFzcyBEeW5hbWljU2Vuc29yTWFuYWdlcjsKKyAgICB9IC8vIG5hbWVzcGFjZSBCYXNlU2Vuc29yT2JqZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK3VzaW5nIGFuZHJvaWQ6OlNlbnNvckhhbEV4dDo6RHluYW1pY1NlbnNvck1hbmFnZXI7CisKK2NsYXNzIFNlbnNvckNvbnRleHQgeworcHVibGljOgorICAgIHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlXzEgZGV2aWNlOworCisgICAgZXhwbGljaXQgU2Vuc29yQ29udGV4dChjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QgKm1vZHVsZSk7CisKKyAgICBzaXplX3QgZ2V0U2Vuc29yTGlzdChzZW5zb3JfdCBjb25zdCAqKmxpc3QpOworCitwcml2YXRlOgorCisgICAgaW50IGNsb3NlKCk7CisgICAgaW50IGFjdGl2YXRlKGludCBoYW5kbGUsIGludCBlbmFibGVkKTsKKyAgICBpbnQgc2V0RGVsYXkoaW50IGhhbmRsZSwgaW50NjRfdCBkZWxheU5zKTsKKyAgICBpbnQgcG9sbChzZW5zb3JzX2V2ZW50X3QgKmRhdGEsIGludCBjb3VudCk7CisKKyAgICBpbnQgYmF0Y2goaW50IGhhbmRsZSwgaW50NjRfdCBzYW1wbGluZ19wZXJpb2RfbnMsCisgICAgICAgICAgICAgIGludDY0X3QgbWF4X3JlcG9ydF9sYXRlbmN5X25zKTsKKworICAgIGludCBmbHVzaChpbnQgaGFuZGxlKTsKKworICAgIC8vIHN0YXRpYyB3cmFwcGVycworICAgIHN0YXRpYyBpbnQgQ2xvc2VXcmFwcGVyKHN0cnVjdCBod19kZXZpY2VfdCAqZGV2KTsKKworICAgIHN0YXRpYyBpbnQgQWN0aXZhdGVXcmFwcGVyKAorICAgICAgICAgICAgc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfdCAqZGV2LCBpbnQgaGFuZGxlLCBpbnQgZW5hYmxlZCk7CisKKyAgICBzdGF0aWMgaW50IFNldERlbGF5V3JhcHBlcigKKyAgICAgICAgICAgIHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlX3QgKmRldiwgaW50IGhhbmRsZSwgaW50NjRfdCBkZWxheU5zKTsKKworICAgIHN0YXRpYyBpbnQgUG9sbFdyYXBwZXIoCisgICAgICAgICAgICBzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV90ICpkZXYsIHNlbnNvcnNfZXZlbnRfdCAqZGF0YSwgaW50IGNvdW50KTsKKworICAgIHN0YXRpYyBpbnQgQmF0Y2hXcmFwcGVyKAorICAgICAgICAgICAgc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfMSAqZGV2LAorICAgICAgICAgICAgaW50IGhhbmRsZSwKKyAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgIGludDY0X3Qgc2FtcGxpbmdfcGVyaW9kX25zLAorICAgICAgICAgICAgaW50NjRfdCBtYXhfcmVwb3J0X2xhdGVuY3lfbnMpOworCisgICAgc3RhdGljIGludCBGbHVzaFdyYXBwZXIoc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfMSAqZGV2LCBpbnQgaGFuZGxlKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrRHluYW1pY0hhbmRsZUJhc2UgPSAweDEwMDAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrRHluYW1pY0hhbmRsZUVuZCA9IDB4MTAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga01heER5bmFtaWNIYW5kbGVDb3VudCA9IGtEeW5hbWljSGFuZGxlRW5kIC0ga0R5bmFtaWNIYW5kbGVCYXNlOworCisgICAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNTZW5zb3JNYW5hZ2VyPiBtRHluYW1pY1NlbnNvck1hbmFnZXI7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZW5zb3JDb250ZXh0KTsKK307CisKKyNlbmRpZiAgLy8gU0VOU09SU19IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL3Rlc3QvSGlkUmF3RGV2aWNlVGVzdC5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvdGVzdC9IaWRSYXdEZXZpY2VUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTY4ZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL3Rlc3QvSGlkUmF3RGV2aWNlVGVzdC5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJIaWRSYXdEZXZpY2VUZXN0IgorCisjaW5jbHVkZSAiSGlkUmF3RGV2aWNlLmgiCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yLmgiCisjaW5jbHVkZSAiSGlkU2Vuc29yRGVmLmgiCisjaW5jbHVkZSAiU2Vuc29yRXZlbnRDYWxsYmFjay5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisjaW5jbHVkZSAiSGlkTG9nLmgiCisjaW5jbHVkZSAiU3RyZWFtSW9VdGlsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCisvKgorICogSG9zdCB0ZXN0IHRoYXQgdmVyaWZpZXMgSGlkUmF3RGV2aWNlIGFuZCBIaWRSYXdTZW5zb3Igd29ya3MgY29ycmVjdGx5LgorICovCitjbGFzcyBIaWRSYXdEZXZpY2VUZXN0IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCB0ZXN0KGNvbnN0IGNoYXIgKmRldmljZVBhdGgpIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpTZW5zb3JUeXBlVXNhZ2U7CisgICAgICAgIHVzaW5nIEhpZFV0aWw6OmhleGR1bXBUb1N0cmVhbTsKKworICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiBpbnRlcmVzdGVkVXNhZ2V7CisgICAgICAgICAgICAgICAgQUNDRUxFUk9NRVRFUl8zRCwgR1lST01FVEVSXzNELCBDT01QQVNTXzNELCBDVVNUT019OworCisgICAgICAgIFNQKEhpZFJhd0RldmljZSkgZGV2aWNlID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEhpZFJhd0RldmljZT4oc3RkOjpzdHJpbmcoZGV2aWNlUGF0aCksIGludGVyZXN0ZWRVc2FnZSk7CisgICAgICAgIGNvbnN0IEhpZERldmljZTo6SGlkRGV2aWNlSW5mbyAmaW5mbyA9IGRldmljZS0+Z2V0RGV2aWNlSW5mbygpOworCisgICAgICAgIExPR19WIDw8ICJTaXplb2YgZGVzY3JpcHRvcjogIiA8PCBpbmZvLmRlc2NyaXB0b3Iuc2l6ZSgpIDw8IExPR19FTkRMOworICAgICAgICBMT0dfViA8PCAiRGVzY3JpcHRvcjogIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgaGV4ZHVtcFRvU3RyZWFtKExPR19WLCBpbmZvLmRlc2NyaXB0b3IuYmVnaW4oKSwgaW5mby5kZXNjcmlwdG9yLmVuZCgpKTsKKworICAgICAgICBpZiAoIWRldmljZS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBMT0dfRSA8PCAiaW52YWxpZCBkZXZpY2UiIDw8IExPR19FTkRMOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTE9HX1YgPDwgIkRpZ2VzdDogIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgTE9HX1YgPDwgZGV2aWNlLT5tRGlnZXN0VmVjdG9yOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcjsKKyAgICAgICAgLy8gRHVtcCBmaXJzdCBmZXcgZmVhdHVyZSBJRCB0byBoZWxwIGRlYnVnZ2luZy4KKyAgICAgICAgLy8gSWYgZGV2aWNlIGRvZXMgbm90IGltcGxlbWVudCBhbGwgdGhlc2UgZmVhdHVyZXMsIGl0IHdpbGwgc2hvdyBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgZm9yIChpbnQgZmVhdHVyZUlkID0gMDsgZmVhdHVyZUlkIDw9IDU7ICsrZmVhdHVyZUlkKSB7CisgICAgICAgICAgICBpZiAoIWRldmljZS0+Z2V0RmVhdHVyZShmZWF0dXJlSWQsICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgImNhbm5vdCBnZXQgZmVhdHVyZSAiIDw8IGZlYXR1cmVJZCA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HX1YgPDwgIkR1bXAgb2YgZmVhdHVyZSAiIDw8IGZlYXR1cmVJZCA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICBoZXhkdW1wVG9TdHJlYW0oTE9HX1YsIGJ1ZmZlci5iZWdpbigpLCBidWZmZXIuZW5kKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vCisgICAgICAgIC8vIHVzZSBIaWRSYXdTZW5zb3IgdG8gb3BlcmF0ZSB0aGUgZGV2aWNlLCBwaWNrIGZpcnN0IGRpZ2VzdAorICAgICAgICAvLworICAgICAgICBhdXRvICZyZXBvcnREaWdlc3QgPSBkZXZpY2UtPm1EaWdlc3RWZWN0b3JbMF07CisgICAgICAgIFNQKEhpZFJhd1NlbnNvcikgc2Vuc29yID0gc3RkOjptYWtlX3NoYXJlZDxIaWRSYXdTZW5zb3I+KAorICAgICAgICAgICAgICAgIGRldmljZSwgcmVwb3J0RGlnZXN0LmZ1bGxVc2FnZSwgcmVwb3J0RGlnZXN0LnBhY2tldHMpOworCisgICAgICAgIGlmICghc2Vuc29yLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIExPR19FIDw8ICJTZW5zb3IgaXMgbm90IHZhbGlkICIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzZW5zb3JfdCAqcyA9IHNlbnNvci0+Z2V0U2Vuc29yKCk7CisgICAgICAgIExPR19WIDw8ICJTZW5zb3IgbmFtZTogIiA8PCBzLT5uYW1lIDw8ICIsIHZlbmRvcjogIiA8PCBzLT52ZW5kb3IgPDwgTE9HX0VOREw7CisgICAgICAgIExPR19WIDw8IHNlbnNvci0+ZHVtcCgpIDw8IExPR19FTkRMOworCisgICAgICAgIGNsYXNzIENhbGxiYWNrIDogcHVibGljIFNlbnNvckV2ZW50Q2FsbGJhY2sgeworICAgICAgICAgICAgdmlydHVhbCBpbnQgc3VibWl0RXZlbnQoU1AoQmFzZVNlbnNvck9iamVjdCkgLypzZW5zb3IqLywgY29uc3Qgc2Vuc29yc19ldmVudF90ICZlKSB7CisgICAgICAgICAgICAgICAgTE9HX1YgPDwgInNlbnNvcjogIiA8PCBlLnNlbnNvciA8PCAiLCB0eXBlOiAiIDw8IGUudHlwZSA8PCAiLCB0czogIiA8PCBlLnRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHZhbHVlcyAoIiA8PCBlLmRhdGFbMF0gPDwgIiwgIiA8PCBlLmRhdGFbMV0gPDwgIiwgIiA8PCBlLmRhdGFbMl0gPDwgIikiCisgICAgICAgICAgICAgICAgICAgICAgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrOworICAgICAgICBzZW5zb3ItPnNldEV2ZW50Q2FsbGJhY2soJmNhbGxiYWNrKTsKKworICAgICAgICAvLyBSZXF1ZXN0IHNlbnNvciBzYW1wbGVzIGF0IHRvIDEwSHogKDEwMG1zKQorICAgICAgICBzZW5zb3ItPmJhdGNoKDEwMExMKjEwMDAqMTAwMCAvKm5zKi8sIDApOworICAgICAgICBzZW5zb3ItPmVuYWJsZSh0cnVlKTsKKworICAgICAgICAvLyBnZXQgYSBjb3VwbGUgb2YgZXZlbnRzCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaWQ7CisgICAgICAgICAgICBpZiAoIWRldmljZS0+cmVjZWl2ZVJlcG9ydCgmaWQsICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIlJlY2VpdmUgcmVwb3J0IGVycm9yIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbnNvci0+aGFuZGxlSW5wdXQoaWQsIGJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjbGVhbiB1cAorICAgICAgICBzZW5zb3ItPmVuYWJsZShmYWxzZSk7CisKKyAgICAgICAgTE9HX1YgPDwgIkRvbmUhIiA8PCBMT0dfRU5ETDsKKyAgICB9Cit9OworfSAvL25hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy9uYW1lc3BhY2UgYW5kcm9pZAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaWYgKGFyZ2MgIT0gMikgeworICAgICAgICBMT0dfRSA8PCAiVXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIGhpZHJhdy1kZXYtcGF0aCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYW5kcm9pZDo6U2Vuc29ySGFsRXh0OjpIaWRSYXdEZXZpY2VUZXN0Ojp0ZXN0KGFyZ3ZbMV0pOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL3Rlc3QvSGlkUmF3U2Vuc29yVGVzdC5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvdGVzdC9IaWRSYXdTZW5zb3JUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE3NDdhCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL3Rlc3QvSGlkUmF3U2Vuc29yVGVzdC5jcHAKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJIaWRSYXdTZW5zb3JUZXN0IgorCisjaW5jbHVkZSAiSGlkRGV2aWNlLmgiCisjaW5jbHVkZSAiSGlkTG9nLmgiCisjaW5jbHVkZSAiSGlkTG9nLmgiCisjaW5jbHVkZSAiSGlkUGFyc2VyLmgiCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yLmgiCisjaW5jbHVkZSAiSGlkU2Vuc29yRGVmLmgiCisjaW5jbHVkZSAiU3RyZWFtSW9VdGlsLmgiCisjaW5jbHVkZSAiVGVzdEhpZERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK2NsYXNzIEhpZFJhd0R1bW15RGV2aWNlIDogcHVibGljIEhpZERldmljZSB7CitwdWJsaWM6CisgICAgc3RydWN0IERhdGFQYWlyIHsKKyAgICAgICAgdWludDhfdCBpZDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTsKKyAgICB9OworCisgICAgSGlkUmF3RHVtbXlEZXZpY2UoKSB7CisgICAgICAgIC8vIGR1bW15IHZhbHVlcworICAgICAgICBtSW5mbyA9IHsKKyAgICAgICAgICAubmFtZSA9ICJUZXN0IHNlbnNvciBuYW1lIiwKKyAgICAgICAgICAucGh5c2ljYWxQYXRoID0gIi9waHlzaWNhbC9wYXRoIiwKKyAgICAgICAgICAuYnVzVHlwZSA9ICJVU0IiLAorICAgICAgICAgIC52ZW5kb3JJZCA9IDB4MTIzNCwKKyAgICAgICAgICAucHJvZHVjdElkID0gMHg1Njc4LAorICAgICAgICAgIC5kZXNjcmlwdG9yID0gezB9CisgICAgICB9OworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgSGlkRGV2aWNlSW5mbyYgZ2V0RGV2aWNlSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1JbmZvOworICAgIH0KKworICAgIC8vIGdldCBmZWF0dXJlIGZyb20gZGV2aWNlCisgICAgdmlydHVhbCBib29sIGdldEZlYXR1cmUodWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKm91dCkgeworICAgICAgICBhdXRvIGkgPSBtRmVhdHVyZS5maW5kKGlkKTsKKyAgICAgICAgaWYgKGkgPT0gbUZlYXR1cmUuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gaS0+c2Vjb25kOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBmZWF0dXJlIHRvIGRldmljZQorICAgIHZpcnR1YWwgYm9vbCBzZXRGZWF0dXJlKHVpbnQ4X3QgaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpbikgeworICAgICAgICBhdXRvIGkgPSBtRmVhdHVyZS5maW5kKGlkKTsKKyAgICAgICAgaWYgKGkgPT0gbUZlYXR1cmUuZW5kKCkgfHwgaW4uc2l6ZSgpICE9IGktPnNlY29uZC5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpLT5zZWNvbmQgPSBpbjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gc2VuZCByZXBvcnQgdG8gZGVmYXVsdCBvdXRwdXQgZW5kcG9pbnQKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFJlcG9ydCh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmZGF0YSkgeworICAgICAgICBEYXRhUGFpciBwYWlyID0geworICAgICAgICAgICAgLmlkID0gaWQsCisgICAgICAgICAgICAuZGF0YSA9IGRhdGEKKyAgICAgICAgfTsKKyAgICAgICAgbU91dHB1dC5wdXNoX2JhY2socGFpcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIHJlY2VpdmUgZnJvbSBkZWZhdWx0IGlucHV0IGVuZHBvaW50CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVSZXBvcnQodWludDhfdCAqIC8qaWQqLywgc3RkOjp2ZWN0b3I8dWludDhfdD4gKiAvKmRhdGEqLykgeworICAgICAgICAvLyBub3QgbmVjZXNzYXJ5LCBhcyBpbnB1dCByZXBvcnQgY2FuIGJlIGRpcmVjdGx5IGZlZWQgdG8gSGlkUmF3U2Vuc29yIGZvciB0ZXN0aW5nIHB1cnBvc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZGVxdWV1T3V0cHV0UmVwb3J0KERhdGFQYWlyICpwYWlyKSB7CisgICAgICAgIGlmICghbU91dHB1dC5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKnBhaXIgPSBtT3V0cHV0LmZyb250KCk7CisgICAgICAgIG1PdXRwdXQucG9wX2Zyb250KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBIaWREZXZpY2VJbmZvIG1JbmZvOworICAgIHN0ZDo6ZGVxdWU8RGF0YVBhaXI+IG1PdXRwdXQ7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ4X3QsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBtRmVhdHVyZTsKK307CisKK2NsYXNzIEhpZFJhd1NlbnNvclRlc3QgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIHRlc3QoKSB7CisgICAgICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpTZW5zb3JUeXBlVXNhZ2U7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+IGludGVyZXN0ZWRVc2FnZXsKKyAgICAgICAgICAgICAgICBBQ0NFTEVST01FVEVSXzNELCBHWVJPTUVURVJfM0QsIENPTVBBU1NfM0QsIENVU1RPTX07CisgICAgICAgIFNQKEhpZERldmljZSkgZGV2aWNlKG5ldyBIaWRSYXdEdW1teURldmljZSgpKTsKKworICAgICAgICBIaWRQYXJzZXIgaGlkUGFyc2VyOworICAgICAgICBmb3IgKGNvbnN0IFRlc3RIaWREZXNjcmlwdG9yICpwID0gZ0Rlc2NyaXB0b3JBcnJheTsgOyArK3ApIHsKKyAgICAgICAgICAgIGlmIChwLT5kYXRhID09IG51bGxwdHIgfHwgcC0+bGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBwLT5uYW1lICE9IG51bGxwdHIgPyBwLT5uYW1lIDogInVubmFtZWQiOworICAgICAgICAgICAgaWYgKCFoaWRQYXJzZXIucGFyc2UocC0+ZGF0YSwgcC0+bGVuKSkgeworICAgICAgICAgICAgICAgIExPR19FIDw8IG5hbWUgPDwgIiBwYXJzaW5nIGVycm9yISIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhpZFBhcnNlci5maWx0ZXJUcmVlKCk7CisgICAgICAgICAgICBMT0dfViA8PCBuYW1lIDw8ICIgIGRpZ2VzdDogIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIGF1dG8gZGlnZXN0VmVjdG9yID0gaGlkUGFyc2VyLmdlbmVyYXRlRGlnZXN0KGludGVyZXN0ZWRVc2FnZSk7CisgICAgICAgICAgICBMT0dfViA8PCBkaWdlc3RWZWN0b3I7CisKKyAgICAgICAgICAgIGlmIChkaWdlc3RWZWN0b3IuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIExPR19WIDw8IG5hbWUgPDwgIiBkb2VzIG5vdCBjb250YWluIGludGVyZXN0ZWQgdXNhZ2UiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0dfViA8PCBuYW1lIDw8ICIgIHNlbnNvcjogIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGlnZXN0IDogZGlnZXN0VmVjdG9yKSB7CisgICAgICAgICAgICAgICAgTE9HX0kgPDwgIlNlbnNvciB1c2FnZSAiIDw8IHN0ZDo6aGV4IDw8IGRpZ2VzdC5mdWxsVXNhZ2UgPDwgc3RkOjpkZWMgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgYXV0byAqcyA9IG5ldyBIaWRSYXdTZW5zb3IoZGV2aWNlLCBkaWdlc3QuZnVsbFVzYWdlLCBkaWdlc3QucGFja2V0cyk7CisgICAgICAgICAgICAgICAgaWYgKHMtPm1WYWxpZCkgeworICAgICAgICAgICAgICAgICAgICBMT0dfViA8PCAiVXNhZ2UgIiA8PCBzdGQ6OmhleCA8PCBkaWdlc3QuZnVsbFVzYWdlIDw8IHN0ZDo6ZGVjIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgICAgICBMT0dfViA8PCBzLT5kdW1wKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HX1YgPDwgIlNlbnNvciBvZiB1c2FnZSAiIDw8IHN0ZDo6aGV4IDw8IGRpZ2VzdC5mdWxsVXNhZ2UgPDwgc3RkOjpkZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBub3QgdmFsaWQhIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dfViA8PCBMT0dfRU5ETDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK307CisKK30vLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9Ly8gbmFtZXNwYWNlIGFuZHJvaWQKKworaW50IG1haW4oKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OlNlbnNvckhhbEV4dDo6SGlkUmF3U2Vuc29yVGVzdDo6dGVzdCgpID8gMCA6IDE7Cit9CmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvbXVsdGloYWwuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL211bHRpaGFsLmNwcAppbmRleCBmMzhkOTBkLi44ODdhNGJhIDEwMDY0NAotLS0gYS9tb2R1bGVzL3NlbnNvcnMvbXVsdGloYWwuY3BwCisrKyBiL21vZHVsZXMvc2Vuc29ycy9tdWx0aWhhbC5jcHAKQEAgLTE0LDMzICsxNCwzMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHBvbGwuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgorI2luY2x1ZGUgIlNlbnNvckV2ZW50UXVldWUuaCIKKyNpbmNsdWRlICJtdWx0aWhhbC5oIgogCiAjZGVmaW5lIExPR19OREVCVUcgMQogI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgogCiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+CiAKLSNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8U2Vuc29yRXZlbnRRdWV1ZS5oPgotCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKLXN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfRklMRU5BTUUgPSAiL3N5c3RlbS9ldGMvc2Vuc29ycy9oYWxzLmNvbmYiOwotc3RhdGljIGNvbnN0IGludCBNQVhfQ09ORl9MSU5FX0xFTkdUSCA9IDEwMjQ7CiAKIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgaW5pdF9tb2R1bGVzX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgaW5pdF9zZW5zb3JzX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKQEAgLTI1OCw5ICsyNTUsOSBAQAogICAgIH0KIH0KIAotLy8gQW5kcm9pZCBMIHJlcXVpcmVzIHNlbnNvciBIQUxzIHRvIGJlIGVpdGhlciAxXzAgb3IgMV8zIGNvbXBsaWFudAorLy8gQW5kcm9pZCBOIGFuZCBoaXJlIHJlcXVpcmUgc2Vuc29yIEhBTHMgdG8gYmUgYXQgbGVhc3QgMV8zIGNvbXBsaWFudAogI2RlZmluZSBIQUxfVkVSU0lPTl9JU19DT01QTElBTlQodmVyc2lvbikgIFwKLSAgICAodmVyc2lvbiA9PSBTRU5TT1JTX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgfHwgdmVyc2lvbiA+PSBTRU5TT1JTX0RFVklDRV9BUElfVkVSU0lPTl8xXzMpCisgICAgKHZlcnNpb24gPj0gU0VOU09SU19ERVZJQ0VfQVBJX1ZFUlNJT05fMV8zKQogCiAvLyBSZXR1cm5zIHRydWUgaWYgSEFMIGlzIGNvbXBsaWFudCwgZmFsc2UgaWYgSEFMIGlzIG5vdCBjb21wbGlhbnQgb3IgaWYgaGFuZGxlIGlzIGludmFsaWQKIHN0YXRpYyBib29sIGhhbElzQ29tcGxpYW50KHNlbnNvcnNfcG9sbF9jb250ZXh0X3QgKmN0eCwgaW50IGhhbmRsZSkgewpAQCAtNTAzLDE1ICs1MDAsMzIgQEAKICAqIFRoZSB2ZWN0b3IgbXVzdCBub3QgYmUgbnVsbC4KICAqLwogc3RhdGljIHZvaWQgZ2V0X3NvX3BhdGhzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqc29fcGF0aHMpIHsKLSAgICBzdGQ6OnN0cmluZyBsaW5lOwotICAgIHN0ZDo6aWZzdHJlYW0gY29uZl9maWxlKENPTkZJR19GSUxFTkFNRSk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBjb25maWdfcGF0aF9saXN0KAorICAgICAgICAgICAgeyBNVUxUSV9IQUxfQ09ORklHX0ZJTEVfUEFUSCwgREVQUkVDQVRFRF9NVUxUSV9IQUxfQ09ORklHX0ZJTEVfUEFUSCB9KTsKIAotICAgIGlmKCFjb25mX2ZpbGUpIHsKLSAgICAgICAgQUxPR1coIk5vIG11bHRpaGFsIGNvbmZpZyBmaWxlIGZvdW5kIGF0ICVzIiwgQ09ORklHX0ZJTEVOQU1FKTsKKyAgICBzdGQ6Omlmc3RyZWFtIHN0cmVhbTsKKyAgICBjb25zdCBjaGFyICpwYXRoID0gbnVsbHB0cjsKKyAgICBmb3IgKGF1dG8gaSA6IGNvbmZpZ19wYXRoX2xpc3QpIHsKKyAgICAgICAgc3RkOjppZnN0cmVhbSBmKGkpOworICAgICAgICBpZiAoZikgeworICAgICAgICAgICAgc3RyZWFtID0gc3RkOjptb3ZlKGYpOworICAgICAgICAgICAgcGF0aCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZighc3RyZWFtKSB7CisgICAgICAgIEFMT0dXKCJObyBtdWx0aWhhbCBjb25maWcgZmlsZSBmb3VuZCIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFMT0dWKCJNdWx0aWhhbCBjb25maWcgZmlsZSBmb3VuZCBhdCAlcyIsIENPTkZJR19GSUxFTkFNRSk7Ci0gICAgd2hpbGUgKHN0ZDo6Z2V0bGluZShjb25mX2ZpbGUsIGxpbmUpKSB7CisKKyAgICBBTE9HRV9JRihzdHJjbXAocGF0aCwgREVQUkVDQVRFRF9NVUxUSV9IQUxfQ09ORklHX0ZJTEVfUEFUSCkgPT0gMCwKKyAgICAgICAgICAgICJNdWx0aWhhbCBjb25maWd1cmF0aW9uIGZpbGUgcGF0aCAlcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFRyZWJsZSAiCisgICAgICAgICAgICAicmVxdWlyZW1lbnRzLiBQbGVhc2UgbW92ZSBpdCB0byAlcy4iLAorICAgICAgICAgICAgcGF0aCwgTVVMVElfSEFMX0NPTkZJR19GSUxFX1BBVEgpOworCisgICAgQUxPR1YoIk11bHRpaGFsIGNvbmZpZyBmaWxlIGZvdW5kIGF0ICVzIiwgcGF0aCk7CisgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKHN0cmVhbSwgbGluZSkpIHsKICAgICAgICAgQUxPR1YoImNvbmZpZyBmaWxlIGxpbmU6ICclcyciLCBsaW5lLmNfc3RyKCkpOwogICAgICAgICBzb19wYXRocy0+cHVzaF9iYWNrKGxpbmUpOwogICAgIH0KQEAgLTY2MCw2ICs2NzQsMTAgQEAKICAgICAuZ2V0X3NlbnNvcnNfbGlzdCA9IG1vZHVsZV9fZ2V0X3NlbnNvcnNfbGlzdAogfTsKIAorc3RydWN0IHNlbnNvcnNfbW9kdWxlX3QgKmdldF9tdWx0aV9oYWxfbW9kdWxlX2luZm8oKSB7CisgICAgcmV0dXJuICgmSEFMX01PRFVMRV9JTkZPX1NZTSk7Cit9CisKIHN0YXRpYyBpbnQgb3Blbl9zZW5zb3JzKGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCogaHdfbW9kdWxlLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBod19kZXZpY2Vfb3V0KSB7CiAgICAgQUxPR1YoIm9wZW5fc2Vuc29ycyBiZWdpbi4uLiIpOwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL211bHRpaGFsLmggYi9tb2R1bGVzL3NlbnNvcnMvbXVsdGloYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzRmMmYwCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL211bHRpaGFsLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEhBUkRXQVJFX0xJQkhBUkRXQVJFX01PRFVMRVNfU0VOU09SU19NVUxUSUhBTF9IXworI2RlZmluZSBIQVJEV0FSRV9MSUJIQVJEV0FSRV9NT0RVTEVTX1NFTlNPUlNfTVVMVElIQUxfSF8KKworI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorCitzdGF0aWMgY29uc3QgY2hhciogTVVMVElfSEFMX0NPTkZJR19GSUxFX1BBVEggPSAiL3ZlbmRvci9ldGMvc2Vuc29ycy9oYWxzLmNvbmYiOworCisvLyBEZXByYWNhdGVkIGJlY2F1c2Ugc3lzdGVtIHBhcnRpdGlvbiBIQUwgY29uZmlnIGZpbGUgZG9lcyBub3Qgc2F0aXNmeSB0cmVibGUgcmVxdWlyZW1lbnRzLgorc3RhdGljIGNvbnN0IGNoYXIqIERFUFJFQ0FURURfTVVMVElfSEFMX0NPTkZJR19GSUxFX1BBVEggPSAiL3N5c3RlbS9ldGMvc2Vuc29ycy9oYWxzLmNvbmYiOworCitzdHJ1Y3Qgc2Vuc29yc19tb2R1bGVfdCAqZ2V0X211bHRpX2hhbF9tb2R1bGVfaW5mbyh2b2lkKTsKKworI2VuZGlmIC8vIEhBUkRXQVJFX0xJQkhBUkRXQVJFX01PRFVMRVNfU0VOU09SU19NVUxUSUhBTF9IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL3Rlc3RzL1NlbnNvckV2ZW50UXVldWVfdGVzdC5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvdGVzdHMvU2Vuc29yRXZlbnRRdWV1ZV90ZXN0LmNwcAppbmRleCAzMjE4YmI5Li5kM2Q3NWVlIDEwMDY0NAotLS0gYS9tb2R1bGVzL3NlbnNvcnMvdGVzdHMvU2Vuc29yRXZlbnRRdWV1ZV90ZXN0LmNwcAorKysgYi9tb2R1bGVzL3NlbnNvcnMvdGVzdHMvU2Vuc29yRXZlbnRRdWV1ZV90ZXN0LmNwcApAQCAtMzIsNyArMzIsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIGNoZWNrSW50KGNoYXIqIG1zZywgaW50IGV4cGVjdGVkLCBpbnQgYWN0dWFsKSB7Citib29sIGNoZWNrSW50KGNvbnN0IGNoYXIqIG1zZywgaW50IGV4cGVjdGVkLCBpbnQgYWN0dWFsKSB7CiAgICAgaWYgKGFjdHVhbCAhPSBleHBlY3RlZCkgewogICAgICAgICBwcmludGYoIiVzOyBleHBlY3RlZCAlZDsgYWN0dWFsIHdhcyAlZFxuIiwgbXNnLCBleHBlY3RlZCwgYWN0dWFsKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiB9CiAKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CitpbnQgbWFpbihpbnQgYXJnYyBfX2F0dHJpYnV0ZSgodW51c2VkKSksIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlKCh1bnVzZWQpKSkgewogICAgIGlmICh0ZXN0U2ltcGxlV3JpdGVTaXplQ291bnRzKCkgJiYKICAgICAgICAgICAgIHRlc3RXcmFwcGluZ1dyaXRlU2l6ZUNvdW50cygpICYmCiAgICAgICAgICAgICB0ZXN0RnVsbFF1ZXVlSW8oKSkgewpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tayBiL21vZHVsZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKaW5kZXggYmI1ODA1My4uODI1MGY5YiAxMDA2NDQKLS0tIGEvbW9kdWxlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCkBAIC0xOSw2ICsxOSw3IEBACiAKIExPQ0FMX01PRFVMRSA6PSBzb3VuZF90cmlnZ2VyLnN0dWIuZGVmYXVsdAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9TUkNfRklMRVMgOj0gc291bmRfdHJpZ2dlcl9ody5jCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9tb2R1bGVzL3RoZXJtYWwvQW5kcm9pZC5tayBiL21vZHVsZXMvdGhlcm1hbC9BbmRyb2lkLm1rCmluZGV4IDgwYWQ3OGEuLmZmNTExNDUgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdGhlcm1hbC9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvdGhlcm1hbC9BbmRyb2lkLm1rCkBAIC0xOCw2ICsxOCw3IEBACiAKIExPQ0FMX01PRFVMRSA6PSB0aGVybWFsLmRlZmF1bHQKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfU1JDX0ZJTEVTIDo9IHRoZXJtYWwuYwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliY3V0aWxzCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbApkaWZmIC0tZ2l0IGEvbW9kdWxlcy90dl9pbnB1dC9BbmRyb2lkLmJwIGIvbW9kdWxlcy90dl9pbnB1dC9BbmRyb2lkLmJwCmluZGV4IGJlYWMxMzIuLjUwOTE5OGQgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdHZfaW5wdXQvQW5kcm9pZC5icAorKysgYi9tb2R1bGVzL3R2X2lucHV0L0FuZHJvaWQuYnAKQEAgLTE1LDYgKzE1LDcgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAidHZfaW5wdXQuZGVmYXVsdCIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL21vZHVsZXMvdHZfaW5wdXQvdHZfaW5wdXQuY3BwIGIvbW9kdWxlcy90dl9pbnB1dC90dl9pbnB1dC5jcHAKaW5kZXggZjkzY2IyMC4uNGM0MjUxOCAxMDA2NDQKLS0tIGEvbW9kdWxlcy90dl9pbnB1dC90dl9pbnB1dC5jcHAKKysrIGIvbW9kdWxlcy90dl9pbnB1dC90dl9pbnB1dC5jcHAKQEAgLTM3LDE4ICszNywxOCBAQAogICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGh3X21vZHVsZV9tZXRob2RzX3QgdHZfaW5wdXRfbW9kdWxlX21ldGhvZHMgPSB7Ci0gICAgb3BlbjogdHZfaW5wdXRfZGV2aWNlX29wZW4KKyAgICAub3BlbiA9IHR2X2lucHV0X2RldmljZV9vcGVuCiB9OwogCiB0dl9pbnB1dF9tb2R1bGVfdCBIQUxfTU9EVUxFX0lORk9fU1lNID0gewotICAgIGNvbW1vbjogewotICAgICAgICB0YWc6IEhBUkRXQVJFX01PRFVMRV9UQUcsCi0gICAgICAgIHZlcnNpb25fbWFqb3I6IDAsCi0gICAgICAgIHZlcnNpb25fbWlub3I6IDEsCi0gICAgICAgIGlkOiBUVl9JTlBVVF9IQVJEV0FSRV9NT0RVTEVfSUQsCi0gICAgICAgIG5hbWU6ICJTYW1wbGUgVFYgaW5wdXQgbW9kdWxlIiwKLSAgICAgICAgYXV0aG9yOiAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCi0gICAgICAgIG1ldGhvZHM6ICZ0dl9pbnB1dF9tb2R1bGVfbWV0aG9kcywKKyAgICAuY29tbW9uID0geworICAgICAgICAudGFnID0gSEFSRFdBUkVfTU9EVUxFX1RBRywKKyAgICAgICAgLnZlcnNpb25fbWFqb3IgPSAwLAorICAgICAgICAudmVyc2lvbl9taW5vciA9IDEsCisgICAgICAgIC5pZCA9IFRWX0lOUFVUX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAgICAgLm5hbWUgPSAiU2FtcGxlIFRWIGlucHV0IG1vZHVsZSIsCisgICAgICAgIC5hdXRob3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgICAgIC5tZXRob2RzID0gJnR2X2lucHV0X21vZHVsZV9tZXRob2RzLAogICAgIH0KIH07CiAKZGlmZiAtLWdpdCBhL21vZHVsZXMvdXNiYXVkaW8vQW5kcm9pZC5tayBiL21vZHVsZXMvdXNiYXVkaW8vQW5kcm9pZC5tawppbmRleCA5ZGYxZTc5Li5iMzZiZjlmIDEwMDY0NAotLS0gYS9tb2R1bGVzL3VzYmF1ZGlvL0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy91c2JhdWRpby9BbmRyb2lkLm1rCkBAIC0xOCw2ICsxOCw3IEBACiAKIExPQ0FMX01PRFVMRSA6PSBhdWRpby51c2IuZGVmYXVsdAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCWF1ZGlvX2hhbC5jCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKZGlmZiAtLWdpdCBhL21vZHVsZXMvdXNiYXVkaW8vYXVkaW9faGFsLmMgYi9tb2R1bGVzL3VzYmF1ZGlvL2F1ZGlvX2hhbC5jCmluZGV4IDZhM2M1ZGEuLmRmNGJjMGYgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdXNiYXVkaW8vYXVkaW9faGFsLmMKKysrIGIvbW9kdWxlcy91c2JhdWRpby9hdWRpb19oYWwuYwpAQCAtOTMzLDcgKzkzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKipzdHJlYW1faW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzIC8qX191bnVzZWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSBfX3VudXNlZCkKIHsKICAgICBBTE9HVigiYWRldl9vcGVuX2lucHV0X3N0cmVhbSgpIHJhdGU6JSIgUFJJdTMyICIsIGNoYW5NYXNrOjB4JSIgUFJJWDMyICIsIGZtdDolIiBQUkl1OCwKQEAgLTk4OSw3ICs5ODksNyBAQAogICAgICAgICByZXQgPSBjb25maWctPnNhbXBsZV9yYXRlICE9IGluLT5hZGV2LT5kZXZpY2Vfc2FtcGxlX3JhdGUgPyAtRUlOVkFMIDogMDsKICAgICAgICAgcHJveHlfY29uZmlnLnJhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlID0gaW4tPmFkZXYtPmRldmljZV9zYW1wbGVfcmF0ZTsKICAgICB9IGVsc2UgaWYgKHByb2ZpbGVfaXNfc2FtcGxlX3JhdGVfdmFsaWQoaW4tPnByb2ZpbGUsIGNvbmZpZy0+c2FtcGxlX3JhdGUpKSB7Ci0gICAgICAgIGluLT5hZGV2LT5kZXZpY2Vfc2FtcGxlX3JhdGUgPSBwcm94eV9jb25maWcucmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGU7CisgICAgICAgIHByb3h5X2NvbmZpZy5yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKICAgICB9IGVsc2UgewogICAgICAgICBwcm94eV9jb25maWcucmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGUgPSBwcm9maWxlX2dldF9kZWZhdWx0X3NhbXBsZV9yYXRlKGluLT5wcm9maWxlKTsKICAgICAgICAgcmV0ID0gLUVJTlZBTDsKQEAgLTEwNTMsMTggKzEwNTMsMjkgQEAKICAgICAgICAgLy8gYW5kIHN0b3JlIFRIQVQgaW4gcHJveHlfY29uZmlnLmNoYW5uZWxzCiAgICAgICAgIHByb3h5X2NvbmZpZy5jaGFubmVscyA9CiAgICAgICAgICAgICAgICAgcHJvZmlsZV9nZXRfY2xvc2VzdF9jaGFubmVsX2NvdW50KGluLT5wcm9maWxlLCBpbi0+aGFsX2NoYW5uZWxfY291bnQpOwotICAgICAgICBwcm94eV9wcmVwYXJlKCZpbi0+cHJveHksIGluLT5wcm9maWxlLCAmcHJveHlfY29uZmlnKTsKKyAgICAgICAgcmV0ID0gcHJveHlfcHJlcGFyZSgmaW4tPnByb3h5LCBpbi0+cHJvZmlsZSwgJnByb3h5X2NvbmZpZyk7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgaW4tPnN0YW5kYnkgPSB0cnVlOwogCi0gICAgICAgIGluLT5zdGFuZGJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGluLT5jb252ZXJzaW9uX2J1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBpbi0+Y29udmVyc2lvbl9idWZmZXJfc2l6ZSA9IDA7CiAKLSAgICAgICAgaW4tPmNvbnZlcnNpb25fYnVmZmVyID0gTlVMTDsKLSAgICAgICAgaW4tPmNvbnZlcnNpb25fYnVmZmVyX3NpemUgPSAwOworICAgICAgICAgICAgKnN0cmVhbV9pbiA9ICZpbi0+c3RyZWFtOwogCi0gICAgICAgICpzdHJlYW1faW4gPSAmaW4tPnN0cmVhbTsKKyAgICAgICAgICAgIC8qIFNhdmUgdGhpcyBmb3IgYWRldl9kdW1wKCkgKi8KKyAgICAgICAgICAgIGFkZXZfYWRkX3N0cmVhbV90b19saXN0KGluLT5hZGV2LCAmaW4tPmFkZXYtPmlucHV0X3N0cmVhbV9saXN0LCAmaW4tPmxpc3Rfbm9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygicHJveHlfcHJlcGFyZSBlcnJvciAlZCIsIHJldCk7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50ID0gcHJveHlfZ2V0X2NoYW5uZWxfY291bnQoJmluLT5wcm94eSk7CisgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzayA9IGNoYW5uZWxfY291bnQgPD0gRkNDXzIKKyAgICAgICAgICAgICAgICA/IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGNoYW5uZWxfY291bnQpCisgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX21hc2tfZm9yX2luZGV4X2Fzc2lnbm1lbnRfZnJvbV9jb3VudChjaGFubmVsX2NvdW50KTsKKyAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0ID0gYXVkaW9fZm9ybWF0X2Zyb21fcGNtX2Zvcm1hdChwcm94eV9nZXRfZm9ybWF0KCZpbi0+cHJveHkpKTsKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUgPSBwcm94eV9nZXRfc2FtcGxlX3JhdGUoJmluLT5wcm94eSk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgLyogU2F2ZSB0aGlzIGZvciBhZGV2X2R1bXAoKSAqLwotICAgICAgICBhZGV2X2FkZF9zdHJlYW1fdG9fbGlzdChpbi0+YWRldiwgJmluLT5hZGV2LT5pbnB1dF9zdHJlYW1fbGlzdCwgJmluLT5saXN0X25vZGUpOwotICAgIH0gZWxzZSB7CisgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgIC8vIERlYWxsb2NhdGUgdGhpcyBzdHJlYW0gb24gZXJyb3IsIGJlY2F1c2UgQXVkaW9GbGluZ2VyIHdvbid0IGNhbGwKICAgICAgICAgLy8gYWRldl9jbG9zZV9pbnB1dF9zdHJlYW0oKSBpbiB0aGlzIGNhc2UuCiAgICAgICAgICpzdHJlYW1faW4gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy91c2JjYW1lcmEvQ2FtZXJhLmNwcCBiL21vZHVsZXMvdXNiY2FtZXJhL0NhbWVyYS5jcHAKaW5kZXggNTAwYTk4Mi4uMDMyNGRhOCAxMDA2NDQKLS0tIGEvbW9kdWxlcy91c2JjYW1lcmEvQ2FtZXJhLmNwcAorKysgYi9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmEuY3BwCkBAIC00OTEsOSArNDkxLDkgQEAKICAgICAvLyBUT0RPOiBkdW1wIGFsbCBzZXR0aW5ncwogICAgIGRwcmludGYoZmQsICJNb3N0IFJlY2VudCBTZXR0aW5nczogKCVwKVxuIiwgbVNldHRpbmdzKTsKIAotICAgIGRwcmludGYoZmQsICJOdW1iZXIgb2Ygc3RyZWFtczogJWRcbiIsIG1TdHJlYW1zLnNpemUoKSk7CisgICAgZHByaW50ZihmZCwgIk51bWJlciBvZiBzdHJlYW1zOiAlenVcbiIsIG1TdHJlYW1zLnNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBkcHJpbnRmKGZkLCAiU3RyZWFtICVkLyVkOlxuIiwgaSwgbVN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgZHByaW50ZihmZCwgIlN0cmVhbSAlenUvJXp1OlxuIiwgaSwgbVN0cmVhbXMuc2l6ZSgpKTsKICAgICAgICAgbVN0cmVhbXNbaV0tPmR1bXAoZmQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21vZHVsZXMvdXNiY2FtZXJhL0NhbWVyYUhBTC5jcHAgYi9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmFIQUwuY3BwCmluZGV4IGVlYzEwNDQuLjFhNWViM2EgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdXNiY2FtZXJhL0NhbWVyYUhBTC5jcHAKKysrIGIvbW9kdWxlcy91c2JjYW1lcmEvQ2FtZXJhSEFMLmNwcApAQCAtNjksNyArNjksNyBAQAogCiBpbnQgQ2FtZXJhSEFMOjpnZXROdW1iZXJPZkNhbWVyYXMoKSB7CiAgICAgYW5kcm9pZDo6TXV0ZXg6OkF1dG9sb2NrIGFsKG1Nb2R1bGVMb2NrKTsKLSAgICBBTE9HVigiJXM6ICVkIiwgX19mdW5jX18sIG1DYW1lcmFzLnNpemUoKSk7CisgICAgQUxPR1YoIiVzOiAlenUiLCBfX2Z1bmNfXywgbUNhbWVyYXMuc2l6ZSgpKTsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtQ2FtZXJhcy5zaXplKCkpOwogfQogCkBAIC0xMzAsMjkgKzEzMCwyOSBAQAogfQogCiBzdGF0aWMgaHdfbW9kdWxlX21ldGhvZHNfdCBnQ2FtZXJhTW9kdWxlTWV0aG9kcyA9IHsKLSAgICBvcGVuIDogb3Blbl9kZXYKKyAgICAub3BlbiA9IG9wZW5fZGV2CiB9OwogCiBjYW1lcmFfbW9kdWxlX3QgSEFMX01PRFVMRV9JTkZPX1NZTSBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgPSB7Ci0gICAgY29tbW9uIDogewotICAgICAgICB0YWcgICAgICAgICAgICAgICAgOiBIQVJEV0FSRV9NT0RVTEVfVEFHLAotICAgICAgICBtb2R1bGVfYXBpX3ZlcnNpb24gOiBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCwKLSAgICAgICAgaGFsX2FwaV92ZXJzaW9uICAgIDogSEFSRFdBUkVfSEFMX0FQSV9WRVJTSU9OLAotICAgICAgICBpZCAgICAgICAgICAgICAgICAgOiBDQU1FUkFfSEFSRFdBUkVfTU9EVUxFX0lELAotICAgICAgICBuYW1lICAgICAgICAgICAgICAgOiAiRGVmYXVsdCBVU0IgQ2FtZXJhIEhBTCIsCi0gICAgICAgIGF1dGhvciAgICAgICAgICAgICA6ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKLSAgICAgICAgbWV0aG9kcyAgICAgICAgICAgIDogJmdDYW1lcmFNb2R1bGVNZXRob2RzLAotICAgICAgICBkc28gICAgICAgICAgICAgICAgOiBOVUxMLAotICAgICAgICByZXNlcnZlZCAgICAgICAgICAgOiB7MH0sCisgICAgLmNvbW1vbiA9IHsKKyAgICAgICAgLnRhZyAgICAgICAgICAgICAgICA9IEhBUkRXQVJFX01PRFVMRV9UQUcsCisgICAgICAgIC5tb2R1bGVfYXBpX3ZlcnNpb24gPSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCwKKyAgICAgICAgLmhhbF9hcGlfdmVyc2lvbiAgICA9IEhBUkRXQVJFX0hBTF9BUElfVkVSU0lPTiwKKyAgICAgICAgLmlkICAgICAgICAgICAgICAgICA9IENBTUVSQV9IQVJEV0FSRV9NT0RVTEVfSUQsCisgICAgICAgIC5uYW1lICAgICAgICAgICAgICAgPSAiRGVmYXVsdCBVU0IgQ2FtZXJhIEhBTCIsCisgICAgICAgIC5hdXRob3IgICAgICAgICAgICAgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgICAgIC5tZXRob2RzICAgICAgICAgICAgPSAmZ0NhbWVyYU1vZHVsZU1ldGhvZHMsCisgICAgICAgIC5kc28gICAgICAgICAgICAgICAgPSBOVUxMLAorICAgICAgICAucmVzZXJ2ZWQgICAgICAgICAgID0gezB9LAogICAgIH0sCi0gICAgZ2V0X251bWJlcl9vZl9jYW1lcmFzIDogZ2V0X251bWJlcl9vZl9jYW1lcmFzLAotICAgIGdldF9jYW1lcmFfaW5mbyAgICAgICA6IGdldF9jYW1lcmFfaW5mbywKLSAgICBzZXRfY2FsbGJhY2tzICAgICAgICAgOiBzZXRfY2FsbGJhY2tzLAotICAgIGdldF92ZW5kb3JfdGFnX29wcyAgICA6IE5VTEwsCi0gICAgb3Blbl9sZWdhY3kgICAgICAgICAgIDogTlVMTCwKLSAgICBzZXRfdG9yY2hfbW9kZSAgICAgICAgOiBOVUxMLAotICAgIGluaXQgICAgICAgICAgICAgICAgICA6IE5VTEwsCi0gICAgcmVzZXJ2ZWQgICAgICAgICAgICAgIDogezB9LAorICAgIC5nZXRfbnVtYmVyX29mX2NhbWVyYXMgPSBnZXRfbnVtYmVyX29mX2NhbWVyYXMsCisgICAgLmdldF9jYW1lcmFfaW5mbyAgICAgICA9IGdldF9jYW1lcmFfaW5mbywKKyAgICAuc2V0X2NhbGxiYWNrcyAgICAgICAgID0gc2V0X2NhbGxiYWNrcywKKyAgICAuZ2V0X3ZlbmRvcl90YWdfb3BzICAgID0gTlVMTCwKKyAgICAub3Blbl9sZWdhY3kgICAgICAgICAgID0gTlVMTCwKKyAgICAuc2V0X3RvcmNoX21vZGUgICAgICAgID0gTlVMTCwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gTlVMTCwKKyAgICAucmVzZXJ2ZWQgICAgICAgICAgICAgID0gezB9LAogfTsKIH0gLy8gZXh0ZXJuICJDIgogCmRpZmYgLS1naXQgYS9tb2R1bGVzL3VzYmNhbWVyYS9Ib3RwbHVnVGhyZWFkLmNwcCBiL21vZHVsZXMvdXNiY2FtZXJhL0hvdHBsdWdUaHJlYWQuY3BwCmluZGV4IDgwZjE4YzguLjYxODhlZGUgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdXNiY2FtZXJhL0hvdHBsdWdUaHJlYWQuY3BwCisrKyBiL21vZHVsZXMvdXNiY2FtZXJhL0hvdHBsdWdUaHJlYWQuY3BwCkBAIC00MCw2ICs0MCw3IEBACiB9CiAKIGJvb2wgSG90cGx1Z1RocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICAodm9pZCltTW9kdWxlOyAgLy8gc2lsZW5jZSB3YXJuaW5nIGFib3V0IHVudXNlZCBtZW1iZXIuCiAKICAgICAvKioKICAgICAgKiBDaGVjayBjYW1lcmEgY29ubmVjdGlvbiBzdGF0dXMgY2hhbmdlLCBpZiBjb25uZWN0ZWQsIGRvIGJlbG93OgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy91c2JjYW1lcmEvU3RyZWFtLmNwcCBiL21vZHVsZXMvdXNiY2FtZXJhL1N0cmVhbS5jcHAKaW5kZXggNDVlN2ZjMi4uZDQxODc5OCAxMDA2NDQKLS0tIGEvbW9kdWxlcy91c2JjYW1lcmEvU3RyZWFtLmNwcAorKysgYi9tb2R1bGVzL3VzYmNhbWVyYS9TdHJlYW0uY3BwCkBAIC0xNzIsMTAgKzE3Miw5IEBACiAgICAgLy8gVG9EbzogcHJldHR5cHJpbnQgdXNhZ2UgbWFzayBmbGFncwogICAgIGRwcmludGYoZmQsICJHcmFsbG9jIFVzYWdlIE1hc2s6ICUjIiBQUkl4MzIgIlxuIiwgbVN0cmVhbS0+dXNhZ2UpOwogICAgIGRwcmludGYoZmQsICJNYXggQnVmZmVyIENvdW50OiAlIiBQUkl1MzIgIlxuIiwgbVN0cmVhbS0+bWF4X2J1ZmZlcnMpOwotICAgIGRwcmludGYoZmQsICJOdW1iZXIgb2YgQnVmZmVycyBpbiB1c2UgYnkgSEFMOiAlIiBQUkl1MzIgIlxuIiwgbUJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiTnVtYmVyIG9mIEJ1ZmZlcnMgaW4gdXNlIGJ5IEhBTDogJXp1XG4iLCBtQnVmZmVycy5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZHByaW50ZihmZCwgIkJ1ZmZlciAlIiBQUkl1MzIgIi8lIiBQUkl1MzIgIjogJXBcbiIsIGksIG1CdWZmZXJzLnNpemUoKSwKLSAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXSk7CisgICAgICAgIGRwcmludGYoZmQsICJCdWZmZXIgJXp1LyV6dTogJXBcbiIsIGksIG1CdWZmZXJzLnNpemUoKSwgbUJ1ZmZlcnNbaV0pOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy91c2JjYW1lcmEvVXNiQ2FtZXJhLmNwcCBiL21vZHVsZXMvdXNiY2FtZXJhL1VzYkNhbWVyYS5jcHAKaW5kZXggZWM5NDlhZS4uNjVjYmVjOSAxMDA2NDQKLS0tIGEvbW9kdWxlcy91c2JjYW1lcmEvVXNiQ2FtZXJhLmNwcAorKysgYi9tb2R1bGVzL3VzYmNhbWVyYS9Vc2JDYW1lcmEuY3BwCkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICByZXR1cm4gc2V0VGVtcGxhdGUoQ0FNRVJBM19URU1QTEFURV9NQU5VQUwsIG0uZ2V0KCkpOwogfQogCi1ib29sIFVzYkNhbWVyYTo6aXNWYWxpZENhcHR1cmVTZXR0aW5ncyhjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2V0dGluZ3MpIHsKK2Jvb2wgVXNiQ2FtZXJhOjppc1ZhbGlkQ2FwdHVyZVNldHRpbmdzKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiAvKnNldHRpbmdzKi8pIHsKICAgICAvLyBUT0RPOiByZWplY3Qgc2V0dGluZ3MgdGhhdCBjYW5ub3QgYmUgY2FwdHVyZWQKICAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL21vZHVsZXMvdmVoaWNsZS9BbmRyb2lkLm1rIGIvbW9kdWxlcy92ZWhpY2xlL0FuZHJvaWQubWsKaW5kZXggYTY2NmJjNi4uOWZkNDlkYSAxMDA2NDQKLS0tIGEvbW9kdWxlcy92ZWhpY2xlL0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy92ZWhpY2xlL0FuZHJvaWQubWsKQEAgLTE5LDYgKzE5LDcgQEAKIExPQ0FMX01PRFVMRSA6PSB2ZWhpY2xlLmRlZmF1bHQKIAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9DX0lOQ0xVREVTIDo9IGhhcmR3YXJlL2xpYmhhcmR3YXJlCiBMT0NBTF9TUkNfRklMRVMgOj0gdmVoaWNsZS5jIHRpbWVVdGlsLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliY3V0aWxzIGxpYnV0aWxzCmRpZmYgLS1naXQgYS9tb2R1bGVzL3ZlaGljbGUvdmVoaWNsZS5jIGIvbW9kdWxlcy92ZWhpY2xlL3ZlaGljbGUuYwppbmRleCA3ODU0NWFmLi42NmUyOWMwIDEwMDY0NAotLS0gYS9tb2R1bGVzL3ZlaGljbGUvdmVoaWNsZS5jCisrKyBiL21vZHVsZXMvdmVoaWNsZS92ZWhpY2xlLmMKQEAgLTI3OSwxMCArMjc5LDEwIEBACiAgICAgICAgICAgICBBTE9HRCgiVmFsdWUgdHlwZTogRkxPQVRcblZhbHVlOiAlZlxuIiwgZGF0YS0+dmFsdWUuZmxvYXRfdmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDMyOgotICAgICAgICAgICAgQUxPR0QoIlZhbHVlIHR5cGU6IElOVDMyXG5WYWx1ZTogJWRcbiIsIGRhdGEtPnZhbHVlLmludDMyX3ZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dEKCJWYWx1ZSB0eXBlOiBJTlQzMlxuVmFsdWU6ICUiIFBSSWQzMiAiXG4iLCBkYXRhLT52YWx1ZS5pbnQzMl92YWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UNjQ6Ci0gICAgICAgICAgICBBTE9HRCgiVmFsdWUgdHlwZTogSU5UNjRcblZhbHVlOiAlbGxkXG4iLCBkYXRhLT52YWx1ZS5pbnQ2NF92YWx1ZSk7CisgICAgICAgICAgICBBTE9HRCgiVmFsdWUgdHlwZTogSU5UNjRcblZhbHVlOiAlIiBQUklkNjQgIlxuIiwgZGF0YS0+dmFsdWUuaW50NjRfdmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVkVISUNMRV9WQUxVRV9UWVBFX0JPT0xFQU46CiAgICAgICAgICAgICBBTE9HRCgiVmFsdWUgdHlwZTogQk9PTEVBTlxuVmFsdWU6ICVkXG4iLCBkYXRhLT52YWx1ZS5ib29sZWFuX3ZhbHVlKTsKQEAgLTMzMSwyMiArMzMxLDYgQEAKICAgICAgICAgZXZlbnQucHJvcCA9IHN1Yi0+cHJvcDsKICAgICAgICAgZXZlbnQudGltZXN0YW1wID0gZWxhcHNlZFJlYWx0aW1lTmFubygpOwogICAgICAgICBzd2l0Y2ggKHN1Yi0+cHJvcCkgewotICAgICAgICAgICAgY2FzZSBWRUhJQ0xFX1BST1BFUlRZX0RSSVZJTkdfU1RBVFVTOgotICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlX3R5cGUgPSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UMzI7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICgoZXZlbnQudGltZXN0YW1wICYgMHgzMDAwMDAwMCk+PjI4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlLmRyaXZpbmdfc3RhdHVzID0gVkVISUNMRV9EUklWSU5HX1NUQVRVU19VTlJFU1RSSUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWUuZHJpdmluZ19zdGF0dXMgPSBWRUhJQ0xFX0RSSVZJTkdfU1RBVFVTX05PX1ZJREVPOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlLmRyaXZpbmdfc3RhdHVzID0gVkVISUNMRV9EUklWSU5HX1NUQVRVU19OT19LRVlCT0FSRF9JTlBVVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWUuZHJpdmluZ19zdGF0dXMgPSBWRUhJQ0xFX0RSSVZJTkdfU1RBVFVTX05PX0NPTkZJRzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFZFSElDTEVfUFJPUEVSVFlfR0VBUl9TRUxFQ1RJT046CiAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWVfdHlwZSA9IFZFSElDTEVfVkFMVUVfVFlQRV9JTlQzMjsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKChldmVudC50aW1lc3RhbXAgJiAweDMwMDAwMDAwKT4+MjgpIHsKZGlmZiAtLWdpdCBhL21vZHVsZXMvdmlicmF0b3IvQW5kcm9pZC5icCBiL21vZHVsZXMvdmlicmF0b3IvQW5kcm9pZC5icAppbmRleCBmOWFmZDQ1Li4zYzRhZWJmIDEwMDY0NAotLS0gYS9tb2R1bGVzL3ZpYnJhdG9yL0FuZHJvaWQuYnAKKysrIGIvbW9kdWxlcy92aWJyYXRvci9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgLy8gSEFMIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiBzdG9yZWQgaW4KICAgICAvLyBody88VklCUkFUT1JfSEFSRFdBUkVfTU9EVUxFX0lEPi5kZWZhdWx0LnNvCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIGluY2x1ZGVfZGlyczogWyJoYXJkd2FyZS9saWJoYXJkd2FyZSJdLAogICAgIHNyY3M6IFsidmlicmF0b3IuYyJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmxvZyJdLApkaWZmIC0tZ2l0IGEvbW9kdWxlcy92ci9BbmRyb2lkLm1rIGIvbW9kdWxlcy92ci9BbmRyb2lkLm1rCmluZGV4IDQzYzhlOTIuLmUwNGMwZGEgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdnIvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL3ZyL0FuZHJvaWQubWsKQEAgLTE4LDYgKzE4LDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IHZyLmRlZmF1bHQKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfU1JDX0ZJTEVTIDo9IHZyLmMKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbApkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9BbmRyb2lkLm1rIGIvdGVzdHMvY2FtZXJhMi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVmNDY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQljYW1lcmEyX3V0aWxzLmNwcCBcCi0JbWFpbi5jcHAgXAotCUNhbWVyYU1ldGFkYXRhVGVzdHMuY3BwIFwKLQlDYW1lcmFNb2R1bGVUZXN0cy5jcHAgXAotCUNhbWVyYVN0cmVhbVRlc3RzLmNwcCBcCi0JQ2FtZXJhRnJhbWVUZXN0cy5jcHAgXAotCUNhbWVyYUJ1cnN0VGVzdHMuY3BwIFwKLQlDYW1lcmFNdWx0aVN0cmVhbVRlc3RzLmNwcFwKLQlGb3JrZWRUZXN0cy5jcHAgXAotCVRlc3RGb3JrZXJFdmVudExpc3RlbmVyLmNwcCBcCi0JVGVzdFNldHRpbmdzLmNwcCBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmxvZyBcCi0JbGlidXRpbHMgXAotCWxpYmN1dGlscyBcCi0JbGliaGFyZHdhcmUgXAotCWxpYmNhbWVyYV9tZXRhZGF0YSBcCi0JbGliY2FtZXJhc2VydmljZSBcCi0JbGliY2FtZXJhX2NsaWVudCBcCi0JbGliZ3VpIFwKLQlsaWJzeW5jIFwKLQlsaWJ1aSBcCi0JbGliZGwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0Jc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKLQlmcmFtZXdvcmtzL2F2L2luY2x1ZGUvIFwKLQlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlIFwKLQlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEKLUxPQ0FMX01PRFVMRTo9IGNhbWVyYTJfdGVzdAotTE9DQUxfTU9EVUxFX1NURU1fMzIgOj0gY2FtZXJhMl90ZXN0Ci1MT0NBTF9NT0RVTEVfU1RFTV82NCA6PSBjYW1lcmEyX3Rlc3Q2NAotTE9DQUxfTVVMVElMSUIgOj0gYm90aAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFCdXJzdFRlc3RzLmNwcCBiL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhQnVyc3RUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGMwYzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFCdXJzdFRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDczMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2RlZmluZSBMT0dfVEFHICJDYW1lcmFCdXJzdFRlc3QiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgIkNhbWVyYVN0cmVhbUZpeHR1cmUuaCIKLSNpbmNsdWRlICJUZXN0RXh0ZW5zaW9ucy5oIgotCi0jZGVmaW5lIENBTUVSQV9GUkFNRV9USU1FT1VUICAgIDEwMDAwMDAwMDBMTCAvL25zZWNzICgxIHNlY3MpCi0jZGVmaW5lIENBTUVSQV9IRUFQX0NPVU5UICAgICAgIDIgLy9IQUxCVUc6IDEgbWVhbnMgcmVnaXN0ZXJCdWZmZXJzIGZhaWxzCi0jZGVmaW5lIENBTUVSQV9CVVJTVF9ERUJVR0dJTkcgIDAKLSNkZWZpbmUgQ0FNRVJBX0ZSQU1FX0JVUlNUX0NPVU5UIDEwCi0KLS8qIGNvbnN0YW50cyBmb3IgdGhlIGV4cG9zdXJlIHRlc3QgKi8KLSNkZWZpbmUgQ0FNRVJBX0VYUE9TVVJFX0RPVUJMRSAgMgotI2RlZmluZSBDQU1FUkFfRVhQT1NVUkVfRE9VQkxJTkdfVEhSRVNIT0xEIDEuMGYKLSNkZWZpbmUgQ0FNRVJBX0VYUE9TVVJFX0RPVUJMSU5HX0NPVU5UIDQKLSNkZWZpbmUgQ0FNRVJBX0VYUE9TVVJFX0ZPUk1BVCBDQU1FUkFfU1RSRUFNX0FVVE9fQ1BVX0ZPUk1BVAotI2RlZmluZSBDQU1FUkFfRVhQT1NVUkVfU1RBUlRJTkcgMTAwMDAwIC8vIDEvMTBtcywgdXAgdG8gNTEuMm1zIHdpdGggMTAgc3RlcHMKLQotI2RlZmluZSBVU0VDIDEwMDBMTCAgICAgICAgLy8gaW4gbnMKLSNkZWZpbmUgTVNFQyAxMDAwMDAwTEwgICAgIC8vIGluIG5zCi0jZGVmaW5lIFNFQyAgMTAwMDAwMDAwMExMICAvLyBpbiBucwotCi0jaWYgQ0FNRVJBX0JVUlNUX0RFQlVHR0lORwotI2RlZmluZSBkb3V0IHN0ZDo6Y291dAotI2Vsc2UKLSNkZWZpbmUgZG91dCBpZiAoMCkgc3RkOjpjb3V0Ci0jZW5kaWYKLQotI2RlZmluZSBXQVJOX1VOTEVTUyhjb25kaXRpb24pIGlmKCEoY29uZGl0aW9uKSkgc3RkOjpjZXJyIDw8ICJXYXJuaW5nOiAiCi0jZGVmaW5lIFdBUk5fTEUoZXhwLCBhY3QpIFdBUk5fVU5MRVNTKChleHApIDw9IChhY3QpKQotI2RlZmluZSBXQVJOX0xUKGV4cCwgYWN0KSBXQVJOX1VOTEVTUygoZXhwKSA8IChhY3QpKQotI2RlZmluZSBXQVJOX0dUKGV4cCwgYWN0KSBXQVJOX1VOTEVTUygoZXhwKSA+IChhY3QpKQotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEyOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi1zdGF0aWMgQ2FtZXJhU3RyZWFtUGFyYW1zIFNUUkVBTV9QQVJBTUVURVJTID0gewotICAgIC8qbUZvcm1hdCovICAgICBDQU1FUkFfRVhQT1NVUkVfRk9STUFULAotICAgIC8qbUhlYXBDb3VudCovICBDQU1FUkFfSEVBUF9DT1VOVAotfTsKLQotY2xhc3MgQ2FtZXJhQnVyc3RUZXN0Ci0gICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0LAotICAgICAgcHVibGljIENhbWVyYVN0cmVhbUZpeHR1cmUgewotCi1wdWJsaWM6Ci0gICAgQ2FtZXJhQnVyc3RUZXN0KCkgOiBDYW1lcmFTdHJlYW1GaXh0dXJlKFNUUkVBTV9QQVJBTUVURVJTKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfQ09OU1RSVUNUT1I7Ci0KLSAgICAgICAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDcmVhdGVTdHJlYW0oKTsKLSAgICB9Ci0KLSAgICB+Q2FtZXJhQnVyc3RUZXN0KCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0RFU1RSVUNUT1I7Ci0KLSAgICAgICAgaWYgKG1EZXZpY2UuZ2V0KCkpIHsKLSAgICAgICAgICAgIG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKLSAgICAgICAgfQotICAgICAgICBEZWxldGVTdHJlYW0oKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfU0VUX1VQOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfVEVBUl9ET1dOOwotICAgIH0KLQotICAgIC8qIHRoaXMgYXNzdW1lcyB0aGUgZm9ybWF0IGlzIFlVVjQyMHNwIG9yIGZsZXhpYmxlIFlVViAqLwotICAgIGxvbmcgbG9uZyBUb3RhbEJyaWdodG5lc3MoY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciYgaW1nQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp1bmRlcmV4cG9zZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm92ZXJleHBvc2VkKSBjb25zdCB7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCogYnVmID0gaW1nQnVmZmVyLmRhdGE7Ci0gICAgICAgIHNpemVfdCBzdHJpZGUgPSBpbWdCdWZmZXIuc3RyaWRlOwotCi0gICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgWSBwbGFuZSBvbmx5ICovCi0gICAgICAgIGxvbmcgbG9uZyBhY2MgPSAwOwotCi0gICAgICAgICp1bmRlcmV4cG9zZWQgPSAwOwotICAgICAgICAqb3ZlcmV4cG9zZWQgPSAwOwotCi0gICAgICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaW1nQnVmZmVyLmhlaWdodDsgKyt5KSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IGltZ0J1ZmZlci53aWR0aDsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBwID0gYnVmW3kgKiBzdHJpZGUgKyB4XTsKLQotICAgICAgICAgICAgICAgIGlmIChwID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVuZGVyZXhwb3NlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKysqdW5kZXJleHBvc2VkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocCA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJleHBvc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArKypvdmVyZXhwb3NlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhY2MgKz0gcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhY2M7Ci0gICAgfQotCi0gICAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyBsaXN0IGludG8gYSBWZWN0b3IKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHZvaWQgUGFyc2VMaXN0KGNvbnN0IGNoYXIgKnNyYywgVmVjdG9yPFQ+ICZsaXN0KSB7Ci0gICAgICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBzKHNyYyk7Ci0gICAgICAgIHdoaWxlICghcy5lb2YoKSkgewotICAgICAgICAgICAgY2hhciBjID0gcy5wZWVrKCk7Ci0gICAgICAgICAgICBpZiAoYyA9PSAnLCcgfHwgYyA9PSAnICcpIHsKLSAgICAgICAgICAgICAgICBzLmlnbm9yZSgxLCBFT0YpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVCB2YWw7Ci0gICAgICAgICAgICBzID4+IHZhbDsKLSAgICAgICAgICAgIGxpc3QucHVzaF9iYWNrKHZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX07Ci0KLVRFU1RfRihDYW1lcmFCdXJzdFRlc3QsIE1hbnVhbEV4cG9zdXJlQ29udHJvbCkgewotCi0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotCi0gICAgLy8gUmFuZ2Ugb2YgdmFsaWQgZXhwb3N1cmUgdGltZXMsIGluIG5hbm9zZWNvbmRzCi0gICAgaW50NjRfdCBtaW5FeHAsIG1heEV4cDsKLSAgICB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBleHBvc3VyZVRpbWVSYW5nZSA9Ci0gICAgICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NFTlNPUl9JTkZPX0VYUE9TVVJFX1RJTUVfUkFOR0UpOwotCi0gICAgICAgIEFTU0VSVF9FUSgydSwgZXhwb3N1cmVUaW1lUmFuZ2UuY291bnQpOwotICAgICAgICBtaW5FeHAgPSBleHBvc3VyZVRpbWVSYW5nZS5kYXRhLmk2NFswXTsKLSAgICAgICAgbWF4RXhwID0gZXhwb3N1cmVUaW1lUmFuZ2UuZGF0YS5pNjRbMV07Ci0gICAgfQotCi0gICAgZG91dCA8PCAiTWluIGV4cG9zdXJlIGlzICIgPDwgbWluRXhwOwotICAgIGRvdXQgPDwgIiBtYXggZXhwb3N1cmUgaXMgIiA8PCBtYXhFeHAgPDwgc3RkOjplbmRsOwotCi0gICAgLy8gQ2FsY3VsYXRlIHNvbWUgc2V0IG9mIHZhbGlkIGV4cG9zdXJlIHRpbWVzIGZvciBlYWNoIHJlcXVlc3QKLSAgICBpbnQ2NF90IGV4cG9zdXJlc1tDQU1FUkFfRlJBTUVfQlVSU1RfQ09VTlRdOwotICAgIGV4cG9zdXJlc1swXSA9IENBTUVSQV9FWFBPU1VSRV9TVEFSVElORzsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IENBTUVSQV9GUkFNRV9CVVJTVF9DT1VOVDsgKytpKSB7Ci0gICAgICAgIGV4cG9zdXJlc1tpXSA9IGV4cG9zdXJlc1tpLTFdICogQ0FNRVJBX0VYUE9TVVJFX0RPVUJMRTsKLSAgICB9Ci0gICAgLy8gT3VyIGNhbGN1bGF0ZWQgZXhwb3N1cmUgdGltZXMgc2hvdWxkIGJlIGluIFttaW5FeHAsIG1heEV4cF0KLSAgICBFWFBFQ1RfTEUobWluRXhwLCBleHBvc3VyZXNbMF0pCi0gICAgICAgIDw8ICJNaW5pbXVtIGV4cG9zdXJlIHJhbmdlIGlzIHRvbyBoaWdoLCB3YW50ZWQgYXQgbW9zdCAiCi0gICAgICAgIDw8IGV4cG9zdXJlc1swXSA8PCAibnMiOwotICAgIEVYUEVDVF9HRShtYXhFeHAsIGV4cG9zdXJlc1tDQU1FUkFfRlJBTUVfQlVSU1RfQ09VTlQtMV0pCi0gICAgICAgIDw8ICJNYXhpbXVtIGV4cG9zdXJlIHJhbmdlIGlzIHRvbyBsb3csIHdhbnRlZCBhdCBsZWFzdCAiCi0gICAgICAgIDw8IGV4cG9zdXJlc1tDQU1FUkFfRlJBTUVfQlVSU1RfQ09VTlQtMV0gPDwgIm5zIjsKLQotICAgIC8vIENyZWF0ZSBhIHByZXZpZXcgcmVxdWVzdCwgdHVybmluZyBvZmYgYWxsIDNBCi0gICAgQ2FtZXJhTWV0YWRhdGEgcHJldmlld1JlcXVlc3Q7Ci0gICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEyX1RFTVBMQVRFX1BSRVZJRVcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1JlcXVlc3QpKTsKLSAgICB7Ci0gICAgICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7Ci0gICAgICAgIG91dHB1dFN0cmVhbUlkcy5wdXNoKG1TdHJlYW1JZCk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzKSk7Ci0KLSAgICAgICAgLy8gRGlzYWJsZSBhbGwgM0Egcm91dGluZXMKLSAgICAgICAgdWludDhfdCBjbU9mZiA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEFORFJPSURfQ09OVFJPTF9NT0RFX09GRik7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKEFORFJPSURfQ09OVFJPTF9NT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21PZmYsIDEpKTsKLQotICAgICAgICBpbnQgcmVxdWVzdElkID0gMTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBwcmV2aWV3UmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdElkLCAxKSk7Ci0KLSAgICAgICAgaWYgKENBTUVSQV9CVVJTVF9ERUJVR0dJTkcpIHsKLSAgICAgICAgICAgIGludCBmcmFtZUNvdW50ID0gMDsKLSAgICAgICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZUNvdW50LCAxKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoQ0FNRVJBX0JVUlNUX0RFQlVHR0lORykgewotICAgICAgICBwcmV2aWV3UmVxdWVzdC5kdW1wKFNURE9VVF9GSUxFTk8pOwotICAgIH0KLQotICAgIC8vIFN1Ym1pdCBjYXB0dXJlIHJlcXVlc3RzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDQU1FUkFfRlJBTUVfQlVSU1RfQ09VTlQ7ICsraSkgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSB0bXBSZXF1ZXN0ID0gcHJldmlld1JlcXVlc3Q7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgdG1wUmVxdWVzdC51cGRhdGUoQU5EUk9JRF9TRU5TT1JfRVhQT1NVUkVfVElNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhwb3N1cmVzW2ldLCAxKSk7Ci0gICAgICAgIEFMT0dWKCJTdWJtaXR0aW5nIGNhcHR1cmUgcmVxdWVzdCAlZCB3aXRoIGV4cG9zdXJlICUiIFBSSWQ2NCwgaSwKLSAgICAgICAgICAgIGV4cG9zdXJlc1tpXSk7Ci0gICAgICAgIGRvdXQgPDwgIkNhcHR1cmUgcmVxdWVzdCAiIDw8IGkgPDwgIiBleHBvc3VyZSBpcyAiCi0gICAgICAgICAgICAgPDwgKGV4cG9zdXJlc1tpXS8xZTZmKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Y2FwdHVyZSh0bXBSZXF1ZXN0KSk7Ci0gICAgfQotCi0gICAgZG91dCA8PCAiQnVmZmVyIGRpbWVuc2lvbnMgIiA8PCBtV2lkdGggPDwgIngiIDw8IG1IZWlnaHQgPDwgc3RkOjplbmRsOwotCi0gICAgZmxvYXQgYnJpZ2h0bmVzc2VzW0NBTUVSQV9GUkFNRV9CVVJTVF9DT1VOVF07Ci0gICAgLy8gR2V0IGVhY2ggZnJhbWUgKG1ldGFkYXRhKSBhbmQgdGhlbiB0aGUgYnVmZmVyLiBDYWxjdWxhdGUgYnJpZ2h0bmVzcy4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IENBTUVSQV9GUkFNRV9CVVJTVF9DT1VOVDsgKytpKSB7Ci0gICAgICAgIEFMT0dWKCJSZWFkaW5nIGNhcHR1cmUgcmVxdWVzdCAlZCB3aXRoIGV4cG9zdXJlICUiIFBSSWQ2NCwgaSwgZXhwb3N1cmVzW2ldKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT53YWl0Rm9yTmV4dEZyYW1lKENBTUVSQV9GUkFNRV9USU1FT1VUKSk7Ci0gICAgICAgIEFMT0dWKCJSZWFkaW5nIGNhcHR1cmUgcmVxdWVzdC0xICVkIiwgaSk7Ci0gICAgICAgIENhcHR1cmVSZXN1bHQgcmVzdWx0OwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmdldE5leHRSZXN1bHQoJnJlc3VsdCkpOwotICAgICAgICBBTE9HVigiUmVhZGluZyBjYXB0dXJlIHJlcXVlc3QtMiAlZCIsIGkpOwotCi0gICAgICAgIEFTU0VSVF9FUShPSywgbUZyYW1lTGlzdGVuZXItPndhaXRGb3JGcmFtZShDQU1FUkFfRlJBTUVfVElNRU9VVCkpOwotICAgICAgICBBTE9HVigiV2UgZ290IHRoZSBmcmFtZSBub3ciKTsKLQotICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtQ3B1Q29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpKTsKLQotICAgICAgICBpbnQgdW5kZXJleHBvc2VkLCBvdmVyZXhwb3NlZDsKLSAgICAgICAgbG9uZyBsb25nIGJyaWdodG5lc3MgPSBUb3RhbEJyaWdodG5lc3MoaW1nQnVmZmVyLCAmdW5kZXJleHBvc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZlcmV4cG9zZWQpOwotICAgICAgICBmbG9hdCBhdmdCcmlnaHRuZXNzID0gYnJpZ2h0bmVzcyAqIDEuMGYgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1XaWR0aCAqIG1IZWlnaHQgLSAodW5kZXJleHBvc2VkICsgb3ZlcmV4cG9zZWQpKTsKLSAgICAgICAgQUxPR1YoIlRvdGFsIGJyaWdodG5lc3MgZm9yIGZyYW1lICVkIHdhcyAlbGxkICh1bmRlcmV4cG9zZWQgJWQsICIKLSAgICAgICAgICAgICAgIm92ZXJleHBvc2VkICVkKSwgYXZnICVmIiwgaSwgYnJpZ2h0bmVzcywgdW5kZXJleHBvc2VkLAotICAgICAgICAgICAgICBvdmVyZXhwb3NlZCwgYXZnQnJpZ2h0bmVzcyk7Ci0gICAgICAgIGRvdXQgPDwgIkF2ZXJhZ2UgYnJpZ2h0bmVzcyAoZnJhbWUgIiA8PCBpIDw8ICIpIHdhcyAiIDw8IGF2Z0JyaWdodG5lc3MKLSAgICAgICAgICAgICA8PCAiICh1bmRlcmV4cG9zZWQgIiA8PCB1bmRlcmV4cG9zZWQgPDwgIiwgb3ZlcmV4cG9zZWQgIgotICAgICAgICAgICAgIDw8IG92ZXJleHBvc2VkIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtQ3B1Q29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpKTsKLQotICAgICAgICBicmlnaHRuZXNzZXNbaV0gPSBhdmdCcmlnaHRuZXNzOwotICAgIH0KLQotICAgIC8vIENhbGN1bGF0ZSBtYXggY29uc2VjdXRpdmUgZnJhbWUgZXhwb3N1cmUgZG91YmxpbmcKLSAgICBmbG9hdCBwcmV2ID0gYnJpZ2h0bmVzc2VzWzBdOwotICAgIGludCBkb3VibGluZ19jb3VudCA9IDE7Ci0gICAgaW50IG1heF9kb3VibGluZ19jb3VudCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBDQU1FUkFfRlJBTUVfQlVSU1RfQ09VTlQ7ICsraSkgewotICAgICAgICBpZiAoZmFicyhicmlnaHRuZXNzZXNbaV0gLSBwcmV2KkNBTUVSQV9FWFBPU1VSRV9ET1VCTEUpCi0gICAgICAgICAgICA8PSBDQU1FUkFfRVhQT1NVUkVfRE9VQkxJTkdfVEhSRVNIT0xEKSB7Ci0gICAgICAgICAgICBkb3VibGluZ19jb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbWF4X2RvdWJsaW5nX2NvdW50ID0gc3RkOjptYXgobWF4X2RvdWJsaW5nX2NvdW50LCBkb3VibGluZ19jb3VudCk7Ci0gICAgICAgICAgICBkb3VibGluZ19jb3VudCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldiA9IGJyaWdodG5lc3Nlc1tpXTsKLSAgICB9Ci0KLSAgICBkb3V0IDw8ICJtYXggZG91YmxpbmcgY291bnQ6ICIgPDwgbWF4X2RvdWJsaW5nX2NvdW50IDw8IHN0ZDo6ZW5kbDsKLQotICAgIC8qKgotICAgICAqIE1ha2UgdGhpcyBjaGVjayB3YXJuaW5nIG9ubHksIHNpbmNlIHRoZSBicmlnaHRuZXNzIGNhbGN1bGF0aW9uIGlzIG5vdCByZWxpYWJsZQotICAgICAqIGFuZCB3ZSBoYXZlIHNlcGFyYXRlIHRlc3QgdG8gY292ZXIgdGhpcyBjYXNlLiBQbHVzIGl0IGlzIHByZXR0eSBzdWJ0bGUgdG8gbWFrZQotICAgICAqIGl0IHJpZ2h0IHdpdGhvdXQgY29tcGxpY2F0aW5nIHRoZSB0ZXN0IHRvbyBtdWNoLgotICAgICAqLwotICAgIFdBUk5fTEUoQ0FNRVJBX0VYUE9TVVJFX0RPVUJMSU5HX0NPVU5ULCBtYXhfZG91YmxpbmdfY291bnQpCi0gICAgICAgICAgICA8PCAiYXZlcmFnZSBicmlnaHRuZXNzIHNob3VsZCBkb3VibGUgYXQgbGVhc3QgIgotICAgICAgICAgICAgPDwgQ0FNRVJBX0VYUE9TVVJFX0RPVUJMSU5HX0NPVU5UCi0gICAgICAgICAgICA8PCAiIHRpbWVzIG92ZXIgZWFjaCBjb25zZWN1dGl2ZSBmcmFtZSBhcyB0aGUgZXhwb3N1cmUgaXMgZG91YmxlZCIKLSAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLX0KLQotLyoqCi0gKiBUaGlzIHRlc3QgdmFyaWVzIGV4cG9zdXJlIHRpbWUsIGZyYW1lIGR1cmF0aW9uLCBhbmQgc2Vuc2l0aXZpdHkgZm9yIGEKLSAqIGJ1cnN0IG9mIGNhcHR1cmVzLiBJdCBwaWNrcyB2YWx1ZXMgYnkgZGVmYXVsdCwgYnV0IHRoZSBzZWxlY3Rpb24gY2FuIGJlCi0gKiBvdmVycmlkZGVuIHdpdGggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcwotICogICBDQU1FUkEyX1RFU1RfVkFSSUFCTEVfQlVSU1RfRVhQT1NVUkVfVElNRVMKLSAqICAgQ0FNRVJBMl9URVNUX1ZBUklBQkxFX0JVUlNUX0ZSQU1FX0RVUkFUSU9OUwotICogICBDQU1FUkEyX1RFU1RfVkFSSUFCTEVfQlVSU1RfU0VOU0lUSVZJVElFUwotICogd2hpY2ggbXVzdCBhbGwgYmUgYSBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMsIGFuZCBlYWNoIGxpc3QgbXVzdCBiZQotICogdGhlIHNhbWUgbGVuZ3RoLiAgSW4gYWRkaXRpb24sIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICogICBDQU1FUkEyX1RFU1RfVkFSSUFCTEVfQlVSU1RfRFVNUF9GUkFNRVMKLSAqIGlzIHNldCB0byAxLCB0aGVuIHRoZSBZVVYgYnVmZmVycyBhcmUgZHVtcGVkIGludG8gZmlsZXMgbmFtZWQKLSAqICAgImNhbWVyYTJfdGVzdF92YXJpYWJsZV9idXJzdF9mcmFtZV9OTk4ueXV2IgotICoKLSAqIEZvciBleGFtcGxlOgotICogICAkIHNldGVudiBDQU1FUkEyX1RFU1RfVkFSSUFCTEVfQlVSU1RfRVhQT1NVUkVfVElNRVMgMTAwMDAwMDAsMjAwMDAwMDAKLSAqICAgJCBzZXRlbnYgQ0FNRVJBMl9URVNUX1ZBUklBQkxFX0JVUlNUX0ZSQU1FX0RVUkFUSU9OUyA0MDAwMDAwMCw0MDAwMDAwMAotICogICAkIHNldGVudiBDQU1FUkEyX1RFU1RfVkFSSUFCTEVfQlVSU1RfU0VOU0lUSVZJVElFUyAyMDAsMTAwCi0gKiAgICQgc2V0ZW52IENBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9EVU1QX0ZSQU1FUyAxCi0gKiAgICQgL2RhdGEvbmF0aXZldGVzdC9jYW1lcmEyX3Rlc3QvY2FtZXJhMl90ZXN0IC0tZ3Rlc3RfZmlsdGVyPSIqVmFyaWFibGVCdXJzdCIKLSAqLwotVEVTVF9GKENhbWVyYUJ1cnN0VGVzdCwgVmFyaWFibGVCdXJzdCkgewotCi0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotCi0gICAgLy8gQm91bmRzIGZvciBjaGVja2luZyBmcmFtZSBkdXJhdGlvbiBpcyB3aXRoaW4gcmFuZ2UKLSAgICBjb25zdCBuc2Vjc190IERVUkFUSU9OX1VQUEVSX0JPVU5EID0gMTAgKiBNU0VDOwotICAgIGNvbnN0IG5zZWNzX3QgRFVSQVRJT05fTE9XRVJfQk9VTkQgPSAyMCAqIE1TRUM7Ci0KLSAgICAvLyBUaHJlc2hvbGQgZm9yIGNvbnNpZGVyaW5nIHR3byBjYXB0dXJlcyB0byBoYXZlIGVxdWl2YWxlbnQgZXhwb3N1cmUgdmFsdWUsCi0gICAgLy8gYXMgYSByYXRpbyBvZiB0aGUgc21hbGxlciBFViB0byB0aGUgbGFyZ2VyIEVWLgotICAgIGNvbnN0IGZsb2F0ICAgRVZfTUFUQ0hfQk9VTkQgPSAwLjk1OwotICAgIC8vIEJvdW5kIGZvciB0d28gY2FwdHVyZXMgd2l0aCBlcXVpdmFsZW50IGV4cCB2YWx1ZXMgdG8gaGF2ZSB0aGUgc2FtZQotICAgIC8vIG1lYXN1cmVkIGJyaWdodG5lc3MsIGluIDAtMjU1IGx1bWluYW5jZS4KLSAgICBjb25zdCBmbG9hdCAgIEJSSUdIVE5FU1NfTUFUQ0hfQk9VTkQgPSA1OwotCi0gICAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGxvb2sgZm9yIHRvIG92ZXJyaWRlIHRlc3Qgc2V0dGluZ3MKLSAgICBjb25zdCBjaGFyICpleHBFbnYgICAgICAgICA9ICJDQU1FUkEyX1RFU1RfVkFSSUFCTEVfQlVSU1RfRVhQT1NVUkVfVElNRVMiOwotICAgIGNvbnN0IGNoYXIgKmR1cmF0aW9uRW52ICAgID0gIkNBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9GUkFNRV9EVVJBVElPTlMiOwotICAgIGNvbnN0IGNoYXIgKnNlbnNpdGl2aXR5RW52ID0gIkNBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9TRU5TSVRJVklUSUVTIjsKLSAgICBjb25zdCBjaGFyICpkdW1wRnJhbWVFbnYgICA9ICJDQU1FUkEyX1RFU1RfVkFSSUFCTEVfQlVSU1RfRFVNUF9GUkFNRVMiOwotCi0gICAgLy8gUmFuZ2Ugb2YgdmFsaWQgZXhwb3N1cmUgdGltZXMsIGluIG5hbm9zZWNvbmRzCi0gICAgaW50NjRfdCBtaW5FeHAgPSAwLCBtYXhFeHAgPSAwOwotICAgIC8vIExpc3Qgb2YgdmFsaWQgc2Vuc29yIHNlbnNpdGl2aXRpZXMKLSAgICBWZWN0b3I8aW50MzJfdD4gc2Vuc2l0aXZpdGllczsKLSAgICAvLyBSYW5nZSBvZiB2YWxpZCBmcmFtZSBkdXJhdGlvbnMsIGluIG5hbm9zZWNvbmRzCi0gICAgaW50NjRfdCBtaW5EdXJhdGlvbiA9IDAsIG1heER1cmF0aW9uID0gMDsKLQotICAgIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGV4cG9zdXJlVGltZVJhbmdlID0KLSAgICAgICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfU0VOU09SX0lORk9fRVhQT1NVUkVfVElNRV9SQU5HRSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKDJ1LCBleHBvc3VyZVRpbWVSYW5nZS5jb3VudCkgPDwgIkJhZCBleHBvc3VyZSB0aW1lIHJhbmdlIHRhZy4iCi0gICAgICAgICAgICAgICAgIlVzaW5nIGRlZmF1bHQgdmFsdWVzIjsKLSAgICAgICAgaWYgKGV4cG9zdXJlVGltZVJhbmdlLmNvdW50ID09IDIpIHsKLSAgICAgICAgICAgIG1pbkV4cCA9IGV4cG9zdXJlVGltZVJhbmdlLmRhdGEuaTY0WzBdOwotICAgICAgICAgICAgbWF4RXhwID0gZXhwb3N1cmVUaW1lUmFuZ2UuZGF0YS5pNjRbMV07Ci0gICAgICAgIH0KLQotICAgICAgICBFWFBFQ1RfTFQoMCwgbWluRXhwKSA8PCAiTWluaW11bSBleHBvc3VyZSB0aW1lIGlzIDAiOwotICAgICAgICBFWFBFQ1RfTFQoMCwgbWF4RXhwKSA8PCAiTWF4aW11bSBleHBvc3VyZSB0aW1lIGlzIDAiOwotICAgICAgICBFWFBFQ1RfTEUobWluRXhwLCBtYXhFeHApIDw8ICJNaW5pbXVtIGV4cG9zdXJlIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIjsKLQotICAgICAgICBpZiAobWluRXhwID09IDApIHsKLSAgICAgICAgICAgIG1pbkV4cCA9IDEgKiBNU0VDOyAvLyBGYWxsYmFjayBtaW5pbXVtIGV4cG9zdXJlIHRpbWUKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXhFeHAgPT0gMCkgewotICAgICAgICAgICAgbWF4RXhwID0gMTAgKiBTRUM7IC8vIEZhbGxiYWNrIG1heGltdW0gZXhwb3N1cmUgdGltZQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGhhcmR3YXJlTGV2ZWwgPQotICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMKTsKLSAgICBBU1NFUlRfRVEoMXUsIGhhcmR3YXJlTGV2ZWwuY291bnQpOwotICAgIHVpbnQ4X3QgbGV2ZWwgPSBoYXJkd2FyZUxldmVsLmRhdGEudThbMF07Ci0gICAgQVNTRVJUX0dFKGxldmVsLCBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0xJTUlURUQpOwotICAgIEFTU0VSVF9MRShsZXZlbCwgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9GVUxMKTsKLSAgICBpZiAobGV2ZWwgPT0gQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9MSU1JVEVEKSB7Ci0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9Ci0gICAgICAgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICAgICAgICBzdGQ6OmNlcnIgPDwgIlNraXBwaW5nIHRlc3QgIgotICAgICAgICAgICAgICAgICAgPDwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIuIgotICAgICAgICAgICAgICAgICAgPDwgdGVzdF9pbmZvLT5uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgYmVjYXVzZSBIQUwgaGFyZHdhcmUgc3VwcG9ydGVkIGxldmVsIGlzIGxpbWl0ZWQgIgotICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZG91dCA8PCAiU3RyZWFtIHNpemUgaXMgIiA8PCBtV2lkdGggPDwgIiB4ICIgPDwgbUhlaWdodCA8PCBzdGQ6OmVuZGw7Ci0gICAgZG91dCA8PCAiVmFsaWQgZXhwb3N1cmUgcmFuZ2UgaXM6ICIgPDwKLSAgICAgICAgICAgIG1pbkV4cCA8PCAiIC0gIiA8PCBtYXhFeHAgPDwgIiBucyAiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHNlbnNpdml0eVJhbmdlID0KLSAgICAgICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfU0VOU09SX0lORk9fU0VOU0lUSVZJVFlfUkFOR0UpOwotICAgICAgICBFWFBFQ1RfRVEoMnUsIHNlbnNpdml0eVJhbmdlLmNvdW50KSA8PCAiTm8gc2Vuc2l0aXZpdHkgcmFuZ2UgbGlzdGVkLiIKLSAgICAgICAgICAgICAgICAiRmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgc2V0LiI7Ci0gICAgICAgIGludDMyX3QgbWluU2Vuc2l0aXZpdHkgPSAxMDA7Ci0gICAgICAgIGludDMyX3QgbWF4U2Vuc2l0aXZpdHkgPSA4MDA7Ci0gICAgICAgIGlmIChzZW5zaXZpdHlSYW5nZS5jb3VudCA9PSAyKSB7Ci0gICAgICAgICAgICBBU1NFUlRfR1Qoc2Vuc2l2aXR5UmFuZ2UuZGF0YS5pMzJbMF0sIDApOwotICAgICAgICAgICAgQVNTRVJUX0dUKHNlbnNpdml0eVJhbmdlLmRhdGEuaTMyWzFdLCAwKTsKLSAgICAgICAgICAgIG1pblNlbnNpdGl2aXR5ID0gc2Vuc2l2aXR5UmFuZ2UuZGF0YS5pMzJbMF07Ci0gICAgICAgICAgICBtYXhTZW5zaXRpdml0eSA9IHNlbnNpdml0eVJhbmdlLmRhdGEuaTMyWzFdOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgY291bnQgPSAobWF4U2Vuc2l0aXZpdHkgLSBtaW5TZW5zaXRpdml0eSArIDk5KSAvIDEwMDsKLSAgICAgICAgc2Vuc2l0aXZpdGllcy5wdXNoX2JhY2sobWluU2Vuc2l0aXZpdHkpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHNlbnNpdGl2aXRpZXMucHVzaF9iYWNrKG1pblNlbnNpdGl2aXR5ICsgaSAqIDEwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2Vuc2l0aXZpdGllcy5wdXNoX2JhY2sobWF4U2Vuc2l0aXZpdHkpOwotICAgIH0KLQotICAgIGRvdXQgPDwgIkF2YWlsYWJsZSBzZW5zaXRpdml0aWVzOiAiOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vuc2l0aXZpdGllcy5zaXplKCk7IGkrKykgewotICAgICAgICBkb3V0IDw8IHNlbnNpdGl2aXRpZXNbaV0gPDwgIiAiOwotICAgIH0KLSAgICBkb3V0IDw8IHN0ZDo6ZW5kbDsKLQotICAgIHsKLSAgICAgICAgaWYgKGdldERldmljZVZlcnNpb24oKSA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7Ci0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMgPQotICAgICAgICAgICAgICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX1NJWkVTKTsKLQotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGF2YWlsYWJsZVByb2Nlc3NlZE1pbkZyYW1lRHVyYXRpb25zID0KLSAgICAgICAgICAgICAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1BST0NFU1NFRF9NSU5fRFVSQVRJT05TKTsKLQotICAgICAgICAgICAgRVhQRUNUX0VRKGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50LAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVQcm9jZXNzZWRNaW5GcmFtZUR1cmF0aW9ucy5jb3VudCAqIDIpIDw8Ci0gICAgICAgICAgICAgICAgICAgICJUaGUgbnVtYmVyIG9mIG1pbmltdW0gZnJhbWUgZHVyYXRpb25zIGRvZXNuJ3QgbWF0Y2ggdGhlIG51bWJlciBvZiAiCi0gICAgICAgICAgICAgICAgICAgICJhdmFpbGFibGUgc2l6ZXMuIFVzaW5nIGZhbGxiYWNrIHZhbHVlcyI7Ci0KLSAgICAgICAgICAgIGlmIChhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudCA9PQotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVQcm9jZXNzZWRNaW5GcmFtZUR1cmF0aW9ucy5jb3VudCAqIDIpIHsKLSAgICAgICAgICAgICAgICBib29sIGdvdFNpemUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50OyBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2ldID09IG1XaWR0aCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2krMV0gPT0gbUhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ290U2l6ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaW5EdXJhdGlvbiA9IGF2YWlsYWJsZVByb2Nlc3NlZE1pbkZyYW1lRHVyYXRpb25zLmRhdGEuaTY0W2kvMl07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoZ290U2l6ZSkgPDwgIkNhbid0IGZpbmQgc3RyZWFtIHNpemUgaW4gbGlzdCBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXZhaWxhYmxlIHNpemVzOiAiIDw8IG1XaWR0aCA8PCAiLCAiIDw8IG1IZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWluRHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgICAgIG1pbkR1cmF0aW9uID0gMSAqIFNFQyAvIDMwOyAvLyBGYWxsIGJhY2sgdG8gMzAgZnBzIGFzIG1pbmltdW0gZHVyYXRpb24KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1pbkR1cmF0aW9uID0gZ2V0TWluRnJhbWVEdXJhdGlvbkZvcigKLSAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELCBtV2lkdGgsIG1IZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9MVCgwLCBtaW5EdXJhdGlvbik7Ci0KLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IG1heEZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfU0VOU09SX0lORk9fTUFYX0ZSQU1FX0RVUkFUSU9OKTsKLQotICAgICAgICBFWFBFQ1RfRVEoMXUsIG1heEZyYW1lRHVyYXRpb24uY291bnQpIDw8ICJObyB2YWxpZCBtYXhpbXVtIGZyYW1lIGR1cmF0aW9uIjsKLQotICAgICAgICBpZiAobWF4RnJhbWVEdXJhdGlvbi5jb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICBtYXhEdXJhdGlvbiA9IG1heEZyYW1lRHVyYXRpb24uZGF0YS5pNjRbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBFWFBFQ1RfR1QobWF4RHVyYXRpb24sIDApIDw8ICJNYXggZHVyYXRpb24gaXMgMCBvciBub3QgZ2l2ZW4sIHVzaW5nIGZhbGxiYWNrIjsKLQotICAgICAgICBpZiAobWF4RHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgbWF4RHVyYXRpb24gPSAxMCAqIFNFQzsgLy8gRmFsbCBiYWNrIHRvIDEwIHNlY29uZHMgYXMgbWF4IGR1cmF0aW9uCi0gICAgICAgIH0KLQotICAgIH0KLSAgICBkb3V0IDw8ICJBdmFpbGFibGUgZnJhbWUgZHVyYXRpb24gcmFuZ2UgZm9yIGNvbmZpZ3VyZWQgc3RyZWFtIHNpemU6ICIKLSAgICAgICAgIDw8IG1pbkR1cmF0aW9uIDw8ICIgLSAiIDw8IG1heER1cmF0aW9uIDw8ICIgbnMiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIC8vIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaWYgc2V0Ci0gICAgY29uc3QgY2hhciAqZXhwVmFsID0gZ2V0ZW52KGV4cEVudik7Ci0gICAgY29uc3QgY2hhciAqZHVyYXRpb25WYWwgPSBnZXRlbnYoZHVyYXRpb25FbnYpOwotICAgIGNvbnN0IGNoYXIgKnNlbnNpdGl2aXR5VmFsID0gZ2V0ZW52KHNlbnNpdGl2aXR5RW52KTsKLQotICAgIGJvb2wgZ290RXhwID0gKGV4cFZhbCAhPSBOVUxMKTsKLSAgICBib29sIGdvdER1cmF0aW9uID0gKGR1cmF0aW9uVmFsICE9IE5VTEwpOwotICAgIGJvb2wgZ290U2Vuc2l0aXZpdHkgPSAoc2Vuc2l0aXZpdHlWYWwgIT0gTlVMTCk7Ci0KLSAgICAvLyBBbGwgb3Igbm9uZSBtdXN0IGJlIHByb3ZpZGVkIGlmIHVzaW5nIG92ZXJyaWRlIGVudnMKLSAgICBBU1NFUlRfVFJVRSggKGdvdER1cmF0aW9uICYmIGdvdEV4cCAmJiBnb3RTZW5zaXRpdml0eSkgfHwKLSAgICAgICAgICAgICghZ290RHVyYXRpb24gJiYgIWdvdEV4cCAmJiAhZ290U2Vuc2l0aXZpdHkpICkgPDwKLSAgICAgICAgICAgICJJbmNvbXBsZXRlIHNldCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZXMgcHJvdmlkZWQiOwotCi0gICAgVmVjdG9yPGludDY0X3Q+IGV4cExpc3QsIGR1cmF0aW9uTGlzdDsKLSAgICBWZWN0b3I8aW50MzJfdD4gc2Vuc2l0aXZpdHlMaXN0OwotICAgIGlmIChnb3RFeHApIHsKLSAgICAgICAgUGFyc2VMaXN0KGV4cFZhbCwgZXhwTGlzdCk7Ci0gICAgICAgIFBhcnNlTGlzdChkdXJhdGlvblZhbCwgZHVyYXRpb25MaXN0KTsKLSAgICAgICAgUGFyc2VMaXN0KHNlbnNpdGl2aXR5VmFsLCBzZW5zaXRpdml0eUxpc3QpOwotCi0gICAgICAgIEFTU0VSVF9UUlVFKAotICAgICAgICAgICAgKGV4cExpc3Quc2l6ZSgpID09IGR1cmF0aW9uTGlzdC5zaXplKCkpICYmCi0gICAgICAgICAgICAoZHVyYXRpb25MaXN0LnNpemUoKSA9PSBzZW5zaXRpdml0eUxpc3Quc2l6ZSgpKSkgPDwKLSAgICAgICAgICAgICAgICAiTWlzbWF0Y2hlZCBzaXplcyBpbiBlbnYgbGlzdHMsIG9yIHBhcnNlIGVycm9yIjsKLQotICAgICAgICBkb3V0IDw8ICJVc2luZyBidXJzdCBsaXN0IGZyb20gZW52aXJvbm1lbnQgd2l0aCAiIDw8IGV4cExpc3Quc2l6ZSgpIDw8Ci0gICAgICAgICAgICAgICAgIiBjYXB0dXJlcyIgPDwgc3RkOjplbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgc2V0IG9mIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgcmFuZ2VzCi0KLSAgICAgICAgaW50NjRfdCBlOwotICAgICAgICBpbnQ2NF90IGQ7Ci0gICAgICAgIGludDMyX3QgczsKLQotICAgICAgICAvLyBFeHBvc3VyZSByYW1wCi0KLSAgICAgICAgZSA9IG1pbkV4cDsKLSAgICAgICAgZCA9IG1pbkR1cmF0aW9uOwotICAgICAgICBzID0gc2Vuc2l0aXZpdGllc1swXTsKLSAgICAgICAgd2hpbGUgKGUgPCBtYXhFeHApIHsKLSAgICAgICAgICAgIGV4cExpc3QucHVzaF9iYWNrKGUpOwotICAgICAgICAgICAgZHVyYXRpb25MaXN0LnB1c2hfYmFjayhkKTsKLSAgICAgICAgICAgIHNlbnNpdGl2aXR5TGlzdC5wdXNoX2JhY2socyk7Ci0gICAgICAgICAgICBlID0gZSAqIDI7Ci0gICAgICAgIH0KLSAgICAgICAgZSA9IG1heEV4cDsKLSAgICAgICAgZXhwTGlzdC5wdXNoX2JhY2soZSk7Ci0gICAgICAgIGR1cmF0aW9uTGlzdC5wdXNoX2JhY2soZCk7Ci0gICAgICAgIHNlbnNpdGl2aXR5TGlzdC5wdXNoX2JhY2socyk7Ci0KLSAgICAgICAgLy8gRHVyYXRpb24gcmFtcAotCi0gICAgICAgIGUgPSAzMCAqIE1TRUM7Ci0gICAgICAgIGQgPSBtaW5EdXJhdGlvbjsKLSAgICAgICAgcyA9IHNlbnNpdGl2aXRpZXNbMF07Ci0gICAgICAgIHdoaWxlIChkIDwgbWF4RHVyYXRpb24pIHsKLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBleHBvc3VyZSA8PSBmcmFtZSBkdXJhdGlvbgotICAgICAgICAgICAgZXhwTGlzdC5wdXNoX2JhY2soZSA+IGQgPyBkIDogZSk7Ci0gICAgICAgICAgICBkdXJhdGlvbkxpc3QucHVzaF9iYWNrKGQpOwotICAgICAgICAgICAgc2Vuc2l0aXZpdHlMaXN0LnB1c2hfYmFjayhzKTsKLSAgICAgICAgICAgIGQgPSBkICogMjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlbnNpdGl2aXR5IHJhbXAKLQotICAgICAgICBlID0gMzAgKiBNU0VDOwotICAgICAgICBkID0gMzAgKiBNU0VDOwotICAgICAgICBkID0gZCA+IG1pbkR1cmF0aW9uID8gZCA6IG1pbkR1cmF0aW9uOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlbnNpdGl2aXRpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGV4cExpc3QucHVzaF9iYWNrKGUpOwotICAgICAgICAgICAgZHVyYXRpb25MaXN0LnB1c2hfYmFjayhkKTsKLSAgICAgICAgICAgIHNlbnNpdGl2aXR5TGlzdC5wdXNoX2JhY2soc2Vuc2l0aXZpdGllc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb25zdGFudC1FViByYW1wLCBkdXJhdGlvbiA9PSBleHBvc3VyZQotCi0gICAgICAgIGUgPSAzMCAqIE1TRUM7IC8vIGF0IElTTyAxMDAKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZW5zaXRpdml0aWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGVfYWRqID0gZSAqIDEwMCAvIHNlbnNpdGl2aXRpZXNbaV07Ci0gICAgICAgICAgICBleHBMaXN0LnB1c2hfYmFjayhlX2Fkaik7Ci0gICAgICAgICAgICBkdXJhdGlvbkxpc3QucHVzaF9iYWNrKGVfYWRqID4gbWluRHVyYXRpb24gPyBlX2FkaiA6IG1pbkR1cmF0aW9uKTsKLSAgICAgICAgICAgIHNlbnNpdGl2aXR5TGlzdC5wdXNoX2JhY2soc2Vuc2l0aXZpdGllc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkb3V0IDw8ICJEZWZhdWx0IGJ1cnN0IHNlcXVlbmNlIGNyZWF0ZWQgd2l0aCAiIDw8IGV4cExpc3Quc2l6ZSgpIDw8Ci0gICAgICAgICAgICAgICAgIiBlbnRyaWVzIiA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGxpc3QsIGJ1dCB3YXJuIG9ubHkKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4cExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgRVhQRUNUX0dFKG1heEV4cCwgZXhwTGlzdFtpXSkKLSAgICAgICAgICAgICAgICA8PCAiQ2FwdHVyZSAiIDw8IGkgPDwgIiBleHBvc3VyZSB0b28gbG9uZzogIiA8PCBleHBMaXN0W2ldOwotICAgICAgICBFWFBFQ1RfTEUobWluRXhwLCBleHBMaXN0W2ldKQotICAgICAgICAgICAgICAgIDw8ICJDYXB0dXJlICIgPDwgaSA8PCAiIGV4cG9zdXJlIHRvbyBzaG9ydDogIiA8PCBleHBMaXN0W2ldOwotICAgICAgICBFWFBFQ1RfR0UobWF4RHVyYXRpb24sIGR1cmF0aW9uTGlzdFtpXSkKLSAgICAgICAgICAgICAgICA8PCAiQ2FwdHVyZSAiIDw8IGkgPDwgIiBkdXJhdGlvbiB0b28gbG9uZzogIiA8PCBkdXJhdGlvbkxpc3RbaV07Ci0gICAgICAgIEVYUEVDVF9MRShtaW5EdXJhdGlvbiwgZHVyYXRpb25MaXN0W2ldKQotICAgICAgICAgICAgICAgICA8PCAiQ2FwdHVyZSAiIDw8IGkgPDwgIiBkdXJhdGlvbiB0b28gc2hvcnQ6ICIgIDw8IGR1cmF0aW9uTGlzdFtpXTsKLSAgICAgICAgYm9vbCB2YWxpZFNlbnNpdGl2aXR5ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2Vuc2l0aXZpdGllcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgaWYgKHNlbnNpdGl2aXR5TGlzdFtpXSA9PSBzZW5zaXRpdml0aWVzW2pdKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRTZW5zaXRpdml0eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRVhQRUNUX1RSVUUodmFsaWRTZW5zaXRpdml0eSkKLSAgICAgICAgICAgICAgICA8PCAiQ2FwdHVyZSAiIDw8IGkgPDwgIiBzZW5zaXRpdml0eSBub3QgaW4gbGlzdDogIiA8PCBzZW5zaXRpdml0eUxpc3RbaV07Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgZGVidWcgeXV2IGR1bXBzIGFyZSByZXF1ZXN0ZWQKLQotICAgIGJvb2wgZHVtcEZyYW1lcyA9IGZhbHNlOwotICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqZnJhbWVEdW1wVmFsID0gZ2V0ZW52KGR1bXBGcmFtZUVudik7Ci0gICAgICAgIGlmIChmcmFtZUR1bXBWYWwgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKGZyYW1lRHVtcFZhbFswXSA9PSAnMScpIGR1bXBGcmFtZXMgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZG91dCA8PCAiRHVtcGluZyBZVVYgZnJhbWVzICIgPDwKLSAgICAgICAgICAgIChkdW1wRnJhbWVzID8gImVuYWJsZWQsIG5vdCBjaGVja2luZyB0aW1pbmciIDogImRpc2FibGVkIikgPDwgc3RkOjplbmRsOwotCi0gICAgLy8gQ3JlYXRlIGEgYmFzZSBwcmV2aWV3IHJlcXVlc3QsIHR1cm5pbmcgb2ZmIGFsbCAzQQotICAgIENhbWVyYU1ldGFkYXRhIHByZXZpZXdSZXF1ZXN0OwotICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBMl9URU1QTEFURV9QUkVWSUVXLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdSZXF1ZXN0KSk7Ci0gICAgewotICAgICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOwotICAgICAgICBvdXRwdXRTdHJlYW1JZHMucHVzaChtU3RyZWFtSWQpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIHByZXZpZXdSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcykpOwotCi0gICAgICAgIC8vIERpc2FibGUgYWxsIDNBIHJvdXRpbmVzCi0gICAgICAgIHVpbnQ4X3QgY21PZmYgPSBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX0NPTlRST0xfTU9ERV9PRkYpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIHByZXZpZXdSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX0NPTlRST0xfTU9ERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtT2ZmLCAxKSk7Ci0KLSAgICAgICAgaW50IHJlcXVlc3RJZCA9IDE7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RJZCwgMSkpOwotICAgIH0KLQotICAgIC8vIFN1Ym1pdCBjYXB0dXJlIHJlcXVlc3RzCi0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4cExpc3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgdG1wUmVxdWVzdCA9IHByZXZpZXdSZXF1ZXN0OwotICAgICAgICBBU1NFUlRfRVEoT0ssIHRtcFJlcXVlc3QudXBkYXRlKEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cExpc3RbaV0sIDEpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCB0bXBSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1NFTlNPUl9GUkFNRV9EVVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25MaXN0W2ldLCAxKSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgdG1wUmVxdWVzdC51cGRhdGUoQU5EUk9JRF9TRU5TT1JfU0VOU0lUSVZJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbnNpdGl2aXR5TGlzdFtpXSwgMSkpOwotICAgICAgICBBTE9HVigiU3VibWl0dGluZyBjYXB0dXJlICV6dSB3aXRoIGV4cG9zdXJlICUiIFBSSWQ2NCAiLCBmcmFtZSBkdXJhdGlvbiAlIiBQUklkNjQgIiwgc2Vuc2l0aXZpdHkgJWQiLAotICAgICAgICAgICAgICAgIGksIGV4cExpc3RbaV0sIGR1cmF0aW9uTGlzdFtpXSwgc2Vuc2l0aXZpdHlMaXN0W2ldKTsKLSAgICAgICAgZG91dCA8PCAiQ2FwdHVyZSByZXF1ZXN0ICIgPDwgaSA8PAotICAgICAgICAgICAgICAgICI6IGV4cG9zdXJlIGlzICIgPDwgKGV4cExpc3RbaV0vMWU2ZikgPDwgIiBtcyIgPDwKLSAgICAgICAgICAgICAgICAiLCBmcmFtZSBkdXJhdGlvbiBpcyAiIDw8IChkdXJhdGlvbkxpc3RbaV0vMWU2ZikgPDwgIiBtcyIgPDwKLSAgICAgICAgICAgICAgICAiLCBzZW5zaXRpdml0eSBpcyAiIDw8IHNlbnNpdGl2aXR5TGlzdFtpXSA8PAotICAgICAgICAgICAgICAgIHN0ZDo6ZW5kbDsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5jYXB0dXJlKHRtcFJlcXVlc3QpKTsKLSAgICB9Ci0KLSAgICBWZWN0b3I8ZmxvYXQ+IGJyaWdodG5lc3NlczsKLSAgICBWZWN0b3I8bnNlY3NfdD4gY2FwdHVyZVRpbWVzOwotICAgIGJyaWdodG5lc3Nlcy5zZXRDYXBhY2l0eShleHBMaXN0LnNpemUoKSk7Ci0gICAgY2FwdHVyZVRpbWVzLnNldENhcGFjaXR5KGV4cExpc3Quc2l6ZSgpKTsKLQotICAgIC8vIEdldCBlYWNoIGZyYW1lIChtZXRhZGF0YSkgYW5kIHRoZW4gdGhlIGJ1ZmZlci4gQ2FsY3VsYXRlIGJyaWdodG5lc3MuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHBMaXN0LnNpemUoKTsgKytpKSB7Ci0KLSAgICAgICAgQUxPR1YoIlJlYWRpbmcgcmVxdWVzdCAlenUiLCBpKTsKLSAgICAgICAgZG91dCA8PCAiV2FpdGluZyBmb3IgY2FwdHVyZSAiIDw8IGkgPDwgIjogIiA8PAotICAgICAgICAgICAgICAgICIgZXhwb3N1cmUgIiA8PCAoZXhwTGlzdFtpXS8xZTZmKSA8PCAiIG1zLCIgPDwKLSAgICAgICAgICAgICAgICAiIGZyYW1lIGR1cmF0aW9uICIgPDwgKGR1cmF0aW9uTGlzdFtpXS8xZTZmKSA8PCAiIG1zLCIgPDwKLSAgICAgICAgICAgICAgICAiIHNlbnNpdGl2aXR5ICIgPDwgc2Vuc2l0aXZpdHlMaXN0W2ldIDw8Ci0gICAgICAgICAgICAgICAgc3RkOjplbmRsOwotCi0gICAgICAgIC8vIFNldCB3YWl0IGxpbWl0IGJhc2VkIG9uIGV4cGVjdGVkIGZyYW1lIGR1cmF0aW9uLCBvciBtaW5pbXVtIHRpbWVvdXQKLSAgICAgICAgaW50NjRfdCB3YWl0TGltaXQgPSBDQU1FUkFfRlJBTUVfVElNRU9VVDsKLSAgICAgICAgaWYgKGV4cExpc3RbaV0gKiAyID4gd2FpdExpbWl0KSB3YWl0TGltaXQgPSBleHBMaXN0W2ldICogMjsKLSAgICAgICAgaWYgKGR1cmF0aW9uTGlzdFtpXSAqIDIgPiB3YWl0TGltaXQpIHdhaXRMaW1pdCA9IGR1cmF0aW9uTGlzdFtpXSAqIDI7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT53YWl0Rm9yTmV4dEZyYW1lKHdhaXRMaW1pdCkpOwotICAgICAgICBBTE9HVigiUmVhZGluZyBjYXB0dXJlIHJlcXVlc3QtMSAlenUiLCBpKTsKLSAgICAgICAgQ2FwdHVyZVJlc3VsdCByZXN1bHQ7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Z2V0TmV4dFJlc3VsdCgmcmVzdWx0KSk7Ci0gICAgICAgIEFMT0dWKCJSZWFkaW5nIGNhcHR1cmUgcmVxdWVzdC0yICV6dSIsIGkpOwotCi0gICAgICAgIEFTU0VSVF9FUShPSywgbUZyYW1lTGlzdGVuZXItPndhaXRGb3JGcmFtZShDQU1FUkFfRlJBTUVfVElNRU9VVCkpOwotICAgICAgICBBTE9HVigiV2UgZ290IHRoZSBmcmFtZSBub3ciKTsKLQotICAgICAgICBjYXB0dXJlVGltZXMucHVzaF9iYWNrKHN5c3RlbVRpbWUoKSk7Ci0KLSAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBpbWdCdWZmZXI7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbUNwdUNvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmaW1nQnVmZmVyKSk7Ci0KLSAgICAgICAgaW50IHVuZGVyZXhwb3NlZCwgb3ZlcmV4cG9zZWQ7Ci0gICAgICAgIGZsb2F0IGF2Z0JyaWdodG5lc3MgPSAwOwotICAgICAgICBsb25nIGxvbmcgYnJpZ2h0bmVzcyA9IFRvdGFsQnJpZ2h0bmVzcyhpbWdCdWZmZXIsICZ1bmRlcmV4cG9zZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmVyZXhwb3NlZCk7Ci0gICAgICAgIGludCBudW1WYWxpZFBpeGVscyA9IG1XaWR0aCAqIG1IZWlnaHQgLSAodW5kZXJleHBvc2VkICsgb3ZlcmV4cG9zZWQpOwotICAgICAgICBpZiAobnVtVmFsaWRQaXhlbHMgIT0gMCkgewotICAgICAgICAgICAgYXZnQnJpZ2h0bmVzcyA9IGJyaWdodG5lc3MgKiAxLjBmIC8gbnVtVmFsaWRQaXhlbHM7Ci0gICAgICAgIH0gZWxzZSBpZiAodW5kZXJleHBvc2VkIDwgb3ZlcmV4cG9zZWQpIHsKLSAgICAgICAgICAgIGF2Z0JyaWdodG5lc3MgPSAyNTU7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiVG90YWwgYnJpZ2h0bmVzcyBmb3IgZnJhbWUgJXp1IHdhcyAlbGxkICh1bmRlcmV4cG9zZWQgJWQsICIKLSAgICAgICAgICAgICAgIm92ZXJleHBvc2VkICVkKSwgYXZnICVmIiwgaSwgYnJpZ2h0bmVzcywgdW5kZXJleHBvc2VkLAotICAgICAgICAgICAgICBvdmVyZXhwb3NlZCwgYXZnQnJpZ2h0bmVzcyk7Ci0gICAgICAgIGRvdXQgPDwgIkF2ZXJhZ2UgYnJpZ2h0bmVzcyAoZnJhbWUgIiA8PCBpIDw8ICIpIHdhcyAiIDw8IGF2Z0JyaWdodG5lc3MKLSAgICAgICAgICAgICA8PCAiICh1bmRlcmV4cG9zZWQgIiA8PCB1bmRlcmV4cG9zZWQgPDwgIiwgb3ZlcmV4cG9zZWQgIgotICAgICAgICAgICAgIDw8IG92ZXJleHBvc2VkIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIGJyaWdodG5lc3Nlcy5wdXNoX2JhY2soYXZnQnJpZ2h0bmVzcyk7Ci0KLSAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgZmxvYXQgcHJldkV2ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGV4cExpc3RbaSAtIDFdKSAqIHNlbnNpdGl2aXR5TGlzdFtpIC0gMV07Ci0gICAgICAgICAgICBmbG9hdCBjdXJyZW50RXYgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZXhwTGlzdFtpXSkgKiBzZW5zaXRpdml0eUxpc3RbaV07Ci0gICAgICAgICAgICBmbG9hdCBldlJhdGlvID0gKHByZXZFdiA+IGN1cnJlbnRFdikgPyAoY3VycmVudEV2IC8gcHJldkV2KSA6Ci0gICAgICAgICAgICAgICAgICAgIChwcmV2RXYgLyBjdXJyZW50RXYpOwotICAgICAgICAgICAgaWYgKCBldlJhdGlvID4gRVZfTUFUQ0hfQk9VTkQgKSB7Ci0gICAgICAgICAgICAgICAgV0FSTl9MVChmYWJzKGJyaWdodG5lc3Nlc1tpXSAtIGJyaWdodG5lc3Nlc1tpIC0gMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgQlJJR0hUTkVTU19NQVRDSF9CT1VORCkgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYXB0dXJlIGJyaWdodG5lc3MgZGlmZmVyZW50IGZyb20gcHJldmlvdXMsIGV2ZW4gdGhvdWdoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGV5IGhhdmUgdGhlIHNhbWUgRVYgdmFsdWUuIEV2IG5vdzogIiA8PCBjdXJyZW50RXYgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIHByZXZpb3VzOiAiIDw8IHByZXZFdiA8PCAiLiBCcmlnaHRuZXNzIG5vdzogIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzc2VzW2ldIDw8ICIsIHByZXZpb3VzOiAiIDw8IGJyaWdodG5lc3Nlc1tpLTFdIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBPbmx5IGNoZWNrIHRpbWluZyBpZiBub3Qgc2F2aW5nIHRvIGRpc2ssIHNpbmNlIHRoYXQgc2xvd3MgdGhpbmdzCi0gICAgICAgICAgICAvLyBkb3duIHN1YnN0YW50aWFsbHkKLSAgICAgICAgICAgIGlmICghZHVtcEZyYW1lcykgewotICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZURlbHRhID0gY2FwdHVyZVRpbWVzW2ldIC0gY2FwdHVyZVRpbWVzW2ktMV07Ci0gICAgICAgICAgICAgICAgbnNlY3NfdCBleHBlY3RlZERlbHRhID0gZXhwTGlzdFtpXSA+IGR1cmF0aW9uTGlzdFtpXSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBMaXN0W2ldIDogZHVyYXRpb25MaXN0W2ldOwotICAgICAgICAgICAgICAgIFdBUk5fTFQodGltZURlbHRhLCBleHBlY3RlZERlbHRhICsgRFVSQVRJT05fVVBQRVJfQk9VTkQpIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAiQ2FwdHVyZSB0b29rICIgPDwgdGltZURlbHRhIDw8ICIgbnMgdG8gcmVjZWl2ZSwgYnV0IGV4cGVjdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIiBmcmFtZSBkdXJhdGlvbiB3YXMgIiA8PCBleHBlY3RlZERlbHRhIDw8ICIgbnMuIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmRsOwotICAgICAgICAgICAgICAgIFdBUk5fR1QodGltZURlbHRhLCBleHBlY3RlZERlbHRhIC0gRFVSQVRJT05fTE9XRVJfQk9VTkQpIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAiQ2FwdHVyZSB0b29rICIgPDwgdGltZURlbHRhIDw8ICIgbnMgdG8gcmVjZWl2ZSwgYnV0IGV4cGVjdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIiBmcmFtZSBkdXJhdGlvbiB3YXMgIiA8PCBleHBlY3RlZERlbHRhIDw8ICIgbnMuIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmRsOwotICAgICAgICAgICAgICAgIGRvdXQgPDwgIlRpbWUgZGVsdGEgZnJvbSBwcmV2aW91cyBmcmFtZTogIiA8PCB0aW1lRGVsdGEgLyAxZTYgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICIgbXMuICBFeHBlY3RlZCAiIDw8IGV4cGVjdGVkRGVsdGEgLyAxZTYgPDwgIiBtcyIgPDwgc3RkOjplbmRsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1bXBGcmFtZXMpIHsKLSAgICAgICAgICAgIFN0cmluZzggZHVtcE5hbWUgPQotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIi9kYXRhL2xvY2FsL3RtcC9jYW1lcmEyX3Rlc3RfdmFyaWFibGVfYnVyc3RfZnJhbWVfJTAzenUueXV2IiwgaSk7Ci0gICAgICAgICAgICBkb3V0IDw8ICIgIFdyaXRpbmcgWVVWIGR1bXAgdG8gIiA8PCBkdW1wTmFtZSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICBEdW1wWXV2VG9GaWxlKGR1bXBOYW1lLCBpbWdCdWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtQ3B1Q29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpKTsKLSAgICB9Ci0KLX0KLQotfQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFGcmFtZVRlc3RzLmNwcCBiL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhRnJhbWVUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNWFiZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFGcmFtZVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhRnJhbWVUZXN0IgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaGFyZHdhcmUvaGFyZHdhcmUuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEyLmgiCi0KLSNpbmNsdWRlIDxjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJDYW1lcmFTdHJlYW1GaXh0dXJlLmgiCi0jaW5jbHVkZSAiVGVzdEV4dGVuc2lvbnMuaCIKLQotI2RlZmluZSBDQU1FUkFfRlJBTUVfVElNRU9VVCAgICAxMDAwMDAwMDAwIC8vbnNlY3MgKDEgc2VjcykKLSNkZWZpbmUgQ0FNRVJBX0hFQVBfQ09VTlQgICAgICAgMiAvL0hBTEJVRzogMSBtZWFucyByZWdpc3RlckJ1ZmZlcnMgZmFpbHMKLSNkZWZpbmUgQ0FNRVJBX0ZSQU1FX0RFQlVHR0lORyAgMAotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEyOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi1zdGF0aWMgQ2FtZXJhU3RyZWFtUGFyYW1zIFNUUkVBTV9QQVJBTUVURVJTID0gewotICAgIC8qbUZvcm1hdCovICAgICBDQU1FUkFfU1RSRUFNX0FVVE9fQ1BVX0ZPUk1BVCwKLSAgICAvKm1IZWFwQ291bnQqLyAgQ0FNRVJBX0hFQVBfQ09VTlQKLX07Ci0KLWNsYXNzIENhbWVyYUZyYW1lVGVzdAotICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+LAotICAgICAgcHVibGljIENhbWVyYVN0cmVhbUZpeHR1cmUgewotCi1wdWJsaWM6Ci0gICAgQ2FtZXJhRnJhbWVUZXN0KCkgOiBDYW1lcmFTdHJlYW1GaXh0dXJlKFNUUkVBTV9QQVJBTUVURVJTKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfQ09OU1RSVUNUT1I7Ci0KLSAgICAgICAgaWYgKCFIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICAgICAgQ3JlYXRlU3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB+Q2FtZXJhRnJhbWVUZXN0KCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0RFU1RSVUNUT1I7Ci0KLSAgICAgICAgaWYgKG1EZXZpY2UuZ2V0KCkpIHsKLSAgICAgICAgICAgIG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19TRVRfVVA7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19URUFSX0RPV047Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0KLX07Ci0KLVRFU1RfUChDYW1lcmFGcmFtZVRlc3QsIEdldEZyYW1lKSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICAvKiBTdWJtaXQgYSBQUkVWSUVXIHR5cGUgcmVxdWVzdCwgdGhlbiB3YWl0IHVudGlsIHdlIGdldCB0aGUgZnJhbWUgYmFjayAqLwotICAgIENhbWVyYU1ldGFkYXRhIHByZXZpZXdSZXF1ZXN0OwotICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBMl9URU1QTEFURV9QUkVWSUVXLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdSZXF1ZXN0KSk7Ci0gICAgewotICAgICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOwotICAgICAgICBvdXRwdXRTdHJlYW1JZHMucHVzaChtU3RyZWFtSWQpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIHByZXZpZXdSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcykpOwotICAgICAgICBpZiAoQ0FNRVJBX0ZSQU1FX0RFQlVHR0lORykgewotICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgPSAwOwotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCBwcmV2aWV3UmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQsIDEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChDQU1FUkFfRlJBTUVfREVCVUdHSU5HKSB7Ci0gICAgICAgIHByZXZpZXdSZXF1ZXN0LmR1bXAoU1RET1VUX0ZJTEVOTyk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHZXRQYXJhbSgpOyArK2kpIHsKLSAgICAgICAgQUxPR1YoIlN1Ym1pdHRpbmcgY2FwdHVyZSByZXF1ZXN0ICVkIiwgaSk7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhIHRtcFJlcXVlc3QgPSBwcmV2aWV3UmVxdWVzdDsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5jYXB0dXJlKHRtcFJlcXVlc3QpKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEdldFBhcmFtKCk7ICsraSkgewotICAgICAgICBBTE9HVigiUmVhZGluZyBjYXB0dXJlIHJlcXVlc3QgJWQiLCBpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT53YWl0Rm9yTmV4dEZyYW1lKENBTUVSQV9GUkFNRV9USU1FT1VUKSk7Ci0KLSAgICAgICAgQ2FwdHVyZVJlc3VsdCByZXN1bHQ7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Z2V0TmV4dFJlc3VsdCgmcmVzdWx0KSk7Ci0KLSAgICAgICAgLy8gd2FpdCBmb3IgYnVmZmVyIHRvIGJlIGF2YWlsYWJsZQotICAgICAgICBBU1NFUlRfRVEoT0ssIG1GcmFtZUxpc3RlbmVyLT53YWl0Rm9yRnJhbWUoQ0FNRVJBX0ZSQU1FX1RJTUVPVVQpKTsKLSAgICAgICAgQUxPR1YoIldlIGdvdCB0aGUgZnJhbWUgbm93Iik7Ci0KLSAgICAgICAgLy8gbWFyayBidWZmZXIgY29uc3VtZWQgc28gcHJvZHVjZXIgY2FuIHJlLWRlcXVldWUgaXQKLSAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBpbWdCdWZmZXI7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbUNwdUNvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmaW1nQnVmZmVyKSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbUNwdUNvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKSk7Ci0gICAgfQotCi19Ci0KLS8vRklYTUU6IGRvbnQgaGFyZGNvZGUgc3RyZWFtIHBhcmFtcywgYW5kIGFsc28gdGVzdCBtdWx0aXN0cmVhbQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRnJhbWVQYXJhbWV0ZXJDb21iaW5hdGlvbnMsIENhbWVyYUZyYW1lVGVzdCwKLSAgICB0ZXN0aW5nOjpSYW5nZSgxLCAxMCkpOwotCi0KLX0KLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGFUZXN0cy5jcHAgYi90ZXN0cy9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhVGVzdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIyZGQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGFUZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkNhbWVyYU1ldGFkYXRhVGVzdEZ1bmN0aW9uYWwiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImN1dGlscy9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAibG9nL2xvZy5oIgotI2luY2x1ZGUgInV0aWxzL0Vycm9ycy5oIgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUvaGFyZHdhcmUuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEyLmgiCi0KLSNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgotI2luY2x1ZGUgInV0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKLQotI2luY2x1ZGUgPGd1aS9DcHVDb25zdW1lci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDYW1lcmFTdHJlYW1GaXh0dXJlLmgiCi0jaW5jbHVkZSAiVGVzdEV4dGVuc2lvbnMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotLy9GSVhNRTogZG9udCBoYXJkY29kZQotc3RhdGljIENhbWVyYVN0cmVhbVBhcmFtcyBNRVRBREFUQV9TVFJFQU1fUEFSQU1FVEVSUyA9IHsKLSAgICAvKm1Gb3JtYXQqLyAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AsCi0gICAgLyptSGVhcENvdW50Ki8gIDIKLX07Ci0KLWNsYXNzIENhbWVyYU1ldGFkYXRhVGVzdAotICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCwKLSAgICAgIHB1YmxpYyBDYW1lcmFTdHJlYW1GaXh0dXJlIHsKLQotcHVibGljOgotICAgIENhbWVyYU1ldGFkYXRhVGVzdCgpCi0gICAgOiBDYW1lcmFTdHJlYW1GaXh0dXJlKE1FVEFEQVRBX1NUUkVBTV9QQVJBTUVURVJTKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfQ09OU1RSVUNUT1I7Ci0gICAgfQotCi0gICAgfkNhbWVyYU1ldGFkYXRhVGVzdCgpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19ERVNUUlVDVE9SOwotICAgIH0KLQotICAgIGludCBHZXRUeXBlRnJvbVRhZyh1aW50MzJfdCB0YWcpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGdldF9jYW1lcmFfbWV0YWRhdGFfdGFnX3R5cGUodGFnKTsKLSAgICB9Ci0KLSAgICBpbnQgR2V0VHlwZUZyb21TdGF0aWNUYWcodWludDMyX3QgdGFnKSBjb25zdCB7Ci0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQodGFnKTsKLSAgICAgICAgcmV0dXJuIGVudHJ5LnR5cGU7Ci0gICAgfQotCi0gICAgaW50IEdldEVudHJ5Q291bnRGcm9tU3RhdGljVGFnKHVpbnQzMl90IHRhZykgY29uc3QgewotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKHRhZyk7Ci0gICAgICAgIHJldHVybiBlbnRyeS5jb3VudDsKLSAgICB9Ci0KLSAgICBib29sIEhhc0VsZW1lbnRJbkFycmF5RnJvbVN0YXRpY1RhZyh1aW50MzJfdCB0YWcsIGludDMyX3QgZWxlbWVudCkgY29uc3QgewotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKHRhZyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgewotICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEuaTMyW2ldID09IGVsZW1lbnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotcHJvdGVjdGVkOgotCi19OwotCi1URVNUX0YoQ2FtZXJhTWV0YWRhdGFUZXN0LCB0eXBlcykgewotCi0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotCi0gICAgLy9GSVhNRTogc2V0IHRoaXMgdXAgaW4gYW4gZXh0ZXJuYWwgZmlsZSBvZiBzb21lIHNvcnQgKHhtbD8pCi0gICAgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgIHByb3BlcnR5X2dldCgicm8uYnVpbGQuaWQiLCB2YWx1ZSwgIiIpOwotICAgICAgICBzdGQ6OnN0cmluZyBzdHJfdmFsdWUodmFsdWUpOwotCi0gICAgICAgIGlmIChzdHJfdmFsdWUgPT0gIm1hbnRhIikKLSAgICAgICAgewotICAgICAgICAgICAgRVhQRUNUX0VRKFRZUEVfQllURSwKLSAgICAgICAgICAgICAgICBHZXRUeXBlRnJvbVN0YXRpY1RhZyhBTkRST0lEX1FVSVJLU19UUklHR0VSX0FGX1dJVEhfQVVUTykpOwotICAgICAgICAgICAgRVhQRUNUX0VRKFRZUEVfQllURSwKLSAgICAgICAgICAgICAgICBHZXRUeXBlRnJvbVN0YXRpY1RhZyhBTkRST0lEX1FVSVJLU19VU0VfWlNMX0ZPUk1BVCkpOwotICAgICAgICAgICAgRVhQRUNUX0VRKFRZUEVfQllURSwKLSAgICAgICAgICAgICAgICBHZXRUeXBlRnJvbVN0YXRpY1RhZyhBTkRST0lEX1FVSVJLU19NRVRFUklOR19DUk9QX1JFR0lPTikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICBUT0RPOgotICAgIGdvIHRocm91Z2ggYWxsIHN0YXRpYyBtZXRhZGF0YSBhbmQgbWFrZSBzdXJlIGFsbCBmaWVsZHMgd2UgZXhwZWN0Ci0gICAgdGhhdCBhcmUgdGhlcmUsIEFSRSB0aGVyZS4KLQotICAgIGRvbnQgd29ycnkgYWJvdXQgdGhlIHR5cGUgYXMgaXRzIGVuZm9yY2VkIGJ5IHRoZSBtZXRhZGF0YSBhcGkKLSAgICB3ZSBjYW4gcHJvYmFibHkgY2hlY2sgdGhlIHJhbmdlIHZhbGlkaXR5IHRob3VnaAotICAgICovCi0KLSAgICBpZiAoMCkgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnk7Ci0gICAgICAgIEVYUEVDVF9FUShUWVBFX0JZVEUsICAgICBlbnRyeS50eXBlKTsKLSAgICAgICAgRVhQRUNUX0VRKFRZUEVfSU5UMzIsICAgIGVudHJ5LnR5cGUpOwotICAgICAgICBFWFBFQ1RfRVEoVFlQRV9GTE9BVCwgICAgZW50cnkudHlwZSk7Ci0gICAgICAgIEVYUEVDVF9FUShUWVBFX0lOVDY0LCAgICBlbnRyeS50eXBlKTsKLSAgICAgICAgRVhQRUNUX0VRKFRZUEVfRE9VQkxFLCAgIGVudHJ5LnR5cGUpOwotICAgICAgICBFWFBFQ1RfRVEoVFlQRV9SQVRJT05BTCwgZW50cnkudHlwZSk7Ci0gICAgfQotfQotCi1URVNUX0YoQ2FtZXJhTWV0YWRhdGFUZXN0LCBSZXF1aXJlZEZvcm1hdHMpIHsKLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICBFWFBFQ1RfVFJVRSgKLSAgICAgICAgSGFzRWxlbWVudEluQXJyYXlGcm9tU3RhdGljVGFnKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSk7IC8vIEpQRUcKLQotICAgIGlmIChnZXREZXZpY2VWZXJzaW9uKCkgPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICAvLyBIQUwyIGNhbiBzdXBwb3J0IGVpdGhlciBmbGV4aWJsZSBZVVYgb3IgWVYxMiArIE5WMjEKLSAgICAgICAgaWYgKCFIYXNFbGVtZW50SW5BcnJheUZyb21TdGF0aWNUYWcoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpKSB7Ci0KLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKAotICAgICAgICAgICAgICAgIEhhc0VsZW1lbnRJbkFycmF5RnJvbVN0YXRpY1RhZyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUywKLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQKSk7IC8vIE5WMjEKLQotICAgICAgICAgICAgRVhQRUNUX1RSVUUoCi0gICAgICAgICAgICAgICAgSGFzRWxlbWVudEluQXJyYXlGcm9tU3RhdGljVGFnKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTLAotICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBIQUwzIG11c3Qgc3VwcG9ydCBmbGV4aWJsZSBZVVYKLSAgICAgICAgRVhQRUNUX1RSVUUoSGFzRWxlbWVudEluQXJyYXlGcm9tU3RhdGljVGFnKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTLAotICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSk7Ci0gICAgfQotCi19Ci0KLVRFU1RfRihDYW1lcmFNZXRhZGF0YVRlc3QsIFNhbmVSZXNvbHV0aW9ucykgewotICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfSU5JVDsKLQotICAgIGlmIChnZXREZXZpY2VWZXJzaW9uKCkgPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgewotICAgICAgICAvLyBJZmYgdGhlcmUgYXJlIGxpc3RlZCByYXcgcmVzb2x1dGlvbnMsIHRoZSBmb3JtYXQgc2hvdWxkIGJlIGF2YWlsYWJsZQotICAgICAgICBpbnQgcmF3UmVzb2x1dGlvbnNDb3VudCA9Ci0gICAgICAgICAgICAgICAgR2V0RW50cnlDb3VudEZyb21TdGF0aWNUYWcoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JBV19TSVpFUyk7Ci0gICAgICAgIGlmIChyYXdSZXNvbHV0aW9uc0NvdW50ID4gMCkgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoCi0gICAgICAgICAgICAgICAgSGFzRWxlbWVudEluQXJyYXlGcm9tU3RhdGljVGFnKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTLAotICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVxdWlyZWQgcHJvY2Vzc2VkIHNpemVzLgotICAgICAgICBpbnQgcHJvY2Vzc2VkU2l6ZUNvdW50ID0KLSAgICAgICAgICAgICAgIEdldEVudHJ5Q291bnRGcm9tU3RhdGljVGFnKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9QUk9DRVNTRURfU0laRVMpOwotICAgICAgICBFWFBFQ1RfTkUoMCwgcHJvY2Vzc2VkU2l6ZUNvdW50KTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIHByb2Nlc3NlZFNpemVDb3VudCAlIDIpOyAvLyBtdWx0aXBsZSBvZiAyICh3LGgpCi0KLSAgICAgICAgLy8gUmVxdWlyZWQgSlBFRyBzaXplcwotICAgICAgICBpbnQganBlZ1NpemVDb3VudCA9Ci0gICAgICAgICAgICAgICAgR2V0RW50cnlDb3VudEZyb21TdGF0aWNUYWcoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMpOwotICAgICAgICBFWFBFQ1RfTkUoMCwganBlZ1NpemVDb3VudCk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBqcGVnU2l6ZUNvdW50ICUgMik7IC8vIG11bHRpcGxlIG9mIDIgKHcsaCkKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgc3RybUNvbmZpZ0NvdW50ID0KLSAgICAgICAgICAgICAgICBHZXRFbnRyeUNvdW50RnJvbVN0YXRpY1RhZyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKLSAgICAgICAgRVhQRUNUX05FKDAsIHN0cm1Db25maWdDb3VudCk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBzdHJtQ29uZmlnQ291bnQgJSA0KTsgLy8gbXVsdGlwbGUgb2YgNCAoZm9ybWF0LHcsaCxvdXRwdXQ/KQotICAgIH0KLQotfQotCi19Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL0NhbWVyYU1vZHVsZUZpeHR1cmUuaCBiL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTW9kdWxlRml4dHVyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTUxM2FmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTW9kdWxlRml4dHVyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fQU5EUk9JRF9IQUxfQ0FNRVJBMl9URVNUU19NT0RVTEVfRklYVFVSRV9fCi0jZGVmaW5lIF9fQU5EUk9JRF9IQUxfQ0FNRVJBMl9URVNUU19NT0RVTEVfRklYVFVSRV9fCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiaGFyZHdhcmUvaGFyZHdhcmUuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEyLmgiCi0KLSNpbmNsdWRlIDxjb21tb24vQ2FtZXJhTW9kdWxlLmg+Ci0jaW5jbHVkZSA8ZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmg+Ci0KLSNpbmNsdWRlICJjYW1lcmEyX3V0aWxzLmgiCi0jaW5jbHVkZSAiVGVzdEV4dGVuc2lvbnMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotdGVtcGxhdGUgPGJvb2wgSW5mb1F1aXJrID0gZmFsc2U+Ci1zdHJ1Y3QgQ2FtZXJhTW9kdWxlRml4dHVyZSB7Ci0KLSAgICBleHBsaWNpdCBDYW1lcmFNb2R1bGVGaXh0dXJlKGludCBDYW1lcmFJRCA9IC0xKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfQ09OU1RSVUNUT1I7Ci0KLSAgICAgICAgbUNhbWVyYUlEID0gQ2FtZXJhSUQ7Ci0gICAgfQotCi0gICAgfkNhbWVyYU1vZHVsZUZpeHR1cmUoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfREVTVFJVQ1RPUjsKLSAgICB9Ci0KLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgR2V0U3RhdGljRW50cnkodWludDMyX3QgdGFnKSBjb25zdCB7Ci0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQodGFnKTsKLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLQotICAgIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfU0VUX1VQOwotCi0gICAgICAgIGNhbWVyYV9tb2R1bGVfdCAqcmF3TW9kdWxlOwotICAgICAgICBBU1NFUlRfTEUoMCwgaHdfZ2V0X21vZHVsZShDQU1FUkFfSEFSRFdBUkVfTU9EVUxFX0lELAotICAgICAgICAgICAgKGNvbnN0IGh3X21vZHVsZV90ICoqKSZyYXdNb2R1bGUpKSA8PCAiQ291bGQgbm90IGxvYWQgY2FtZXJhIG1vZHVsZSI7Ci0gICAgICAgIEFTU0VSVF9ORSgodm9pZCopMCwgcmF3TW9kdWxlKTsKLSAgICAgICAgbU1vZHVsZSA9IG5ldyBDYW1lcmFNb2R1bGUocmF3TW9kdWxlKTsKLQotICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gbU1vZHVsZS0+Z2V0TnVtYmVyT2ZDYW1lcmFzKCk7Ci0gICAgICAgIEFTU0VSVF9MRSgwLCBtTnVtYmVyT2ZDYW1lcmFzKTsKLQotICAgICAgICBBU1NFUlRfTEUoCi0gICAgICAgICAgICBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMCwgbU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpKQotICAgICAgICAgICAgPDwgIldyb25nIG1vZHVsZSBBUEkgdmVyc2lvbiI7Ci0KLSAgICAgICAgLyogRm9yIHVzaW5nIHRoaXMgZml4dHVyZSBpbiBvdGhlciB0ZXN0cyBvbmx5ICovCi0gICAgICAgIFNldFVwTWl4aW4oKTsKLSAgICB9Ci0KLSAgICB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1RFQVJfRE9XTjsKLQotICAgICAgICBkZWxldGUgbU1vZHVsZTsKLSAgICAgICAgVGVhckRvd25NaXhpbigpOwotCi0gICAgICAgIC8qIGltcG9ydGFudDogZGV2aWNlIG11c3QgYmUgZGVzdHJ1Y3RlZCBiZWZvcmUgY2xvc2luZyBtb2R1bGUsCi0gICAgICAgICAgIHNpbmNlIGl0IGNhbGxzIGJhY2sgaW50byBIQUwgKi8KLSAgICAgICAgbURldmljZS5jbGVhcigpOwotCi0gICAgICAgIGlmICghVEVTVF9FWFRFTlNJT05fRk9SS0lOR19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgSFdNb2R1bGVIZWxwZXJzOjpjbG9zZU1vZHVsZShtTW9kdWxlLT5nZXREc28oKSkpCi0gICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjbG9zZSBjYW1lcmEgSEFMIG1vZHVsZSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIENyZWF0ZUNhbWVyYShpbnQgY2FtZXJhSUQsIC8qb3V0Ki8gc3A8Q2FtZXJhRGV2aWNlQmFzZT4gKmRldmljZSkgewotICAgICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGNhbWVyYUlELCAmaW5mbykpOwotCi0gICAgICAgIEFTU0VSVF9HRSgoaW50KWluZm8uZGV2aWNlX3ZlcnNpb24sIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSA8PAotICAgICAgICAgICAgICAgICJEZXZpY2UgdmVyc2lvbiB0b28gb2xkIGZvciBjYW1lcmEgIiA8PCBjYW1lcmFJRCA8PCAiLiBWZXJzaW9uOiAiIDw8Ci0gICAgICAgICAgICAgICAgaW5mby5kZXZpY2VfdmVyc2lvbjsKLSAgICAgICAgc3dpdGNoKGluZm8uZGV2aWNlX3ZlcnNpb24pIHsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgotICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKLSAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSUQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBkZXZpY2UtPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgRkFJTCgpIDw8ICJEZXZpY2UgdmVyc2lvbiB1bmtub3duIGZvciBjYW1lcmEgIiA8PCBjYW1lcmFJRCA8PCAiLiBWZXJzaW9uOiAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZm8uZGV2aWNlX3ZlcnNpb247Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIGludCBnZXREZXZpY2VWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0RGV2aWNlVmVyc2lvbihtQ2FtZXJhSUQpOwotICAgIH0KLQotICAgIGludCBnZXREZXZpY2VWZXJzaW9uKGludCBjYW1lcmFJZCwgc3RhdHVzX3QqIHN0YXR1cyA9IE5VTEwpIHsKLSAgICAgICAgY2FtZXJhX2luZm8gaW5mbzsKLSAgICAgICAgc3RhdHVzX3QgcmVzOwotICAgICAgICByZXMgPSBtTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGNhbWVyYUlkLCAmaW5mbyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgKnN0YXR1cyA9IHJlczsKLQotICAgICAgICByZXR1cm4gaW5mby5kZXZpY2VfdmVyc2lvbjsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICB2b2lkIFNldFVwTWl4aW4oKSB7Ci0gICAgICAgIC8qIEZvciB1c2luZyB0aGlzIGZpeHR1cmUgaW4gb3RoZXIgdGVzdHMgb25seSAqLwotICAgICAgICBpZiAobUNhbWVyYUlEICE9IC0xKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfTEUoMCwgbUNhbWVyYUlEKTsKLSAgICAgICAgICAgIEVYUEVDVF9MVChtQ2FtZXJhSUQsIG1OdW1iZXJPZkNhbWVyYXMpOwotCi0gICAgICAgICAgICAvKiBIQUxCVUcgKEV4eW5vczUpOyBjcmFzaGVzIGlmIHdlIHNraXAgY2FsbGluZyBnZXRfY2FtZXJhX2luZm8KLSAgICAgICAgICAgICAgIGJlZm9yZSBpbml0aWFsaXppbmcuIE5lZWQgaW5mbyBhbnl3YXkgbm93LiAqLwotCi0gICAgICAgICAgICBDcmVhdGVDYW1lcmEobUNhbWVyYUlELCAmbURldmljZSk7Ci0KLSAgICAgICAgICAgIEFTU0VSVF9UUlVFKG1EZXZpY2UgIT0gTlVMTCkgPDwgIkZhaWxlZCB0byBvcGVuIGRldmljZSAiIDw8IG1DYW1lcmFJRDsKLSAgICAgICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+aW5pdGlhbGl6ZShtTW9kdWxlKSkKLSAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZGV2aWNlICIgPDwgbUNhbWVyYUlEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBUZWFyRG93bk1peGluKCkgewotCi0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IG1OdW1iZXJPZkNhbWVyYXM7Ci0gICAgQ2FtZXJhTW9kdWxlICptTW9kdWxlOwotICAgIHNwPENhbWVyYURldmljZUJhc2U+IG1EZXZpY2U7Ci0KLXByaXZhdGU6Ci0gICAgaW50IG1DYW1lcmFJRDsKLX07Ci0KLQotfQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTW9kdWxlVGVzdHMuY3BwIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFNb2R1bGVUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmM3NTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNb2R1bGVUZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jZGVmaW5lIExPR19UQUcgIkNhbWVyYU1vZHVsZVRlc3QiCi0jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDxjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oPgotCi0jaW5jbHVkZSAiaGFyZHdhcmUvaGFyZHdhcmUuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEyLmgiCi0KLSNpbmNsdWRlICJDYW1lcmFNb2R1bGVGaXh0dXJlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci0KLWNsYXNzIENhbWVyYU1vZHVsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFNb2R1bGVGaXh0dXJlPD4gewotCi1wdWJsaWM6Ci0gICAgQ2FtZXJhTW9kdWxlVGVzdCgpIHsKLSAgICAgICAgQ2FtZXJhTW9kdWxlRml4dHVyZTo6U2V0VXAoKTsKLSAgICB9Ci0KLSAgICB+Q2FtZXJhTW9kdWxlVGVzdCgpIHsKLSAgICAgICAgQ2FtZXJhTW9kdWxlRml4dHVyZTo6VGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGV2aWNlKGludCBjYW1lcmFJZCkgewotCi0gICAgICAgIC8vIGlnbm9yZSBIQUwxcy4gY291bnQgYXMgdGVzdCBwYXNzCi0gICAgICAgIHN0YXR1c190IHN0YXQ7Ci0gICAgICAgIGlmIChpc0RldmljZVZlcnNpb25IYWwyKGNhbWVyYUlkLCAmc3RhdCkgJiYgc3RhdCA9PSBPSykgewotICAgICAgICAgICAgc3RhdCA9IG1EZXZpY2UtPmluaXRpYWxpemUobU1vZHVsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdDsKLSAgICB9Ci0KLSAgICBib29sIGlzRGV2aWNlVmVyc2lvbkhhbDIoaW50IGNhbWVyYUlkLCBzdGF0dXNfdCogc3RhdHVzKSB7Ci0gICAgICAgIHJldHVybiBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCBzdGF0dXMpCi0gICAgICAgICAgICAgICA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDsKLSAgICB9Ci19OwotCi1URVNUX0YoQ2FtZXJhTW9kdWxlVGVzdCwgTG9hZE1vZHVsZSkgewotCi0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotCi0gICAgc3RhdHVzX3Qgc3RhdDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7ICsraSkgewotICAgICAgICBpZiAoaXNEZXZpY2VWZXJzaW9uSGFsMihpLCAmc3RhdCkgJiYgc3RhdCA9PSBPSykgewotICAgICAgICAgICAgQ3JlYXRlQ2FtZXJhKGksICZtRGV2aWNlKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShPSywgaW5pdGlhbGl6ZURldmljZShpKSkKLSAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZGV2aWNlICIgPDwgaTsKLSAgICAgICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9Ci0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiU2tpcHBpbmcgdGVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIuIgotICAgICAgICAgICAgICAgICAgICAgIDw8IHRlc3RfaW5mby0+bmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBiZWNhdXNlIEhBTCBkZXZpY2UgdmVyc2lvbiBpcyBWMSIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotVEVTVF9GKENhbWVyYU1vZHVsZVRlc3QsIExvYWRNb2R1bGVCYWRJbmRpY2VzKSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICBpbnQgaWR4W10gPSB7IC0xLCBtTnVtYmVyT2ZDYW1lcmFzLCBtTnVtYmVyT2ZDYW1lcmFzICsgMSB9OwotICAgIGh3X2RldmljZV90ICpkZXZpY2UgPSBOVUxMOwotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZihpZHgpL3NpemVvZihpZHhbMF0pOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBkZXZpY2VOYW1lID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGlkeFtpXSk7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IG1Nb2R1bGUtPm9wZW4oZGV2aWNlTmFtZSwgJmRldmljZSk7Ci0gICAgICAgIEVYUEVDVF9ORShPSywgcmVzKTsKLSAgICAgICAgRVhQRUNUX0VRKC1FTk9ERVYsIHJlcykKLSAgICAgICAgICAgIDw8ICJJbmNvcnJlY3QgZXJyb3IgY29kZSB3aGVuIHRyeWluZyB0byBvcGVuIGNhbWVyYSB3aXRoIGludmFsaWQgaWQgIgotICAgICAgICAgICAgPDwgZGV2aWNlTmFtZTsKLSAgICB9Ci19Ci0KLVRFU1RfRihDYW1lcmFNb2R1bGVUZXN0LCBHZXRDYW1lcmFJbmZvKSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7ICsraSkgewotICAgICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGksICZpbmZvKSk7Ci0gICAgfQotCi19Ci0KLVRFU1RfRihDYW1lcmFNb2R1bGVUZXN0LCBHZXRDYW1lcmFJbmZvQmFkSW5kaWNlcykgewotCi0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotCi0gICAgaW50IGlkeFtdID0geyAtMSwgbU51bWJlck9mQ2FtZXJhcywgbU51bWJlck9mQ2FtZXJhcyArIDEgfTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKGlkeCkvc2l6ZW9mKGlkeFswXSk7ICsraSkgewotICAgICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKLSAgICAgICAgRVhQRUNUX05FKE9LLCBtTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGlkeFtpXSwgJmluZm8pKTsKLSAgICAgICAgRVhQRUNUX0VRKC1FSU5WQUwsIG1Nb2R1bGUtPmdldENhbWVyYUluZm8oaWR4W2ldLCAmaW5mbykpCi0gICAgICAgICAgICA8PCAiSW5jb3JyZWN0IGVycm9yIGNvZGUgZm9yIGdldF9jYW1lcmFfaW5mbyBpZHg9ICIKLSAgICAgICAgICAgIDw8IGlkeFtpXTsKLSAgICB9Ci19Ci0KLS8qKgotICogVE9ETzogQWRkaXRpb25hbCB0ZXN0IHRvIGFkZDogb3BlbiB0d28gY2FtZXJhcyBhdCBvbmNlLgotICogICAgICAgKGlzIGFsbG93ZWQgdG8gZmFpbCwgYXQgbGVhc3QgZm9yIG5vdywgYnV0IHNob3VsZCBub3QgYmxvdyB1cCkKLSAqICAgICAtIG9wZW4gc2FtZSBkZXZpY2UgbXVsdGlwbGUgdGltZXMKLSAqICAgICAtIGNsb3NlIHNhbWUgZGV2aWNlIG11bHRpcGxlIHRpbWVzCi0gKi8KLQotCi0KLQotfQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNdWx0aVN0cmVhbVRlc3RzLmNwcCBiL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTXVsdGlTdHJlYW1UZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YWVhYjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNdWx0aVN0cmVhbVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZGVmaW5lIExPR19UQUcgIkNhbWVyYU11bHRpU3RyZWFtVGVzdCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlICJDYW1lcmFTdHJlYW1GaXh0dXJlLmgiCi0jaW5jbHVkZSAiVGVzdEV4dGVuc2lvbnMuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNkZWZpbmUgREVGQVVMVF9GUkFNRV9EVVJBVElPTiAzMzAwMDAwMExMIC8vIDMzbXMKLSNkZWZpbmUgQ0FNRVJBX0hFQVBfQ09VTlQgICAgICAgMQotI2RlZmluZSBDQU1FUkFfRVhQT1NVUkVfRk9STUFUIENBTUVSQV9TVFJFQU1fQVVUT19DUFVfRk9STUFUCi0jZGVmaW5lIENBTUVSQV9ESVNQTEFZX0ZPUk1BVCBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQKLSNkZWZpbmUgQ0FNRVJBX01VTFRJX1NUUkVBTV9ERUJVR0dJTkcgIDAKLSNkZWZpbmUgQ0FNRVJBX0ZSQU1FX1RJTUVPVVQgICAgMTAwMDAwMDAwMExMIC8vIG5zZWNzICgxIHNlY3MpCi0jZGVmaW5lIFBSRVZJRVdfUkVOREVSSU5HX1RJTUVfSU5URVJWQUwgMjAwMDAwIC8vIGluIHVuaXQgb2YgdXMsIDIwMG1zCi0vLyAxJSB0b2xlcmFuY2UgbWFyZ2luIGZvciBleHBvc3VyZSBzYW5pdHkgY2hlY2sgYWdhaW5zdCBtZXRhZGF0YQotI2RlZmluZSBUT0xFUkFOQ0VfTUFSR0lOX01FVEFEQVRBIDAuMDEKLS8vIDUlIHRvbGVyYW5jZSBtYXJnaW4gZm9yIGV4cG9zdXJlIHNhbml0eSBjaGVjayBhZ2FpbnN0IGNhcHR1cmUgdGltZXMKLSNkZWZpbmUgVE9MRVJBTkNFX01BUkdJTl9DQVBUVVJFIDAuMDUKLS8qIGNvbnN0YW50cyBmb3IgZGlzcGxheSAqLwotI2RlZmluZSBESVNQTEFZX0JVRkZFUl9IRUlHSFQgMTAyNAotI2RlZmluZSBESVNQTEFZX0JVRkZFUl9XSURUSCAxMDI0Ci0jZGVmaW5lIERJU1BMQVlfQlVGRkVSX0ZPUk1BVCBQSVhFTF9GT1JNQVRfUkdCXzg4OAotCi0vLyBUaGlzIHRlc3QgaW50ZW5kcyB0byB0ZXN0IGxhcmdlIHByZXZpZXcgc2l6ZSBidXQgbGVzcyB0aGFuIDEwODBwLgotI2RlZmluZSBQUkVWSUVXX1dJRFRIX0NBUCAgIDE5MjAKLSNkZWZpbmUgUFJFVklFV19IRUlHSFRfQ0FQICAxMDgwCi0vLyBUaGlzIHRlc3QgaW50ZW5kcyB0byB0ZXN0IHNtYWxsIG1ldGVyaW5nIGJ1cnN0IHNpemUgdGhhdCBpcyBsZXNzIHRoYW4gNjQweDQ4MAotI2RlZmluZSBNRVRFUklOR19XSURUSF9DQVAgIDY0MAotI2RlZmluZSBNRVRFUklOR19IRUlHSFRfQ0FQIDQ4MAotCi0jZGVmaW5lIEVYUF9XQUlUX01VTFRJUExJRVIgMgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi1zdGF0aWMgY29uc3QgQ2FtZXJhU3RyZWFtUGFyYW1zIERFRkFVTFRfU1RSRUFNX1BBUkFNRVRFUlMgPSB7Ci0gICAgLyptRm9ybWF0Ki8gICAgIENBTUVSQV9FWFBPU1VSRV9GT1JNQVQsCi0gICAgLyptSGVhcENvdW50Ki8gIENBTUVSQV9IRUFQX0NPVU5UCi19OwotCi1zdGF0aWMgY29uc3QgQ2FtZXJhU3RyZWFtUGFyYW1zIERJU1BMQVlfU1RSRUFNX1BBUkFNRVRFUlMgPSB7Ci0gICAgLyptRm9ybWF0Ki8gICAgIENBTUVSQV9ESVNQTEFZX0ZPUk1BVCwKLSAgICAvKm1IZWFwQ291bnQqLyAgQ0FNRVJBX0hFQVBfQ09VTlQKLX07Ci0KLWNsYXNzIENhbWVyYU11bHRpU3RyZWFtVGVzdAotICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCwKLSAgICAgIHB1YmxpYyBDYW1lcmFTdHJlYW1GaXh0dXJlIHsKLQotcHVibGljOgotICAgIENhbWVyYU11bHRpU3RyZWFtVGVzdCgpIDogQ2FtZXJhU3RyZWFtRml4dHVyZShERUZBVUxUX1NUUkVBTV9QQVJBTUVURVJTKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfQ09OU1RSVUNUT1I7Ci0KLSAgICAgICAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERvbid0IGNyZWF0ZSBkZWZhdWx0IHN0cmVhbSwgZWFjaCB0ZXN0IGlzIGluIGNoYXJnZSBvZiBjcmVhdGluZwotICAgICAgICAgKiBpdHMgb3duIHN0cmVhbXMuCi0gICAgICAgICAqLwotICAgIH0KLQotICAgIH5DYW1lcmFNdWx0aVN0cmVhbVRlc3QoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfREVTVFJVQ1RPUjsKLSAgICB9Ci0KLSAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IG1Db21wb3NlckNsaWVudDsKLSAgICBzcDxTdXJmYWNlQ29udHJvbD4gbVN1cmZhY2VDb250cm9sOwotCi0gICAgdm9pZCBDcmVhdGVPblNjcmVlblN1cmZhY2Uoc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHsKLSAgICAgICAgbUNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpKTsKLQotICAgICAgICBtU3VyZmFjZUNvbnRyb2wgPSBtQ29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgICAgICAgICAgU3RyaW5nOCgiQ2FtZXJhTXVsdGlTdHJlYW1UZXN0IFN0cmVhbWluZ0ltYWdlIFN1cmZhY2UiKSwKLSAgICAgICAgICAgICAgICBESVNQTEFZX0JVRkZFUl9IRUlHSFQsIERJU1BMQVlfQlVGRkVSX1dJRFRILAotICAgICAgICAgICAgICAgIERJU1BMQVlfQlVGRkVSX0ZPUk1BVCwgMCk7Ci0KLSAgICAgICAgQVNTRVJUX05FKCh2b2lkKilOVUxMLCBtU3VyZmFjZUNvbnRyb2wuZ2V0KCkpOwotICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZUNvbnRyb2wtPmlzVmFsaWQoKSk7Ci0KLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3VyZmFjZUNvbnRyb2wtPnNldExheWVyKDB4N0ZGRkZGRkYpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3VyZmFjZUNvbnRyb2wtPnNob3coKSk7Ci0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpOwotCi0gICAgICAgIHN1cmZhY2UgPSBtU3VyZmFjZUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKLQotICAgICAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIHN1cmZhY2UuZ2V0KCkpOwotICAgIH0KLQotICAgIHN0cnVjdCBTaXplIHsKLSAgICAgICAgaW50MzJfdCB3aWR0aDsKLSAgICAgICAgaW50MzJfdCBoZWlnaHQ7Ci0gICAgfTsKLQotICAgIC8vIFNlbGVjdCBtaW5pbWFsIHNpemUgYnkgbnVtYmVyIG9mIHBpeGVscy4KLSAgICB2b2lkIEdldE1pblNpemUoY29uc3QgaW50MzJfdCogZGF0YSwgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgU2l6ZSogbWluLCBpbnQzMl90KiBpZHgpIHsKLSAgICAgICAgQVNTRVJUX05FKChpbnQzMl90KilOVUxMLCBkYXRhKTsKLSAgICAgICAgaW50MzJfdCBtaW5JZHggPSAwOwotICAgICAgICBpbnQzMl90IG1pblNpemUgPSBJTlRfTUFYLCB0ZW1wU2l6ZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSs9MikgewotICAgICAgICAgICAgdGVtcFNpemUgPSBkYXRhW2ldICogZGF0YVtpKzFdOwotICAgICAgICAgICAgaWYgKG1pblNpemUgPiB0ZW1wU2l6ZSkgewotICAgICAgICAgICAgICAgIG1pblNpemUgPSB0ZW1wU2l6ZTsKLSAgICAgICAgICAgICAgICBtaW5JZHggPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1pbi0+d2lkdGggPSBkYXRhW21pbklkeF07Ci0gICAgICAgIG1pbi0+aGVpZ2h0ID0gZGF0YVttaW5JZHggKyAxXTsKLSAgICAgICAgKmlkeCA9IG1pbklkeDsKLSAgICB9Ci0KLSAgICAvLyBTZWxlY3QgbWF4aW1hbCBzaXplIGJ5IG51bWJlciBvZiBwaXhlbHMuCi0gICAgdm9pZCBHZXRNYXhTaXplKGNvbnN0IGludDMyX3QqIGRhdGEsIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgIFNpemUqIG1heCwgaW50MzJfdCogaWR4KSB7Ci0gICAgICAgIEFTU0VSVF9ORSgoaW50MzJfdCopTlVMTCwgZGF0YSk7Ci0gICAgICAgIGludDMyX3QgbWF4SWR4ID0gMDsKLSAgICAgICAgaW50MzJfdCBtYXhTaXplID0gSU5UX01JTiwgdGVtcFNpemU7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrPTIpIHsKLSAgICAgICAgICAgIHRlbXBTaXplID0gZGF0YVtpXSAqIGRhdGFbaSsxXTsKLSAgICAgICAgICAgIGlmIChtYXhTaXplIDwgdGVtcFNpemUpIHsKLSAgICAgICAgICAgICAgICBtYXhTaXplID0gdGVtcFNpemU7Ci0gICAgICAgICAgICAgICAgbWF4SWR4ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtYXgtPndpZHRoID0gZGF0YVttYXhJZHhdOwotICAgICAgICBtYXgtPmhlaWdodCA9IGRhdGFbbWF4SWR4ICsgMV07Ci0gICAgICAgICppZHggPSBtYXhJZHg7Ci0gICAgfQotCi0gICAgLy8gQ2FwIHNpemUgYnkgbnVtYmVyIG9mIHBpeGVscy4KLSAgICBTaXplIENhcFNpemUoU2l6ZSBjYXAsIFNpemUgaW5wdXQpIHsKLSAgICAgICAgaWYgKGlucHV0LndpZHRoICogaW5wdXQuaGVpZ2h0ID4gY2FwLndpZHRoICogY2FwLmhlaWdodCkgewotICAgICAgICAgICAgcmV0dXJuIGNhcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQotCi0gICAgc3RydWN0IENhbWVyYVN0cmVhbSA6IHB1YmxpYyBSZWZCYXNlIHsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE9ubHkgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGVzIGhlcmUsIGRvIHRoZSBBU1NFUlQgY2hlY2sgaW4KLSAgICAgICAgICogU2V0VXAgZnVuY3Rpb24uIFRvIG1ha2UgdGhpcyBzdHJlYW0gdXNlZnVsLCB0aGUgU2V0VXAgbXVzdAotICAgICAgICAgKiBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIGl0LgotICAgICAgICAgKi8KLSAgICAgICAgQ2FtZXJhU3RyZWFtKAotICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+JiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgQ2FtZXJhU3RyZWFtUGFyYW1zIHBhcmFtLCBzcDxTdXJmYWNlPiBzdXJmYWNlLAotICAgICAgICAgICAgICAgIGJvb2wgdXNlQ3B1Q29uc3VtZXIpCi0gICAgICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICAgICAgbVdpZHRoKHdpZHRoKSwKLSAgICAgICAgICAgICAgbUhlaWdodChoZWlnaHQpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBwYXJhbS5tRm9ybWF0OwotICAgICAgICAgICAgaWYgKHVzZUNwdUNvbnN1bWVyKSB7Ci0gICAgICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7Ci0gICAgICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7Ci0gICAgICAgICAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKLSAgICAgICAgICAgICAgICBtQ3B1Q29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIHBhcmFtLm1IZWFwQ291bnQpOwotICAgICAgICAgICAgICAgIG1DcHVDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYU11bHRpU3RyZWFtVGVzdDo6bUNwdUNvbnN1bWVyIikpOwotICAgICAgICAgICAgICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIHN0cmVhbSB0byBzY3JlZW4uCi0gICAgICAgICAgICAgICAgbUNwdUNvbnN1bWVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZSA9IHN1cmZhY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1GcmFtZUxpc3RlbmVyID0gbmV3IEZyYW1lTGlzdGVuZXIoKTsKLSAgICAgICAgICAgIGlmIChtQ3B1Q29uc3VtZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIG1DcHVDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihtRnJhbWVMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmluYWxseSBjcmVhdGUgY2FtZXJhIHN0cmVhbSwgYW5kIGRvIHRoZSBBU1NFUlQgY2hlY2ssIHNpbmNlIHdlCi0gICAgICAgICAqIGNhbiBub3QgZG8gaXQgaW4gY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoT0ssCi0gICAgICAgICAgICAgICAgbURldmljZS0+Y3JlYXRlU3RyZWFtKG1TdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1TdHJlYW1JZCkpOwotCi0gICAgICAgICAgICBBU1NFUlRfTkUoLTEsIG1TdHJlYW1JZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgR2V0U3RyZWFtSWQoKSB7IHJldHVybiBtU3RyZWFtSWQ7IH0KLSAgICAgICAgc3A8Q3B1Q29uc3VtZXI+IEdldENvbnN1bWVyKCkgeyByZXR1cm4gbUNwdUNvbnN1bWVyOyB9Ci0gICAgICAgIHNwPEZyYW1lTGlzdGVuZXI+IEdldEZyYW1lTGlzdGVuZXIoKSB7IHJldHVybiBtRnJhbWVMaXN0ZW5lcjsgfQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB+Q2FtZXJhU3RyZWFtKCkgewotICAgICAgICAgICAgaWYgKG1EZXZpY2UuZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlLT53YWl0VW50aWxEcmFpbmVkKCk7Ci0gICAgICAgICAgICAgICAgbURldmljZS0+ZGVsZXRlU3RyZWFtKG1TdHJlYW1JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDbGVhciBwcm9kdWNlciBiZWZvcmUgY29uc3VtZXIuCi0gICAgICAgICAgICBtU3VyZmFjZS5jbGVhcigpOwotICAgICAgICAgICAgbUNwdUNvbnN1bWVyLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPEZyYW1lTGlzdGVuZXI+ICAgICAgIG1GcmFtZUxpc3RlbmVyOwotICAgICAgICBzcDxDcHVDb25zdW1lcj4gICAgICAgICBtQ3B1Q29uc3VtZXI7Ci0gICAgICAgIHNwPFN1cmZhY2U+ICAgICAgICAgICAgIG1TdXJmYWNlOwotICAgICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgICBtRGV2aWNlOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSWQ7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1XaWR0aDsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUhlaWdodDsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICB9OwotCi0gICAgaW50NjRfdCBHZXRFeHBvc3VyZVZhbHVlKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhRGF0YSkgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9Ci0gICAgICAgICAgICAgICAgbWV0YURhdGEuZmluZChBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FKTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBlbnRyeS5jb3VudCk7Ci0gICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gZW50cnkuZGF0YS5pNjRbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGludDMyX3QgR2V0U2Vuc2l0aXZpdHkoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFEYXRhKSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YS5maW5kKEFORFJPSURfU0VOU09SX1NFTlNJVElWSVRZKTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBlbnRyeS5jb3VudCk7Ci0gICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gZW50cnkuZGF0YS5pMzJbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGludDY0X3QgR2V0RnJhbWVEdXJhdGlvbihjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YURhdGEpIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPQotICAgICAgICAgICAgICAgIG1ldGFEYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfRlJBTUVfRFVSQVRJT04pOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGVudHJ5LmNvdW50KTsKLSAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBlbnRyeS5kYXRhLmk2NFswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdm9pZCBDcmVhdGVSZXF1ZXN0cyhDYW1lcmFNZXRhZGF0YSYgcHJldmlld1JlcXVlc3QsCi0gICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbWV0ZXJpbmdSZXF1ZXN0LAotICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIGNhcHR1cmVSZXF1ZXN0LAotICAgICAgICAgICAgaW50IHByZXZpZXdTdHJlYW1JZCwKLSAgICAgICAgICAgIGludCBtZXRlcmluZ1N0cmVhbUlkLAotICAgICAgICAgICAgaW50IGNhcHR1cmVTdHJlYW1JZCkgewotICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IDA7Ci0gICAgICAgIFZlY3RvcjxpbnQzMl90PiBwcmV2aWV3U3RyZWFtSWRzOwotICAgICAgICBwcmV2aWV3U3RyZWFtSWRzLnB1c2gocHJldmlld1N0cmVhbUlkKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEyX1RFTVBMQVRFX1BSRVZJRVcsCi0gICAgICAgICAgICAgICAgJnByZXZpZXdSZXF1ZXN0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKLSAgICAgICAgICAgICAgICBwcmV2aWV3U3RyZWFtSWRzKSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwKLSAgICAgICAgICAgICAgICAmcmVxdWVzdElkLCAxKSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG1ldGVyaW5nIHJlcXVlc3QsIG1hbnVhbCBzZXR0aW5ncwotICAgICAgICAvLyBNYW51YWwgY29udHJvbDogRGlzYWJsZSAzQSwgbm9pc2UgcmVkdWN0aW9uLCBlZGdlIHNoYXJwaW5nCi0gICAgICAgIHVpbnQ4X3QgY21PZmYgPSBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX0NPTlRST0xfTU9ERV9PRkYpOwotICAgICAgICB1aW50OF90IG5yT2ZmID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERV9PRkYpOwotICAgICAgICB1aW50OF90IHNoYXJwT2ZmID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oQU5EUk9JRF9FREdFX01PREVfT0ZGKTsKLSAgICAgICAgVmVjdG9yPGludDMyX3Q+IG1ldGVyaW5nU3RyZWFtSWRzOwotICAgICAgICBtZXRlcmluZ1N0cmVhbUlkcy5wdXNoKG1ldGVyaW5nU3RyZWFtSWQpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KAotICAgICAgICAgICAgICAgIENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKLSAgICAgICAgICAgICAgICAmbWV0ZXJpbmdSZXF1ZXN0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbWV0ZXJpbmdSZXF1ZXN0LnVwZGF0ZSgKLSAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCi0gICAgICAgICAgICAgICAgbWV0ZXJpbmdTdHJlYW1JZHMpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtZXRlcmluZ1JlcXVlc3QudXBkYXRlKAotICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9NT0RFLAotICAgICAgICAgICAgICAgICZjbU9mZiwgMSkpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1ldGVyaW5nUmVxdWVzdC51cGRhdGUoCi0gICAgICAgICAgICAgICAgQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERSwKLSAgICAgICAgICAgICAgICAmbnJPZmYsIDEpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtZXRlcmluZ1JlcXVlc3QudXBkYXRlKAotICAgICAgICAgICAgICAgIEFORFJPSURfRURHRV9NT0RFLAotICAgICAgICAgICAgICAgICZzaGFycE9mZiwgMSkpOwotCi0gICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHJlcXVlc3QsIG1hbnVhbCBzZXR0aW5ncwotICAgICAgICBWZWN0b3I8aW50MzJfdD4gY2FwdHVyZVN0cmVhbUlkczsKLSAgICAgICAgY2FwdHVyZVN0cmVhbUlkcy5wdXNoKGNhcHR1cmVTdHJlYW1JZCk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgQ0FNRVJBMl9URU1QTEFURV9QUkVWSUVXLAotICAgICAgICAgICAgICAgICZjYXB0dXJlUmVxdWVzdCkpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIGNhcHR1cmVSZXF1ZXN0LnVwZGF0ZSgKLSAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCi0gICAgICAgICAgICAgICAgY2FwdHVyZVN0cmVhbUlkcykpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIGNhcHR1cmVSZXF1ZXN0LnVwZGF0ZSgKLSAgICAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfTU9ERSwKLSAgICAgICAgICAgICAgICAmY21PZmYsIDEpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBjYXB0dXJlUmVxdWVzdC51cGRhdGUoCi0gICAgICAgICAgICAgICAgQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERSwKLSAgICAgICAgICAgICAgICAmbnJPZmYsIDEpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBjYXB0dXJlUmVxdWVzdC51cGRhdGUoCi0gICAgICAgICAgICAgICAgQU5EUk9JRF9FREdFX01PREUsCi0gICAgICAgICAgICAgICAgJnNoYXJwT2ZmLCAxKSk7Ci0gICAgfQotCi0gICAgc3A8Q2FtZXJhU3RyZWFtPiBDcmVhdGVTdHJlYW0oCi0gICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIGRldmljZSwKLSAgICAgICAgICAgIENhbWVyYVN0cmVhbVBhcmFtcyBwYXJhbSA9IERFRkFVTFRfU1RSRUFNX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSA9IE5VTEwsCi0gICAgICAgICAgICBib29sIHVzZUNwdUNvbnN1bWVyID0gdHJ1ZSkgewotICAgICAgICBwYXJhbS5tRm9ybWF0ID0gTWFwQXV0b0Zvcm1hdChwYXJhbS5tRm9ybWF0KTsKLSAgICAgICAgcmV0dXJuIG5ldyBDYW1lcmFTdHJlYW0od2lkdGgsIGhlaWdodCwgZGV2aWNlLAotICAgICAgICAgICAgICAgIHBhcmFtLCBzdXJmYWNlLCB1c2VDcHVDb25zdW1lcik7Ci0gICAgfQotCi0gICAgdm9pZCBDYXB0dXJlQnVyc3QoQ2FtZXJhTWV0YWRhdGEmIHJlcXVlc3QsIHNpemVfdCByZXF1ZXN0Q291bnQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50NjRfdD4mIGV4cG9zdXJlcywKLSAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vuc2l0aXZpdGllcywKLSAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYVN0cmVhbT4mIHN0cmVhbSwKLSAgICAgICAgICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbiwKLSAgICAgICAgICAgIGludDMyX3QqIHJlcXVlc3RJZFN0YXJ0KSB7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9TRU5TT1JfRlJBTUVfRFVSQVRJT04sCi0gICAgICAgICAgICAgICAgJm1pbkZyYW1lRHVyYXRpb24sIDEpKTsKLSAgICAgICAgLy8gU3VibWl0IGEgc2VyaWVzIG9mIHJlcXVlc3RzIHdpdGggdGhlIHNwZWNpZmllZCBleHBvc3VyZS9nYWluIHZhbHVlcy4KLSAgICAgICAgaW50MzJfdCB0YXJnZXRSZXF1ZXN0SWQgPSAqcmVxdWVzdElkU3RhcnQ7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdENvdW50OyBpKyspIHsKLSAgICAgICAgICAgIEFTU0VSVF9FUShPSywgcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELCByZXF1ZXN0SWRTdGFydCwgMSkpOwotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FLCAmZXhwb3N1cmVzW2ldLCAxKSk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoT0ssIHJlcXVlc3QudXBkYXRlKEFORFJPSURfU0VOU09SX1NFTlNJVElWSVRZLCAmc2Vuc2l0aXZpdGllc1tpXSwgMSkpOwotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5jYXB0dXJlKHJlcXVlc3QpKTsKLSAgICAgICAgICAgIEFMT0dWKCJTdWJtaXR0aW5nIHJlcXVlc3Qgd2l0aDogaWQgJWQgd2l0aCBleHBvc3VyZSAlIiBQUklkNjQgIiwgc2Vuc2l0aXZpdHkgJWQiLAotICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdElkU3RhcnQsIGV4cG9zdXJlc1tpXSwgc2Vuc2l0aXZpdGllc1tpXSk7Ci0gICAgICAgICAgICBpZiAoQ0FNRVJBX01VTFRJX1NUUkVBTV9ERUJVR0dJTkcpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmR1bXAoU1RET1VUX0ZJTEVOTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKnJlcXVlc3RJZFN0YXJ0KSsrOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdldCBjYXB0dXJlIGJ1cnN0IHJlc3VsdHMuCi0gICAgICAgIFZlY3Rvcjxuc2Vjc190PiBjYXB0dXJlQnVyc3RUaW1lczsKLSAgICAgICAgc3A8Q3B1Q29uc3VtZXI+IGNvbnN1bWVyID0gc3RyZWFtLT5HZXRDb25zdW1lcigpOwotICAgICAgICBzcDxGcmFtZUxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0cmVhbS0+R2V0RnJhbWVMaXN0ZW5lcigpOwotCi0gICAgICAgIC8vIFNldCB3YWl0IGxpbWl0IGJhc2VkIG9uIGV4cGVjdGVkIGZyYW1lIGR1cmF0aW9uLgotICAgICAgICBpbnQ2NF90IHdhaXRMaW1pdCA9IENBTUVSQV9GUkFNRV9USU1FT1VUOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcXVlc3RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBBTE9HVigiUmVhZGluZyByZXF1ZXN0IHJlc3VsdCAlenUiLCBpKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBSYWlzZSB0aGUgdGltZW91dCB0byBiZSBhdCBsZWFzdCB0d2ljZSBhcyBsb25nIGFzIHRoZSBleHBvc3VyZQotICAgICAgICAgICAgICogdGltZS4gdG8gYXZvaWQgYSBmYWxzZSBwb3NpdGl2ZSB3aGVuIHRoZSB0aW1lb3V0IGlzIHRvbyBzaG9ydC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChleHBvc3VyZXNbaV0gKiBFWFBfV0FJVF9NVUxUSVBMSUVSKSA+IHdhaXRMaW1pdCkgewotICAgICAgICAgICAgICAgIHdhaXRMaW1pdCA9IGV4cG9zdXJlc1tpXSAqIEVYUF9XQUlUX01VTFRJUExJRVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENhcHR1cmVSZXN1bHQgcmVzdWx0OwotICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZnJhbWVNZXRhZGF0YTsKLSAgICAgICAgICAgIGludDMyX3QgcmVzdWx0UmVxdWVzdElkOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+d2FpdEZvck5leHRGcmFtZSh3YWl0TGltaXQpKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmdldE5leHRSZXN1bHQoJnJlc3VsdCkpOwotICAgICAgICAgICAgICAgIGZyYW1lTWV0YWRhdGEgPSByZXN1bHQubU1ldGFkYXRhOwotCi0gICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgcmVzdWx0RW50cnkgPSBmcmFtZU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMXUsIHJlc3VsdEVudHJ5LmNvdW50KTsKLSAgICAgICAgICAgICAgICByZXN1bHRSZXF1ZXN0SWQgPSByZXN1bHRFbnRyeS5kYXRhLmkzMlswXTsKLSAgICAgICAgICAgICAgICBpZiAoQ0FNRVJBX01VTFRJX1NUUkVBTV9ERUJVR0dJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJjYXB0dXJlIHJlc3VsdCByZXEgaWQ6ICIgPDwgcmVzdWx0UmVxdWVzdElkIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChyZXN1bHRSZXF1ZXN0SWQgIT0gdGFyZ2V0UmVxdWVzdElkKTsKLSAgICAgICAgICAgIHRhcmdldFJlcXVlc3RJZCsrOwotICAgICAgICAgICAgQUxPR1YoIkdvdCBjYXB0dXJlIGJ1cnN0IHJlc3VsdCBmb3IgcmVxdWVzdCAlenUiLCBpKTsKLQotICAgICAgICAgICAgLy8gVmFsaWRhdGUgY2FwdHVyZSByZXN1bHQKLSAgICAgICAgICAgIGlmIChDQU1FUkFfTVVMVElfU1RSRUFNX0RFQlVHR0lORykgewotICAgICAgICAgICAgICAgIGZyYW1lTWV0YWRhdGEuZHVtcChTVERPVVRfRklMRU5PKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVE9ETzogTmVlZCByZXZpc2l0IGl0IHRvIGZpZ3VyZSBvdXQgYW4gYWNjdXJhdGUgbWFyZ2luLgotICAgICAgICAgICAgaW50NjRfdCByZXN1bHRFeHBvc3VyZSA9IEdldEV4cG9zdXJlVmFsdWUoZnJhbWVNZXRhZGF0YSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlc3VsdFNlbnNpdGl2aXR5ID0gR2V0U2Vuc2l0aXZpdHkoZnJhbWVNZXRhZGF0YSk7Ci0gICAgICAgICAgICBFWFBFQ1RfTEUoc2Vuc2l0aXZpdGllc1tpXSAqICgxLjAgLSBUT0xFUkFOQ0VfTUFSR0lOX01FVEFEQVRBKSwgcmVzdWx0U2Vuc2l0aXZpdHkpOwotICAgICAgICAgICAgRVhQRUNUX0dFKHNlbnNpdGl2aXRpZXNbaV0gKiAoMS4wICsgVE9MRVJBTkNFX01BUkdJTl9NRVRBREFUQSksIHJlc3VsdFNlbnNpdGl2aXR5KTsKLSAgICAgICAgICAgIEVYUEVDVF9MRShleHBvc3VyZXNbaV0gKiAoMS4wIC0gVE9MRVJBTkNFX01BUkdJTl9NRVRBREFUQSksIHJlc3VsdEV4cG9zdXJlKTsKLSAgICAgICAgICAgIEVYUEVDVF9HRShleHBvc3VyZXNbaV0gKiAoMS4wICsgVE9MRVJBTkNFX01BUkdJTl9NRVRBREFUQSksIHJlc3VsdEV4cG9zdXJlKTsKLQotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCBsaXN0ZW5lci0+d2FpdEZvckZyYW1lKHdhaXRMaW1pdCkpOwotICAgICAgICAgICAgY2FwdHVyZUJ1cnN0VGltZXMucHVzaF9iYWNrKHN5c3RlbVRpbWUoKSk7Ci0gICAgICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKLSAgICAgICAgICAgIEFTU0VSVF9FUShPSywgY29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpKTsKLSAgICAgICAgICAgIEFMT0dWKCJHb3QgY2FwdHVyZSBidWZmZXIgZm9yIHJlcXVlc3QgJXp1IiwgaSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVE9ETzogVmFsaWRhdGUgY2FwdHVyZSBidWZmZXIuIEN1cnJlbnQgYnJpZ2h0bmVzcyBjYWxjdWxhdGlvbgotICAgICAgICAgICAgICogaXMgdG9vIHNsb3csIGl0IGFsc28gZG9lc24ndCBhY2NvdW50IGZvciBzYXR1cmF0aW9uIGVmZmVjdHMsCi0gICAgICAgICAgICAgKiB3aGljaCBpcyBxdWl0ZSBjb21tb24gc2luY2Ugd2UgYXJlIGdvaW5nIG92ZXIgYSBzaWduaWZpY2FudAotICAgICAgICAgICAgICogcmFuZ2Ugb2YgRVZzLiB3ZSBuZWVkIGZpZ3VyZSBvdXQgc29tZSByZWxpYWJsZSB3YXkgdG8gdmFsaWRhdGUKLSAgICAgICAgICAgICAqIGJ1ZmZlciBkYXRhLgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIEFTU0VSVF9FUShPSywgY29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpKTsKLSAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVCdXJzdFRpbWVzW2ldIC0gY2FwdHVyZUJ1cnN0VGltZXNbaS0xXTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfR0UodGltZURlbHRhICogKCAxICsgVE9MRVJBTkNFX01BUkdJTl9DQVBUVVJFKSwgZXhwb3N1cmVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVudGlvbmFsbHkgc2hhZG93IGRlZmF1bHQgQ3JlYXRlU3RyZWFtIGZ1bmN0aW9uIGZyb20gYmFzZSBjbGFzcywKLSAgICAgKiBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYW55IHRlc3QgaW4gdGhpcyBjbGFzcyB0byB1c2UgdGhlIGRlZmF1bHQKLSAgICAgKiBzdHJlYW0gY3JlYXRpb24gZnVuY3Rpb24uCi0gICAgICovCi0gICAgdm9pZCBDcmVhdGVTdHJlYW0oKSB7Ci0gICAgfQotfTsKLQotLyoqCi0gKiBUaGlzIHRlc3QgYWRkcyBtdWx0aXBsZSBzdHJlYW0gdXNlIGNhc2UgdGVzdCwgYmFzaWNhbGx5LCB0ZXN0IDMKLSAqIHN0cmVhbXM6Ci0gKgotICogMS4gUHJldmlldyBzdHJlYW0sIHdpdGggbGFyZ2Ugc2l6ZSB0aGF0IGlzIG5vIGJpZ2dlciB0aGFuIDEwODBwCi0gKiB3ZSByZW5kZXIgdGhpcyBzdHJlYW0gdG8gZGlzcGxheSBhbmQgdmFyeSB0aGUgZXhwb3N1cmUgdGltZSBmb3IKLSAqIGZvciBjZXJ0YWluIGFtb3VudCBvZiB0aW1lIGZvciB2aXN1YWxpemF0aW9uIHB1cnBvc2UuCi0gKgotICogMi4gTWV0ZXJpbmcgc3RyZWFtLCB3aXRoIHNtYWxsIHNpemUgdGhhdCBpcyBubyBiaWdnZXIgdGhhbiBWR0Egc2l6ZS4KLSAqIGEgYnVyc3QgaXMgaXNzdWVkIGZvciBkaWZmZXJlbnQgZXhwb3N1cmUgdGltZXMgYW5kIGFuYWxvZyBnYWlucwotICogKG9yIGFuYWxvZyBnYWluIGltcGxlbWVudGVkIHNlbnNpdGl2aXRpZXMpIHRoZW4gY2hlY2sgaWYgdGhlIGNhcHR1cmUKLSAqIHJlc3VsdCBtZXRhZGF0YSBtYXRjaGVzIHRoZSByZXF1ZXN0LgotICoKLSAqIDMuIENhcHR1cmUgc3RyZWFtLCB0aGlzIGlzIGJhc2ljYWxseSBzaW1pbGFyIGFzIG1ldGVydGluZyBzdHJlYW0sIGJ1dAotICogaGFzIGxhcmdlIHNpemUsIHdoaWNoIGlzIHRoZSBsYXJnZXN0IHN1cHBvcnRlZCBKUEVHIGNhcHR1cmUgc2l6ZS4KLSAqCi0gKiBUaGlzIG11bHRpcGxlIHN0cmVhbSB0ZXN0IGlzIHRvIHRlc3QgaWYgSEFMIHN1cHBvcnRzOgotICoKLSAqIDEuIE11bHRpcGxlIHN0cmVhbXMgbGlrZSBhYm92ZSwgSEFMIHNob3VsZCBzdXBwb3J0IGF0IGxlYXN0IDMgc3RyZWFtcwotICogY29uY3VycmVudGx5OiBvbmUgcHJldmlldyBzdHJlYW0sIDIgb3RoZXIgWVVWIHN0cmVhbS4KLSAqCi0gKiAyLiBNYW51YWwgY29udHJvbChnYWluL2V4cG9zdXJlKSBvZiBtdXRpcGxlIGJ1cnN0IGNhcHR1cmUuCi0gKi8KLS8vIERpc2FibGUgdGhpcyB0ZXN0IGZvciBub3csIGFzIHdlIG5lZWQgY2xlYW51cCB0aGUgdXNhZ2Ugb2YgdGhlIGRlcHJlY2F0ZWQgdGFnIHF1aXRlIGEgYml0LgotVEVTVF9GKENhbWVyYU11bHRpU3RyZWFtVGVzdCwgRElTQUJMRURfTXVsdGlCdXJzdCkgewotCi0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotCi0gICAgY29uc3QgaW50MzJfdCogaW1wbERlZkRhdGE7Ci0gICAgc2l6ZV90IGltcGxEZWZDb3VudDsKLSAgICBjb25zdCBpbnQzMl90KiBqcGVnRGF0YTsKLSAgICBzaXplX3QganBlZ0NvdW50OwotICAgIGlmIChnZXREZXZpY2VWZXJzaW9uKCkgPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMgPQotICAgICAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1BST0NFU1NFRF9TSVpFUyk7Ci0gICAgICAgIEFTU0VSVF9FUSgwdSwgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQgJSAyKTsKLSAgICAgICAgQVNTRVJUX0dFKGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50LCAydSk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhdmFpbGFibGVQcm9jZXNzZWRNaW5GcmFtZUR1cmF0aW9ucyA9Ci0gICAgICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX01JTl9EVVJBVElPTlMpOwotICAgICAgICBFWFBFQ1RfRVEoYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQsCi0gICAgICAgICAgICBhdmFpbGFibGVQcm9jZXNzZWRNaW5GcmFtZUR1cmF0aW9ucy5jb3VudCAqIDIpOwotCi0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhdmFpbGFibGVKcGVnU2l6ZXMgPQotICAgICAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMpOwotICAgICAgICBBU1NFUlRfRVEoMHUsIGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudCAlIDIpOwotICAgICAgICBBU1NFUlRfR0UoYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50LCAydSk7Ci0gICAgICAgIGltcGxEZWZEYXRhID0gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzI7Ci0gICAgICAgIGltcGxEZWZDb3VudCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50OwotICAgICAgICBqcGVnRGF0YSA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMjsKLSAgICAgICAganBlZ0NvdW50ID0gYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdldFJlc29sdXRpb25MaXN0KEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwgJmltcGxEZWZEYXRhLCAmaW1wbERlZkNvdW50KTsKLSAgICAgICAgQVNTRVJUX05FKDB1LCBpbXBsRGVmQ291bnQpCi0gICAgICAgICAgICA8PCAiTWlzc2luZyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHNpemVzIjsKLSAgICAgICAgQVNTRVJUX0VRKDB1LCBpbXBsRGVmQ291bnQgJSAyKTsKLSAgICAgICAgQVNTRVJUX0dFKGltcGxEZWZDb3VudCwgMnUpOwotCi0gICAgICAgIGdldFJlc29sdXRpb25MaXN0KEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgJmpwZWdEYXRhLCAmanBlZ0NvdW50KTsKLSAgICAgICAgQVNTRVJUX0VRKDB1LCBqcGVnQ291bnQgJSAyKTsKLSAgICAgICAgQVNTRVJUX0dFKGpwZWdDb3VudCwgMnUpOwotICAgIH0KLQotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBoYXJkd2FyZUxldmVsID0KLSAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTCk7Ci0gICAgQVNTRVJUX0VRKDF1LCBoYXJkd2FyZUxldmVsLmNvdW50KTsKLSAgICB1aW50OF90IGxldmVsID0gaGFyZHdhcmVMZXZlbC5kYXRhLnU4WzBdOwotICAgIEFTU0VSVF9HRShsZXZlbCwgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9MSU1JVEVEKTsKLSAgICBBU1NFUlRfTEUobGV2ZWwsIEFORFJPSURfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfRlVMTCk7Ci0gICAgaWYgKGxldmVsID09IEFORFJPSURfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfTElNSVRFRCkgewotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQotICAgICAgICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgICAgICAgc3RkOjpjZXJyIDw8ICJTa2lwcGluZyB0ZXN0ICIKLSAgICAgICAgICAgICAgICAgIDw8IHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSA8PCAiLiIKLSAgICAgICAgICAgICAgICAgIDw8IHRlc3RfaW5mby0+bmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiIGJlY2F1c2UgSEFMIGhhcmR3YXJlIHN1cHBvcnRlZCBsZXZlbCBpcyBsaW1pdGVkICIKLSAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEZpbmQgdGhlIHJpZ2h0IHNpemVzIGZvciBwcmV2aWV3LCBtZXRlcmluZywgYW5kIGNhcHR1cmUgc3RyZWFtcwotICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbiA9IERFRkFVTFRfRlJBTUVfRFVSQVRJT047Ci0gICAgU2l6ZSBwcm9jZXNzZWRNaW5TaXplID0gezAsIDB9LCBwcm9jZXNzZWRNYXhTaXplID0gezAsIDB9OwotICAgIFNpemUganBlZ01heFNpemUgPSB7MCwgMH07Ci0KLSAgICBpbnQzMl90IG1pbklkeCwgbWF4SWR4OwotICAgIEdldE1pblNpemUoaW1wbERlZkRhdGEsIGltcGxEZWZDb3VudCwgJnByb2Nlc3NlZE1pblNpemUsICZtaW5JZHgpOwotICAgIEdldE1heFNpemUoaW1wbERlZkRhdGEsIGltcGxEZWZDb3VudCwgJnByb2Nlc3NlZE1heFNpemUsICZtYXhJZHgpOwotICAgIEFMT0dWKCJGb3VuZCBwcm9jZXNzZWQgbWF4IHNpemU6ICVkeCVkLCBtaW4gc2l6ZSA9ICVkeCVkIiwKLSAgICAgICAgICAgIHByb2Nlc3NlZE1heFNpemUud2lkdGgsIHByb2Nlc3NlZE1heFNpemUuaGVpZ2h0LAotICAgICAgICAgICAgcHJvY2Vzc2VkTWluU2l6ZS53aWR0aCwgcHJvY2Vzc2VkTWluU2l6ZS5oZWlnaHQpOwotCi0gICAgaWYgKGdldERldmljZVZlcnNpb24oKSA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhdmFpbGFibGVQcm9jZXNzZWRNaW5GcmFtZUR1cmF0aW9ucyA9Ci0gICAgICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX01JTl9EVVJBVElPTlMpOwotICAgICAgICBtaW5GcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgIGF2YWlsYWJsZVByb2Nlc3NlZE1pbkZyYW1lRHVyYXRpb25zLmRhdGEuaTY0W21heElkeCAvIDJdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1pbkZyYW1lRHVyYXRpb24gPSBnZXRNaW5GcmFtZUR1cmF0aW9uRm9yKAotICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRNYXhTaXplLndpZHRoLCBwcm9jZXNzZWRNYXhTaXplLmhlaWdodCk7Ci0gICAgfQotCi0gICAgRVhQRUNUX0dUKG1pbkZyYW1lRHVyYXRpb24sIDApOwotCi0gICAgaWYgKG1pbkZyYW1lRHVyYXRpb24gPD0gMCkgewotICAgICAgICBtaW5GcmFtZUR1cmF0aW9uID0gREVGQVVMVF9GUkFNRV9EVVJBVElPTjsKLSAgICB9Ci0KLSAgICBBTE9HVigidGFyZ2V0ZWQgbWluaW1hbCBmcmFtZSBkdXJhdGlvbiBpczogJSIgUFJJZDY0ICJucyIsIG1pbkZyYW1lRHVyYXRpb24pOwotCi0gICAgR2V0TWF4U2l6ZShqcGVnRGF0YSwganBlZ0NvdW50LCAmanBlZ01heFNpemUsICZtYXhJZHgpOwotICAgIEFMT0dWKCJGb3VuZCBKcGVnIHNpemUgbWF4IGlkeCA9ICVkIiwgbWF4SWR4KTsKLQotICAgIC8vIE1heCBKcGVnIHNpemUgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBwcm9jZXNzZWQgc2l6ZXMuIFVzZSBpdCBmb3IKLSAgICAvLyBZVVYgY2FwdHVyZSBhbnl3YXkuCi0gICAgRVhQRUNUX0VRKHByb2Nlc3NlZE1heFNpemUud2lkdGgsIGpwZWdNYXhTaXplLndpZHRoKTsKLSAgICBFWFBFQ1RfRVEocHJvY2Vzc2VkTWF4U2l6ZS5oZWlnaHQsIGpwZWdNYXhTaXplLmhlaWdodCk7Ci0KLSAgICAvLyBDYXAgcHJldmlldyBzaXplLgotICAgIFNpemUgcHJldmlld0xpbWl0ID0geyBQUkVWSUVXX1dJRFRIX0NBUCwgUFJFVklFV19IRUlHSFRfQ0FQIH07Ci0gICAgLy8gRklYTUU6IG5lZWQgbWFrZSBzdXJlIHRoZSBwcmV2aWV3TGltaXQgaXMgc3VwcG9ydGVkIGJ5IEhBTC4KLSAgICBTaXplIHByZXZpZXdTaXplID0gQ2FwU2l6ZShwcmV2aWV3TGltaXQsIHByb2Nlc3NlZE1heFNpemUpOwotICAgIC8vIENhcCBNZXRlcmluZyBzaXplLgotICAgIFNpemUgbWV0ZXJpbmdMaW1pdCA9IHsgTUVURVJJTkdfV0lEVEhfQ0FQLCBNRVRFUklOR19IRUlHSFRfQ0FQIH07Ci0gICAgLy8gQ2FwIG1ldGVyaW5nIHNpemUgdG8gVkdBIChWR0EgaXMgbWFuZGF0b3J5IGJ5IENERCkKLSAgICBTaXplIG1ldGVyaW5nU2l6ZSA9IENhcFNpemUobWV0ZXJpbmdMaW1pdCwgcHJvY2Vzc2VkTWluU2l6ZSk7Ci0gICAgLy8gQ2FwdHVyZSBzdHJlYW0gc2hvdWxkIGJlIHRoZSBtYXggc2l6ZSBvZiBqcGVnIHNpemVzLgotICAgIEFMT0dWKCJwcmV2aWV3IHNpemU6ICVkeCVkLCBtZXRlcmluZyBzaXplOiAlZHglZCwgY2FwdHVyZSBzaXplOiAlZHglZCIsCi0gICAgICAgICAgICBwcmV2aWV3U2l6ZS53aWR0aCwgcHJldmlld1NpemUuaGVpZ2h0LAotICAgICAgICAgICAgbWV0ZXJpbmdTaXplLndpZHRoLCBtZXRlcmluZ1NpemUuaGVpZ2h0LAotICAgICAgICAgICAganBlZ01heFNpemUud2lkdGgsIGpwZWdNYXhTaXplLmhlaWdodCk7Ci0KLSAgICAvLyBDcmVhdGUgc3RyZWFtcwotICAgIC8vIFByZXZpZXcgc3RyZWFtOiBzbWFsbCByZXNvbHV0aW9uLCByZW5kZXIgb24gdGhlIHNjcmVlbi4KLSAgICBzcDxDYW1lcmFTdHJlYW0+IHByZXZpZXdTdHJlYW07Ci0gICAgewotICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVPblNjcmVlblN1cmZhY2UoLypvdXQqL3N1cmZhY2UpKTsKLSAgICAgICAgcHJldmlld1N0cmVhbSA9IENyZWF0ZVN0cmVhbSgKLSAgICAgICAgICAgICAgICBwcmV2aWV3U2l6ZS53aWR0aCwKLSAgICAgICAgICAgICAgICBwcmV2aWV3U2l6ZS5oZWlnaHQsCi0gICAgICAgICAgICAgICAgbURldmljZSwKLSAgICAgICAgICAgICAgICBESVNQTEFZX1NUUkVBTV9QQVJBTUVURVJTLAotICAgICAgICAgICAgICAgIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIHByZXZpZXdTdHJlYW0uZ2V0KCkpOwotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShwcmV2aWV3U3RyZWFtLT5TZXRVcCgpKTsKLSAgICB9Ci0gICAgLy8gTWV0ZXJpbmcgYnVyc3Qgc3RyZWFtOiBzbWFsbCByZXNvbHV0aW9uIHl1diBzdHJlYW0KLSAgICBzcDxDYW1lcmFTdHJlYW0+IG1ldGVyaW5nU3RyZWFtID0KLSAgICAgICAgICAgIENyZWF0ZVN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgbWV0ZXJpbmdTaXplLndpZHRoLAotICAgICAgICAgICAgICAgICAgICBtZXRlcmluZ1NpemUuaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlKTsKLSAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIG1ldGVyaW5nU3RyZWFtLmdldCgpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShtZXRlcmluZ1N0cmVhbS0+U2V0VXAoKSk7Ci0gICAgLy8gQ2FwdHVyZSBidXJzdCBzdHJlYW06IGZ1bGwgcmVzb2x1dGlvbiB5dXYgc3RyZWFtCi0gICAgc3A8Q2FtZXJhU3RyZWFtPiBjYXB0dXJlU3RyZWFtID0KLSAgICAgICAgICAgIENyZWF0ZVN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAganBlZ01heFNpemUud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGpwZWdNYXhTaXplLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgbURldmljZSk7Ci0gICAgQVNTRVJUX05FKCh2b2lkKilOVUxMLCBjYXB0dXJlU3RyZWFtLmdldCgpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShjYXB0dXJlU3RyZWFtLT5TZXRVcCgpKTsKLQotICAgIC8vIENyZWF0ZSBQcmV2aWV3IHJlcXVlc3QuCi0gICAgQ2FtZXJhTWV0YWRhdGEgcHJldmlld1JlcXVlc3QsIG1ldGVyaW5nUmVxdWVzdCwgY2FwdHVyZVJlcXVlc3Q7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlUmVxdWVzdHMocHJldmlld1JlcXVlc3QsIG1ldGVyaW5nUmVxdWVzdCwKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LCBwcmV2aWV3U3RyZWFtLT5HZXRTdHJlYW1JZCgpLAotICAgICAgICAgICAgbWV0ZXJpbmdTdHJlYW0tPkdldFN0cmVhbUlkKCksIGNhcHR1cmVTdHJlYW0tPkdldFN0cmVhbUlkKCkpKTsKLQotICAgIC8vIFN0YXJ0IHByZXZpZXcKLSAgICBpZiAoQ0FNRVJBX01VTFRJX1NUUkVBTV9ERUJVR0dJTkcpIHsKLSAgICAgICAgcHJldmlld1JlcXVlc3QuZHVtcChTVERPVVRfRklMRU5PKTsKLSAgICB9Ci0KLSAgICAvLyBHZW5lcmF0ZSBleHBvc3VyZSBhbmQgc2Vuc2l0aXZpdHkgbGlzdHMKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZXhwb3N1cmVUaW1lUmFuZ2UgPQotICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NFTlNPUl9JTkZPX0VYUE9TVVJFX1RJTUVfUkFOR0UpOwotICAgIEFTU0VSVF9FUShleHBvc3VyZVRpbWVSYW5nZS5jb3VudCwgMnUpOwotICAgIGludDY0X3QgbWluRXhwID0gZXhwb3N1cmVUaW1lUmFuZ2UuZGF0YS5pNjRbMF07Ci0gICAgaW50NjRfdCBtYXhFeHAgPSBleHBvc3VyZVRpbWVSYW5nZS5kYXRhLmk2NFsxXTsKLSAgICBBU1NFUlRfR1QobWF4RXhwLCBtaW5FeHApOwotCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHNlbnNpdml0eVJhbmdlID0KLSAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9TRU5TT1JfSU5GT19TRU5TSVRJVklUWV9SQU5HRSk7Ci0gICAgQVNTRVJUX0VRKDJ1LCBzZW5zaXZpdHlSYW5nZS5jb3VudCk7Ci0gICAgaW50MzJfdCBtaW5TZW5zaXRpdml0eSA9IHNlbnNpdml0eVJhbmdlLmRhdGEuaTMyWzBdOwotICAgIGludDMyX3QgbWF4U2Vuc2l0aXZpdHkgPSBzZW5zaXZpdHlSYW5nZS5kYXRhLmkzMlsxXTsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgbWF4QW5hbG9nU2VuRW50cnkgPQotICAgICAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9TRU5TT1JfTUFYX0FOQUxPR19TRU5TSVRJVklUWSk7Ci0gICAgRVhQRUNUX0VRKDF1LCBtYXhBbmFsb2dTZW5FbnRyeS5jb3VudCk7Ci0gICAgaW50MzJfdCBtYXhBbmFsb2dTZW5zaXRpdml0eSA9IG1heEFuYWxvZ1NlbkVudHJ5LmRhdGEuaTMyWzBdOwotICAgIEVYUEVDVF9MRShtYXhBbmFsb2dTZW5zaXRpdml0eSwgbWF4U2Vuc2l0aXZpdHkpOwotICAgIC8vIE9ubHkgdGVzdCB0aGUgc2Vuc2l0aXZpdHkgaW1wbGVtZW50ZWQgYnkgYW5hbG9nIGdhaW4uCi0gICAgaWYgKG1heEFuYWxvZ1NlbnNpdGl2aXR5ID4gbWF4U2Vuc2l0aXZpdHkpIHsKLSAgICAgICAgLy8gRmFsbGJhY2sgdG8gbWF4U2Vuc2l0aXR5Ci0gICAgICAgIG1heEFuYWxvZ1NlbnNpdGl2aXR5ID0gbWF4U2Vuc2l0aXZpdHk7Ci0gICAgfQotCi0gICAgLy8gc2Vuc2l0aXZpdHkgbGlzdCwgb25seSBpbmNsdWRlIHRoZSBzZW5zaXRpdml0aWVzIHRoYXQgYXJlIGltcGxlbWVudGVkCi0gICAgLy8gcHVyZWx5IGJ5IGFuYWxvZyBnYWluIGlmIHBvc3NpYmxlLgotICAgIFZlY3RvcjxpbnQzMl90PiBzZW5zaXRpdml0aWVzOwotICAgIFZlY3RvcjxpbnQ2NF90PiBleHBvc3VyZXM7Ci0gICAgc2l6ZV90IGNvdW50ID0gKG1heEFuYWxvZ1NlbnNpdGl2aXR5IC0gbWluU2Vuc2l0aXZpdHkgKyA5OSkgLyAxMDA7Ci0gICAgc2Vuc2l0aXZpdGllcy5wdXNoX2JhY2sobWluU2Vuc2l0aXZpdHkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBzZW5zaXRpdml0aWVzLnB1c2hfYmFjayhtaW5TZW5zaXRpdml0eSArIGkgKiAxMDApOwotICAgIH0KLSAgICBzZW5zaXRpdml0aWVzLnB1c2hfYmFjayhtYXhBbmFsb2dTZW5zaXRpdml0eSk7Ci0gICAgQUxPR1YoIlNlbnNpdGl2aXR5IFJhbmdlOiBtaW49JWQsIG1heD0lZCIsIG1pblNlbnNpdGl2aXR5LAotICAgICAgICAgICAgbWF4QW5hbG9nU2Vuc2l0aXZpdHkpOwotICAgIGludDY0X3QgZXhwID0gbWluRXhwOwotICAgIHdoaWxlIChleHAgPCBtYXhFeHApIHsKLSAgICAgICAgZXhwb3N1cmVzLnB1c2hfYmFjayhleHApOwotICAgICAgICBleHAgKj0gMjsKLSAgICB9Ci0gICAgLy8gU3dlZXAgdGhlIGV4cG9zdXJlIHZhbHVlIGZvciBwcmV2aWV3LCBqdXN0IGZvciB2aXN1YWwgaW5zcGVjdGlvbiBwdXJwb3NlLgotICAgIHVpbnQ4X3QgY21PZmYgPSBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX0NPTlRST0xfTU9ERV9PRkYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwb3N1cmVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKAotICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9NT0RFLAotICAgICAgICAgICAgICAgICZjbU9mZiwgMSkpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIHByZXZpZXdSZXF1ZXN0LnVwZGF0ZSgKLSAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FLAotICAgICAgICAgICAgICAgICZleHBvc3VyZXNbaV0sIDEpKTsKLSAgICAgICAgQUxPR1YoIlN1Ym1pdHRpbmcgcHJldmlldyByZXF1ZXN0ICV6dSB3aXRoIGV4cG9zdXJlICUiIFBSSWQ2NCwKLSAgICAgICAgICAgICAgICBpLCBleHBvc3VyZXNbaV0pOwotCi0gICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+c2V0U3RyZWFtaW5nUmVxdWVzdChwcmV2aWV3UmVxdWVzdCkpOwotCi0gICAgICAgIC8vIExldCBwcmV2aWV3IHJ1biAyMDBtcyBvbiBzY3JlZW4gZm9yIGVhY2ggZXhwb3N1cmUgdGltZS4KLSAgICAgICAgdXNsZWVwKFBSRVZJRVdfUkVOREVSSU5HX1RJTUVfSU5URVJWQUwpOwotICAgIH0KLQotICAgIHNpemVfdCByZXF1ZXN0Q291bnQgPSBzZW5zaXRpdml0aWVzLnNpemUoKTsKLSAgICBpZiAocmVxdWVzdENvdW50ID4gZXhwb3N1cmVzLnNpemUoKSkgewotICAgICAgICByZXF1ZXN0Q291bnQgPSBleHBvc3VyZXMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8vIFRvIG1haW50YWluIHRoZSByZXF1ZXN0IGlkIHVuaXF1ZW5lc3MgKHByZXZpZXcgcmVxdWVzdCBpZCBpcyAwKSwgbWFrZSBidXJzdCBjYXB0dXJlIHN0YXJ0Ci0gICAgLy8gcmVxdWVzdCBpZCAxIGhlcmUuCi0gICAgaW50MzJfdCByZXF1ZXN0SWRTdGFydCA9IDE7Ci0gICAgLyoqCi0gICAgICogU3VibWl0IG1ldGVyaW5nIHJlcXVlc3QsIHNldCBkZWZhdWx0IGZyYW1lIGR1cmF0aW9uIHRvIG1pbmltYWwgcG9zc2libGUKLSAgICAgKiB2YWx1ZSwgd2Ugd2FudCB0aGUgY2FwdHVyZSB0byBydW4gYXMgZmFzdCBhcyBwb3NzaWJsZS4gSEFMIHNob3VsZCBhZGp1c3QKLSAgICAgKiB0aGUgZnJhbWUgZHVyYXRpb24gdG8gbWluaW1hbCBuZWNlc3NhcnkgdmFsdWUgdG8gc3VwcG9ydCB0aGUgcmVxdWVzdGVkCi0gICAgICogZXhwb3N1cmUgdmFsdWUgaWYgZXhwb3N1cmUgaXMgbGFyZ2VyIHRoYW4gZnJhbWUgZHVyYXRpb24uCi0gICAgICovCi0gICAgQ2FwdHVyZUJ1cnN0KG1ldGVyaW5nUmVxdWVzdCwgcmVxdWVzdENvdW50LCBleHBvc3VyZXMsIHNlbnNpdGl2aXRpZXMsCi0gICAgICAgICAgICBtZXRlcmluZ1N0cmVhbSwgbWluRnJhbWVEdXJhdGlvbiwgJnJlcXVlc3RJZFN0YXJ0KTsKLQotICAgIC8qKgotICAgICAqIFN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QsIHNldCBkZWZhdWx0IGZyYW1lIGR1cmF0aW9uIHRvIG1pbmltYWwgcG9zc2libGUKLSAgICAgKiB2YWx1ZSwgd2Ugd2FudCB0aGUgY2FwdHVyZSB0byBydW4gYXMgZmFzdCBhcyBwb3NzaWJsZS4gSEFMIHNob3VsZCBhZGp1c3QKLSAgICAgKiB0aGUgZnJhbWUgZHVyYXRpb24gdG8gbWluaW1hbCBuZWNlc3NhcnkgdmFsdWUgdG8gc3VwcG9ydCB0aGUgcmVxdWVzdGVkCi0gICAgICogZXhwb3N1cmUgdmFsdWUgaWYgZXhwb3N1cmUgaXMgbGFyZ2VyIHRoYW4gZnJhbWUgZHVyYXRpb24uCi0gICAgICovCi0gICAgQ2FwdHVyZUJ1cnN0KGNhcHR1cmVSZXF1ZXN0LCByZXF1ZXN0Q291bnQsIGV4cG9zdXJlcywgc2Vuc2l0aXZpdGllcywKLSAgICAgICAgICAgIGNhcHR1cmVTdHJlYW0sIG1pbkZyYW1lRHVyYXRpb24sICZyZXF1ZXN0SWRTdGFydCk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpKTsKLX0KLQotfQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFTdHJlYW1GaXh0dXJlLmggYi90ZXN0cy9jYW1lcmEyL0NhbWVyYVN0cmVhbUZpeHR1cmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmZjA1Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL0NhbWVyYVN0cmVhbUZpeHR1cmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0FORFJPSURfSEFMX0NBTUVSQTJfVEVTVFNfU1RSRUFNX0ZJWFRVUkVfXwotI2RlZmluZSBfX0FORFJPSURfSEFMX0NBTUVSQTJfVEVTVFNfU1RSRUFNX0ZJWFRVUkVfXwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi0jaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaD4KLQotI2luY2x1ZGUgIkNhbWVyYU1vZHVsZUZpeHR1cmUuaCIKLSNpbmNsdWRlICJUZXN0RXh0ZW5zaW9ucy5oIgotCi0jZGVmaW5lIEFMSUdOKHgsIG1hc2spICggKCh4KSArIChtYXNrKSAtIDEpICYgfigobWFzaykgLSAxKSApCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci0KLS8vIEZvcm1hdCBzcGVjaWZpZXIgZm9yIHBpY2tpbmcgdGhlIGJlc3QgZm9ybWF0IGZvciBDUFUgcmVhZGluZyB0aGUgZ2l2ZW4gZGV2aWNlCi0vLyB2ZXJzaW9uCi0jZGVmaW5lIENBTUVSQV9TVFJFQU1fQVVUT19DUFVfRk9STUFUICgtMSkKLQotc3RydWN0IENhbWVyYVN0cmVhbVBhcmFtczsKLQotdm9pZCBQcmludFRvKGNvbnN0IENhbWVyYVN0cmVhbVBhcmFtcyYgcCwgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLQotc3RydWN0IENhbWVyYVN0cmVhbVBhcmFtcyB7Ci0gICAgaW50IG1Gb3JtYXQ7Ci0gICAgaW50IG1IZWFwQ291bnQ7Ci0KLX07Ci0KLWlubGluZSA6OnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IENhbWVyYVN0cmVhbVBhcmFtcyAmcCkgewotICAgIFByaW50VG8ocCwgJm9zKTsKLSAgICByZXR1cm4gb3M7Ci19Ci0KLWlubGluZSB2b2lkIFByaW50VG8oY29uc3QgQ2FtZXJhU3RyZWFtUGFyYW1zJiBwLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBjaGFyIGZtdFsxMDBdOwotICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX3NucHJpbnQoCi0gICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTLCBwLm1Gb3JtYXQsIGZtdCwgc2l6ZW9mKGZtdCkpOwotCi0gICAgKm9zIDw8ICAieyAiOwotICAgICpvcyA8PCAgIkZvcm1hdDogMHgiICA8PCBzdGQ6OmhleCA8PCBwLm1Gb3JtYXQgICAgPDwgIiwgIjsKLSAgICAqb3MgPDwgICJGb3JtYXQgbmFtZTogIiA8PCBmbXQgPDwgIiwgIjsKLSAgICAqb3MgPDwgICJIZWFwQ291bnQ6ICIgPDwgICAgICAgICAgICAgcC5tSGVhcENvdW50OwotICAgICpvcyA8PCAiIH0iOwotfQotCi1jbGFzcyBDYW1lcmFTdHJlYW1GaXh0dXJlCi0gICAgOiBwdWJsaWMgQ2FtZXJhTW9kdWxlRml4dHVyZTwvKkluZm9RdWlyayovdHJ1ZT4gewotCi1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQ2FtZXJhU3RyZWFtRml4dHVyZShDYW1lcmFTdHJlYW1QYXJhbXMgcCkKLSAgICA6IENhbWVyYU1vZHVsZUZpeHR1cmUoVGVzdFNldHRpbmdzOjpEZXZpY2VJZCgpKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfQ09OU1RSVUNUT1I7Ci0KLSAgICAgICAgbVBhcmFtID0gcDsKLQotICAgICAgICBTZXRVcCgpOwotICAgIH0KLQotICAgIH5DYW1lcmFTdHJlYW1GaXh0dXJlKCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0RFU1RSVUNUT1I7Ci0KLSAgICAgICAgVGVhckRvd24oKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICB2b2lkIFNldFVwKCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1NFVF9VUDsKLQotICAgICAgICBDYW1lcmFNb2R1bGVGaXh0dXJlOjpTZXRVcCgpOwotCi0gICAgICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7Ci0KLSAgICAgICAgLyogdXNlIGFuIGFyYml0cmFyeSB3LGggKi8KLSAgICAgICAgaWYgKGdldERldmljZVZlcnNpb24oKSA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdGFnID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1BST0NFU1NFRF9TSVpFUzsKLQotICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8gPSBkZXZpY2UtPmluZm8oKTsKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IHN0YXRpY0luZm8uZmluZCh0YWcpOwotICAgICAgICAgICAgQVNTRVJUX05FKDB1LCBlbnRyeS5jb3VudCkKLSAgICAgICAgICAgICAgICA8PCAiTWlzc2luZyB0YWcgYW5kcm9pZC5zY2FsZXIuYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMiOwotCi0gICAgICAgICAgICBBU1NFUlRfTEUoMnUsIGVudHJ5LmNvdW50KTsKLSAgICAgICAgICAgIC8qIHRoaXMgc2VlbXMgbGlrZSBpdCB3b3VsZCBhbHdheXMgYmUgdGhlIHNtYWxsZXN0IHcsaAotICAgICAgICAgICAgICAgYnV0IHdlIGFjdHVhbGx5IG1ha2Ugbm8gY29udHJhY3QgdGhhdCBpdCdzIHNvcnRlZCBhc2MgKi8KLSAgICAgICAgICAgIG1XaWR0aCA9IGVudHJ5LmRhdGEuaTMyWzBdOwotICAgICAgICAgICAgbUhlaWdodCA9IGVudHJ5LmRhdGEuaTMyWzFdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRPdXRwdXRSZXNvbHV0aW9ucygpOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqaW1wbERlZlJlc29sdXRpb25zID0gTlVMTDsKLSAgICAgICAgICAgIHNpemVfdCAgIGltcGxEZWZSZXNvbHV0aW9uc0NvdW50OwotCi0gICAgICAgICAgICBpbnQgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOwotCi0gICAgICAgICAgICBnZXRSZXNvbHV0aW9uTGlzdChmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICZpbXBsRGVmUmVzb2x1dGlvbnMsICZpbXBsRGVmUmVzb2x1dGlvbnNDb3VudCk7Ci0gICAgICAgICAgICBBU1NFUlRfTkUoMHUsIGltcGxEZWZSZXNvbHV0aW9uc0NvdW50KQotICAgICAgICAgICAgICAgIDw8ICJNaXNzaW5nIGltcGxlbWVudGF0aW9uIGRlZmluZWQgc2l6ZXMiOwotICAgICAgICAgICAgbVdpZHRoID0gaW1wbERlZlJlc29sdXRpb25zWzBdOwotICAgICAgICAgICAgbUhlaWdodCA9IGltcGxEZWZSZXNvbHV0aW9uc1sxXTsKLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1RFQVJfRE9XTjsKLQotICAgICAgICAvLyBpbXBvcnRhbnQ6IHNodXQgZG93biBIQUwgYmVmb3JlIHJlbGVhc2luZyBzdHJlYW1zCi0gICAgICAgIENhbWVyYU1vZHVsZUZpeHR1cmU6OlRlYXJEb3duKCk7Ci0KLSAgICAgICAgZGVsZXRlT3V0cHV0UmVzb2x1dGlvbnMoKTsKLSAgICAgICAgbVN1cmZhY2UuY2xlYXIoKTsKLSAgICAgICAgbUNwdUNvbnN1bWVyLmNsZWFyKCk7Ci0gICAgICAgIG1GcmFtZUxpc3RlbmVyLmNsZWFyKCk7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0KLSAgICBpbnQ2NF90IGdldE1pbkZyYW1lRHVyYXRpb25Gb3IoaW50MzJfdCBmb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Ci0gICAgICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbiA9IC0xTDsKLSAgICAgICAgY29uc3QgaW50IHRhZyA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TOwotICAgICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlOwotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbyA9IGRldmljZS0+aW5mbygpOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVNaW5EdXJhdGlvbnMgPSBzdGF0aWNJbmZvLmZpbmQodGFnKTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGF2YWlsYWJsZU1pbkR1cmF0aW9ucy5jb3VudDsgaSArPSA0KSB7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ID09IGF2YWlsYWJsZU1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpXSAmJgotICAgICAgICAgICAgICAgICAgICB3aWR0aCA9PSBhdmFpbGFibGVNaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIDFdICYmCi0gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9PSBhdmFpbGFibGVNaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIDJdKSB7Ci0gICAgICAgICAgICAgICAgbWluRnJhbWVEdXJhdGlvbiA9IGF2YWlsYWJsZU1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpICsgM107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1pbkZyYW1lRHVyYXRpb247Ci0gICAgfQotCi0gICAgdm9pZCBidWlsZE91dHB1dFJlc29sdXRpb25zKCkgewotICAgICAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbigpIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobU91dHB1dFJlc29sdXRpb25zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY29uc3QgaW50IHRhZyA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlM7Ci0gICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cm1Db25maWdzID0gc3RhdGljSW5mby5maW5kKHRhZyk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoMHUsIGF2YWlsYWJsZVN0cm1Db25maWdzLmNvdW50ICUgNCk7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU3RybUNvbmZpZ3MuY291bnQ7IGkgKz0gNCkgewotICAgICAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RybUNvbmZpZ3MuZGF0YS5pMzJbaV07Ci0gICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cm1Db25maWdzLmRhdGEuaTMyW2kgKyAxXTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cm1Db25maWdzLmRhdGEuaTMyW2kgKyAyXTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGluT3JPdXQgPSBhdmFpbGFibGVTdHJtQ29uZmlncy5kYXRhLmkzMltpICsgM107Ci0gICAgICAgICAgICAgICAgaWYgKGluT3JPdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbU91dHB1dFJlc29sdXRpb25zLmluZGV4T2ZLZXkoZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBtT3V0cHV0UmVzb2x1dGlvbnMuYWRkKGZvcm1hdCwgbmV3IFZlY3RvcjxpbnQzMl90PigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKGluZGV4ID49IDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiAqcmVzb2x1dGlvbnMgPSBtT3V0cHV0UmVzb2x1dGlvbnMuZWRpdFZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9ucy0+YWRkKHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbnMtPmFkZChoZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZ2V0UmVzb2x1dGlvbkxpc3QoaW50MzJfdCBmb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBpbnQzMl90ICoqbGlzdCwKLSAgICAgICAgICAgIHNpemVfdCAqY291bnQpIHsKLSAgICAgICAgQUxPR1YoIkdldHRpbmcgcmVzb2x1dGlvbnMgZm9yIGZvcm1hdCAleCIsIGZvcm1hdCk7Ci0gICAgICAgIGlmIChnZXREZXZpY2VWZXJzaW9uKCkgPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBpbmRleCA9IG1PdXRwdXRSZXNvbHV0aW9ucy5pbmRleE9mS2V5KGZvcm1hdCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKGluZGV4ID49IDApOwotICAgICAgICBWZWN0b3I8aW50MzJfdD4qIHJlc29sdXRpb25zID0gbU91dHB1dFJlc29sdXRpb25zLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAqbGlzdCA9IHJlc29sdXRpb25zLT5hcnJheSgpOwotICAgICAgICAqY291bnQgPSByZXNvbHV0aW9ucy0+c2l6ZSgpOwotICAgIH0KLQotICAgIHZvaWQgZGVsZXRlT3V0cHV0UmVzb2x1dGlvbnMoKSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtT3V0cHV0UmVzb2x1dGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiogcmVzb2x1dGlvbnMgPSBtT3V0cHV0UmVzb2x1dGlvbnMuZWRpdFZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBkZWxldGUgcmVzb2x1dGlvbnM7Ci0gICAgICAgIH0KLSAgICAgICAgbU91dHB1dFJlc29sdXRpb25zLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgc3RydWN0IEZyYW1lTGlzdGVuZXIgOiBwdWJsaWMgQ29uc3VtZXJCYXNlOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKLQotICAgICAgICBGcmFtZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgbVBlbmRpbmdGcmFtZXMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyogaXRlbSAqLykgewotICAgICAgICAgICAgQUxPR1YoIkZyYW1lIG5vdyBhdmFpbGFibGUgKHN0YXJ0KSIpOwotCi0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICAgICAgbVBlbmRpbmdGcmFtZXMrKzsKLSAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJGcmFtZSBub3cgYXZhaWxhYmxlIChlbmQpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCB3YWl0Rm9yRnJhbWUobnNlY3NfdCB0aW1lb3V0KSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXM7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICAgICAgd2hpbGUgKG1QZW5kaW5nRnJhbWVzID09IDApIHsKLSAgICAgICAgICAgICAgICByZXMgPSBtQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHRpbWVvdXQpOwotICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGVuZGluZ0ZyYW1lcy0tOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBNdXRleCBtTXV0ZXg7Ci0gICAgICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwotICAgICAgICBpbnQgbVBlbmRpbmdGcmFtZXM7Ci0gICAgfTsKLQotICAgIHZvaWQgQ3JlYXRlU3RyZWFtKCkgewotICAgICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlOwotICAgICAgICBDYW1lcmFTdHJlYW1QYXJhbXMgcCA9IG1QYXJhbTsKLQotICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7Ci0gICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7Ci0gICAgICAgIG1DcHVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgcC5tSGVhcENvdW50KTsKLSAgICAgICAgbUNwdUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYVN0cmVhbVRlc3Q6Om1DcHVDb25zdW1lciIpKTsKLQotICAgICAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKLQotICAgICAgICBpbnQgZm9ybWF0ID0gTWFwQXV0b0Zvcm1hdChwLm1Gb3JtYXQpOwotCi0gICAgICAgIEFTU0VSVF9FUShPSywKLSAgICAgICAgICAgIGRldmljZS0+Y3JlYXRlU3RyZWFtKG1TdXJmYWNlLAotICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgZm9ybWF0LAotICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLAotICAgICAgICAgICAgICAgICZtU3RyZWFtSWQpKTsKLQotICAgICAgICBBU1NFUlRfTkUoLTEsIG1TdHJlYW1JZCk7Ci0KLSAgICAgICAgLy8gZG8gbm90IG1ha2UgJ3RoaXMnIGEgRnJhbWVMaXN0ZW5lciBvciB0aGUgbGlmZXRpbWUgcG9saWN5IHdpbGwgY2xhc2gKLSAgICAgICAgbUZyYW1lTGlzdGVuZXIgPSBuZXcgRnJhbWVMaXN0ZW5lcigpOwotICAgICAgICBtQ3B1Q29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIobUZyYW1lTGlzdGVuZXIpOwotICAgIH0KLQotICAgIHZvaWQgRGVsZXRlU3RyZWFtKCkgewotICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmRlbGV0ZVN0cmVhbShtU3RyZWFtSWQpKTsKLSAgICB9Ci0KLSAgICBpbnQgTWFwQXV0b0Zvcm1hdChpbnQgZm9ybWF0KSB7Ci0gICAgICAgIGlmIChmb3JtYXQgPT0gQ0FNRVJBX1NUUkVBTV9BVVRPX0NQVV9GT1JNQVQpIHsKLSAgICAgICAgICAgIGlmIChnZXREZXZpY2VWZXJzaW9uKCkgPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb3JtYXQ7Ci0gICAgfQotCi0gICAgdm9pZCBEdW1wWXV2VG9GaWxlKGNvbnN0IFN0cmluZzggJmZpbGVOYW1lLCBjb25zdCBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyICZpbWcpIHsKLSAgICAgICAgdWludDhfdCAqZGF0YUNiLCAqZGF0YUNyOwotICAgICAgICB1aW50MzJfdCBzdHJpZGU7Ci0gICAgICAgIHVpbnQzMl90IGNocm9tYVN0cmlkZTsKLSAgICAgICAgdWludDMyX3QgY2hyb21hU3RlcDsKLQotICAgICAgICBzd2l0Y2ggKGltZy5mb3JtYXQpIHsKLSAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgotICAgICAgICAgICAgICAgIHN0cmlkZSA9IGltZy5zdHJpZGU7Ci0gICAgICAgICAgICAgICAgY2hyb21hU3RyaWRlID0gaW1nLmNocm9tYVN0cmlkZTsKLSAgICAgICAgICAgICAgICBjaHJvbWFTdGVwID0gaW1nLmNocm9tYVN0ZXA7Ci0gICAgICAgICAgICAgICAgZGF0YUNiID0gaW1nLmRhdGFDYjsKLSAgICAgICAgICAgICAgICBkYXRhQ3IgPSBpbWcuZGF0YUNyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKLSAgICAgICAgICAgICAgICBzdHJpZGUgPSBpbWcud2lkdGg7Ci0gICAgICAgICAgICAgICAgY2hyb21hU3RyaWRlID0gaW1nLndpZHRoOwotICAgICAgICAgICAgICAgIGNocm9tYVN0ZXAgPSAyOwotICAgICAgICAgICAgICAgIGRhdGFDciA9IGltZy5kYXRhICsgaW1nLndpZHRoICogaW1nLmhlaWdodDsKLSAgICAgICAgICAgICAgICBkYXRhQ2IgPSBkYXRhQ3IgKyAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6Ci0gICAgICAgICAgICAgICAgc3RyaWRlID0gaW1nLnN0cmlkZTsKLSAgICAgICAgICAgICAgICBjaHJvbWFTdHJpZGUgPSBBTElHTihpbWcud2lkdGggLyAyLCAxNik7Ci0gICAgICAgICAgICAgICAgY2hyb21hU3RlcCA9IDE7Ci0gICAgICAgICAgICAgICAgZGF0YUNyID0gaW1nLmRhdGEgKyBpbWcuc3RyaWRlICogaW1nLmhlaWdodDsKLSAgICAgICAgICAgICAgICBkYXRhQ2IgPSBkYXRhQ3IgKyBjaHJvbWFTdHJpZGUgKiBpbWcuaGVpZ2h0LzI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGZvcm1hdCAlZCwgbm90IGR1bXBpbmciLCBpbWcuZm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXcml0ZSBZCi0gICAgICAgIEZJTEUgKnl1dkZpbGUgPSBmb3BlbihmaWxlTmFtZS5zdHJpbmcoKSwgInciKTsKLQotICAgICAgICBzaXplX3QgYnl0ZXM7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBpbWcuaGVpZ2h0OyArK3kpIHsKLSAgICAgICAgICAgIGJ5dGVzID0gZndyaXRlKAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGltZy5kYXRhICsgc3RyaWRlICogeSksCi0gICAgICAgICAgICAgICAgMSwgaW1nLndpZHRoLCB5dXZGaWxlKTsKLSAgICAgICAgICAgIGlmIChieXRlcyAhPSBpbWcud2lkdGgpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgJXMiLCBmaWxlTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZmNsb3NlKHl1dkZpbGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdyaXRlIENiL0NyCi0gICAgICAgIHVpbnQ4X3QgKnNyYyA9IGRhdGFDYjsKLSAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCAyOyArK2MpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaW1nLmhlaWdodCAvIDI7ICsreSkgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB4ID0gc3JjICsgeSAqIGNocm9tYVN0cmlkZTsKLSAgICAgICAgICAgICAgICBpZiAoY2hyb21hU3RlcCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgaW1nLndpZHRoIC8gMjsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHV0YygqcHgsIHl1dkZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHggKz0gY2hyb21hU3RlcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gZndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHB4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBpbWcud2lkdGggLyAyLCB5dXZGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzICE9IGltZy53aWR0aCAvIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gd3JpdGUgdG8gZmlsZSAlcyIsIGZpbGVOYW1lLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZSh5dXZGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyYyA9IGRhdGFDcjsKLSAgICAgICAgfQotICAgICAgICBmY2xvc2UoeXV2RmlsZSk7Ci0gICAgfQotCi0gICAgaW50IG1XaWR0aDsKLSAgICBpbnQgbUhlaWdodDsKLQotICAgIGludCBtU3RyZWFtSWQ7Ci0KLSAgICBhbmRyb2lkOjpzcDxGcmFtZUxpc3RlbmVyPiAgICAgICBtRnJhbWVMaXN0ZW5lcjsKLSAgICBhbmRyb2lkOjpzcDxDcHVDb25zdW1lcj4gICAgICAgICBtQ3B1Q29uc3VtZXI7Ci0gICAgYW5kcm9pZDo6c3A8U3VyZmFjZT4gICAgICAgICAgICAgbVN1cmZhY2U7Ci0gICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgVmVjdG9yPGludDMyX3Q+KiA+IG1PdXRwdXRSZXNvbHV0aW9uczsKLQotcHJpdmF0ZToKLSAgICBDYW1lcmFTdHJlYW1QYXJhbXMgbVBhcmFtOwotfTsKLQotfQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhU3RyZWFtVGVzdHMuY3BwIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFTdHJlYW1UZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOWFlOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFTdHJlYW1UZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU3RyZWFtVGVzdCIKLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS9oYXJkd2FyZS5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTIuaCIKLQotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ2FtZXJhU3RyZWFtRml4dHVyZS5oIgotI2luY2x1ZGUgIlRlc3RFeHRlbnNpb25zLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci0KLWNsYXNzIENhbWVyYVN0cmVhbVRlc3QKLSAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Q2FtZXJhU3RyZWFtUGFyYW1zPiwKLSAgICAgIHB1YmxpYyBDYW1lcmFTdHJlYW1GaXh0dXJlIHsKLQotcHVibGljOgotICAgIENhbWVyYVN0cmVhbVRlc3QoKSA6IENhbWVyYVN0cmVhbUZpeHR1cmUoR2V0UGFyYW0oKSkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0NPTlNUUlVDVE9SOwotICAgIH0KLQotICAgIH5DYW1lcmFTdHJlYW1UZXN0KCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0RFU1RSVUNUT1I7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1NFVF9VUDsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1RFQVJfRE9XTjsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLQotfTsKLQotVEVTVF9QKENhbWVyYVN0cmVhbVRlc3QsIENyZWF0ZVN0cmVhbSkgewotCi0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotCi0gICAgLyoqIE1ha2Ugc3VyZSB0aGUgZm9ybWF0IHJlcXVlc3RlZCBpcyBzdXBwb3J0ZWQuIFBBU1MgdGhpcyB0ZXN0IGlmIGl0J3Mgbm90Ci0gICAgICAqIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAqCi0gICAgICAqIFRPRE86IHdvdWxkIGJlIG5pY2Ugb2Ygbm90IHJ1bm5pbmcgdGhpcyB0ZXN0IGluIHRoZSBmaXJzdCBwbGFjZQotICAgICAgKiAgICAgICBzb21laG93LgotICAgICAgKi8KLSAgICB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhdmFpbGFibGVGb3JtYXRzID0KLSAgICAgICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTKTsKLQotICAgICAgICBib29sIGhhc0Zvcm1hdCA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7ICsraSkgewotICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUZvcm1hdHMuZGF0YS5pMzJbaV0gPT0gR2V0UGFyYW0oKS5tRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgaGFzRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaGFzRm9ybWF0KSB7Ci0gICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlNraXBwaW5nIHRlc3QgIgotICAgICAgICAgICAgICAgICAgICAgIDw8IHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSA8PCAiLiIKLSAgICAgICAgICAgICAgICAgICAgICA8PCB0ZXN0X2luZm8tPm5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYmVjYXVzZSB0aGUgZm9ybWF0IHdhcyBub3QgYXZhaWxhYmxlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgR2V0UGFyYW0oKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVTdHJlYW0oKSk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoRGVsZXRlU3RyZWFtKCkpOwotfQotCi0vL1RPRE86IHVzZSBhIGNvbWJpbmF0b3JpYyBnZW5lcmF0b3IKLXN0YXRpYyBDYW1lcmFTdHJlYW1QYXJhbXMgVGVzdFBhcmFtZXRlcnNbXSA9IHsKLSAgICB7Ci0gICAgICAgIC8qbUZvcm1hdCovICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMQotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDIKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELAotICAgICAgICAvKm1IZWFwQ291bnQqLyAzCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qbUZvcm1hdCovICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQLCAvLyBOVjIxCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDEKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDIKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDMKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAotICAgICAgICAvKm1IZWFwQ291bnQqLyAxCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qbUZvcm1hdCovICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMgotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDMKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZOCwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMQotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1k4LAotICAgICAgICAvKm1IZWFwQ291bnQqLyAyCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qbUZvcm1hdCovICAgIEhBTF9QSVhFTF9GT1JNQVRfWTgsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDMKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZMTYsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDEKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZMTYsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDIKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZMTYsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDMKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNiwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMQotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1JBVzE2LAotICAgICAgICAvKm1IZWFwQ291bnQqLyAyCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qbUZvcm1hdCovICAgIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTYsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDMKLSAgICB9LAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyZWFtUGFyYW1ldGVyQ29tYmluYXRpb25zLCBDYW1lcmFTdHJlYW1UZXN0LAotICAgIHRlc3Rpbmc6OlZhbHVlc0luKFRlc3RQYXJhbWV0ZXJzKSk7Ci0KLQotfQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9Gb3JrZWRUZXN0cy5jcHAgYi90ZXN0cy9jYW1lcmEyL0ZvcmtlZFRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1OTlkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL0ZvcmtlZFRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiVGVzdEV4dGVuc2lvbnMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotLy8gSW50ZW50aW9uYWxseSBkaXNhYmxlZCBzaW5jZSAyIG9mIHRoZXNlIHRlc3RzIGFyZSBzdXBwb3NlZCB0byBmYWlsCi1jbGFzcyBESVNBQkxFRF9Gb3JrZWRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfU0VUX1VQOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19URUFSX0RPV047Ci0gICAgfQotfTsKLQotLy8gaW50ZW50aW9uYWxseSBmYWlsCi1URVNUX0YoRElTQUJMRURfRm9ya2VkVGVzdCwgRmFpbENyYXNoKSB7Ci0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotICAgIGFib3J0KCk7Ci19Ci0KLVRFU1RfRihESVNBQkxFRF9Gb3JrZWRUZXN0LCBTdWNjZWVkTm9ybWFsKSB7Ci0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotCi0gICAgRVhQRUNUX1RSVUUodHJ1ZSk7Ci19Ci0KLS8vIGludGVudGlvbmFsbHkgZmFpbAotVEVTVF9GKERJU0FCTEVEX0ZvcmtlZFRlc3QsIEZhaWxOb3JtYWwpIHsKLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICBFWFBFQ1RfVFJVRShmYWxzZSk7Ci19Ci0KLX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9UZXN0RXh0ZW5zaW9ucy5oIGIvdGVzdHMvY2FtZXJhMi9UZXN0RXh0ZW5zaW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWY1ODdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvVGVzdEV4dGVuc2lvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fQU5EUk9JRF9IQUxfQ0FNRVJBMl9URVNUU19FWFRFTlNJT05TX18KLSNkZWZpbmUgX19BTkRST0lEX0hBTF9DQU1FUkEyX1RFU1RTX0VYVEVOU0lPTlNfXwotCi0jaW5jbHVkZSAiVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIuaCIKLSNpbmNsdWRlICJUZXN0U2V0dGluZ3MuaCIKLQotLy8gVXNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBUZXN0OjpTZXRVcCgpIGltcGwKLSNkZWZpbmUgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19TRVRfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoVEVTVF9FWFRFTlNJT05fRk9SS0lOR19FTkFCTEVEKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICghVGVzdEZvcmtlckV2ZW50TGlzdGVuZXI6Om1Jc0ZvcmtlZCkgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSB3aGlsZSAoZmFsc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0vLyBVc2UgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIFRlc3Q6OlRlYXJEb3duKCkgaW1wbAotI2RlZmluZSBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1RFQVJfRE9XTiAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfU0VUX1VQCi0KLS8vIFVzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggVGVzdDo6VGVzdCBjb25zdHJ1Y3RvcgotI2RlZmluZSBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0NPTlNUUlVDVE9SIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfU0VUX1VQCi0KLS8vIFVzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggVGVzdDo6flRlc3QgZGVzdHJ1Y3RvcgotI2RlZmluZSBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0RFU1RSVUNUT1IgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfVEVBUl9ET1dOCi0KLS8vIFVzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggdGVzdCBib2R5LCBlLmcuIFRFU1QoeCx5KSwgVEVTVF9GKHgseSksIGV0YwotI2RlZmluZSBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfU0VUX1VQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlKGZhbHNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLS8vIEFyZSB3ZSBydW5uaW5nIGVhY2ggdGVzdCBieSBmb3JraW5nIGl0PwotI2RlZmluZSBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYW5kcm9pZDo6Y2FtZXJhMjo6dGVzdHM6OlRlc3RTZXR0aW5nczo6Rm9ya2luZ0VuYWJsZWQoKSkKLQotCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL1Rlc3RGb3JrZXJFdmVudExpc3RlbmVyLmNwcCBiL3Rlc3RzL2NhbWVyYTIvVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDE2ZGIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIlRlc3RFeHRlbnNpb25zLmgiCi0KLSNkZWZpbmUgREVCVUdfVEVTVF9GT1JLRVJfRVZFTlRfTElTVEVORVIgMAotCi0jZGVmaW5lIFJFVFVSTl9DT0RFX1BBU1NFRCAwCi0jZGVmaW5lIFJFVFVSTl9DT0RFX0ZBSUxFRCAxCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci0KLWJvb2wgVGVzdEZvcmtlckV2ZW50TGlzdGVuZXI6Om1Jc0ZvcmtlZCAgICAgICAgID0gZmFsc2U7Ci0KLVRlc3RGb3JrZXJFdmVudExpc3RlbmVyOjpUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lcigpIHsKLSAgICBtSXNGb3JrZWQgPSBmYWxzZTsKLSAgICBtSGFzU3VjY2VlZGVkID0gdHJ1ZTsKLSAgICBtVGVybVNpZ25hbCA9IDA7Ci19Ci0KLS8vIENhbGxlZCBiZWZvcmUgYSB0ZXN0IHN0YXJ0cy4KLXZvaWQgVGVzdEZvcmtlckV2ZW50TGlzdGVuZXI6Ok9uVGVzdFN0YXJ0KGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8mKSB7Ci0KLSAgICBpZiAoIVRFU1RfRVhURU5TSU9OX0ZPUktJTkdfRU5BQkxFRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcGlkX3QgY2hpbGRQaWQgPSBmb3JrKCk7Ci0gICAgaWYgKGNoaWxkUGlkICE9IDApIHsKLSAgICAgICAgaW50IHN0YXR1czsKLSAgICAgICAgd2FpdHBpZChjaGlsZFBpZCwgJnN0YXR1cywgLypvcHRpb25zKi8wKTsKLQotICAgICAgICAvLyB0ZXJtaW5hdGVkIG5vcm1hbGx5PwotICAgICAgICBtSGFzU3VjY2VlZGVkID0gV0lGRVhJVEVEKHN0YXR1cyk7Ci0gICAgICAgIC8vIHRlcm1pbmF0ZSB3aXRoIHJldHVybiBjb2RlIDAgPSB0ZXN0IHBhc3NlZCwgMSA9IHRlc3QgZmFpbGVkCi0gICAgICAgIGlmIChtSGFzU3VjY2VlZGVkKSB7Ci0gICAgICAgICAgbUhhc1N1Y2NlZWRlZCA9IFdFWElUU1RBVFVTKHN0YXR1cykgPT0gUkVUVVJOX0NPREVfUEFTU0VEOwotICAgICAgICB9IGVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKLSAgICAgICAgICBtVGVybVNpZ25hbCA9IFdURVJNU0lHKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0aGUgdGVzdCBpcyB0aGVuIHNraXBwZWQgYnkgaW5zZXJ0aW5nIHRoZSB2YXJpb3VzCi0gICAgICAgIFRFU1RfRVhURU5TSU9OXyBtYWNyb3MgaW4gVGVzdEV4dGVuc2lvbnMuaCAqLwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgbUlzRm9ya2VkID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLS8vIENhbGxlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRUVEKCkgaW52b2NhdGlvbi4KLXZvaWQgVGVzdEZvcmtlckV2ZW50TGlzdGVuZXI6Ok9uVGVzdFBhcnRSZXN1bHQoCi0gICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgewotCi0gICAgaWYgKERFQlVHX1RFU1RfRk9SS0VSX0VWRU5UX0xJU1RFTkVSKSB7Ci0gICAgICAgIHByaW50ZigiJXMgaW4gJXM6JWRcbiVzXG4iLAotICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuZmFpbGVkKCkgPyAiKioqIEZhaWx1cmUiIDogIlN1Y2Nlc3MiLAotICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCksCi0gICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpLAotICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQuc3VtbWFyeSgpKTsKLSAgICB9Ci19Ci0KLS8vIENhbGxlZCBhZnRlciBhIHRlc3QgZW5kcy4KLXZvaWQgVGVzdEZvcmtlckV2ZW50TGlzdGVuZXI6Ok9uVGVzdEVuZChjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKLQotICAgIGlmICghVEVTVF9FWFRFTlNJT05fRk9SS0lOR19FTkFCTEVEKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUlzRm9ya2VkKSB7Ci0gICAgICAgIGV4aXQodGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKQotICAgICAgICAgICAgPyBSRVRVUk5fQ09ERV9QQVNTRUQgOiBSRVRVUk5fQ09ERV9GQUlMRUQpOwotICAgIH0gZWxzZSBpZiAoIW1IYXNTdWNjZWVkZWQgJiYgbVRlcm1TaWduYWwgIT0gMCkgewotCi0gICAgICBwcmludGYoIioqKiBUZXN0ICVzLiVzIGNyYXNoZWQgd2l0aCBzaWduYWwgPSAlc1xuIiwKLSAgICAgICAgICAgICB0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSwKLSAgICAgICAgICAgICBzdHJzaWduYWwobVRlcm1TaWduYWwpKTsKLSAgICB9Ci0KLSAgICAvL1RPRE86IG92ZXJsb2FkIHRoZSBkZWZhdWx0IGV2ZW50IGxpc3RlbmVyIHRvIHN1cHByZXNzIHRoaXMgbWVzc2FnZQotICAgIC8vIGR5bmFtaWNhbGx5IChlLmcuIGJ5IHNraXBwaW5nIE9uVGVzdFBhcnRSZXN1bHQgYWZ0ZXIgT25UZXN0RW5kICkKLQotICAgIC8vIHRyaWdnZXIgYSB0ZXN0IGZhaWx1cmUgaWYgdGhlIGNoaWxkIGhhcyBmYWlsZWQKLSAgICBpZiAoIW1IYXNTdWNjZWVkZWQpIHsKLSAgICAgICAgQUREX0ZBSUxVUkUoKTsKLSAgICB9Ci0gICAgbVRlcm1TaWduYWwgPSAwOwotfQotCi0KLX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9UZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lci5oIGIvdGVzdHMvY2FtZXJhMi9UZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDdhMDZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fQU5EUk9JRF9IQUxfQ0FNRVJBMl9URVNUU19GT1JLRVJfRVZFTlRfTElTVEVORVJfXwotI2RlZmluZSBfX0FORFJPSURfSEFMX0NBTUVSQTJfVEVTVFNfRk9SS0VSX0VWRU5UX0xJU1RFTkVSX18KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci0KLS8vIEZvcmsgYmVmb3JlIGVhY2ggdGVzdCBydW5zLgotY2xhc3MgVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKLQotcHVibGljOgotCi0gICAgVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIoKTsKLQotcHJpdmF0ZToKLQotICAgIC8vIENhbGxlZCBiZWZvcmUgYSB0ZXN0IHN0YXJ0cy4KLSAgICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyYgdGVzdF9pbmZvKTsKLQotICAgIC8vIENhbGxlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRUVEKCkgaW52b2NhdGlvbi4KLSAgICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdCgKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCk7Ci0KLSAgICAvLyBDYWxsZWQgYWZ0ZXIgYSB0ZXN0IGVuZHMuCi0gICAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvJiB0ZXN0X2luZm8pOwotCi0gICAgYm9vbCBtSGFzU3VjY2VlZGVkOwotICAgIGludCBtVGVybVNpZ25hbDsKLQotcHVibGljOgotICAgIC8vIGRvIG5vdCByZWFkIGRpcmVjdGx5LiB1c2UgVEVTVF9FWFRFTlNJT04gbWFjcm9zIGluc3RlYWQKLSAgICBzdGF0aWMgYm9vbCBtSXNGb3JrZWQ7Ci19OwotCi19Ci19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9UZXN0U2V0dGluZ3MuY3BwIGIvdGVzdHMvY2FtZXJhMi9UZXN0U2V0dGluZ3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdhZGM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvVGVzdFNldHRpbmdzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgIlRlc3RTZXR0aW5ncy5oIgotCi0jaW5jbHVkZSAiVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotYm9vbCBUZXN0U2V0dGluZ3M6Om1Gb3JraW5nRGlzYWJsZWQgICAgID0gZmFsc2U7Ci1pbnQgIFRlc3RTZXR0aW5nczo6bURldmljZUlkICAgICAgICAgICAgPSAwOwotY2hhciogY29uc3QqIFRlc3RTZXR0aW5nczo6bUFyZ3Y7Ci0KLS8vIC0tZm9ya2luZy1kaXNhYmxlZCwgZmFsc2UgYnkgZGVmYXVsdAotYm9vbCBUZXN0U2V0dGluZ3M6OkZvcmtpbmdEaXNhYmxlZCgpIHsKLSAgICByZXR1cm4gbUZvcmtpbmdEaXNhYmxlZDsKLX0KLQotLy8gcmV2ZXJzZSBvZiAtLWZvcmtpbmctZGlzYWJsZWQgKG5vdCBhIGZsYWcpLCB0cnVlIGJ5IGRlZmF1bHQKLWJvb2wgVGVzdFNldHRpbmdzOjpGb3JraW5nRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gIUZvcmtpbmdEaXNhYmxlZCgpOwotfQotCi0vLyAtLWRldmljZS1pZCwgMCBieSBkZWZhdWx0Ci1pbnQgVGVzdFNldHRpbmdzOjpEZXZpY2VJZCgpIHsKLSAgICByZXR1cm4gbURldmljZUlkOwotfQotCi0vLyByZXR1cm5zIGZhbHNlIGlmIHVzYWdlIHNob3VsZCBiZSBwcmludGVkIGFuZCB3ZSBzaG91bGQgZXhpdCBlYXJseQotYm9vbCBUZXN0U2V0dGluZ3M6OlBhcnNlQXJncyhpbnQgYXJnYywgY2hhciogY29uc3QgYXJndltdKQotewotICAgIHsKLSAgICAgICAgY2hhciAqZW52ID0gZ2V0ZW52KCJDQU1FUkEyX1RFU1RfRk9SS0lOR19ESVNBQkxFRCIpOwotICAgICAgICBpZiAoZW52KSB7Ci0gICAgICAgICAgICBtRm9ya2luZ0Rpc2FibGVkID0gYXRvaShlbnYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW52ID0gZ2V0ZW52KCJDQU1FUkEyX1RFU1RfREVWSUNFX0lEIik7Ci0gICAgICAgIGlmIChlbnYpIHsKLSAgICAgICAgICAgIG1EZXZpY2VJZCA9IGF0b2koZW52KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgcHJpbnRIZWxwID0gZmFsc2U7Ci0gICAgYm9vbCB1bmtub3duQXJncyA9IGZhbHNlOwotCi0gICAgb3B0ZXJyID0gMDsgLy8gZG8gbm90IHByaW50IGVycm9ycyBmb3IgdW5rbm93biBhcmd1bWVudHMKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQgYzsKLSAgICAgICAgaW50IG9wdGlvbl9pbmRleCA9IDA7Ci0KLSAgICAgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7Ci0gICAgICAgICAgICAvKiBuYW1lICAgICAgICAgICAgICBoYXNfYXJnICAgICAgICAgIGZsYWcgdmFsICovCi0gICAgICAgICAgICB7ImZvcmtpbmctZGlzYWJsZWQiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgIDAgIH0sCi0gICAgICAgICAgICB7ImRldmljZS1pZCIsICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgMCwgIDAgIH0sCi0gICAgICAgICAgICB7ImhlbHAiLCAgICAgICAgICAgICBub19hcmd1bWVudCwgICAgICAgMCwgJ2gnIH0sCi0gICAgICAgICAgICB7MCwgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgMCwgIDAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICAvLyBOb3RlOiAnKycgaW4gb3B0c3RyaW5nIG1lYW5zIGRvIG5vdCBtdXRhdGUgYXJndgotICAgICAgICBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIitoIiwgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKLQotICAgICAgICBpZiAoYyA9PSAtMSkgeyAvLyBBbGwgYXJndW1lbnRzIGV4aGF1c3RlZAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGMgPT0gJz8nKSB7IC8vIEFyZ3VtZW50IG5vdCBpbiBvcHRpb24gbGlzdHMKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3Zbb3B0aW5kLTFdOwotICAgICAgICAgICAgLy8gQW55dGhpbmcgYmVnaW5uaW5nIHdpdGggZ3Rlc3RfIHdpbGwgZ2V0IGhhbmRsZWQgYnkgZ3Rlc3QKLSAgICAgICAgICAgIGlmIChzdHJzdHIoYXJnLCAiLS1ndGVzdF8iKSAhPSBhcmcpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlVua25vd24gYXJndW1lbnQ6ICIgPDwgYXJnIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgICAgICB1bmtub3duQXJncyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICBjYXNlIDA6IC8vIGxvbmcgb3B0aW9uCi0gICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbl9pbmRleCkgewotICAgICAgICAgICAgY2FzZSAwOiB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnID0gb3B0YXJnID86ICIxIjsKLSAgICAgICAgICAgICAgICBtRm9ya2luZ0Rpc2FibGVkID0gYXRvaShhcmcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgICAgICAgbURldmljZUlkID0gYXRvaShvcHRhcmcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlVua25vd24gbG9uZyBvcHRpb246ICIgPDwgb3B0aW9uX2luZGV4IDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOyAvLyBjYXNlIDAKLSAgICAgICAgY2FzZSAnaCc6IC8vIGhlbHAKLSAgICAgICAgICAgIHByaW50SGVscCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy8gY2FzZSAnPycKLSAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5rbm93biBvcHRpb246ICIgPDwgb3B0YXJnIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh1bmtub3duQXJncykgewotICAgICAgICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOwotICAgIH0KLQotICAgIG1Bcmd2ID0gYXJndjsKLQotICAgIGlmIChwcmludEhlbHAgfHwgdW5rbm93bkFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0ZDo6Y2VyciA8PCAiRm9ya2luZyBEaXNhYmxlZDogIgotICAgICAgICAgICAgICA8PCAobUZvcmtpbmdEaXNhYmxlZCA/ICJ5ZXMiIDogIm5vIikgPDwgc3RkOjplbmRsOwotCi0gICAgc3RkOjpjZXJyIDw8ICJEZXZpY2UgSUQ6ICIgPDwgbURldmljZUlkIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBwcmludCB1c2FnZS9oZWxwIGxpc3Qgb2YgY29tbWFuZHMgKG5vbi1ndGVzdCkKLXZvaWQgVGVzdFNldHRpbmdzOjpQcmludFVzYWdlKCkgewotICAgIHN0ZDo6Y2VyciA8PCAiVXNhZ2U6ICIgPDwgbUFyZ3ZbMF0gPDwgIiBbT1BUSU9OU10iIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOwotCi0gICAgc3RkOjpjZXJyIDw8ICJNYWluIG1vZGVzIG9mIG9wZXJhdGlvbjoiCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmNlcnIgPDwgIiAgIC0tZm9ya2luZy1kaXNhYmxlZFs9MV0gIGRvbid0IGZvcmsgcHJvY2VzcyBiZWZvcmUgIgotICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgYSBuZXcgdGVzdC4iCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgZW5hYmxlZCkiCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmNlcnIgPDwgIiAgIC0tZGV2aWNlLWlkPUlEICAgICAgICAgIHNwZWNpZnkgYSBkaWZmZXJlbnQgY2FtZXJhIElEIgotICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDApIgotICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBzdGQ6OmNlcnIgPDwgIiAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIHByaW50IHRoaXMgaGVscCBsaXN0aW5nIgotICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0KLQotICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7Ci19Ci0KLX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9UZXN0U2V0dGluZ3MuaCBiL3Rlc3RzL2NhbWVyYTIvVGVzdFNldHRpbmdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjRkZTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9UZXN0U2V0dGluZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi06cWEKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19BTkRST0lEX0hBTF9DQU1FUkEyX1RFU1RTX1NFVFRJTkdTX18KLSNkZWZpbmUgX19BTkRST0lEX0hBTF9DQU1FUkEyX1RFU1RTX1NFVFRJTkdTX18KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotY2xhc3MgVGVzdFNldHRpbmdzIHsKLQotcHVibGljOgotICAgIC8vIC0tZm9ya2luZy1kaXNhYmxlZCwgZmFsc2UgYnkgZGVmYXVsdAotICAgIHN0YXRpYyBib29sIEZvcmtpbmdEaXNhYmxlZCgpOwotCi0gICAgLy8gcmV2ZXJzZSBvZiAtLWZvcmtpbmctZGlzYWJsZWQgKG5vdCBhIGZsYWcpLCB0cnVlIGJ5IGRlZmF1bHQKLSAgICBzdGF0aWMgYm9vbCBGb3JraW5nRW5hYmxlZCgpOwotCi0gICAgLy8gLS1kZXZpY2UtaWQsIDAgYnkgZGVmYXVsdAotICAgIHN0YXRpYyBpbnQgRGV2aWNlSWQoKTsKLQotICAgIC8vIHJldHVybnMgZmFsc2UgaWYgdXNhZ2Ugc2hvdWxkIGJlIHByaW50ZWQgYW5kIHdlIHNob3VsZCBleGl0IGVhcmx5Ci0gICAgc3RhdGljIGJvb2wgUGFyc2VBcmdzKGludCBhcmdjLCBjaGFyKiBjb25zdCBhcmd2W10pOwotCi0gICAgLy8gcHJpbnQgdXNhZ2UvaGVscCBsaXN0IG9mIGNvbW1hbmRzIChub24tZ3Rlc3QpCi0gICAgc3RhdGljIHZvaWQgUHJpbnRVc2FnZSgpOwotCi1wcml2YXRlOgotICAgIFRlc3RTZXR0aW5ncygpOwotICAgIH5UZXN0U2V0dGluZ3MoKTsKLQotICAgIHN0YXRpYyBib29sIG1Gb3JraW5nRGlzYWJsZWQ7Ci0gICAgc3RhdGljIGludCAgbURldmljZUlkOwotICAgIHN0YXRpYyBjaGFyKiBjb25zdCogbUFyZ3Y7Ci19OwotCi19Ci19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9jYW1lcmEyX3V0aWxzLmNwcCBiL3Rlc3RzL2NhbWVyYTIvY2FtZXJhMl91dGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjBhZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9jYW1lcmEyX3V0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVXRpbGl0eSBjbGFzc2VzIGZvciBjYW1lcmEyIEhBTCB0ZXN0aW5nCi0KLSNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMl90ZXN0X3V0aWxzIgotI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgImNhbWVyYTJfdXRpbHMuaCIKLSNpbmNsdWRlIDxkbGZjbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi0vKioKLSAqIE1ldGFkYXRhUXVldWUKLSAqLwotCi1NZXRhZGF0YVF1ZXVlOjpNZXRhZGF0YVF1ZXVlKCk6Ci0gICAgICAgICAgICBtRGV2aWNlKE5VTEwpLAotICAgICAgICAgICAgbUZyYW1lQ291bnQoMCksCi0gICAgICAgICAgICBtQ291bnQoMCksCi0gICAgICAgICAgICBtU3RyZWFtU2xvdENvdW50KDApLAotICAgICAgICAgICAgbVNpZ25hbENvbnN1bWVyKHRydWUpCi17Ci0gICAgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHM6OmRlcXVldWVfcmVxdWVzdCA9IGNvbnN1bWVyX2RlcXVldWU7Ci0gICAgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHM6OnJlcXVlc3RfY291bnQgPSBjb25zdW1lcl9idWZmZXJfY291bnQ7Ci0gICAgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHM6OmZyZWVfcmVxdWVzdCA9IGNvbnN1bWVyX2ZyZWU7Ci0KLSAgICBjYW1lcmEyX2ZyYW1lX3F1ZXVlX2RzdF9vcHM6OmRlcXVldWVfZnJhbWUgPSBwcm9kdWNlcl9kZXF1ZXVlOwotICAgIGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wczo6Y2FuY2VsX2ZyYW1lID0gcHJvZHVjZXJfY2FuY2VsOwotICAgIGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wczo6ZW5xdWV1ZV9mcmFtZSA9IHByb2R1Y2VyX2VucXVldWU7Ci19Ci0KLU1ldGFkYXRhUXVldWU6On5NZXRhZGF0YVF1ZXVlKCkgewotICAgIGZyZWVCdWZmZXJzKG1FbnRyaWVzLmJlZ2luKCksIG1FbnRyaWVzLmVuZCgpKTsKLSAgICBmcmVlQnVmZmVycyhtU3RyZWFtU2xvdC5iZWdpbigpLCBtU3RyZWFtU2xvdC5lbmQoKSk7Ci19Ci0KLS8vIEludGVyZmFjZSB0byBjYW1lcmEyIEhBTCBhcyBjb25zdW1lciAoaW5wdXQgcmVxdWVzdHMvcmVwcm9jZXNzaW5nKQotY29uc3QgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHNfdCogTWV0YWRhdGFRdWV1ZTo6Z2V0VG9Db25zdW1lckludGVyZmFjZSgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHNfdCo+KHRoaXMpOwotfQotCi12b2lkIE1ldGFkYXRhUXVldWU6OnNldEZyb21Db25zdW1lckludGVyZmFjZShjYW1lcmEyX2RldmljZV90ICpkKSB7Ci0gICAgbURldmljZSA9IGQ7Ci19Ci0KLWNvbnN0IGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190KiBNZXRhZGF0YVF1ZXVlOjpnZXRUb1Byb2R1Y2VySW50ZXJmYWNlKCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxjYW1lcmEyX2ZyYW1lX3F1ZXVlX2RzdF9vcHNfdCo+KHRoaXMpOwotfQotCi0vLyBSZWFsIGludGVyZmFjZXMKLXN0YXR1c190IE1ldGFkYXRhUXVldWU6OmVucXVldWUoY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZikgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0KLSAgICBtQ291bnQrKzsKLSAgICBtRW50cmllcy5wdXNoX2JhY2soYnVmKTsKLSAgICBub3RFbXB0eS5zaWduYWwoKTsKLQotICAgIGlmIChtU2lnbmFsQ29uc3VtZXIgJiYgbURldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1TaWduYWxDb25zdW1lciA9IGZhbHNlOwotCi0gICAgICAgIG1NdXRleC51bmxvY2soKTsKLSAgICAgICAgQUxPR1YoIiVzOiBTaWduYWxpbmcgY29uc3VtZXIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBtRGV2aWNlLT5vcHMtPm5vdGlmeV9yZXF1ZXN0X3F1ZXVlX25vdF9lbXB0eShtRGV2aWNlKTsKLSAgICAgICAgbU11dGV4LmxvY2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1pbnQgTWV0YWRhdGFRdWV1ZTo6Z2V0QnVmZmVyQ291bnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBpZiAobVN0cmVhbVNsb3RDb3VudCA+IDApIHsKLSAgICAgICAgcmV0dXJuIENBTUVSQTJfUkVRVUVTVF9RVUVVRV9JU19CT1RUT01MRVNTOwotICAgIH0KLSAgICByZXR1cm4gbUNvdW50OwotfQotCi1zdGF0dXNfdCBNZXRhZGF0YVF1ZXVlOjpkZXF1ZXVlKGNhbWVyYV9tZXRhZGF0YV90ICoqYnVmLCBib29sIGluY3JlbWVudENvdW50KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLQotICAgIGlmIChtQ291bnQgPT0gMCkgewotICAgICAgICBpZiAobVN0cmVhbVNsb3RDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXM6IEVtcHR5IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICpidWYgPSBOVUxMOwotICAgICAgICAgICAgbVNpZ25hbENvbnN1bWVyID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiJXM6IFN0cmVhbWluZyAlZCBmcmFtZXMgdG8gcXVldWUiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgIG1TdHJlYW1TbG90Q291bnQpOwotCi0gICAgICAgIGZvciAoTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciBzbG90RW50cnkgPSBtU3RyZWFtU2xvdC5iZWdpbigpOwotICAgICAgICAgICAgICAgIHNsb3RFbnRyeSAhPSBtU3RyZWFtU2xvdC5lbmQoKTsKLSAgICAgICAgICAgICAgICBzbG90RW50cnkrKyApIHsKLSAgICAgICAgICAgIHNpemVfdCBlbnRyaWVzID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9lbnRyeV9jb3VudCgqc2xvdEVudHJ5KTsKLSAgICAgICAgICAgIHNpemVfdCBkYXRhQnl0ZXMgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2RhdGFfY291bnQoKnNsb3RFbnRyeSk7Ci0KLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpjb3B5ID0gYWxsb2NhdGVfY2FtZXJhX21ldGFkYXRhKGVudHJpZXMsIGRhdGFCeXRlcyk7Ci0gICAgICAgICAgICBhcHBlbmRfY2FtZXJhX21ldGFkYXRhKGNvcHksICpzbG90RW50cnkpOwotICAgICAgICAgICAgbUVudHJpZXMucHVzaF9iYWNrKGNvcHkpOwotICAgICAgICB9Ci0gICAgICAgIG1Db3VudCA9IG1TdHJlYW1TbG90Q291bnQ7Ci0gICAgfQotICAgIEFMT0dWKCJNZXRhZGF0YVF1ZXVlOiBkZXF1ZSAoJWQgYnVmZmVycykiLCBtQ291bnQpOwotICAgIGNhbWVyYV9tZXRhZGF0YV90ICpiID0gKihtRW50cmllcy5iZWdpbigpKTsKLSAgICBtRW50cmllcy5lcmFzZShtRW50cmllcy5iZWdpbigpKTsKLQotICAgIGlmIChpbmNyZW1lbnRDb3VudCkgewotICAgICAgICBhZGRfY2FtZXJhX21ldGFkYXRhX2VudHJ5KGIsCi0gICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5ULAotICAgICAgICAgICAgICAgICh2b2lkKiopJm1GcmFtZUNvdW50LCAxKTsKLSAgICAgICAgbUZyYW1lQ291bnQrKzsKLSAgICB9Ci0KLSAgICAqYnVmID0gYjsKLSAgICBtQ291bnQtLTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWV0YWRhdGFRdWV1ZTo6d2FpdEZvckJ1ZmZlcihuc2Vjc190IHRpbWVvdXQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIHN0YXR1c190IHJlczsKLSAgICB3aGlsZSAobUNvdW50ID09IDApIHsKLSAgICAgICAgcmVzID0gbm90RW1wdHkud2FpdFJlbGF0aXZlKG1NdXRleCx0aW1lb3V0KTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZXRhZGF0YVF1ZXVlOjpzZXRTdHJlYW1TbG90KGNhbWVyYV9tZXRhZGF0YV90ICpidWYpIHsKLSAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgZnJlZUJ1ZmZlcnMobVN0cmVhbVNsb3QuYmVnaW4oKSwgbVN0cmVhbVNsb3QuZW5kKCkpOwotICAgICAgICBtU3RyZWFtU2xvdENvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBpZiAobVN0cmVhbVNsb3RDb3VudCA+IDEpIHsKLSAgICAgICAgTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciBkZWxldGVyID0gKyttU3RyZWFtU2xvdC5iZWdpbigpOwotICAgICAgICBmcmVlQnVmZmVycygrK21TdHJlYW1TbG90LmJlZ2luKCksIG1TdHJlYW1TbG90LmVuZCgpKTsKLSAgICAgICAgbVN0cmVhbVNsb3RDb3VudCA9IDE7Ci0gICAgfQotICAgIGlmIChtU3RyZWFtU2xvdENvdW50ID09IDEpIHsKLSAgICAgICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEoICoobVN0cmVhbVNsb3QuYmVnaW4oKSkgKTsKLSAgICAgICAgKihtU3RyZWFtU2xvdC5iZWdpbigpKSA9IGJ1ZjsKLSAgICB9IGVsc2UgewotICAgICAgICBtU3RyZWFtU2xvdC5wdXNoX2Zyb250KGJ1Zik7Ci0gICAgICAgIG1TdHJlYW1TbG90Q291bnQgPSAxOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1ldGFkYXRhUXVldWU6OnNldFN0cmVhbVNsb3QoY29uc3QgTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+ICZidWZzKSB7Ci0gICAgaWYgKG1TdHJlYW1TbG90Q291bnQgPiAwKSB7Ci0gICAgICAgIGZyZWVCdWZmZXJzKG1TdHJlYW1TbG90LmJlZ2luKCksIG1TdHJlYW1TbG90LmVuZCgpKTsKLSAgICB9Ci0gICAgbVN0cmVhbVNsb3QgPSBidWZzOwotICAgIG1TdHJlYW1TbG90Q291bnQgPSBtU3RyZWFtU2xvdC5zaXplKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1ldGFkYXRhUXVldWU6OmZyZWVCdWZmZXJzKExpc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPjo6aXRlcmF0b3Igc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj46Oml0ZXJhdG9yJiBlbmQpIHsKLSAgICB3aGlsZSAoc3RhcnQgIT0gZW5kKSB7Ci0gICAgICAgIGZyZWVfY2FtZXJhX21ldGFkYXRhKCpzdGFydCk7Ci0gICAgICAgIHN0YXJ0ID0gbVN0cmVhbVNsb3QuZXJhc2Uoc3RhcnQpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLU1ldGFkYXRhUXVldWUqIE1ldGFkYXRhUXVldWU6OmdldEluc3RhbmNlKAotICAgICAgICBjb25zdCBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wc190ICpxKSB7Ci0gICAgY29uc3QgTWV0YWRhdGFRdWV1ZSogY21xID0gc3RhdGljX2Nhc3Q8Y29uc3QgTWV0YWRhdGFRdWV1ZSo+KHEpOwotICAgIHJldHVybiBjb25zdF9jYXN0PE1ldGFkYXRhUXVldWUqPihjbXEpOwotfQotCi1NZXRhZGF0YVF1ZXVlKiBNZXRhZGF0YVF1ZXVlOjpnZXRJbnN0YW5jZSgKLSAgICAgICAgY29uc3QgY2FtZXJhMl9mcmFtZV9xdWV1ZV9kc3Rfb3BzX3QgKnEpIHsKLSAgICBjb25zdCBNZXRhZGF0YVF1ZXVlKiBjbXEgPSBzdGF0aWNfY2FzdDxjb25zdCBNZXRhZGF0YVF1ZXVlKj4ocSk7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWV0YWRhdGFRdWV1ZSo+KGNtcSk7Ci19Ci0KLWludCBNZXRhZGF0YVF1ZXVlOjpjb25zdW1lcl9idWZmZXJfY291bnQoCi0gICAgICAgIGNvbnN0IGNhbWVyYTJfcmVxdWVzdF9xdWV1ZV9zcmNfb3BzX3QgKnEpIHsKLSAgICBNZXRhZGF0YVF1ZXVlICpxdWV1ZSA9IGdldEluc3RhbmNlKHEpOwotICAgIHJldHVybiBxdWV1ZS0+Z2V0QnVmZmVyQ291bnQoKTsKLX0KLQotaW50IE1ldGFkYXRhUXVldWU6OmNvbnN1bWVyX2RlcXVldWUoY29uc3QgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHNfdCAqcSwKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKipidWZmZXIpIHsKLSAgICBNZXRhZGF0YVF1ZXVlICpxdWV1ZSA9IGdldEluc3RhbmNlKHEpOwotICAgIHJldHVybiBxdWV1ZS0+ZGVxdWV1ZShidWZmZXIsIHRydWUpOwotfQotCi1pbnQgTWV0YWRhdGFRdWV1ZTo6Y29uc3VtZXJfZnJlZShjb25zdCBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wc190ICogLyogcSAqLywKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKm9sZF9idWZmZXIpIHsKLSAgICBmcmVlX2NhbWVyYV9tZXRhZGF0YShvbGRfYnVmZmVyKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBNZXRhZGF0YVF1ZXVlOjpwcm9kdWNlcl9kZXF1ZXVlKGNvbnN0IGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190ICogLyogcSAqLywKLSAgICAgICAgc2l6ZV90IGVudHJpZXMsIHNpemVfdCBieXRlcywKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKipidWZmZXIpIHsKLSAgICBjYW1lcmFfbWV0YWRhdGFfdCAqbmV3X2J1ZmZlciA9Ci0gICAgICAgICAgICBhbGxvY2F0ZV9jYW1lcmFfbWV0YWRhdGEoZW50cmllcywgYnl0ZXMpOwotICAgIGlmIChuZXdfYnVmZmVyID09IE5VTEwpIHJldHVybiBOT19NRU1PUlk7Ci0gICAgKmJ1ZmZlciA9IG5ld19idWZmZXI7Ci0gICAgICAgIHJldHVybiBPSzsKLX0KLQotaW50IE1ldGFkYXRhUXVldWU6OnByb2R1Y2VyX2NhbmNlbChjb25zdCBjYW1lcmEyX2ZyYW1lX3F1ZXVlX2RzdF9vcHNfdCAqIC8qIHEgKi8sCi0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpvbGRfYnVmZmVyKSB7Ci0gICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEob2xkX2J1ZmZlcik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1pbnQgTWV0YWRhdGFRdWV1ZTo6cHJvZHVjZXJfZW5xdWV1ZShjb25zdCBjYW1lcmEyX2ZyYW1lX3F1ZXVlX2RzdF9vcHNfdCAqcSwKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmZpbGxlZF9idWZmZXIpIHsKLSAgICBNZXRhZGF0YVF1ZXVlICpxdWV1ZSA9IGdldEluc3RhbmNlKHEpOwotICAgIHJldHVybiBxdWV1ZS0+ZW5xdWV1ZShmaWxsZWRfYnVmZmVyKTsKLX0KLQotLyoqCi0gKiBOb3RpZmllckxpc3RlbmVyCi0gKi8KLQotTm90aWZpZXJMaXN0ZW5lcjo6Tm90aWZpZXJMaXN0ZW5lcigpIHsKLX0KLQotc3RhdHVzX3QgTm90aWZpZXJMaXN0ZW5lcjo6Z2V0Tm90aWZpY2F0aW9uc0Zyb20oY2FtZXJhMl9kZXZpY2UgKmRldikgewotICAgIGlmICghZGV2KSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIHN0YXR1c190IGVycjsKLSAgICBlcnIgPSBkZXYtPm9wcy0+c2V0X25vdGlmeV9jYWxsYmFjayhkZXYsCi0gICAgICAgICAgICBub3RpZnlfY2FsbGJhY2tfZGlzcGF0Y2gsCi0gICAgICAgICAgICAodm9pZCopdGhpcyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTm90aWZpZXJMaXN0ZW5lcjo6Z2V0TmV4dE5vdGlmaWNhdGlvbihpbnQzMl90ICptc2dfdHlwZSwKLSAgICAgICAgaW50MzJfdCAqZXh0MSwKLSAgICAgICAgaW50MzJfdCAqZXh0MiwKLSAgICAgICAgaW50MzJfdCAqZXh0MykgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgaWYgKG1Ob3RpZmljYXRpb25zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIHJldHVybiBnZXROZXh0Tm90aWZpY2F0aW9uTG9ja2VkKG1zZ190eXBlLCBleHQxLCBleHQyLCBleHQzKTsKLX0KLQotc3RhdHVzX3QgTm90aWZpZXJMaXN0ZW5lcjo6d2FpdEZvck5vdGlmaWNhdGlvbihpbnQzMl90ICptc2dfdHlwZSwKLSAgICAgICAgaW50MzJfdCAqZXh0MSwKLSAgICAgICAgaW50MzJfdCAqZXh0MiwKLSAgICAgICAgaW50MzJfdCAqZXh0MykgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgd2hpbGUgKG1Ob3RpZmljYXRpb25zLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIG1OZXdOb3RpZmljYXRpb24ud2FpdChtTXV0ZXgpOwotICAgIH0KLSAgICByZXR1cm4gZ2V0TmV4dE5vdGlmaWNhdGlvbkxvY2tlZChtc2dfdHlwZSwgZXh0MSwgZXh0MiwgZXh0Myk7Ci19Ci0KLWludCBOb3RpZmllckxpc3RlbmVyOjpudW1Ob3RpZmljYXRpb25zKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgcmV0dXJuIG1Ob3RpZmljYXRpb25zLnNpemUoKTsKLX0KLQotc3RhdHVzX3QgTm90aWZpZXJMaXN0ZW5lcjo6Z2V0TmV4dE5vdGlmaWNhdGlvbkxvY2tlZChpbnQzMl90ICptc2dfdHlwZSwKLSAgICAgICAgaW50MzJfdCAqZXh0MSwKLSAgICAgICAgaW50MzJfdCAqZXh0MiwKLSAgICAgICAgaW50MzJfdCAqZXh0MykgewotICAgICptc2dfdHlwZSA9IG1Ob3RpZmljYXRpb25zLmJlZ2luKCktPm1zZ190eXBlOwotICAgICpleHQxID0gbU5vdGlmaWNhdGlvbnMuYmVnaW4oKS0+ZXh0MTsKLSAgICAqZXh0MiA9IG1Ob3RpZmljYXRpb25zLmJlZ2luKCktPmV4dDI7Ci0gICAgKmV4dDMgPSBtTm90aWZpY2F0aW9ucy5iZWdpbigpLT5leHQzOwotICAgIG1Ob3RpZmljYXRpb25zLmVyYXNlKG1Ob3RpZmljYXRpb25zLmJlZ2luKCkpOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBOb3RpZmllckxpc3RlbmVyOjpvbk5vdGlmeShpbnQzMl90IG1zZ190eXBlLAotICAgICAgICBpbnQzMl90IGV4dDEsCi0gICAgICAgIGludDMyX3QgZXh0MiwKLSAgICAgICAgaW50MzJfdCBleHQzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBtTm90aWZpY2F0aW9ucy5wdXNoX2JhY2soTm90aWZpY2F0aW9uKG1zZ190eXBlLCBleHQxLCBleHQyLCBleHQzKSk7Ci0gICAgbU5ld05vdGlmaWNhdGlvbi5zaWduYWwoKTsKLX0KLQotdm9pZCBOb3RpZmllckxpc3RlbmVyOjpub3RpZnlfY2FsbGJhY2tfZGlzcGF0Y2goaW50MzJfdCBtc2dfdHlwZSwKLSAgICAgICAgaW50MzJfdCBleHQxLAotICAgICAgICBpbnQzMl90IGV4dDIsCi0gICAgICAgIGludDMyX3QgZXh0MywKLSAgICAgICAgdm9pZCAqdXNlcikgewotICAgIE5vdGlmaWVyTGlzdGVuZXIgKm1lID0gcmVpbnRlcnByZXRfY2FzdDxOb3RpZmllckxpc3RlbmVyKj4odXNlcik7Ci0gICAgbWUtPm9uTm90aWZ5KG1zZ190eXBlLCBleHQxLCBleHQyLCBleHQzKTsKLX0KLQotLyoqCi0gKiBTdHJlYW1BZGFwdGVyCi0gKi8KLQotI2lmbmRlZiBjb250YWluZXJfb2YKLSNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSBcCi0gICAgKHR5cGUgKikoKGNoYXIqKShwdHIpIC0gb2Zmc2V0b2YodHlwZSwgbWVtYmVyKSkKLSNlbmRpZgotCi1TdHJlYW1BZGFwdGVyOjpTdHJlYW1BZGFwdGVyKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGNvbnN1bWVyKToKLSAgICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpLCBtRGV2aWNlKE5VTEwpLAotICAgICAgICBtSWQoLTEpLAotICAgICAgICBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1Gb3JtYXQoMCkKLXsKLSAgICBtQ29uc3VtZXJJbnRlcmZhY2UgPSBuZXcgU3VyZmFjZShjb25zdW1lcik7Ci0gICAgY2FtZXJhMl9zdHJlYW1fb3BzOjpkZXF1ZXVlX2J1ZmZlciA9IGRlcXVldWVfYnVmZmVyOwotICAgIGNhbWVyYTJfc3RyZWFtX29wczo6ZW5xdWV1ZV9idWZmZXIgPSBlbnF1ZXVlX2J1ZmZlcjsKLSAgICBjYW1lcmEyX3N0cmVhbV9vcHM6OmNhbmNlbF9idWZmZXIgPSBjYW5jZWxfYnVmZmVyOwotICAgIGNhbWVyYTJfc3RyZWFtX29wczo6c2V0X2Nyb3AgPSBzZXRfY3JvcDsKLX0KLQotU3RyZWFtQWRhcHRlcjo6flN0cmVhbUFkYXB0ZXIoKSB7Ci0gICAgZGlzY29ubmVjdCgpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1BZGFwdGVyOjpjb25uZWN0VG9EZXZpY2UoY2FtZXJhMl9kZXZpY2VfdCAqZCwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCkgewotICAgIGlmIChtU3RhdGUgIT0gVU5JTklUSUFMSVpFRCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIGlmIChkID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBOdWxsIGRldmljZSBwYXNzZWQgdG8gc3RyZWFtIGFkYXB0ZXIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN0YXR1c190IHJlczsKLQotICAgIG1XaWR0aCA9IHdpZHRoOwotICAgIG1IZWlnaHQgPSBoZWlnaHQ7Ci0gICAgbUZvcm1hdCA9IGZvcm1hdDsKLQotICAgIC8vIEFsbG9jYXRlIGRldmljZS1zaWRlIHN0cmVhbSBpbnRlcmZhY2UKLQotICAgIHVpbnQzMl90IGlkOwotICAgIHVpbnQzMl90IGZvcm1hdEFjdHVhbDsgLy8gaWdub3JlZAotICAgIHVpbnQzMl90IHVzYWdlOwotICAgIHVpbnQzMl90IG1heEJ1ZmZlcnMgPSAyOwotICAgIHJlcyA9IGQtPm9wcy0+YWxsb2NhdGVfc3RyZWFtKGQsCi0gICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIGdldFN0cmVhbU9wcygpLAotICAgICAgICAgICAgJmlkLCAmZm9ybWF0QWN0dWFsLCAmdXNhZ2UsICZtYXhCdWZmZXJzKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRGV2aWNlIHN0cmVhbSBhbGxvY2F0aW9uIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgbVN0YXRlID0gVU5JTklUSUFMSVpFRDsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgbURldmljZSA9IGQ7Ci0KLSAgICBtSWQgPSBpZDsKLSAgICBtVXNhZ2UgPSB1c2FnZTsKLSAgICBtTWF4UHJvZHVjZXJCdWZmZXJzID0gbWF4QnVmZmVyczsKLQotICAgIC8vIENvbmZpZ3VyZSBjb25zdW1lci1zaWRlIEFOYXRpdmVXaW5kb3cgaW50ZXJmYWNlCi0KLSAgICByZXMgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3cgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOwotICAgICAgICBtU3RhdGUgPSBBTExPQ0FURUQ7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLCBtVXNhZ2UpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHVzYWdlICUwOHggZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtVXNhZ2UsIG1JZCk7Ci0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBidWZmZXIgZGltZW5zaW9ucyIKLSAgICAgICAgICAgICAgICAiICVkIHggJWQgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtV2lkdGgsIG1IZWlnaHQsIG1JZCk7Ci0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgbUZvcm1hdCk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgYnVmZmVyIGZvcm1hdCIKLSAgICAgICAgICAgICAgICAiIDB4JXggZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRm9ybWF0LCBtSWQpOwotICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgaW50IG1heENvbnN1bWVyQnVmZmVyczsKLSAgICByZXMgPSBtQ29uc3VtZXJJbnRlcmZhY2UtPnF1ZXJ5KG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1heENvbnN1bWVyQnVmZmVycyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgotICAgICAgICAgICAgICAgICIgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgbU1heENvbnN1bWVyQnVmZmVycyA9IG1heENvbnN1bWVyQnVmZmVyczsKLQotICAgIEFMT0dWKCIlczogUHJvZHVjZXIgd2FudHMgJWQgYnVmZmVycywgY29uc3VtZXIgd2FudHMgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICBtTWF4UHJvZHVjZXJCdWZmZXJzLCBtTWF4Q29uc3VtZXJCdWZmZXJzKTsKLQotICAgIGludCB0b3RhbEJ1ZmZlcnMgPSBtTWF4Q29uc3VtZXJCdWZmZXJzICsgbU1heFByb2R1Y2VyQnVmZmVyczsKLQotICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICB0b3RhbEJ1ZmZlcnMpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICAvLyBSZWdpc3RlciBhbGxvY2F0ZWQgYnVmZmVycyB3aXRoIEhBTCBkZXZpY2UKLSAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcnMgPSBuZXcgYnVmZmVyX2hhbmRsZV90W3RvdGFsQnVmZmVyc107Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqKmFud0J1ZmZlcnMgPSBuZXcgQU5hdGl2ZVdpbmRvd0J1ZmZlcipbdG90YWxCdWZmZXJzXTsKLSAgICBpbnQgYnVmZmVySWR4ID0gMDsKLSAgICBmb3IgKDsgYnVmZmVySWR4IDwgdG90YWxCdWZmZXJzOyBidWZmZXJJZHgrKykgewotICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgICAgICAmYW53QnVmZmVyc1tidWZmZXJJZHhdKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZGVxdWV1ZSBidWZmZXIgJWQgZm9yIGluaXRpYWwgcmVnaXN0cmF0aW9uIGZvciIKLSAgICAgICAgICAgICAgICAgICAgInN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgYnVmZmVySWR4LCBtSWQpOwotICAgICAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICAgICAgZ290byBjbGVhblVwQnVmZmVyczsKLSAgICAgICAgfQotICAgICAgICBidWZmZXJzW2J1ZmZlcklkeF0gPSBhbndCdWZmZXJzW2J1ZmZlcklkeF0tPmhhbmRsZTsKLSAgICB9Ci0KLSAgICByZXMgPSBtRGV2aWNlLT5vcHMtPnJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzKG1EZXZpY2UsCi0gICAgICAgICAgICBtSWQsCi0gICAgICAgICAgICB0b3RhbEJ1ZmZlcnMsCi0gICAgICAgICAgICBidWZmZXJzKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIGJ1ZmZlcnMgd2l0aCBIQUwgZGV2aWNlIGZvciBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKLSAgICB9Ci0KLWNsZWFuVXBCdWZmZXJzOgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVySWR4OyBpKyspIHsKLSAgICAgICAgcmVzID0gbUNvbnN1bWVySW50ZXJmYWNlLT5jYW5jZWxCdWZmZXIobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgICAgIGFud0J1ZmZlcnNbaV0sIC0xKTsKLSAgICB9Ci0gICAgZGVsZXRlW10gYW53QnVmZmVyczsKLSAgICBkZWxldGVbXSBidWZmZXJzOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdHVzX3QgU3RyZWFtQWRhcHRlcjo6ZGlzY29ubmVjdCgpIHsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgaWYgKG1TdGF0ZSA+PSBBTExPQ0FURUQpIHsKLSAgICAgICAgcmVzID0gbURldmljZS0+b3BzLT5yZWxlYXNlX3N0cmVhbShtRGV2aWNlLCBtSWQpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byByZWxlYXNlIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1TdGF0ZSA+PSBDT05ORUNURUQpIHsKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZGlzY29ubmVjdCBzdHJlYW0gJWQgZnJvbSBuYXRpdmUgd2luZG93IiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSWQgPSAtMTsKLSAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1pbnQgU3RyZWFtQWRhcHRlcjo6Z2V0SWQoKSB7Ci0gICAgcmV0dXJuIG1JZDsKLX0KLQotY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzICpTdHJlYW1BZGFwdGVyOjpnZXRTdHJlYW1PcHMoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNhbWVyYTJfc3RyZWFtX29wcyAqPih0aGlzKTsKLX0KLQotQU5hdGl2ZVdpbmRvdyogU3RyZWFtQWRhcHRlcjo6dG9BTlcoY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzX3QgKncpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgU3RyZWFtQWRhcHRlcio+KHcpLT5tQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCk7Ci19Ci0KLWludCBTdHJlYW1BZGFwdGVyOjpkZXF1ZXVlX2J1ZmZlcihjb25zdCBjYW1lcmEyX3N0cmVhbV9vcHNfdCAqdywKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90KiogYnVmZmVyKSB7Ci0gICAgaW50IHJlczsKLSAgICBpbnQgc3RhdGUgPSBzdGF0aWNfY2FzdDxjb25zdCBTdHJlYW1BZGFwdGVyKj4odyktPm1TdGF0ZTsKLSAgICBpZiAoc3RhdGUgIT0gQUNUSVZFKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FsbGVkIHdoZW4gaW4gYmFkIHN0YXRlOiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IHRvQU5XKHcpOwotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICByZXMgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KGEsICZhbmIpOwotICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7Ci0KLSAgICAqYnVmZmVyID0gJihhbmItPmhhbmRsZSk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1pbnQgU3RyZWFtQWRhcHRlcjo6ZW5xdWV1ZV9idWZmZXIoY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzX3QqIHcsCi0gICAgICAgIGludDY0X3QgdGltZXN0YW1wLAotICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcikgewotICAgIGludCBzdGF0ZSA9IHN0YXRpY19jYXN0PGNvbnN0IFN0cmVhbUFkYXB0ZXIqPih3KS0+bVN0YXRlOwotICAgIGlmIChzdGF0ZSAhPSBBQ1RJVkUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYWxsZWQgd2hlbiBpbiBiYWQgc3RhdGU6ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IHRvQU5XKHcpOwotICAgIHN0YXR1c190IGVycjsKLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChhLCB0aW1lc3RhbXApOwotICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7Ci0gICAgcmV0dXJuIGEtPnF1ZXVlQnVmZmVyKGEsCi0gICAgICAgICAgICBjb250YWluZXJfb2YoYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyLCBoYW5kbGUpLCAtMSk7Ci19Ci0KLWludCBTdHJlYW1BZGFwdGVyOjpjYW5jZWxfYnVmZmVyKGNvbnN0IGNhbWVyYTJfc3RyZWFtX29wc190KiB3LAotICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcikgewotICAgIGludCBzdGF0ZSA9IHN0YXRpY19jYXN0PGNvbnN0IFN0cmVhbUFkYXB0ZXIqPih3KS0+bVN0YXRlOwotICAgIGlmIChzdGF0ZSAhPSBBQ1RJVkUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYWxsZWQgd2hlbiBpbiBiYWQgc3RhdGU6ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IHRvQU5XKHcpOwotICAgIHJldHVybiBhLT5jYW5jZWxCdWZmZXIoYSwKLSAgICAgICAgICAgIGNvbnRhaW5lcl9vZihidWZmZXIsIEFOYXRpdmVXaW5kb3dCdWZmZXIsIGhhbmRsZSksIC0xKTsKLX0KLQotaW50IFN0cmVhbUFkYXB0ZXI6OnNldF9jcm9wKGNvbnN0IGNhbWVyYTJfc3RyZWFtX29wc190KiB3LAotICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgaW50IHN0YXRlID0gc3RhdGljX2Nhc3Q8Y29uc3QgU3RyZWFtQWRhcHRlcio+KHcpLT5tU3RhdGU7Ci0gICAgaWYgKHN0YXRlICE9IEFDVElWRSkgewotICAgICAgICBBTE9HRSgiJXM6IENhbGxlZCB3aGVuIGluIGJhZCBzdGF0ZTogJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBBTmF0aXZlV2luZG93ICphID0gdG9BTlcodyk7Ci0gICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IGNyb3AgPSB7IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSB9OwotICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9jcm9wKGEsICZjcm9wKTsKLX0KLQotLyoqCi0gKiBGcmFtZVdhaXRlcgotICovCi0KLUZyYW1lV2FpdGVyOjpGcmFtZVdhaXRlcigpOgotICAgICAgICBtUGVuZGluZ0ZyYW1lcygwKSB7Ci19Ci0KLXN0YXR1c190IEZyYW1lV2FpdGVyOjp3YWl0Rm9yRnJhbWUobnNlY3NfdCB0aW1lb3V0KSB7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgd2hpbGUgKG1QZW5kaW5nRnJhbWVzID09IDApIHsKLSAgICAgICAgcmVzID0gbUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobU11dGV4LCB0aW1lb3V0KTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgbVBlbmRpbmdGcmFtZXMtLTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgRnJhbWVXYWl0ZXI6Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyogaXRlbSAqLykgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbVBlbmRpbmdGcmFtZXMrKzsKLSAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotfQotCi1pbnQgSFdNb2R1bGVIZWxwZXJzOjpjbG9zZU1vZHVsZSh2b2lkICpkc28pIHsKLSAgICBpbnQgc3RhdHVzOwotICAgIGlmICghZHNvKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHN0YXR1cyA9IGRsY2xvc2UoZHNvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgY2hhciBjb25zdCAqZXJyX3N0ciA9IGRsZXJyb3IoKTsKLSAgICAgICAgQUxPR0UoIiVzIGRsY2xvc2UgZmFpbGVkLCBlcnJvcjogJXMiLCBfX2Z1bmNfXywgZXJyX3N0ciA/OiAidW5rbm93biIpOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHRlc3RzCi19IC8vIG5hbWVzcGFjZSBjYW1lcmEyCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL2NhbWVyYTJfdXRpbHMuaCBiL3Rlc3RzL2NhbWVyYTIvY2FtZXJhMl91dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzRlZTc2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvY2FtZXJhMl91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fQU5EUk9JRF9IQUxfQ0FNRVJBMl9URVNUU19VVElMU19fCi0jZGVmaW5lIF9fQU5EUk9JRF9IQUxfQ0FNRVJBMl9URVNUU19VVElMU19fCi0KLS8vIFV0aWxpdHkgY2xhc3NlcyBmb3IgY2FtZXJhMiBIQUwgdGVzdGluZwotCi0jaW5jbHVkZSA8c3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTIuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLSNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotLyoqCi0gKiBRdWV1ZSBjbGFzcyBmb3IgYm90aCBzZW5kaW5nIHJlcXVlc3RzIHRvIGEgY2FtZXJhMiBkZXZpY2UsIGFuZCBmb3IgcmVjZWl2aW5nCi0gKiBmcmFtZXMgZnJvbSBhIGNhbWVyYTIgZGV2aWNlLgotICovCi1jbGFzcyBNZXRhZGF0YVF1ZXVlOiBwdWJsaWMgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHNfdCwKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190IHsKLSAgcHVibGljOgotICAgIE1ldGFkYXRhUXVldWUoKTsKLSAgICB+TWV0YWRhdGFRdWV1ZSgpOwotCi0gICAgLy8gSW50ZXJmYWNlIHRvIGNhbWVyYTIgSEFMIGRldmljZSwgZWl0aGVyIGZvciByZXF1ZXN0cyAoZGV2aWNlIGlzIGNvbnN1bWVyKQotICAgIC8vIG9yIGZvciBmcmFtZXMgKGRldmljZSBpcyBwcm9kdWNlcikKLSAgICBjb25zdCBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wc190KiAgIGdldFRvQ29uc3VtZXJJbnRlcmZhY2UoKTsKLSAgICB2b2lkIHNldEZyb21Db25zdW1lckludGVyZmFjZShjYW1lcmEyX2RldmljZV90ICpkKTsKLQotICAgIGNvbnN0IGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190KiBnZXRUb1Byb2R1Y2VySW50ZXJmYWNlKCk7Ci0KLSAgICAvLyBSZWFsIGludGVyZmFjZXMuIE9uIGVucXVldWUsIHF1ZXVlIHRha2VzIG93bmVyc2hpcCBvZiBidWZmZXIgcG9pbnRlcgotICAgIC8vIE9uIGRlcXVldWUsIHVzZXIgdGFrZXMgb3duZXJzaGlwIG9mIGJ1ZmZlciBwb2ludGVyLgotICAgIHN0YXR1c190IGVucXVldWUoY2FtZXJhX21ldGFkYXRhX3QgKmJ1Zik7Ci0gICAgc3RhdHVzX3QgZGVxdWV1ZShjYW1lcmFfbWV0YWRhdGFfdCAqKmJ1ZiwgYm9vbCBpbmNyZW1lbnRDb3VudCA9IHRydWUpOwotICAgIGludCAgICAgIGdldEJ1ZmZlckNvdW50KCk7Ci0gICAgc3RhdHVzX3Qgd2FpdEZvckJ1ZmZlcihuc2Vjc190IHRpbWVvdXQpOwotCi0gICAgLy8gU2V0IHJlcGVhdGluZyBidWZmZXIocyk7IGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSBvbiBhIGRlcXVldWUgY2FsbCwgdGhlCi0gICAgLy8gcXVldWUgY29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyZWFtIHNsb3QgaW50byB0aGUgcXVldWUsIGFuZCB0aGVuCi0gICAgLy8gZGVxdWV1ZXMgdGhlIGZpcnN0IG5ldyBlbnRyeS4KLSAgICBzdGF0dXNfdCBzZXRTdHJlYW1TbG90KGNhbWVyYV9tZXRhZGF0YV90ICpidWYpOwotICAgIHN0YXR1c190IHNldFN0cmVhbVNsb3QoY29uc3QgTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+ICZidWZzKTsKLQotICBwcml2YXRlOgotICAgIHN0YXR1c190IGZyZWVCdWZmZXJzKExpc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPjo6aXRlcmF0b3Igc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciYgZW5kKTsKLQotICAgIGNhbWVyYTJfZGV2aWNlX3QgKm1EZXZpY2U7Ci0KLSAgICBNdXRleCBtTXV0ZXg7Ci0gICAgQ29uZGl0aW9uIG5vdEVtcHR5OwotCi0gICAgaW50IG1GcmFtZUNvdW50OwotCi0gICAgaW50IG1Db3VudDsKLSAgICBMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4gbUVudHJpZXM7Ci0gICAgaW50IG1TdHJlYW1TbG90Q291bnQ7Ci0gICAgTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+IG1TdHJlYW1TbG90OwotCi0gICAgYm9vbCBtU2lnbmFsQ29uc3VtZXI7Ci0KLSAgICBzdGF0aWMgTWV0YWRhdGFRdWV1ZSogZ2V0SW5zdGFuY2UoY29uc3QgY2FtZXJhMl9mcmFtZV9xdWV1ZV9kc3Rfb3BzX3QgKnEpOwotICAgIHN0YXRpYyBNZXRhZGF0YVF1ZXVlKiBnZXRJbnN0YW5jZShjb25zdCBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wc190ICpxKTsKLQotICAgIHN0YXRpYyBpbnQgY29uc3VtZXJfYnVmZmVyX2NvdW50KGNvbnN0IGNhbWVyYTJfcmVxdWVzdF9xdWV1ZV9zcmNfb3BzX3QgKnEpOwotCi0gICAgc3RhdGljIGludCBjb25zdW1lcl9kZXF1ZXVlKGNvbnN0IGNhbWVyYTJfcmVxdWVzdF9xdWV1ZV9zcmNfb3BzX3QgKnEsCi0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqKmJ1ZmZlcik7Ci0KLSAgICBzdGF0aWMgaW50IGNvbnN1bWVyX2ZyZWUoY29uc3QgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHNfdCAqcSwKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpvbGRfYnVmZmVyKTsKLQotICAgIHN0YXRpYyBpbnQgcHJvZHVjZXJfZGVxdWV1ZShjb25zdCBjYW1lcmEyX2ZyYW1lX3F1ZXVlX2RzdF9vcHNfdCAqcSwKLSAgICAgICAgICAgIHNpemVfdCBlbnRyaWVzLCBzaXplX3QgYnl0ZXMsCi0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqKmJ1ZmZlcik7Ci0KLSAgICBzdGF0aWMgaW50IHByb2R1Y2VyX2NhbmNlbChjb25zdCBjYW1lcmEyX2ZyYW1lX3F1ZXVlX2RzdF9vcHNfdCAqcSwKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpvbGRfYnVmZmVyKTsKLQotICAgIHN0YXRpYyBpbnQgcHJvZHVjZXJfZW5xdWV1ZShjb25zdCBjYW1lcmEyX2ZyYW1lX3F1ZXVlX2RzdF9vcHNfdCAqcSwKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpmaWxsZWRfYnVmZmVyKTsKLQotfTsKLQotLyoqCi0gKiBCYXNpYyBjbGFzcyB0byByZWNlaXZlIGFuZCBxdWV1ZSB1cCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbWVyYSBkZXZpY2UKLSAqLwotCi1jbGFzcyBOb3RpZmllckxpc3RlbmVyIHsKLSAgcHVibGljOgotCi0gICAgTm90aWZpZXJMaXN0ZW5lcigpOwotCi0gICAgc3RhdHVzX3QgZ2V0Tm90aWZpY2F0aW9uc0Zyb20oY2FtZXJhMl9kZXZpY2UgKmRldik7Ci0KLSAgICBzdGF0dXNfdCBnZXROZXh0Tm90aWZpY2F0aW9uKGludDMyX3QgKm1zZ190eXBlLCBpbnQzMl90ICpleHQxLAotICAgICAgICAgICAgaW50MzJfdCAqZXh0MiwgaW50MzJfdCAqZXh0Myk7Ci0KLSAgICBzdGF0dXNfdCB3YWl0Rm9yTm90aWZpY2F0aW9uKGludDMyX3QgKm1zZ190eXBlLCBpbnQzMl90ICpleHQxLAotICAgICAgICAgICAgaW50MzJfdCAqZXh0MiwgaW50MzJfdCAqZXh0Myk7Ci0KLSAgICBpbnQgbnVtTm90aWZpY2F0aW9ucygpOwotCi0gIHByaXZhdGU6Ci0KLSAgICBzdGF0dXNfdCBnZXROZXh0Tm90aWZpY2F0aW9uTG9ja2VkKGludDMyX3QgKm1zZ190eXBlLAotICAgICAgICAgICAgaW50MzJfdCAqZXh0MSwgaW50MzJfdCAqZXh0MiwgaW50MzJfdCAqZXh0Myk7Ci0KLSAgICBzdHJ1Y3QgTm90aWZpY2F0aW9uIHsKLSAgICAgICAgTm90aWZpY2F0aW9uKGludDMyX3QgdHlwZSwgaW50MzJfdCBlMSwgaW50MzJfdCBlMiwgaW50MzJfdCBlMyk6Ci0gICAgICAgICAgICAgICAgbXNnX3R5cGUodHlwZSksCi0gICAgICAgICAgICAgICAgZXh0MShlMSksCi0gICAgICAgICAgICAgICAgZXh0MihlMiksCi0gICAgICAgICAgICAgICAgZXh0MyhlMykKLSAgICAgICAge30KLQotICAgICAgICBpbnQzMl90IG1zZ190eXBlOwotICAgICAgICBpbnQzMl90IGV4dDE7Ci0gICAgICAgIGludDMyX3QgZXh0MjsKLSAgICAgICAgaW50MzJfdCBleHQzOwotICAgIH07Ci0KLSAgICBMaXN0PE5vdGlmaWNhdGlvbj4gbU5vdGlmaWNhdGlvbnM7Ci0KLSAgICBNdXRleCBtTXV0ZXg7Ci0gICAgQ29uZGl0aW9uIG1OZXdOb3RpZmljYXRpb247Ci0KLSAgICB2b2lkIG9uTm90aWZ5KGludDMyX3QgbXNnX3R5cGUsCi0gICAgICAgICAgICBpbnQzMl90IGV4dDEsCi0gICAgICAgICAgICBpbnQzMl90IGV4dDIsCi0gICAgICAgICAgICBpbnQzMl90IGV4dDMpOwotCi0gICAgc3RhdGljIHZvaWQgbm90aWZ5X2NhbGxiYWNrX2Rpc3BhdGNoKGludDMyX3QgbXNnX3R5cGUsCi0gICAgICAgICAgICBpbnQzMl90IGV4dDEsCi0gICAgICAgICAgICBpbnQzMl90IGV4dDIsCi0gICAgICAgICAgICBpbnQzMl90IGV4dDMsCi0gICAgICAgICAgICB2b2lkICp1c2VyKTsKLQotfTsKLQotLyoqCi0gKiBBZGFwdGVyIGZyb20gYW4gSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnRlcmZhY2UgdG8gY2FtZXJhMiBkZXZpY2Ugc3RyZWFtIG9wcy4KLSAqIEFsc28gdGFrZXMgY2FyZSBvZiBhbGxvY2F0aW5nL2RlYWxsb2NhdGluZyBzdHJlYW0gaW4gZGV2aWNlIGludGVyZmFjZQotICovCi1jbGFzcyBTdHJlYW1BZGFwdGVyOiBwdWJsaWMgY2FtZXJhMl9zdHJlYW1fb3BzIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IFN0cmVhbUFkYXB0ZXIoc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29uc3VtZXIpOwotCi0gICAgflN0cmVhbUFkYXB0ZXIoKTsKLQotICAgIHN0YXR1c190IGNvbm5lY3RUb0RldmljZShjYW1lcmEyX2RldmljZV90ICpkLAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCk7Ci0KLSAgICBzdGF0dXNfdCBkaXNjb25uZWN0KCk7Ci0KLSAgICAvLyBHZXQgc3RyZWFtIElELiBPbmx5IHZhbGlkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjb25uZWN0VG9EZXZpY2UgY2FsbC4KLSAgICBpbnQgICAgICBnZXRJZCgpOwotCi0gIHByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIEVSUk9SID0gLTEsCi0gICAgICAgIERJU0NPTk5FQ1RFRCA9IDAsCi0gICAgICAgIFVOSU5JVElBTElaRUQsCi0gICAgICAgIEFMTE9DQVRFRCwKLSAgICAgICAgQ09OTkVDVEVELAotICAgICAgICBBQ1RJVkUKLSAgICB9IG1TdGF0ZTsKLQotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1Db25zdW1lckludGVyZmFjZTsKLSAgICBjYW1lcmEyX2RldmljZV90ICptRGV2aWNlOwotCi0gICAgdWludDMyX3QgbUlkOwotICAgIHVpbnQzMl90IG1XaWR0aDsKLSAgICB1aW50MzJfdCBtSGVpZ2h0OwotICAgIHVpbnQzMl90IG1Gb3JtYXQ7Ci0gICAgdWludDMyX3QgbVVzYWdlOwotICAgIHVpbnQzMl90IG1NYXhQcm9kdWNlckJ1ZmZlcnM7Ci0gICAgdWludDMyX3QgbU1heENvbnN1bWVyQnVmZmVyczsKLQotICAgIGNvbnN0IGNhbWVyYTJfc3RyZWFtX29wcyAqZ2V0U3RyZWFtT3BzKCk7Ci0KLSAgICBzdGF0aWMgQU5hdGl2ZVdpbmRvdyogdG9BTlcoY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzX3QgKncpOwotCi0gICAgc3RhdGljIGludCBkZXF1ZXVlX2J1ZmZlcihjb25zdCBjYW1lcmEyX3N0cmVhbV9vcHNfdCAqdywKLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCoqIGJ1ZmZlcik7Ci0KLSAgICBzdGF0aWMgaW50IGVucXVldWVfYnVmZmVyKGNvbnN0IGNhbWVyYTJfc3RyZWFtX29wc190KiB3LAotICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcik7Ci0KLSAgICBzdGF0aWMgaW50IGNhbmNlbF9idWZmZXIoY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzX3QqIHcsCi0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcik7Ci0KLSAgICBzdGF0aWMgaW50IHNldF9jcm9wKGNvbnN0IGNhbWVyYTJfc3RyZWFtX29wc190KiB3LAotICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSk7Ci0KLX07Ci0KLS8qKgotICogU2ltcGxlIGNsYXNzIHRvIHdhaXQgb24gdGhlIENwdUNvbnN1bWVyIHRvIGhhdmUgYSBmcmFtZSBhdmFpbGFibGUKLSAqLwotY2xhc3MgRnJhbWVXYWl0ZXIgOiBwdWJsaWMgQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgewotICBwdWJsaWM6Ci0gICAgRnJhbWVXYWl0ZXIoKTsKLQotICAgIC8qKgotICAgICAqIFdhaXQgZm9yIG1heCB0aW1lb3V0IG5hbm9zZWNvbmRzIGZvciBhIG5ldyBmcmFtZS4gUmV0dXJucwotICAgICAqIE9LIGlmIGEgZnJhbWUgaXMgYXZhaWxhYmxlLCBUSU1FRF9PVVQgaWYgdGhlIHRpbWVvdXQgd2FzIHJlYWNoZWQuCi0gICAgICovCi0gICAgc3RhdHVzX3Qgd2FpdEZvckZyYW1lKG5zZWNzX3QgdGltZW91dCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKLQotICAgIGludCBtUGVuZGluZ0ZyYW1lczsKLSAgICBNdXRleCBtTXV0ZXg7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci19OwotCi1zdHJ1Y3QgSFdNb2R1bGVIZWxwZXJzIHsKLSAgICAvKiBhdHRlbXB0IHRvIHVubG9hZCB0aGUgbGlicmFyeSB3aXRoIGRsY2xvc2UgKi8KLSAgICBzdGF0aWMgaW50IGNsb3NlTW9kdWxlKHZvaWQqIGRzbyk7Ci19OwotCi19Ci19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9tYWluLmNwcCBiL3Rlc3RzL2NhbWVyYTIvbWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZWJiZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9tYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlICJUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIlRlc3RTZXR0aW5ncy5oIgotCi11c2luZyBhbmRyb2lkOjpjYW1lcmEyOjp0ZXN0czo6VGVzdEZvcmtlckV2ZW50TGlzdGVuZXI7Ci11c2luZyBhbmRyb2lkOjpjYW1lcmEyOjp0ZXN0czo6VGVzdFNldHRpbmdzOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQotICAgIGJvb2wgcHJpbnRVc2FnZSA9ICFUZXN0U2V0dGluZ3M6OlBhcnNlQXJncyhhcmdjLCBhcmd2KTsKLQotICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotCi0gICAgaWYgKHByaW50VXNhZ2UpIHsKLSAgICAgICAgVGVzdFNldHRpbmdzOjpQcmludFVzYWdlKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIEdldHMgaG9sZCBvZiB0aGUgZXZlbnQgbGlzdGVuZXIgbGlzdC4KLSAgICA6OnRlc3Rpbmc6OlRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzID0KLSAgICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCk7Ci0gICAgLy8gQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBlbmQuICBHb29nbGUgVGVzdCB0YWtlcyB0aGUgb3duZXJzaGlwLgotICAgIGxpc3RlbmVycy5BcHBlbmQobmV3IFRlc3RGb3JrZXJFdmVudExpc3RlbmVyKCkpOwotCi0gICAgaW50IHJldCA9IFJVTl9BTExfVEVTVFMoKTsKLQotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9oYXJkd2FyZS9BbmRyb2lkLmJwIGIvdGVzdHMvaGFyZHdhcmUvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4ZTI4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9oYXJkd2FyZS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJzdGF0aWMtaGFsLWNoZWNrIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJzdHJ1Y3Qtc2l6ZS5jcHAiLAotICAgICAgICAic3RydWN0LW9mZnNldC5jcHAiLAotICAgICAgICAic3RydWN0LWxhc3QuY3BwIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYmhhcmR3YXJlIl0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItc3RkPWdudSsrMTEiLAotICAgICAgICAiLU8wIiwKLSAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSJdLAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaGFyZHdhcmUvQW5kcm9pZC5tayBiL3Rlc3RzL2hhcmR3YXJlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1NDBjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2hhcmR3YXJlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IHN0YXRpYy1oYWwtY2hlY2sKK0xPQ0FMX1NSQ19GSUxFUyA6PSBzdHJ1Y3Qtc2l6ZS5jcHAgc3RydWN0LW9mZnNldC5jcHAgc3RydWN0LWxhc3QuY3BwCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmhhcmR3YXJlCitMT0NBTF9DRkxBR1MgOj0gLXN0ZD1nbnUrKzExIC1PMAorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVzdHMvaGFyZHdhcmUvc3RydWN0LW9mZnNldC5jcHAgYi90ZXN0cy9oYXJkd2FyZS9zdHJ1Y3Qtb2Zmc2V0LmNwcAppbmRleCAxMGMwODk1Li43ZjdmMmUwIDEwMDY0NAotLS0gYS90ZXN0cy9oYXJkd2FyZS9zdHJ1Y3Qtb2Zmc2V0LmNwcAorKysgYi90ZXN0cy9oYXJkd2FyZS9zdHJ1Y3Qtb2Zmc2V0LmNwcApAQCAtMTE2LDcgKzExNiw5IEBACiAgICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCBiYXRjaCwgNzYsIDE0NCk7CiAgICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCBmbHVzaCwgODAsIDE1Mik7CiAgICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCBpbmplY3Rfc2Vuc29yX2RhdGEsIDg0LCAxNjApOwotICAgIENIRUNLX01FTUJFUl9BVChzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdCwgcmVzZXJ2ZWRfcHJvY3MsIDg4LCAxNjgpOworICAgIENIRUNLX01FTUJFUl9BVChzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdCwgcmVnaXN0ZXJfZGlyZWN0X2NoYW5uZWwsIDg4LCAxNjgpOworICAgIENIRUNLX01FTUJFUl9BVChzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdCwgY29uZmlnX2RpcmVjdF9yZXBvcnQsIDkyLCAxNzYpOworICAgIENIRUNLX01FTUJFUl9BVChzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdCwgcmVzZXJ2ZWRfcHJvY3MsIDk2LCAxODQpOwogCiAgICAgLy9UeXBlcyBkZWZpbmVkIGluIGZiLmgKICAgICBDSEVDS19NRU1CRVJfQVQoZnJhbWVidWZmZXJfZGV2aWNlX3QsIGNvbW1vbiwgMCwgMCk7CmRpZmYgLS1naXQgYS90ZXN0cy92ZWhpY2xlL1JFQURNRSBiL3Rlc3RzL3ZlaGljbGUvUkVBRE1FCmluZGV4IGI4ZmM3ZDQuLjQyZDIyMTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3ZlaGljbGUvUkVBRE1FCisrKyBiL3Rlc3RzL3ZlaGljbGUvUkVBRE1FCkBAIC00OSwxMyArNDksMTMgQEAKICQgbW1tIGhhcmR3YXJlL2xpYmhhcmR3YXJlCiAKIFRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIGJpbmFyaWVzIHRoYXQgd2UgY2FyZSBhYm91dDoKLWkpIG91dC90YXJnZXQvcHJvZHVjdC9YWFgvc3lzdGVtL2xpYi9ody92ZWhpY2xlLmRlZmF1bHQuc28KK2kpIG91dC90YXJnZXQvcHJvZHVjdC9YWFgvdmVuZG9yL2xpYi9ody92ZWhpY2xlLmRlZmF1bHQuc28KIGlpKSBvdXQvdGFyZ2V0L3Byb2R1Y3QvWFhYL2RhdGEvbmF0aXZldGVzdC92ZWhpY2xlX3Rlc3RzCiBpaWkpIG91dC90YXJnZXQvcHJvZHVjdC9YWFgvc3lzdGVtL2Jpbi92ZWhpY2xlLWhhbC10b29sCiAKIFRoZSBsb2NhdGlvbiBmb3IgdGhlIGZpcnN0IHNoYXJlZCBsaWJyYXJ5IHdvdWxkIGJlOgotJCBhZGIgcHVzaCBvdXQvdGFyZ2V0L3Byb2R1Y3QvWFhYL3N5c3RlbS9saWIvaHcvdmVoaWNsZS5kZWZhdWx0LnNvCi0vc3lzdGVtL2xpYi9odworJCBhZGIgcHVzaCBvdXQvdGFyZ2V0L3Byb2R1Y3QvWFhYL3ZlbmRvci9saWIvaHcvdmVoaWNsZS5kZWZhdWx0LnNvCisvdmVuZG9yL2xpYi9odwogWW91IGNhbiBhbHNvIHVzZSAnYWRiIHN5bmMnIGlmIHlvdSBsaWtlLCBhbHRob3VnaCB0aGlzIGlzIHRoZSBlYXNpZXN0IGxlYXN0CiBoYXNzbGUgd2F5IG9mIHB1dHRpbmcgaXQgaW4gcGxhY2UuCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3ZlaGljbGUvdmVoaWNsZS1oYWwtdG9vbC5jIGIvdGVzdHMvdmVoaWNsZS92ZWhpY2xlLWhhbC10b29sLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAo=