ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCmluZGV4IDRkOWI2NmQuLmVjNDc0ZTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbApAQCAtMjM5LDkgKzIzOSw5IEBACiAgICAgIDx0aXRsZT5OZXR3b3JrIGRldmljZSBzdXBwb3J0PC90aXRsZT4KICAgICAgPHNlY3QxPjx0aXRsZT5Ecml2ZXIgU3VwcG9ydDwvdGl0bGU+CiAhRW5ldC9jb3JlL2Rldi5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+ODM5MCBCYXNlZCBOZXR3b3JrIENhcmRzPC90aXRsZT4KLSFFZHJpdmVycy9uZXQvODM5MC5jCishRW5ldC9ldGhlcm5ldC9ldGguYworIUVpbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKKyFFbmV0L2NvcmUvd2lyZWxlc3MuYwogICAgICA8L3NlY3QxPgogICAgICA8c2VjdDE+PHRpdGxlPlN5bmNocm9ub3VzIFBQUDwvdGl0bGU+CiAhRWRyaXZlcnMvbmV0L3dhbi9zeW5jcHBwLmMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMveGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMveGZzLnR4dAppbmRleCBjN2Q1ZDBjLi43NGFlYjE0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy94ZnMudHh0CkBAIC0xOSwxNSArMTksNDMgQEAKIAogV2hlbiBtb3VudGluZyBhbiBYRlMgZmlsZXN5c3RlbSwgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhY2NlcHRlZC4KIAotICBiaW9zaXplPXNpemUKLQlTZXRzIHRoZSBwcmVmZXJyZWQgYnVmZmVyZWQgSS9PIHNpemUgKGRlZmF1bHQgc2l6ZSBpcyA2NEspLgotCSJzaXplIiBtdXN0IGJlIGV4cHJlc3NlZCBhcyB0aGUgbG9nYXJpdGhtIChiYXNlMikgb2YgdGhlCi0JZGVzaXJlZCBJL08gc2l6ZS4KLQlWYWxpZCB2YWx1ZXMgZm9yIHRoaXMgb3B0aW9uIGFyZSAxNCB0aHJvdWdoIDE2LCBpbmNsdXNpdmUKLQkoaS5lLiAxNkssIDMySywgYW5kIDY0SyBieXRlcykuICBPbiBtYWNoaW5lcyB3aXRoIGEgNEsKLQlwYWdlc2l6ZSwgMTMgKDhLIGJ5dGVzKSBpcyBhbHNvIGEgdmFsaWQgc2l6ZS4KLQlUaGUgcHJlZmVycmVkIGJ1ZmZlcmVkIEkvTyBzaXplIGNhbiBhbHNvIGJlIGFsdGVyZWQgb24gYW4KLQlpbmRpdmlkdWFsIGZpbGUgYmFzaXMgdXNpbmcgdGhlIGlvY3RsKDIpIHN5c3RlbSBjYWxsLgorICBhbGxvY3NpemU9c2l6ZQorCVNldHMgdGhlIGJ1ZmZlcmVkIEkvTyBlbmQtb2YtZmlsZSBwcmVhbGxvY2F0aW9uIHNpemUgd2hlbgorCWRvaW5nIGRlbGF5ZWQgYWxsb2NhdGlvbiB3cml0ZW91dCAoZGVmYXVsdCBzaXplIGlzIDY0S2lCKS4KKwlWYWxpZCB2YWx1ZXMgZm9yIHRoaXMgb3B0aW9uIGFyZSBwYWdlIHNpemUgKHR5cGljYWxseSA0S2lCKQorCXRocm91Z2ggdG8gMUdpQiwgaW5jbHVzaXZlLCBpbiBwb3dlci1vZi0yIGluY3JlbWVudHMuCisKKyAgYXR0cjIvbm9hdHRyMgorCVRoZSBvcHRpb25zIGVuYWJsZS9kaXNhYmxlIChkZWZhdWx0IGlzIGRpc2FibGVkIGZvciBiYWNrd2FyZAorCWNvbXBhdGliaWxpdHkgb24tZGlzaykgYW4gIm9wcG9ydHVuaXN0aWMiIGltcHJvdmVtZW50IHRvIGJlCisJbWFkZSBpbiB0aGUgd2F5IGlubGluZSBleHRlbmRlZCBhdHRyaWJ1dGVzIGFyZSBzdG9yZWQgb24tZGlzay4KKwlXaGVuIHRoZSBuZXcgZm9ybSBpcyB1c2VkIGZvciB0aGUgZmlyc3QgdGltZSAoYnkgc2V0dGluZyBvcgorCXJlbW92aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZXMpIHRoZSBvbi1kaXNrIHN1cGVyYmxvY2sgZmVhdHVyZQorCWJpdCBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGlzIGZvcm1hdCBiZWluZyBpbiB1c2UuCisKKyAgYmFycmllcgorCUVuYWJsZXMgdGhlIHVzZSBvZiBibG9jayBsYXllciB3cml0ZSBiYXJyaWVycyBmb3Igd3JpdGVzIGludG8KKwl0aGUgam91cm5hbCBhbmQgdW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9uLiAgVGhpcyBhbGxvd3MgZm9yCisJZHJpdmUgbGV2ZWwgd3JpdGUgY2FjaGluZyB0byBiZSBlbmFibGVkLCBmb3IgZGV2aWNlcyB0aGF0CisJc3VwcG9ydCB3cml0ZSBiYXJyaWVycy4KKworICBkbWFwaQorCUVuYWJsZSB0aGUgRE1BUEkgKERhdGEgTWFuYWdlbWVudCBBUEkpIGV2ZW50IGNhbGxvdXRzLgorCVVzZSB3aXRoIHRoZSAibXRwdCIgb3B0aW9uLgorCisgIGdycGlkL2JzZGdyb3VwcyBhbmQgbm9ncnBpZC9zeXN2Z3JvdXBzCisJVGhlc2Ugb3B0aW9ucyBkZWZpbmUgd2hhdCBncm91cCBJRCBhIG5ld2x5IGNyZWF0ZWQgZmlsZSBnZXRzLgorCVdoZW4gZ3JwaWQgaXMgc2V0LCBpdCB0YWtlcyB0aGUgZ3JvdXAgSUQgb2YgdGhlIGRpcmVjdG9yeSBpbgorCXdoaWNoIGl0IGlzIGNyZWF0ZWQ7IG90aGVyd2lzZSAodGhlIGRlZmF1bHQpIGl0IHRha2VzIHRoZSBmc2dpZAorCW9mIHRoZSBjdXJyZW50IHByb2Nlc3MsIHVubGVzcyB0aGUgZGlyZWN0b3J5IGhhcyB0aGUgc2V0Z2lkIGJpdAorCXNldCwgaW4gd2hpY2ggY2FzZSBpdCB0YWtlcyB0aGUgZ2lkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnksCisJYW5kIGFsc28gZ2V0cyB0aGUgc2V0Z2lkIGJpdCBzZXQgaWYgaXQgaXMgYSBkaXJlY3RvcnkgaXRzZWxmLgorCisgIGloYXNoc2l6ZT12YWx1ZQorCVNldHMgdGhlIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgYXZhaWxhYmxlIGZvciBoYXNoaW5nIHRoZQorCWluLW1lbW9yeSBpbm9kZXMgb2YgdGhlIHNwZWNpZmllZCBtb3VudCBwb2ludC4gIElmIGEgdmFsdWUKKwlvZiB6ZXJvIGlzIHVzZWQsIHRoZSB2YWx1ZSBzZWxlY3RlZCBieSB0aGUgZGVmYXVsdCBhbGdvcml0aG0KKwl3aWxsIGJlIGRpc3BsYXllZCBpbiAvcHJvYy9tb3VudHMuCiAKICAgaWtlZXAvbm9pa2VlcAogCVdoZW4gaW5vZGUgY2x1c3RlcnMgYXJlIGVtcHRpZWQgb2YgaW5vZGVzLCBrZWVwIHRoZW0gYXJvdW5kCkBAIC0zNSwxMiArNjMsMzEgQEAKIAlhbmQgaXMgc3RpbGwgdGhlIGRlZmF1bHQgZm9yIG5vdy4gIFVzaW5nIHRoZSBub2lrZWVwIG9wdGlvbiwKIAlpbm9kZSBjbHVzdGVycyBhcmUgcmV0dXJuZWQgdG8gdGhlIGZyZWUgc3BhY2UgcG9vbC4KIAorICBpbm9kZTY0CisJSW5kaWNhdGVzIHRoYXQgWEZTIGlzIGFsbG93ZWQgdG8gY3JlYXRlIGlub2RlcyBhdCBhbnkgbG9jYXRpb24KKwlpbiB0aGUgZmlsZXN5c3RlbSwgaW5jbHVkaW5nIHRob3NlIHdoaWNoIHdpbGwgcmVzdWx0IGluIGlub2RlCisJbnVtYmVycyBvY2N1cHlpbmcgbW9yZSB0aGFuIDMyIGJpdHMgb2Ygc2lnbmlmaWNhbmNlLiAgVGhpcyBpcworCXByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGNhdXNlcyBwcm9ibGVtcyBmb3IKKwliYWNrdXAgYXBwbGljYXRpb25zIHRoYXQgY2Fubm90IGhhbmRsZSBsYXJnZSBpbm9kZSBudW1iZXJzLgorCisgIGxhcmdlaW8vbm9sYXJnZWlvCisJSWYgIm5vbGFyZ2VpbyIgaXMgc3BlY2lmaWVkLCB0aGUgb3B0aW1hbCBJL08gcmVwb3J0ZWQgaW4KKwlzdF9ibGtzaXplIGJ5IHN0YXQoMikgd2lsbCBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZSB0byBhbGxvdyB1c2VyCisJYXBwbGljYXRpb25zIHRvIGF2b2lkIGluZWZmaWNpZW50IHJlYWQvbW9kaWZ5L3dyaXRlIEkvTy4KKwlJZiAibGFyZ2VpbyIgc3BlY2lmaWVkLCBhIGZpbGVzeXN0ZW0gdGhhdCBoYXMgYSAic3dpZHRoIiBzcGVjaWZpZWQKKwl3aWxsIHJldHVybiB0aGUgInN3aWR0aCIgdmFsdWUgKGluIGJ5dGVzKSBpbiBzdF9ibGtzaXplLiBJZiB0aGUKKwlmaWxlc3lzdGVtIGRvZXMgbm90IGhhdmUgYSAic3dpZHRoIiBzcGVjaWZpZWQgYnV0IGRvZXMgc3BlY2lmeQorCWFuICJhbGxvY3NpemUiIHRoZW4gImFsbG9jc2l6ZSIgKGluIGJ5dGVzKSB3aWxsIGJlIHJldHVybmVkCisJaW5zdGVhZC4KKwlJZiBuZWl0aGVyIG9mIHRoZXNlIHR3byBvcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZW4gZmlsZXN5c3RlbQorCXdpbGwgYmVoYXZlIGFzIGlmICJub2xhcmdlaW8iIHdhcyBzcGVjaWZpZWQuCisKICAgbG9nYnVmcz12YWx1ZQogCVNldCB0aGUgbnVtYmVyIG9mIGluLW1lbW9yeSBsb2cgYnVmZmVycy4gIFZhbGlkIG51bWJlcnMgcmFuZ2UKIAlmcm9tIDItOCBpbmNsdXNpdmUuCiAJVGhlIGRlZmF1bHQgdmFsdWUgaXMgOCBidWZmZXJzIGZvciBmaWxlc3lzdGVtcyB3aXRoIGEKLQlibG9ja3NpemUgb2YgNjRLLCA0IGJ1ZmZlcnMgZm9yIGZpbGVzeXN0ZW1zIHdpdGggYSBibG9ja3NpemUKLQlvZiAzMkssIDMgYnVmZmVycyBmb3IgZmlsZXN5c3RlbXMgd2l0aCBhIGJsb2Nrc2l6ZSBvZiAxNksKKwlibG9ja3NpemUgb2YgNjRLaUIsIDQgYnVmZmVycyBmb3IgZmlsZXN5c3RlbXMgd2l0aCBhIGJsb2Nrc2l6ZQorCW9mIDMyS2lCLCAzIGJ1ZmZlcnMgZm9yIGZpbGVzeXN0ZW1zIHdpdGggYSBibG9ja3NpemUgb2YgMTZLaUIKIAlhbmQgMiBidWZmZXJzIGZvciBhbGwgb3RoZXIgY29uZmlndXJhdGlvbnMuICBJbmNyZWFzaW5nIHRoZQogCW51bWJlciBvZiBidWZmZXJzIG1heSBpbmNyZWFzZSBwZXJmb3JtYW5jZSBvbiBzb21lIHdvcmtsb2FkcwogCWF0IHRoZSBjb3N0IG9mIHRoZSBtZW1vcnkgdXNlZCBmb3IgdGhlIGFkZGl0aW9uYWwgbG9nIGJ1ZmZlcnMKQEAgLTQ5LDEwICs5NiwxMCBAQAogICBsb2dic2l6ZT12YWx1ZQogCVNldCB0aGUgc2l6ZSBvZiBlYWNoIGluLW1lbW9yeSBsb2cgYnVmZmVyLgogCVNpemUgbWF5IGJlIHNwZWNpZmllZCBpbiBieXRlcywgb3IgaW4ga2lsb2J5dGVzIHdpdGggYSAiayIgc3VmZml4LgotCVZhbGlkIHNpemVzIGZvciB2ZXJzaW9uIDEgYW5kIHZlcnNpb24gMiBsb2dzIGFyZSAxNjM4NCAoMTZrKSBhbmQgCi0JMzI3NjggKDMyaykuICBWYWxpZCBzaXplcyBmb3IgdmVyc2lvbiAyIGxvZ3MgYWxzbyBpbmNsdWRlIAorCVZhbGlkIHNpemVzIGZvciB2ZXJzaW9uIDEgYW5kIHZlcnNpb24gMiBsb2dzIGFyZSAxNjM4NCAoMTZrKSBhbmQKKwkzMjc2OCAoMzJrKS4gIFZhbGlkIHNpemVzIGZvciB2ZXJzaW9uIDIgbG9ncyBhbHNvIGluY2x1ZGUKIAk2NTUzNiAoNjRrKSwgMTMxMDcyICgxMjhrKSBhbmQgMjYyMTQ0ICgyNTZrKS4KLQlUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbWFjaGluZXMgd2l0aCBtb3JlIHRoYW4gMzJNQiBvZiBtZW1vcnkKKwlUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbWFjaGluZXMgd2l0aCBtb3JlIHRoYW4gMzJNaUIgb2YgbWVtb3J5CiAJaXMgMzI3NjgsIG1hY2hpbmVzIHdpdGggbGVzcyBtZW1vcnkgdXNlIDE2Mzg0IGJ5IGRlZmF1bHQuCiAKICAgbG9nZGV2PWRldmljZSBhbmQgcnRkZXY9ZGV2aWNlCkBAIC02Miw2ICsxMDksMTEgQEAKIAlvcHRpb25hbCwgYW5kIHRoZSBsb2cgc2VjdGlvbiBjYW4gYmUgc2VwYXJhdGUgZnJvbSB0aGUgZGF0YQogCXNlY3Rpb24gb3IgY29udGFpbmVkIHdpdGhpbiBpdC4KIAorICBtdHB0PW1vdW50cG9pbnQKKwlVc2Ugd2l0aCB0aGUgImRtYXBpIiBvcHRpb24uICBUaGUgdmFsdWUgc3BlY2lmaWVkIGhlcmUgd2lsbCBiZQorCWluY2x1ZGVkIGluIHRoZSBETUFQSSBtb3VudCBldmVudCwgYW5kIHNob3VsZCBiZSB0aGUgcGF0aCBvZgorCXRoZSBhY3R1YWwgbW91bnRwb2ludCB0aGF0IGlzIHVzZWQuCisKICAgbm9hbGlnbgogCURhdGEgYWxsb2NhdGlvbnMgd2lsbCBub3QgYmUgYWxpZ25lZCBhdCBzdHJpcGUgdW5pdCBib3VuZGFyaWVzLgogCkBAIC05MSwxMyArMTQzLDE3IEBACiAJT19TWU5DIHdyaXRlcyBjYW4gYmUgbG9zdCBpZiB0aGUgc3lzdGVtIGNyYXNoZXMuCiAJSWYgdGltZXN0YW1wIHVwZGF0ZXMgYXJlIGNyaXRpY2FsLCB1c2UgdGhlIG9zeW5jaXNvc3luYyBvcHRpb24uCiAKLSAgcXVvdGEvdXNycXVvdGEvdXFub2VuZm9yY2UKKyAgdXF1b3RhL3VzcnF1b3RhL3Vxbm9lbmZvcmNlL3F1b3RhCiAJVXNlciBkaXNrIHF1b3RhIGFjY291bnRpbmcgZW5hYmxlZCwgYW5kIGxpbWl0cyAob3B0aW9uYWxseSkKLQllbmZvcmNlZC4KKwllbmZvcmNlZC4gIFJlZmVyIHRvIHhmc19xdW90YSg4KSBmb3IgZnVydGhlciBkZXRhaWxzLgogCi0gIGdycHF1b3RhL2dxbm9lbmZvcmNlCisgIGdxdW90YS9ncnBxdW90YS9ncW5vZW5mb3JjZQogCUdyb3VwIGRpc2sgcXVvdGEgYWNjb3VudGluZyBlbmFibGVkIGFuZCBsaW1pdHMgKG9wdGlvbmFsbHkpCi0JZW5mb3JjZWQuCisJZW5mb3JjZWQuICBSZWZlciB0byB4ZnNfcXVvdGEoOCkgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKworICBwcXVvdGEvcHJqcXVvdGEvcHFub2VuZm9yY2UKKwlQcm9qZWN0IGRpc2sgcXVvdGEgYWNjb3VudGluZyBlbmFibGVkIGFuZCBsaW1pdHMgKG9wdGlvbmFsbHkpCisJZW5mb3JjZWQuICBSZWZlciB0byB4ZnNfcXVvdGEoOCkgZm9yIGZ1cnRoZXIgZGV0YWlscy4KIAogICBzdW5pdD12YWx1ZSBhbmQgc3dpZHRoPXZhbHVlCiAJVXNlZCB0byBzcGVjaWZ5IHRoZSBzdHJpcGUgdW5pdCBhbmQgd2lkdGggZm9yIGEgUkFJRCBkZXZpY2Ugb3IKQEAgLTExMywxNSArMTY5LDIxIEBACiAJVGhlICJzd2lkdGgiIG9wdGlvbiBpcyByZXF1aXJlZCBpZiB0aGUgInN1bml0IiBvcHRpb24gaGFzIGJlZW4KIAlzcGVjaWZpZWQsIGFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlICJzdW5pdCIgdmFsdWUuCiAKKyAgc3dhbGxvYworCURhdGEgYWxsb2NhdGlvbnMgd2lsbCBiZSByb3VuZGVkIHVwIHRvIHN0cmlwZSB3aWR0aCBib3VuZGFyaWVzCisJd2hlbiB0aGUgY3VycmVudCBlbmQgb2YgZmlsZSBpcyBiZWluZyBleHRlbmRlZCBhbmQgdGhlIGZpbGUKKwlzaXplIGlzIGxhcmdlciB0aGFuIHRoZSBzdHJpcGUgd2lkdGggc2l6ZS4KKworCiBzeXNjdGxzCiA9PT09PT09CiAKIFRoZSBmb2xsb3dpbmcgc3lzY3RscyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgWEZTIGZpbGVzeXN0ZW06CiAKICAgZnMueGZzLnN0YXRzX2NsZWFyCQkoTWluOiAwICBEZWZhdWx0OiAwICBNYXg6IDEpCi0JU2V0dGluZyB0aGlzIHRvICIxIiBjbGVhcnMgYWNjdW11bGF0ZWQgWEZTIHN0YXRpc3RpY3MgCisJU2V0dGluZyB0aGlzIHRvICIxIiBjbGVhcnMgYWNjdW11bGF0ZWQgWEZTIHN0YXRpc3RpY3MKIAlpbiAvcHJvYy9mcy94ZnMvc3RhdC4gIEl0IHRoZW4gaW1tZWRpYXRlbHkgcmVzZXRzIHRvICIwIi4KLSAgCisKICAgZnMueGZzLnhmc3N5bmNkX2NlbnRpc2VjcwkoTWluOiAxMDAgIERlZmF1bHQ6IDMwMDAgIE1heDogNzIwMDAwKQogICAJVGhlIGludGVydmFsIGF0IHdoaWNoIHRoZSB4ZnNzeW5jZCB0aHJlYWQgZmx1c2hlcyBtZXRhZGF0YQogICAJb3V0IHRvIGRpc2suICBUaGlzIHRocmVhZCB3aWxsIGZsdXNoIGxvZyBhY3Rpdml0eSBvdXQsIGFuZApAQCAtMTQzLDkgKzIwNSw5IEBACiAJCVhGU19FUlJMRVZFTF9ISUdIOiAgICAgIDUKIAogICBmcy54ZnMucGFuaWNfbWFzawkJKE1pbjogMCAgRGVmYXVsdDogMCAgTWF4OiAxMjcpCi0JQ2F1c2VzIGNlcnRhaW4gZXJyb3IgY29uZGl0aW9ucyB0byBjYWxsIEJVRygpLiBWYWx1ZSBpcyBhIGJpdG1hc2s7IAorCUNhdXNlcyBjZXJ0YWluIGVycm9yIGNvbmRpdGlvbnMgdG8gY2FsbCBCVUcoKS4gVmFsdWUgaXMgYSBiaXRtYXNrOwogCUFORCB0b2dldGhlciB0aGUgdGFncyB3aGljaCByZXByZXNlbnQgZXJyb3JzIHdoaWNoIHNob3VsZCBjYXVzZSBwYW5pY3M6Ci0JCisKIAkJWEZTX05PX1BUQUcgICAgICAgICAgICAgICAgICAgICAwCiAJCVhGU19QVEFHX0lGTFVTSCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQogCQlYRlNfUFRBR19MT0dSRVMgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKQEAgLTE1NSw3ICsyMTcsNyBAQAogCQlYRlNfUFRBR19TSFVURE9XTl9JT0VSUk9SICAgICAgIDB4MDAwMDAwMjAKIAkJWEZTX1BUQUdfU0hVVERPV05fTE9HRVJST1IgICAgICAweDAwMDAwMDQwCiAKLQlUaGlzIG9wdGlvbiBpcyBpbnRlbmRlZCBmb3IgZGVidWdnaW5nIG9ubHkuCQkKKwlUaGlzIG9wdGlvbiBpcyBpbnRlbmRlZCBmb3IgZGVidWdnaW5nIG9ubHkuCiAKICAgZnMueGZzLmlyaXhfc3ltbGlua19tb2RlCShNaW46IDAgIERlZmF1bHQ6IDAgIE1heDogMSkKIAlDb250cm9scyB3aGV0aGVyIHN5bWxpbmtzIGFyZSBjcmVhdGVkIHdpdGggbW9kZSAwNzc3IChkZWZhdWx0KQpAQCAtMTY0LDI1ICsyMjYsMzcgQEAKICAgZnMueGZzLmlyaXhfc2dpZF9pbmhlcml0CShNaW46IDAgIERlZmF1bHQ6IDAgIE1heDogMSkKIAlDb250cm9scyBmaWxlcyBjcmVhdGVkIGluIFNHSUQgZGlyZWN0b3JpZXMuCiAJSWYgdGhlIGdyb3VwIElEIG9mIHRoZSBuZXcgZmlsZSBkb2VzIG5vdCBtYXRjaCB0aGUgZWZmZWN0aXZlIGdyb3VwCi0JSUQgb3Igb25lIG9mIHRoZSBzdXBwbGVtZW50YXJ5IGdyb3VwIElEcyBvZiB0aGUgcGFyZW50IGRpciwgdGhlIAotCUlTR0lEIGJpdCBpcyBjbGVhcmVkIGlmIHRoZSBpcml4X3NnaWRfaW5oZXJpdCBjb21wYXRpYmlsaXR5IHN5c2N0bCAKKwlJRCBvciBvbmUgb2YgdGhlIHN1cHBsZW1lbnRhcnkgZ3JvdXAgSURzIG9mIHRoZSBwYXJlbnQgZGlyLCB0aGUKKwlJU0dJRCBiaXQgaXMgY2xlYXJlZCBpZiB0aGUgaXJpeF9zZ2lkX2luaGVyaXQgY29tcGF0aWJpbGl0eSBzeXNjdGwKIAlpcyBzZXQuCiAKICAgZnMueGZzLnJlc3RyaWN0X2Nob3duCQkoTWluOiAwICBEZWZhdWx0OiAxICBNYXg6IDEpCiAgIAlDb250cm9scyB3aGV0aGVyIHVucHJpdmlsZWdlZCB1c2VycyBjYW4gdXNlIGNob3duIHRvICJnaXZlIGF3YXkiCiAJYSBmaWxlIHRvIGFub3RoZXIgdXNlci4KIAotICBmcy54ZnMuaW5oZXJpdF9zeW5jCQkoTWluOiAwICBEZWZhdWx0OiAxICBNYXggMSkKLQlTZXR0aW5nIHRoaXMgdG8gIjEiIHdpbGwgY2F1c2UgdGhlICJzeW5jIiBmbGFnIHNldCAKLQlieSB0aGUgY2hhdHRyKDEpIGNvbW1hbmQgb24gYSBkaXJlY3RvcnkgdG8gYmUKKyAgZnMueGZzLmluaGVyaXRfc3luYwkJKE1pbjogMCAgRGVmYXVsdDogMSAgTWF4OiAxKQorCVNldHRpbmcgdGhpcyB0byAiMSIgd2lsbCBjYXVzZSB0aGUgInN5bmMiIGZsYWcgc2V0CisJYnkgdGhlIHhmc19pbyg4KSBjaGF0dHIgY29tbWFuZCBvbiBhIGRpcmVjdG9yeSB0byBiZQogCWluaGVyaXRlZCBieSBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeS4KIAotICBmcy54ZnMuaW5oZXJpdF9ub2R1bXAJCShNaW46IDAgIERlZmF1bHQ6IDEgIE1heCAxKQotCVNldHRpbmcgdGhpcyB0byAiMSIgd2lsbCBjYXVzZSB0aGUgIm5vZHVtcCIgZmxhZyBzZXQgCi0JYnkgdGhlIGNoYXR0cigxKSBjb21tYW5kIG9uIGEgZGlyZWN0b3J5IHRvIGJlCisgIGZzLnhmcy5pbmhlcml0X25vZHVtcAkJKE1pbjogMCAgRGVmYXVsdDogMSAgTWF4OiAxKQorCVNldHRpbmcgdGhpcyB0byAiMSIgd2lsbCBjYXVzZSB0aGUgIm5vZHVtcCIgZmxhZyBzZXQKKwlieSB0aGUgeGZzX2lvKDgpIGNoYXR0ciBjb21tYW5kIG9uIGEgZGlyZWN0b3J5IHRvIGJlCiAJaW5oZXJpdGVkIGJ5IGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5LgogCi0gIGZzLnhmcy5pbmhlcml0X25vYXRpbWUJKE1pbjogMCAgRGVmYXVsdDogMSAgTWF4IDEpCi0JU2V0dGluZyB0aGlzIHRvICIxIiB3aWxsIGNhdXNlIHRoZSAibm9hdGltZSIgZmxhZyBzZXQgCi0JYnkgdGhlIGNoYXR0cigxKSBjb21tYW5kIG9uIGEgZGlyZWN0b3J5IHRvIGJlCisgIGZzLnhmcy5pbmhlcml0X25vYXRpbWUJKE1pbjogMCAgRGVmYXVsdDogMSAgTWF4OiAxKQorCVNldHRpbmcgdGhpcyB0byAiMSIgd2lsbCBjYXVzZSB0aGUgIm5vYXRpbWUiIGZsYWcgc2V0CisJYnkgdGhlIHhmc19pbyg4KSBjaGF0dHIgY29tbWFuZCBvbiBhIGRpcmVjdG9yeSB0byBiZQogCWluaGVyaXRlZCBieSBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeS4KKworICBmcy54ZnMuaW5oZXJpdF9ub3N5bWxpbmtzCShNaW46IDAgIERlZmF1bHQ6IDEgIE1heDogMSkKKwlTZXR0aW5nIHRoaXMgdG8gIjEiIHdpbGwgY2F1c2UgdGhlICJub3N5bWxpbmtzIiBmbGFnIHNldAorCWJ5IHRoZSB4ZnNfaW8oOCkgY2hhdHRyIGNvbW1hbmQgb24gYSBkaXJlY3RvcnkgdG8gYmUKKwlpbmhlcml0ZWQgYnkgZmlsZXMgaW4gdGhhdCBkaXJlY3RvcnkuCisKKyAgZnMueGZzLnJvdG9yc3RlcAkJKE1pbjogMSAgRGVmYXVsdDogMSAgTWF4OiAyNTYpCisJSW4gImlub2RlMzIiIGFsbG9jYXRpb24gbW9kZSwgdGhpcyBvcHRpb24gZGV0ZXJtaW5lcyBob3cgbWFueQorCWZpbGVzIHRoZSBhbGxvY2F0b3IgYXR0ZW1wdHMgdG8gYWxsb2NhdGUgaW4gdGhlIHNhbWUgYWxsb2NhdGlvbgorCWdyb3VwIGJlZm9yZSBtb3ZpbmcgdG8gdGhlIG5leHQgYWxsb2NhdGlvbiBncm91cC4gIFRoZSBpbnRlbnQKKwlpcyB0byBjb250cm9sIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBhbGxvY2F0b3IgbW92ZXMgYmV0d2VlbgorCWFsbG9jYXRpb24gZ3JvdXBzIHdoZW4gYWxsb2NhdGluZyBleHRlbnRzIGZvciBuZXcgZmlsZXMuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCA2YjEyZDcxLi4yOTZiYzAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL0tjb25maWcKQEAgLTcwNCw4ICs3MDQsNyBAQAogCiBpZiBQQ01DSUEgfHwgQVJDSF9DTFBTNzUwMCB8fCBBUkNIX0lPUDNYWCB8fCBBUkNIX0lYUDRYWCBcCiAJfHwgQVJDSF9MNzIwMCB8fCBBUkNIX0xIN0E0MFggfHwgQVJDSF9QWEEgfHwgQVJDSF9SUEMgXAotCXx8IEFSQ0hfUzNDMjQxMCB8fCBBUkNIX1NBMTEwMCB8fCBBUkNIX1NIQVJLIHx8IEZPT1RCUklER0UgXAotCXx8IE1BQ0hfTVAxMDAwCisJfHwgQVJDSF9TM0MyNDEwIHx8IEFSQ0hfU0ExMTAwIHx8IEFSQ0hfU0hBUksgfHwgRk9PVEJSSURHRQogc291cmNlICJkcml2ZXJzL2lkZS9LY29uZmlnIgogZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vTWFrZWZpbGUgYi9hcmNoL2FybS9NYWtlZmlsZQppbmRleCBkODA3NDlhLi4xMTRjZGE3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTM4LDYgKzM4LDcgQEAKICMgbWFjcm8sIGJ1dCBpbnN0ZWFkIGRlZmluZXMgYSB3aG9sZSBzZXJpZXMgb2YgbWFjcm9zIHdoaWNoIG1ha2VzCiAjIHRlc3RpbmcgZm9yIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIG9yIGxhdGVyIHJhdGhlciBpbXBvc3NpYmxlLgogYXJjaC0kKENPTkZJR19DUFVfMzJ2NikJCTo9LURfX0xJTlVYX0FSTV9BUkNIX189NiAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1hcm12NiwtbWFyY2g9YXJtdjV0IC1XYSQoY29tbWEpLW1hcmNoPWFybXY2KQorYXJjaC0kKENPTkZJR19DUFVfMzJ2NkspCTo9LURfX0xJTlVYX0FSTV9BUkNIX189NiAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1hcm12NmssLW1hcmNoPWFybXY1dCAtV2EkKGNvbW1hKS1tYXJjaD1hcm12NmspCiBhcmNoLSQoQ09ORklHX0NQVV8zMnY1KQkJOj0tRF9fTElOVVhfQVJNX0FSQ0hfXz01ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWFybXY1dGUsLW1hcmNoPWFybXY0KQogYXJjaC0kKENPTkZJR19DUFVfMzJ2NCkJCTo9LURfX0xJTlVYX0FSTV9BUkNIX189NCAtbWFyY2g9YXJtdjQKIGFyY2gtJChDT05GSUdfQ1BVXzMydjMpCQk6PS1EX19MSU5VWF9BUk1fQVJDSF9fPTMgLW1hcmNoPWFybXYzCkBAIC0xNDMsNyArMTQ0LDcgQEAKIGRyaXZlcnMtJChDT05GSUdfQVJDSF9DTFBTNzUwMCkJKz0gZHJpdmVycy9hY29ybi9jaGFyLwogZHJpdmVycy0kKENPTkZJR19BUkNIX0w3MjAwKQkrPSBkcml2ZXJzL2Fjb3JuL2NoYXIvCiAKLWxpYnMteQkJCQkrPSBhcmNoL2FybS9saWIvCitsaWJzLXkJCQkJOj0gYXJjaC9hcm0vbGliLyAkKGxpYnMteSkKIAogIyBEZWZhdWx0IHRhcmdldCB3aGVuIGV4ZWN1dGluZyBwbGFpbiBtYWtlCiBpZmVxICgkKENPTkZJR19YSVBfS0VSTkVMKSx5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKaW5kZXggYTU0ZDJlYi4uN2M3ZjQ3NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUworKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCkBAIC0zOSw4ICszOSw3IEBACiAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9JWFA0WFgpIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19BUkNIX0lYUDIwMDApIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19BUkNIX0xIN0E0MFgpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19BUkNIX09NQVApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19NQUNIX01QMTAwMCkKKyAgICBkZWZpbmVkKENPTkZJR19BUkNIX09NQVApCiAJCS5tYWNybwlsb2Fkc3AsCXJiCiAJCWFkZHJ1YXJ0IFxyYgogCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZwppbmRleCAzOGM5YTcyLi4zMmJkNTUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZwpAQCAtMTUyLDcgKzE1Miw3IEBACiAjCiBDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCiBDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKLUNPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDU3NjAwIHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAgbWVtPTY0TUAweDAgcGNpPWZpcm13YXJlIgorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsMTE1MjAwIHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAgbWVtPTY0TUAweDAgcGNpPWZpcm13YXJlIgogIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CiAKICMKQEAgLTU2MCw3ICs1NjAsNyBAQAogIwogQ09ORklHX1NFUklBTF84MjUwPXkKIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MwogIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDFfZGVmY29uZmlnCmluZGV4IDEyZWYyM2QuLjY2YWMwODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDFfZGVmY29uZmlnCkBAIC01NjAsNyArNTYwLDcgQEAKICMKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTMKICMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9tcDEwMDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlld19kZWZjb25maWcKc2ltaWxhcml0eSBpbmRleCA2MCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vY29uZmlncy9tcDEwMDBfZGVmY29uZmlnCnJlbmFtZSB0byBhcmNoL2FybS9jb25maWdzL3JlYWx2aWV3X2RlZmNvbmZpZwppbmRleCBkMmNiYzZmLi4wNDg1YjJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL21wMTAwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlld19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTQtcmMxCi0jIEZyaSBTZXAgMTYgMTU6NDg6MTMgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE0LXJjMgorIyBUaHUgU2VwIDI5IDE0OjUwOjEwIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0xMiwxMSArMTIsOSBAQAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKICMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotIyBDT05GSUdfQ0xFQU5fQ09NUElMRSBpcyBub3Qgc2V0Ci1DT05GSUdfQlJPS0VOPXkKKyMgQ09ORklHX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15Ci1DT05GSUdfTE9DS19LRVJORUw9eQogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCkBAIC0yNCwxOCArMjIsMTYgQEAKICMKIENPTkZJR19MT0NBTFZFUlNJT049IiIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15CisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CiBDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQotQ09ORklHX0lLQ09ORklHPXkKLUNPTkZJR19JS0NPTkZJR19QUk9DPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi1DT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKQEAgLTU4LDE3ICs1NCwxNSBAQAogIwogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15Ci0jIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQorIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0CiAKICMKICMgU3lzdGVtIFR5cGUKICMKICMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfQ0xQUzcxMVg9eQorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldApAQCAtODYsNDMgKzgwLDQzIEBACiAjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1JFQUxWSUVXPXkKICMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiAKICMKLSMgQ0xQUzcxMVgvRVA3MjFYIEltcGxlbWVudGF0aW9ucworIyBSZWFsVmlldyBwbGF0Zm9ybSB0eXBlCiAjCi0jIENPTkZJR19BUkNIX0FVVENQVTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0RCODk3MTIgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DRUlWQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NMRVA3MzEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRURCNzIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1A3MjBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRk9SVFVORVQgaXMgbm90IHNldAotQ09ORklHX01BQ0hfTVAxMDAwPXkKLUNPTkZJR19NUDEwMDBfOTBNSFo9eQorQ09ORklHX01BQ0hfUkVBTFZJRVdfRUI9eQogCiAjCiAjIFByb2Nlc3NvciBUeXBlCiAjCiBDT05GSUdfQ1BVXzMyPXkKLUNPTkZJR19DUFVfQVJNNzIwVD15Ci1DT05GSUdfQ1BVXzMydjQ9eQotQ09ORklHX0NQVV9BQlJUX0xWNFQ9eQotQ09ORklHX0NQVV9DQUNIRV9WND15CitDT05GSUdfQ1BVX0FSTTkyNlQ9eQorIyBDT05GSUdfQ1BVX1Y2IGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VEo9eQogQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKLUNPTkZJR19DUFVfQ09QWV9WNFdUPXkKLUNPTkZJR19DUFVfVExCX1Y0V1Q9eQorQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQogCiAjCiAjIFByb2Nlc3NvciBGZWF0dXJlcwogIwogQ09ORklHX0FSTV9USFVNQj15CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9DQUNIRV9ST1VORF9ST0JJTiBpcyBub3Qgc2V0CitDT05GSUdfQVJNX0dJQz15CitDT05GSUdfSUNTVDMwNz15CiAKICMKICMgQnVzIHN1cHBvcnQKICMKK0NPTkZJR19BUk1fQU1CQT15CiBDT05GSUdfSVNBX0RNQV9BUEk9eQogCiAjCkBAIC0xMzMsMTQgKzEyNyw4IEBACiAjCiAjIEtlcm5lbCBGZWF0dXJlcwogIwotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLUNPTkZJR19QUkVFTVBUPXkKICMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKICMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldApAQCAtMTUxLDcgKzEzOSw3IEBACiAjCiBDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCiBDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKLUNPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eUNMLDM4NDAwIHJvb3Q9L2Rldi9kaXNjcy9kaXNjMC9wYXJ0MSBpcD1hbnkgY3M4OXgwX21lZGlhPXJqNDUiCitDT05GSUdfQ01ETElORT0icm9vdD0vZGV2L25mcyBuZnNyb290PTEwLjEuNjkuMzovd29yay9uZnNyb290IGlwPWRoY3AgY29uc29sZT10dHlBTUEwIG1lbT0xMjhNIgogIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CiAKICMKQEAgLTE2MywxNCArMTUxLDE0IEBACiAjCiBDT05GSUdfRlBFX05XRlBFPXkKICMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisjIENPTkZJR19WRlAgaXMgbm90IHNldAogCiAjCiAjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9FTEY9eQogIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAotQ09ORklHX0JJTkZNVF9NSVNDPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CiAKICMKQEAgLTE5NywxMCArMTg1LDkgQEAKIENPTkZJR19JUF9QTlA9eQogQ09ORklHX0lQX1BOUF9ESENQPXkKIENPTkZJR19JUF9QTlBfQk9PVFA9eQotQ09ORklHX0lQX1BOUF9SQVJQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldApAQCAtMjEwLDM2ICsxOTcsMTQgQEAKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19CSUM9eQotQ09ORklHX0lQVjY9eQotIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldAogIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAogCkBAIC0yNDcsNyArMjEyLDYgQEAKICMgTmV0d29yayB0ZXN0aW5nCiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0lSREEgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldApAQCAtMjY5LDE0ICsyMzMsMTAgQEAKICMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQogIwogQ09ORklHX01URD15Ci1DT05GSUdfTVREX0RFQlVHPXkKLUNPTkZJR19NVERfREVCVUdfVkVSQk9TRT0zCisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotQ09ORklHX01URF9SRURCT09UX1BBUlRTPW0KLUNPTkZJR19NVERfUkVEQk9PVF9ESVJFQ1RPUllfQkxPQ0s9LTIKLUNPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRD15Ci0jIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CiAKQEAgLTI5Miw0NSArMjUyLDM2IEBACiAjCiAjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCiAjCi1DT05GSUdfTVREX0NGST1tCitDT05GSUdfTVREX0NGST15CiAjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0dFTl9QUk9CRT1tCi1DT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15Ci1DT05GSUdfTVREX0NGSV9OT1NXQVA9eQotIyBDT05GSUdfTVREX0NGSV9CRV9CWVRFX1NXQVAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVAgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfR0VPTUVUUlk9eQotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzEgaXMgbm90IHNldAotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzIgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CiAjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAogIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfSTEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQogQ09ORklHX01URF9DRklfSTI9eQogIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9PVFAgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfSU5URUxFWFQ9bQotIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURF9SRVRSWT0wCiAjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfVVRJTD1tCitDT05GSUdfTVREX0NGSV9VVElMPXkKICMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9PQlNPTEVURV9DSElQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKIAogIwogIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCiAjCiAjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX1BIWVNNQVA9bQotQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4MDAwMDAwMAotQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDQwMDAwMDAKLUNPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgotIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfRURCNzMxMj1tCisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SPXkKKyMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIAogIwpAQCAtMzQwLDcgKzI5MSw2IEBACiAjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAogCiAjCiAjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycwpAQCAtMzUyLDEyICszMDIsNyBAQAogIwogIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCiAjCi1DT05GSUdfTVREX05BTkQ9eQotIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfTkFORF9NUDEwMDA9eQotQ09ORklHX01URF9OQU5EX0lEUz15Ci0jIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9OQU5EX05BTkRTSU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAogCiAjCiAjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydApAQCAtMzcyLDUzICszMTcsMjIgQEAKICMgQmxvY2sgZGV2aWNlcwogIwogIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9bQotIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTIKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTE2Mzg0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCiAjCiBDT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAogQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotQ09ORklHX0lERT15Ci1DT05GSUdfQkxLX0RFVl9JREU9eQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEX0lERSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPXkKLSMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0Ci0KLSMKLSMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwotIwotIyBDT05GSUdfSURFX0dFTkVSSUMgaXMgbm90IHNldAotQ09ORklHX0lERV9BUk09eQotQ09ORklHX0JMS19ERVZfSURFX01QMTAwMD15Ci0jIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKLQotIwogIyBTQ1NJIGRldmljZSBzdXBwb3J0CiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKQEAgLTQyNywxNCArMzQxLDcgQEAKICMKICMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKICMKLUNPTkZJR19NRD15Ci0jIENPTkZJR19CTEtfREVWX01EIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0RNPXkKLSMgQ09ORklHX0RNX0NSWVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNX1NOQVBTSE9UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNX01JUlJPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETV9aRVJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydApAQCAtNDQ0LDcgKzM1MSw2IEBACiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKICMKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKIAogIwogIyBJMk8gZGV2aWNlIHN1cHBvcnQKQEAgLTQ2OCwxMCArMzc0LDkgQEAKICMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCiAjCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKLSMgQ09ORklHX01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorQ09ORklHX01JST15CitDT05GSUdfU01DOTFYPXkKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1M4OXgwPXkKIAogIwogIyBFdGhlcm5ldCAoMTAwMCBNYml0KQpAQCAtNDk2LDggKzQwMSw2IEBACiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKIApAQCAtNTE0LDE3ICs0MTcsMjggQEAKICMKICMgVXNlcmxhbmQgaW50ZXJmYWNlcwogIwotIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAogIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9FVkJVRz15CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CiAKICMKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKQEAgLTUzMyw4ICs0NDcsOSBAQAogIyBIYXJkd2FyZSBJL08gcG9ydHMKICMKIENPTkZJR19TRVJJTz15Ci1DT05GSUdfU0VSSU9fU0VSUE9SVD15Ci0jIENPTkZJR19TRVJJT19MSUJQUzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fQU1CQUtNST15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKICMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CiAKQEAgLTU0OSwyMSArNDY0LDE5IEBACiAjCiAjIFNlcmlhbCBkcml2ZXJzCiAjCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTIKLSMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKIAogIwogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCi1DT05GSUdfU0VSSUFMX0NMUFM3MTFYPXkKLUNPTkZJR19TRVJJQUxfQ0xQUzcxMVhfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfQU1CQV9QTDAxMCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0FNQkFfUEwwMTE9eQorQ09ORklHX1NFUklBTF9BTUJBX1BMMDExX0NPTlNPTEU9eQogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0xNgogCiAjCiAjIElQTUkKQEAgLTU3NCw4ICs0ODcsOCBAQAogIyBXYXRjaGRvZyBDYXJkcwogIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX05WUkFNPXkKLUNPTkZJR19SVEM9eQorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogCkBAIC01OTYsOSArNTA5LDggQEAKICMKICMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CiAjCi1DT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCiAjIE1pc2MgZGV2aWNlcwpAQCAtNjIxLDE4ICs1MzMsNzIgQEAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotIyBDT05GSUdfRkIgaXMgbm90IHNldAorQ09ORklHX0ZCPXkKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CitDT05GSUdfRkJfU09GVF9DVVJTT1I9eQorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CitDT05GSUdfRkJfQVJNQ0xDRD15CisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKIAogIwogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKICMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKKyMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19MT0dPPXkKKyMgQ09ORklHX0xPR09fTElOVVhfTU9OTyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2IGlzIG5vdCBzZXQKK0NPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBTb3VuZAogIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKK0NPTkZJR19TTkQ9eQorQ09ORklHX1NORF9USU1FUj15CitDT05GSUdfU05EX1BDTT15CisjIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfT1NTRU1VTD15CitDT05GSUdfU05EX01JWEVSX09TUz15CitDT05GSUdfU05EX1BDTV9PU1M9eQorIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgR2VuZXJpYyBkZXZpY2VzCisjCisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorCisjCisjIEFMU0EgQVJNIGRldmljZXMKKyMKKyMgQ09ORklHX1NORF9BUk1BQUNJIGlzIG5vdCBzZXQKKworIworIyBPcGVuIFNvdW5kIFN5c3RlbQorIworIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAogCiAjCiAjIFVTQiBzdXBwb3J0CkBAIC02NTQsMzIgKzYyMCwxNyBAQAogIwogIyBGaWxlIHN5c3RlbXMKICMKLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19FWFQyX0ZTX1hBVFRSPXkKLSMgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0VYVDNfRlNfWEFUVFI9eQotIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0Ci1DT05GSUdfSkJEPXkKLSMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci1DT05GSUdfUkVJU0VSRlNfRlM9bQotIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19GU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfSU5PVElGWT15Ci1DT05GSUdfUVVPVEE9eQotIyBDT05GSUdfUUZNVF9WMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19RRk1UX1YyIGlzIG5vdCBzZXQKLUNPTkZJR19RVU9UQUNUTD15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CkBAIC02OTQsOCArNjQ1LDExIEBACiAjCiAjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKICMKK0NPTkZJR19GQVRfRlM9eQogIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCiAjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtNzA0LDcgKzY1OCw2IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKLSMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKICMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldApAQCAtNzEyLDIyICs2NjUsMTAgQEAKICMKICMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwogIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19KRkZTMl9GUz1tCi1DT05GSUdfSkZGUzJfRlNfREVCVUc9MAotQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKLSMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX1pMSUI9eQotQ09ORklHX0pGRlMyX1JUSU1FPXkKLSMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKLUNPTkZJR19DUkFNRlM9bQorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKQEAgLTc0MCwzMiArNjgxLDE2IEBACiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTX1Y0PXkKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRD15Ci1DT05GSUdfTkZTRF9WMz15Ci0jIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRF9WND15Ci1DT05GSUdfTkZTRF9UQ1A9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQogQ09ORklHX0xPQ0tEPXkKIENPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfRVhQT1JURlM9eQogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz15Ci1DT05GSUdfU1VOUlBDX0dTUz15Ci1DT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAotQ09ORklHX1NNQl9GUz1tCi0jIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAotQ09ORklHX0NJRlM9bQotIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CiAKICMKICMgUGFydGl0aW9uIFR5cGVzCkBAIC04MDIsNyArNzI3LDcgQEAKICMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKICMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKQEAgLTgxOCwzNCArNzQzLDI2IEBACiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAKICMKLSMgUHJvZmlsaW5nIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0KLSMKICMgS2VybmVsIGhhY2tpbmcKICMKLUNPTkZJR19QUklOVEtfVElNRT15CisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19NQUdJQ19TWVNSUT15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfUFJFRU1QVD15CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0lORk89eQorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfREVCVUdfVVNFUj15Ci1DT05GSUdfREVCVUdfV0FJVFE9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0VSUk9SUz15Ci1DT05GSUdfREVCVUdfTEw9eQotIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0NMUFM3MTFYX1VBUlQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC04NTYsMzEgKzc3Myw3IEBACiAjCiAjIENyeXB0b2dyYXBoaWMgb3B0aW9ucwogIwotQ09ORklHX0NSWVBUTz15Ci0jIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTUQ1PXkKLSMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0RFUz15Ci0jIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKQEAgLTg5Myw1ICs3ODYsNCBAQAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0Ci1DT05GSUdfWkxJQl9JTkZMQVRFPW0KLUNPTkZJR19aTElCX0RFRkxBVEU9bQorQ09ORklHX1pMSUJfSU5GTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvYml0b3BzLmggYi9hcmNoL2FybS9saWIvYml0b3BzLmgKaW5kZXggNjRhOTg4Yy4uZjM1ZDkxZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2JpdG9wcy5oCisrKyBiL2FyY2gvYXJtL2xpYi9iaXRvcHMuaApAQCAtMSw2ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAotI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2ICYmIGRlZmluZWQoQ09ORklHX0NQVV9NUENPUkUpCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYgJiYgZGVmaW5lZChDT05GSUdfQ1BVXzMydjZLKQogCS5tYWNybwliaXRvcCwgaW5zdHIKIAltb3YJcjIsICMxCiAJYW5kCXIzLCByMCwgIzcJCUAgR2V0IGJpdCBvZmZzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi91YWNjZXNzLlMgYi9hcmNoL2FybS9saWIvdWFjY2Vzcy5TCmluZGV4IGMyODQ0OTEuLjZmMWI1YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi91YWNjZXNzLlMKKysrIGIvYXJjaC9hcm0vbGliL3VhY2Nlc3MuUwpAQCAtNDMsOCArNDMsNiBAQAogCQlzdG1mZAlzcCEsIHtyMiwgcjQgLSByNywgbHJ9CiAJCWNtcAlyMiwgIzQKIAkJYmx0CS5jMnVfbm90X2Vub3VnaAotCVBMRCgJcGxkCVtyMSwgIzBdCQkpCi0JUExEKAlwbGQJW3IwLCAjMF0JCSkKIAkJYW5kcwlpcCwgcjAsICMzCiAJCWJuZQkuYzJ1X2Rlc3Rfbm90X2FsaWduZWQKIC5jMnVfZGVzdF9hbGlnbmVkOgpAQCAtNzMsMjUgKzcxLDEzIEBACiAJCXN1YglyMiwgcjIsIGlwCiAJCXN1YnMJaXAsIGlwLCAjMzIKIAkJYmx0CS5jMnVfMHJlbThscAotCVBMRCgJcGxkCVtyMSwgIzI4XQkJKQotCVBMRCgJcGxkCVtyMCwgIzI4XQkJKQotCVBMRCgJc3VicwlpcCwgaXAsICM2NAkJCSkKLQlQTEQoCWJsdAkuYzJ1XzBjcHlub3BsZAkJKQotCVBMRCgJcGxkCVtyMSwgIzYwXQkJKQotCVBMRCgJcGxkCVtyMCwgIzYwXQkJKQogCi0uYzJ1XzBjcHk4bHA6Ci0JUExEKAlwbGQJW3IxLCAjOTJdCQkpCi0JUExEKAlwbGQJW3IwLCAjOTJdCQkpCi0uYzJ1XzBjcHlub3BsZDoJbGRtaWEJcjEhLCB7cjMgLSByNn0KKy5jMnVfMGNweThscDoJbGRtaWEJcjEhLCB7cjMgLSByNn0KIAkJc3RtaWEJcjAhLCB7cjMgLSByNn0JCQlAIFNob3VsZG50IGZhdWx0CiAJCWxkbWlhCXIxISwge3IzIC0gcjZ9CiAJCXN1YnMJaXAsIGlwLCAjMzIKIAkJc3RtaWEJcjAhLCB7cjMgLSByNn0JCQlAIFNob3VsZG50IGZhdWx0CiAJCWJwbAkuYzJ1XzBjcHk4bHAKLQlQTEQoCWNtbglpcCwgIzY0CQkJKQotCVBMRCgJYmdlCS5jMnVfMGNweW5vcGxkCQkpCi0JUExEKAlhZGQJaXAsIGlwLCAjNjQJCSkKIAogLmMydV8wcmVtOGxwOgljbW4JaXAsICMxNgogCQlsZG1nZWlhCXIxISwge3IzIC0gcjZ9CkBAIC0xNDMsMTcgKzEyOSw4IEBACiAJCXN1YglyMiwgcjIsIGlwCiAJCXN1YnMJaXAsIGlwLCAjMTYKIAkJYmx0CS5jMnVfMXJlbThscAotCVBMRCgJcGxkCVtyMSwgIzEyXQkJKQotCVBMRCgJcGxkCVtyMCwgIzEyXQkJKQotCVBMRCgJc3VicwlpcCwgaXAsICMzMgkJKQotCVBMRCgJYmx0CS5jMnVfMWNweW5vcGxkCQkpCi0JUExEKAlwbGQJW3IxLCAjMjhdCQkpCi0JUExEKAlwbGQJW3IwLCAjMjhdCQkpCiAKLS5jMnVfMWNweThscDoKLQlQTEQoCXBsZAlbcjEsICM0NF0JCSkKLQlQTEQoCXBsZAlbcjAsICM0NF0JCSkKLS5jMnVfMWNweW5vcGxkOgltb3YJcjMsIHI3LCBwdWxsICM4CisuYzJ1XzFjcHk4bHA6CW1vdglyMywgcjcsIHB1bGwgIzgKIAkJbGRtaWEJcjEhLCB7cjQgLSByN30KIAkJc3VicwlpcCwgaXAsICMxNgogCQlvcnIJcjMsIHIzLCByNCwgcHVzaCAjMjQKQEAgLTE2NSw5ICsxNDIsNiBAQAogCQlvcnIJcjYsIHI2LCByNywgcHVzaCAjMjQKIAkJc3RtaWEJcjAhLCB7cjMgLSByNn0JCQlAIFNob3VsZG50IGZhdWx0CiAJCWJwbAkuYzJ1XzFjcHk4bHAKLQlQTEQoCWNtbglpcCwgIzMyCQkJKQotCVBMRCgJYmdlCS5jMnVfMWNweW5vcGxkCQkpCi0JUExEKAlhZGQJaXAsIGlwLCAjMzIJCSkKIAogLmMydV8xcmVtOGxwOgl0c3QJaXAsICM4CiAJCW1vdm5lCXIzLCByNywgcHVsbCAjOApAQCAtMjEwLDE3ICsxODQsOCBAQAogCQlzdWIJcjIsIHIyLCBpcAogCQlzdWJzCWlwLCBpcCwgIzE2CiAJCWJsdAkuYzJ1XzJyZW04bHAKLQlQTEQoCXBsZAlbcjEsICMxMl0JCSkKLQlQTEQoCXBsZAlbcjAsICMxMl0JCSkKLQlQTEQoCXN1YnMJaXAsIGlwLCAjMzIJCSkKLQlQTEQoCWJsdAkuYzJ1XzJjcHlub3BsZAkJKQotCVBMRCgJcGxkCVtyMSwgIzI4XQkJKQotCVBMRCgJcGxkCVtyMCwgIzI4XQkJKQogCi0uYzJ1XzJjcHk4bHA6Ci0JUExEKAlwbGQJW3IxLCAjNDRdCQkpCi0JUExEKAlwbGQJW3IwLCAjNDRdCQkpCi0uYzJ1XzJjcHlub3BsZDoJbW92CXIzLCByNywgcHVsbCAjMTYKKy5jMnVfMmNweThscDoJbW92CXIzLCByNywgcHVsbCAjMTYKIAkJbGRtaWEJcjEhLCB7cjQgLSByN30KIAkJc3VicwlpcCwgaXAsICMxNgogCQlvcnIJcjMsIHIzLCByNCwgcHVzaCAjMTYKQEAgLTIzMiw5ICsxOTcsNiBAQAogCQlvcnIJcjYsIHI2LCByNywgcHVzaCAjMTYKIAkJc3RtaWEJcjAhLCB7cjMgLSByNn0JCQlAIFNob3VsZG50IGZhdWx0CiAJCWJwbAkuYzJ1XzJjcHk4bHAKLQlQTEQoCWNtbglpcCwgIzMyCQkJKQotCVBMRCgJYmdlCS5jMnVfMmNweW5vcGxkCQkpCi0JUExEKAlhZGQJaXAsIGlwLCAjMzIJCSkKIAogLmMydV8ycmVtOGxwOgl0c3QJaXAsICM4CiAJCW1vdm5lCXIzLCByNywgcHVsbCAjMTYKQEAgLTI3NywxNyArMjM5LDggQEAKIAkJc3ViCXIyLCByMiwgaXAKIAkJc3VicwlpcCwgaXAsICMxNgogCQlibHQJLmMydV8zcmVtOGxwCi0JUExEKAlwbGQJW3IxLCAjMTJdCQkpCi0JUExEKAlwbGQJW3IwLCAjMTJdCQkpCi0JUExEKAlzdWJzCWlwLCBpcCwgIzMyCQkpCi0JUExEKAlibHQJLmMydV8zY3B5bm9wbGQJCSkKLQlQTEQoCXBsZAlbcjEsICMyOF0JCSkKLQlQTEQoCXBsZAlbcjAsICMyOF0JCSkKIAotLmMydV8zY3B5OGxwOgotCVBMRCgJcGxkCVtyMSwgIzQ0XQkJKQotCVBMRCgJcGxkCVtyMCwgIzQ0XQkJKQotLmMydV8zY3B5bm9wbGQ6CW1vdglyMywgcjcsIHB1bGwgIzI0CisuYzJ1XzNjcHk4bHA6CW1vdglyMywgcjcsIHB1bGwgIzI0CiAJCWxkbWlhCXIxISwge3I0IC0gcjd9CiAJCXN1YnMJaXAsIGlwLCAjMTYKIAkJb3JyCXIzLCByMywgcjQsIHB1c2ggIzgKQEAgLTI5OSw5ICsyNTIsNiBAQAogCQlvcnIJcjYsIHI2LCByNywgcHVzaCAjOAogCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQkJCUAgU2hvdWxkbnQgZmF1bHQKIAkJYnBsCS5jMnVfM2NweThscAotCVBMRCgJY21uCWlwLCAjMzIJCQkpCi0JUExEKAliZ2UJLmMydV8zY3B5bm9wbGQJCSkKLQlQTEQoCWFkZAlpcCwgaXAsICMzMgkJKQogCiAuYzJ1XzNyZW04bHA6CXRzdAlpcCwgIzgKIAkJbW92bmUJcjMsIHI3LCBwdWxsICMyNApAQCAtMzU2LDggKzMwNiw2IEBACiAJCXN0bWZkCXNwISwge3IwLCByMiwgcjQgLSByNywgbHJ9CiAJCWNtcAlyMiwgIzQKIAkJYmx0CS5jZnVfbm90X2Vub3VnaAotCVBMRCgJcGxkCVtyMSwgIzBdCQkpCi0JUExEKAlwbGQJW3IwLCAjMF0JCSkKIAkJYW5kcwlpcCwgcjAsICMzCiAJCWJuZQkuY2Z1X2Rlc3Rfbm90X2FsaWduZWQKIC5jZnVfZGVzdF9hbGlnbmVkOgpAQCAtMzg1LDI1ICszMzMsMTMgQEAKIAkJc3ViCXIyLCByMiwgaXAKIAkJc3VicwlpcCwgaXAsICMzMgogCQlibHQJLmNmdV8wcmVtOGxwCi0JUExEKAlwbGQJW3IxLCAjMjhdCQkpCi0JUExEKAlwbGQJW3IwLCAjMjhdCQkpCi0JUExEKAlzdWJzCWlwLCBpcCwgIzY0CQkJKQotCVBMRCgJYmx0CS5jZnVfMGNweW5vcGxkCQkpCi0JUExEKAlwbGQJW3IxLCAjNjBdCQkpCi0JUExEKAlwbGQJW3IwLCAjNjBdCQkpCiAKLS5jZnVfMGNweThscDoKLQlQTEQoCXBsZAlbcjEsICM5Ml0JCSkKLQlQTEQoCXBsZAlbcjAsICM5Ml0JCSkKLS5jZnVfMGNweW5vcGxkOglsZG1pYQlyMSEsIHtyMyAtIHI2fQkJCUAgU2hvdWxkbnQgZmF1bHQKKy5jZnVfMGNweThscDoJbGRtaWEJcjEhLCB7cjMgLSByNn0JCQlAIFNob3VsZG50IGZhdWx0CiAJCXN0bWlhCXIwISwge3IzIC0gcjZ9CiAJCWxkbWlhCXIxISwge3IzIC0gcjZ9CQkJQCBTaG91bGRudCBmYXVsdAogCQlzdWJzCWlwLCBpcCwgIzMyCiAJCXN0bWlhCXIwISwge3IzIC0gcjZ9CiAJCWJwbAkuY2Z1XzBjcHk4bHAKLQlQTEQoCWNtbglpcCwgIzY0CQkJKQotCVBMRCgJYmdlCS5jZnVfMGNweW5vcGxkCQkpCi0JUExEKAlhZGQJaXAsIGlwLCAjNjQJCSkKIAogLmNmdV8wcmVtOGxwOgljbW4JaXAsICMxNgogCQlsZG1nZWlhCXIxISwge3IzIC0gcjZ9CQkJQCBTaG91bGRudCBmYXVsdApAQCAtNDU2LDE3ICszOTIsOCBAQAogCQlzdWIJcjIsIHIyLCBpcAogCQlzdWJzCWlwLCBpcCwgIzE2CiAJCWJsdAkuY2Z1XzFyZW04bHAKLQlQTEQoCXBsZAlbcjEsICMxMl0JCSkKLQlQTEQoCXBsZAlbcjAsICMxMl0JCSkKLQlQTEQoCXN1YnMJaXAsIGlwLCAjMzIJCSkKLQlQTEQoCWJsdAkuY2Z1XzFjcHlub3BsZAkJKQotCVBMRCgJcGxkCVtyMSwgIzI4XQkJKQotCVBMRCgJcGxkCVtyMCwgIzI4XQkJKQogCi0uY2Z1XzFjcHk4bHA6Ci0JUExEKAlwbGQJW3IxLCAjNDRdCQkpCi0JUExEKAlwbGQJW3IwLCAjNDRdCQkpCi0uY2Z1XzFjcHlub3BsZDoJbW92CXIzLCByNywgcHVsbCAjOAorLmNmdV8xY3B5OGxwOgltb3YJcjMsIHI3LCBwdWxsICM4CiAJCWxkbWlhCXIxISwge3I0IC0gcjd9CQkJQCBTaG91bGRudCBmYXVsdAogCQlzdWJzCWlwLCBpcCwgIzE2CiAJCW9ycglyMywgcjMsIHI0LCBwdXNoICMyNApAQCAtNDc4LDkgKzQwNSw2IEBACiAJCW9ycglyNiwgcjYsIHI3LCBwdXNoICMyNAogCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQogCQlicGwJLmNmdV8xY3B5OGxwCi0JUExEKAljbW4JaXAsICMzMgkJCSkKLQlQTEQoCWJnZQkuY2Z1XzFjcHlub3BsZAkJKQotCVBMRCgJYWRkCWlwLCBpcCwgIzMyCQkpCiAKIC5jZnVfMXJlbThscDoJdHN0CWlwLCAjOAogCQltb3ZuZQlyMywgcjcsIHB1bGwgIzgKQEAgLTUyMywxNyArNDQ3LDggQEAKIAkJc3ViCXIyLCByMiwgaXAKIAkJc3VicwlpcCwgaXAsICMxNgogCQlibHQJLmNmdV8ycmVtOGxwCi0JUExEKAlwbGQJW3IxLCAjMTJdCQkpCi0JUExEKAlwbGQJW3IwLCAjMTJdCQkpCi0JUExEKAlzdWJzCWlwLCBpcCwgIzMyCQkpCi0JUExEKAlibHQJLmNmdV8yY3B5bm9wbGQJCSkKLQlQTEQoCXBsZAlbcjEsICMyOF0JCSkKLQlQTEQoCXBsZAlbcjAsICMyOF0JCSkKIAotLmNmdV8yY3B5OGxwOgotCVBMRCgJcGxkCVtyMSwgIzQ0XQkJKQotCVBMRCgJcGxkCVtyMCwgIzQ0XQkJKQotLmNmdV8yY3B5bm9wbGQ6CW1vdglyMywgcjcsIHB1bGwgIzE2CisuY2Z1XzJjcHk4bHA6CW1vdglyMywgcjcsIHB1bGwgIzE2CiAJCWxkbWlhCXIxISwge3I0IC0gcjd9CQkJQCBTaG91bGRudCBmYXVsdAogCQlzdWJzCWlwLCBpcCwgIzE2CiAJCW9ycglyMywgcjMsIHI0LCBwdXNoICMxNgpAQCAtNTQ1LDkgKzQ2MCw2IEBACiAJCW9ycglyNiwgcjYsIHI3LCBwdXNoICMxNgogCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQogCQlicGwJLmNmdV8yY3B5OGxwCi0JUExEKAljbW4JaXAsICMzMgkJCSkKLQlQTEQoCWJnZQkuY2Z1XzJjcHlub3BsZAkJKQotCVBMRCgJYWRkCWlwLCBpcCwgIzMyCQkpCiAKIC5jZnVfMnJlbThscDoJdHN0CWlwLCAjOAogCQltb3ZuZQlyMywgcjcsIHB1bGwgIzE2CkBAIC01OTAsMTcgKzUwMiw4IEBACiAJCXN1YglyMiwgcjIsIGlwCiAJCXN1YnMJaXAsIGlwLCAjMTYKIAkJYmx0CS5jZnVfM3JlbThscAotCVBMRCgJcGxkCVtyMSwgIzEyXQkJKQotCVBMRCgJcGxkCVtyMCwgIzEyXQkJKQotCVBMRCgJc3VicwlpcCwgaXAsICMzMgkJKQotCVBMRCgJYmx0CS5jZnVfM2NweW5vcGxkCQkpCi0JUExEKAlwbGQJW3IxLCAjMjhdCQkpCi0JUExEKAlwbGQJW3IwLCAjMjhdCQkpCiAKLS5jZnVfM2NweThscDoKLQlQTEQoCXBsZAlbcjEsICM0NF0JCSkKLQlQTEQoCXBsZAlbcjAsICM0NF0JCSkKLS5jZnVfM2NweW5vcGxkOgltb3YJcjMsIHI3LCBwdWxsICMyNAorLmNmdV8zY3B5OGxwOgltb3YJcjMsIHI3LCBwdWxsICMyNAogCQlsZG1pYQlyMSEsIHtyNCAtIHI3fQkJCUAgU2hvdWxkbnQgZmF1bHQKIAkJb3JyCXIzLCByMywgcjQsIHB1c2ggIzgKIAkJbW92CXI0LCByNCwgcHVsbCAjMjQKQEAgLTYxMiw5ICs1MTUsNiBAQAogCQlzdG1pYQlyMCEsIHtyMyAtIHI2fQogCQlzdWJzCWlwLCBpcCwgIzE2CiAJCWJwbAkuY2Z1XzNjcHk4bHAKLQlQTEQoCWNtbglpcCwgIzMyCQkJKQotCVBMRCgJYmdlCS5jZnVfM2NweW5vcGxkCQkpCi0JUExEKAlhZGQJaXAsIGlwLCAjMzIJCSkKIAogLmNmdV8zcmVtOGxwOgl0c3QJaXAsICM4CiAJCW1vdm5lCXIzLCByNywgcHVsbCAjMjQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvS2NvbmZpZwppbmRleCBkNWMxNTUwLi4wNzkzZGNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9LY29uZmlnCkBAIC02OSwxNyArNjksNiBAQAogCiAJICBZb3UgYWxtb3N0IHN1cmVseSB3YW50IHRvIHNheSBOIGhlcmUuCiAKLWNvbmZpZyBNQUNIX01QMTAwMAotCWJvb2wgIk1BQ0hfTVAxMDAwIgotCWhlbHAKLQkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoZSBrZXJuZWwgb24gdGhlIENvbWRpYWwgTVAxMDAwIHBsYXRmb3JtLgotCi1jb25maWcgTVAxMDAwXzkwTUhaCi0JYm9vbCAiTVAxMDAwXzkwTUhaIgotCWRlcGVuZHMgb24gTUFDSF9NUDEwMDAKLQloZWxwCi0JICBTYXkgWSBpZiB5b3UgaGF2ZSB0aGUgTVAxMDAwIGNvbmZpZ3VyZWQgdG8gYmUgc2V0IGF0IDkwTUhaIHJhdGhlciB0aGFuIDc0TUhaCi0KIGVuZG1lbnUKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L01ha2VmaWxlCmluZGV4IDhhNmRjMWMuLjRhMTk3MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9NYWtlZmlsZQpAQCAtMTUsNyArMTUsNiBAQAogb2JqLSQoQ09ORklHX0FSQ0hfQ0xFUDczMTIpICs9IGNsZXA3MzEyLm8KIG9iai0kKENPTkZJR19BUkNIX0VEQjcyMTEpICArPSBlZGI3MjExLWFyY2gubyBlZGI3MjExLW1tLm8KIG9iai0kKENPTkZJR19BUkNIX0ZPUlRVTkVUKSArPSBmb3J0dW5ldC5vCi1vYmotJChDT05GSUdfTUFDSF9NUDEwMDApICAgKz0gbXAxMDAwLW1hY2gubyBtcDEwMDAtbW0ubyBtcDEwMDAtc2Vwcm9tLm8KIG9iai0kKENPTkZJR19BUkNIX1A3MjBUKSAgICArPSBwNzIwdC5vCiBsZWRzLSQoQ09ORklHX0FSQ0hfUDcyMFQpICAgKz0gcDcyMHQtbGVkcy5vCiBvYmotJChDT05GSUdfTEVEUykgICAgICAgICAgKz0gJChsZWRzLXkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtbW0uYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCmluZGV4IDcyZjhiYjAuLjBkNTJlMDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCkBAIC01NSwyMiArNTUsMjIgQEAKIAkgCS52aXJ0dWFsIAk9IEVQNzIxMV9WSVJUX0VYVEtCRCwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVQNzIxMV9QSFlTX0VYVEtCRCksCiAJCS5sZW5ndGgJCT0gU1pfMU0sCi0JCS50eXBlCQktIE1UX0RFVklDRQorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwgewkvKiBhbmQgQ1M4OTAwQSBFdGhlcm5ldCBjaGlwICovCiAJCS52aXJ0dWFsCT0gRVA3MjExX1ZJUlRfQ1M4OTAwQSwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVQNzIxMV9QSFlTX0NTODkwMEEpLAogCQkubGVuZ3RoCQk9IFNaXzFNLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sIHsgCS8qIGZsYXNoIGJhbmtzICovCiAJCS52aXJ0dWFsCT0gRVA3MjExX1ZJUlRfRkxBU0gxLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVA3MjExX1BIWVNfRkxBU0gxKSwKIAkJLmxlbmd0aAkJPSBTWl84TSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFCisJCS50eXBlCQk9IE1UX0RFVklDRSwKIAl9LCB7CiAJCS52aXJ0dWFsCT0gRVA3MjExX1ZJUlRfRkxBU0gyLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVA3MjExX1BIWVNfRkxBU0gyKSwKIAkJLmxlbmd0aAkJPSBTWl84TSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFCisJCS50eXBlCQk9IE1UX0RFVklDRSwKIAl9CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L21wMTAwMC1tYWNoLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L21wMTAwMC1tYWNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyODE2YmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9tcDEwMDAtbWFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLW1wMTAwMC9tcDEwMDAuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgQ29tZGlhbCBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvbXAxMDAwLXNlcHJvbS5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLWV4dGVybiB2b2lkIG1wMTAwMF9tYXBfaW8odm9pZCk7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBtcDEwMDBfaW5pdCh2b2lkKQotewotICAgIHNlcHJvbV9pbml0KCk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoTVAxMDAwLCAiQ29tZGlhbCBNUDEwMDAiKQotCS8qIE1haW50YWluZXI6IEpvbiBSaW5nbGUgKi8KLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAotCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKLQkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmYwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMJPSAweGMwMDE1MTAwLAotCS5tYXBfaW8JCT0gbXAxMDAwX21hcF9pbywKLQkuaW5pdF9pcnEJPSBjbHBzNzExeF9pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lCT0gbXAxMDAwX2luaXQsCi0JLnRpbWVyCQk9ICZjbHBzNzExeF90aW1lciwKLU1BQ0hJTkVfRU5ECi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvbXAxMDAwLW1tLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L21wMTAwMC1tbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGU4MTBiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvbXAxMDAwLW1tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtbXAxMDAwL21tLmMKLSAqCi0gKiAgRXh0cmEgTU0gcm91dGluZXMgZm9yIHRoZSBNUDEwMDAKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1IENvbWRpYWwgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3NpemVzLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotZXh0ZXJuIHZvaWQgY2xwczcxMXhfbWFwX2lvKHZvaWQpOwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG1wMTAwMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLSAgICB7IE1QMTAwMF9FSU9fQkFTRSwJTVAxMDAwX0VJT19TVEFSVCwJTVAxMDAwX0VJT19TSVpFLCBNVF9ERVZJQ0UgfSwKLSAgICB7IE1QMTAwMF9GSU9fQkFTRSwJTVAxMDAwX0ZJT19TVEFSVCwJTVAxMDAwX0ZJT19TSVpFLCBNVF9ERVZJQ0UgfSwKLSAgICB7IE1QMTAwMF9MSU9fQkFTRSwJTVAxMDAwX0xJT19TVEFSVCwJTVAxMDAwX0xJT19TSVpFLCBNVF9ERVZJQ0UgfSwKLSAgICB7IE1QMTAwMF9OSU9fQkFTRSwJTVAxMDAwX05JT19TVEFSVCwJTVAxMDAwX05JT19TSVpFLCBNVF9ERVZJQ0UgfSwKLSAgICB7IE1QMTAwMF9JREVfQkFTRSwJTVAxMDAwX0lERV9TVEFSVCwJTVAxMDAwX0lERV9TSVpFLCBNVF9ERVZJQ0UgfSwKLSAgICB7IE1QMTAwMF9EU1BfQkFTRSwJTVAxMDAwX0RTUF9TVEFSVCwJTVAxMDAwX0RTUF9TSVpFLCBNVF9ERVZJQ0UgfQotfTsKLQotdm9pZCBfX2luaXQgbXAxMDAwX21hcF9pbyh2b2lkKQotewotCWNscHM3MTF4X21hcF9pbygpOwotCWlvdGFibGVfaW5pdChtcDEwMDBfaW9fZGVzYywgQVJSQVlfU0laRShtcDEwMDBfaW9fZGVzYykpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9tcDEwMDAtc2Vwcm9tLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L21wMTAwMC1zZXByb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyZDBiZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L21wMTAwMC1zZXByb20uYworKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKmAKLSAqIG1wMTAwMC1zZXByb20uYwotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFNlcmlhbCBFRVBST00gY29kZSBmb3IgdGhlIE1QMTAwMCBib2FyZAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgQ29tZGlhbCBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xwczcxMTEuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tcDEwMDAtc2Vwcm9tLmg+Ci0KLS8qIElmIFNlcHJvbUluaXQoKSBjYW4gaW5pdGlhbGl6ZSBhbmQgY2hlY2tzdW0gdGhlIHNlcHJvbSBzdWNjZXNzZnVsbHksICovCi0vKiB0aGVuIGl0IHdpbGwgcG9pbnQgc2Vwcm9tX2RhdGFfcHRyIGF0IHRoZSBzaGFkb3cgY29weS4gICovCi0KLXN0YXRpYyBlZXByb21fc3RydWN0IHNlcHJvbV9kYXRhOwkJCS8qIHNoYWRvdyBjb3B5IG9mIHNlcHJvbSBjb250ZW50ICovCi0KLWVlcHJvbV9zdHJ1Y3QgKnNlcHJvbV9kYXRhX3B0ciA9IDA7CQkvKiAwID0+IG5vdCBpbml0aWFsaXplZCAqLwotCi0vKgotICogUG9ydCBEIEJpdCA1IGlzIENoaXAgU2VsZWN0IGZvciBFRVBST00KLSAqIFBvcnQgRSBCaXQgMCBpcyBJbnB1dCwgRGF0YSBvdXQgZnJvbSBFRVBST00KLSAqIFBvcnQgRSBCaXQgMSBpcyBPdXRwdXQsIERhdGEgaW4gdG8gRUVQUk9NCi0gKiBQb3J0IEUgQml0IDIgaXMgT3V0cHV0LCBDTEsgdG8gRUVQUk9NCi0gKi8KLQotc3RhdGljIGNoYXIgKnBvcnRfZF9wdHIgPSAoY2hhciAqKShDTFBTNzExMV9WSVJUX0JBU0UgKyBQRERSKTsKLXN0YXRpYyBjaGFyICpwb3J0X2VfcHRyID0gKGNoYXIgKikoQ0xQUzcxMTFfVklSVF9CQVNFICsgUEVEUik7Ci0KLSNkZWZpbmUgTk9fT0ZfU0hPUlRTCTY0CS8vIERldmljZSBpcyA2NCB4IDE2IGJpdHMKLSNkZWZpbmUgRU5BQkxFX1JXCTAKLSNkZWZpbmUgRElTQUJMRV9SVwkxCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0b2dnbGVfc2Vwcm9tX2Nsb2NrKHZvaWQpCi17Ci0JKnBvcnRfZV9wdHIgfD0gSHdQb3J0RVNlcHJvbUNMSzsKLQkqcG9ydF9lX3B0ciAmPSB+KEh3UG9ydEVTZXByb21DTEspOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VsZWN0X2VlcHJvbSh2b2lkKQotewotCSpwb3J0X2RfcHRyIHw9IEh3UG9ydERFRUNTOwotCSpwb3J0X2VfcHRyICY9IH4oSHdQb3J0RVNlcHJvbUNMSyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZXNlbGVjdF9lZXByb20odm9pZCkKLXsKLQkqcG9ydF9kX3B0ciAmPSB+KEh3UG9ydERFRUNTKTsKLQkqcG9ydF9lX3B0ciAmPSB+KEh3UG9ydEVTZXByb21ESW4pOwotfQotCi0vKgotICogR2V0U2Vwcm9tRGF0YVB0ciAtIHJldHVybnMgcG9pbnRlciB0byBzaGFkb3cgKFJBTSkgY29weSBvZiBzZXByb20KLSAqICAgICAgICAgICAgICAgICAgICBhbmQgcmV0dXJucyAwIGlmIHNlcHJvbSBpcyBub3QgaW5pdGlhbGl6ZWQgb3IKLSAqICAgICAgICAgICAgICAgICAgICBoYXMgYSBjaGVja3N1bSBlcnJvci4KLSAqLwotCi1lZXByb21fc3RydWN0KiBnZXRfc2Vwcm9tX3B0cih2b2lkKQotewotCXJldHVybiBzZXByb21fZGF0YV9wdHI7Ci19Ci0KLXVuc2lnbmVkIGNoYXIqIGdldF9lZXByb21fbWFjX2FkZHJlc3Modm9pZCkKLXsKLQlyZXR1cm4gc2Vwcm9tX2RhdGFfcHRyLT52YXJpYW50LmVwcm9tX3N0cnVjdC5tYWNfQWRkcmVzczsKLX0KLQotLyoKLSAqIFJlYWRTUHJvbSwgUGh5c2ljYWxseSByZWFkcyBkYXRhIGZyb20gdGhlIFNlcmlhbCBQUk9NCi0gKi8KLXN0YXRpYyB2b2lkIHJlYWRfc3Byb20oc2hvcnQgYWRkcmVzcywgaW50IGxlbmd0aCwgZWVwcm9tX3N0cnVjdCAqYnVmZmVyKQotewotCXNob3J0IGRhdGEgPSBDT01NQU5EX1JFQUQgfCAoYWRkcmVzcyAmIDB4M0YpOwotCXNob3J0IGJpdDsKLQlpbnQgaTsKLQotCXNlbGVjdF9lZXByb20oKTsKLQotCS8vIENsb2NrIGluIDkgYml0cyBvZiB0aGUgY29tbWFuZAotCWZvciAoaSA9IDAsIGJpdCA9IDB4MTAwOyBpIDwgOTsgaSsrLCBiaXQgPj49IDEpIHsKLQkJaWYgKGRhdGEgJiBiaXQpCi0JCQkqcG9ydF9lX3B0ciB8PSBId1BvcnRFU2Vwcm9tREluOwotCQllbHNlCi0JCQkqcG9ydF9lX3B0ciAmPSB+KEh3UG9ydEVTZXByb21ESW4pOwotCi0JCXRvZ2dsZV9zZXByb21fY2xvY2soKTsKLQl9Ci0KLQkvLwotCS8vIE5vdyByZWFkIG9uZSBvciBtb3JlIHNob3J0cyBvZiBkYXRhIGZyb20gdGhlIFNlcHJvbQotCS8vCi0Jd2hpbGUgKGxlbmd0aC0tID4gMCkgewotCQlkYXRhID0gMDsKLQotCQkvLyBSZWFkIDE2IGJpdHMgYXQgYSB0aW1lCi0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCQlkYXRhIDw8PSAxOwotCQkJdG9nZ2xlX3NlcHJvbV9jbG9jaygpOwotCQkJZGF0YSB8PSAqcG9ydF9lX3B0ciAmIEh3UG9ydEVTZXByb21ET3V0OwotCi0JCX0KLQotCQlidWZmZXItPnZhcmlhbnQuZXByb21fc2hvcnRfZGF0YVthZGRyZXNzKytdID0gZGF0YTsKLQl9Ci0KLQlkZXNlbGVjdF9lZXByb20oKTsKLQotCXJldHVybjsKLX0KLQotCi0KLS8qCi0gKiBSZWFkU2VyaWFsUFJPTQotICoKLSAqIElucHV0OiBQb2ludGVyIHRvIGFycmF5IG9mIDY0IHggMTYgQml0cwotICoKLSAqIE91dHB1dDogaWYgbm8gcHJvYmxlbSByZWFkaW5nIGRhdGEgaXMgZmlsbGVkIGluCi0gKi8KLXN0YXRpYyB2b2lkIHJlYWRfc2VyaWFsX3Byb20oZWVwcm9tX3N0cnVjdCAqZGF0YSkKLXsKLQlyZWFkX3Nwcm9tKDAsIDY0LCBkYXRhKTsKLX0KLQotCi0vLwotLy8gQ29tcHV0ZSBTZXJpYWwgRUVQUk9NIGNoZWNrc3VtCi0vLwotLy8gSW5wdXQ6IFBvaW50ZXIgdG8gc3RydWN0IHdpdGggRXByb20gZGF0YQotLy8KLS8vIE91dHB1dDogVGhlIGNvbXB1dGVkIEVwcm9tIGNoZWNrc3VtCi0vLwotc3RhdGljIHNob3J0IGNvbXB1dGVfc2Vwcm9tX2NoZWNrc3VtKGVlcHJvbV9zdHJ1Y3QgKmRhdGEpCi17Ci0Jc2hvcnQgY2hlY2tzdW0gPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDEyNjsgaSsrKSB7Ci0JCWNoZWNrc3VtICs9IChzaG9ydClkYXRhLT52YXJpYW50LmVwcm9tX2J5dGVfZGF0YVtpXTsKLQl9Ci0KLQlyZXR1cm4oKHNob3J0KSgweDU1NTUgLSAoY2hlY2tzdW0gJiAweEZGRkYpKSk7Ci19Ci0KLS8vCi0vLyBNYWtlIHN1cmUgdGhlIGRhdGEgcG9ydCBiaXRzIGZvciB0aGUgU0VQUk9NIGFyZSBjb3JyZWN0bHkgaW5pdGlhbGlzZWQKLS8vCi0KLXZvaWQgX19pbml0IHNlcHJvbV9pbml0KHZvaWQpCi17Ci0Jc2hvcnQgY2hlY2tzdW07Ci0KLQkvLyBJbml0IFBvcnQgRAotCSooY2hhciAqKShDTFBTNzExMV9WSVJUX0JBU0UgKyBQREREUikgPSAweDA7Ci0JKihjaGFyICopKENMUFM3MTExX1ZJUlRfQkFTRSArIFBERFIpID0gMHgxNTsKLQotCS8vIEluaXQgUG9ydCBFCi0JKihpbnQgKikoQ0xQUzcxMTFfVklSVF9CQVNFICsgUEVERFIpID0gMHgwNjsKLQkqKGludCAqKShDTFBTNzExMV9WSVJUX0JBU0UgKyBQRURSKSA9IDB4MDQ7Ci0KLQkvLwotCS8vIE1ha2Ugc3VyZSB0aGF0IEVFUFJPTSBzdHJ1Y3Qgc2l6ZSBuZXZlciBleGNlZWRzIDEyOCBieXRlcwotCS8vCi0JaWYgKHNpemVvZihlZXByb21fc3RydWN0KSA+IDEyOCkgewotCQlwYW5pYygiU2VyaWFsIFBST00gc3RydWN0IHNpemUgPiAxMjgsIGFib3J0aW5nIHJlYWRcbiIpOwotCX0KLQotCXJlYWRfc2VyaWFsX3Byb20oJnNlcHJvbV9kYXRhKTsKLQotCWNoZWNrc3VtID0gY29tcHV0ZV9zZXByb21fY2hlY2tzdW0oJnNlcHJvbV9kYXRhKTsKLQotCWlmIChjaGVja3N1bSAhPSBzZXByb21fZGF0YS52YXJpYW50LmVwcm9tX3Nob3J0X2RhdGFbNjNdKSB7Ci0JCXBhbmljKCJTZXJpYWwgRUVQUk9NIGNoZWNrc3VtIGZhaWxlZFxuIik7Ci0JfQotCi0Jc2Vwcm9tX2RhdGFfcHRyID0gJnNlcHJvbV9kYXRhOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYwppbmRleCBjOTNhOThiLi5kZjE0MDk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKQEAgLTQwMiw2ICs0MDIsNDAgQEAKIAkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9QQ0lfWFNDQUxFX0lOVF9FTkFCTEUsICh0ZW1wIHwgKDEgPDwgMjcpKSk7CiB9CiAKKy8qCisgKiBFcnJvciBpbnRlcnJ1cHRzLiBUaGVzZSBhcmUgdXNlZCBleHRlbnNpdmVseSBieSB0aGUgbWljcm9lbmdpbmUgZHJpdmVycworICovCitzdGF0aWMgdm9pZCBpeHAyMDAwX2Vycl9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gKklYUDIwMDBfSVJRX0VSUl9TVEFUVVM7CisKKwlmb3IoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpZihzdGF0dXMgJiAoMSA8PCBpKSkgeworCQkJZGVzYyA9IGlycV9kZXNjICsgSVJRX0lYUDIwMDBfRFJBTTBfTUlOX0VSUiArIGk7CisJCQlkZXNjLT5oYW5kbGUoSVJRX0lYUDIwMDBfRFJBTTBfTUlOX0VSUiArIGksIGRlc2MsIHJlZ3MpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpeHAyMDAwX2Vycl9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfSVJRX0VSUl9FTkFCTEVfQ0xSLAorCQkJKDEgPDwgKGlycSAtIElSUV9JWFAyMDAwX0RSQU0wX01JTl9FUlIpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGl4cDIwMDBfZXJyX2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0lSUV9FUlJfRU5BQkxFX1NFVCwKKwkJCSgxIDw8IChpcnEgLSBJUlFfSVhQMjAwMF9EUkFNMF9NSU5fRVJSKSkpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgaXhwMjAwMF9lcnJfaXJxX2NoaXAgPSB7CisJLmFjawk9IGl4cDIwMDBfZXJyX2lycV9tYXNrLAorCS5tYXNrCT0gaXhwMjAwMF9lcnJfaXJxX21hc2ssCisJLnVubWFzawk9IGl4cDIwMDBfZXJyX2lycV91bm1hc2sKK307CisKIHN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHAyMDAwX3BjaV9pcnFfY2hpcCA9IHsKIAkuYWNrCT0gaXhwMjAwMF9wY2lfaXJxX21hc2ssCiAJLm1hc2sJPSBpeHAyMDAwX3BjaV9pcnFfbWFzaywKQEAgLTQ1OSw2ICs0OTMsMTggQEAKIAkJfSBlbHNlIHNldF9pcnFfZmxhZ3MoaXJxLCAwKTsKIAl9CiAKKwlmb3IgKGlycSA9IElSUV9JWFAyMDAwX0RSQU0wX01JTl9FUlI7IGlycSA8PSBJUlFfSVhQMjAwMF9TUF9JTlQ7IGlycSsrKSB7CisJCWlmKCgxIDw8IChpcnEgLSBJUlFfSVhQMjAwMF9EUkFNMF9NSU5fRVJSKSkgJgorCQkJCUlYUDIwMDBfVkFMSURfRVJSX0lSUV9NQVNLKSB7CisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhwMjAwMF9lcnJfaXJxX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKKwkJfQorCQllbHNlCisJCQlzZXRfaXJxX2ZsYWdzKGlycSwgMCk7CisJfQorCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9JWFAyMDAwX0VSUlNVTSwgaXhwMjAwMF9lcnJfaXJxX2hhbmRsZXIpOworCiAJLyoKIAkgKiBHUElPIElSUXMgYXJlIGludmFsaWQgdW50aWwgc29tZW9uZSBzZXRzIHRoZSBpbnRlcnJ1cHQgbW9kZQogCSAqIGJ5IGNhbGxpbmcgc2V0X2lycV90eXBlKCkuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwppbmRleCA3NzE5YzQ3Li42MWY2MDA2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKQEAgLTY5LDE5ICs2OSwxOSBAQAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBlbnAyNjExX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogCXsKIAkJLnZpcnR1YWwJPSBFTlAyNjExX0NBTEVCX1ZJUlRfQkFTRSwKLQkJLnBoeXNpY2FsCT0gRU5QMjYxMV9DQUxFQl9QSFlTX0JBU0UsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFTlAyNjExX0NBTEVCX1BIWVNfQkFTRSksCiAJCS5sZW5ndGgJCT0gRU5QMjYxMV9DQUxFQl9TSVpFLAotCQkudHlwZQkJPSBNVF9JWFAyMDAwX0RFVklDRQorCQkudHlwZQkJPSBNVF9JWFAyMDAwX0RFVklDRSwKIAl9LCB7CiAJCS52aXJ0dWFsCT0gRU5QMjYxMV9QTTMzODZfMF9WSVJUX0JBU0UsCi0JCS5waHlzaWNhbAk9IEVOUDI2MTFfUE0zMzg2XzBfUEhZU19CQVNFLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRU5QMjYxMV9QTTMzODZfMF9QSFlTX0JBU0UpLAogCQkubGVuZ3RoCQk9IEVOUDI2MTFfUE0zMzg2XzBfU0laRSwKLQkJLnR5cGUJCT0gTVRfSVhQMjAwMF9ERVZJQ0UKKwkJLnR5cGUJCT0gTVRfSVhQMjAwMF9ERVZJQ0UsCiAJfSwgewogCQkudmlydHVhbAk9IEVOUDI2MTFfUE0zMzg2XzFfVklSVF9CQVNFLAotCQkucGh5c2ljYWwJPSBFTlAyNjExX1BNMzM4Nl8xX1BIWVNfQkFTRSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVOUDI2MTFfUE0zMzg2XzFfUEhZU19CQVNFKSwKIAkJLmxlbmd0aAkJPSBFTlAyNjExX1BNMzM4Nl8xX1NJWkUsCi0JCS50eXBlCQk9IE1UX0lYUDIwMDBfREVWSUNFCisJCS50eXBlCQk9IE1UX0lYUDIwMDBfREVWSUNFLAogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYyBiL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYwppbmRleCA5YzZlNzdmLi5iNDY0YmM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCkBAIC0xOSwxNiArMTksMjAgQEAKICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KIApAQCAtMTk5LDEwICsyMDMsNzUgQEAKIAkucmVzb3VyY2UJPSBzbWM5MXhfcmVzb3VyY2VzLAogfTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmbGFzaF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IDB4MDAwMDAwMDAsCisJCS5lbmQJPSBTWl82NE0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMHgwNDAwMDAwMCwKKwkJLmVuZAk9IDB4MDQwMDAwMDAgKyBTWl82NE0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGx1YmJvY2tfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUgPQkJIkJvb3Rsb2FkZXIiLAorCQkuc2l6ZSA9CQkweDAwMDQwMDAwLAorCQkub2Zmc2V0ID0JMCwKKwkJLm1hc2tfZmxhZ3MgPQlNVERfV1JJVEVBQkxFICAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LHsKKwkJLm5hbWUgPQkJIktlcm5lbCIsCisJCS5zaXplID0JCTB4MDAxMDAwMDAsCisJCS5vZmZzZXQgPQkweDAwMDQwMDAwLAorCX0seworCQkubmFtZSA9CQkiRmlsZXN5c3RlbSIsCisJCS5zaXplID0JCU1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQgPQkweDAwMTQwMDAwCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGx1YmJvY2tfZmxhc2hfZGF0YVsyXSA9IHsKKwl7CisJCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCQkucGFydHMJCT0gbHViYm9ja19wYXJ0aXRpb25zLAorCQkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGx1YmJvY2tfcGFydGl0aW9ucyksCisJfSwgeworCQkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkJLnBhcnRzCQk9IE5VTEwsCisJCS5ucl9wYXJ0cwk9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbHViYm9ja19mbGFzaF9kZXZpY2VbMl0gPSB7CisJeworCQkubmFtZQkJPSAicHhhMnh4LWZsYXNoIiwKKwkJLmlkCQk9IDAsCisJCS5kZXYgPSB7CisJCQkucGxhdGZvcm1fZGF0YSA9ICZsdWJib2NrX2ZsYXNoX2RhdGFbMF0sCisJCX0sCisJCS5yZXNvdXJjZSA9ICZmbGFzaF9yZXNvdXJjZXNbMF0sCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUJCT0gInB4YTJ4eC1mbGFzaCIsCisJCS5pZAkJPSAxLAorCQkuZGV2ID0geworCQkJLnBsYXRmb3JtX2RhdGEgPSAmbHViYm9ja19mbGFzaF9kYXRhWzFdLAorCQl9LAorCQkucmVzb3VyY2UgPSAmZmxhc2hfcmVzb3VyY2VzWzFdLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmc2ExMTExX2RldmljZSwKIAkmbHViX2F1ZGlvX2RldmljZSwKIAkmc21jOTF4X2RldmljZSwKKwkmbHViYm9ja19mbGFzaF9kZXZpY2VbMF0sCisJJmx1YmJvY2tfZmxhc2hfZGV2aWNlWzFdLAogfTsKIAogc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gc2hhcnBfbG04djMxIF9faW5pdGRhdGEgPSB7CkBAIC0zMTUsMTAgKzM4NCwyMSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbHViYm9ja19pbml0KHZvaWQpCiB7CisJaW50IGZsYXNoYm9vdCA9IChMVUJfQ09ORl9TV0lUQ0hFUyAmIDEpOworCiAJcHhhX3NldF91ZGNfaW5mbygmdWRjX2luZm8pOwogCXNldF9weGFfZmJfaW5mbygmc2hhcnBfbG04djMxKTsKIAlweGFfc2V0X21jaV9pbmZvKCZsdWJib2NrX21jaV9wbGF0Zm9ybV9kYXRhKTsKIAlweGFfc2V0X2ZpY3BfaW5mbygmbHViYm9ja19maWNwX3BsYXRmb3JtX2RhdGEpOworCisJbHViYm9ja19mbGFzaF9kYXRhWzBdLndpZHRoID0gbHViYm9ja19mbGFzaF9kYXRhWzFdLndpZHRoID0KKwkJKEJPT1RfREVGICYgMSkgPyAyIDogNDsKKwkvKiBDb21wZW5zYXRlIGZvciB0aGUgblJPTUJUIHN3aXRjaCB3aGljaCBzd2FwcyB0aGUgZmxhc2ggYmFua3MgKi8KKwlwcmludGsoS0VSTl9OT1RJQ0UgIkx1YmJvY2sgY29uZmlndXJlZCB0byBib290IGZyb20gJXMgKGJhbmsgJWQpXG4iLAorCSAgICAgICBmbGFzaGJvb3Q/IkZsYXNoIjoiUk9NIiwgZmxhc2hib290KTsKKworCWx1YmJvY2tfZmxhc2hfZGF0YVtmbGFzaGJvb3ReMV0ubmFtZSA9ICJhcHBsaWNhdGlvbi1mbGFzaCI7CisJbHViYm9ja19mbGFzaF9kYXRhW2ZsYXNoYm9vdF0ubmFtZSA9ICJib290LXJvbSI7CiAJKHZvaWQpIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCmluZGV4IDg4N2E4Y2IuLjA3ODkyZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCkBAIC0yMCw2ICsyMCw5IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC0yNywxMCArMzAsMTIgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogCiAjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tYWluc3RvbmUuaD4KQEAgLTE5MCw2ICsxOTUsNjkgQEAKIAkuZGV2CQk9IHsgLnBsYXRmb3JtX2RhdGEgPSAmbXN0X2F1ZGlvX29wcyB9LAogfTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmbGFzaF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFBYQV9DUzBfUEhZUywKKwkJLmVuZAk9IFBYQV9DUzBfUEhZUyArIFNaXzY0TSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBQWEFfQ1MxX1BIWVMsCisJCS5lbmQJPSBQWEFfQ1MxX1BIWVMgKyBTWl82NE0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIG1haW5zdG9uZWZsYXNoMF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9CQkiQm9vdGxvYWRlciIsCisJCS5zaXplID0JCTB4MDAwNDAwMDAsCisJCS5vZmZzZXQgPQkwLAorCQkubWFza19mbGFncyA9CU1URF9XUklURUFCTEUgIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0seworCQkubmFtZSA9CQkiS2VybmVsIiwKKwkJLnNpemUgPQkJMHgwMDQwMDAwMCwKKwkJLm9mZnNldCA9CTB4MDAwNDAwMDAsCisJfSx7CisJCS5uYW1lID0JCSJGaWxlc3lzdGVtIiwKKwkJLnNpemUgPQkJTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldCA9CTB4MDA0NDAwMDAKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgbXN0X2ZsYXNoX2RhdGFbMl0gPSB7CisJeworCQkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkJLnBhcnRzCQk9IG1haW5zdG9uZWZsYXNoMF9wYXJ0aXRpb25zLAorCQkubnJfcGFydHMJPSBBUlJBWV9TSVpFKG1haW5zdG9uZWZsYXNoMF9wYXJ0aXRpb25zKSwKKwl9LCB7CisJCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCQkucGFydHMJCT0gTlVMTCwKKwkJLm5yX3BhcnRzCT0gMCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc3RfZmxhc2hfZGV2aWNlWzJdID0geworCXsKKwkJLm5hbWUJCT0gInB4YTJ4eC1mbGFzaCIsCisJCS5pZAkJPSAwLAorCQkuZGV2ID0geworCQkJLnBsYXRmb3JtX2RhdGEgPSAmbXN0X2ZsYXNoX2RhdGFbMF0sCisJCX0sCisJCS5yZXNvdXJjZSA9ICZmbGFzaF9yZXNvdXJjZXNbMF0sCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUJCT0gInB4YTJ4eC1mbGFzaCIsCisJCS5pZAkJPSAxLAorCQkuZGV2ID0geworCQkJLnBsYXRmb3JtX2RhdGEgPSAmbXN0X2ZsYXNoX2RhdGFbMV0sCisJCX0sCisJCS5yZXNvdXJjZSA9ICZmbGFzaF9yZXNvdXJjZXNbMV0sCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwl9LAorfTsKKwogc3RhdGljIHZvaWQgbWFpbnN0b25lX2JhY2tsaWdodF9wb3dlcihpbnQgb24pCiB7CiAJaWYgKG9uKSB7CkBAIC0zMTgsMTYgKzM4NiwzNCBAQAogCS50cmFuc2NlaXZlcl9tb2RlID0gbWFpbnN0b25lX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc21jOTF4X2RldmljZSwKKwkmbXN0X2F1ZGlvX2RldmljZSwKKwkmbXN0X2ZsYXNoX2RldmljZVswXSwKKwkmbXN0X2ZsYXNoX2RldmljZVsxXSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBtYWluc3RvbmVfaW5pdCh2b2lkKQogeworCWludCBTVzcgPSAwOyAgLyogRklYTUU6IGdldCBmcm9tIFNDUiAoTXN0IGRvYyBzZWN0aW9uIDMuMi4xLjEpICovCisKKwltc3RfZmxhc2hfZGF0YVswXS53aWR0aCA9IChCT09UX0RFRiAmIDEpID8gMiA6IDQ7CisJbXN0X2ZsYXNoX2RhdGFbMV0ud2lkdGggPSA0OworCisJLyogQ29tcGVuc2F0ZSBmb3IgU1c3IHdoaWNoIHN3YXBzIHRoZSBmbGFzaCBiYW5rcyAqLworCW1zdF9mbGFzaF9kYXRhW1NXN10ubmFtZSA9ICJwcm9jZXNzb3ItZmxhc2giOworCW1zdF9mbGFzaF9kYXRhW1NXNyBeIDFdLm5hbWUgPSAibWFpbmJvYXJkLWZsYXNoIjsKKworCXByaW50ayhLRVJOX05PVElDRSAiTWFpbnN0b25lIGNvbmZpZ3VyZWQgdG8gYm9vdCBmcm9tICVzXG4iLAorCSAgICAgICBtc3RfZmxhc2hfZGF0YVswXS5uYW1lKTsKKwogCS8qCiAJICogT24gTWFpbnN0b25lLCB3ZSByb3V0ZSBBQzk3X1NZU0NMSyB2aWEgR1BJTzQ1IHRvCiAJICogdGhlIGF1ZGlvIGRhdWdodGVyIGNhcmQKIAkgKi8KIAlweGFfZ3Bpb19tb2RlKEdQSU80NV9TWVNDTEtfQUM5N19NRCk7CiAKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbXN0X2F1ZGlvX2RldmljZSk7CisJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7CiAKIAkvKiByZWFkaW5nIE1haW5zdG9uZSdzICJWaXJ0dWFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIiCiAJICAgbWlnaHQgYmUgaGFuZHkgdG8gc2VsZWN0IExDRCB0eXBlIGhlcmUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IDU1Njg0MDMuLmUzYzE0ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtMjUwLDYgKzI1MCwxOCBAQAogCXNlbGVjdCBDUFVfQ09QWV9WNgogCXNlbGVjdCBDUFVfVExCX1Y2CiAKKyMgQVJNdjZrCitjb25maWcgQ1BVXzMydjZLCisJYm9vbCAiU3VwcG9ydCBBUk0gVjZLIHByb2Nlc3NvciBleHRlbnNpb25zIiBpZiAhU01QCisJZGVwZW5kcyBvbiBDUFVfVjYKKwlkZWZhdWx0IHkgaWYgU01QCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3VyIEFSTXY2IHByb2Nlc3NvciBzdXBwb3J0cyB0aGUgJ0snIGV4dGVuc2lvbi4KKwkgIFRoaXMgZW5hYmxlcyB0aGUga2VybmVsIHRvIHVzZSBzb21lIGluc3RydWN0aW9ucyBub3QgcHJlc2VudAorCSAgb24gcHJldmlvdXMgcHJvY2Vzc29ycywgYW5kIGFzIHN1Y2ggYSBrZXJuZWwgYnVpbGQgd2l0aCB0aGlzCisJICBlbmFibGVkIHdpbGwgbm90IGJvb3Qgb24gcHJvY2Vzc29ycyB3aXRoIGRvIG5vdCBzdXBwb3J0IHRoZXNlCisJICBpbnN0cnVjdGlvbnMuCisKICMgRmlndXJlIG91dCB3aGF0IHByb2Nlc3NvciBhcmNoaXRlY3R1cmUgdmVyc2lvbiB3ZSBzaG91bGQgYmUgdXNpbmcuCiAjIFRoaXMgZGVmaW5lcyB0aGUgY29tcGlsZXIgaW5zdHJ1Y3Rpb24gc2V0IHdoaWNoIGRlcGVuZHMgb24gdGhlIG1hY2hpbmUgdHlwZS4KIGNvbmZpZyBDUFVfMzJ2MwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW0tYXJtdi5jIGIvYXJjaC9hcm0vbW0vbW0tYXJtdi5jCmluZGV4IDEyMjFmZGQuLmZiNWI0MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tLWFybXYuYworKysgYi9hcmNoL2FybS9tbS9tbS1hcm12LmMKQEAgLTQ2OSwxNCArNDY5LDE0IEBACiAKIAlpZiAobWQtPnZpcnR1YWwgIT0gdmVjdG9yc19iYXNlKCkgJiYgbWQtPnZpcnR1YWwgPCBUQVNLX1NJWkUpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlVHOiBub3QgY3JlYXRpbmcgbWFwcGluZyBmb3IgIgotCQkgICAgICAgIjB4JTAxNmxseCBhdCAweCUwOGx4IGluIHVzZXIgcmVnaW9uXG4iLAorCQkgICAgICAgIjB4JTA4bGx4IGF0IDB4JTA4bHggaW4gdXNlciByZWdpb25cbiIsCiAJCSAgICAgICBfX3Bmbl90b19waHlzKCh1NjQpbWQtPnBmbiksIG1kLT52aXJ0dWFsKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICgobWQtPnR5cGUgPT0gTVRfREVWSUNFIHx8IG1kLT50eXBlID09IE1UX1JPTSkgJiYKIAkgICAgbWQtPnZpcnR1YWwgPj0gUEFHRV9PRkZTRVQgJiYgbWQtPnZpcnR1YWwgPCBWTUFMTE9DX0VORCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVUc6IG1hcHBpbmcgZm9yIDB4JTAxNmxseCBhdCAweCUwOGx4ICIKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlVHOiBtYXBwaW5nIGZvciAweCUwOGxseCBhdCAweCUwOGx4ICIKIAkJICAgICAgICJvdmVybGFwcyB2bWFsbG9jIHNwYWNlXG4iLAogCQkgICAgICAgX19wZm5fdG9fcGh5cygodTY0KW1kLT5wZm4pLCBtZC0+dmlydHVhbCk7CiAJfQpAQCAtNDkyLDE0ICs0OTIsMTQgQEAKIAlpZihtZC0+cGZuID49IDB4MTAwMDAwKSB7CiAJCWlmKGRvbWFpbikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJNTTogaW52YWxpZCBkb21haW4gaW4gc3VwZXJzZWN0aW9uICIKLQkJCQkibWFwcGluZyBmb3IgMHglMDE2bGx4IGF0IDB4JTA4bHhcbiIsCisJCQkJIm1hcHBpbmcgZm9yIDB4JTA4bGx4IGF0IDB4JTA4bHhcbiIsCiAJCQkJX19wZm5fdG9fcGh5cygodTY0KW1kLT5wZm4pLCBtZC0+dmlydHVhbCk7CiAJCQlyZXR1cm47CiAJCX0KIAkJaWYoKG1kLT52aXJ0dWFsIHwgbWQtPmxlbmd0aCB8IF9fcGZuX3RvX3BoeXMobWQtPnBmbikpCiAJCQkmIH5TVVBFUlNFQ1RJT05fTUFTSykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJNTTogY2Fubm90IGNyZWF0ZSBtYXBwaW5nIGZvciAiCi0JCQkJIjB4JTAxNmxseCBhdCAweCUwOGx4IGludmFsaWQgYWxpZ25tZW50XG4iLAorCQkJCSIweCUwOGxseCBhdCAweCUwOGx4IGludmFsaWQgYWxpZ25tZW50XG4iLAogCQkJCV9fcGZuX3RvX3BoeXMoKHU2NCltZC0+cGZuKSwgbWQtPnZpcnR1YWwpOwogCQkJcmV0dXJuOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbnZyYW0uYyBiL2RyaXZlcnMvY2hhci9udnJhbS5jCmluZGV4IDllMjRiYmQuLjFhZjczM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9udnJhbS5jCisrKyBiL2RyaXZlcnMvY2hhci9udnJhbS5jCkBAIC0zMiwxMSArMzIsOSBAQAogICogCQlhZGRlZCBjaGFuZ2Vsb2cKICAqIAkxLjIJRXJpayBHaWxsaW5nOiBDb2JhbHQgTmV0d29ya3Mgc3VwcG9ydAogICogCQlUaW0gSG9ja2luOiBnZW5lcmFsIGNsZWFudXAsIENvYmFsdCBzdXBwb3J0Ci0gKiAJMS4zCUpvbiBSaW5nbGU6IENvbWRpYWwgTVAxMDAwIHN1cHBvcnQKLSAqCiAgKi8KIAotI2RlZmluZSBOVlJBTV9WRVJTSU9OCSIxLjMiCisjZGVmaW5lIE5WUkFNX1ZFUlNJT04JIjEuMiIKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgpAQCAtNDcsNyArNDUsNiBAQAogI2RlZmluZSBQQwkJMQogI2RlZmluZSBBVEFSSQkJMgogI2RlZmluZSBDT0JBTFQJCTMKLSNkZWZpbmUgTVAxMDAwCQk0CiAKIC8qIHNlbGVjdCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gKi8KICNpZiBkZWZpbmVkKENPTkZJR19BVEFSSSkKQEAgLTU3LDkgKzU0LDYgQEAKICMgIGlmIGRlZmluZWQoQ09ORklHX0NPQkFMVCkKICMgICAgaW5jbHVkZSA8bGludXgvY29iYWx0LW52cmFtLmg+CiAjICAgIGRlZmluZSBNQUNIIENPQkFMVAotIyAgZWxpZiBkZWZpbmVkKENPTkZJR19NQUNIX01QMTAwMCkKLSMgICAgdW5kZWYgTUFDSAotIyAgICBkZWZpbmUgTUFDSCBNUDEwMDAKICMgIGVsc2UKICMgICAgZGVmaW5lIE1BQ0ggUEMKICMgIGVuZGlmCkBAIC0xMTgsMjMgKzExMiw2IEBACiAKICNlbmRpZgogCi0jaWYgTUFDSCA9PSBNUDEwMDAKLQotLyogUlRDIGluIGEgTVAxMDAwICovCi0jZGVmaW5lIENIRUNLX0RSSVZFUl9JTklUKCkJMQotCi0jZGVmaW5lIE1QMTAwMF9DS1NfUkFOR0VfU1RBUlQJMAotI2RlZmluZSBNUDEwMDBfQ0tTX1JBTkdFX0VORAkxMTEKLSNkZWZpbmUgTVAxMDAwX0NLU19MT0MJCTExMgotCi0jZGVmaW5lIE5WUkFNX0JZVEVTCQkoMTI4LU5WUkFNX0ZJUlNUX0JZVEUpCi0KLSNkZWZpbmUgbWFjaF9jaGVja19jaGVja3N1bQltcDEwMDBfY2hlY2tfY2hlY2tzdW0KLSNkZWZpbmUgbWFjaF9zZXRfY2hlY2tzdW0JbXAxMDAwX3NldF9jaGVja3N1bQotI2RlZmluZSBtYWNoX3Byb2NfaW5mb3MJCW1wMTAwMF9wcm9jX2luZm9zCi0KLSNlbmRpZgotCiAvKiBOb3RlIHRoYXQgKmFsbCogY2FsbHMgdG8gQ01PU19SRUFEIGFuZCBDTU9TX1dSSVRFIG11c3QgYmUgZG9uZSB3aXRoCiAgKiBydGNfbG9jayBoZWxkLiBEdWUgdG8gdGhlIGluZGV4LXBvcnQvZGF0YS1wb3J0IGRlc2lnbiBvZiB0aGUgUlRDLCB3ZQogICogZG9uJ3Qgd2FudCB0d28gZGlmZmVyZW50IHRoaW5ncyB0cnlpbmcgdG8gZ2V0IHRvIGl0IGF0IG9uY2UuIChlLmcuIHRoZQpAQCAtOTM4LDkxICs5MTUsNiBAQAogCiAjZW5kaWYgLyogTUFDSCA9PSBBVEFSSSAqLwogCi0jaWYgTUFDSCA9PSBNUDEwMDAKLQotc3RhdGljIGludAotbXAxMDAwX2NoZWNrX2NoZWNrc3VtKHZvaWQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKLQl1bnNpZ25lZCBzaG9ydCBleHBlY3Q7Ci0KLQlmb3IgKGkgPSBNUDEwMDBfQ0tTX1JBTkdFX1NUQVJUOyBpIDw9IE1QMTAwMF9DS1NfUkFOR0VfRU5EOyArK2kpCi0JCXN1bSArPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKLQotICAgICAgICBleHBlY3QgPSBfX252cmFtX3JlYWRfYnl0ZShNUDEwMDBfQ0tTX0xPQysxKTw8OCB8Ci0JICAgIF9fbnZyYW1fcmVhZF9ieXRlKE1QMTAwMF9DS1NfTE9DKTsKLQlyZXR1cm4gKChzdW0gJiAweGZmZmYpID09IGV4cGVjdCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tcDEwMDBfc2V0X2NoZWNrc3VtKHZvaWQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKLQotCWZvciAoaSA9IE1QMTAwMF9DS1NfUkFOR0VfU1RBUlQ7IGkgPD0gTVAxMDAwX0NLU19SQU5HRV9FTkQ7ICsraSkKLQkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOwotCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0gPj4gOCwgTVAxMDAwX0NLU19MT0MgKyAxKTsKLQlfX252cmFtX3dyaXRlX2J5dGUoc3VtICYgMHhmZiwgTVAxMDAwX0NLU19MT0MpOwotfQotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQotI2RlZmluZSAgICAgICAgIFNFUlZFUl9OX0xFTiAgICAgICAgIDMyCi0jZGVmaW5lICAgICAgICAgUEFUSF9OX0xFTiAgICAgICAgICAgMzIKLSNkZWZpbmUgICAgICAgICBGSUxFX05fTEVOICAgICAgICAgICAzMgotI2RlZmluZSAgICAgICAgIE5WUkFNX01BR0lDX1NJRyAgICAgIDB4ZGVhZAotCi10eXBlZGVmIHN0cnVjdCBOdlJhbUltYWdlCi17Ci0JdW5zaWduZWQgc2hvcnQgaW50ICAgIG1hZ2ljOwotCXVuc2lnbmVkIHNob3J0IGludCAgICBtb2RlOwotCWNoYXIgICAgICAgICAgICAgICAgICBmbmFtZVtGSUxFX05fTEVOXTsKLQljaGFyICAgICAgICAgICAgICAgICAgcGF0aFtQQVRIX05fTEVOXTsKLQljaGFyICAgICAgICAgICAgICAgICAgc2VydmVyW1NFUlZFUl9OX0xFTl07Ci0JY2hhciAgICAgICAgICAgICAgICAgIHBhZFsxMl07Ci19IE52UmFtOwotCi1zdGF0aWMgaW50Ci1tcDEwMDBfcHJvY19pbmZvcyh1bnNpZ25lZCBjaGFyICpudnJhbSwgY2hhciAqYnVmZmVyLCBpbnQgKmxlbiwKLSAgICBvZmZfdCAqYmVnaW4sIG9mZl90IG9mZnNldCwgaW50IHNpemUpCi17Ci0JaW50IGNoZWNrc3VtOwotICAgICAgICBOdlJhbSogbnYgPSAoTnZSYW0qKW52cmFtOwotCi0Jc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOwotCWNoZWNrc3VtID0gX19udnJhbV9jaGVja19jaGVja3N1bSgpOwotCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwotCi0JUFJJTlRfUFJPQygiQ2hlY2tzdW0gc3RhdHVzOiAlc3ZhbGlkXG4iLCBjaGVja3N1bSA/ICIiIDogIm5vdCAiKTsKLQotICAgICAgICBzd2l0Y2goIG52LT5tb2RlICkKLSAgICAgICAgewotICAgICAgICAgICBjYXNlIDAgOgotICAgICAgICAgICAgICAgICAgICBQUklOVF9QUk9DKCAiXHRNb2RlIDAsIHRmdHAgcHJvbXB0XG4iICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICBQUklOVF9QUk9DKCAiXHRNb2RlIDEsIGJvb3RpbmcgZnJvbSBkaXNrXG4iICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICBQUklOVF9QUk9DKCAiXHRNb2RlIDIsIEFsdGVybmF0ZSBib290IGZyb20gZGlzayAvYm9vdC8lc1xuIiwgbnYtPmZuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgICAgICBQUklOVF9QUk9DKCAiXHRNb2RlIDMsIEJvb3RpbmcgZnJvbSBuZXQ6XG4iICk7Ci0gICAgICAgICAgICAgICAgICAgIFBSSU5UX1BST0MoICJcdFx0JXM6JXMlc1xuIixudi0+c2VydmVyLCBudi0+cGF0aCwgbnYtPmZuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBQUklOVF9QUk9DKCAiXHRJbmNvbnNpc3RhbnQgbnZyYW0/XG4iICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQlyZXR1cm4gMTsKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogTUFDSCA9PSBNUDEwMDAgKi8KLQogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBFWFBPUlRfU1lNQk9MKF9fbnZyYW1fcmVhZF9ieXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnCmluZGV4IDZkNGY5Y2UuLjU3ZWRhZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtMTM3NCw3ICsxMzc0LDcgQEAKIAogY29uZmlnIENTODl4MAogCXRyaXN0YXRlICJDUzg5eDAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChORVRfUENJICYmIChJU0EgfHwgQVJDSF9JWERQMlgwMSkpIHx8IEFSQ0hfUE5YMDEwNSB8fCBNQUNIX01QMTAwMAorCWRlcGVuZHMgb24gKE5FVF9QQ0kgJiYgKElTQSB8fCBBUkNIX0lYRFAyWDAxKSkgfHwgQVJDSF9QTlgwMTA1CiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgQ1M4OXgwIGNoaXBzZXQgYmFzZWQgRXRoZXJuZXQgY2FyZHMuIElmIHlvdSBoYXZlIGEKIAkgIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jczg5eDAuYyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCmluZGV4IGJmZGFlMTAuLmE2MDc4YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NzODl4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCkBAIC0xODIsMTAgKzE4Miw2IEBACiAjZGVmaW5lIENJUlJVU19ERUZBVUxUX0lSUQlWSF9JTlRDX0lOVF9OVU1fQ0FTQ0FERURfSU5URVJSVVBUXzEgLyogRXZlbnQgaW5wdXRzIGJhbmsgMSAtIElEIDM1L2JpdCAzICovCiBzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0ge0NJUlJVU19ERUZBVUxUX0JBU0UsIDB9Owogc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0ge0NJUlJVU19ERUZBVUxUX0lSUSwgMCwgMCwgMH07Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19NQUNIX01QMTAwMCkKLSNpbmNsdWRlIDxhc20vYXJjaC9tcDEwMDAtc2Vwcm9tLmg+Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0ge01QMTAwMF9FSU9fQkFTRSsweDMwMCwgMH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNzODkwMF9pcnFfbWFwW10gPSB7SVJRX0VJTlQzLDAsMCwwfTsKICNlbHNlCiBzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KICAgIHsgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB4MjAwLCAweDIyMCwgMHgyNDAsIDB4MjYwLCAweDI4MCwgMHgyYTAsIDB4MmMwLCAweDJlMCwgMH07CkBAIC01OTQsMTAgKzU5MCw2IEBACiAJCQljbnQgLT0gajsKIAkJfQogCX0gZWxzZQotI2VsaWYgZGVmaW5lZChDT05GSUdfTUFDSF9NUDEwMDApCi0JaWYgKDEpIHsKLQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGdldF9lZXByb21fbWFjX2FkZHJlc3MoKSwgRVRIX0FMRU4pOwotCX0gZWxzZQogI2VuZGlmCiAKICAgICAgICAgaWYgKChyZWFkcmVnKGRldiwgUFBfU2VsZlNUKSAmIChFRVBST01fT0sgfCBFRVBST01fUFJFU0VOVCkpID09IApAQCAtNjU3LDEwICs2NDksNiBAQAogCWlmICgxKSB7CiAJCXByaW50ayhLRVJOX05PVElDRSAiY3M4OXgwOiBObyBFRVBST00gb24gSGlDTy5TSDRcbiIpOwogCX0gZWxzZQotI2VsaWYgZGVmaW5lZChDT05GSUdfTUFDSF9NUDEwMDApCi0JaWYgKDEpIHsKLQkJbHAtPmZvcmNlIHw9IEZPUkNFX1JKNDU7Ci0JfSBlbHNlCiAjZW5kaWYKIAlpZiAoKHJlYWRyZWcoZGV2LCBQUF9TZWxmU1QpICYgRUVQUk9NX1BSRVNFTlQpID09IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNzODl4MDogTm8gRUVQUk9NLCByZWx5aW5nIG9uIGNvbW1hbmQgbGluZS4uLi5cbiIpOwpAQCAtMTI0Myw3ICsxMjMxLDcgQEAKIAllbHNlCiAjZW5kaWYKIAl7Ci0jaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMDUpICYmICFkZWZpbmVkKENPTkZJR19NQUNIX01QMTAwMCkKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9JWERQMlgwMSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwNSkKIAkJaWYgKCgoMSA8PCBkZXYtPmlycSkgJiBscC0+aXJxX21hcCkgPT0gMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIGlzIG5vdCBpbiBvdXIgbWFwIG9mIGFsbG93YWJsZSBJUlFzLCB3aGljaCBpcyAleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxLCBscC0+aXJxX21hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jczg5eDAuaCBiL2RyaXZlcnMvbmV0L2NzODl4MC5oCmluZGV4IGYxOWQxZWIuLmRlY2VhMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NzODl4MC5oCisrKyBiL2RyaXZlcnMvbmV0L2NzODl4MC5oCkBAIC0xNiw3ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwNSkgfHwgZGVmaW5lZCAoQ09ORklHX01BQ0hfTVAxMDAwKQorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwNSkKIC8qIElYRFAyNDAxL0lYRFAyODAxIHVzZXMgZHdvcmQtYWxpZ25lZCByZWdpc3RlciBhZGRyZXNzaW5nICovCiAjZGVmaW5lIENTODl4MF9QT1JUKHJlZykgKChyZWcpICogMikKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jbHBzNzExeC5jIGIvZHJpdmVycy9zZXJpYWwvY2xwczcxMXguYwppbmRleCA2YTY3ZThmLi44N2VmMzY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jbHBzNzExeC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NscHM3MTF4LmMKQEAgLTQwOCwxMSArNDA4LDcgQEAKIAl7CiAJCS5pb2Jhc2UJCT0gU1lTQ09OMSwKIAkJLmlycQkJPSBJUlFfVVRYSU5UMSwgLyogSVJRX1VSWElOVDEsIElSUV9VTVNJTlQgKi8KLSNpZmRlZiBDT05GSUdfTVAxMDAwXzkwTUhaCi0JCS51YXJ0Y2xrCT0gNDUxNTg0MCwKLSNlbHNlCiAJCS51YXJ0Y2xrCT0gMzY4NjQwMCwKLSNlbmRpZgogCQkuZmlmb3NpemUJPSAxNiwKIAkJLm9wcwkJPSAmY2xwczcxMXhfcG9wcywKIAkJLmxpbmUJCT0gMCwKQEAgLTQyMSwxMSArNDE3LDcgQEAKIAl7CiAJCS5pb2Jhc2UJCT0gU1lTQ09OMiwKIAkJLmlycQkJPSBJUlFfVVRYSU5UMiwgLyogSVJRX1VSWElOVDIgKi8KLSNpZmRlZiBDT05GSUdfTVAxMDAwXzkwTUhaCi0JCS51YXJ0Y2xrCT0gNDUxNTg0MCwKLSNlbHNlCiAJCS51YXJ0Y2xrCT0gMzY4NjQwMCwKLSNlbmRpZgogCQkuZmlmb3NpemUJPSAxNiwKIAkJLm9wcwkJPSAmY2xwczcxMXhfcG9wcywKIAkJLmxpbmUJCT0gMSwKQEAgLTU1OSw3ICs1NTEsNiBAQAogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBjbHBzNzExeF9yZWcgPSB7CiAJLmRyaXZlcl9uYW1lCQk9ICJ0dHlDTCIsCiAJLmRldl9uYW1lCQk9ICJ0dHlDTCIsCi0JLmRldmZzX25hbWUJCT0gInR0eUNMIiwKIAkubWFqb3IJCQk9IFNFUklBTF9DTFBTNzExWF9NQUpPUiwKIAkubWlub3IJCQk9IFNFUklBTF9DTFBTNzExWF9NSU5PUiwKIAkubnIJCQk9IFVBUlRfTlIsCmRpZmYgLS1naXQgYS9mcy9xdW90YS5jIGIvZnMvcXVvdGEuYwppbmRleCBmNWQxY2ZmLi4xZGY3ODMyIDEwMDY0NAotLS0gYS9mcy9xdW90YS5jCisrKyBiL2ZzL3F1b3RhLmMKQEAgLTExOCw2ICsxMTgsMTAgQEAKIAkJCWlmICghc2ItPnNfcWNvcC0+Z2V0X3hxdW90YSkKIAkJCQlyZXR1cm4gLUVOT1NZUzsKIAkJCWJyZWFrOworCQljYXNlIFFfWFFVT1RBU1lOQzoKKwkJCWlmICghc2ItPnNfcWNvcC0+cXVvdGFfc3luYykKKwkJCQlyZXR1cm4gLUVOT1NZUzsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTI4LDcgKzEzMiw3IEBACiAJCSAgICAgKHR5cGUgPT0gWFFNX0dSUFFVT1RBICYmICFpbl9lZ3JvdXBfcChpZCkpKSAmJgogCQkgICAgICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKLQl9IGVsc2UgaWYgKGNtZCAhPSBRX1hHRVRRU1RBVCkgeworCX0gZWxzZSBpZiAoY21kICE9IFFfWEdFVFFTVEFUICYmIGNtZCAhPSBRX1hRVU9UQVNZTkMpIHsKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKIAl9CkBAIC0zMjIsNiArMzI2LDggQEAKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiAwOwogCQl9CisJCWNhc2UgUV9YUVVPVEFTWU5DOgorCQkJcmV0dXJuIHNiLT5zX3Fjb3AtPnF1b3RhX3N5bmMoc2IsIHR5cGUpOwogCQkvKiBXZSBuZXZlciByZWFjaCBoZXJlIHVubGVzcyB2YWxpZGl0eSBjaGVjayBpcyBicm9rZW4gKi8KIAkJZGVmYXVsdDoKIAkJCUJVRygpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL0tjb25maWcgYi9mcy94ZnMvS2NvbmZpZwppbmRleCA4ZThmMzJkLi5iYWMyN2Q2IDEwMDY0NAotLS0gYS9mcy94ZnMvS2NvbmZpZworKysgYi9mcy94ZnMvS2NvbmZpZwpAQCAtMjQsNyArMjQsNyBAQAogCWRlZmF1bHQgeQogCiBjb25maWcgWEZTX1FVT1RBCi0JdHJpc3RhdGUgIlhGUyBRdW90YSBzdXBwb3J0IgorCWJvb2wgIlhGUyBRdW90YSBzdXBwb3J0IgogCWRlcGVuZHMgb24gWEZTX0ZTCiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gc2V0IGxpbWl0cyBmb3IgZGlzayB1c2FnZSBvbgpkaWZmIC0tZ2l0IGEvZnMveGZzL01ha2VmaWxlLWxpbnV4LTIuNiBiL2ZzL3hmcy9NYWtlZmlsZS1saW51eC0yLjYKaW5kZXggZDhjODdmYS4uOTdiZDQ3NCAxMDA2NDQKLS0tIGEvZnMveGZzL01ha2VmaWxlLWxpbnV4LTIuNgorKysgYi9mcy94ZnMvTWFrZWZpbGUtbGludXgtMi42CkBAIC0xMDksNyArMTA5LDYgQEAKIAkJCQkgICB4ZnNfZGZyYWcubyBcCiAJCQkJICAgeGZzX2xvZy5vIFwKIAkJCQkgICB4ZnNfbG9nX3JlY292ZXIubyBcCi0JCQkJICAgeGZzX21hY3Jvcy5vIFwKIAkJCQkgICB4ZnNfbW91bnQubyBcCiAJCQkJICAgeGZzX3JlbmFtZS5vIFwKIAkJCQkgICB4ZnNfdHJhbnMubyBcCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L2ttZW0uYyBiL2ZzL3hmcy9saW51eC0yLjYva21lbS5jCmluZGV4IDNjOTIxNjIuLmFiYTdmY2YgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYva21lbS5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYva21lbS5jCkBAIC0xLDQ5ICsxLDMyIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0KICNpbmNsdWRlICJ0aW1lLmgiCiAjaW5jbHVkZSAia21lbS5oIgogCiAjZGVmaW5lIE1BWF9WTUFMTE9DUwk2CiAjZGVmaW5lIE1BWF9TTEFCX1NJWkUJMHgyMDAwMAogCi0KIHZvaWQgKgoga21lbV9hbGxvYyhzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKQogewpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmggYi9mcy94ZnMvbGludXgtMi42L2ttZW0uaAppbmRleCBmNGJiNzhjLi44ZjgyYzFhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L2ttZW0uaAorKysgYi9mcy94ZnMvbGludXgtMi42L2ttZW0uaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19TVVBQT1JUX0tNRU1fSF9fCiAjZGVmaW5lIF9fWEZTX1NVUFBPUlRfS01FTV9IX18KQEAgLTgzLDcgKzY5LDcgQEAKIAogc3RhdGljIF9faW5saW5lIGdmcF90IGttZW1fZmxhZ3NfY29udmVydCh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCiB7Ci0JZ2ZwX3QgbGZsYWdzID0gX19HRlBfTk9XQVJOOwkvKiB3ZSdsbCByZXBvcnQgcHJvYmxlbXMsIGlmIG5lZWQgYmUgKi8KKwlnZnBfdAlsZmxhZ3MgPSBfX0dGUF9OT1dBUk47CS8qIHdlJ2xsIHJlcG9ydCBwcm9ibGVtcywgaWYgbmVlZCBiZSAqLwogCiAjaWZkZWYgREVCVUcKIAlpZiAodW5saWtlbHkoZmxhZ3MgJiB+KEtNX1NMRUVQfEtNX05PU0xFRVB8S01fTk9GU3xLTV9NQVlGQUlMKSkpIHsKQEAgLTEwMiw3ICs4OCw3IEBACiAJCWlmIChQRkxBR1NfVEVTVF9GU1RSQU5TKCkgfHwgKGZsYWdzICYgS01fTk9GUykpCiAJCQlsZmxhZ3MgJj0gfl9fR0ZQX0ZTOwogCX0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIGxmbGFnczsKIH0KIApAQCAtMTI1LDEzICsxMTEsMTMgQEAKIAkJQlVHKCk7CiB9CiAKLWV4dGVybiB2b2lkCSAgICAqa21lbV96b25lX3phbGxvYyhrbWVtX3pvbmVfdCAqLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwotZXh0ZXJuIHZvaWQJICAgICprbWVtX3pvbmVfYWxsb2Moa21lbV96b25lX3QgKiwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKK2V4dGVybiB2b2lkICprbWVtX3pvbmVfemFsbG9jKGttZW1fem9uZV90ICosIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CitleHRlcm4gdm9pZCAqa21lbV96b25lX2FsbG9jKGttZW1fem9uZV90ICosIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CiAKLWV4dGVybiB2b2lkCSAgICAqa21lbV9hbGxvYyhzaXplX3QsIHVuc2lnbmVkIGludCBfX25vY2FzdCk7Ci1leHRlcm4gdm9pZAkgICAgKmttZW1fcmVhbGxvYyh2b2lkICosIHNpemVfdCwgc2l6ZV90LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwotZXh0ZXJuIHZvaWQJICAgICprbWVtX3phbGxvYyhzaXplX3QsIHVuc2lnbmVkIGludCBfX25vY2FzdCk7Ci1leHRlcm4gdm9pZCAgICAgICAgIGttZW1fZnJlZSh2b2lkICosIHNpemVfdCk7CitleHRlcm4gdm9pZCAqa21lbV9hbGxvYyhzaXplX3QsIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CitleHRlcm4gdm9pZCAqa21lbV9yZWFsbG9jKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CitleHRlcm4gdm9pZCAqa21lbV96YWxsb2Moc2l6ZV90LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOworZXh0ZXJuIHZvaWQgIGttZW1fZnJlZSh2b2lkICosIHNpemVfdCk7CiAKIHR5cGVkZWYgc3RydWN0IHNocmlua2VyICprbWVtX3NoYWtlcl90OwogdHlwZWRlZiBpbnQgKCprbWVtX3NoYWtlX2Z1bmNfdCkoaW50LCBnZnBfdCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L21ybG9jay5oIGIvZnMveGZzL2xpbnV4LTIuNi9tcmxvY2suaAppbmRleCBkMmMxMWEwLi4xNmI0NGMzIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L21ybG9jay5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYvbXJsb2NrLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfU1VQUE9SVF9NUkxPQ0tfSF9fCiAjZGVmaW5lIF9fWEZTX1NVUFBPUlRfTVJMT0NLX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9tdXRleC5oIGIvZnMveGZzL2xpbnV4LTIuNi9tdXRleC5oCmluZGV4IDBiMjk2YmIuLmNlNzczZDggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYvbXV0ZXguaAorKysgYi9mcy94ZnMvbGludXgtMi42L211dGV4LmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19TVVBQT1JUX01VVEVYX0hfXwogI2RlZmluZSBfX1hGU19TVVBQT1JUX01VVEVYX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9zZW1hLmggYi9mcy94ZnMvbGludXgtMi42L3NlbWEuaAppbmRleCAzMGI2N2I0Li4xOTRhODQ0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3NlbWEuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3NlbWEuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX1NVUFBPUlRfU0VNQV9IX18KICNkZWZpbmUgX19YRlNfU1VQUE9SVF9TRU1BX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9zcGluLmggYi9mcy94ZnMvbGludXgtMi42L3NwaW4uaAppbmRleCAwMDM5NTA0Li41MGE2MTkxIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3NwaW4uaAorKysgYi9mcy94ZnMvbGludXgtMi42L3NwaW4uaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX1NVUFBPUlRfU1BJTl9IX18KICNkZWZpbmUgX19YRlNfU1VQUE9SVF9TUElOX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9zdi5oIGIvZnMveGZzL2xpbnV4LTIuNi9zdi5oCmluZGV4IDgyMWQzMTYuLjlhOGFkNDggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYvc3YuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3N2LmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19TVVBQT1JUX1NWX0hfXwogI2RlZmluZSBfX1hGU19TVVBQT1JUX1NWX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi90aW1lLmggYi9mcy94ZnMvbGludXgtMi42L3RpbWUuaAppbmRleCBiMGQyODczLi4zODdlNjk1IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3RpbWUuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3RpbWUuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX1NVUFBPUlRfVElNRV9IX18KICNkZWZpbmUgX19YRlNfU1VQUE9SVF9USU1FX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCmluZGV4IDdhYTM5ODcuLmM2MTA4OTcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKQEAgLTEsMzkgKzEsMjYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgpAQCAtNDIsMTMgKzI5LDEzIEBACiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfcncuaCIKICNpbmNsdWRlICJ4ZnNfaW9tYXAuaCIKQEAgLTc2MSw4ICs3NDgsOSBAQAogCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgpIHsKIAkJaWYgKChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXggKyAxKSB8fAogCQkgICAgIShpX3NpemVfcmVhZChpbm9kZSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpKSB7Ci0JCQllcnIgPSAtRUlPOwotCQkJZ290byBlcnJvcjsKKwkJCWlmIChzdGFydGlvKQorCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKQEAgLTk0OCwxNSArOTM2LDE4IEBACiB7CiAJdm5vZGVfdAkJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOwogCXhmc19pb21hcF90CQlpb21hcDsKKwl4ZnNfb2ZmX3QJCW9mZnNldDsKKwlzc2l6ZV90CQkJc2l6ZTsKIAlpbnQJCQlyZXRwYmJtID0gMTsKIAlpbnQJCQllcnJvcjsKLQlzc2l6ZV90CQkJc2l6ZTsKLQlsb2ZmX3QJCQlvZmZzZXQgPSAobG9mZl90KWlibG9jayA8PCBpbm9kZS0+aV9ibGtiaXRzOwogCi0JaWYgKGJsb2NrcykKLQkJc2l6ZSA9IGJsb2NrcyA8PCBpbm9kZS0+aV9ibGtiaXRzOwotCWVsc2UKKwlpZiAoYmxvY2tzKSB7CisJCW9mZnNldCA9IGJsb2NrcyA8PCBpbm9kZS0+aV9ibGtiaXRzOwkvKiA2NCBiaXQgZ29vZG5lc3MgKi8KKwkJc2l6ZSA9IChzc2l6ZV90KSBtaW5fdCh4ZnNfb2ZmX3QsIG9mZnNldCwgTE9OR19NQVgpOworCX0gZWxzZSB7CiAJCXNpemUgPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7CisJfQorCW9mZnNldCA9ICh4ZnNfb2ZmX3QpaWJsb2NrIDw8IGlub2RlLT5pX2Jsa2JpdHM7CiAKIAlWT1BfQk1BUCh2cCwgb2Zmc2V0LCBzaXplLAogCQljcmVhdGUgPyBmbGFncyA6IEJNQVBJX1JFQUQsICZpb21hcCwgJnJldHBiYm0sIGVycm9yKTsKQEAgLTk2Nyw4ICs5NTgsOCBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChpb21hcC5pb21hcF9ibiAhPSBJT01BUF9EQUREUl9OVUxMKSB7Ci0JCXhmc19kYWRkcl90CQlibjsKLQkJbG9mZl90CQkJZGVsdGE7CisJCXhmc19kYWRkcl90CWJuOworCQl4ZnNfb2ZmX3QJZGVsdGE7CiAKIAkJLyogRm9yIHVud3JpdHRlbiBleHRlbnRzIGRvIG5vdCByZXBvcnQgYSBkaXNrIGFkZHJlc3Mgb24KIAkJICogdGhlIHJlYWQgY2FzZSAodHJlYXQgYXMgaWYgd2UncmUgcmVhZGluZyBpbnRvIGEgaG9sZSkuCkBAIC0xMDAwLDkgKzk5MSw4IEBACiAJICovCiAJaWYgKGNyZWF0ZSAmJgogCSAgICAoKCFidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpKSB8fAotCSAgICAgKG9mZnNldCA+PSBpX3NpemVfcmVhZChpbm9kZSkpIHx8IChpb21hcC5pb21hcF9mbGFncyAmIElPTUFQX05FVykpKSB7CisJICAgICAob2Zmc2V0ID49IGlfc2l6ZV9yZWFkKGlub2RlKSkgfHwgKGlvbWFwLmlvbWFwX2ZsYWdzICYgSU9NQVBfTkVXKSkpCiAJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7Ci0JfQogCiAJaWYgKGlvbWFwLmlvbWFwX2ZsYWdzICYgSU9NQVBfREVMQVkpIHsKIAkJQlVHX09OKGRpcmVjdCk7CkBAIC0xMDE0LDkgKzEwMDQsMTEgQEAKIAl9CiAKIAlpZiAoYmxvY2tzKSB7Ci0JCWJoX3Jlc3VsdC0+Yl9zaXplID0gKHNzaXplX3QpbWluKAotCQkJKGxvZmZfdCkoaW9tYXAuaW9tYXBfYnNpemUgLSBpb21hcC5pb21hcF9kZWx0YSksCi0JCQkobG9mZl90KShibG9ja3MgPDwgaW5vZGUtPmlfYmxrYml0cykpOworCQlBU1NFUlQoaW9tYXAuaW9tYXBfYnNpemUgLSBpb21hcC5pb21hcF9kZWx0YSA+IDApOworCQlvZmZzZXQgPSBtaW5fdCh4ZnNfb2ZmX3QsCisJCQkJaW9tYXAuaW9tYXBfYnNpemUgLSBpb21hcC5pb21hcF9kZWx0YSwKKwkJCQlibG9ja3MgPDwgaW5vZGUtPmlfYmxrYml0cyk7CisJCWJoX3Jlc3VsdC0+Yl9zaXplID0gKHUzMikgbWluX3QoeGZzX29mZl90LCBVSU5UX01BWCwgb2Zmc2V0KTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaAppbmRleCAyZmE2Mjk3Li40NzIwNzU4IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfQU9QU19IX18KICNkZWZpbmUgX19YRlNfQU9QU19IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKaW5kZXggNGNkNDZhYi4uNmZlMjFkMiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKQEAgLTEsNDYgKzEsMjAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQotLyoKLSAqCVRoZSB4ZnNfYnVmLmMgY29kZSBwcm92aWRlcyBhbiBhYnN0cmFjdCBidWZmZXIgY2FjaGUgbW9kZWwgb24gdG9wCi0gKglvZiB0aGUgTGludXggcGFnZSBjYWNoZS4gIENhY2hlZCBtZXRhZGF0YSBibG9ja3MgZm9yIGEgZmlsZSBzeXN0ZW0KLSAqCWFyZSBoYXNoZWQgdG8gdGhlIGlub2RlIGZvciB0aGUgYmxvY2sgZGV2aWNlLiAgeGZzX2J1Zi5jIGFzc2VtYmxlcwotICoJYnVmZmVycyAoeGZzX2J1Zl90KSBvbiBkZW1hbmQgdG8gYWdncmVnYXRlIHN1Y2ggY2FjaGVkIHBhZ2VzIGZvciBJL08uCi0gKgotICogICAgICBXcml0dGVuIGJ5IFN0ZXZlIExvcmQsIEppbSBNb3N0ZWssIFJ1c3NlbGwgQ2F0dGVsYW4KLSAqCQkgICAgYW5kIFJhamFnb3BhbCBBbmFudGhhbmFyYXlhbmFuICgiYW5hbnRoIikgYXQgU0dJLgotICoKLSAqLwotCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC01NSwxMyArMjksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0KICNpbmNsdWRlICJ4ZnNfbGludXguaCIKIAotLyoKLSAqIEZpbGUgd2lkZSBnbG9iYWxzCi0gKi8KLQogU1RBVElDIGttZW1fY2FjaGVfdCAqcGFnZWJ1Zl96b25lOwogU1RBVElDIGttZW1fc2hha2VyX3QgcGFnZWJ1Zl9zaGFrZTsKIFNUQVRJQyBpbnQgeGZzYnVmZF93YWtldXAoaW50LCBnZnBfdCk7CkBAIC03MCwxMCArMzksNiBAQAogU1RBVElDIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNsb2dkX3dvcmtxdWV1ZTsKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNkYXRhZF93b3JrcXVldWU7CiAKLS8qCi0gKiBQYWdlYnVmIGRlYnVnZ2luZwotICovCi0KICNpZmRlZiBQQUdFQlVGX1RSQUNFCiB2b2lkCiBwYWdlYnVmX3RyYWNlKApAQCAtMTEyLDEwICs3Nyw2IEBACiAjIGRlZmluZSBQQl9HRVRfT1dORVIocGIpCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0vKgotICogUGFnZWJ1ZiBhbGxvY2F0aW9uIC8gZnJlZWluZy4KLSAqLwotCiAjZGVmaW5lIHBiX3RvX2dmcChmbGFncykgXAogCSgoKChmbGFncykgJiBQQkZfUkVBRF9BSEVBRCkgPyBfX0dGUF9OT1JFVFJZIDogXAogCSAgKChmbGFncykgJiBQQkZfRE9OVF9CTE9DSykgPyBHRlBfTk9GUyA6IEdGUF9LRVJORUwpIHwgX19HRlBfTk9XQVJOKQpAQCAtMTIzLDcgKzg0LDYgQEAKICNkZWZpbmUgcGJfdG9fa20oZmxhZ3MpIFwKIAkgKCgoZmxhZ3MpICYgUEJGX0RPTlRfQkxPQ0spID8gS01fTk9GUyA6IEtNX1NMRUVQKQogCi0KICNkZWZpbmUgcGFnZWJ1Zl9hbGxvY2F0ZShmbGFncykgXAogCWttZW1fem9uZV9hbGxvYyhwYWdlYnVmX3pvbmUsIHBiX3RvX2ttKGZsYWdzKSkKICNkZWZpbmUgcGFnZWJ1Zl9kZWFsbG9jYXRlKHBiKSBcCkBAIC0yODYsNyArMjQ2LDcgQEAKIAkgKiBtb3N0IGNhc2VzIGJ1dCBtYXkgYmUgcmVzZXQgKGUuZy4gWEZTIHJlY292ZXJ5KS4KIAkgKi8KIAlwYi0+cGJfYnVmZmVyX2xlbmd0aCA9IHBiLT5wYl9jb3VudF9kZXNpcmVkID0gcmFuZ2VfbGVuZ3RoOwotCXBiLT5wYl9mbGFncyA9IGZsYWdzIHwgUEJGX05PTkU7CisJcGItPnBiX2ZsYWdzID0gZmxhZ3M7CiAJcGItPnBiX2JuID0gWEZTX0JVRl9EQUREUl9OVUxMOwogCWF0b21pY19zZXQoJnBiLT5wYl9waW5fY291bnQsIDApOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBiLT5wYl93YWl0ZXJzKTsKQEAgLTQ1OCwxNCArNDE4LDggQEAKIAkJCXVubG9ja19wYWdlKGJwLT5wYl9wYWdlc1tpXSk7CiAJfQogCi0JaWYgKHBhZ2VfY291bnQpIHsKLQkJLyogaWYgd2UgaGF2ZSBhbnkgdXB0b2RhdGUgcGFnZXMsIG1hcmsgdGhhdCBpbiB0aGUgYnVmZmVyICovCi0JCWJwLT5wYl9mbGFncyAmPSB+UEJGX05PTkU7Ci0KLQkJLyogaWYgc29tZSBwYWdlcyBhcmVuJ3QgdXB0b2RhdGUsIG1hcmsgdGhhdCBpbiB0aGUgYnVmZmVyICovCi0JCWlmIChwYWdlX2NvdW50ICE9IGJwLT5wYl9wYWdlX2NvdW50KQotCQkJYnAtPnBiX2ZsYWdzIHw9IFBCRl9QQVJUSUFMOwotCX0KKwlpZiAocGFnZV9jb3VudCA9PSBicC0+cGJfcGFnZV9jb3VudCkKKwkJYnAtPnBiX2ZsYWdzIHw9IFBCRl9ET05FOwogCiAJUEJfVFJBQ0UoYnAsICJsb29rdXBfcGFnZXMiLCAobG9uZylwYWdlX2NvdW50KTsKIAlyZXR1cm4gZXJyb3I7CkBAIC02NzYsNyArNjMwLDcgQEAKIAogCXBiID0geGZzX2J1Zl9nZXRfZmxhZ3ModGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOwogCWlmIChwYikgewotCQlpZiAoUEJGX05PVF9ET05FKHBiKSkgeworCQlpZiAoIVhGU19CVUZfSVNET05FKHBiKSkgewogCQkJUEJfVFJBQ0UocGIsICJyZWFkIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOwogCQkJWEZTX1NUQVRTX0lOQyhwYl9nZXRfcmVhZCk7CiAJCQlwYWdlYnVmX2lvc3RhcnQocGIsIGZsYWdzKTsKQEAgLTgxMyw3ICs3NjcsNyBAQAogCWJwID0gcGFnZWJ1Zl9hbGxvY2F0ZSgwKTsKIAlpZiAodW5saWtlbHkoYnAgPT0gTlVMTCkpCiAJCWdvdG8gZmFpbDsKLQlfcGFnZWJ1Zl9pbml0aWFsaXplKGJwLCB0YXJnZXQsIDAsIGxlbiwgUEJGX0ZPUkNFSU8pOworCV9wYWdlYnVmX2luaXRpYWxpemUoYnAsIHRhcmdldCwgMCwgbGVuLCAwKTsKIAogIHRyeV9hZ2FpbjoKIAlkYXRhID0ga21lbV9hbGxvYyhtYWxsb2NfbGVuLCBLTV9TTEVFUCB8IEtNX01BWUZBSUwpOwpAQCAtODc2LDM5ICs4MzAsMTggQEAKIAogCVBCX1RSQUNFKHBiLCAicmVsZSIsIHBiLT5wYl9yZWxzZSk7CiAKLQkvKgotCSAqIHBhZ2VidWZfbG9va3VwIGJ1ZmZlcnMgYXJlIG5vdCBoYXNoZWQsIG5vdCBkZWxheWVkIHdyaXRlLAotCSAqIGFuZCBkb24ndCBoYXZlIHRoZWlyIG93biByZWxlYXNlIHJvdXRpbmVzLiAgU3BlY2lhbCBjYXNlLgotCSAqLwotCWlmICh1bmxpa2VseSghaGFzaCkpIHsKLQkJQVNTRVJUKCFwYi0+cGJfcmVsc2UpOwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX2hvbGQpKQotCQkJeGZzX2J1Zl9mcmVlKHBiKTsKLQkJcmV0dXJuOwotCX0KLQogCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZwYi0+cGJfaG9sZCwgJmhhc2gtPmJoX2xvY2spKSB7Ci0JCWludAkJZG9fZnJlZSA9IDE7Ci0KIAkJaWYgKHBiLT5wYl9yZWxzZSkgewogCQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOwogCQkJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOwogCQkJKCoocGItPnBiX3JlbHNlKSkgKHBiKTsKLQkJCXNwaW5fbG9jaygmaGFzaC0+YmhfbG9jayk7Ci0JCQlkb19mcmVlID0gMDsKLQkJfQotCi0JCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfRlNfTUFOQUdFRCkgewotCQkJZG9fZnJlZSA9IDA7Ci0JCX0KLQotCQlpZiAoZG9fZnJlZSkgewotCQkJQVNTRVJUKChwYi0+cGJfZmxhZ3MgJiAoUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKSkgPT0gMCk7CisJCX0gZWxzZSBpZiAocGItPnBiX2ZsYWdzICYgUEJGX0ZTX01BTkFHRUQpIHsKKwkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCUFTU0VSVCghKHBiLT5wYl9mbGFncyAmIChQQkZfREVMV1JJfF9QQkZfREVMV1JJX1EpKSk7CiAJCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfaGFzaF9saXN0KTsKIAkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKIAkJCXBhZ2VidWZfZnJlZShwYik7Ci0JCX0gZWxzZSB7Ci0JCQlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CiAJCX0KIAl9IGVsc2UgewogCQkvKgpAQCAtMTEyMSwyMSArMTA1NCwxOCBAQAogdm9pZAogcGFnZWJ1Zl9pb2RvbmUoCiAJeGZzX2J1Zl90CQkqcGIsCi0JaW50CQkJZGF0YWlvLAogCWludAkJCXNjaGVkdWxlKQogewogCXBiLT5wYl9mbGFncyAmPSB+KFBCRl9SRUFEIHwgUEJGX1dSSVRFKTsKLQlpZiAocGItPnBiX2Vycm9yID09IDApIHsKLQkJcGItPnBiX2ZsYWdzICY9IH4oUEJGX1BBUlRJQUwgfCBQQkZfTk9ORSk7Ci0JfQorCWlmIChwYi0+cGJfZXJyb3IgPT0gMCkKKwkJcGItPnBiX2ZsYWdzIHw9IFBCRl9ET05FOwogCiAJUEJfVFJBQ0UocGIsICJpb2RvbmUiLCBwYi0+cGJfaW9kb25lKTsKIAogCWlmICgocGItPnBiX2lvZG9uZSkgfHwgKHBiLT5wYl9mbGFncyAmIFBCRl9BU1lOQykpIHsKIAkJaWYgKHNjaGVkdWxlKSB7CiAJCQlJTklUX1dPUksoJnBiLT5wYl9pb2RvbmVfd29yaywgcGFnZWJ1Zl9pb2RvbmVfd29yaywgcGIpOwotCQkJcXVldWVfd29yayhkYXRhaW8gPyB4ZnNkYXRhZF93b3JrcXVldWUgOgotCQkJCXhmc2xvZ2Rfd29ya3F1ZXVlLCAmcGItPnBiX2lvZG9uZV93b3JrKTsKKwkJCXF1ZXVlX3dvcmsoeGZzbG9nZF93b3JrcXVldWUsICZwYi0+cGJfaW9kb25lX3dvcmspOwogCQl9IGVsc2UgewogCQkJcGFnZWJ1Zl9pb2RvbmVfd29yayhwYik7CiAJCX0KQEAgLTEyMzUsNyArMTE2NSw3IEBACiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnBiLT5wYl9pb19yZW1haW5pbmcpID09IDEpIHsKIAkJcGItPnBiX2xvY2tlZCA9IDA7Ci0JCXBhZ2VidWZfaW9kb25lKHBiLCAocGItPnBiX2ZsYWdzICYgUEJGX0ZTX0RBVEFJT0QpLCBzY2hlZHVsZSk7CisJCXBhZ2VidWZfaW9kb25lKHBiLCBzY2hlZHVsZSk7CiAJfQogfQogCkBAIC0xMzA0LDYgKzEyMzQsMTEgQEAKIAkJcncgPSAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpID8gUkVBRCA6IFdSSVRFOwogCX0KIAorCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfT1JERVJFRCkgeworCQlBU1NFUlQoIShwYi0+cGJfZmxhZ3MgJiBQQkZfUkVBRCkpOworCQlydyA9IFdSSVRFX0JBUlJJRVI7CisJfQorCiAJLyogU3BlY2lhbCBjb2RlIHBhdGggZm9yIHJlYWRpbmcgYSBzdWIgcGFnZSBzaXplIHBhZ2VidWYgaW4gLS0KIAkgKiB3ZSBwb3B1bGF0ZSB1cCB0aGUgd2hvbGUgcGFnZSwgYW5kIGhlbmNlIHRoZSBvdGhlciBtZXRhZGF0YQogCSAqIGluIHRoZSBzYW1lIHBhZ2UuICBUaGlzIG9wdGltaXphdGlvbiBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlCkBAIC0xNzUwLDggKzE2ODUsOCBAQAogCiBTVEFUSUMgaW50CiB4ZnNidWZkX3dha2V1cCgKLQlpbnQJCXByaW9yaXR5LAotCWdmcF90CQltYXNrKQorCWludAkJCXByaW9yaXR5LAorCWdmcF90CQkJbWFzaykKIHsKIAlpZiAoeGZzYnVmZF9mb3JjZV9zbGVlcCkKIAkJcmV0dXJuIDA7CkBAIC0xNzgxLDggKzE3MTYsOCBAQAogCQkJeGZzYnVmZF9mb3JjZV9zbGVlcCA9IDA7CiAJCX0KIAotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUKLQkJCSh4ZnNfYnVmX3RpbWVyX2NlbnRpc2VjcyAqIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKAorCQkJeGZzX2J1Zl90aW1lcl9jZW50aXNlY3MgKiBtc2Vjc190b19qaWZmaWVzKDEwKSk7CiAKIAkJYWdlID0geGZzX2J1Zl9hZ2VfY2VudGlzZWNzICogbXNlY3NfdG9famlmZmllcygxMCk7CiAJCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOwpAQCAtMTg5MSwxNCArMTgyNiwyMiBAQAogCXJldHVybiBwaW5jb3VudDsKIH0KIAotU1RBVElDIGludAoteGZzX2J1Zl9kYWVtb25zX3N0YXJ0KHZvaWQpCitpbnQgX19pbml0CitwYWdlYnVmX2luaXQodm9pZCkKIHsKIAlpbnQJCWVycm9yID0gLUVOT01FTTsKIAorI2lmZGVmIFBBR0VCVUZfVFJBQ0UKKwlwYWdlYnVmX3RyYWNlX2J1ZiA9IGt0cmFjZV9hbGxvYyhQQUdFQlVGX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorCisJcGFnZWJ1Zl96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19idWZfdCksICJ4ZnNfYnVmIik7CisJaWYgKCFwYWdlYnVmX3pvbmUpCisJCWdvdG8gb3V0X2ZyZWVfdHJhY2VfYnVmOworCiAJeGZzbG9nZF93b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJ4ZnNsb2dkIik7CiAJaWYgKCF4ZnNsb2dkX3dvcmtxdWV1ZSkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2ZyZWVfYnVmX3pvbmU7CiAKIAl4ZnNkYXRhZF93b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJ4ZnNkYXRhZCIpOwogCWlmICgheGZzZGF0YWRfd29ya3F1ZXVlKQpAQCAtMTkwOSw4MiArMTg1MiwzNyBAQAogCQllcnJvciA9IFBUUl9FUlIoeGZzYnVmZF90YXNrKTsKIAkJZ290byBvdXRfZGVzdHJveV94ZnNkYXRhZF93b3JrcXVldWU7CiAJfQorCisJcGFnZWJ1Zl9zaGFrZSA9IGttZW1fc2hha2VfcmVnaXN0ZXIoeGZzYnVmZF93YWtldXApOworCWlmICghcGFnZWJ1Zl9zaGFrZSkKKwkJZ290byBvdXRfc3RvcF94ZnNidWZkOworCiAJcmV0dXJuIDA7CiAKKyBvdXRfc3RvcF94ZnNidWZkOgorCWt0aHJlYWRfc3RvcCh4ZnNidWZkX3Rhc2spOwogIG91dF9kZXN0cm95X3hmc2RhdGFkX3dvcmtxdWV1ZToKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNkYXRhZF93b3JrcXVldWUpOwogIG91dF9kZXN0cm95X3hmc2xvZ2Rfd29ya3F1ZXVlOgogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2xvZ2Rfd29ya3F1ZXVlKTsKLSBvdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKgotICogTm90ZTogZG8gbm90IG1hcmsgYXMgX19leGl0LCBpdCBpcyBjYWxsZWQgZnJvbSBwYWdlYnVmX3Rlcm1pbmF0ZS4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19idWZfZGFlbW9uc19zdG9wKHZvaWQpCi17Ci0Ja3RocmVhZF9zdG9wKHhmc2J1ZmRfdGFzayk7Ci0JZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7Ci19Ci0KLS8qCi0gKglJbml0aWFsaXphdGlvbiBhbmQgVGVybWluYXRpb24KLSAqLwotCi1pbnQgX19pbml0Ci1wYWdlYnVmX2luaXQodm9pZCkKLXsKLQlpbnQJCWVycm9yID0gLUVOT01FTTsKLQotCXBhZ2VidWZfem9uZSA9IGttZW1fem9uZV9pbml0KHNpemVvZih4ZnNfYnVmX3QpLCAieGZzX2J1ZiIpOwotCWlmICghcGFnZWJ1Zl96b25lKQotCQlnb3RvIG91dDsKLQotI2lmZGVmIFBBR0VCVUZfVFJBQ0UKLQlwYWdlYnVmX3RyYWNlX2J1ZiA9IGt0cmFjZV9hbGxvYyhQQUdFQlVGX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKLSNlbmRpZgotCi0JZXJyb3IgPSB4ZnNfYnVmX2RhZW1vbnNfc3RhcnQoKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X2ZyZWVfYnVmX3pvbmU7Ci0KLQlwYWdlYnVmX3NoYWtlID0ga21lbV9zaGFrZV9yZWdpc3Rlcih4ZnNidWZkX3dha2V1cCk7Ci0JaWYgKCFwYWdlYnVmX3NoYWtlKSB7Ci0JCWVycm9yID0gLUVOT01FTTsKLQkJZ290byBvdXRfc3RvcF9kYWVtb25zOwotCX0KLQotCXJldHVybiAwOwotCi0gb3V0X3N0b3BfZGFlbW9uczoKLQl4ZnNfYnVmX2RhZW1vbnNfc3RvcCgpOwogIG91dF9mcmVlX2J1Zl96b25lOgorCWttZW1fem9uZV9kZXN0cm95KHBhZ2VidWZfem9uZSk7Cisgb3V0X2ZyZWVfdHJhY2VfYnVmOgogI2lmZGVmIFBBR0VCVUZfVFJBQ0UKIAlrdHJhY2VfZnJlZShwYWdlYnVmX3RyYWNlX2J1Zik7CiAjZW5kaWYKLQlrbWVtX3pvbmVfZGVzdHJveShwYWdlYnVmX3pvbmUpOwotIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLQotLyoKLSAqCXBhZ2VidWZfdGVybWluYXRlLgotICoKLSAqCU5vdGU6IGRvIG5vdCBtYXJrIGFzIF9fZXhpdCwgdGhpcyBpcyBhbHNvIGNhbGxlZCBmcm9tIHRoZSBfX2luaXQgY29kZS4KLSAqLwogdm9pZAogcGFnZWJ1Zl90ZXJtaW5hdGUodm9pZCkKIHsKLQl4ZnNfYnVmX2RhZW1vbnNfc3RvcCgpOwotCisJa21lbV9zaGFrZV9kZXJlZ2lzdGVyKHBhZ2VidWZfc2hha2UpOworCWt0aHJlYWRfc3RvcCh4ZnNidWZkX3Rhc2spOworCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOworCWttZW1fem9uZV9kZXN0cm95KHBhZ2VidWZfem9uZSk7CiAjaWZkZWYgUEFHRUJVRl9UUkFDRQogCWt0cmFjZV9mcmVlKHBhZ2VidWZfdHJhY2VfYnVmKTsKICNlbmRpZgotCi0Ja21lbV96b25lX2Rlc3Ryb3kocGFnZWJ1Zl96b25lKTsKLQlrbWVtX3NoYWtlX2RlcmVnaXN0ZXIocGFnZWJ1Zl9zaGFrZSk7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oCmluZGV4IDY3YzE5ZjcuLjIzN2EzNWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oCkBAIC0xLDM5ICsxLDIwIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KLS8qCi0gKiBXcml0dGVuIGJ5IFN0ZXZlIExvcmQsIEppbSBNb3N0ZWssIFJ1c3NlbGwgQ2F0dGVsYW4gYXQgU0dJCi0gKi8KLQogI2lmbmRlZiBfX1hGU19CVUZfSF9fCiAjZGVmaW5lIF9fWEZTX0JVRl9IX18KIApAQCAtNjksMTUgKzUwLDEyIEBACiAJUEJGX1JFQUQgPSAoMSA8PCAwKSwJLyogYnVmZmVyIGludGVuZGVkIGZvciByZWFkaW5nIGZyb20gZGV2aWNlICovCiAJUEJGX1dSSVRFID0gKDEgPDwgMSksCS8qIGJ1ZmZlciBpbnRlbmRlZCBmb3Igd3JpdGluZyB0byBkZXZpY2UgICAqLwogCVBCRl9NQVBQRUQgPSAoMSA8PCAyKSwgIC8qIGJ1ZmZlciBtYXBwZWQgKHBiX2FkZHIgdmFsaWQpICAgICAgICAgICAqLwotCVBCRl9QQVJUSUFMID0gKDEgPDwgMyksIC8qIGJ1ZmZlciBwYXJ0aWFsbHkgcmVhZCAgICAgICAgICAgICAgICAgICAqLwogCVBCRl9BU1lOQyA9ICgxIDw8IDQpLCAgIC8qIGluaXRpYXRvciB3aWxsIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uICAqLwotCVBCRl9OT05FID0gKDEgPDwgNSksICAgIC8qIGJ1ZmZlciBub3QgcmVhZCBhdCBhbGwgICAgICAgICAgICAgICAgICAqLworCVBCRl9ET05FID0gKDEgPDwgNSksICAgIC8qIGFsbCBwYWdlcyBpbiB0aGUgYnVmZmVyIHVwdG9kYXRlCSAgICovCiAJUEJGX0RFTFdSSSA9ICgxIDw8IDYpLCAgLyogYnVmZmVyIGhhcyBkaXJ0eSBwYWdlcyAgICAgICAgICAgICAgICAgICovCiAJUEJGX1NUQUxFID0gKDEgPDwgNyksCS8qIGJ1ZmZlciBoYXMgYmVlbiBzdGFsZWQsIGRvIG5vdCBmaW5kIGl0ICAqLwogCVBCRl9GU19NQU5BR0VEID0gKDEgPDwgOCksICAvKiBmaWxlc3lzdGVtIGNvbnRyb2xzIGZyZWVpbmcgbWVtb3J5ICAqLwotCVBCRl9GU19EQVRBSU9EID0gKDEgPDwgOSksICAvKiBzY2hlZHVsZSBJTyBjb21wbGV0aW9uIG9uIGZzIGRhdGFkICAqLwotCVBCRl9GT1JDRUlPID0gKDEgPDwgMTApLCAgICAvKiBpZ25vcmUgYW55IGNhY2hlIHN0YXRlCQkgICAqLwotCVBCRl9GTFVTSCA9ICgxIDw8IDExKSwJICAgIC8qIGZsdXNoIGRpc2sgd3JpdGUgY2FjaGUJCSAgICovCisgCVBCRl9PUkRFUkVEID0gKDEgPDwgMTEpLCAgICAvKiB1c2Ugb3JkZXJlZCB3cml0ZXMJCSAgICovCiAJUEJGX1JFQURfQUhFQUQgPSAoMSA8PCAxMiksIC8qIGFzeW5jaHJvbm91cyByZWFkLWFoZWFkCQkgICAqLwogCiAJLyogZmxhZ3MgdXNlZCBvbmx5IGFzIGFyZ3VtZW50cyB0byBhY2Nlc3Mgcm91dGluZXMgKi8KQEAgLTkyLDkgKzcwLDYgQEAKIAlfUEJGX0RFTFdSSV9RID0gKDEgPDwgMjEpLCAgIC8qIGJ1ZmZlciBvbiBkZWx3cmkgcXVldWUJCSAgICovCiB9IHBhZ2VfYnVmX2ZsYWdzX3Q7CiAKLSNkZWZpbmUgUEJGX1VQREFURSAoUEJGX1JFQUQgfCBQQkZfV1JJVEUpCi0jZGVmaW5lIFBCRl9OT1RfRE9ORShwYikgKCgocGIpLT5wYl9mbGFncyAmIChQQkZfUEFSVElBTHxQQkZfTk9ORSkpICE9IDApCi0jZGVmaW5lIFBCRl9ET05FKHBiKSAoKChwYiktPnBiX2ZsYWdzICYgKFBCRl9QQVJUSUFMfFBCRl9OT05FKSkgPT0gMCkKIAogdHlwZWRlZiBzdHJ1Y3QgeGZzX2J1Zmhhc2ggewogCXN0cnVjdCBsaXN0X2hlYWQJYmhfbGlzdDsKQEAgLTI1OCw3ICsyMzMsNiBAQAogCiBleHRlcm4gdm9pZCBwYWdlYnVmX2lvZG9uZSgJCS8qIG1hcmsgYnVmZmVyIEkvTyBjb21wbGV0ZQkqLwogCQl4ZnNfYnVmX3QgKiwJCS8qIGJ1ZmZlciB0byBtYXJrCQkqLwotCQlpbnQsCQkJLyogdXNlIGRhdGEvbG9nIGhlbHBlciB0aHJlYWQuCSovCiAJCWludCk7CQkJLyogcnVuIGNvbXBsZXRpb24gbG9jYWxseSwgb3IgaW4KIAkJCQkJICogYSBoZWxwZXIgdGhyZWFkLgkJKi8KIApAQCAtMzc4LDIxICszNTIsMjEgQEAKICNkZWZpbmUgWEZTX0JVRl9HRVRFUlJPUih4KQkgcGFnZWJ1Zl9nZXRlcnJvcih4KQogI2RlZmluZSBYRlNfQlVGX0lTRVJST1IoeCkJIChwYWdlYnVmX2dldGVycm9yKHgpPzE6MCkKIAotI2RlZmluZSBYRlNfQlVGX0RPTkUoeCkJCSAoKHgpLT5wYl9mbGFncyAmPSB+KFBCRl9QQVJUSUFMfFBCRl9OT05FKSkKLSNkZWZpbmUgWEZTX0JVRl9VTkRPTkUoeCkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9QQVJUSUFMfFBCRl9OT05FKQotI2RlZmluZSBYRlNfQlVGX0lTRE9ORSh4KQkgKCEoUEJGX05PVF9ET05FKHgpKSkKKyNkZWZpbmUgWEZTX0JVRl9ET05FKHgpCQkgKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX0RPTkUpCisjZGVmaW5lIFhGU19CVUZfVU5ET05FKHgpCSAoKHgpLT5wYl9mbGFncyAmPSB+UEJGX0RPTkUpCisjZGVmaW5lIFhGU19CVUZfSVNET05FKHgpCSAoKHgpLT5wYl9mbGFncyAmIFBCRl9ET05FKQogCi0jZGVmaW5lIFhGU19CVUZfQlVTWSh4KQkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9GT1JDRUlPKQotI2RlZmluZSBYRlNfQlVGX1VOQlVTWSh4KQkgKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9GT1JDRUlPKQorI2RlZmluZSBYRlNfQlVGX0JVU1koeCkJCSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIFhGU19CVUZfVU5CVVNZKHgpCSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIFhGU19CVUZfSVNCVVNZKHgpCSAoMSkKIAogI2RlZmluZSBYRlNfQlVGX0FTWU5DKHgpCSAoKHgpLT5wYl9mbGFncyB8PSBQQkZfQVNZTkMpCiAjZGVmaW5lIFhGU19CVUZfVU5BU1lOQyh4KQkgKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9BU1lOQykKICNkZWZpbmUgWEZTX0JVRl9JU0FTWU5DKHgpCSAoKHgpLT5wYl9mbGFncyAmIFBCRl9BU1lOQykKIAotI2RlZmluZSBYRlNfQlVGX0ZMVVNIKHgpCSAoKHgpLT5wYl9mbGFncyB8PSBQQkZfRkxVU0gpCi0jZGVmaW5lIFhGU19CVUZfVU5GTFVTSCh4KQkgKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9GTFVTSCkKLSNkZWZpbmUgWEZTX0JVRl9JU0ZMVVNIKHgpCSAoKHgpLT5wYl9mbGFncyAmIFBCRl9GTFVTSCkKKyNkZWZpbmUgWEZTX0JVRl9PUkRFUkVEKHgpCSAoKHgpLT5wYl9mbGFncyB8PSBQQkZfT1JERVJFRCkKKyNkZWZpbmUgWEZTX0JVRl9VTk9SREVSRUQoeCkJICgoeCktPnBiX2ZsYWdzICY9IH5QQkZfT1JERVJFRCkKKyNkZWZpbmUgWEZTX0JVRl9JU09SREVSRUQoeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX09SREVSRUQpCiAKICNkZWZpbmUgWEZTX0JVRl9TSFVUKHgpCQkgcHJpbnRrKCJYRlNfQlVGX1NIVVQgbm90IGltcGxlbWVudGVkIHlldFxuIikKICNkZWZpbmUgWEZTX0JVRl9VTlNIVVQoeCkJIHByaW50aygiWEZTX0JVRl9VTlNIVVQgbm90IGltcGxlbWVudGVkIHlldFxuIikKQEAgLTQxMiw5ICszODYsNiBAQAogCiAjZGVmaW5lIFhGU19CVUZfQlBfSVNNQVBQRUQoYnApCSAxCiAKLSNkZWZpbmUgWEZTX0JVRl9EQVRBSU8oeCkJKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX0ZTX0RBVEFJT0QpCi0jZGVmaW5lIFhGU19CVUZfVU5EQVRBSU8oeCkJKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9GU19EQVRBSU9EKQotCiAjZGVmaW5lIFhGU19CVUZfSU9ET05FX0ZVTkMoYnVmKQkoYnVmKS0+cGJfaW9kb25lCiAjZGVmaW5lIFhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJ1ZiwgZnVuYykJXAogCQkJKGJ1ZiktPnBiX2lvZG9uZSA9IChmdW5jKQpAQCAtNTEwLDcgKzQ4MSw3IEBACiAJICAgIHBhZ2VidWZfdHJhY2UoYnAsIGlkLCBOVUxMLCAodm9pZCAqKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKIAogI2RlZmluZSB4ZnNfYmlvZG9uZShwYikJCSAgICBcCi0JICAgIHBhZ2VidWZfaW9kb25lKHBiLCAocGItPnBiX2ZsYWdzICYgUEJGX0ZTX0RBVEFJT0QpLCAwKQorCSAgICBwYWdlYnVmX2lvZG9uZShwYiwgMCkKIAogI2RlZmluZSB4ZnNfYmlvbW92ZShwYiwgb2ZmLCBsZW4sIGRhdGEsIHJ3KSBcCiAJICAgIHBhZ2VidWZfaW9tb3ZlKChwYiksIChvZmYpLCAobGVuKSwgKGRhdGEpLCBcCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19jcmVkLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19jcmVkLmgKaW5kZXggMDBjNDU4NC4uNGFmNDkxMCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfY3JlZC5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2NyZWQuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0NSRURfSF9fCiAjZGVmaW5lIF9fWEZTX0NSRURfSF9fCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jCmluZGV4IGYzNzJhMWEuLjgwZWIyNDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jCkBAIC0xLDM1ICsxLDIwIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKQEAgLTQxLDcgKzI2LDcgQEAKICNpbmNsdWRlICJ4ZnNfZXhwb3J0LmgiCiAKIC8qCi0gKiBYRlMgZW5jb2RlIGFuZCBkZWNvZGVzIHRoZSBmaWxlaWQgcG9ydGlvbiBvZiBORlMgZmlsZWhhbmRsZXMKKyAqIFhGUyBlbmNvZGVzIGFuZCBkZWNvZGVzIHRoZSBmaWxlaWQgcG9ydGlvbiBvZiBORlMgZmlsZWhhbmRsZXMKICAqIGl0c2VsZiBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIGdlbmVyaWMgTkZTIGNvZGUgZG8gaXQuICBUaGlzCiAgKiBhbGxvd3MgZmlsZXN5c3RlbXMgd2l0aCA2NCBiaXQgaW5vZGUgbnVtYmVycyB0byBiZSBleHBvcnRlZC4KICAqCkBAIC01MSw3ICszNiw2IEBACiAgKiByZW1haW5zIGluIHRoYXQgY29kZS4KICAqLwogCi0KIFNUQVRJQyBzdHJ1Y3QgZGVudHJ5ICoKIGxpbnZmc19kZWNvZGVfZmgoCiAJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiwKQEAgLTkyLDcgKzc2LDcgQEAKIAkJcCA9IHhmc19maWxlaWRfZGVjb2RlX2ZpZDIocCwgJnBmaWQsIGlzNjQpOwogCQlwYXJlbnQgPSAmcGZpZDsKIAl9Ci0JCisKIAlmaCA9IChfX3UzMiAqKSZpZmlkOwogCXJldHVybiBmaW5kX2V4cG9ydGVkX2RlbnRyeShzYiwgZmgsIHBhcmVudCwgYWNjZXB0YWJsZSwgY29udGV4dCk7CiB9CkBAIC0xMTIsOSArOTYsOCBAQAogCWludAkJCWlzNjQgPSAwOwogI2lmIFhGU19CSUdfSU5VTVMKIAl2ZnNfdAkJCSp2ZnMgPSBMSU5WRlNfR0VUX1ZGUyhpbm9kZS0+aV9zYik7Ci0JeGZzX21vdW50X3QJCSptcCA9IFhGU19WRlNUT00odmZzKTsKLQkKLQlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF8zMkJJVElOT09QVCkpIHsKKworCWlmICghKHZmcy0+dmZzX2ZsYWcgJiBWRlNfMzJCSVRJTk9ERVMpKSB7CiAJCS8qIGZpbGVzeXN0ZW0gbWF5IGNvbnRhaW4gNjRiaXQgaW5vZGUgbnVtYmVycyAqLwogCQlpczY0ID0gWEZTX0ZJTEVJRF9UWVBFXzY0RkxBRzsKIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5oCmluZGV4IDYwYjJhYmEuLmU1YjA1NTkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfRVhQT1JUX0hfXwogI2RlZmluZSBfX1hGU19FWFBPUlRfSF9fCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKaW5kZXggMzg4MTYyMi4uMDYxMTFkMCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwpAQCAtMSwzOSArMSwyNiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2Rpci5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmMKaW5kZXggMDVlYmQzMC4uZjg5MzQwYyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuYwpAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAKICNpbmNsdWRlICJ4ZnMuaCIKQEAgLTExNyw2ICsxMDMsOCBAQAogCiAJaWYgKFZOX0NBQ0hFRCh2cCkpIHsKIAkJZmlsZW1hcF9mZGF0YXdyaXRlKGlwLT5pX21hcHBpbmcpOworCQlpZiAoZmxhZ3MgJiBYRlNfQl9BU1lOQykKKwkJCXJldHVybiAwOwogCQlmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuaAppbmRleCAyZGI5ZGRiLi5hZWU5Y2NkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5oCkBAIC0xLDQ4ICsxLDI5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0jaWZuZGVmCV9fWEZTX1NVQlJfSF9fCi0jZGVmaW5lIF9fWEZTX1NVQlJfSF9fCi0KLS8qCi0gKiBVdGlsaXRpZXMgc2hhcmVkIGFtb25nIGZpbGUgc3lzdGVtIGltcGxlbWVudGF0aW9ucy4KLSAqLworI2lmbmRlZglfX1hGU19GU19TVUJSX0hfXworI2RlZmluZSBfX1hGU19GU19TVUJSX0hfXwogCiBzdHJ1Y3QgY3JlZDsKLQotZXh0ZXJuIGludAlmc19ub2Vycih2b2lkKTsKLWV4dGVybiBpbnQJZnNfbm9zeXModm9pZCk7Ci1leHRlcm4gdm9pZAlmc19ub3ZhbCh2b2lkKTsKLWV4dGVybiB2b2lkCWZzX3Rvc3NwYWdlcyhiaHZfZGVzY190ICosIHhmc19vZmZfdCwgeGZzX29mZl90LCBpbnQpOwotZXh0ZXJuIHZvaWQJZnNfZmx1c2hpbnZhbF9wYWdlcyhiaHZfZGVzY190ICosIHhmc19vZmZfdCwgeGZzX29mZl90LCBpbnQpOwotZXh0ZXJuIGludAlmc19mbHVzaF9wYWdlcyhiaHZfZGVzY190ICosIHhmc19vZmZfdCwgeGZzX29mZl90LCB1aW50NjRfdCwgaW50KTsKK2V4dGVybiBpbnQgIGZzX25vZXJyKHZvaWQpOworZXh0ZXJuIGludCAgZnNfbm9zeXModm9pZCk7CitleHRlcm4gdm9pZCBmc19ub3ZhbCh2b2lkKTsKK2V4dGVybiB2b2lkIGZzX3Rvc3NwYWdlcyhiaHZfZGVzY190ICosIHhmc19vZmZfdCwgeGZzX29mZl90LCBpbnQpOworZXh0ZXJuIHZvaWQgZnNfZmx1c2hpbnZhbF9wYWdlcyhiaHZfZGVzY190ICosIHhmc19vZmZfdCwgeGZzX29mZl90LCBpbnQpOworZXh0ZXJuIGludCAgZnNfZmx1c2hfcGFnZXMoYmh2X2Rlc2NfdCAqLCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCwgdWludDY0X3QsIGludCk7CiAKICNlbmRpZgkvKiBfX1hGU19GU19TVUJSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5jCmluZGV4IGE2ZGE1YjQuLjZlODA4NWYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19nbG9iYWxzLmMKQEAgLTEsNDAgKzEsMjAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBnbG9iYWxzIG5lZWRlZCBieSBYRlMgdGhhdCB3ZXJlIG5vcm1hbGx5IGRlZmluZWQKLSAqIHNvbWV3aGVyZSBlbHNlIGluIElSSVguCi0gKi8KLQogI2luY2x1ZGUgInhmcy5oIgogI2luY2x1ZGUgInhmc19jcmVkLmgiCiAjaW5jbHVkZSAieGZzX3N5c2N0bC5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5oCmluZGV4IGU4MWUyZjMuLmUxYTIyYmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19nbG9iYWxzLmgKQEAgLTEsNDIgKzEsMjMgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19HTE9CQUxTX0hfXwogI2RlZmluZSBfX1hGU19HTE9CQUxTX0hfXwogCi0vKgotICogVGhpcyBmaWxlIGRlY2xhcmVzIGdsb2JhbHMgbmVlZGVkIGJ5IFhGUyB0aGF0IHdlcmUgbm9ybWFsbHkgZGVmaW5lZAotICogc29tZXdoZXJlIGVsc2UgaW4gSVJJWC4KLSAqLwotCiBleHRlcm4gdWludDY0X3QJeGZzX3BhbmljX21hc2s7CQkvKiBzZXQgdG8gY2F1c2UgbW9yZSBwYW5pY3MgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIHhmc19waHlzbWVtOwogZXh0ZXJuIHN0cnVjdCBjcmVkICpzeXNfY3JlZDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCmluZGV4IDZhMzMyNmIuLmI3OGI1ZWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYwpAQCAtMSw2NyArMSw1MiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KICNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2FjbC5oIgogI2luY2x1ZGUgInhmc19jYXAuaCIKICNpbmNsdWRlICJ4ZnNfbWFjLmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogI2luY2x1ZGUgInhmc191dGlscy5oIgogI2luY2x1ZGUgInhmc19kZnJhZy5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCmluZGV4IDQ2MzZiN2YuLmM4M2FlMTUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKQEAgLTEsMzUgKzEsMjAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTM5LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQogI2luY2x1ZGUgInhmcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgogI2luY2x1ZGUgInhmc19mcy5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5oCmluZGV4IGM4NzQ3OTMuLjAxMWMyNzMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmgKQEAgLTEsMzQgKzEsMjQgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KKyNpZm5kZWYgX19YRlNfSU9DVEwzMl9IX18KKyNkZWZpbmUgX19YRlNfSU9DVEwzMl9IX18KIAotbG9uZyBsaW52ZnNfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWxvbmcgbGludmZzX2NvbXBhdF9pbnZpc19pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gbG9uZyBsaW52ZnNfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBsb25nIGxpbnZmc19jb21wYXRfaW52aXNfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkLCB1bnNpZ25lZCBsb25nKTsKKworI2VuZGlmIC8qIF9fWEZTX0lPQ1RMMzJfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKaW5kZXggNzc3MDhhOC4uMTQyMTVhNyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwpAQCAtMSwzOSArMSwyNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCiAjaW5jbHVkZSAieGZzX2ZzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCkBAIC00MywxOCArMjksMTcgQEAKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCkBAIC02OSw2ICs1NCwxMzcgQEAKICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAKKy8qCisgKiBDaGFuZ2UgdGhlIHJlcXVlc3RlZCB0aW1lc3RhbXAgaW4gdGhlIGdpdmVuIGlub2RlLgorICogV2UgZG9uJ3QgbG9jayBhY3Jvc3MgdGltZXN0YW1wIHVwZGF0ZXMsIGFuZCB3ZSBkb24ndCBsb2cgdGhlbSBidXQKKyAqIHdlIGRvIHJlY29yZCB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzIGRpcnR5IGluZm9ybWF0aW9uIGluIGNvcmUuCisgKgorICogTk9URSAtLSBjYWxsZXJzIE1VU1QgY29tYmluZSBYRlNfSUNIR1RJTUVfTU9EIG9yIFhGU19JQ0hHVElNRV9DSEcKKyAqCQl3aXRoIFhGU19JQ0hHVElNRV9BQ0MgdG8gYmUgc3VyZSB0aGF0IGFjY2VzcyB0aW1lCisgKgkJdXBkYXRlIHdpbGwgdGFrZS4gIENhbGxpbmcgZmlyc3Qgd2l0aCBYRlNfSUNIR1RJTUVfQUNDCisgKgkJYW5kIHRoZW4gWEZTX0lDSEdUSU1FX01PRCBtYXkgZmFpbCB0byBtb2RpZnkgdGhlIGFjY2VzcworICoJCXRpbWVzdGFtcCBpZiB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkIG5vYWNjdG0uCisgKi8KK3ZvaWQKK3hmc19pY2hndGltZSgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJaW50CQlmbGFncykKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gTElOVkZTX0dFVF9JUChYRlNfSVRPVihpcCkpOworCXRpbWVzcGVjX3QJdHY7CisKKwkvKgorCSAqIFdlJ3JlIG5vdCBzdXBwb3NlZCB0byBjaGFuZ2UgdGltZXN0YW1wcyBpbiByZWFkb25seS1tb3VudGVkCisJICogZmlsZXN5c3RlbXMuICBUaHJvdyBpdCBhd2F5IGlmIGFueW9uZSBhc2tzIHVzLgorCSAqLworCWlmICh1bmxpa2VseShJU19SRE9OTFkoaW5vZGUpKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBEb24ndCB1cGRhdGUgYWNjZXNzIHRpbWVzdGFtcHMgb24gcmVhZHMgaWYgbW91bnRlZCAibm9hdGltZSIuCisJICogVGhyb3cgaXQgYXdheSBpZiBhbnlvbmUgYXNrcyB1cy4KKwkgKi8KKwlpZiAodW5saWtlbHkoCisJICAgIChpcC0+aV9tb3VudC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0FUSU1FIHx8IElTX05PQVRJTUUoaW5vZGUpKSAmJgorCSAgICAoZmxhZ3MgJiAoWEZTX0lDSEdUSU1FX0FDQ3xYRlNfSUNIR1RJTUVfTU9EfFhGU19JQ0hHVElNRV9DSEcpKSA9PQorCQkJWEZTX0lDSEdUSU1FX0FDQykpCisJCXJldHVybjsKKworCW5hbm90aW1lKCZ0dik7CisJaWYgKGZsYWdzICYgWEZTX0lDSEdUSU1FX01PRCkgeworCQlpbm9kZS0+aV9tdGltZSA9IHR2OworCQlpcC0+aV9kLmRpX210aW1lLnRfc2VjID0gKF9faW50MzJfdCl0di50dl9zZWM7CisJCWlwLT5pX2QuZGlfbXRpbWUudF9uc2VjID0gKF9faW50MzJfdCl0di50dl9uc2VjOworCX0KKwlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfQUNDKSB7CisJCWlub2RlLT5pX2F0aW1lID0gdHY7CisJCWlwLT5pX2QuZGlfYXRpbWUudF9zZWMgPSAoX19pbnQzMl90KXR2LnR2X3NlYzsKKwkJaXAtPmlfZC5kaV9hdGltZS50X25zZWMgPSAoX19pbnQzMl90KXR2LnR2X25zZWM7CisJfQorCWlmIChmbGFncyAmIFhGU19JQ0hHVElNRV9DSEcpIHsKKwkJaW5vZGUtPmlfY3RpbWUgPSB0djsKKwkJaXAtPmlfZC5kaV9jdGltZS50X3NlYyA9IChfX2ludDMyX3QpdHYudHZfc2VjOworCQlpcC0+aV9kLmRpX2N0aW1lLnRfbnNlYyA9IChfX2ludDMyX3QpdHYudHZfbnNlYzsKKwl9CisKKwkvKgorCSAqIFdlIHVwZGF0ZSB0aGUgaV91cGRhdGVfY29yZSBmaWVsZCBfYWZ0ZXJfIGNoYW5naW5nCisJICogdGhlIHRpbWVzdGFtcHMgaW4gb3JkZXIgdG8gY29vcmRpbmF0ZSBwcm9wZXJseSB3aXRoCisJICogeGZzX2lmbHVzaCgpIHNvIHRoYXQgd2UgZG9uJ3QgbG9zZSB0aW1lc3RhbXAgdXBkYXRlcy4KKwkgKiBUaGlzIGtlZXBzIHVzIGZyb20gaGF2aW5nIHRvIGhvbGQgdGhlIGlub2RlIGxvY2sKKwkgKiB3aGlsZSBkb2luZyB0aGlzLiAgV2UgdXNlIHRoZSBTWU5DSFJPTklaRSBtYWNybyB0bworCSAqIGVuc3VyZSB0aGF0IHRoZSBjb21waWxlciBkb2VzIG5vdCByZW9yZGVyIHRoZSB1cGRhdGUKKwkgKiBvZiBpX3VwZGF0ZV9jb3JlIGFib3ZlIHRoZSB0aW1lc3RhbXAgdXBkYXRlcyBhYm92ZS4KKwkgKi8KKwlTWU5DSFJPTklaRSgpOworCWlwLT5pX3VwZGF0ZV9jb3JlID0gMTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTE9DSykpCisJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7Cit9CisKKy8qCisgKiBWYXJpYW50IG9uIHRoZSBhYm92ZSB3aGljaCBhdm9pZHMgcXVlcnlpbmcgdGhlIHN5c3RlbSBjbG9jaworICogaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZSBrbm93IHRoZSBMaW51eCBpbm9kZSB0aW1lc3RhbXBzIGhhdmUKKyAqIGp1c3QgYmVlbiB1cGRhdGVkIChhbmQgc28gd2UgY2FuIHVwZGF0ZSBvdXIgaW5vZGUgY2hlYXBseSkuCisgKiBXZSBhbHNvIHNraXAgdGhlIHJlYWRvbmx5IGFuZCBub2F0aW1lIGNoZWNrcyBoZXJlLCB0aGV5IGFyZQorICogYWxzbyBjYXRlcmVkIGZvciBhbHJlYWR5LgorICovCit2b2lkCit4ZnNfaWNoZ3RpbWVfZmFzdCgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJc3RydWN0IGlub2RlCSppbm9kZSwKKwlpbnQJCWZsYWdzKQoreworCXRpbWVzcGVjX3QJKnR2cDsKKworCS8qCisJICogV2UncmUgbm90IHN1cHBvc2VkIHRvIGNoYW5nZSB0aW1lc3RhbXBzIGluIHJlYWRvbmx5LW1vdW50ZWQKKwkgKiBmaWxlc3lzdGVtcy4gIFRocm93IGl0IGF3YXkgaWYgYW55b25lIGFza3MgdXMuCisJICovCisJaWYgKHVubGlrZWx5KElTX1JET05MWShpbm9kZSkpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIERvbid0IHVwZGF0ZSBhY2Nlc3MgdGltZXN0YW1wcyBvbiByZWFkcyBpZiBtb3VudGVkICJub2F0aW1lIi4KKwkgKiBUaHJvdyBpdCBhd2F5IGlmIGFueW9uZSBhc2tzIHVzLgorCSAqLworCWlmICh1bmxpa2VseSgKKwkgICAgKGlwLT5pX21vdW50LT5tX2ZsYWdzICYgWEZTX01PVU5UX05PQVRJTUUgfHwgSVNfTk9BVElNRShpbm9kZSkpICYmCisJICAgICgoZmxhZ3MgJiAoWEZTX0lDSEdUSU1FX0FDQ3xYRlNfSUNIR1RJTUVfTU9EfFhGU19JQ0hHVElNRV9DSEcpKSA9PQorCQkJWEZTX0lDSEdUSU1FX0FDQykpKQorCQlyZXR1cm47CisKKwlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfTU9EKSB7CisJCXR2cCA9ICZpbm9kZS0+aV9tdGltZTsKKwkJaXAtPmlfZC5kaV9tdGltZS50X3NlYyA9IChfX2ludDMyX3QpdHZwLT50dl9zZWM7CisJCWlwLT5pX2QuZGlfbXRpbWUudF9uc2VjID0gKF9faW50MzJfdCl0dnAtPnR2X25zZWM7CisJfQorCWlmIChmbGFncyAmIFhGU19JQ0hHVElNRV9BQ0MpIHsKKwkJdHZwID0gJmlub2RlLT5pX2F0aW1lOworCQlpcC0+aV9kLmRpX2F0aW1lLnRfc2VjID0gKF9faW50MzJfdCl0dnAtPnR2X3NlYzsKKwkJaXAtPmlfZC5kaV9hdGltZS50X25zZWMgPSAoX19pbnQzMl90KXR2cC0+dHZfbnNlYzsKKwl9CisJaWYgKGZsYWdzICYgWEZTX0lDSEdUSU1FX0NIRykgeworCQl0dnAgPSAmaW5vZGUtPmlfY3RpbWU7CisJCWlwLT5pX2QuZGlfY3RpbWUudF9zZWMgPSAoX19pbnQzMl90KXR2cC0+dHZfc2VjOworCQlpcC0+aV9kLmRpX2N0aW1lLnRfbnNlYyA9IChfX2ludDMyX3QpdHZwLT50dl9uc2VjOworCX0KKworCS8qCisJICogV2UgdXBkYXRlIHRoZSBpX3VwZGF0ZV9jb3JlIGZpZWxkIF9hZnRlcl8gY2hhbmdpbmcKKwkgKiB0aGUgdGltZXN0YW1wcyBpbiBvcmRlciB0byBjb29yZGluYXRlIHByb3Blcmx5IHdpdGgKKwkgKiB4ZnNfaWZsdXNoKCkgc28gdGhhdCB3ZSBkb24ndCBsb3NlIHRpbWVzdGFtcCB1cGRhdGVzLgorCSAqIFRoaXMga2VlcHMgdXMgZnJvbSBoYXZpbmcgdG8gaG9sZCB0aGUgaW5vZGUgbG9jaworCSAqIHdoaWxlIGRvaW5nIHRoaXMuICBXZSB1c2UgdGhlIFNZTkNIUk9OSVpFIG1hY3JvIHRvCisJICogZW5zdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHJlb3JkZXIgdGhlIHVwZGF0ZQorCSAqIG9mIGlfdXBkYXRlX2NvcmUgYWJvdmUgdGhlIHRpbWVzdGFtcCB1cGRhdGVzIGFib3ZlLgorCSAqLworCVNZTkNIUk9OSVpFKCk7CisJaXAtPmlfdXBkYXRlX2NvcmUgPSAxOworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9MT0NLKSkKKwkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKK30KKwogCiAvKgogICogUHVsbCB0aGUgbGluayBjb3VudCBhbmQgc2l6ZSB1cCBmcm9tIHRoZSB4ZnMgaW5vZGUgdG8gdGhlIGxpbnV4IGlub2RlCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmgKaW5kZXggNmE2OWE2Mi4uZWU3ODRiNiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0lPUFNfSF9fCiAjZGVmaW5lIF9fWEZTX0lPUFNfSF9fCkBAIC00OCw0ICszNCw4IEBACiBleHRlcm4gaW50IHhmc19pb2N0bChzdHJ1Y3QgYmh2X2Rlc2MgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CiAKK3N0cnVjdCB4ZnNfaW5vZGU7CitleHRlcm4gdm9pZCB4ZnNfaWNoZ3RpbWUoc3RydWN0IHhmc19pbm9kZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgeGZzX2ljaGd0aW1lX2Zhc3Qoc3RydWN0IHhmc19pbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKKwogI2VuZGlmIC8qIF9fWEZTX0lPUFNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaAppbmRleCA2OGM1ZDg4Li40NGZlZDEwIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfTElOVVhfXwogI2RlZmluZSBfX1hGU19MSU5VWF9fCkBAIC0xOTcsMTAgKzE4Myw2IEBACiAvKiBieXRlcyB0byBjbGlja3MgKi8KICNkZWZpbmUgYnRvYyh4KSAgICAgICAgICgoKF9fcHN1bnNpZ25lZF90KSh4KSsoTkJQQy0xKSk+PkJQQ1NISUZUKQogCi0jaWZuZGVmIENFTExfQ0FQQUJMRQotI2RlZmluZSBGU0NfTk9USUZZX05BTUVfQ0hBTkdFRCh2cCkKLSNlbmRpZgotCiAjaWZuZGVmIEVOT0FUVFIKICNkZWZpbmUgRU5PQVRUUgkJRU5PREFUQQkJLyogQXR0cmlidXRlIG5vdCBmb3VuZCAqLwogI2VuZGlmCkBAIC0yMzUsMzAgKzIxNywxOCBAQAogI2RlZmluZSBRX1hTRVRQUUxJTQlYUU1fQ01EKDEwKQkvKiBzZXQgcHJvamVjdHMgZGlzayBsaW1pdHMgKi8KICNkZWZpbmUgUV9YR0VUUFFVT1RBCVhRTV9DTUQoMTEpCS8qIGdldCBwcm9qZWN0cyBkaXNrIGxpbWl0cyAqLwogCi0vKiBJUklYIHVzZXMgYSBkeW5hbWljIHNpemluZyBhbGdvcml0aG0gKG5kcXVvdCA9IDIwMCArIG51bXByb2NzKjIpICovCi0vKiB3ZSBtYXkgd2VsbCBuZWVkIHRvIGZpbmUtdHVuZSB0aGlzIGlmIGl0IGV2ZXIgYmVjb21lcyBhbiBpc3N1ZS4gICovCi0jZGVmaW5lIERRVU9UX01BWF9IRVVSSVNUSUMJMTAyNAkvKiBOUl9EUVVPVFMgKi8KLSNkZWZpbmUgbmRxdW90CQkJRFFVT1RfTUFYX0hFVVJJU1RJQwotCi0vKiBJUklYIHVzZXMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgbmFtZSBjYWNoZSB0byBndWVzcyBhIGdvb2QgdmFsdWUgKi8KLS8qIC0gdGhpcyBpc24ndCB0aGUgc2FtZSBidXQgaXMgYSBnb29kIGVub3VnaCBzdGFydGluZyBwb2ludCBmb3Igbm93LiAqLwotI2RlZmluZSBEUVVPVF9IQVNIX0hFVVJJU1RJQwlmaWxlc19zdGF0Lm5yX2ZpbGVzCi0KLS8qIElSSVggaW5vZGVzIG1haW50YWluIHRoZSBwcm9qZWN0IElEIGFsc28sIHplcm8gdGhpcyBmaWVsZCBvbiBMaW51eCAqLwotI2RlZmluZSBERUZBVUxUX1BST0pJRAkwCi0jZGVmaW5lIGRmbHRwcmlkCURFRkFVTFRfUFJPSklECi0KKyNkZWZpbmUgZGZsdHByaWQJMAogI2RlZmluZSBNQVhQQVRITEVOCTEwMjQKIAogI2RlZmluZSBNSU4oYSxiKQkobWluKGEsYikpCiAjZGVmaW5lIE1BWChhLGIpCShtYXgoYSxiKSkKICNkZWZpbmUgaG93bWFueSh4LCB5KQkoKCh4KSsoKHkpLTEpKS8oeSkpCiAjZGVmaW5lIHJvdW5kdXAoeCwgeSkJKCgoKHgpKygoeSktMSkpLyh5KSkqKHkpKQotI2RlZmluZSBxc29ydChhLG4scyxmbikJc29ydChhLG4scyxmbixOVUxMKQogCiAvKgogICogVmFyaW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgY2FsbHMgdGhhdCBkb24ndCBmaXQgYW55d2hlcmUgZWxzZQogICovCisjZGVmaW5lIHhmc19zb3J0KGEsbixzLGZuKQlzb3J0KGEsbixzLGZuLE5VTEwpCiAjZGVmaW5lIHhmc19zdGFja190cmFjZSgpCWR1bXBfc3RhY2soKQogI2RlZmluZSB4ZnNfaXRydW5jYXRlX2RhdGEoaXAsIG9mZikJXAogCSgtdm10cnVuY2F0ZShMSU5WRlNfR0VUX0lQKFhGU19JVE9WKGlwKSksIChvZmYpKSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKaW5kZXggM2I1ZmFiZS4uMjc5ZTliYyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKQEAgLTEsNDQgKzEsMjUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotLyoKLSAqICBmcy94ZnMvbGludXgveGZzX2xydy5jIChMaW51eCBSZWFkIFdyaXRlIHN0dWZmKQotICoKLSAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KICNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKQEAgLTQ4LDE4ICsyOSwxNyBAQAogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKQEAgLTMwMiw3ICsyODIsNyBAQAogCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CiAKIAlpZiAobGlrZWx5KCEoaW9mbGFncyAmIElPX0lOVklTKSkpCi0JCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX0FDQyk7CisJCXhmc19pY2hndGltZV9mYXN0KGlwLCBpbm9kZSwgWEZTX0lDSEdUSU1FX0FDQyk7CiAKIHVubG9ja19pc2VtOgogCWlmICh1bmxpa2VseShpb2ZsYWdzICYgSU9fSVNESVJFQ1QpKQpAQCAtMzY3LDcgKzM0Nyw3IEBACiAJCVhGU19TVEFUU19BREQoeHNfcmVhZF9ieXRlcywgcmV0KTsKIAogCWlmIChsaWtlbHkoIShpb2ZsYWdzICYgSU9fSU5WSVMpKSkKLQkJeGZzX2ljaGd0aW1lKGlwLCBYRlNfSUNIR1RJTUVfQUNDKTsKKwkJeGZzX2ljaGd0aW1lX2Zhc3QoaXAsIExJTlZGU19HRVRfSVAodnApLCBYRlNfSUNIR1RJTUVfQUNDKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03MzIsMTUgKzcxMiwxMCBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBPbiBMaW51eCwgZ2VuZXJpY19maWxlX3dyaXRlIHVwZGF0ZXMgdGhlIHRpbWVzIGV2ZW4gaWYKLQkgKiBubyBkYXRhIGlzIGNvcGllZCBpbiBzbyBsb25nIGFzIHRoZSB3cml0ZSBoYWQgYSBzaXplLgotCSAqCi0JICogV2UgbXVzdCB1cGRhdGUgeGZzJyB0aW1lcyBzaW5jZSByZXZhbGlkYXRlIHdpbGwgb3ZlcmNvcHkgeGZzLgotCSAqLwotCWlmICghKGlvZmxhZ3MgJiBJT19JTlZJUykpIHsKLQkJeGZzX2ljaGd0aW1lKHhpcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOworCWlmIChsaWtlbHkoIShpb2ZsYWdzICYgSU9fSU5WSVMpKSkgewogCQlpbm9kZV91cGRhdGVfdGltZShpbm9kZSwgMSk7CisJCXhmc19pY2hndGltZV9mYXN0KHhpcCwgaW5vZGUsCisJCQkJICBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmgKaW5kZXggNjI5NGRjZGIuLjM4ODY0YTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfTFJXX0hfXwogI2RlZmluZSBfX1hGU19MUldfSF9fCkBAIC0xMDcsOSArOTMsNCBAQAogCiBleHRlcm4gaW50IHhmc19kZXZfaXNfcmVhZF9vbmx5KHN0cnVjdCB4ZnNfbW91bnQgKiwgY2hhciAqKTsKIAotI2RlZmluZSBYRlNfRlNCX1RPX0RCX0lPKGlvLGZzYikgXAotCQkoKChpbyktPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgPyBcCi0JCSBYRlNfRlNCX1RPX0JCKChpbyktPmlvX21vdW50LCAoZnNiKSkgOiBcCi0JCSBYRlNfRlNCX1RPX0RBRERSKChpbyktPmlvX21vdW50LCAoZnNiKSkpCi0KICNlbmRpZgkvKiBfX1hGU19MUldfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuYwppbmRleCBhYWY1ZGRiLi42YzQwYTc0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmMKQEAgLTEsMzUgKzEsMjAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuaAppbmRleCAzZjc1NmE2Li41MDAyN2M0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX1NUQVRTX0hfXwogI2RlZmluZSBfX1hGU19TVEFUU19IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IDIzMDI0NTQuLjYxMTZiNWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwpAQCAtMSw2MCArMSw0NSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCiAjaW5jbHVkZSAieGZzX2NsbnQuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19hbGxvYy5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKQEAgLTE4OSw3ICsxNzQsNyBAQAogCQlicmVhazsKIAl9CiAKLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWlub2RlLT5pX2Jsa3NpemUgPSB4ZnNfcHJlZmVycmVkX2lvc2l6ZShtcCk7CiAJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGlwLT5pX2QuZGlfZ2VuOwogCWlfc2l6ZV93cml0ZShpbm9kZSwgaXAtPmlfZC5kaV9zaXplKTsKIAlpbm9kZS0+aV9ibG9ja3MgPQpAQCAtMjc4LDYgKzI2Myw3MiBAQAogCQljbG9zZV9iZGV2X2V4Y2woYmRldik7CiB9CiAKKy8qCisgKiBUcnkgdG8gd3JpdGUgb3V0IHRoZSBzdXBlcmJsb2NrIHVzaW5nIGJhcnJpZXJzLgorICovCitTVEFUSUMgaW50Cit4ZnNfYmFycmllcl90ZXN0KAorCXhmc19tb3VudF90CSptcCkKK3sKKwl4ZnNfYnVmX3QJKnNicCA9IHhmc19nZXRzYihtcCwgMCk7CisJaW50CQllcnJvcjsKKworCVhGU19CVUZfVU5ET05FKHNicCk7CisJWEZTX0JVRl9VTlJFQUQoc2JwKTsKKwlYRlNfQlVGX1VOREVMQVlXUklURShzYnApOworCVhGU19CVUZfV1JJVEUoc2JwKTsKKwlYRlNfQlVGX1VOQVNZTkMoc2JwKTsKKwlYRlNfQlVGX09SREVSRUQoc2JwKTsKKworCXhmc2Jkc3RyYXQobXAsIHNicCk7CisJZXJyb3IgPSB4ZnNfaW93YWl0KHNicCk7CisKKwkvKgorCSAqIENsZWFyIGFsbCB0aGUgZmxhZ3Mgd2Ugc2V0IGFuZCBwb3NzaWJsZSBlcnJvciBzdGF0ZSBpbiB0aGUKKwkgKiBidWZmZXIuICBXZSBvbmx5IGRpZCB0aGUgd3JpdGUgdG8gdHJ5IG91dCB3aGV0aGVyIGJhcnJpZXJzCisJICogd29ya2VkIGFuZCBzaG91bGRuJ3QgbGVhdmUgYW55IHRyYWNlcyBpbiB0aGUgc3VwZXJibG9jaworCSAqIGJ1ZmZlci4KKwkgKi8KKwlYRlNfQlVGX0RPTkUoc2JwKTsKKwlYRlNfQlVGX0VSUk9SKHNicCwgMCk7CisJWEZTX0JVRl9VTk9SREVSRUQoc2JwKTsKKworCXhmc19idWZfcmVsc2Uoc2JwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3ZvaWQKK3hmc19tb3VudGZzX2NoZWNrX2JhcnJpZXJzKHhmc19tb3VudF90ICptcCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAobXAtPm1fbG9nZGV2X3RhcmdwICE9IG1wLT5tX2RkZXZfdGFyZ3ApIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfTk9URSwgbXAsCisJCSAgIkRpc2FibGluZyBiYXJyaWVycywgbm90IHN1cHBvcnRlZCB3aXRoIGV4dGVybmFsIGxvZyBkZXZpY2UiKTsKKwkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOworCX0KKworCWlmIChtcC0+bV9kZGV2X3RhcmdwLT5wYnJfYmRldi0+YmRfZGlzay0+cXVldWUtPm9yZGVyZWQgPT0KKwkJCQkJUVVFVUVfT1JERVJFRF9OT05FKSB7CisJCXhmc19mc19jbW5fZXJyKENFX05PVEUsIG1wLAorCQkgICJEaXNhYmxpbmcgYmFycmllcnMsIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgZGV2aWNlIik7CisJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQkFSUklFUjsKKwl9CisKKwllcnJvciA9IHhmc19iYXJyaWVyX3Rlc3QobXApOworCWlmIChlcnJvcikgeworCQl4ZnNfZnNfY21uX2VycihDRV9OT1RFLCBtcCwKKwkJICAiRGlzYWJsaW5nIGJhcnJpZXJzLCB0cmlhbCBiYXJyaWVyIHdyaXRlIGZhaWxlZCIpOworCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0JBUlJJRVI7CisJfQorfQorCit2b2lkCit4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKAorCXhmc19idWZ0YXJnX3QJCSpidWZ0YXJnKQoreworCWJsa2Rldl9pc3N1ZV9mbHVzaChidWZ0YXJnLT5wYnJfYmRldiwgTlVMTCk7Cit9CiAKIFNUQVRJQyBzdHJ1Y3QgaW5vZGUgKgogbGludmZzX2FsbG9jX2lub2RlKApAQCAtNzAxLDYgKzc1MiwxOCBAQAogfQogCiBTVEFUSUMgaW50CitsaW52ZnNfcXVvdGFzeW5jKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCisJaW50CQkJdHlwZSkKK3sKKwlzdHJ1Y3QgdmZzCQkqdmZzcCA9IExJTlZGU19HRVRfVkZTKHNiKTsKKwlpbnQJCQllcnJvcjsKKworCVZGU19RVU9UQUNUTCh2ZnNwLCBRX1hRVU9UQVNZTkMsIDAsIChjYWRkcl90KU5VTEwsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CiBsaW52ZnNfZ2V0eHN0YXRlKAogCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCiAJc3RydWN0IGZzX3F1b3RhX3N0YXQJKmZxcykKQEAgLTg2OCw2ICs5MzEsNyBAQAogfTsKIAogU1RBVElDIHN0cnVjdCBxdW90YWN0bF9vcHMgbGludmZzX3FvcHMgPSB7CisJLnF1b3RhX3N5bmMJCT0gbGludmZzX3F1b3Rhc3luYywKIAkuZ2V0X3hzdGF0ZQkJPSBsaW52ZnNfZ2V0eHN0YXRlLAogCS5zZXRfeHN0YXRlCQk9IGxpbnZmc19zZXR4c3RhdGUsCiAJLmdldF94cXVvdGEJCT0gbGludmZzX2dldHhxdW90YSwKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCmluZGV4IGVjN2UwMDMuLmRmNTk0MDggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19TVVBFUl9IX18KICNkZWZpbmUgX19YRlNfU1VQRVJfSF9fCkBAIC0xMzIsNiArMTE4LDcgQEAKIGV4dGVybiBpbnQgIHhmc19ibGtkZXZfZ2V0KHN0cnVjdCB4ZnNfbW91bnQgKiwgY29uc3QgY2hhciAqLAogCQkJCXN0cnVjdCBibG9ja19kZXZpY2UgKiopOwogZXh0ZXJuIHZvaWQgeGZzX2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIHhmc19ibGtkZXZfaXNzdWVfZmx1c2goc3RydWN0IHhmc19idWZ0YXJnICopOwogCiBleHRlcm4gc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGxpbnZmc19leHBvcnRfb3BzOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5jCmluZGV4IDBkYzAxMDMuLmEwMjU2NDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5jCkBAIC0xLDQ0ICsxLDI2IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfcncuaCIKICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAKLQogc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICp4ZnNfdGFibGVfaGVhZGVyOwogCi0KICNpZmRlZiBDT05GSUdfUFJPQ19GUwogU1RBVElDIGludAogeGZzX3N0YXRzX2NsZWFyX3Byb2NfaGFuZGxlcigKQEAgLTc2LDcgKzU4LDcgQEAKIFNUQVRJQyBjdGxfdGFibGUgeGZzX3RhYmxlW10gPSB7CiAJe1hGU19SRVNUUklDVF9DSE9XTiwgInJlc3RyaWN0X2Nob3duIiwgJnhmc19wYXJhbXMucmVzdHJpY3RfY2hvd24udmFsLAogCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCi0JJnN5c2N0bF9pbnR2ZWMsIE5VTEwsIAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLAogCSZ4ZnNfcGFyYW1zLnJlc3RyaWN0X2Nob3duLm1pbiwgJnhmc19wYXJhbXMucmVzdHJpY3RfY2hvd24ubWF4fSwKIAogCXtYRlNfU0dJRF9JTkhFUklULCAiaXJpeF9zZ2lkX2luaGVyaXQiLCAmeGZzX3BhcmFtcy5zZ2lkX2luaGVyaXQudmFsLApAQCAtODYsMjIgKzY4LDIyIEBACiAKIAl7WEZTX1NZTUxJTktfTU9ERSwgImlyaXhfc3ltbGlua19tb2RlIiwgJnhmc19wYXJhbXMuc3ltbGlua19tb2RlLnZhbCwKIAlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAotCSZzeXNjdGxfaW50dmVjLCBOVUxMLCAKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwKIAkmeGZzX3BhcmFtcy5zeW1saW5rX21vZGUubWluLCAmeGZzX3BhcmFtcy5zeW1saW5rX21vZGUubWF4fSwKIAogCXtYRlNfUEFOSUNfTUFTSywgInBhbmljX21hc2siLCAmeGZzX3BhcmFtcy5wYW5pY19tYXNrLnZhbCwKIAlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAotCSZzeXNjdGxfaW50dmVjLCBOVUxMLCAKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwKIAkmeGZzX3BhcmFtcy5wYW5pY19tYXNrLm1pbiwgJnhmc19wYXJhbXMucGFuaWNfbWFzay5tYXh9LAogCiAJe1hGU19FUlJMRVZFTCwgImVycm9yX2xldmVsIiwgJnhmc19wYXJhbXMuZXJyb3JfbGV2ZWwudmFsLAogCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCi0JJnN5c2N0bF9pbnR2ZWMsIE5VTEwsIAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLAogCSZ4ZnNfcGFyYW1zLmVycm9yX2xldmVsLm1pbiwgJnhmc19wYXJhbXMuZXJyb3JfbGV2ZWwubWF4fSwKIAogCXtYRlNfU1lOQ0RfVElNRVIsICJ4ZnNzeW5jZF9jZW50aXNlY3MiLCAmeGZzX3BhcmFtcy5zeW5jZF90aW1lci52YWwsCiAJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKLQkmc3lzY3RsX2ludHZlYywgTlVMTCwgCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsCiAJJnhmc19wYXJhbXMuc3luY2RfdGltZXIubWluLCAmeGZzX3BhcmFtcy5zeW5jZF90aW1lci5tYXh9LAogCiAJe1hGU19JTkhFUklUX1NZTkMsICJpbmhlcml0X3N5bmMiLCAmeGZzX3BhcmFtcy5pbmhlcml0X3N5bmMudmFsLApAQCAtMTE4LDcgKzEwMCw3IEBACiAJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKIAkmc3lzY3RsX2ludHZlYywgTlVMTCwKIAkmeGZzX3BhcmFtcy5pbmhlcml0X25vYXRpbS5taW4sICZ4ZnNfcGFyYW1zLmluaGVyaXRfbm9hdGltLm1heH0sCi0JCisKIAl7WEZTX0JVRl9USU1FUiwgInhmc2J1ZmRfY2VudGlzZWNzIiwgJnhmc19wYXJhbXMueGZzX2J1Zl90aW1lci52YWwsCiAJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKIAkmc3lzY3RsX2ludHZlYywgTlVMTCwKQEAgLTEzNiwxNCArMTE4LDE0IEBACiAKIAl7WEZTX1JPVE9SU1RFUCwgInJvdG9yc3RlcCIsICZ4ZnNfcGFyYW1zLnJvdG9yc3RlcC52YWwsCiAJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKLQkmc3lzY3RsX2ludHZlYywgTlVMTCwgCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsCiAJJnhmc19wYXJhbXMucm90b3JzdGVwLm1pbiwgJnhmc19wYXJhbXMucm90b3JzdGVwLm1heH0sCiAKIAkvKiBwbGVhc2Uga2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5ICovCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAl7WEZTX1NUQVRTX0NMRUFSLCAic3RhdHNfY2xlYXIiLCAmeGZzX3BhcmFtcy5zdGF0c19jbGVhci52YWwsCiAJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZ4ZnNfc3RhdHNfY2xlYXJfcHJvY19oYW5kbGVyLAotCSZzeXNjdGxfaW50dmVjLCBOVUxMLCAKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwKIAkmeGZzX3BhcmFtcy5zdGF0c19jbGVhci5taW4sICZ4ZnNfcGFyYW1zLnN0YXRzX2NsZWFyLm1heH0sCiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuaAppbmRleCBhMzlhOTUwLi5iYzhjMTFmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuaApAQCAtMSwzNSArMSwyMCBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaWZuZGVmIF9fWEZTX1NZU0NUTF9IX18KICNkZWZpbmUgX19YRlNfU1lTQ1RMX0hfXwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192ZXJzaW9uLmggYi9mcy94ZnMvbGludXgtMi42L3hmc192ZXJzaW9uLmgKaW5kZXggOTZmOTYzOS4uZjhkMjc5ZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmVyc2lvbi5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3ZlcnNpb24uaApAQCAtMSwzNCArMSwyMiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCisjaWZuZGVmIF9fWEZTX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fWEZTX1ZFUlNJT05fSF9fCiAKIC8qCiAgKiBEdW1teSBmaWxlIHRoYXQgY2FuIGNvbnRhaW4gYSB0aW1lc3RhbXAgdG8gcHV0IGludG8gdGhlCkBAIC0zNiw5ICsyNCw2IEBACiAgKiBydW5uaW5nCiAgKi8KIAotI2lmbmRlZiBfX1hGU19WRVJTSU9OX0hfXwotI2RlZmluZSBfX1hGU19WRVJTSU9OX0hfXwotCiAjZGVmaW5lIFhGU19WRVJTSU9OX1NUUklORyAiU0dJIFhGUyIKIAogI2VuZGlmIC8qIF9fWEZTX1ZFUlNJT05fSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5jCmluZGV4IDM0Y2M5MDIuLmM4NTVkNjIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5jCkBAIC0xLDM4ICsxLDIyIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKICNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCiAjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCiAjaW5jbHVkZSAieGZzX2NsbnQuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmgKaW5kZXggZjBhYjU3NGYuLjU3Y2FmOWUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX1ZGU19IX18KICNkZWZpbmUgX19YRlNfVkZTX0hfXwpAQCAtOTUsNiArODEsNyBAQAogI2RlZmluZSBWRlNfUkRPTkxZCQkweDAwMDEJLyogcmVhZC1vbmx5IHZmcyAqLwogI2RlZmluZSBWRlNfR1JQSUQJCTB4MDAwMgkvKiBncm91cC1JRCBhc3NpZ25lZCBmcm9tIGRpcmVjdG9yeSAqLwogI2RlZmluZSBWRlNfRE1JCQkJMHgwMDA0CS8qIGZpbGVzeXN0ZW0gaGFzIHRoZSBETUkgZW5hYmxlZCAqLworI2RlZmluZSBWRlNfMzJCSVRJTk9ERVMJCTB4MDAwOAkvKiBkbyBub3QgdXNlIGludW1zIGFib3ZlIDMyIGJpdHMgKi8KICNkZWZpbmUgVkZTX0VORAkJCTB4MDAwOAkvKiBtYXggZmxhZyAqLwogCiAjZGVmaW5lIFNZTkNfQVRUUgkJMHgwMDAxCS8qIHN5bmMgYXR0cmlidXRlcyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMKaW5kZXggMjY4ZjQ1Yi4uZTliYmNiNCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jCkBAIC0xLDM4ICsxLDIyIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgogCi0KIHVpbnQ2NF90IHZuX2dlbmVyYXRpb247CQkvKiB2bm9kZSBnZW5lcmF0aW9uIG51bWJlciAqLwogREVGSU5FX1NQSU5MT0NLKHZudW1iZXJfbG9jayk7CiAKQEAgLTQ0LDcgKzI4LDYgQEAKICNkZWZpbmUgdnB0b3N5bmModikgICAgICAgICAgICAgKCZ2c3luY1soKHVuc2lnbmVkIGxvbmcpdikgJSBOVlNZTkNdKQogU1RBVElDIHdhaXRfcXVldWVfaGVhZF90IHZzeW5jW05WU1lOQ107CiAKLQogdm9pZAogdm5faW5pdCh2b2lkKQogewpAQCAtMTI0LDYgKzEwNyw3IEBACiAJaW5vZGUtPmlfbXRpbWUJICAgID0gdmFwLT52YV9tdGltZTsKIAlpbm9kZS0+aV9jdGltZQkgICAgPSB2YXAtPnZhX2N0aW1lOwogCWlub2RlLT5pX2F0aW1lCSAgICA9IHZhcC0+dmFfYXRpbWU7CisJaW5vZGUtPmlfYmxrc2l6ZSAgICA9IHZhcC0+dmFfYmxvY2tzaXplOwogCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19JTU1VVEFCTEUpCiAJCWlub2RlLT5pX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOwogCWVsc2UKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmggYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCmluZGV4IDM1ZjMwNmMuLmYyYmJiMzIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqCiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTMKICAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtMjE2LDExICsyMDIsMTIgQEAKIHR5cGVkZWYgaW50CSgqdm9wX2JtYXBfdCkoYmh2X2Rlc2NfdCAqLCB4ZnNfb2ZmX3QsIHNzaXplX3QsIGludCwKIAkJCQlzdHJ1Y3QgeGZzX2lvbWFwICosIGludCAqKTsKIHR5cGVkZWYgaW50CSgqdm9wX3JlY2xhaW1fdCkoYmh2X2Rlc2NfdCAqKTsKLXR5cGVkZWYgaW50CSgqdm9wX2F0dHJfZ2V0X3QpKGJodl9kZXNjX3QgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQsCi0JCQkJc3RydWN0IGNyZWQgKik7Ci10eXBlZGVmCWludAkoKnZvcF9hdHRyX3NldF90KShiaHZfZGVzY190ICosIGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCwKLQkJCQlzdHJ1Y3QgY3JlZCAqKTsKLXR5cGVkZWYJaW50CSgqdm9wX2F0dHJfcmVtb3ZlX3QpKGJodl9kZXNjX3QgKiwgY2hhciAqLCBpbnQsIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3BfYXR0cl9nZXRfdCkoYmh2X2Rlc2NfdCAqLCBjb25zdCBjaGFyICosIGNoYXIgKiwgaW50ICosCisJCQkJaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYJaW50CSgqdm9wX2F0dHJfc2V0X3QpKGJodl9kZXNjX3QgKiwgY29uc3QgY2hhciAqLCBjaGFyICosIGludCwKKwkJCQlpbnQsIHN0cnVjdCBjcmVkICopOwordHlwZWRlZglpbnQJKCp2b3BfYXR0cl9yZW1vdmVfdCkoYmh2X2Rlc2NfdCAqLCBjb25zdCBjaGFyICosCisJCQkJaW50LCBzdHJ1Y3QgY3JlZCAqKTsKIHR5cGVkZWYJaW50CSgqdm9wX2F0dHJfbGlzdF90KShiaHZfZGVzY190ICosIGNoYXIgKiwgaW50LCBpbnQsCiAJCQkJc3RydWN0IGF0dHJsaXN0X2N1cnNvcl9rZXJuICosIHN0cnVjdCBjcmVkICopOwogdHlwZWRlZiB2b2lkCSgqdm9wX2xpbmtfcmVtb3ZlZF90KShiaHZfZGVzY190ICosIHZub2RlX3QgKiwgaW50KTsKQEAgLTU2NiwxMyArNTUzLDYgQEAKIH0KIAogLyoKLSAqIFVwZGF0ZSBtb2RpZnkvYWNjZXNzL2NoYW5nZSB0aW1lcyBvbiB0aGUgdm5vZGUKLSAqLwotI2RlZmluZSBWTl9NVElNRVNFVCh2cCwgdHZwKQkoTElOVkZTX0dFVF9JUCh2cCktPmlfbXRpbWUgPSAqKHR2cCkpCi0jZGVmaW5lIFZOX0FUSU1FU0VUKHZwLCB0dnApCShMSU5WRlNfR0VUX0lQKHZwKS0+aV9hdGltZSA9ICoodHZwKSkKLSNkZWZpbmUgVk5fQ1RJTUVTRVQodnAsIHR2cCkJKExJTlZGU19HRVRfSVAodnApLT5pX2N0aW1lID0gKih0dnApKQotCi0vKgogICogRGVhbGluZyB3aXRoIGJhZCBpbm9kZXMKICAqLwogc3RhdGljIGlubGluZSB2b2lkIHZuX21hcmtfYmFkKHN0cnVjdCB2bm9kZSAqdnApCkBAIC02MDMsNiArNTgzLDcgQEAKICNkZWZpbmUJQVRUUl9MQVpZCTB4ODAJLyogc2V0L2dldCBhdHRyaWJ1dGVzIGxhemlseSAqLwogI2RlZmluZQlBVFRSX05PTkJMT0NLCTB4MTAwCS8qIHJldHVybiBFQUdBSU4gaWYgb3BlcmF0aW9uIHdvdWxkIGJsb2NrICovCiAjZGVmaW5lIEFUVFJfTk9MT0NLCTB4MjAwCS8qIERvbid0IGdyYWIgYW55IGNvbmZsaWN0aW5nIGxvY2tzICovCisjZGVmaW5lIEFUVFJfTk9TSVpFVE9LCTB4NDAwCS8qIERvbid0IGdldCB0aGUgU0laRSB0b2tlbiAqLwogCiAvKgogICogRmxhZ3MgdG8gVk9QX0ZTWU5DIGFuZCBWT1BfUkVDTEFJTS4KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS9NYWtlZmlsZSBiL2ZzL3hmcy9xdW90YS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0ZjcyNS4uMDAwMDAwMAotLS0gYS9mcy94ZnMvcXVvdGEvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoVE9QRElSKS9mcy94ZnMvcXVvdGEvTWFrZWZpbGUtbGludXgtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEvTWFrZWZpbGUtbGludXgtMi42IGIvZnMveGZzL3F1b3RhL01ha2VmaWxlLWxpbnV4LTIuNgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlNjBlOC4uMDAwMDAwMAotLS0gYS9mcy94ZnMvcXVvdGEvTWFrZWZpbGUtbGludXgtMi42CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0jCi0jIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotIyBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSMgb3IgdGhlIGxpa2UuCUFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0jIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSMgYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotIyBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSMgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotIyBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotIwotIyBodHRwOi8vd3d3LnNnaS5jb20KLSMKLSMgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0jCi0jIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KLSMKLQotRVhUUkFfQ0ZMQUdTICs9IC1JICQoVE9QRElSKS9mcy94ZnMgLUkgJChUT1BESVIpL2ZzL3hmcy9saW51eC0yLjYKLQotaWZlcSAoJChDT05GSUdfWEZTX0RFQlVHKSx5KQotCUVYVFJBX0NGTEFHUyArPSAtZyAtRERFQlVHCi0JI0VYVFJBX0NGTEFHUyArPSAtRFFVT1RBREVCVUcKLWVuZGlmCi1pZmVxICgkKENPTkZJR19YRlNfVFJBQ0UpLHkpCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0RRVU9UX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1ZOT0RFX1RSQUNFCi1lbmRpZgotCi14ZnMtJChDT05GSUdfWEZTX1FVT1RBKQkJKz0geGZzX2RxdW90Lm8gXAotCQkJCSAgIHhmc19kcXVvdF9pdGVtLm8gXAotCQkJCSAgIHhmc190cmFuc19kcXVvdC5vIFwKLQkJCQkgICB4ZnNfcW1fc3lzY2FsbHMubyBcCi0JCQkJICAgeGZzX3FtX2Jodi5vIFwKLQkJCQkgICB4ZnNfcW0ubwotCi1pZmVxICgkKENPTkZJR19YRlNfUVVPVEEpLHkpCi14ZnMtJChDT05GSUdfUFJPQ19GUykJCSs9IHhmc19xbV9zdGF0cy5vCi1lbmRpZgpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCmluZGV4IGUyZThkMzUuLjAwYjUwNDMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKQEAgLTEsMzkgKzEsMjUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgogI2luY2x1ZGUgInhmc19mcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgpAQCAtNDMsMTggKzI5LDE3IEBACiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgpAQCAtNjYsNyArNTEsNiBAQAogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCi0KICNpbmNsdWRlICJ4ZnNfcW0uaCIKIAogCkBAIC0xMTIsNyArOTYsNyBAQAogCiAJYnJhbmRuZXdkcXVvdCA9IHhmc19xbV9kcWFsbG9jX2luY29yZSgmZHFwKTsKIAlkcXAtPmRxX2ZsYWdzID0gdHlwZTsKLQlJTlRfU0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCwgaWQpOworCWRxcC0+cV9jb3JlLmRfaWQgPSBjcHVfdG9fYmUzMihpZCk7CiAJZHFwLT5xX21vdW50ID0gbXA7CiAKIAkvKgpAQCAtMTk0LDEwICsxNzgsMTAgQEAKIAkvKgogCSAqIENhbGxlciBoYXMgemVybydkIHRoZSBlbnRpcmUgZHF1b3QgJ2NodW5rJyBhbHJlYWR5LgogCSAqLwotCUlOVF9TRVQoZC0+ZGRfZGlza2RxLmRfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0RRVU9UX01BR0lDKTsKLQlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCwgWEZTX0RRVU9UX1ZFUlNJT04pOwotCUlOVF9TRVQoZC0+ZGRfZGlza2RxLmRfaWQsIEFSQ0hfQ09OVkVSVCwgaWQpOwotCUlOVF9TRVQoZC0+ZGRfZGlza2RxLmRfZmxhZ3MsIEFSQ0hfQ09OVkVSVCwgdHlwZSk7CisJZC0+ZGRfZGlza2RxLmRfbWFnaWMgPSBjcHVfdG9fYmUxNihYRlNfRFFVT1RfTUFHSUMpOworCWQtPmRkX2Rpc2tkcS5kX3ZlcnNpb24gPSBYRlNfRFFVT1RfVkVSU0lPTjsKKwlkLT5kZF9kaXNrZHEuZF9pZCA9IGNwdV90b19iZTMyKGlkKTsKKwlkLT5kZF9kaXNrZHEuZF9mbGFncyA9IHR5cGU7CiB9CiAKIApAQCAtMjI3LDE5ICsyMTEsMTMgQEAKIAkJICAgICAodm9pZCAqKShfX3BzaW50X3QpZHFwLT5xX25yZWZzLAogCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClkcXAtPmRxX2ZsYWdzLAogCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClkcXAtPnFfcmVzX2Jjb3VudCwKLQkJICAgICAodm9pZCAqKShfX3BzaW50X3QpSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jjb3VudCwKLQkJCQkJCUFSQ0hfQ09OVkVSVCksCi0JCSAgICAgKHZvaWQgKikoX19wc2ludF90KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsCi0JCQkJCQlBUkNIX0NPTlZFUlQpLAotCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmxrX2hhcmRsaW1pdCwKLQkJCQkJCUFSQ0hfQ09OVkVSVCksCi0JCSAgICAgKHZvaWQgKikoX19wc2ludF90KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0LAotCQkJCQkJQVJDSF9DT05WRVJUKSwKLQkJICAgICAodm9pZCAqKShfX3BzaW50X3QpSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19oYXJkbGltaXQsCi0JCQkJCQlBUkNIX0NPTlZFUlQpLAotCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCwKLQkJCQkJCUFSQ0hfQ09OVkVSVCksCi0JCSAgICAgKHZvaWQgKikoX19wc2ludF90KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9iY291bnQpLAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2ljb3VudCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfYmxrX2hhcmRsaW1pdCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfYmxrX3NvZnRsaW1pdCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaW5vX2hhcmRsaW1pdCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWJlMzJfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaWQpLAogCQkgICAgICh2b2lkICopKF9fcHNpbnRfdCljdXJyZW50X3BpZCgpLAogCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClpbm8sCiAJCSAgICAgKHZvaWQgKikoX19wc2ludF90KXJldGFkZHIsCkBAIC0yNjQsMTcgKzI0MiwxNyBAQAogCUFTU0VSVChkLT5kX2lkKTsKIAogCWlmIChxLT5xaV9ic29mdGxpbWl0ICYmICFkLT5kX2Jsa19zb2Z0bGltaXQpCi0JCUlOVF9TRVQoZC0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQsIHEtPnFpX2Jzb2Z0bGltaXQpOworCQlkLT5kX2Jsa19zb2Z0bGltaXQgPSBjcHVfdG9fYmU2NChxLT5xaV9ic29mdGxpbWl0KTsKIAlpZiAocS0+cWlfYmhhcmRsaW1pdCAmJiAhZC0+ZF9ibGtfaGFyZGxpbWl0KQotCQlJTlRfU0VUKGQtPmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJULCBxLT5xaV9iaGFyZGxpbWl0KTsKKwkJZC0+ZF9ibGtfaGFyZGxpbWl0ID0gY3B1X3RvX2JlNjQocS0+cWlfYmhhcmRsaW1pdCk7CiAJaWYgKHEtPnFpX2lzb2Z0bGltaXQgJiYgIWQtPmRfaW5vX3NvZnRsaW1pdCkKLQkJSU5UX1NFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCwgcS0+cWlfaXNvZnRsaW1pdCk7CisJCWQtPmRfaW5vX3NvZnRsaW1pdCA9IGNwdV90b19iZTY0KHEtPnFpX2lzb2Z0bGltaXQpOwogCWlmIChxLT5xaV9paGFyZGxpbWl0ICYmICFkLT5kX2lub19oYXJkbGltaXQpCi0JCUlOVF9TRVQoZC0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQsIHEtPnFpX2loYXJkbGltaXQpOworCQlkLT5kX2lub19oYXJkbGltaXQgPSBjcHVfdG9fYmU2NChxLT5xaV9paGFyZGxpbWl0KTsKIAlpZiAocS0+cWlfcnRic29mdGxpbWl0ICYmICFkLT5kX3J0Yl9zb2Z0bGltaXQpCi0JCUlOVF9TRVQoZC0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQsIHEtPnFpX3J0YnNvZnRsaW1pdCk7CisJCWQtPmRfcnRiX3NvZnRsaW1pdCA9IGNwdV90b19iZTY0KHEtPnFpX3J0YnNvZnRsaW1pdCk7CiAJaWYgKHEtPnFpX3J0YmhhcmRsaW1pdCAmJiAhZC0+ZF9ydGJfaGFyZGxpbWl0KQotCQlJTlRfU0VUKGQtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJULCBxLT5xaV9ydGJoYXJkbGltaXQpOworCQlkLT5kX3J0Yl9oYXJkbGltaXQgPSBjcHVfdG9fYmU2NChxLT5xaV9ydGJoYXJkbGltaXQpOwogfQogCiAvKgpAQCAtMjk4LDgxICsyNzYsODEgQEAKIAlBU1NFUlQoZC0+ZF9pZCk7CiAKICNpZmRlZiBRVU9UQURFQlVHCi0JaWYgKElOVF9HRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKQotCQlBU1NFUlQoSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgPD0KLQkJCUlOVF9HRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKLQlpZiAoSU5UX0dFVChkLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpCi0JCUFTU0VSVChJTlRfR0VUKGQtPmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSA8PQotCQkJSU5UX0dFVChkLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpOwotCWlmIChJTlRfR0VUKGQtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkKLQkJQVNTRVJUKElOVF9HRVQoZC0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpIDw9Ci0JCQlJTlRfR0VUKGQtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSk7CisJaWYgKGQtPmRfYmxrX2hhcmRsaW1pdCkKKwkJQVNTRVJUKGJlNjRfdG9fY3B1KGQtPmRfYmxrX3NvZnRsaW1pdCkgPD0KKwkJICAgICAgIGJlNjRfdG9fY3B1KGQtPmRfYmxrX2hhcmRsaW1pdCkpOworCWlmIChkLT5kX2lub19oYXJkbGltaXQpCisJCUFTU0VSVChiZTY0X3RvX2NwdShkLT5kX2lub19zb2Z0bGltaXQpIDw9CisJCSAgICAgICBiZTY0X3RvX2NwdShkLT5kX2lub19oYXJkbGltaXQpKTsKKwlpZiAoZC0+ZF9ydGJfaGFyZGxpbWl0KQorCQlBU1NFUlQoYmU2NF90b19jcHUoZC0+ZF9ydGJfc29mdGxpbWl0KSA8PQorCQkgICAgICAgYmU2NF90b19jcHUoZC0+ZF9ydGJfaGFyZGxpbWl0KSk7CiAjZW5kaWYKIAlpZiAoIWQtPmRfYnRpbWVyKSB7Ci0JCWlmICgoSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKLQkJICAgIChJTlRfR0VUKGQtPmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpID49Ci0JCQkJSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSB8fAotCQkgICAgKElOVF9HRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCi0JCSAgICAoSU5UX0dFVChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA+PQotCQkJCUlOVF9HRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkpIHsKLQkJCUlOVF9TRVQoZC0+ZF9idGltZXIsIEFSQ0hfQ09OVkVSVCwKLQkJCQlnZXRfc2Vjb25kcygpICsgWEZTX1FJX0JUSU1FTElNSVQobXApKTsKKwkJaWYgKChkLT5kX2Jsa19zb2Z0bGltaXQgJiYKKwkJICAgICAoYmU2NF90b19jcHUoZC0+ZF9iY291bnQpID49CisJCSAgICAgIGJlNjRfdG9fY3B1KGQtPmRfYmxrX3NvZnRsaW1pdCkpKSB8fAorCQkgICAgKGQtPmRfYmxrX2hhcmRsaW1pdCAmJgorCQkgICAgIChiZTY0X3RvX2NwdShkLT5kX2Jjb3VudCkgPj0KKwkJICAgICAgYmU2NF90b19jcHUoZC0+ZF9ibGtfaGFyZGxpbWl0KSkpKSB7CisJCQlkLT5kX2J0aW1lciA9IGNwdV90b19iZTMyKGdldF9zZWNvbmRzKCkgKworCQkJCQlYRlNfUUlfQlRJTUVMSU1JVChtcCkpOwogCQl9IGVsc2UgewogCQkJZC0+ZF9id2FybnMgPSAwOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKCghZC0+ZF9ibGtfc29mdGxpbWl0IHx8Ci0JCSAgICAoSU5UX0dFVChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA8Ci0JCQkJSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSAmJgorCQkgICAgIChiZTY0X3RvX2NwdShkLT5kX2Jjb3VudCkgPAorCQkgICAgICBiZTY0X3RvX2NwdShkLT5kX2Jsa19zb2Z0bGltaXQpKSkgJiYKIAkJICAgICghZC0+ZF9ibGtfaGFyZGxpbWl0IHx8Ci0JCSAgICAoSU5UX0dFVChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA8Ci0JCQkJSU5UX0dFVChkLT5kX2Jsa19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpKSkgeworCQkgICAgKGJlNjRfdG9fY3B1KGQtPmRfYmNvdW50KSA8CisJCSAgICAgYmU2NF90b19jcHUoZC0+ZF9ibGtfaGFyZGxpbWl0KSkpKSB7CiAJCQlkLT5kX2J0aW1lciA9IDA7CiAJCX0KIAl9CiAKIAlpZiAoIWQtPmRfaXRpbWVyKSB7Ci0JCWlmICgoSU5UX0dFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKLQkJICAgIChJTlRfR0VUKGQtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpID49Ci0JCQkJSU5UX0dFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSB8fAotCQkgICAgKElOVF9HRVQoZC0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCi0JCSAgICAoSU5UX0dFVChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA+PQotCQkJCUlOVF9HRVQoZC0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkpIHsKLQkJCUlOVF9TRVQoZC0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCwKLQkJCQlnZXRfc2Vjb25kcygpICsgWEZTX1FJX0lUSU1FTElNSVQobXApKTsKKwkJaWYgKChkLT5kX2lub19zb2Z0bGltaXQgJiYKKwkJICAgICAoYmU2NF90b19jcHUoZC0+ZF9pY291bnQpID49CisJCSAgICAgIGJlNjRfdG9fY3B1KGQtPmRfaW5vX3NvZnRsaW1pdCkpKSB8fAorCQkgICAgKGQtPmRfaW5vX2hhcmRsaW1pdCAmJgorCQkgICAgIChiZTY0X3RvX2NwdShkLT5kX2ljb3VudCkgPj0KKwkJICAgICAgYmU2NF90b19jcHUoZC0+ZF9pbm9faGFyZGxpbWl0KSkpKSB7CisJCQlkLT5kX2l0aW1lciA9IGNwdV90b19iZTMyKGdldF9zZWNvbmRzKCkgKworCQkJCQlYRlNfUUlfSVRJTUVMSU1JVChtcCkpOwogCQl9IGVsc2UgewogCQkJZC0+ZF9pd2FybnMgPSAwOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKCghZC0+ZF9pbm9fc29mdGxpbWl0IHx8Ci0JCSAgICAoSU5UX0dFVChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA8Ci0JCQkJSU5UX0dFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSAgJiYKKwkJICAgICAoYmU2NF90b19jcHUoZC0+ZF9pY291bnQpIDwKKwkJICAgICAgYmU2NF90b19jcHUoZC0+ZF9pbm9fc29mdGxpbWl0KSkpICAmJgogCQkgICAgKCFkLT5kX2lub19oYXJkbGltaXQgfHwKLQkJICAgIChJTlRfR0VUKGQtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpIDwKLQkJCQlJTlRfR0VUKGQtPmRfaW5vX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkpKSB7CisJCSAgICAgKGJlNjRfdG9fY3B1KGQtPmRfaWNvdW50KSA8CisJCSAgICAgIGJlNjRfdG9fY3B1KGQtPmRfaW5vX2hhcmRsaW1pdCkpKSkgewogCQkJZC0+ZF9pdGltZXIgPSAwOwogCQl9CiAJfQogCiAJaWYgKCFkLT5kX3J0YnRpbWVyKSB7Ci0JCWlmICgoSU5UX0dFVChkLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKLQkJICAgIChJTlRfR0VUKGQtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KLQkJCQlJTlRfR0VUKGQtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkpIHx8Ci0JCSAgICAoSU5UX0dFVChkLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKLQkJICAgIChJTlRfR0VUKGQtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KLQkJCQlJTlRfR0VUKGQtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkpKSB7Ci0JCQlJTlRfU0VUKGQtPmRfcnRidGltZXIsIEFSQ0hfQ09OVkVSVCwKLQkJCQlnZXRfc2Vjb25kcygpICsgWEZTX1FJX1JUQlRJTUVMSU1JVChtcCkpOworCQlpZiAoKGQtPmRfcnRiX3NvZnRsaW1pdCAmJgorCQkgICAgIChiZTY0X3RvX2NwdShkLT5kX3J0YmNvdW50KSA+PQorCQkgICAgICBiZTY0X3RvX2NwdShkLT5kX3J0Yl9zb2Z0bGltaXQpKSkgfHwKKwkJICAgIChkLT5kX3J0Yl9oYXJkbGltaXQgJiYKKwkJICAgICAoYmU2NF90b19jcHUoZC0+ZF9ydGJjb3VudCkgPj0KKwkJICAgICAgYmU2NF90b19jcHUoZC0+ZF9ydGJfaGFyZGxpbWl0KSkpKSB7CisJCQlkLT5kX3J0YnRpbWVyID0gY3B1X3RvX2JlMzIoZ2V0X3NlY29uZHMoKSArCisJCQkJCVhGU19RSV9SVEJUSU1FTElNSVQobXApKTsKIAkJfSBlbHNlIHsKIAkJCWQtPmRfcnRid2FybnMgPSAwOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKCghZC0+ZF9ydGJfc29mdGxpbWl0IHx8Ci0JCSAgICAoSU5UX0dFVChkLT5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQpIDwKLQkJCQlJTlRfR0VUKGQtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkpICYmCisJCSAgICAgKGJlNjRfdG9fY3B1KGQtPmRfcnRiY291bnQpIDwKKwkJICAgICAgYmU2NF90b19jcHUoZC0+ZF9ydGJfc29mdGxpbWl0KSkpICYmCiAJCSAgICAoIWQtPmRfcnRiX2hhcmRsaW1pdCB8fAotCQkgICAgKElOVF9HRVQoZC0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSA8Ci0JCQkJSU5UX0dFVChkLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpKSkgeworCQkgICAgIChiZTY0X3RvX2NwdShkLT5kX3J0YmNvdW50KSA8CisJCSAgICAgIGJlNjRfdG9fY3B1KGQtPmRfcnRiX2hhcmRsaW1pdCkpKSkgewogCQkJZC0+ZF9ydGJ0aW1lciA9IDA7CiAJCX0KIAl9CkBAIC00OTAsNyArNDY4LDcgQEAKIAkgKiBNYWtlIGEgY2h1bmsgb2YgZHF1b3RzIG91dCBvZiB0aGlzIGJ1ZmZlciBhbmQgbG9nCiAJICogdGhlIGVudGlyZSB0aGluZy4KIAkgKi8KLQl4ZnNfcW1faW5pdF9kcXVvdF9ibGsodHAsIG1wLCBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCksCisJeGZzX3FtX2luaXRfZHF1b3RfYmxrKHRwLCBtcCwgYmUzMl90b19jcHUoZHFwLT5xX2NvcmUuZF9pZCksCiAJCQkgICAgICBkcXAtPmRxX2ZsYWdzICYgWEZTX0RRX0FMTFRZUEVTLCBicCk7CiAKIAkvKgpAQCAtNTU0LDcgKzUzMiw3IEBACiAJeGZzX3RyYW5zX3QJKnRwID0gKHRwcCA/ICp0cHAgOiBOVUxMKTsKIAogCW1wID0gZHFwLT5xX21vdW50OwotCWlkID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpOworCWlkID0gYmUzMl90b19jcHUoZHFwLT5xX2NvcmUuZF9pZCk7CiAJbm1hcHMgPSAxOwogCW5ld2RxdW90ID0gQl9GQUxTRTsKIApAQCAtNTYzLDggKzU0MSw3IEBACiAJICovCiAJaWYgKGRxcC0+cV9ibGtubyA9PSAoeGZzX2RhZGRyX3QpIDApIHsKIAkJLyogV2UgdXNlIHRoZSBpZCBhcyBhbiBpbmRleCAqLwotCQlkcXAtPnFfZmlsZW9mZnNldCA9ICh4ZnNfZmlsZW9mZl90KSAoKHVpbnQpaWQgLwotCQkJCQkJICAgICBYRlNfUU1fRFFQRVJCTEsobXApKTsKKwkJZHFwLT5xX2ZpbGVvZmZzZXQgPSAoeGZzX2ZpbGVvZmZfdClpZCAvIFhGU19RTV9EUVBFUkJMSyhtcCk7CiAJCW5tYXBzID0gMTsKIAkJcXVvdGlwID0gWEZTX0RRX1RPX1FJUChkcXApOwogCQl4ZnNfaWxvY2socXVvdGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKQEAgLTY5NCwxNiArNjcxLDE2IEBACiAKIAkvKiBjb3B5IGV2ZXJ5dGhpbmcgZnJvbSBkaXNrIGRxdW90IHRvIHRoZSBpbmNvcmUgZHF1b3QgKi8KIAltZW1jcHkoJmRxcC0+cV9jb3JlLCBkZHFwLCBzaXplb2YoeGZzX2Rpc2tfZHF1b3RfdCkpOwotCUFTU0VSVChJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkgPT0gaWQpOworCUFTU0VSVChiZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2lkKSA9PSBpZCk7CiAJeGZzX3FtX2RxdW90X2xvZ2l0ZW1faW5pdChkcXApOwogCiAJLyoKIAkgKiBSZXNlcnZhdGlvbiBjb3VudGVycyBhcmUgZGVmaW5lZCBhcyByZXNlcnZhdGlvbiBwbHVzIGN1cnJlbnQgdXNhZ2UKIAkgKiB0byBhdm9pZCBoYXZpbmcgdG8gYWRkIGV2ZXJ5dGltZS4KIAkgKi8KLQlkcXAtPnFfcmVzX2Jjb3VudCA9IElOVF9HRVQoZGRxcC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCk7Ci0JZHFwLT5xX3Jlc19pY291bnQgPSBJTlRfR0VUKGRkcXAtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpOwotCWRxcC0+cV9yZXNfcnRiY291bnQgPSBJTlRfR0VUKGRkcXAtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJZHFwLT5xX3Jlc19iY291bnQgPSBiZTY0X3RvX2NwdShkZHFwLT5kX2Jjb3VudCk7CisJZHFwLT5xX3Jlc19pY291bnQgPSBiZTY0X3RvX2NwdShkZHFwLT5kX2ljb3VudCk7CisJZHFwLT5xX3Jlc19ydGJjb3VudCA9IGJlNjRfdG9fY3B1KGRkcXAtPmRfcnRiY291bnQpOwogCiAJLyogTWFyayB0aGUgYnVmIHNvIHRoYXQgdGhpcyB3aWxsIHN0YXkgaW5jb3JlIGEgbGl0dGxlIGxvbmdlciAqLwogCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19EUVVPVCwgWEZTX0RRVU9UX1JFRik7CkBAIC04MjksNyArODA2LDcgQEAKIAkJICogZHFsb2NrIHRvIGxvb2sgYXQgdGhlIGlkIGZpZWxkIG9mIHRoZSBkcXVvdCwgc2luY2UgdGhlCiAJCSAqIGlkIGNhbid0IGJlIG1vZGlmaWVkIHdpdGhvdXQgdGhlIGhhc2hsb2NrIGFueXdheS4KIAkJICovCi0JCWlmIChJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkgPT0gaWQgJiYgZHFwLT5xX21vdW50ID09IG1wKSB7CisJCWlmIChiZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2lkKSA9PSBpZCAmJiBkcXAtPnFfbW91bnQgPT0gbXApIHsKIAkJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRRk9VTkQgQlkgTE9PS1VQIik7CiAJCQkvKgogCQkJICogQWxsIGluIGNvcmUgZHF1b3RzIG11c3QgYmUgb24gdGhlIGRxbGlzdCBvZiBtcApAQCAtODYwLDcgKzgzNyw3IEBACiAJCQkgKiBpZCBjb3VsZG4ndCBoYXZlIGNoYW5nZWQ7IHdlIGhhZCB0aGUgaGFzaGxvY2sgYWxsCiAJCQkgKiBhbG9uZwogCQkJICovCi0JCQlBU1NFUlQoSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpID09IGlkKTsKKwkJCUFTU0VSVChiZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2lkKSA9PSBpZCk7CiAKIAkJCWlmIChmbGlzdF9sb2NrZWQpIHsKIAkJCQlpZiAoZHFwLT5xX25yZWZzICE9IDApIHsKQEAgLTEyODIsNyArMTI1OSw3IEBACiAJCXJldHVybiAoZXJyb3IpOwogCX0KIAotCWlmICh4ZnNfcW1fZHFjaGVjaygmZHFwLT5xX2NvcmUsIElOVF9HRVQoZGRxcC0+ZF9pZCwgQVJDSF9DT05WRVJUKSwKKwlpZiAoeGZzX3FtX2RxY2hlY2soJmRxcC0+cV9jb3JlLCBiZTMyX3RvX2NwdShkZHFwLT5kX2lkKSwKIAkJCSAgIDAsIFhGU19RTU9QVF9ET1dBUk4sICJkcWZsdXNoIChpbmNvcmUgY29weSkiKSkgewogCQl4ZnNfZm9yY2Vfc2h1dGRvd24oZHFwLT5xX21vdW50LCBYRlNfQ09SUlVQVF9JTkNPUkUpOwogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CkBAIC0xNDM1LDggKzE0MTIsOCBAQAogewogCWlmIChkMSAmJiBkMikgewogCQlBU1NFUlQoZDEgIT0gZDIpOwotCQlpZiAoSU5UX0dFVChkMS0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkgPgotCQkgICAgSU5UX0dFVChkMi0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJaWYgKGJlMzJfdG9fY3B1KGQxLT5xX2NvcmUuZF9pZCkgPgorCQkgICAgYmUzMl90b19jcHUoZDItPnFfY29yZS5kX2lkKSkgewogCQkJeGZzX2RxbG9jayhkMik7CiAJCQl4ZnNfZHFsb2NrKGQxKTsKIAkJfSBlbHNlIHsKQEAgLTE1NTgsMzMgKzE1MzUsMzMgQEAKIHsKIAljbW5fZXJyKENFX0RFQlVHLCAiLS0tLS0tLS0tLS1LRVJORUwgRFFVT1QtLS0tLS0tLS0tLS0tLS0tIik7CiAJY21uX2VycihDRV9ERUJVRywgIi0tLS0gZHF1b3RJRCA9ICAlZCIsCi0JCShpbnQpSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpKTsKKwkJKGludCliZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2lkKSk7CiAJY21uX2VycihDRV9ERUJVRywgIi0tLS0gdHlwZSAgICA9ICAlcyIsIERRRkxBR1RPX1RZUEVTVFIoZHFwKSk7CiAJY21uX2VycihDRV9ERUJVRywgIi0tLS0gZnMgICAgICA9ICAweCVwIiwgZHFwLT5xX21vdW50KTsKIAljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBibGtubyAgID0gIDB4JXgiLCAoaW50KSBkcXAtPnFfYmxrbm8pOwogCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGJvZmZzZXQgPSAgMHgleCIsIChpbnQpIGRxcC0+cV9idWZvZmZzZXQpOwogCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGJsa2hsaW1pdCA9ICAlTHUgKDB4JXgpIiwKLQkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCksCi0JCShpbnQpIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9ibGtfaGFyZGxpbWl0KSwKKwkJKGludCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jsa19oYXJkbGltaXQpKTsKIAljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBibGtzbGltaXQgPSAgJUx1ICgweCV4KSIsCi0JCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpLAotCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0KSwKKwkJKGludCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQpKTsKIAljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBpbm9obGltaXQgPSAgJUx1ICgweCV4KSIsCi0JCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpLAotCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pbm9faGFyZGxpbWl0KSwKKwkJKGludCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2lub19oYXJkbGltaXQpKTsKIAljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBpbm9zbGltaXQgPSAgJUx1ICgweCV4KSIsCi0JCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpLAotCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pbm9fc29mdGxpbWl0KSwKKwkJKGludCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQpKTsKIAljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBiY291bnQgID0gICVMdSAoMHgleCkiLAotCQlJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpLAotCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCQliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jjb3VudCksCisJCShpbnQpYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9iY291bnQpKTsKIAljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBpY291bnQgID0gICVMdSAoMHgleCkiLAotCQlJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpLAotCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCQliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2ljb3VudCksCisJCShpbnQpYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pY291bnQpKTsKIAljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBidGltZXIgID0gICVkIiwKLQkJKGludClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYnRpbWVyLCBBUkNIX0NPTlZFUlQpKTsKKwkJKGludCliZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2J0aW1lcikpOwogCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGl0aW1lciAgPSAgJWQiLAotCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCkpOworCQkoaW50KWJlMzJfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaXRpbWVyKSk7CiAJY21uX2VycihDRV9ERUJVRywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmggYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmgKaW5kZXggOGViYzg3MS4uYzBjNjI5NiAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19EUVVPVF9IX18KICNkZWZpbmUgX19YRlNfRFFVT1RfSF9fCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jCmluZGV4IGU3NGVhYTcuLjJmNjk4MjIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jCkBAIC0xLDM5ICsxLDI1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKICNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKQEAgLTQzLDE4ICsyOSwxNyBAQAogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKQEAgLTY1LDEwICs1MCw4IEBACiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgotCiAjaW5jbHVkZSAieGZzX3FtLmgiCiAKLQogLyoKICAqIHJldHVybnMgdGhlIG51bWJlciBvZiBpb3ZlY3MgbmVlZGVkIHRvIGxvZyB0aGUgZ2l2ZW4gZHF1b3QgaXRlbS4KICAqLwpAQCAtNDY3LDcgKzQ1MCw3IEBACiAJbHAtPnFsaV9pdGVtLmxpX21vdW50cCA9IGRxcC0+cV9tb3VudDsKIAlscC0+cWxpX2RxdW90ID0gZHFwOwogCWxwLT5xbGlfZm9ybWF0LnFsZl90eXBlID0gWEZTX0xJX0RRVU9UOwotCWxwLT5xbGlfZm9ybWF0LnFsZl9pZCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKTsKKwlscC0+cWxpX2Zvcm1hdC5xbGZfaWQgPSBiZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2lkKTsKIAlscC0+cWxpX2Zvcm1hdC5xbGZfYmxrbm8gPSBkcXAtPnFfYmxrbm87CiAJbHAtPnFsaV9mb3JtYXQucWxmX2xlbiA9IDE7CiAJLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5oIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmgKaW5kZXggOWM2NTAwZC4uNWE2MzI1MyAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmgKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfRFFVT1RfSVRFTV9IX18KICNkZWZpbmUgX19YRlNfRFFVT1RfSVRFTV9IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwppbmRleCBlZmRlMTZlLi4xYWVhNDJkIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCkBAIC0xLDM5ICsxLDI1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKICNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfY2xudC5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgpAQCAtNDQsMjEgKzMwLDIwIEBACiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCi0jaW5jbHVkZSAieGZzX2JtYXAuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgotI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19ydy5oIgogI2luY2x1ZGUgInhmc19hY2wuaCIKICNpbmNsdWRlICJ4ZnNfY2FwLmgiCkBAIC02Nyw3ICs1Miw2IEBACiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCiAjaW5jbHVkZSAieGZzX3V0aWxzLmgiCi0KICNpbmNsdWRlICJ4ZnNfcW0uaCIKIAogLyoKQEAgLTc2LDggKzYwLDkgQEAKICAqIHF1b3RhIGZ1bmN0aW9uYWxpdHksIGluY2x1ZGluZyBtYWludGFpbmluZyB0aGUgZnJlZWxpc3QgYW5kIGhhc2gKICAqIHRhYmxlcyBvZiBkcXVvdHMuCiAgKi8KLW11dGV4X3QgeGZzX0dxbV9sb2NrOworbXV0ZXhfdAkJeGZzX0dxbV9sb2NrOwogc3RydWN0IHhmc19xbQkqeGZzX0dxbTsKK3VpbnQJCW5kcXVvdDsKIAoga21lbV96b25lX3QJKnFtX2Rxem9uZTsKIGttZW1fem9uZV90CSpxbV9kcXRyeHpvbmU7CkBAIC0xMDcsMTAgKzkyLDEwIEBACiAJZm9yIChkcXAgPSAobCktPnFoX25leHQ7IGRxcCAhPSBOVUxMOyBkcXAgPSBkcXAtPk5YVCkgeyBcCiAJCWNtbl9lcnIoQ0VfREVCVUcsICIgICAlZC4gIFwiJWQgKCVzKVwiICAgIiBcCiAJCQkJICAiYmNudCA9ICVkLCBpY250ID0gJWQsIHJlZnMgPSAlZCIsIFwKLQkJCSsraSwgKGludCkgSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpLCBcCisJCQkrK2ksIChpbnQpIGJlMzJfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaWQpLCBcCiAJCQlEUUZMQUdUT19UWVBFU1RSKGRxcCksCSAgICAgXAotCQkJKGludCkgSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSwgXAotCQkJKGludCkgSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSwgXAorCQkJKGludCkgYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9iY291bnQpLCBcCisJCQkoaW50KSBiZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2ljb3VudCksIFwKIAkJCShpbnQpIGRxcC0+cV9ucmVmcyk7ICB9IFwKIH0KICNlbHNlCkBAIC0xMjQsMjUgKzEwOSwyNSBAQAogU1RBVElDIHN0cnVjdCB4ZnNfcW0gKgogeGZzX0dxbV9pbml0KHZvaWQpCiB7Ci0JeGZzX3FtX3QJCSp4cW07Ci0JaW50CQkJaHNpemUsIGk7Ci0KLQl4cW0gPSBrbWVtX3phbGxvYyhzaXplb2YoeGZzX3FtX3QpLCBLTV9TTEVFUCk7Ci0JQVNTRVJUKHhxbSk7CisJeGZzX2RxaGFzaF90CSp1ZHFoYXNoLCAqZ2RxaGFzaDsKKwl4ZnNfcW1fdAkqeHFtOworCXVpbnQJCWksIGhzaXplLCBmbGFncyA9IEtNX1NMRUVQIHwgS01fTUFZRkFJTDsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgZHF1b3QgaGFzaCB0YWJsZXMuCiAJICovCi0JaHNpemUgPSAoRFFVT1RfSEFTSF9IRVVSSVNUSUMgPCBYRlNfUU1fTkNTSVpFX1RIUkVTSE9MRCkgPwotCQlYRlNfUU1fSEFTSFNJWkVfTE9XIDogWEZTX1FNX0hBU0hTSVpFX0hJR0g7Ci0JeHFtLT5xbV9kcWhhc2htYXNrID0gaHNpemUgLSAxOworCWhzaXplID0gWEZTX1FNX0hBU0hTSVpFX0hJR0g7CisJd2hpbGUgKCEodWRxaGFzaCA9IGttZW1femFsbG9jKGhzaXplICogc2l6ZW9mKHhmc19kcWhhc2hfdCksIGZsYWdzKSkpIHsKKwkJaWYgKChoc2l6ZSA+Pj0gMSkgPD0gWEZTX1FNX0hBU0hTSVpFX0xPVykKKwkJCWZsYWdzID0gS01fU0xFRVA7CisJfQorCWdkcWhhc2ggPSBrbWVtX3phbGxvYyhoc2l6ZSAqIHNpemVvZih4ZnNfZHFoYXNoX3QpLCBLTV9TTEVFUCk7CisJbmRxdW90ID0gaHNpemUgPDwgODsKIAotCXhxbS0+cW1fdXNyX2RxaHRhYmxlID0gKHhmc19kcWhhc2hfdCAqKWttZW1femFsbG9jKGhzaXplICoKLQkJCQkJCSAgICAgIHNpemVvZih4ZnNfZHFoYXNoX3QpLAotCQkJCQkJICAgICAgS01fU0xFRVApOwotCXhxbS0+cW1fZ3JwX2RxaHRhYmxlID0gKHhmc19kcWhhc2hfdCAqKWttZW1femFsbG9jKGhzaXplICoKLQkJCQkJCSAgICAgIHNpemVvZih4ZnNfZHFoYXNoX3QpLAotCQkJCQkJICAgICAgS01fU0xFRVApOworCXhxbSA9IGttZW1femFsbG9jKHNpemVvZih4ZnNfcW1fdCksIEtNX1NMRUVQKTsKKwl4cW0tPnFtX2RxaGFzaG1hc2sgPSBoc2l6ZSAtIDE7CisJeHFtLT5xbV91c3JfZHFodGFibGUgPSB1ZHFoYXNoOworCXhxbS0+cW1fZ3JwX2RxaHRhYmxlID0gZ2RxaGFzaDsKIAlBU1NFUlQoeHFtLT5xbV91c3JfZHFodGFibGUgIT0gTlVMTCk7CiAJQVNTRVJUKHhxbS0+cW1fZ3JwX2RxaHRhYmxlICE9IE5VTEwpOwogCkBAIC03NDMsNyArNzI4LDcgQEAKIAkgKi8KIAlpZiAodWRxaGludCAmJgogCSAgICAoZHFwID0gdWRxaGludC0+cV9nZHF1b3QpICYmCi0JICAgIChJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkgPT0gaWQpKSB7CisJICAgIChiZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2lkKSA9PSBpZCkpIHsKIAkJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQodWRxaGludCkpOwogCQl4ZnNfZHFsb2NrKGRxcCk7CiAJCVhGU19EUUhPTEQoZHFwKTsKQEAgLTEyMTMsNDIgKzExOTgsMjQgQEAKIAkJICogYSB1c2VyIG9yIGdyb3VwIGJlZm9yZSBoZSBvciBzaGUgY2FuIG5vdCBwZXJmb3JtIGFueQogCQkgKiBtb3JlIHdyaXRpbmcuIElmIGl0IGlzIHplcm8sIGEgZGVmYXVsdCBpcyB1c2VkLgogCQkgKi8KLQkJcWluZi0+cWlfYnRpbWVsaW1pdCA9Ci0JCQkJSU5UX0dFVChkZHFwLT5kX2J0aW1lciwgQVJDSF9DT05WRVJUKSA/Ci0JCQkJSU5UX0dFVChkZHFwLT5kX2J0aW1lciwgQVJDSF9DT05WRVJUKSA6Ci0JCQkJWEZTX1FNX0JUSU1FTElNSVQ7Ci0JCXFpbmYtPnFpX2l0aW1lbGltaXQgPQotCQkJCUlOVF9HRVQoZGRxcC0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCkgPwotCQkJCUlOVF9HRVQoZGRxcC0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCkgOgotCQkJCVhGU19RTV9JVElNRUxJTUlUOwotCQlxaW5mLT5xaV9ydGJ0aW1lbGltaXQgPQotCQkJCUlOVF9HRVQoZGRxcC0+ZF9ydGJ0aW1lciwgQVJDSF9DT05WRVJUKSA/Ci0JCQkJSU5UX0dFVChkZHFwLT5kX3J0YnRpbWVyLCBBUkNIX0NPTlZFUlQpIDoKLQkJCQlYRlNfUU1fUlRCVElNRUxJTUlUOwotCQlxaW5mLT5xaV9id2FybmxpbWl0ID0KLQkJCQlJTlRfR0VUKGRkcXAtPmRfYndhcm5zLCBBUkNIX0NPTlZFUlQpID8KLQkJCQlJTlRfR0VUKGRkcXAtPmRfYndhcm5zLCBBUkNIX0NPTlZFUlQpIDoKLQkJCQlYRlNfUU1fQldBUk5MSU1JVDsKLQkJcWluZi0+cWlfaXdhcm5saW1pdCA9Ci0JCQkJSU5UX0dFVChkZHFwLT5kX2l3YXJucywgQVJDSF9DT05WRVJUKSA/Ci0JCQkJSU5UX0dFVChkZHFwLT5kX2l3YXJucywgQVJDSF9DT05WRVJUKSA6Ci0JCQkJWEZTX1FNX0lXQVJOTElNSVQ7Ci0JCXFpbmYtPnFpX3J0Yndhcm5saW1pdCA9Ci0JCQkJSU5UX0dFVChkZHFwLT5kX3J0Yndhcm5zLCBBUkNIX0NPTlZFUlQpID8KLQkJCQlJTlRfR0VUKGRkcXAtPmRfcnRid2FybnMsIEFSQ0hfQ09OVkVSVCkgOgotCQkJCVhGU19RTV9SVEJXQVJOTElNSVQ7Ci0JCXFpbmYtPnFpX2JoYXJkbGltaXQgPQotCQkJCUlOVF9HRVQoZGRxcC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOwotCQlxaW5mLT5xaV9ic29mdGxpbWl0ID0KLQkJCQlJTlRfR0VUKGRkcXAtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKTsKLQkJcWluZi0+cWlfaWhhcmRsaW1pdCA9Ci0JCQkJSU5UX0dFVChkZHFwLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCk7Ci0JCXFpbmYtPnFpX2lzb2Z0bGltaXQgPQotCQkJCUlOVF9HRVQoZGRxcC0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOwotCQlxaW5mLT5xaV9ydGJoYXJkbGltaXQgPQotCQkJCUlOVF9HRVQoZGRxcC0+ZF9ydGJfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOwotCQlxaW5mLT5xaV9ydGJzb2Z0bGltaXQgPQotCQkJCUlOVF9HRVQoZGRxcC0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlxaW5mLT5xaV9idGltZWxpbWl0ID0gZGRxcC0+ZF9idGltZXIgPworCQkJYmUzMl90b19jcHUoZGRxcC0+ZF9idGltZXIpIDogWEZTX1FNX0JUSU1FTElNSVQ7CisJCXFpbmYtPnFpX2l0aW1lbGltaXQgPSBkZHFwLT5kX2l0aW1lciA/CisJCQliZTMyX3RvX2NwdShkZHFwLT5kX2l0aW1lcikgOiBYRlNfUU1fSVRJTUVMSU1JVDsKKwkJcWluZi0+cWlfcnRidGltZWxpbWl0ID0gZGRxcC0+ZF9ydGJ0aW1lciA/CisJCQliZTMyX3RvX2NwdShkZHFwLT5kX3J0YnRpbWVyKSA6IFhGU19RTV9SVEJUSU1FTElNSVQ7CisJCXFpbmYtPnFpX2J3YXJubGltaXQgPSBkZHFwLT5kX2J3YXJucyA/CisJCQliZTE2X3RvX2NwdShkZHFwLT5kX2J3YXJucykgOiBYRlNfUU1fQldBUk5MSU1JVDsKKwkJcWluZi0+cWlfaXdhcm5saW1pdCA9IGRkcXAtPmRfaXdhcm5zID8KKwkJCWJlMTZfdG9fY3B1KGRkcXAtPmRfaXdhcm5zKSA6IFhGU19RTV9JV0FSTkxJTUlUOworCQlxaW5mLT5xaV9ydGJ3YXJubGltaXQgPSBkZHFwLT5kX3J0Yndhcm5zID8KKwkJCWJlMTZfdG9fY3B1KGRkcXAtPmRfcnRid2FybnMpIDogWEZTX1FNX1JUQldBUk5MSU1JVDsKKwkJcWluZi0+cWlfYmhhcmRsaW1pdCA9IGJlNjRfdG9fY3B1KGRkcXAtPmRfYmxrX2hhcmRsaW1pdCk7CisJCXFpbmYtPnFpX2Jzb2Z0bGltaXQgPSBiZTY0X3RvX2NwdShkZHFwLT5kX2Jsa19zb2Z0bGltaXQpOworCQlxaW5mLT5xaV9paGFyZGxpbWl0ID0gYmU2NF90b19jcHUoZGRxcC0+ZF9pbm9faGFyZGxpbWl0KTsKKwkJcWluZi0+cWlfaXNvZnRsaW1pdCA9IGJlNjRfdG9fY3B1KGRkcXAtPmRfaW5vX3NvZnRsaW1pdCk7CisJCXFpbmYtPnFpX3J0YmhhcmRsaW1pdCA9IGJlNjRfdG9fY3B1KGRkcXAtPmRfcnRiX2hhcmRsaW1pdCk7CisJCXFpbmYtPnFpX3J0YnNvZnRsaW1pdCA9IGJlNjRfdG9fY3B1KGRkcXAtPmRfcnRiX3NvZnRsaW1pdCk7CiAgCiAJCS8qCiAJCSAqIFdlIHNlbnQgdGhlIFhGU19RTU9QVF9EUVNVU0VSIGZsYWcgdG8gZHFnZXQgYmVjYXVzZQpAQCAtMTUyNywxNSArMTQ5NCwxNSBAQAogCQkgKi8KIAkJKHZvaWQpIHhmc19xbV9kcWNoZWNrKGRkcSwgaWQraiwgdHlwZSwgWEZTX1FNT1BUX0RRUkVQQUlSLAogCQkJCSAgICAgICJ4ZnNfcXVvdGFjaGVjayIpOwotCQlJTlRfU0VUKGRkcS0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCwgMFVMTCk7Ci0JCUlOVF9TRVQoZGRxLT5kX2ljb3VudCwgQVJDSF9DT05WRVJULCAwVUxMKTsKLQkJSU5UX1NFVChkZHEtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCwgMFVMTCk7Ci0JCUlOVF9TRVQoZGRxLT5kX2J0aW1lciwgQVJDSF9DT05WRVJULCAodGltZV90KTApOwotCQlJTlRfU0VUKGRkcS0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCwgKHRpbWVfdCkwKTsKLQkJSU5UX1NFVChkZHEtPmRfcnRidGltZXIsIEFSQ0hfQ09OVkVSVCwgKHRpbWVfdCkwKTsKLQkJSU5UX1NFVChkZHEtPmRfYndhcm5zLCBBUkNIX0NPTlZFUlQsIDBVTCk7Ci0JCUlOVF9TRVQoZGRxLT5kX2l3YXJucywgQVJDSF9DT05WRVJULCAwVUwpOwotCQlJTlRfU0VUKGRkcS0+ZF9ydGJ3YXJucywgQVJDSF9DT05WRVJULCAwVUwpOworCQlkZHEtPmRfYmNvdW50ID0gMDsKKwkJZGRxLT5kX2ljb3VudCA9IDA7CisJCWRkcS0+ZF9ydGJjb3VudCA9IDA7CisJCWRkcS0+ZF9idGltZXIgPSAwOworCQlkZHEtPmRfaXRpbWVyID0gMDsKKwkJZGRxLT5kX3J0YnRpbWVyID0gMDsKKwkJZGRxLT5kX2J3YXJucyA9IDA7CisJCWRkcS0+ZF9pd2FybnMgPSAwOworCQlkZHEtPmRfcnRid2FybnMgPSAwOwogCQlkZHEgPSAoeGZzX2Rpc2tfZHF1b3RfdCAqKSAoKHhmc19kcWJsa190ICopZGRxICsgMSk7CiAJfQogCkBAIC0xNzA4LDE0ICsxNjc1LDE0IEBACiAJICogQWRqdXN0IHRoZSBpbm9kZSBjb3VudCBhbmQgdGhlIGJsb2NrIGNvdW50IHRvIHJlZmxlY3QgdGhpcyBpbm9kZSdzCiAJICogcmVzb3VyY2UgdXNhZ2UuCiAJICovCi0JSU5UX01PRChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJULCArMSk7CisJYmU2NF9hZGQoJmRxcC0+cV9jb3JlLmRfaWNvdW50LCAxKTsKIAlkcXAtPnFfcmVzX2ljb3VudCsrOwogCWlmIChuYmxrcykgewotCQlJTlRfTU9EKGRxcC0+cV9jb3JlLmRfYmNvdW50LCBBUkNIX0NPTlZFUlQsIG5ibGtzKTsKKwkJYmU2NF9hZGQoJmRxcC0+cV9jb3JlLmRfYmNvdW50LCBuYmxrcyk7CiAJCWRxcC0+cV9yZXNfYmNvdW50ICs9IG5ibGtzOwogCX0KIAlpZiAocnRibGtzKSB7Ci0JCUlOVF9NT0QoZHFwLT5xX2NvcmUuZF9ydGJjb3VudCwgQVJDSF9DT05WRVJULCBydGJsa3MpOworCQliZTY0X2FkZCgmZHFwLT5xX2NvcmUuZF9ydGJjb3VudCwgcnRibGtzKTsKIAkJZHFwLT5xX3Jlc19ydGJjb3VudCArPSBydGJsa3M7CiAJfQogCkBAIC0yMjAyLDcgKzIxNjksNyBAQAogCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVNIQUtFOiBVTkxJTktJTkciKTsKICNpZmRlZiBRVU9UQURFQlVHCiAJCWNtbl9lcnIoQ0VfREVCVUcsICJTaGFrZSAweCVwLCBJRCAweCV4XG4iLAotCQkJZHFwLCBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkpOworCQkJZHFwLCBiZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2lkKSk7CiAjZW5kaWYKIAkJQVNTRVJUKGRxcC0+cV9ucmVmcyA9PSAwKTsKIAkJbmV4dGRxcCA9IGRxcC0+ZHFfZmxuZXh0OwpAQCAtMjY3MCw3ICsyNjM3LDcgQEAKIAkJCVhGU19RTU9QVF9SRVNfUlRCTEtTIDogWEZTX1FNT1BUX1JFU19SRUdCTEtTOwogCiAJaWYgKFhGU19JU19VUVVPVEFfT04obXApICYmIHVkcXAgJiYKLQkgICAgaXAtPmlfZC5kaV91aWQgIT0gKHVpZF90KUlOVF9HRVQodWRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkgICAgaXAtPmlfZC5kaV91aWQgIT0gKHVpZF90KWJlMzJfdG9fY3B1KHVkcXAtPnFfY29yZS5kX2lkKSkgewogCQlkZWxibGtzdWRxID0gdWRxcDsKIAkJLyoKIAkJICogSWYgdGhlcmUgYXJlIGRlbGF5ZWQgYWxsb2NhdGlvbiBibG9ja3MsIHRoZW4gd2UgaGF2ZSB0bwpAQCAtMjY4MywxMCArMjY1MCwxMCBAQAogCQl9CiAJfQogCWlmIChYRlNfSVNfT1FVT1RBX09OKGlwLT5pX21vdW50KSAmJiBnZHFwKSB7Ci0JCWlmICgoWEZTX0lTX0dRVU9UQV9PTihpcC0+aV9tb3VudCkgJiYgaXAtPmlfZC5kaV9naWQgIT0KLQkJCQlJTlRfR0VUKGdkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpKSB8fAotCQkgICAgKFhGU19JU19QUVVPVEFfT04oaXAtPmlfbW91bnQpICYmIGlwLT5pX2QuZGlfcHJvamlkICE9Ci0JCQkJSU5UX0dFVChnZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSkpIHsKKwkJaWYgKChYRlNfSVNfR1FVT1RBX09OKGlwLT5pX21vdW50KSAmJgorCQkgICAgIGlwLT5pX2QuZGlfZ2lkICE9IGJlMzJfdG9fY3B1KGdkcXAtPnFfY29yZS5kX2lkKSkgfHwKKwkJICAgIChYRlNfSVNfUFFVT1RBX09OKGlwLT5pX21vdW50KSAmJgorCQkgICAgIGlwLT5pX2QuZGlfcHJvamlkICE9IGJlMzJfdG9fY3B1KGdkcXAtPnFfY29yZS5kX2lkKSkpIHsKIAkJCWRlbGJsa3NnZHEgPSBnZHFwOwogCQkJaWYgKGRlbGJsa3MpIHsKIAkJCQlBU1NFUlQoaXAtPmlfZ2RxdW90KTsKQEAgLTI3NzYsNyArMjc0Myw3IEBACiAJCXhmc19kcXVubG9jayh1ZHFwKTsKIAkJQVNTRVJUKGlwLT5pX3VkcXVvdCA9PSBOVUxMKTsKIAkJaXAtPmlfdWRxdW90ID0gdWRxcDsKLQkJQVNTRVJUKGlwLT5pX2QuZGlfdWlkID09IElOVF9HRVQodWRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkpOworCQlBU1NFUlQoaXAtPmlfZC5kaV91aWQgPT0gYmUzMl90b19jcHUodWRxcC0+cV9jb3JlLmRfaWQpKTsKIAkJeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgdWRxcCwgWEZTX1RSQU5TX0RRX0lDT1VOVCwgMSk7CiAJfQogCWlmIChnZHFwKSB7CkBAIC0yNzg1LDcgKzI3NTIsNyBAQAogCQl4ZnNfZHF1bmxvY2soZ2RxcCk7CiAJCUFTU0VSVChpcC0+aV9nZHF1b3QgPT0gTlVMTCk7CiAJCWlwLT5pX2dkcXVvdCA9IGdkcXA7Ci0JCUFTU0VSVChpcC0+aV9kLmRpX2dpZCA9PSBJTlRfR0VUKGdkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpKTsKKwkJQVNTRVJUKGlwLT5pX2QuZGlfZ2lkID09IGJlMzJfdG9fY3B1KGdkcXAtPnFfY29yZS5kX2lkKSk7CiAJCXhmc190cmFuc19tb2RfZHF1b3QodHAsIGdkcXAsIFhGU19UUkFOU19EUV9JQ09VTlQsIDEpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uaCBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uaAppbmRleCAwYjAwYjNjLi4xMmRhMjU5IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtLmgKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX1FNX0hfXwogI2RlZmluZSBfX1hGU19RTV9IX18KQEAgLTQwLDYgKzI2LDcgQEAKIHN0cnVjdCB4ZnNfcW07CiBzdHJ1Y3QgeGZzX2lub2RlOwogCitleHRlcm4gdWludAkJbmRxdW90OwogZXh0ZXJuIG11dGV4X3QJCXhmc19HcW1fbG9jazsKIGV4dGVybiBzdHJ1Y3QgeGZzX3FtCSp4ZnNfR3FtOwogZXh0ZXJuIGttZW1fem9uZV90CSpxbV9kcXpvbmU7CkBAIC02NSw5ICs1Miw4IEBACiAvKgogICogRHF1b3QgaGFzaHRhYmxlIGNvbnN0YW50cy90aHJlc2hvbGQgdmFsdWVzLgogICovCi0jZGVmaW5lIFhGU19RTV9OQ1NJWkVfVEhSRVNIT0xECQk1MDAwCi0jZGVmaW5lIFhGU19RTV9IQVNIU0laRV9MT1cJCTMyCi0jZGVmaW5lIFhGU19RTV9IQVNIU0laRV9ISUdICQk2NAorI2RlZmluZSBYRlNfUU1fSEFTSFNJWkVfTE9XCQkoTkJQUCAvIHNpemVvZih4ZnNfZHFoYXNoX3QpKQorI2RlZmluZSBYRlNfUU1fSEFTSFNJWkVfSElHSAkJKChOQlBQICogNCkgLyBzaXplb2YoeGZzX2RxaGFzaF90KSkKIAogLyoKICAqIFdlIG91dHB1dCBhIGNtbl9lcnIgd2hlbiBxdW90YWNoZWNraW5nIGEgcXVvdGEgZmlsZSB3aXRoIG1vcmUgdGhhbgpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMKaW5kZXggODg5MGExOC4uZDlkMjk5MyAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX2Jodi5jCkBAIC0xLDcwICsxLDU1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKICNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfY2xudC5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19hbGxvYy5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2FjbC5oIgogI2luY2x1ZGUgInhmc19jYXAuaCIKICNpbmNsdWRlICJ4ZnNfbWFjLmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKLQogI2luY2x1ZGUgInhmc19xbS5oIgogCiAjZGVmaW5lIE1OVE9QVF9RVU9UQQkicXVvdGEiCQkvKiBkaXNrIHF1b3RhcyAodXNlcikgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3RhdHMuYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3RhdHMuYwppbmRleCAyOTk3OGUwLi4wNTcwZjc3IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtX3N0YXRzLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zdGF0cy5jCkBAIC0xLDY5ICsxLDU0IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKICNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX2l0YWJsZS5oIgogI2luY2x1ZGUgInhmc19ydy5oIgogI2luY2x1ZGUgInhmc19hY2wuaCIKICNpbmNsdWRlICJ4ZnNfY2FwLmgiCiAjaW5jbHVkZSAieGZzX21hYy5oIgogI2luY2x1ZGUgInhmc19hdHRyLmgiCiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCi0KICNpbmNsdWRlICJ4ZnNfcW0uaCIKIAogc3RydWN0IHhxbXN0YXRzIHhxbXN0YXRzOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9zdGF0cy5oIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zdGF0cy5oCmluZGV4IDgwOTNjNWMuLmE1MGZmYWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3RhdHMuaAorKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N0YXRzLmgKQEAgLTEsMzggKzEsMjMgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19RTV9TVEFUU19IX18KICNkZWZpbmUgX19YRlNfUU1fU1RBVFNfSF9fCiAKLQogI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmICFkZWZpbmVkKFhGU19TVEFUU19PRkYpCiAKIC8qCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKaW5kZXggMTVlMDJlOC4uMjQ2OTBlMSAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYwpAQCAtMSw2MiArMSw0OCBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCiAjaW5jbHVkZSAieGZzX2ZzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2Rpci5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgotI2luY2x1ZGUgInhmc19pdGFibGUuaCIKICNpbmNsdWRlICJ4ZnNfcncuaCIKICNpbmNsdWRlICJ4ZnNfYWNsLmgiCiAjaW5jbHVkZSAieGZzX2NhcC5oIgpAQCAtNjQsNyArNTAsNiBAQAogI2luY2x1ZGUgInhmc19hdHRyLmgiCiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3V0aWxzLmgiCi0KICNpbmNsdWRlICJ4ZnNfcW0uaCIKIAogI2lmZGVmIERFQlVHCkBAIC0xMDksMTAgKzk0LDcgQEAKIAl2ZnNwID0gYmh2dG92ZnMoYmRwKTsKIAltcCA9IFhGU19WRlNUT00odmZzcCk7CiAKLQlpZiAoYWRkciA9PSBOVUxMICYmIGNtZCAhPSBRX1NZTkMpCi0JCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKLQlpZiAoaWQgPCAwICYmIGNtZCAhPSBRX1NZTkMpCi0JCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwlBU1NFUlQoYWRkciAhPSBOVUxMIHx8IGNtZCA9PSBRX1hRVU9UQVNZTkMpOwogCiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSB2YWxpZCBldmVuIHdoZW4gcXVvdGFvZmYuCkBAIC0xMjIsNyArMTA0LDcgQEAKIAkJLyoKIAkJICogVHJ1bmNhdGUgcXVvdGEgZmlsZXMuIHF1b3RhIG11c3QgYmUgb2ZmLgogCQkgKi8KLQkJaWYgKFhGU19JU19RVU9UQV9PTihtcCkgfHwgYWRkciA9PSBOVUxMKQorCQlpZiAoWEZTX0lTX1FVT1RBX09OKG1wKSkKIAkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAkJaWYgKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkKIAkJCXJldHVybiBYRlNfRVJST1IoRVJPRlMpOwpAQCAtMTQwLDggKzEyMiw2IEBACiAJCSAqIFFVT1RBT04gLSBlbmFibGluZyBxdW90YSBlbmZvcmNlbWVudC4KIAkJICogUXVvdGEgYWNjb3VudGluZyBtdXN0IGJlIHR1cm5lZCBvbiBhdCBtb3VudCB0aW1lLgogCQkgKi8KLQkJaWYgKGFkZHIgPT0gTlVMTCkKLQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAkJaWYgKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkKIAkJCXJldHVybiBYRlNfRVJST1IoRVJPRlMpOwogCQlyZXR1cm4gKHhmc19xbV9zY2FsbF9xdW90YW9uKG1wLApAQCAtMTUyLDYgKzEzMiw5IEBACiAJCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKIAkJYnJlYWs7CiAKKwljYXNlIFFfWFFVT1RBU1lOQzoKKwkJcmV0dXJuICh4ZnNfc3luY19pbm9kZXMobXAsIFNZTkNfREVMV1JJLCAwLCBOVUxMKSk7CisKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC02NTUsMTMgKzYzOCwxMyBAQAogCSAqLwogCWhhcmQgPSAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX0JIQVJEKSA/CiAJCSh4ZnNfcWNudF90KSBYRlNfQkJfVE9fRlNCKG1wLCBuZXdsaW0tPmRfYmxrX2hhcmRsaW1pdCkgOgotCQkJSU5UX0dFVChkZHEtPmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwkJCWJlNjRfdG9fY3B1KGRkcS0+ZF9ibGtfaGFyZGxpbWl0KTsKIAlzb2Z0ID0gKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9CU09GVCkgPwogCQkoeGZzX3FjbnRfdCkgWEZTX0JCX1RPX0ZTQihtcCwgbmV3bGltLT5kX2Jsa19zb2Z0bGltaXQpIDoKLQkJCUlOVF9HRVQoZGRxLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCQliZTY0X3RvX2NwdShkZHEtPmRfYmxrX3NvZnRsaW1pdCk7CiAJaWYgKGhhcmQgPT0gMCB8fCBoYXJkID49IHNvZnQpIHsKLQkJSU5UX1NFVChkZHEtPmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJULCBoYXJkKTsKLQkJSU5UX1NFVChkZHEtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJULCBzb2Z0KTsKKwkJZGRxLT5kX2Jsa19oYXJkbGltaXQgPSBjcHVfdG9fYmU2NChoYXJkKTsKKwkJZGRxLT5kX2Jsa19zb2Z0bGltaXQgPSBjcHVfdG9fYmU2NChzb2Z0KTsKIAkJaWYgKGlkID09IDApIHsKIAkJCW1wLT5tX3F1b3RhaW5mby0+cWlfYmhhcmRsaW1pdCA9IGhhcmQ7CiAJCQltcC0+bV9xdW90YWluZm8tPnFpX2Jzb2Z0bGltaXQgPSBzb2Z0OwpAQCAtNjcxLDEzICs2NTQsMTMgQEAKIAl9CiAJaGFyZCA9IChuZXdsaW0tPmRfZmllbGRtYXNrICYgRlNfRFFfUlRCSEFSRCkgPwogCQkoeGZzX3FjbnRfdCkgWEZTX0JCX1RPX0ZTQihtcCwgbmV3bGltLT5kX3J0Yl9oYXJkbGltaXQpIDoKLQkJCUlOVF9HRVQoZGRxLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCQliZTY0X3RvX2NwdShkZHEtPmRfcnRiX2hhcmRsaW1pdCk7CiAJc29mdCA9IChuZXdsaW0tPmRfZmllbGRtYXNrICYgRlNfRFFfUlRCU09GVCkgPwogCQkoeGZzX3FjbnRfdCkgWEZTX0JCX1RPX0ZTQihtcCwgbmV3bGltLT5kX3J0Yl9zb2Z0bGltaXQpIDoKLQkJCUlOVF9HRVQoZGRxLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCQliZTY0X3RvX2NwdShkZHEtPmRfcnRiX3NvZnRsaW1pdCk7CiAJaWYgKGhhcmQgPT0gMCB8fCBoYXJkID49IHNvZnQpIHsKLQkJSU5UX1NFVChkZHEtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJULCBoYXJkKTsKLQkJSU5UX1NFVChkZHEtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJULCBzb2Z0KTsKKwkJZGRxLT5kX3J0Yl9oYXJkbGltaXQgPSBjcHVfdG9fYmU2NChoYXJkKTsKKwkJZGRxLT5kX3J0Yl9zb2Z0bGltaXQgPSBjcHVfdG9fYmU2NChzb2Z0KTsKIAkJaWYgKGlkID09IDApIHsKIAkJCW1wLT5tX3F1b3RhaW5mby0+cWlfcnRiaGFyZGxpbWl0ID0gaGFyZDsKIAkJCW1wLT5tX3F1b3RhaW5mby0+cWlfcnRic29mdGxpbWl0ID0gc29mdDsKQEAgLTY4OCwxMyArNjcxLDEzIEBACiAKIAloYXJkID0gKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9JSEFSRCkgPwogCQkoeGZzX3FjbnRfdCkgbmV3bGltLT5kX2lub19oYXJkbGltaXQgOgotCQkJSU5UX0dFVChkZHEtPmRfaW5vX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwkJCWJlNjRfdG9fY3B1KGRkcS0+ZF9pbm9faGFyZGxpbWl0KTsKIAlzb2Z0ID0gKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9JU09GVCkgPwogCQkoeGZzX3FjbnRfdCkgbmV3bGltLT5kX2lub19zb2Z0bGltaXQgOgotCQkJSU5UX0dFVChkZHEtPmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwkJCWJlNjRfdG9fY3B1KGRkcS0+ZF9pbm9fc29mdGxpbWl0KTsKIAlpZiAoaGFyZCA9PSAwIHx8IGhhcmQgPj0gc29mdCkgewotCQlJTlRfU0VUKGRkcS0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQsIGhhcmQpOwotCQlJTlRfU0VUKGRkcS0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQsIHNvZnQpOworCQlkZHEtPmRfaW5vX2hhcmRsaW1pdCA9IGNwdV90b19iZTY0KGhhcmQpOworCQlkZHEtPmRfaW5vX3NvZnRsaW1pdCA9IGNwdV90b19iZTY0KHNvZnQpOwogCQlpZiAoaWQgPT0gMCkgewogCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9paGFyZGxpbWl0ID0gaGFyZDsKIAkJCW1wLT5tX3F1b3RhaW5mby0+cWlfaXNvZnRsaW1pdCA9IHNvZnQ7CkBAIC03MDcsMTEgKzY5MCwxMSBAQAogCSAqIFVwZGF0ZSB3YXJuaW5ncyBjb3VudGVyKHMpIGlmIHJlcXVlc3RlZAogCSAqLwogCWlmIChuZXdsaW0tPmRfZmllbGRtYXNrICYgRlNfRFFfQldBUk5TKQotCQlJTlRfU0VUKGRkcS0+ZF9id2FybnMsIEFSQ0hfQ09OVkVSVCwgbmV3bGltLT5kX2J3YXJucyk7CisJCWRkcS0+ZF9id2FybnMgPSBjcHVfdG9fYmUxNihuZXdsaW0tPmRfYndhcm5zKTsKIAlpZiAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX0lXQVJOUykKLQkJSU5UX1NFVChkZHEtPmRfaXdhcm5zLCBBUkNIX0NPTlZFUlQsIG5ld2xpbS0+ZF9pd2FybnMpOworCQlkZHEtPmRfaXdhcm5zID0gY3B1X3RvX2JlMTYobmV3bGltLT5kX2l3YXJucyk7CiAJaWYgKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9SVEJXQVJOUykKLQkJSU5UX1NFVChkZHEtPmRfcnRid2FybnMsIEFSQ0hfQ09OVkVSVCwgbmV3bGltLT5kX3J0Yndhcm5zKTsKKwkJZGRxLT5kX3J0Yndhcm5zID0gY3B1X3RvX2JlMTYobmV3bGltLT5kX3J0Yndhcm5zKTsKIAogCWlmIChpZCA9PSAwKSB7CiAJCS8qCkBAIC03MjMsMTUgKzcwNiwxNSBAQAogCQkgKi8KIAkJaWYgKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9CVElNRVIpIHsKIAkJCW1wLT5tX3F1b3RhaW5mby0+cWlfYnRpbWVsaW1pdCA9IG5ld2xpbS0+ZF9idGltZXI7Ci0JCQlJTlRfU0VUKGRkcS0+ZF9idGltZXIsIEFSQ0hfQ09OVkVSVCwgbmV3bGltLT5kX2J0aW1lcik7CisJCQlkZHEtPmRfYnRpbWVyID0gY3B1X3RvX2JlMzIobmV3bGltLT5kX2J0aW1lcik7CiAJCX0KIAkJaWYgKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9JVElNRVIpIHsKIAkJCW1wLT5tX3F1b3RhaW5mby0+cWlfaXRpbWVsaW1pdCA9IG5ld2xpbS0+ZF9pdGltZXI7Ci0JCQlJTlRfU0VUKGRkcS0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCwgbmV3bGltLT5kX2l0aW1lcik7CisJCQlkZHEtPmRfaXRpbWVyID0gY3B1X3RvX2JlMzIobmV3bGltLT5kX2l0aW1lcik7CiAJCX0KIAkJaWYgKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9SVEJUSU1FUikgewogCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9ydGJ0aW1lbGltaXQgPSBuZXdsaW0tPmRfcnRidGltZXI7Ci0JCQlJTlRfU0VUKGRkcS0+ZF9ydGJ0aW1lciwgQVJDSF9DT05WRVJULCBuZXdsaW0tPmRfcnRidGltZXIpOworCQkJZGRxLT5kX3J0YnRpbWVyID0gY3B1X3RvX2JlMzIobmV3bGltLT5kX3J0YnRpbWVyKTsKIAkJfQogCQlpZiAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX0JXQVJOUykKIAkJCW1wLT5tX3F1b3RhaW5mby0+cWlfYndhcm5saW1pdCA9IG5ld2xpbS0+ZF9id2FybnM7CkBAIC05MDIsMzMgKzg4NSwyNyBAQAogewogCW1lbXNldChkc3QsIDAsIHNpemVvZigqZHN0KSk7CiAJZHN0LT5kX3ZlcnNpb24gPSBGU19EUVVPVF9WRVJTSU9OOyAgLyogZGlmZmVyZW50IGZyb20gc3JjLT5kX3ZlcnNpb24gKi8KLQlkc3QtPmRfZmxhZ3MgPQotCQl4ZnNfcW1fZXhwb3J0X3F0eXBlX2ZsYWdzKElOVF9HRVQoc3JjLT5kX2ZsYWdzLCBBUkNIX0NPTlZFUlQpKTsKLQlkc3QtPmRfaWQgPSBJTlRfR0VUKHNyYy0+ZF9pZCwgQVJDSF9DT05WRVJUKTsKLQlkc3QtPmRfYmxrX2hhcmRsaW1pdCA9IChfX3VpbnQ2NF90KQotCQlYRlNfRlNCX1RPX0JCKG1wLCBJTlRfR0VUKHNyYy0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKLQlkc3QtPmRfYmxrX3NvZnRsaW1pdCA9IChfX3VpbnQ2NF90KQotCQlYRlNfRlNCX1RPX0JCKG1wLCBJTlRfR0VUKHNyYy0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKLQlkc3QtPmRfaW5vX2hhcmRsaW1pdCA9IChfX3VpbnQ2NF90KQotCQlJTlRfR0VUKHNyYy0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOwotCWRzdC0+ZF9pbm9fc29mdGxpbWl0ID0gKF9fdWludDY0X3QpCi0JCUlOVF9HRVQoc3JjLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7Ci0JZHN0LT5kX2Jjb3VudCA9IChfX3VpbnQ2NF90KQotCQlYRlNfRlNCX1RPX0JCKG1wLCBJTlRfR0VUKHNyYy0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkpOwotCWRzdC0+ZF9pY291bnQgPSAoX191aW50NjRfdCkgSU5UX0dFVChzcmMtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpOwotCWRzdC0+ZF9idGltZXIgPSAoX191aW50MzJfdCkgSU5UX0dFVChzcmMtPmRfYnRpbWVyLCBBUkNIX0NPTlZFUlQpOwotCWRzdC0+ZF9pdGltZXIgPSAoX191aW50MzJfdCkgSU5UX0dFVChzcmMtPmRfaXRpbWVyLCBBUkNIX0NPTlZFUlQpOwotCWRzdC0+ZF9pd2FybnMgPSBJTlRfR0VUKHNyYy0+ZF9pd2FybnMsIEFSQ0hfQ09OVkVSVCk7Ci0JZHN0LT5kX2J3YXJucyA9IElOVF9HRVQoc3JjLT5kX2J3YXJucywgQVJDSF9DT05WRVJUKTsKLQotCWRzdC0+ZF9ydGJfaGFyZGxpbWl0ID0gKF9fdWludDY0X3QpCi0JCVhGU19GU0JfVE9fQkIobXAsIElOVF9HRVQoc3JjLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpOwotCWRzdC0+ZF9ydGJfc29mdGxpbWl0ID0gKF9fdWludDY0X3QpCi0JCVhGU19GU0JfVE9fQkIobXAsIElOVF9HRVQoc3JjLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpOwotCWRzdC0+ZF9ydGJjb3VudCA9IChfX3VpbnQ2NF90KQotCQlYRlNfRlNCX1RPX0JCKG1wLCBJTlRfR0VUKHNyYy0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSk7Ci0JZHN0LT5kX3J0YnRpbWVyID0gKF9fdWludDMyX3QpIElOVF9HRVQoc3JjLT5kX3J0YnRpbWVyLCBBUkNIX0NPTlZFUlQpOwotCWRzdC0+ZF9ydGJ3YXJucyA9IElOVF9HRVQoc3JjLT5kX3J0Yndhcm5zLCBBUkNIX0NPTlZFUlQpOworCWRzdC0+ZF9mbGFncyA9IHhmc19xbV9leHBvcnRfcXR5cGVfZmxhZ3Moc3JjLT5kX2ZsYWdzKTsKKwlkc3QtPmRfaWQgPSBiZTMyX3RvX2NwdShzcmMtPmRfaWQpOworCWRzdC0+ZF9ibGtfaGFyZGxpbWl0ID0KKwkJWEZTX0ZTQl9UT19CQihtcCwgYmU2NF90b19jcHUoc3JjLT5kX2Jsa19oYXJkbGltaXQpKTsKKwlkc3QtPmRfYmxrX3NvZnRsaW1pdCA9CisJCVhGU19GU0JfVE9fQkIobXAsIGJlNjRfdG9fY3B1KHNyYy0+ZF9ibGtfc29mdGxpbWl0KSk7CisJZHN0LT5kX2lub19oYXJkbGltaXQgPSBiZTY0X3RvX2NwdShzcmMtPmRfaW5vX2hhcmRsaW1pdCk7CisJZHN0LT5kX2lub19zb2Z0bGltaXQgPSBiZTY0X3RvX2NwdShzcmMtPmRfaW5vX3NvZnRsaW1pdCk7CisJZHN0LT5kX2Jjb3VudCA9IFhGU19GU0JfVE9fQkIobXAsIGJlNjRfdG9fY3B1KHNyYy0+ZF9iY291bnQpKTsKKwlkc3QtPmRfaWNvdW50ID0gYmU2NF90b19jcHUoc3JjLT5kX2ljb3VudCk7CisJZHN0LT5kX2J0aW1lciA9IGJlMzJfdG9fY3B1KHNyYy0+ZF9idGltZXIpOworCWRzdC0+ZF9pdGltZXIgPSBiZTMyX3RvX2NwdShzcmMtPmRfaXRpbWVyKTsKKwlkc3QtPmRfaXdhcm5zID0gYmUxNl90b19jcHUoc3JjLT5kX2l3YXJucyk7CisJZHN0LT5kX2J3YXJucyA9IGJlMTZfdG9fY3B1KHNyYy0+ZF9id2FybnMpOworCWRzdC0+ZF9ydGJfaGFyZGxpbWl0ID0KKwkJWEZTX0ZTQl9UT19CQihtcCwgYmU2NF90b19jcHUoc3JjLT5kX3J0Yl9oYXJkbGltaXQpKTsKKwlkc3QtPmRfcnRiX3NvZnRsaW1pdCA9CisJCVhGU19GU0JfVE9fQkIobXAsIGJlNjRfdG9fY3B1KHNyYy0+ZF9ydGJfc29mdGxpbWl0KSk7CisJZHN0LT5kX3J0YmNvdW50ID0gWEZTX0ZTQl9UT19CQihtcCwgYmU2NF90b19jcHUoc3JjLT5kX3J0YmNvdW50KSk7CisJZHN0LT5kX3J0YnRpbWVyID0gYmUzMl90b19jcHUoc3JjLT5kX3J0YnRpbWVyKTsKKwlkc3QtPmRfcnRid2FybnMgPSBiZTE2X3RvX2NwdShzcmMtPmRfcnRid2FybnMpOwogCiAJLyoKIAkgKiBJbnRlcm5hbGx5LCB3ZSBkb24ndCByZXNldCBhbGwgdGhlIHRpbWVycyB3aGVuIHF1b3RhIGVuZm9yY2VtZW50CkBAIC0xMjIyLDEwICsxMTk5LDEwIEBACiAJcW10ZXN0X25mYWlscysrOwogCWlmIChlcnJvcikKIAkJY21uX2VycihDRV9ERUJVRywgInF1b3RhY2hlY2sgZmFpbGVkIGlkPSVkLCBlcnI9JWRcbnJlYXNvbjogJXMiLAotCQkgICAgICAgSU5UX0dFVChkLT5kX2lkLCBBUkNIX0NPTlZFUlQpLCBlcnJvciwgcmVhc29uKTsKKwkJICAgICAgIGQtPmRfaWQsIGVycm9yLCByZWFzb24pOwogCWVsc2UKIAkJY21uX2VycihDRV9ERUJVRywgInF1b3RhY2hlY2sgZmFpbGVkIGlkPSVkICglcykgWyVkICE9ICVkXSIsCi0JCSAgICAgICBJTlRfR0VUKGQtPmRfaWQsIEFSQ0hfQ09OVkVSVCksIHJlYXNvbiwgKGludClhLCAoaW50KWIpOworCQkgICAgICAgZC0+ZF9pZCwgcmVhc29uLCAoaW50KWEsIChpbnQpYik7CiAJeGZzX3FtX2RxdGVzdF9wcmludChkKTsKIAlpZiAoZHFwKQogCQl4ZnNfcW1fZHFwcmludChkcXApOwpAQCAtMTIzNywyMSArMTIxNCwyMSBAQAogCXhmc19kcXVvdF90CSpkcXApCiB7CiAJaW50IGVyciA9IDA7Ci0JaWYgKElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkgIT0gZC0+ZF9pY291bnQpIHsKKwlpZiAoYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pY291bnQpICE9IGQtPmRfaWNvdW50KSB7CiAJCXhmc19xbV9kcXRlc3RfZmFpbGVkKGQsIGRxcCwgImljb3VudCBtaXNtYXRjaCIsCi0JCQlJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pY291bnQpLAogCQkJZC0+ZF9pY291bnQsIDApOwogCQllcnIrKzsKIAl9Ci0JaWYgKElOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkgIT0gZC0+ZF9iY291bnQpIHsKKwlpZiAoYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9iY291bnQpICE9IGQtPmRfYmNvdW50KSB7CiAJCXhmc19xbV9kcXRlc3RfZmFpbGVkKGQsIGRxcCwgImJjb3VudCBtaXNtYXRjaCIsCi0JCQlJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9iY291bnQpLAogCQkJZC0+ZF9iY291bnQsIDApOwogCQllcnIrKzsKIAl9Ci0JaWYgKElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCi0JICAgIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KLQkgICAgSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwlpZiAoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0ICYmCisJICAgIGJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfYmNvdW50KSA+PQorCSAgICBiZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQpKSB7CiAJCWlmICghZHFwLT5xX2NvcmUuZF9idGltZXIgJiYgZHFwLT5xX2NvcmUuZF9pZCkgewogCQkJY21uX2VycihDRV9ERUJVRywKIAkJCQkiJWQgWyVzXSBbMHglcF0gQkxLIFRJTUVSIE5PVCBTVEFSVEVEIiwKQEAgLTEyNTksOSArMTIzNiw5IEBACiAJCQllcnIrKzsKIAkJfQogCX0KLQlpZiAoSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKLQkgICAgSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA+PQotCSAgICBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkgeworCWlmIChkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQgJiYKKwkgICAgYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pY291bnQpID49CisJICAgIGJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCkpIHsKIAkJaWYgKCFkcXAtPnFfY29yZS5kX2l0aW1lciAmJiBkcXAtPnFfY29yZS5kX2lkKSB7CiAJCQljbW5fZXJyKENFX0RFQlVHLAogCQkJCSIlZCBbJXNdIFsweCVwXSBJTk8gVElNRVIgTk9UIFNUQVJURUQiLApkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xdW90YV9wcml2LmggYi9mcy94ZnMvcXVvdGEveGZzX3F1b3RhX3ByaXYuaAppbmRleCBiZjQxM2U3Li43YTlmM2JlIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3F1b3RhX3ByaXYuaAorKysgYi9mcy94ZnMvcXVvdGEveGZzX3F1b3RhX3ByaXYuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19RVU9UQV9QUklWX0hfXwogI2RlZmluZSBfX1hGU19RVU9UQV9QUklWX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc190cmFuc19kcXVvdC5jIGIvZnMveGZzL3F1b3RhL3hmc190cmFuc19kcXVvdC5jCmluZGV4IDNiOTlkYWYuLjMyOTA5NzUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfdHJhbnNfZHF1b3QuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3RyYW5zX2RxdW90LmMKQEAgLTEsMzkgKzEsMjUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgogI2luY2x1ZGUgInhmc19mcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgpAQCAtNDMsMjEgKzI5LDIwIEBACiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2FjbC5oIgogI2luY2x1ZGUgInhmc19jYXAuaCIKQEAgLTY1LDcgKzUwLDYgQEAKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCi0KICNpbmNsdWRlICJ4ZnNfcW0uaCIKIAogU1RBVElDIHZvaWQJeGZzX3RyYW5zX2FsbG9jX2RxaW5mbyh4ZnNfdHJhbnNfdCAqKTsKQEAgLTQyOSwyNSArNDEzLDI1IEBACiAJCQkJcXRyeC0+cXRfZGVscnRiX2RlbHRhOwogI2lmZGVmIFFVT1RBREVCVUcKIAkJCWlmICh0b3RhbGJkZWx0YSA8IDApCi0JCQkJQVNTRVJUKElOVF9HRVQoZC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQlBU1NFUlQoYmU2NF90b19jcHUoZC0+ZF9iY291bnQpID49CiAJCQkJICAgICAgICh4ZnNfcWNudF90KSAtdG90YWxiZGVsdGEpOwogCiAJCQlpZiAodG90YWxydGJkZWx0YSA8IDApCi0JCQkJQVNTRVJUKElOVF9HRVQoZC0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUFTU0VSVChiZTY0X3RvX2NwdShkLT5kX3J0YmNvdW50KSA+PQogCQkJCSAgICAgICAoeGZzX3FjbnRfdCkgLXRvdGFscnRiZGVsdGEpOwogCiAJCQlpZiAocXRyeC0+cXRfaWNvdW50X2RlbHRhIDwgMCkKLQkJCQlBU1NFUlQoSU5UX0dFVChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUFTU0VSVChiZTY0X3RvX2NwdShkLT5kX2ljb3VudCkgPj0KIAkJCQkgICAgICAgKHhmc19xY250X3QpIC1xdHJ4LT5xdF9pY291bnRfZGVsdGEpOwogI2VuZGlmCiAJCQlpZiAodG90YWxiZGVsdGEpCi0JCQkJSU5UX01PRChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJULCAoeGZzX3FjbnRfdCl0b3RhbGJkZWx0YSk7CisJCQkJYmU2NF9hZGQoJmQtPmRfYmNvdW50LCAoeGZzX3FjbnRfdCl0b3RhbGJkZWx0YSk7CiAKIAkJCWlmIChxdHJ4LT5xdF9pY291bnRfZGVsdGEpCi0JCQkJSU5UX01PRChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJULCAoeGZzX3FjbnRfdClxdHJ4LT5xdF9pY291bnRfZGVsdGEpOworCQkJCWJlNjRfYWRkKCZkLT5kX2ljb3VudCwgKHhmc19xY250X3QpcXRyeC0+cXRfaWNvdW50X2RlbHRhKTsKIAogCQkJaWYgKHRvdGFscnRiZGVsdGEpCi0JCQkJSU5UX01PRChkLT5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQsICh4ZnNfcWNudF90KXRvdGFscnRiZGVsdGEpOworCQkJCWJlNjRfYWRkKCZkLT5kX3J0YmNvdW50LCAoeGZzX3FjbnRfdCl0b3RhbHJ0YmRlbHRhKTsKIAogCQkJLyoKIAkJCSAqIEdldCBhbnkgZGVmYXVsdCBsaW1pdHMgaW4gdXNlLgpAQCAtNTMxLDExICs1MTUsMTEgQEAKIAkJCX0KIAogCQkJQVNTRVJUKGRxcC0+cV9yZXNfYmNvdW50ID49Ci0JCQkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJCQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9iY291bnQpKTsKIAkJCUFTU0VSVChkcXAtPnFfcmVzX2ljb3VudCA+PQotCQkJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCQkJCWJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaWNvdW50KSk7CiAJCQlBU1NFUlQoZHFwLT5xX3Jlc19ydGJjb3VudCA+PQotCQkJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJCQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9ydGJjb3VudCkpOwogCQl9CiAJCS8qCiAJCSAqIERvIHRoZSBncm91cCBxdW90YXMgbmV4dApAQCAtNjQyLDI2ICs2MjYsMjYgQEAKIAl9CiAJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CiAJaWYgKGZsYWdzICYgWEZTX1RSQU5TX0RRX1JFU19CTEtTKSB7Ci0JCWhhcmRsaW1pdCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQloYXJkbGltaXQgPSBiZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jsa19oYXJkbGltaXQpOwogCQlpZiAoIWhhcmRsaW1pdCkKIAkJCWhhcmRsaW1pdCA9IHEtPnFpX2JoYXJkbGltaXQ7Ci0JCXNvZnRsaW1pdCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlzb2Z0bGltaXQgPSBiZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQpOwogCQlpZiAoIXNvZnRsaW1pdCkKIAkJCXNvZnRsaW1pdCA9IHEtPnFpX2Jzb2Z0bGltaXQ7Ci0JCXRpbWVyID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2J0aW1lciwgQVJDSF9DT05WRVJUKTsKLQkJd2FybnMgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYndhcm5zLCBBUkNIX0NPTlZFUlQpOworCQl0aW1lciA9IGJlMzJfdG9fY3B1KGRxcC0+cV9jb3JlLmRfYnRpbWVyKTsKKwkJd2FybnMgPSBiZTE2X3RvX2NwdShkcXAtPnFfY29yZS5kX2J3YXJucyk7CiAJCXdhcm5saW1pdCA9IFhGU19RSV9CV0FSTkxJTUlUKGRxcC0+cV9tb3VudCk7CiAJCXJlc2Jjb3VudHAgPSAmZHFwLT5xX3Jlc19iY291bnQ7CiAJfSBlbHNlIHsKIAkJQVNTRVJUKGZsYWdzICYgWEZTX1RSQU5TX0RRX1JFU19SVEJMS1MpOwotCQloYXJkbGltaXQgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwkJaGFyZGxpbWl0ID0gYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9ydGJfaGFyZGxpbWl0KTsKIAkJaWYgKCFoYXJkbGltaXQpCiAJCQloYXJkbGltaXQgPSBxLT5xaV9ydGJoYXJkbGltaXQ7Ci0JCXNvZnRsaW1pdCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlzb2Z0bGltaXQgPSBiZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX3J0Yl9zb2Z0bGltaXQpOwogCQlpZiAoIXNvZnRsaW1pdCkKIAkJCXNvZnRsaW1pdCA9IHEtPnFpX3J0YnNvZnRsaW1pdDsKLQkJdGltZXIgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfcnRidGltZXIsIEFSQ0hfQ09OVkVSVCk7Ci0JCXdhcm5zID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX3J0Yndhcm5zLCBBUkNIX0NPTlZFUlQpOworCQl0aW1lciA9IGJlMzJfdG9fY3B1KGRxcC0+cV9jb3JlLmRfcnRidGltZXIpOworCQl3YXJucyA9IGJlMTZfdG9fY3B1KGRxcC0+cV9jb3JlLmRfcnRid2FybnMpOwogCQl3YXJubGltaXQgPSBYRlNfUUlfUlRCV0FSTkxJTUlUKGRxcC0+cV9tb3VudCk7CiAJCXJlc2Jjb3VudHAgPSAmZHFwLT5xX3Jlc19ydGJjb3VudDsKIAl9CkBAIC03MDAsMTYgKzY4NCwxNCBAQAogCQkJfQogCQl9CiAJCWlmIChuaW5vcyA+IDApIHsKLQkJCWNvdW50ID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJUKTsKLQkJCXRpbWVyID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2l0aW1lciwgQVJDSF9DT05WRVJUKTsKLQkJCXdhcm5zID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2l3YXJucywgQVJDSF9DT05WRVJUKTsKKwkJCWNvdW50ID0gYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pY291bnQpOworCQkJdGltZXIgPSBiZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2l0aW1lcik7CisJCQl3YXJucyA9IGJlMTZfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaXdhcm5zKTsKIAkJCXdhcm5saW1pdCA9IFhGU19RSV9JV0FSTkxJTUlUKGRxcC0+cV9tb3VudCk7Ci0JCQloYXJkbGltaXQgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaW5vX2hhcmRsaW1pdCwKLQkJCQkJCUFSQ0hfQ09OVkVSVCk7CisJCQloYXJkbGltaXQgPSBiZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2lub19oYXJkbGltaXQpOwogCQkJaWYgKCFoYXJkbGltaXQpCiAJCQkJaGFyZGxpbWl0ID0gcS0+cWlfaWhhcmRsaW1pdDsKLQkJCXNvZnRsaW1pdCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9fc29mdGxpbWl0LAotCQkJCQkJQVJDSF9DT05WRVJUKTsKKwkJCXNvZnRsaW1pdCA9IGJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCk7CiAJCQlpZiAoIXNvZnRsaW1pdCkKIAkJCQlzb2Z0bGltaXQgPSBxLT5xaV9pc29mdGxpbWl0OwogCQkJaWYgKGhhcmRsaW1pdCA+IDBVTEwgJiYgY291bnQgPj0gaGFyZGxpbWl0KSB7CkBAIC03NTYsOSArNzM4LDkgQEAKIAkJCQkJICAgIFhGU19UUkFOU19EUV9SRVNfSU5PUywKIAkJCQkJICAgIG5pbm9zKTsKIAl9Ci0JQVNTRVJUKGRxcC0+cV9yZXNfYmNvdW50ID49IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkpOwotCUFTU0VSVChkcXAtPnFfcmVzX3J0YmNvdW50ID49IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSk7Ci0JQVNTRVJUKGRxcC0+cV9yZXNfaWNvdW50ID49IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChkcXAtPnFfcmVzX2Jjb3VudCA+PSBiZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jjb3VudCkpOworCUFTU0VSVChkcXAtPnFfcmVzX3J0YmNvdW50ID49IGJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfcnRiY291bnQpKTsKKwlBU1NFUlQoZHFwLT5xX3Jlc19pY291bnQgPj0gYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pY291bnQpKTsKIAogZXJyb3JfcmV0dXJuOgogCWlmICghIChmbGFncyAmIFhGU19RTU9QVF9EUUxPQ0spKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwppbmRleCA0ZTFhNWVjLi5iYjZkYzkxIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKQEAgLTEsMzggKzEsMjIgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJzcGluLmgiCi0KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuaAppbmRleCBjNWI5MzY1Li5hZmY1NTg2IDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYJX19YRlNfU1VQUE9SVF9ERUJVR19IX18KICNkZWZpbmUJX19YRlNfU1VQUE9SVF9ERUJVR19IX18KQEAgLTQxLDkgKzI3LDEwIEBACiAjZGVmaW5lIENFX0FMRVJUICAgICAgICAxICAgICAgICAgICAgICAgLyogYWxlcnQgICAgICAgICovCiAjZGVmaW5lIENFX1BBTklDICAgICAgICAwICAgICAgICAgICAgICAgLyogcGFuaWMgICAgICAgICovCiAKLWV4dGVybiB2b2lkIGljbW5fZXJyKGludCwgY2hhciAqLCB2YV9saXN0KTsKLS8qIFBSSU5URkxJS0UyICovCi1leHRlcm4gdm9pZCBjbW5fZXJyKGludCwgY2hhciAqLCAuLi4pOworZXh0ZXJuIHZvaWQgaWNtbl9lcnIoaW50LCBjaGFyICosIHZhX2xpc3QpCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAwKSkpOworZXh0ZXJuIHZvaWQgY21uX2VycihpbnQsIGNoYXIgKiwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKIAogI2lmbmRlZiBTVEFUSUMKICMgZGVmaW5lIFNUQVRJQyBzdGF0aWMKZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jIGIvZnMveGZzL3N1cHBvcnQva3RyYWNlLmMKaW5kZXggZmE4Mzk0Zi4uODQxYWE0YyAxMDA2NDQKLS0tIGEvZnMveGZzL3N1cHBvcnQva3RyYWNlLmMKKysrIGIvZnMveGZzL3N1cHBvcnQva3RyYWNlLmMKQEAgLTEsMzUgKzEsMjAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSA8eGZzLmg+CiAKIHN0YXRpYyBrbWVtX3pvbmVfdCAqa3RyYWNlX2hkcl96b25lOwpAQCAtNjUsNyArNTAsNyBAQAogICogbnVtYmVyIG9mIGVudHJpZXMuCiAgKi8KIGt0cmFjZV90ICoKLWt0cmFjZV9hbGxvYyhpbnQgbmVudHJpZXMsIGludCBzbGVlcCkKK2t0cmFjZV9hbGxvYyhpbnQgbmVudHJpZXMsIHVuc2lnbmVkIGludCBfX25vY2FzdCBzbGVlcCkKIHsKIAlrdHJhY2VfdCAgICAgICAgKmt0cDsKIAlrdHJhY2VfZW50cnlfdCAgKmt0ZXA7CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuaCBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5oCmluZGV4IDkyZDFhMWEuLjBkNzMyMTYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5oCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfU1VQUE9SVF9LVFJBQ0VfSF9fCiAjZGVmaW5lIF9fWEZTX1NVUFBPUlRfS1RSQUNFX0hfXwpAQCAtNjYsNyArNTIsNyBAQAogZXh0ZXJuIHZvaWQga3RyYWNlX2luaXQoaW50IHplbnRyaWVzKTsKIGV4dGVybiB2b2lkIGt0cmFjZV91bmluaXQodm9pZCk7CiAKLWV4dGVybiBrdHJhY2VfdCAqa3RyYWNlX2FsbG9jKGludCwgaW50KTsKK2V4dGVybiBrdHJhY2VfdCAqa3RyYWNlX2FsbG9jKGludCwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIGV4dGVybiB2b2lkIGt0cmFjZV9mcmVlKGt0cmFjZV90ICopOwogCiBleHRlcm4gdm9pZCBrdHJhY2VfZW50ZXIoCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9tb3ZlLmMgYi9mcy94ZnMvc3VwcG9ydC9tb3ZlLmMKaW5kZXggMTViNTE5NC4uY2FlZmExNyAxMDA2NDQKLS0tIGEvZnMveGZzL3N1cHBvcnQvbW92ZS5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L21vdmUuYwpAQCAtMSwzNSArMSwyMCBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlIDx4ZnMuaD4KIAogLyogUmVhZCBmcm9tIGtlcm5lbCBidWZmZXIgYXQgc3JjIHRvIHVzZXIva2VybmVsIGJ1ZmZlciBkZWZpbmVkCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9tb3ZlLmggYi9mcy94ZnMvc3VwcG9ydC9tb3ZlLmgKaW5kZXggM2Q0MDZkYy4uOTdhMjQ5OCAxMDA2NDQKLS0tIGEvZnMveGZzL3N1cHBvcnQvbW92ZS5oCisrKyBiL2ZzL3hmcy9zdXBwb3J0L21vdmUuaApAQCAtMSwzNCArMSwyMCBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLwotICogCiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMsIDE5OTQKICAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L3Fzb3J0LmMgYi9mcy94ZnMvc3VwcG9ydC9xc29ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWM4MjQxLi4wMDAwMDAwCi0tLSBhL2ZzL3hmcy9zdXBwb3J0L3Fzb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotLyoKLSAqIFFzb3J0IHJvdXRpbmUgZnJvbSBCZW50bGV5ICYgTWNJbHJveSdzICJFbmdpbmVlcmluZyBhIFNvcnQgRnVuY3Rpb24iLgotICovCi0jZGVmaW5lIHN3YXBjb2RlKFRZUEUsIHBhcm1pLCBwYXJtaiwgbikgeyAJCVwKLQlsb25nIGkgPSAobikgLyBzaXplb2YgKFRZUEUpOyAJCQlcCi0JcmVnaXN0ZXIgVFlQRSAqcGkgPSAoVFlQRSAqKSAocGFybWkpOyAJCVwKLQlyZWdpc3RlciBUWVBFICpwaiA9IChUWVBFICopIChwYXJtaik7IAkJXAotCWRvIHsgCQkJCQkJXAotCQlyZWdpc3RlciBUWVBFCXQgPSAqcGk7CQlcCi0JCSpwaSsrID0gKnBqOwkJCQlcCi0JCSpwaisrID0gdDsJCQkJXAotICAgICAgICB9IHdoaWxlICgtLWkgPiAwKTsJCQkJXAotfQotCi0jZGVmaW5lIFNXQVBJTklUKGEsIGVzKSBzd2FwdHlwZSA9ICgoY2hhciAqKWEgLSAoY2hhciAqKTApICUgc2l6ZW9mKGxvbmcpIHx8IFwKLQllcyAlIHNpemVvZihsb25nKSA/IDIgOiBlcyA9PSBzaXplb2YobG9uZyk/IDAgOiAxOwotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotc3dhcGZ1bmMoY2hhciAqYSwgY2hhciAqYiwgaW50IG4sIGludCBzd2FwdHlwZSkKLXsKLQlpZiAoc3dhcHR5cGUgPD0gMSkgCi0JCXN3YXBjb2RlKGxvbmcsIGEsIGIsIG4pCi0JZWxzZQotCQlzd2FwY29kZShjaGFyLCBhLCBiLCBuKQotfQotCi0jZGVmaW5lIHN3YXAoYSwgYikJCQkJCVwKLQlpZiAoc3dhcHR5cGUgPT0gMCkgewkJCQlcCi0JCWxvbmcgdCA9ICoobG9uZyAqKShhKTsJCQlcCi0JCSoobG9uZyAqKShhKSA9ICoobG9uZyAqKShiKTsJCVwKLQkJKihsb25nICopKGIpID0gdDsJCQlcCi0JfSBlbHNlCQkJCQkJXAotCQlzd2FwZnVuYyhhLCBiLCBlcywgc3dhcHR5cGUpCi0KLSNkZWZpbmUgdmVjc3dhcChhLCBiLCBuKSAJaWYgKChuKSA+IDApIHN3YXBmdW5jKGEsIGIsIG4sIHN3YXB0eXBlKQotCi1zdGF0aWMgX19pbmxpbmUgY2hhciAqCi1tZWQzKGNoYXIgKmEsIGNoYXIgKmIsIGNoYXIgKmMsIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKQotewotCXJldHVybiBjbXAoYSwgYikgPCAwID8KLQkgICAgICAgKGNtcChiLCBjKSA8IDAgPyBiIDogKGNtcChhLCBjKSA8IDAgPyBjIDogYSApKQotICAgICAgICAgICAgICA6KGNtcChiLCBjKSA+IDAgPyBiIDogKGNtcChhLCBjKSA8IDAgPyBhIDogYyApKTsKLX0KLQotdm9pZAotcXNvcnQodm9pZCAqYWEsIHNpemVfdCBuLCBzaXplX3QgZXMsIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKQotewotCWNoYXIgKnBhLCAqcGIsICpwYywgKnBkLCAqcGwsICpwbSwgKnBuOwotCWludCBkLCByLCBzd2FwdHlwZSwgc3dhcF9jbnQ7Ci0JcmVnaXN0ZXIgY2hhciAqYSA9IGFhOwotCi1sb29wOglTV0FQSU5JVChhLCBlcyk7Ci0Jc3dhcF9jbnQgPSAwOwotCWlmIChuIDwgNykgewotCQlmb3IgKHBtID0gKGNoYXIgKilhICsgZXM7IHBtIDwgKGNoYXIgKikgYSArIG4gKiBlczsgcG0gKz0gZXMpCi0JCQlmb3IgKHBsID0gcG07IHBsID4gKGNoYXIgKikgYSAmJiBjbXAocGwgLSBlcywgcGwpID4gMDsKLQkJCSAgICAgcGwgLT0gZXMpCi0JCQkJc3dhcChwbCwgcGwgLSBlcyk7Ci0JCXJldHVybjsKLQl9Ci0JcG0gPSAoY2hhciAqKWEgKyAobiAvIDIpICogZXM7Ci0JaWYgKG4gPiA3KSB7Ci0JCXBsID0gKGNoYXIgKilhOwotCQlwbiA9IChjaGFyICopYSArIChuIC0gMSkgKiBlczsKLQkJaWYgKG4gPiA0MCkgewotCQkJZCA9IChuIC8gOCkgKiBlczsKLQkJCXBsID0gbWVkMyhwbCwgcGwgKyBkLCBwbCArIDIgKiBkLCBjbXApOwotCQkJcG0gPSBtZWQzKHBtIC0gZCwgcG0sIHBtICsgZCwgY21wKTsKLQkJCXBuID0gbWVkMyhwbiAtIDIgKiBkLCBwbiAtIGQsIHBuLCBjbXApOwotCQl9Ci0JCXBtID0gbWVkMyhwbCwgcG0sIHBuLCBjbXApOwotCX0KLQlzd2FwKGEsIHBtKTsKLQlwYSA9IHBiID0gKGNoYXIgKilhICsgZXM7Ci0KLQlwYyA9IHBkID0gKGNoYXIgKilhICsgKG4gLSAxKSAqIGVzOwotCWZvciAoOzspIHsKLQkJd2hpbGUgKHBiIDw9IHBjICYmIChyID0gY21wKHBiLCBhKSkgPD0gMCkgewotCQkJaWYgKHIgPT0gMCkgewotCQkJCXN3YXBfY250ID0gMTsKLQkJCQlzd2FwKHBhLCBwYik7Ci0JCQkJcGEgKz0gZXM7Ci0JCQl9Ci0JCQlwYiArPSBlczsKLQkJfQotCQl3aGlsZSAocGIgPD0gcGMgJiYgKHIgPSBjbXAocGMsIGEpKSA+PSAwKSB7Ci0JCQlpZiAociA9PSAwKSB7Ci0JCQkJc3dhcF9jbnQgPSAxOwotCQkJCXN3YXAocGMsIHBkKTsKLQkJCQlwZCAtPSBlczsKLQkJCX0KLQkJCXBjIC09IGVzOwotCQl9Ci0JCWlmIChwYiA+IHBjKQotCQkJYnJlYWs7Ci0JCXN3YXAocGIsIHBjKTsKLQkJc3dhcF9jbnQgPSAxOwotCQlwYiArPSBlczsKLQkJcGMgLT0gZXM7Ci0JfQotCWlmIChzd2FwX2NudCA9PSAwKSB7ICAvKiBTd2l0Y2ggdG8gaW5zZXJ0aW9uIHNvcnQgKi8KLQkJZm9yIChwbSA9IChjaGFyICopIGEgKyBlczsgcG0gPCAoY2hhciAqKSBhICsgbiAqIGVzOyBwbSArPSBlcykKLQkJCWZvciAocGwgPSBwbTsgcGwgPiAoY2hhciAqKSBhICYmIGNtcChwbCAtIGVzLCBwbCkgPiAwOyAKLQkJCSAgICAgcGwgLT0gZXMpCi0JCQkJc3dhcChwbCwgcGwgLSBlcyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwbiA9IChjaGFyICopYSArIG4gKiBlczsKLQlyID0gbWluKHBhIC0gKGNoYXIgKilhLCBwYiAtIHBhKTsKLQl2ZWNzd2FwKGEsIHBiIC0gciwgcik7Ci0JciA9IG1pbigobG9uZykocGQgLSBwYyksIChsb25nKShwbiAtIHBkIC0gZXMpKTsKLQl2ZWNzd2FwKHBiLCBwbiAtIHIsIHIpOwotCWlmICgociA9IHBiIC0gcGEpID4gZXMpCi0JCXFzb3J0KGEsIHIgLyBlcywgZXMsIGNtcCk7Ci0JaWYgKChyID0gcGQgLSBwYykgPiBlcykgeyAKLQkJLyogSXRlcmF0ZSByYXRoZXIgdGhhbiByZWN1cnNlIHRvIHNhdmUgc3RhY2sgc3BhY2UgKi8KLQkJYSA9IHBuIC0gcjsKLQkJbiA9IHIgLyBlczsKLQkJZ290byBsb29wOwotCX0KLS8qCQlxc29ydChwbiAtIHIsIHIgLyBlcywgZXMsIGNtcCk7Ki8KLX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L3Fzb3J0LmggYi9mcy94ZnMvc3VwcG9ydC9xc29ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDI2MzEwLi4wMDAwMDAwCi0tLSBhL2ZzL3hmcy9zdXBwb3J0L3Fzb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KLSAqLwotCi0jaWZuZGVmIFFTT1JUX0gKLSNkZWZpbmUgUVNPUlRfSAotCi1leHRlcm4gdm9pZCBxc29ydCAodm9pZCAqY29uc3QgcGJhc2UsCi0JCSAgICBzaXplX3QgdG90YWxfZWxlbXMsCi0JCSAgICBzaXplX3Qgc2l6ZSwKLQkJICAgIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC91dWlkLmMgYi9mcy94ZnMvc3VwcG9ydC91dWlkLmMKaW5kZXggODFmNDBjZi4uNzBjZTQwOSAxMDA2NDQKLS0tIGEvZnMveGZzL3N1cHBvcnQvdXVpZC5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L3V1aWQuYwpAQCAtMSwzNSArMSwyMCBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlIDx4ZnMuaD4KIAogc3RhdGljIG11dGV4X3QJdXVpZF9tb25pdG9yOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3N1cHBvcnQvdXVpZC5oIGIvZnMveGZzL3N1cHBvcnQvdXVpZC5oCmluZGV4IDUyMjBlYTUuLmI2ZjU5MjIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L3V1aWQuaAorKysgYi9mcy94ZnMvc3VwcG9ydC91dWlkLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19TVVBQT1JUX1VVSURfSF9fCiAjZGVmaW5lIF9fWEZTX1NVUFBPUlRfVVVJRF9IX18KQEAgLTM2LDEzICsyMiwxMyBAQAogCXVuc2lnbmVkIGNoYXIJX191X2JpdHNbMTZdOwogfSB1dWlkX3Q7CiAKLXZvaWQgdXVpZF9pbml0KHZvaWQpOwotdm9pZCB1dWlkX2NyZWF0ZV9uaWwodXVpZF90ICp1dWlkKTsKLWludCB1dWlkX2lzX25pbCh1dWlkX3QgKnV1aWQpOwotaW50IHV1aWRfZXF1YWwodXVpZF90ICp1dWlkMSwgdXVpZF90ICp1dWlkMik7Ci12b2lkIHV1aWRfZ2V0bm9kZXVuaXEodXVpZF90ICp1dWlkLCBpbnQgZnNpZCBbMl0pOwotX191aW50NjRfdCB1dWlkX2hhc2g2NCh1dWlkX3QgKnV1aWQpOwotaW50IHV1aWRfdGFibGVfaW5zZXJ0KHV1aWRfdCAqdXVpZCk7Ci12b2lkIHV1aWRfdGFibGVfcmVtb3ZlKHV1aWRfdCAqdXVpZCk7CitleHRlcm4gdm9pZCB1dWlkX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCB1dWlkX2NyZWF0ZV9uaWwodXVpZF90ICp1dWlkKTsKK2V4dGVybiBpbnQgdXVpZF9pc19uaWwodXVpZF90ICp1dWlkKTsKK2V4dGVybiBpbnQgdXVpZF9lcXVhbCh1dWlkX3QgKnV1aWQxLCB1dWlkX3QgKnV1aWQyKTsKK2V4dGVybiB2b2lkIHV1aWRfZ2V0bm9kZXVuaXEodXVpZF90ICp1dWlkLCBpbnQgZnNpZCBbMl0pOworZXh0ZXJuIF9fdWludDY0X3QgdXVpZF9oYXNoNjQodXVpZF90ICp1dWlkKTsKK2V4dGVybiBpbnQgdXVpZF90YWJsZV9pbnNlcnQodXVpZF90ICp1dWlkKTsKK2V4dGVybiB2b2lkIHV1aWRfdGFibGVfcmVtb3ZlKHV1aWRfdCAqdXVpZCk7CiAKICNlbmRpZgkvKiBfX1hGU19TVVBQT1JUX1VVSURfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzLmggYi9mcy94ZnMveGZzLmgKaW5kZXggN2UyNzZkYy4uOTliNTBkMiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmcy5oCisrKyBiL2ZzL3hmcy94ZnMuaApAQCAtMSw0MCArMSwyOCBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0hfXwogI2RlZmluZSBfX1hGU19IX18KIAorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCiAjaW5jbHVkZSA8bGludXgtMi42L3hmc19saW51eC5oPgotCi0jaW5jbHVkZSA8eGZzX2ZzLmg+IAotI2luY2x1ZGUgPHhmc19tYWNyb3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgtMi40L3hmc19saW51eC5oPgorI2VuZGlmCiAKICNlbmRpZgkvKiBfX1hGU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWNsLmMgYi9mcy94ZnMveGZzX2FjbC5jCmluZGV4IDkyZmQxZDYuLmNjOWM5MWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWNsLmMKKysrIGIvZnMveGZzL3hmc19hY2wuYwpAQCAtMSw0OSArMSwzNyBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLQorI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FjbC5oIgogI2luY2x1ZGUgInhmc19tYWMuaCIKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgpAQCAtMTU1LDcgKzE0Myw3IEBACiB9CiAKIC8qCi0gKiBDb21wYXJpc29uIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHFzb3J0KCkuCisgKiBDb21wYXJpc29uIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHhmc19zb3J0KCkuCiAgKiBQcmltYXJ5IGtleSBpcyBhZV90YWcsIHNlY29uZGFyeSBrZXkgaXMgYWVfaWQuCiAgKi8KIFNUQVRJQyBpbnQKQEAgLTE4OSw4ICsxNzcsOCBAQAogCQlyZXR1cm4gLUVSQU5HRTsKIAogCS8qIE5lZWQgdG8gc29ydCBzcmMgWEZTIEFDTCBieSA8YWVfdGFnLGFlX2lkPiAqLwotCXFzb3J0KHNyYy0+YWNsX2VudHJ5LCBzcmMtPmFjbF9jbnQsIHNpemVvZihzcmMtPmFjbF9lbnRyeVswXSksCi0JCXhmc19hY2xfZW50cnlfY29tcGFyZSk7CisJeGZzX3NvcnQoc3JjLT5hY2xfZW50cnksIHNyYy0+YWNsX2NudCwgc2l6ZW9mKHNyYy0+YWNsX2VudHJ5WzBdKSwKKwkJIHhmc19hY2xfZW50cnlfY29tcGFyZSk7CiAKIAlkZXN0LT5hX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihQT1NJWF9BQ0xfWEFUVFJfVkVSU0lPTik7CiAJZGVzdF9lbnRyeSA9ICZkZXN0LT5hX2VudHJpZXNbMF07CkBAIC00NDgsNiArNDM2LDcgQEAKIAlpbnQJCXNlZW5fdXNlcm9iaiA9IDA7CiAKIAltYXRjaGVkLmFlX3RhZyA9IDA7CS8qIEludmFsaWQgdHlwZSAqLworCW1hdGNoZWQuYWVfcGVybSA9IDA7CiAJbWQgPj49IDY7CS8qIE5vcm1hbGl6ZSB0aGUgYml0cyBmb3IgY29tcGFyaXNvbiAqLwogCiAJZm9yIChpID0gMDsgaSA8IGZhcC0+YWNsX2NudDsgaSsrKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FjbC5oIGIvZnMveGZzL3hmc19hY2wuaAppbmRleCAwMzYzZWI0Li5mOTMxNWJjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FjbC5oCisrKyBiL2ZzL3hmcy94ZnNfYWNsLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfQUNMX0hfXwogI2RlZmluZSBfX1hGU19BQ0xfSF9fCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FnLmggYi9mcy94ZnMveGZzX2FnLmgKaW5kZXggOTZiNzBmNy4uYTk2ZTJmZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hZy5oCisrKyBiL2ZzL3hmcy94ZnNfYWcuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0FHX0hfXwogI2RlZmluZQlfX1hGU19BR19IX18KQEAgLTQ2LDE4ICszMiw5IEBACiAjZGVmaW5lCVhGU19BR0lfTUFHSUMJMHg1ODQxNDc0OQkvKiAnWEFHSScgKi8KICNkZWZpbmUJWEZTX0FHRl9WRVJTSU9OCTEKICNkZWZpbmUJWEZTX0FHSV9WRVJTSU9OCTEKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHRl9HT09EX1ZFUlNJT04pCi1pbnQgeGZzX2FnZl9nb29kX3ZlcnNpb24odW5zaWduZWQgdik7Ci0jZGVmaW5lCVhGU19BR0ZfR09PRF9WRVJTSU9OKHYpCXhmc19hZ2ZfZ29vZF92ZXJzaW9uKHYpCi0jZWxzZQotI2RlZmluZSBYRlNfQUdGX0dPT0RfVkVSU0lPTih2KQkJKCh2KSA9PSBYRlNfQUdGX1ZFUlNJT04pCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHSV9HT09EX1ZFUlNJT04pCi1pbnQgeGZzX2FnaV9nb29kX3ZlcnNpb24odW5zaWduZWQgdik7Ci0jZGVmaW5lCVhGU19BR0lfR09PRF9WRVJTSU9OKHYpCXhmc19hZ2lfZ29vZF92ZXJzaW9uKHYpCi0jZWxzZQotI2RlZmluZSBYRlNfQUdJX0dPT0RfVkVSU0lPTih2KQkJKCh2KSA9PSBYRlNfQUdJX1ZFUlNJT04pCi0jZW5kaWYKKworI2RlZmluZQlYRlNfQUdGX0dPT0RfVkVSU0lPTih2KQkoKHYpID09IFhGU19BR0ZfVkVSU0lPTikKKyNkZWZpbmUJWEZTX0FHSV9HT09EX1ZFUlNJT04odikJKCh2KSA9PSBYRlNfQUdJX1ZFUlNJT04pCiAKIC8qCiAgKiBCdHJlZSBudW1iZXIgMCBpcyBibm8sIDEgaXMgY250LiAgVGhpcyB2YWx1ZSBnaXZlcyB0aGUgc2l6ZSBvZiB0aGUKQEAgLTcxLDI3ICs0OCwyNiBAQAogICogYXJlID4gNjRrLCBvdXIgdmFsdWUgY2Fubm90IGJlIGNvbmZ1c2VkIGZvciBhbiBFRlMgc3VwZXJibG9jaydzLgogICovCiAKLXR5cGVkZWYgc3RydWN0IHhmc19hZ2YKLXsKK3R5cGVkZWYgc3RydWN0IHhmc19hZ2YgewogCS8qCiAJICogQ29tbW9uIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyIGluZm9ybWF0aW9uCiAJICovCi0JX191aW50MzJfdAlhZ2ZfbWFnaWNudW07CS8qIG1hZ2ljIG51bWJlciA9PSBYRlNfQUdGX01BR0lDICovCi0JX191aW50MzJfdAlhZ2ZfdmVyc2lvbm51bTsJLyogaGVhZGVyIHZlcnNpb24gPT0gWEZTX0FHRl9WRVJTSU9OICovCi0JeGZzX2FnbnVtYmVyX3QJYWdmX3NlcW5vOwkvKiBzZXF1ZW5jZSAjIHN0YXJ0aW5nIGZyb20gMCAqLwotCXhmc19hZ2Jsb2NrX3QJYWdmX2xlbmd0aDsJLyogc2l6ZSBpbiBibG9ja3Mgb2YgYS5nLiAqLworCV9fYmUzMgkJYWdmX21hZ2ljbnVtOwkvKiBtYWdpYyBudW1iZXIgPT0gWEZTX0FHRl9NQUdJQyAqLworCV9fYmUzMgkJYWdmX3ZlcnNpb25udW07CS8qIGhlYWRlciB2ZXJzaW9uID09IFhGU19BR0ZfVkVSU0lPTiAqLworCV9fYmUzMgkJYWdmX3NlcW5vOwkvKiBzZXF1ZW5jZSAjIHN0YXJ0aW5nIGZyb20gMCAqLworCV9fYmUzMgkJYWdmX2xlbmd0aDsJLyogc2l6ZSBpbiBibG9ja3Mgb2YgYS5nLiAqLwogCS8qCiAJICogRnJlZXNwYWNlIGluZm9ybWF0aW9uCiAJICovCi0JeGZzX2FnYmxvY2tfdAlhZ2Zfcm9vdHNbWEZTX0JUTlVNX0FHRl07CS8qIHJvb3QgYmxvY2tzICovCi0JX191aW50MzJfdAlhZ2Zfc3BhcmUwOwkvKiBzcGFyZSBmaWVsZCAqLwotCV9fdWludDMyX3QJYWdmX2xldmVsc1tYRlNfQlROVU1fQUdGXTsJLyogYnRyZWUgbGV2ZWxzICovCi0JX191aW50MzJfdAlhZ2Zfc3BhcmUxOwkvKiBzcGFyZSBmaWVsZCAqLwotCV9fdWludDMyX3QJYWdmX2ZsZmlyc3Q7CS8qIGZpcnN0IGZyZWVsaXN0IGJsb2NrJ3MgaW5kZXggKi8KLQlfX3VpbnQzMl90CWFnZl9mbGxhc3Q7CS8qIGxhc3QgZnJlZWxpc3QgYmxvY2sncyBpbmRleCAqLwotCV9fdWludDMyX3QJYWdmX2ZsY291bnQ7CS8qIGNvdW50IG9mIGJsb2NrcyBpbiBmcmVlbGlzdCAqLwotCXhmc19leHRsZW5fdAlhZ2ZfZnJlZWJsa3M7CS8qIHRvdGFsIGZyZWUgYmxvY2tzICovCi0JeGZzX2V4dGxlbl90CWFnZl9sb25nZXN0OwkvKiBsb25nZXN0IGZyZWUgc3BhY2UgKi8KKwlfX2JlMzIJCWFnZl9yb290c1tYRlNfQlROVU1fQUdGXTsJLyogcm9vdCBibG9ja3MgKi8KKwlfX2JlMzIJCWFnZl9zcGFyZTA7CS8qIHNwYXJlIGZpZWxkICovCisJX19iZTMyCQlhZ2ZfbGV2ZWxzW1hGU19CVE5VTV9BR0ZdOwkvKiBidHJlZSBsZXZlbHMgKi8KKwlfX2JlMzIJCWFnZl9zcGFyZTE7CS8qIHNwYXJlIGZpZWxkICovCisJX19iZTMyCQlhZ2ZfZmxmaXJzdDsJLyogZmlyc3QgZnJlZWxpc3QgYmxvY2sncyBpbmRleCAqLworCV9fYmUzMgkJYWdmX2ZsbGFzdDsJLyogbGFzdCBmcmVlbGlzdCBibG9jaydzIGluZGV4ICovCisJX19iZTMyCQlhZ2ZfZmxjb3VudDsJLyogY291bnQgb2YgYmxvY2tzIGluIGZyZWVsaXN0ICovCisJX19iZTMyCQlhZ2ZfZnJlZWJsa3M7CS8qIHRvdGFsIGZyZWUgYmxvY2tzICovCisJX19iZTMyCQlhZ2ZfbG9uZ2VzdDsJLyogbG9uZ2VzdCBmcmVlIHNwYWNlICovCiB9IHhmc19hZ2ZfdDsKIAogI2RlZmluZQlYRlNfQUdGX01BR0lDTlVNCTB4MDAwMDAwMDEKQEAgLTExMCw0MyArODYsMzkgQEAKIAogLyogZGlzayBibG9jayAoeGZzX2RhZGRyX3QpIGluIHRoZSBBRyAqLwogI2RlZmluZSBYRlNfQUdGX0RBRERSKG1wKQkoKHhmc19kYWRkcl90KSgxIDw8IChtcCktPm1fc2VjdGJiX2xvZykpCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0ZfQkxPQ0spCi14ZnNfYWdibG9ja190IHhmc19hZ2ZfYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXApOwotI2RlZmluZQlYRlNfQUdGX0JMT0NLKG1wKQl4ZnNfYWdmX2Jsb2NrKG1wKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0FHRl9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX0FHRl9EQUREUihtcCkpCi0jZW5kaWYKKyNkZWZpbmUJWEZTX0FHRl9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX0FHRl9EQUREUihtcCkpCisjZGVmaW5lCVhGU19CVUZfVE9fQUdGKGJwKQkoKHhmc19hZ2ZfdCAqKVhGU19CVUZfUFRSKGJwKSkKKwogCiAvKgogICogU2l6ZSBvZiB0aGUgdW5saW5rZWQgaW5vZGUgaGFzaCB0YWJsZSBpbiB0aGUgYWdpLgogICovCiAjZGVmaW5lCVhGU19BR0lfVU5MSU5LRURfQlVDS0VUUwk2NAogCi10eXBlZGVmIHN0cnVjdCB4ZnNfYWdpCi17Cit0eXBlZGVmIHN0cnVjdCB4ZnNfYWdpIHsKIAkvKgogCSAqIENvbW1vbiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciBpbmZvcm1hdGlvbgogCSAqLwotCV9fdWludDMyX3QJYWdpX21hZ2ljbnVtOwkvKiBtYWdpYyBudW1iZXIgPT0gWEZTX0FHSV9NQUdJQyAqLwotCV9fdWludDMyX3QJYWdpX3ZlcnNpb25udW07CS8qIGhlYWRlciB2ZXJzaW9uID09IFhGU19BR0lfVkVSU0lPTiAqLwotCXhmc19hZ251bWJlcl90CWFnaV9zZXFubzsJLyogc2VxdWVuY2UgIyBzdGFydGluZyBmcm9tIDAgKi8KLQl4ZnNfYWdibG9ja190CWFnaV9sZW5ndGg7CS8qIHNpemUgaW4gYmxvY2tzIG9mIGEuZy4gKi8KKwlfX2JlMzIJCWFnaV9tYWdpY251bTsJLyogbWFnaWMgbnVtYmVyID09IFhGU19BR0lfTUFHSUMgKi8KKwlfX2JlMzIJCWFnaV92ZXJzaW9ubnVtOwkvKiBoZWFkZXIgdmVyc2lvbiA9PSBYRlNfQUdJX1ZFUlNJT04gKi8KKwlfX2JlMzIJCWFnaV9zZXFubzsJLyogc2VxdWVuY2UgIyBzdGFydGluZyBmcm9tIDAgKi8KKwlfX2JlMzIJCWFnaV9sZW5ndGg7CS8qIHNpemUgaW4gYmxvY2tzIG9mIGEuZy4gKi8KIAkvKgogCSAqIElub2RlIGluZm9ybWF0aW9uCiAJICogSW5vZGVzIGFyZSBtYXBwZWQgYnkgaW50ZXJwcmV0aW5nIHRoZSBpbm9kZSBudW1iZXIsIHNvIG5vCiAJICogbWFwcGluZyBkYXRhIGlzIG5lZWRlZCBoZXJlLgogCSAqLwotCXhmc19hZ2lub190CWFnaV9jb3VudDsJLyogY291bnQgb2YgYWxsb2NhdGVkIGlub2RlcyAqLwotCXhmc19hZ2Jsb2NrX3QJYWdpX3Jvb3Q7CS8qIHJvb3Qgb2YgaW5vZGUgYnRyZWUgKi8KLQlfX3VpbnQzMl90CWFnaV9sZXZlbDsJLyogbGV2ZWxzIGluIGlub2RlIGJ0cmVlICovCi0JeGZzX2FnaW5vX3QJYWdpX2ZyZWVjb3VudDsJLyogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCi0JeGZzX2FnaW5vX3QJYWdpX25ld2lubzsJLyogbmV3IGlub2RlIGp1c3QgYWxsb2NhdGVkICovCi0JeGZzX2FnaW5vX3QJYWdpX2RpcmlubzsJLyogbGFzdCBkaXJlY3RvcnkgaW5vZGUgY2h1bmsgKi8KKwlfX2JlMzIJCWFnaV9jb3VudDsJLyogY291bnQgb2YgYWxsb2NhdGVkIGlub2RlcyAqLworCV9fYmUzMgkJYWdpX3Jvb3Q7CS8qIHJvb3Qgb2YgaW5vZGUgYnRyZWUgKi8KKwlfX2JlMzIJCWFnaV9sZXZlbDsJLyogbGV2ZWxzIGluIGlub2RlIGJ0cmVlICovCisJX19iZTMyCQlhZ2lfZnJlZWNvdW50OwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwlfX2JlMzIJCWFnaV9uZXdpbm87CS8qIG5ldyBpbm9kZSBqdXN0IGFsbG9jYXRlZCAqLworCV9fYmUzMgkJYWdpX2RpcmlubzsJLyogbGFzdCBkaXJlY3RvcnkgaW5vZGUgY2h1bmsgKi8KIAkvKgogCSAqIEhhc2ggdGFibGUgb2YgaW5vZGVzIHdoaWNoIGhhdmUgYmVlbiB1bmxpbmtlZCBidXQgYXJlCiAJICogc3RpbGwgYmVpbmcgcmVmZXJlbmNlZC4KIAkgKi8KLQl4ZnNfYWdpbm9fdAlhZ2lfdW5saW5rZWRbWEZTX0FHSV9VTkxJTktFRF9CVUNLRVRTXTsKKwlfX2JlMzIJCWFnaV91bmxpbmtlZFtYRlNfQUdJX1VOTElOS0VEX0JVQ0tFVFNdOwogfSB4ZnNfYWdpX3Q7CiAKICNkZWZpbmUJWEZTX0FHSV9NQUdJQ05VTQkweDAwMDAwMDAxCkBAIC0xNjUsMjUgKzEzNywxNyBAQAogCiAvKiBkaXNrIGJsb2NrICh4ZnNfZGFkZHJfdCkgaW4gdGhlIEFHICovCiAjZGVmaW5lIFhGU19BR0lfREFERFIobXApCSgoeGZzX2RhZGRyX3QpKDIgPDwgKG1wKS0+bV9zZWN0YmJfbG9nKSkKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHSV9CTE9DSykKLXhmc19hZ2Jsb2NrX3QgeGZzX2FnaV9ibG9jayhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19BR0lfQkxPQ0sobXApCXhmc19hZ2lfYmxvY2sobXApCi0jZWxzZQotI2RlZmluZSBYRlNfQUdJX0JMT0NLKG1wKQlYRlNfSERSX0JMT0NLKG1wLCBYRlNfQUdJX0RBRERSKG1wKSkKLSNlbmRpZgorI2RlZmluZQlYRlNfQUdJX0JMT0NLKG1wKQlYRlNfSERSX0JMT0NLKG1wLCBYRlNfQUdJX0RBRERSKG1wKSkKKyNkZWZpbmUJWEZTX0JVRl9UT19BR0koYnApCSgoeGZzX2FnaV90ICopWEZTX0JVRl9QVFIoYnApKQogCiAvKgogICogVGhlIHRoaXJkIGEuZy4gYmxvY2sgY29udGFpbnMgdGhlIGEuZy4gZnJlZWxpc3QsIGFuIGFycmF5CiAgKiBvZiBibG9jayBwb2ludGVycyB0byBibG9ja3Mgb3duZWQgYnkgdGhlIGFsbG9jYXRpb24gYnRyZWUgY29kZS4KICAqLwogI2RlZmluZSBYRlNfQUdGTF9EQUREUihtcCkJKCh4ZnNfZGFkZHJfdCkoMyA8PCAobXApLT5tX3NlY3RiYl9sb2cpKQotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdGTF9CTE9DSykKLXhmc19hZ2Jsb2NrX3QgeGZzX2FnZmxfYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXApOwotI2RlZmluZQlYRlNfQUdGTF9CTE9DSyhtcCkJeGZzX2FnZmxfYmxvY2sobXApCi0jZWxzZQotI2RlZmluZSBYRlNfQUdGTF9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX0FHRkxfREFERFIobXApKQotI2VuZGlmCisjZGVmaW5lCVhGU19BR0ZMX0JMT0NLKG1wKQlYRlNfSERSX0JMT0NLKG1wLCBYRlNfQUdGTF9EQUREUihtcCkpCiAjZGVmaW5lIFhGU19BR0ZMX1NJWkUobXApCSgobXApLT5tX3NiLnNiX3NlY3RzaXplIC8gc2l6ZW9mKHhmc19hZ2Jsb2NrX3QpKQorI2RlZmluZQlYRlNfQlVGX1RPX0FHRkwoYnApCSgoeGZzX2FnZmxfdCAqKVhGU19CVUZfUFRSKGJwKSkKIAogdHlwZWRlZiBzdHJ1Y3QgeGZzX2FnZmwgewogCXhmc19hZ2Jsb2NrX3QJYWdmbF9ibm9bMV07CS8qIGFjdHVhbGx5IFhGU19BR0ZMX1NJWkUobXApICovCkBAIC0yMzAsMTE2ICsxOTQsMzggQEAKIAl4ZnNfcGVyYWdfYnVzeV90ICpwYWdiX2xpc3Q7CS8qIHVuc3RhYmxlIGJsb2NrcyAqLwogfSB4ZnNfcGVyYWdfdDsKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdfTUFYTEVWRUxTKQotaW50IHhmc19hZ19tYXhsZXZlbHMoc3RydWN0IHhmc19tb3VudCAqbXApOwotI2RlZmluZQlYRlNfQUdfTUFYTEVWRUxTKG1wKQkJeGZzX2FnX21heGxldmVscyhtcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19BR19NQVhMRVZFTFMobXApCSgobXApLT5tX2FnX21heGxldmVscykKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUKQotaW50IHhmc19taW5fZnJlZWxpc3QoeGZzX2FnZl90ICphLCBzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19NSU5fRlJFRUxJU1QoYSxtcCkJCXhmc19taW5fZnJlZWxpc3QoYSxtcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19NSU5fRlJFRUxJU1QoYSxtcCkJXAotCVhGU19NSU5fRlJFRUxJU1RfUkFXKAlcCi0JCUlOVF9HRVQoKGEpLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSwgQVJDSF9DT05WRVJUKSwgXAotCQlJTlRfR0VUKChhKS0+YWdmX2xldmVsc1tYRlNfQlROVU1fQ05UaV0sIEFSQ0hfQ09OVkVSVCksIG1wKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NSU5fRlJFRUxJU1RfUEFHKQotaW50IHhmc19taW5fZnJlZWxpc3RfcGFnKHhmc19wZXJhZ190ICpwYWcsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKLSNkZWZpbmUJWEZTX01JTl9GUkVFTElTVF9QQUcocGFnLG1wKQl4ZnNfbWluX2ZyZWVsaXN0X3BhZyhwYWcsbXApCi0jZWxzZQotI2RlZmluZQlYRlNfTUlOX0ZSRUVMSVNUX1BBRyhwYWcsbXApCVwKLQlYRlNfTUlOX0ZSRUVMSVNUX1JBVygodWludF90KShwYWcpLT5wYWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0sIFwKLQkJCSAgICAgKHVpbnRfdCkocGFnKS0+cGFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldLCBtcCkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUX1JBVykKLWludCB4ZnNfbWluX2ZyZWVsaXN0X3JhdyhpbnQgYmwsIGludCBjbCwgc3RydWN0IHhmc19tb3VudCAqbXApOwotI2RlZmluZQlYRlNfTUlOX0ZSRUVMSVNUX1JBVyhibCxjbCxtcCkJeGZzX21pbl9mcmVlbGlzdF9yYXcoYmwsY2wsbXApCi0jZWxzZQorI2RlZmluZQlYRlNfQUdfTUFYTEVWRUxTKG1wKQkJKChtcCktPm1fYWdfbWF4bGV2ZWxzKQogI2RlZmluZQlYRlNfTUlOX0ZSRUVMSVNUX1JBVyhibCxjbCxtcCkJXAotCShNSU4oYmwgKyAxLCBYRlNfQUdfTUFYTEVWRUxTKG1wKSkgKyBcCi0JIE1JTihjbCArIDEsIFhGU19BR19NQVhMRVZFTFMobXApKSkKLSNlbmRpZgorCShNSU4oYmwgKyAxLCBYRlNfQUdfTUFYTEVWRUxTKG1wKSkgKyBNSU4oY2wgKyAxLCBYRlNfQUdfTUFYTEVWRUxTKG1wKSkpCisjZGVmaW5lCVhGU19NSU5fRlJFRUxJU1QoYSxtcCkJCVwKKwkoWEZTX01JTl9GUkVFTElTVF9SQVcoCQlcCisJCWJlMzJfdG9fY3B1KChhKS0+YWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0pLCBcCisJCWJlMzJfdG9fY3B1KChhKS0+YWdmX2xldmVsc1tYRlNfQlROVU1fQ05UaV0pLCBtcCkpCisjZGVmaW5lCVhGU19NSU5fRlJFRUxJU1RfUEFHKHBhZyxtcCkJXAorCShYRlNfTUlOX0ZSRUVMSVNUX1JBVygJCVwKKwkJKHVpbnRfdCkocGFnKS0+cGFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT2ldLCBcCisJCSh1aW50X3QpKHBhZyktPnBhZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSwgbXApKQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0JfVE9fRlNCKQoteGZzX2ZzYmxvY2tfdCB4ZnNfYWdiX3RvX2ZzYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywKLQkJCSAgICAgeGZzX2FnYmxvY2tfdCBhZ2Jubyk7Ci0jZGVmaW5lIFhGU19BR0JfVE9fRlNCKG1wLGFnbm8sYWdibm8pCXhmc19hZ2JfdG9fZnNiKG1wLGFnbm8sYWdibm8pCi0jZWxzZQotI2RlZmluZQlYRlNfQUdCX1RPX0ZTQihtcCxhZ25vLGFnYm5vKSBcCisjZGVmaW5lIFhGU19BR0JfVE9fRlNCKG1wLGFnbm8sYWdibm8pCVwKIAkoKCh4ZnNfZnNibG9ja190KShhZ25vKSA8PCAobXApLT5tX3NiLnNiX2FnYmxrbG9nKSB8IChhZ2JubykpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZTQl9UT19BR05PKQoteGZzX2FnbnVtYmVyX3QgeGZzX2ZzYl90b19hZ25vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKTsKLSNkZWZpbmUJWEZTX0ZTQl9UT19BR05PKG1wLGZzYm5vKQl4ZnNfZnNiX3RvX2Fnbm8obXAsZnNibm8pCi0jZWxzZQotI2RlZmluZQlYRlNfRlNCX1RPX0FHTk8obXAsZnNibm8pIFwKKyNkZWZpbmUJWEZTX0ZTQl9UT19BR05PKG1wLGZzYm5vKQlcCiAJKCh4ZnNfYWdudW1iZXJfdCkoKGZzYm5vKSA+PiAobXApLT5tX3NiLnNiX2FnYmxrbG9nKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRlNCX1RPX0FHQk5PKQoteGZzX2FnYmxvY2tfdCB4ZnNfZnNiX3RvX2FnYm5vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKTsKLSNkZWZpbmUJWEZTX0ZTQl9UT19BR0JOTyhtcCxmc2JubykJeGZzX2ZzYl90b19hZ2JubyhtcCxmc2JubykKLSNlbHNlCi0jZGVmaW5lCVhGU19GU0JfVE9fQUdCTk8obXAsZnNibm8pIFwKKyNkZWZpbmUJWEZTX0ZTQl9UT19BR0JOTyhtcCxmc2JubykJXAogCSgoeGZzX2FnYmxvY2tfdCkoKGZzYm5vKSAmIFhGU19NQVNLMzJMTygobXApLT5tX3NiLnNiX2FnYmxrbG9nKSkpCi0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdCX1RPX0RBRERSKQoteGZzX2RhZGRyX3QgeGZzX2FnYl90b19kYWRkcihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywKLQkJCQl4ZnNfYWdibG9ja190IGFnYm5vKTsKLSNkZWZpbmUJWEZTX0FHQl9UT19EQUREUihtcCxhZ25vLGFnYm5vKQl4ZnNfYWdiX3RvX2RhZGRyKG1wLGFnbm8sYWdibm8pCi0jZWxzZQotI2RlZmluZQlYRlNfQUdCX1RPX0RBRERSKG1wLGFnbm8sYWdibm8pIFwKLQkoKHhmc19kYWRkcl90KShYRlNfRlNCX1RPX0JCKG1wLCBcCi0JCSh4ZnNfZnNibG9ja190KShhZ25vKSAqIChtcCktPm1fc2Iuc2JfYWdibG9ja3MgKyAoYWdibm8pKSkpCi0jZW5kaWYKLS8qCi0gKiBYRlNfREFERFJfVE9fQUdOTyBhbmQgWEZTX0RBRERSX1RPX0FHQk5PIG1vdmVkIHRvIHhmc19tb3VudC5oCi0gKiB0byBhdm9pZCBoZWFkZXIgZmlsZSBvcmRlcmluZyBjaGFuZ2UKLSAqLwotCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR19EQUREUikKLXhmc19kYWRkcl90IHhmc19hZ19kYWRkcihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywKLQkJCQl4ZnNfZGFkZHJfdCBkKTsKLSNkZWZpbmUJWEZTX0FHX0RBRERSKG1wLGFnbm8sZCkJCXhmc19hZ19kYWRkcihtcCxhZ25vLGQpCi0jZWxzZQotI2RlZmluZQlYRlNfQUdfREFERFIobXAsYWdubyxkKQkoWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgMCkgKyAoZCkpCi0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0FHRikKLXhmc19hZ2ZfdCAqeGZzX2J1Zl90b19hZ2Yoc3RydWN0IHhmc19idWYgKmJwKTsKLSNkZWZpbmUJWEZTX0JVRl9UT19BR0YoYnApCQl4ZnNfYnVmX3RvX2FnZihicCkKLSNlbHNlCi0jZGVmaW5lCVhGU19CVUZfVE9fQUdGKGJwKQkoKHhmc19hZ2ZfdCAqKVhGU19CVUZfUFRSKGJwKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0FHSSkKLXhmc19hZ2lfdCAqeGZzX2J1Zl90b19hZ2koc3RydWN0IHhmc19idWYgKmJwKTsKLSNkZWZpbmUJWEZTX0JVRl9UT19BR0koYnApCQl4ZnNfYnVmX3RvX2FnaShicCkKLSNlbHNlCi0jZGVmaW5lCVhGU19CVUZfVE9fQUdJKGJwKQkoKHhmc19hZ2lfdCAqKVhGU19CVUZfUFRSKGJwKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0FHRkwpCi14ZnNfYWdmbF90ICp4ZnNfYnVmX3RvX2FnZmwoc3RydWN0IHhmc19idWYgKmJwKTsKLSNkZWZpbmUJWEZTX0JVRl9UT19BR0ZMKGJwKQkJeGZzX2J1Zl90b19hZ2ZsKGJwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0JVRl9UT19BR0ZMKGJwKQkoKHhmc19hZ2ZsX3QgKilYRlNfQlVGX1BUUihicCkpCi0jZW5kaWYKKyNkZWZpbmUJWEZTX0FHQl9UT19EQUREUihtcCxhZ25vLGFnYm5vKQlcCisJKCh4ZnNfZGFkZHJfdClYRlNfRlNCX1RPX0JCKG1wLCBcCisJCSh4ZnNfZnNibG9ja190KShhZ25vKSAqIChtcCktPm1fc2Iuc2JfYWdibG9ja3MgKyAoYWdibm8pKSkKKyNkZWZpbmUJWEZTX0FHX0RBRERSKG1wLGFnbm8sZCkJCShYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCAwKSArIChkKSkKIAogLyoKICAqIEZvciBjaGVja2luZyBmb3IgYmFkIHJhbmdlcyBvZiB4ZnNfZGFkZHJfdCdzLCBjb3ZlcmluZyBtdWx0aXBsZQogICogYWxsb2NhdGlvbiBncm91cHMgb3IgYSBzaW5nbGUgeGZzX2RhZGRyX3QgdGhhdCdzIGEgc3VwZXJibG9jayBjb3B5LgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR19DSEVDS19EQUREUikKLXZvaWQgeGZzX2FnX2NoZWNrX2RhZGRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFkZHJfdCBkLCB4ZnNfZXh0bGVuX3QgbGVuKTsKLSNkZWZpbmUJWEZTX0FHX0NIRUNLX0RBRERSKG1wLGQsbGVuKQl4ZnNfYWdfY2hlY2tfZGFkZHIobXAsZCxsZW4pCi0jZWxzZQogI2RlZmluZQlYRlNfQUdfQ0hFQ0tfREFERFIobXAsZCxsZW4pCVwKIAkoKGxlbikgPT0gMSA/IFwKIAkgICAgQVNTRVJUKChkKSA9PSBYRlNfU0JfREFERFIgfHwgXAogCQkgICBYRlNfREFERFJfVE9fQUdCTk8obXAsIGQpICE9IFhGU19TQl9EQUREUikgOiBcCiAJICAgIEFTU0VSVChYRlNfREFERFJfVE9fQUdOTyhtcCwgZCkgPT0gXAogCQkgICBYRlNfREFERFJfVE9fQUdOTyhtcCwgKGQpICsgKGxlbikgLSAxKSkpCi0jZW5kaWYKIAogI2VuZGlmCS8qIF9fWEZTX0FHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hbGxvYy5jIGIvZnMveGZzL3hmc19hbGxvYy5jCmluZGV4IGRjZmUxOTcuLmY0MzI4ZTEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWxsb2MuYworKysgYi9mcy94ZnMveGZzX2FsbG9jLmMKQEAgLTEsNTYgKzEsNDQgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLwotICovCi0KLS8qCi0gKiBGcmVlIHNwYWNlIGFsbG9jYXRpb24gZm9yIFhGUy4KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19hbGxvYy5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKIAogCkBAIC0yNDMsOCArMjMxLDggQEAKIAlpZiAoYXJncy0+bWlubGVmdCA9PSAwKQogCQlyZXR1cm4gMTsKIAlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKTsKLQlkaWZmID0gSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKQotCQkrIElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKQorCWRpZmYgPSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9mcmVlYmxrcykKKwkJKyBiZTMyX3RvX2NwdShhZ2YtPmFnZl9mbGNvdW50KQogCQktIGFyZ3MtPmxlbiAtIGFyZ3MtPm1pbmxlZnQ7CiAJaWYgKGRpZmYgPj0gMCkKIAkJcmV0dXJuIDE7CkBAIC0zMTksNyArMzA3LDggQEAKIAkJCWJub2Jsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhibm9fY3VyLT5iY19idWZzWzBdKTsKIAkJCWNudGJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhjbnRfY3VyLT5iY19idWZzWzBdKTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oCi0JCQkJSU5UX0dFVChibm9ibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKGNudGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJCQliZTE2X3RvX2NwdShibm9ibG9jay0+YmJfbnVtcmVjcykgPT0KKwkJCQliZTE2X3RvX2NwdShjbnRibG9jay0+YmJfbnVtcmVjcykpOwogCQl9CiAJfQogI2VuZGlmCkBAIC01MDUsMjEgKzQ5NCwxNyBAQAogCQkodm9pZCAqKXN0ciwKIAkJKHZvaWQgKiltcCwKIAkJKHZvaWQgKikoX19wc2ludF90KWZsYWdzLAotCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpLAotCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJUKSwKLQkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9yb290c1tYRlNfQlROVU1fQk5PXSwKLQkJCQkJCUFSQ0hfQ09OVkVSVCksCi0JCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2Zfcm9vdHNbWEZTX0JUTlVNX0NOVF0sCi0JCQkJCQlBUkNIX0NPTlZFUlQpLAotCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQk5PXSwKLQkJCQkJCUFSQ0hfQ09OVkVSVCksCi0JCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRdLAotCQkJCQkJQVJDSF9DT05WRVJUKSwKLQkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9mbGZpcnN0LCBBUkNIX0NPTlZFUlQpLAotCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX2ZsbGFzdCwgQVJDSF9DT05WRVJUKSwKLQkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpLAotCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQpLAotCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX2xvbmdlc3QsIEFSQ0hfQ09OVkVSVCkpOworCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCliZTMyX3RvX2NwdShhZ2YtPmFnZl9zZXFubyksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWJlMzJfdG9fY3B1KGFnZi0+YWdmX2xlbmd0aCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWJlMzJfdG9fY3B1KGFnZi0+YWdmX3Jvb3RzW1hGU19CVE5VTV9CTk9dKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYmUzMl90b19jcHUoYWdmLT5hZ2Zfcm9vdHNbWEZTX0JUTlVNX0NOVF0pLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCliZTMyX3RvX2NwdShhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT10pLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCliZTMyX3RvX2NwdShhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVF0pLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCliZTMyX3RvX2NwdShhZ2YtPmFnZl9mbGZpcnN0KSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYmUzMl90b19jcHUoYWdmLT5hZ2ZfZmxsYXN0KSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYmUzMl90b19jcHUoYWdmLT5hZ2ZfZmxjb3VudCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZyZWVibGtzKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYmUzMl90b19jcHUoYWdmLT5hZ2ZfbG9uZ2VzdCkpOwogfQogCiBTVEFUSUMgdm9pZApAQCAtNjEyLDEyICs1OTcsMTIgQEAKIAkJaWYgKCEoYXJncy0+d2FzZnJvbWZsKSkgewogCiAJCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKTsKLQkJCUlOVF9NT0QoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCwgLShhcmdzLT5sZW4pKTsKKwkJCWJlMzJfYWRkKCZhZ2YtPmFnZl9mcmVlYmxrcywgLShhcmdzLT5sZW4pKTsKIAkJCXhmc190cmFuc19hZ2Jsb2Nrc19kZWx0YShhcmdzLT50cCwKIAkJCQkJCSAtKChsb25nKShhcmdzLT5sZW4pKSk7CiAJCQlhcmdzLT5wYWctPnBhZ2ZfZnJlZWJsa3MgLT0gYXJncy0+bGVuOwotCQkJQVNTRVJUKElOVF9HRVQoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCkKLQkJCQk8PSBJTlRfR0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoYmUzMl90b19jcHUoYWdmLT5hZ2ZfZnJlZWJsa3MpIDw9CisJCQkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKSk7CiAJCQlUUkFDRV9NT0RBR0YoTlVMTCwgYWdmLCBYRlNfQUdGX0ZSRUVCTEtTKTsKIAkJCXhmc19hbGxvY19sb2dfYWdmKGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAogCQkJCQkJWEZTX0FHRl9GUkVFQkxLUyk7CkBAIC03MjMsOCArNzA4LDcgQEAKIAljbnRfY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKIAkJYXJncy0+YWdubywgWEZTX0JUTlVNX0NOVCwgTlVMTCwgMCk7CiAJQVNTRVJUKGFyZ3MtPmFnYm5vICsgYXJncy0+bGVuIDw9Ci0JCUlOVF9HRVQoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgsCi0JCQlBUkNIX0NPTlZFUlQpKTsKKwkJYmUzMl90b19jcHUoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgpKTsKIAlpZiAoKGVycm9yID0geGZzX2FsbG9jX2ZpeHVwX3RyZWVzKGNudF9jdXIsIGJub19jdXIsIGZibm8sIGZsZW4sCiAJCQlhcmdzLT5hZ2JubywgYXJncy0+bGVuLCBYRlNBX0ZJWFVQX0JOT19PSykpKSB7CiAJCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9FUlJPUik7CkBAIC04OTcsOCArODgxLDcgQEAKIAkJCWdvdG8gZXJyb3IwOwogCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CiAJCWx0ZW5kID0gbHRibm8gKyBsdGxlbjsKLQkJQVNTRVJUKGx0ZW5kIDw9IElOVF9HRVQoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgsCi0JCQkJQVJDSF9DT05WRVJUKSk7CisJCUFTU0VSVChsdGVuZCA8PSBiZTMyX3RvX2NwdShYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKS0+YWdmX2xlbmd0aCkpOwogCQlhcmdzLT5sZW4gPSBibGVuOwogCQlpZiAoIXhmc19hbGxvY19maXhfbWlubGVmdChhcmdzKSkgewogCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOwpAQCAtMTI1Myw4ICsxMjM2LDcgQEAKIAkJbHRsZW4sICZsdG5ldyk7CiAJQVNTRVJUKGx0bmV3ID49IGx0Ym5vKTsKIAlBU1NFUlQobHRuZXcgKyBybGVuIDw9IGx0ZW5kKTsKLQlBU1NFUlQobHRuZXcgKyBybGVuIDw9IElOVF9HRVQoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgsCi0JCUFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChsdG5ldyArIHJsZW4gPD0gYmUzMl90b19jcHUoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgpKTsKIAlhcmdzLT5hZ2JubyA9IGx0bmV3OwogCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZml4dXBfdHJlZXMoY250X2N1ciwgYm5vX2N1cl9sdCwgbHRibm8sIGx0bGVuLAogCQkJbHRuZXcsIHJsZW4sIFhGU0FfRklYVVBfQk5PX09LKSkpCkBAIC0xNDE3LDggKzEzOTksNyBAQAogCWFyZ3MtPmFnYm5vID0gcmJubzsKIAlYRlNfV0FOVF9DT1JSVVBURURfR09UTygKIAkJYXJncy0+YWdibm8gKyBhcmdzLT5sZW4gPD0KLQkJCUlOVF9HRVQoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgsCi0JCQlBUkNIX0NPTlZFUlQpLAorCQkJYmUzMl90b19jcHUoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgpLAogCQllcnJvcjApOwogCVRSQUNFX0FMTE9DKCJub3JtYWwiLCBhcmdzKTsKIAlyZXR1cm4gMDsKQEAgLTE0NjYsOCArMTQ0Nyw4IEBACiAJICogZnJlZWxpc3QuCiAJICovCiAJZWxzZSBpZiAoYXJncy0+bWlubGVuID09IDEgJiYgYXJncy0+YWxpZ25tZW50ID09IDEgJiYgIWFyZ3MtPmlzZmwgJiYKLQkJIChJTlRfR0VUKFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfZmxjb3VudCwKLQkJCUFSQ0hfQ09OVkVSVCkgPiBhcmdzLT5taW5sZWZ0KSkgeworCQkgKGJlMzJfdG9fY3B1KFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfZmxjb3VudCkKKwkJICA+IGFyZ3MtPm1pbmxlZnQpKSB7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X2ZyZWVsaXN0KGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLCAmZmJubykpKQogCQkJZ290byBlcnJvcjA7CiAJCWlmIChmYm5vICE9IE5VTExBR0JMT0NLKSB7CkBAIC0xNDgyLDggKzE0NjMsNyBAQAogCQkJYXJncy0+YWdibm8gPSBmYm5vOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oCiAJCQkJYXJncy0+YWdibm8gKyBhcmdzLT5sZW4gPD0KLQkJCQlJTlRfR0VUKFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfbGVuZ3RoLAotCQkJCQlBUkNIX0NPTlZFUlQpLAorCQkJCWJlMzJfdG9fY3B1KFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfbGVuZ3RoKSwKIAkJCQllcnJvcjApOwogCQkJYXJncy0+d2FzZnJvbWZsID0gMTsKIAkJCVRSQUNFX0FMTE9DKCJmcmVlbGlzdCIsIGFyZ3MpOwpAQCAtMTc1NywxMiArMTczNywxMiBAQAogCiAJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGFnYnApOwogCQlwYWcgPSAmbXAtPm1fcGVyYWdbYWdub107Ci0JCUlOVF9NT0QoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCwgbGVuKTsKKwkJYmUzMl9hZGQoJmFnZi0+YWdmX2ZyZWVibGtzLCBsZW4pOwogCQl4ZnNfdHJhbnNfYWdibG9ja3NfZGVsdGEodHAsIGxlbik7CiAJCXBhZy0+cGFnZl9mcmVlYmxrcyArPSBsZW47CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKAotCQkJSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKQotCQkJCTw9IElOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpLAorCQkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfZnJlZWJsa3MpIDw9CisJCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9sZW5ndGgpLAogCQkJZXJyb3IwKTsKIAkJVFJBQ0VfTU9EQUdGKE5VTEwsIGFnZiwgWEZTX0FHRl9GUkVFQkxLUyk7CiAJCXhmc19hbGxvY19sb2dfYWdmKHRwLCBhZ2JwLCBYRlNfQUdGX0ZSRUVCTEtTKTsKQEAgLTE5MDksMTggKzE4ODksMTggQEAKIAkgKi8KIAlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhZ2JwKTsKIAluZWVkID0gWEZTX01JTl9GUkVFTElTVChhZ2YsIG1wKTsKLQlkZWx0YSA9IG5lZWQgPiBJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCkgPwotCQkobmVlZCAtIElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSkgOiAwOworCWRlbHRhID0gbmVlZCA+IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsY291bnQpID8KKwkJKG5lZWQgLSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9mbGNvdW50KSkgOiAwOwogCS8qCiAJICogSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHRvdGFsIG9yIHNpbmdsZS1leHRlbnQsIHJlamVjdCBpdC4KIAkgKi8KLQlsb25nZXN0ID0gSU5UX0dFVChhZ2YtPmFnZl9sb25nZXN0LCBBUkNIX0NPTlZFUlQpOworCWxvbmdlc3QgPSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9sb25nZXN0KTsKIAlsb25nZXN0ID0gKGxvbmdlc3QgPiBkZWx0YSkgPyAobG9uZ2VzdCAtIGRlbHRhKSA6Ci0JCShJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwIHx8IGxvbmdlc3QgPiAwKTsKKwkJKGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsY291bnQpID4gMCB8fCBsb25nZXN0ID4gMCk7CiAJaWYgKGFyZ3MtPm1pbmxlbiArIGFyZ3MtPmFsaWdubWVudCArIGFyZ3MtPm1pbmFsaWduc2xvcCAtIDEgPiBsb25nZXN0IHx8CiAJICAgICAoYXJncy0+bWlubGVmdCAmJgotCQkoaW50KShJTlRfR0VUKGFnZi0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQpICsKLQkJICAgSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpIC0gbmVlZCAtIGFyZ3MtPnRvdGFsKSA8CisJCShpbnQpKGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZyZWVibGtzKSArCisJCSAgIGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsY291bnQpIC0gbmVlZCAtIGFyZ3MtPnRvdGFsKSA8CiAJICAgICAoaW50KWFyZ3MtPm1pbmxlZnQpKSB7CiAJCXhmc190cmFuc19icmVsc2UodHAsIGFnYnApOwogCQlhcmdzLT5hZ2JwID0gTlVMTDsKQEAgLTE5MjksNyArMTkwOSw3IEBACiAJLyoKIAkgKiBNYWtlIHRoZSBmcmVlbGlzdCBzaG9ydGVyIGlmIGl0J3MgdG9vIGxvbmcuCiAJICovCi0Jd2hpbGUgKElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSA+IG5lZWQpIHsKKwl3aGlsZSAoYmUzMl90b19jcHUoYWdmLT5hZ2ZfZmxjb3VudCkgPiBuZWVkKSB7CiAJCXhmc19idWZfdAkqYnA7CiAKIAkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfZnJlZWxpc3QodHAsIGFnYnAsICZibm8pKSkKQEAgLTE5NTYsOSArMTkzNiw5IEBACiAJLyoKIAkgKiBNYWtlIHRoZSBmcmVlbGlzdCBsb25nZXIgaWYgaXQncyB0b28gc2hvcnQuCiAJICovCi0Jd2hpbGUgKElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSA8IG5lZWQpIHsKKwl3aGlsZSAoYmUzMl90b19jcHUoYWdmLT5hZ2ZfZmxjb3VudCkgPCBuZWVkKSB7CiAJCXRhcmdzLmFnYm5vID0gMDsKLQkJdGFyZ3MubWF4bGVuID0gbmVlZCAtIElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJdGFyZ3MubWF4bGVuID0gbmVlZCAtIGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsY291bnQpOwogCQkvKgogCQkgKiBBbGxvY2F0ZSBhcyBtYW55IGJsb2NrcyBhcyBwb3NzaWJsZSBhdCBvbmNlLgogCQkgKi8KQEAgLTIwMTgsMTkgKzE5OTgsMTkgQEAKIAkgKi8KIAltcCA9IHRwLT50X21vdW50cDsKIAlpZiAoKGVycm9yID0geGZzX2FsbG9jX3JlYWRfYWdmbChtcCwgdHAsCi0JCQlJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpLCAmYWdmbGJwKSkpCisJCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9zZXFubyksICZhZ2ZsYnApKSkKIAkJcmV0dXJuIGVycm9yOwogCWFnZmwgPSBYRlNfQlVGX1RPX0FHRkwoYWdmbGJwKTsKIAkvKgogCSAqIEdldCB0aGUgYmxvY2sgbnVtYmVyIGFuZCB1cGRhdGUgdGhlIGRhdGEgc3RydWN0dXJlcy4KIAkgKi8KLQlibm8gPSBJTlRfR0VUKGFnZmwtPmFnZmxfYm5vW0lOVF9HRVQoYWdmLT5hZ2ZfZmxmaXJzdCwgQVJDSF9DT05WRVJUKV0sIEFSQ0hfQ09OVkVSVCk7Ci0JSU5UX01PRChhZ2YtPmFnZl9mbGZpcnN0LCBBUkNIX0NPTlZFUlQsIDEpOworCWJubyA9IElOVF9HRVQoYWdmbC0+YWdmbF9ibm9bYmUzMl90b19jcHUoYWdmLT5hZ2ZfZmxmaXJzdCldLCBBUkNIX0NPTlZFUlQpOworCWJlMzJfYWRkKCZhZ2YtPmFnZl9mbGZpcnN0LCAxKTsKIAl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2ZsYnApOwotCWlmIChJTlRfR0VUKGFnZi0+YWdmX2ZsZmlyc3QsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHRkxfU0laRShtcCkpCisJaWYgKGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsZmlyc3QpID09IFhGU19BR0ZMX1NJWkUobXApKQogCQlhZ2YtPmFnZl9mbGZpcnN0ID0gMDsKLQlwYWcgPSAmbXAtPm1fcGVyYWdbSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKV07Ci0JSU5UX01PRChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwlwYWcgPSAmbXAtPm1fcGVyYWdbYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pXTsKKwliZTMyX2FkZCgmYWdmLT5hZ2ZfZmxjb3VudCwgLTEpOwogCXhmc190cmFuc19hZ2ZsaXN0X2RlbHRhKHRwLCAtMSk7CiAJcGFnLT5wYWdmX2ZsY291bnQtLTsKIAlUUkFDRV9NT0RBR0YoTlVMTCwgYWdmLCBYRlNfQUdGX0ZMRklSU1QgfCBYRlNfQUdGX0ZMQ09VTlQpOwpAQCAtMjA0NSw3ICsyMDI1LDcgQEAKIAkgKiB0aGUgZnJlZWluZyB0cmFuc2FjdGlvbiBtdXN0IGJlIHB1c2hlZCB0byBkaXNrIE5PVyBieSBmb3JjaW5nCiAJICogdG8gZGlzayBhbGwgaWNsb2dzIHVwIHRoYXQgdHJhbnNhY3Rpb24ncyBMU04uCiAJICovCi0JeGZzX2FsbG9jX3NlYXJjaF9idXN5KHRwLCBJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpLCBibm8sIDEpOworCXhmc19hbGxvY19zZWFyY2hfYnVzeSh0cCwgYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pLCBibm8sIDEpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTIzLDE4ICsyMTAzLDE4IEBACiAJbXAgPSB0cC0+dF9tb3VudHA7CiAKIAlpZiAoIWFnZmxicCAmJiAoZXJyb3IgPSB4ZnNfYWxsb2NfcmVhZF9hZ2ZsKG1wLCB0cCwKLQkJCUlOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksICZhZ2ZsYnApKSkKKwkJCWJlMzJfdG9fY3B1KGFnZi0+YWdmX3NlcW5vKSwgJmFnZmxicCkpKQogCQlyZXR1cm4gZXJyb3I7CiAJYWdmbCA9IFhGU19CVUZfVE9fQUdGTChhZ2ZsYnApOwotCUlOVF9NT0QoYWdmLT5hZ2ZfZmxsYXN0LCBBUkNIX0NPTlZFUlQsIDEpOwotCWlmIChJTlRfR0VUKGFnZi0+YWdmX2ZsbGFzdCwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdGTF9TSVpFKG1wKSkKKwliZTMyX2FkZCgmYWdmLT5hZ2ZfZmxsYXN0LCAxKTsKKwlpZiAoYmUzMl90b19jcHUoYWdmLT5hZ2ZfZmxsYXN0KSA9PSBYRlNfQUdGTF9TSVpFKG1wKSkKIAkJYWdmLT5hZ2ZfZmxsYXN0ID0gMDsKLQlwYWcgPSAmbXAtPm1fcGVyYWdbSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKV07Ci0JSU5UX01PRChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQsIDEpOworCXBhZyA9ICZtcC0+bV9wZXJhZ1tiZTMyX3RvX2NwdShhZ2YtPmFnZl9zZXFubyldOworCWJlMzJfYWRkKCZhZ2YtPmFnZl9mbGNvdW50LCAxKTsKIAl4ZnNfdHJhbnNfYWdmbGlzdF9kZWx0YSh0cCwgMSk7CiAJcGFnLT5wYWdmX2ZsY291bnQrKzsKLQlBU1NFUlQoSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpIDw9IFhGU19BR0ZMX1NJWkUobXApKTsKLQlibG9ja3AgPSAmYWdmbC0+YWdmbF9ibm9bSU5UX0dFVChhZ2YtPmFnZl9mbGxhc3QsIEFSQ0hfQ09OVkVSVCldOworCUFTU0VSVChiZTMyX3RvX2NwdShhZ2YtPmFnZl9mbGNvdW50KSA8PSBYRlNfQUdGTF9TSVpFKG1wKSk7CisJYmxvY2twID0gJmFnZmwtPmFnZmxfYm5vW2JlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsbGFzdCldOwogCUlOVF9TRVQoKmJsb2NrcCwgQVJDSF9DT05WRVJULCBibm8pOwogCVRSQUNFX01PREFHRihOVUxMLCBhZ2YsIFhGU19BR0ZfRkxMQVNUIHwgWEZTX0FHRl9GTENPVU5UKTsKIAl4ZnNfYWxsb2NfbG9nX2FnZih0cCwgYWdicCwgWEZTX0FHRl9GTExBU1QgfCBYRlNfQUdGX0ZMQ09VTlQpOwpAQCAtMjE4MSwxNCArMjE2MSwxMiBAQAogCSAqLwogCWFnZiA9IFhGU19CVUZfVE9fQUdGKGJwKTsKIAlhZ2Zfb2sgPQotCQlJTlRfR0VUKGFnZi0+YWdmX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0ZfTUFHSUMgJiYKLQkJWEZTX0FHRl9HT09EX1ZFUlNJT04oCi0JCQlJTlRfR0VUKGFnZi0+YWdmX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCkpICYmCi0JCUlOVF9HRVQoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCkgPD0KLQkJCQlJTlRfR0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJUKSAmJgotCQlJTlRfR0VUKGFnZi0+YWdmX2ZsZmlyc3QsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfQUdGTF9TSVpFKG1wKSAmJgotCQlJTlRfR0VUKGFnZi0+YWdmX2ZsbGFzdCwgIEFSQ0hfQ09OVkVSVCkgPCBYRlNfQUdGTF9TSVpFKG1wKSAmJgotCQlJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCkgPD0gWEZTX0FHRkxfU0laRShtcCk7CisJCWJlMzJfdG9fY3B1KGFnZi0+YWdmX21hZ2ljbnVtKSA9PSBYRlNfQUdGX01BR0lDICYmCisJCVhGU19BR0ZfR09PRF9WRVJTSU9OKGJlMzJfdG9fY3B1KGFnZi0+YWdmX3ZlcnNpb25udW0pKSAmJgorCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9mcmVlYmxrcykgPD0gYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKSAmJgorCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9mbGZpcnN0KSA8IFhGU19BR0ZMX1NJWkUobXApICYmCisJCWJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsbGFzdCkgPCBYRlNfQUdGTF9TSVpFKG1wKSAmJgorCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9mbGNvdW50KSA8PSBYRlNfQUdGTF9TSVpFKG1wKTsKIAlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWFnZl9vaywgbXAsIFhGU19FUlJUQUdfQUxMT0NfUkVBRF9BR0YsCiAJCQlYRlNfUkFORE9NX0FMTE9DX1JFQURfQUdGKSkpIHsKIAkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19hbGxvY19yZWFkX2FnZiIsCkBAIC0yMTk4LDEzICsyMTc2LDEzIEBACiAJfQogCXBhZyA9ICZtcC0+bV9wZXJhZ1thZ25vXTsKIAlpZiAoIXBhZy0+cGFnZl9pbml0KSB7Ci0JCXBhZy0+cGFnZl9mcmVlYmxrcyA9IElOVF9HRVQoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCk7Ci0JCXBhZy0+cGFnZl9mbGNvdW50ID0gSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpOwotCQlwYWctPnBhZ2ZfbG9uZ2VzdCA9IElOVF9HRVQoYWdmLT5hZ2ZfbG9uZ2VzdCwgQVJDSF9DT05WRVJUKTsKKwkJcGFnLT5wYWdmX2ZyZWVibGtzID0gYmUzMl90b19jcHUoYWdmLT5hZ2ZfZnJlZWJsa3MpOworCQlwYWctPnBhZ2ZfZmxjb3VudCA9IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsY291bnQpOworCQlwYWctPnBhZ2ZfbG9uZ2VzdCA9IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2xvbmdlc3QpOwogCQlwYWctPnBhZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSA9Ci0JCQlJTlRfR0VUKGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0sIEFSQ0hfQ09OVkVSVCk7CisJCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT2ldKTsKIAkJcGFnLT5wYWdmX2xldmVsc1tYRlNfQlROVU1fQ05UaV0gPQotCQkJSU5UX0dFVChhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldLCBBUkNIX0NPTlZFUlQpOworCQkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSk7CiAJCXNwaW5sb2NrX2luaXQoJnBhZy0+cGFnYl9sb2NrLCAieGZzcGFnYiIpOwogCQlwYWctPnBhZ2JfbGlzdCA9IGttZW1femFsbG9jKFhGU19QQUdCX05VTV9TTE9UUyAqCiAJCQkJCXNpemVvZih4ZnNfcGVyYWdfYnVzeV90KSwgS01fU0xFRVApOwpAQCAtMjIxMiwxMyArMjE5MCwxMyBAQAogCX0KICNpZmRlZiBERUJVRwogCWVsc2UgaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQlBU1NFUlQocGFnLT5wYWdmX2ZyZWVibGtzID09IElOVF9HRVQoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCkpOwotCQlBU1NFUlQocGFnLT5wYWdmX2ZsY291bnQgPT0gSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpKTsKLQkJQVNTRVJUKHBhZy0+cGFnZl9sb25nZXN0ID09IElOVF9HRVQoYWdmLT5hZ2ZfbG9uZ2VzdCwgQVJDSF9DT05WRVJUKSk7CisJCUFTU0VSVChwYWctPnBhZ2ZfZnJlZWJsa3MgPT0gYmUzMl90b19jcHUoYWdmLT5hZ2ZfZnJlZWJsa3MpKTsKKwkJQVNTRVJUKHBhZy0+cGFnZl9mbGNvdW50ID09IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsY291bnQpKTsKKwkJQVNTRVJUKHBhZy0+cGFnZl9sb25nZXN0ID09IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2xvbmdlc3QpKTsKIAkJQVNTRVJUKHBhZy0+cGFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT2ldID09Ci0JCSAgICAgICBJTlRfR0VUKGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0sIEFSQ0hfQ09OVkVSVCkpOworCQkgICAgICAgYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSkpOwogCQlBU1NFUlQocGFnLT5wYWdmX2xldmVsc1tYRlNfQlROVU1fQ05UaV0gPT0KLQkJICAgICAgIElOVF9HRVQoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSwgQVJDSF9DT05WRVJUKSk7CisJCSAgICAgICBiZTMyX3RvX2NwdShhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldKSk7CiAJfQogI2VuZGlmCiAJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0FHRiwgWEZTX0FHRl9SRUYpOwpAQCAtMjQ2Nyw3ICsyNDQ1LDcgQEAKICNpZmRlZiBERUJVRwogCUFTU0VSVChhcmdzLmFnYnAgIT0gTlVMTCk7CiAJYWdmID0gWEZTX0JVRl9UT19BR0YoYXJncy5hZ2JwKTsKLQlBU1NFUlQoYXJncy5hZ2JubyArIGxlbiA8PSBJTlRfR0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGFyZ3MuYWdibm8gKyBsZW4gPD0gYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKSk7CiAjZW5kaWYKIAllcnJvciA9IHhmc19mcmVlX2FnX2V4dGVudCh0cCwgYXJncy5hZ2JwLCBhcmdzLmFnbm8sIGFyZ3MuYWdibm8sCiAJCWxlbiwgMCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FsbG9jLmggYi9mcy94ZnMveGZzX2FsbG9jLmgKaW5kZXggNzIzMjljOC4uMzU0NmRlYSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hbGxvYy5oCisrKyBiL2ZzL3hmcy94ZnNfYWxsb2MuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0FMTE9DX0hfXwogI2RlZmluZQlfX1hGU19BTExPQ19IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuYwppbmRleCBlMDM1NWExLi5hMWQ5MmRhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19hbGxvY19idHJlZS5jCkBAIC0xLDUzICsxLDQxIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQotLyoKLSAqIEZyZWUgc3BhY2UgYWxsb2NhdGlvbiBmb3IgWEZTLgotICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCkBAIC0xMjksNyArMTE3LDcgQEAKIAkvKgogCSAqIEZhaWwgaWYgd2UncmUgb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgogCSAqLwotCWlmIChwdHIgPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJaWYgKHB0ciA+IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSkgewogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwogCX0KQEAgLTE0MywxOCArMTMxLDE4IEBACiAJCWxrcCA9IFhGU19BTExPQ19LRVlfQUREUihibG9jaywgMSwgY3VyKTsKIAkJbHBwID0gWEZTX0FMTE9DX1BUUl9BRERSKGJsb2NrLCAxLCBjdXIpOwogI2lmZGVmIERFQlVHCi0JCWZvciAoaSA9IHB0cjsgaSA8IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChscHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCWZvciAoaSA9IHB0cjsgaSA8IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsgaSsrKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBiZTMyX3RvX2NwdShscHBbaV0pLCBsZXZlbCkpKQogCQkJCXJldHVybiBlcnJvcjsKIAkJfQogI2VuZGlmCi0JCWlmIChwdHIgPCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJCWlmIChwdHIgPCBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpIHsKIAkJCW1lbW1vdmUoJmxrcFtwdHIgLSAxXSwgJmxrcFtwdHJdLAotCQkJCShJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gcHRyKSAqIHNpemVvZigqbGtwKSk7IC8qIElOVF86IG1lbSBjb3B5ICovCisJCQkJKGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSAtIHB0cikgKiBzaXplb2YoKmxrcCkpOwogCQkJbWVtbW92ZSgmbHBwW3B0ciAtIDFdLCAmbHBwW3B0cl0sCi0JCQkJKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBwdHIpICogc2l6ZW9mKCpscHApKTsgLyogSU5UXzogbWVtIGNvcHkgKi8KLQkJCXhmc19hbGxvY19sb2dfcHRycyhjdXIsIGJwLCBwdHIsIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKLQkJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwkJCQkoYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpIC0gcHRyKSAqIHNpemVvZigqbHBwKSk7CisJCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCBicCwgcHRyLCBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgLSAxKTsKKwkJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSAtIDEpOwogCQl9CiAJfQogCS8qCkBAIC0xNjMsMjUgKzE1MSwyNSBAQAogCSAqLwogCWVsc2UgewogCQlscnAgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIDEsIGN1cik7Ci0JCWlmIChwdHIgPCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJCWlmIChwdHIgPCBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpIHsKIAkJCW1lbW1vdmUoJmxycFtwdHIgLSAxXSwgJmxycFtwdHJdLAotCQkJCShJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gcHRyKSAqIHNpemVvZigqbHJwKSk7Ci0JCQl4ZnNfYWxsb2NfbG9nX3JlY3MoY3VyLCBicCwgcHRyLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSk7CisJCQkJKGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSAtIHB0cikgKiBzaXplb2YoKmxycCkpOworCQkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgYnAsIHB0ciwgYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpIC0gMSk7CiAJCX0KIAkJLyoKIAkJICogSWYgaXQncyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBibG9jaywgd2UnbGwgbmVlZCBhIGtleQogCQkgKiBzdHJ1Y3R1cmUgdG8gcGFzcyB1cCB0byB0aGUgbmV4dCBsZXZlbCAodXBka2V5KS4KIAkJICovCiAJCWlmIChwdHIgPT0gMSkgewotCQkJa2V5LmFyX3N0YXJ0YmxvY2sgPSBscnAtPmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCi0JCQlrZXkuYXJfYmxvY2tjb3VudCA9IGxycC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCWtleS5hcl9zdGFydGJsb2NrID0gbHJwLT5hcl9zdGFydGJsb2NrOworCQkJa2V5LmFyX2Jsb2NrY291bnQgPSBscnAtPmFyX2Jsb2NrY291bnQ7CiAJCQlsa3AgPSAma2V5OwogCQl9CiAJfQogCS8qCiAJICogRGVjcmVtZW50IGFuZCBsb2cgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBibG9jay4KIAkgKi8KLQlJTlRfTU9EKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIC0xKTsKKwliZTE2X2FkZCgmYmxvY2stPmJiX251bXJlY3MsIC0xKTsKIAl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGJwLCBYRlNfQkJfTlVNUkVDUyk7CiAJLyoKIAkgKiBTZWUgaWYgdGhlIGxvbmdlc3QgZnJlZSBleHRlbnQgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAgd2FzCkBAIC0xOTQsMjQgKzE4MiwyNCBAQAogCiAJaWYgKGxldmVsID09IDAgJiYKIAkgICAgY3VyLT5iY19idG51bSA9PSBYRlNfQlROVU1fQ05UICYmCi0JICAgIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLICYmCi0JICAgIHB0ciA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKLQkJQVNTRVJUKHB0ciA9PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJICAgIGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgPT0gTlVMTEFHQkxPQ0sgJiYKKwkgICAgcHRyID4gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKSB7CisJCUFTU0VSVChwdHIgPT0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpICsgMSk7CiAJCS8qCiAJCSAqIFRoZXJlIGFyZSBzdGlsbCByZWNvcmRzIGluIHRoZSBibG9jay4gIEdyYWIgdGhlIHNpemUKIAkJICogZnJvbSB0aGUgbGFzdCBvbmUuCiAJCSAqLwotCQlpZiAoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgewotCQkJcnJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOwotCQkJSU5UX0NPUFkoYWdmLT5hZ2ZfbG9uZ2VzdCwgcnJwLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpOworCQlpZiAoYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKSB7CisJCQlycnAgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSwgY3VyKTsKKwkJCWFnZi0+YWdmX2xvbmdlc3QgPSBycnAtPmFyX2Jsb2NrY291bnQ7CiAJCX0KIAkJLyoKIAkJICogTm8gZnJlZSBleHRlbnRzIGxlZnQuCiAJCSAqLwogCQllbHNlCiAJCQlhZ2YtPmFnZl9sb25nZXN0ID0gMDsKLQkJbXAtPm1fcGVyYWdbSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKV0ucGFnZl9sb25nZXN0ID0KLQkJCUlOVF9HRVQoYWdmLT5hZ2ZfbG9uZ2VzdCwgQVJDSF9DT05WRVJUKTsKKwkJbXAtPm1fcGVyYWdbYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pXS5wYWdmX2xvbmdlc3QgPQorCQkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfbG9uZ2VzdCk7CiAJCXhmc19hbGxvY19sb2dfYWdmKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCiAJCQlYRlNfQUdGX0xPTkdFU1QpOwogCX0KQEAgLTIyNSwxNSArMjEzLDE1IEBACiAJCSAqIGFuZCBpdCdzIE5PVCB0aGUgbGVhZiBsZXZlbCwKIAkJICogdGhlbiB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGlzIGxldmVsLgogCQkgKi8KLQkJaWYgKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gMSAmJiBsZXZlbCA+IDApIHsKKwkJaWYgKGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA9PSAxICYmIGxldmVsID4gMCkgewogCQkJLyoKIAkJCSAqIGxwcCBpcyBzdGlsbCBzZXQgdG8gdGhlIGZpcnN0IHBvaW50ZXIgaW4gdGhlIGJsb2NrLgogCQkJICogTWFrZSBpdCB0aGUgbmV3IHJvb3Qgb2YgdGhlIGJ0cmVlLgogCQkJICovCi0JCQlibm8gPSBJTlRfR0VUKGFnZi0+YWdmX3Jvb3RzW2N1ci0+YmNfYnRudW1dLCBBUkNIX0NPTlZFUlQpOwotCQkJSU5UX0NPUFkoYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0sICpscHAsIEFSQ0hfQ09OVkVSVCk7Ci0JCQlJTlRfTU9EKGFnZi0+YWdmX2xldmVsc1tjdXItPmJjX2J0bnVtXSwgQVJDSF9DT05WRVJULCAtMSk7Ci0JCQltcC0+bV9wZXJhZ1tJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpXS5wYWdmX2xldmVsc1tjdXItPmJjX2J0bnVtXS0tOworCQkJYm5vID0gYmUzMl90b19jcHUoYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0pOworCQkJYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0gPSAqbHBwOworCQkJYmUzMl9hZGQoJmFnZi0+YWdmX2xldmVsc1tjdXItPmJjX2J0bnVtXSwgLTEpOworCQkJbXAtPm1fcGVyYWdbYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pXS5wYWdmX2xldmVsc1tjdXItPmJjX2J0bnVtXS0tOwogCQkJLyoKIAkJCSAqIFB1dCB0aGlzIGJ1ZmZlci9ibG9jayBvbiB0aGUgYWcncyBmcmVlbGlzdC4KIAkJCSAqLwpAQCAtMjU1LDcgKzI0Myw3IEBACiAJCQkgKiB0aGF0IGZyZWVkIHRoZSBibG9jay4KIAkJCSAqLwogCQkJeGZzX2FsbG9jX21hcmtfYnVzeShjdXItPmJjX3RwLAotCQkJCUlOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksIGJubywgMSk7CisJCQkJYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pLCBibm8sIDEpOwogCiAJCQl4ZnNfdHJhbnNfYWdidHJlZV9kZWx0YShjdXItPmJjX3RwLCAtMSk7CiAJCQl4ZnNfYWxsb2NfbG9nX2FnZihjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLApAQCAtMjgxLDcgKzI2OSw3IEBACiAJICogSWYgdGhlIG51bWJlciBvZiByZWNvcmRzIHJlbWFpbmluZyBpbiB0aGUgYmxvY2sgaXMgYXQgbGVhc3QKIAkgKiB0aGUgbWluaW11bSwgd2UncmUgZG9uZS4KIAkgKi8KLQlpZiAoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA+PSBYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSkgeworCWlmIChiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgPj0gWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKIAkJaWYgKGxldmVsID4gMCAmJiAoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAJCSpzdGF0ID0gMTsKQEAgLTI5Miw4ICsyODAsOCBAQAogCSAqIHRyZWUgYmFsYW5jZWQuICBMb29rIGF0IHRoZSBsZWZ0IGFuZCByaWdodCBzaWJsaW5nIGJsb2NrcyB0bwogCSAqIHNlZSBpZiB3ZSBjYW4gcmUtYmFsYW5jZSBieSBtb3Zpbmcgb25seSBvbmUgcmVjb3JkLgogCSAqLwotCXJibm8gPSBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKLQlsYm5vID0gSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKTsKKwlyYm5vID0gYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKTsKKwlsYm5vID0gYmUzMl90b19jcHUoYmxvY2stPmJiX2xlZnRzaWIpOwogCWJubyA9IE5VTExBR0JMT0NLOwogCUFTU0VSVChyYm5vICE9IE5VTExBR0JMT0NLIHx8IGxibm8gIT0gTlVMTEFHQkxPQ0spOwogCS8qCkBAIC0zMzAsMTggKzMxOCwxOCBAQAogCQkvKgogCQkgKiBHcmFiIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgZm9yIGZ1dHVyZSB1c2UuCiAJCSAqLwotCQlibm8gPSBJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpOworCQlibm8gPSBiZTMyX3RvX2NwdShyaWdodC0+YmJfbGVmdHNpYik7CiAJCS8qCiAJCSAqIElmIHJpZ2h0IGJsb2NrIGlzIGZ1bGwgZW5vdWdoIHNvIHRoYXQgcmVtb3Zpbmcgb25lIGVudHJ5CiAJCSAqIHdvbid0IG1ha2UgaXQgdG9vIGVtcHR5LCBhbmQgbGVmdC1zaGlmdGluZyBhbiBlbnRyeSBvdXQKIAkJICogb2YgcmlnaHQgdG8gdXMgd29ya3MsIHdlJ3JlIGRvbmUuCiAJCSAqLwotCQlpZiAoSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIDEgPj0KKwkJaWYgKGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAtIDEgPj0KIAkJICAgICBYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSkgewogCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sc2hpZnQodGN1ciwgbGV2ZWwsICZpKSkpCiAJCQkJZ290byBlcnJvcjA7CiAJCQlpZiAoaSkgewotCQkJCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID49CisJCQkJQVNTRVJUKGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA+PQogCQkJCSAgICAgICBYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSk7CiAJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwKIAkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOwpAQCAtMzU4LDcgKzM0Niw3IEBACiAJCSAqIGZ1dHVyZSByZWZlcmVuY2UsIGFuZCBmaXggdXAgdGhlIHRlbXAgY3Vyc29yIHRvIHBvaW50CiAJCSAqIHRvIG91ciBibG9jayBhZ2FpbiAobGFzdCByZWNvcmQpLgogCQkgKi8KLQkJcnJlY3MgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlycmVjcyA9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKTsKIAkJaWYgKGxibm8gIT0gTlVMTEFHQkxPQ0spIHsKIAkJCWkgPSB4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwpAQCAtMzk0LDE4ICszODIsMTggQEAKIAkJLyoKIAkJICogR3JhYiB0aGUgY3VycmVudCBibG9jayBudW1iZXIsIGZvciBmdXR1cmUgdXNlLgogCQkgKi8KLQkJYm5vID0gSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJYm5vID0gYmUzMl90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpOwogCQkvKgogCQkgKiBJZiBsZWZ0IGJsb2NrIGlzIGZ1bGwgZW5vdWdoIHNvIHRoYXQgcmVtb3Zpbmcgb25lIGVudHJ5CiAJCSAqIHdvbid0IG1ha2UgaXQgdG9vIGVtcHR5LCBhbmQgcmlnaHQtc2hpZnRpbmcgYW4gZW50cnkgb3V0CiAJCSAqIG9mIGxlZnQgdG8gdXMgd29ya3MsIHdlJ3JlIGRvbmUuCiAJCSAqLwotCQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSA+PQorCQlpZiAoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgLSAxID49CiAJCSAgICAgWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKIAkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfcnNoaWZ0KHRjdXIsIGxldmVsLCAmaSkpKQogCQkJCWdvdG8gZXJyb3IwOwogCQkJaWYgKGkpIHsKLQkJCQlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA+PQorCQkJCUFTU0VSVChiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgPj0KIAkJCQkgICAgICAgWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpOwogCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsCiAJCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKQEAgLTQxOSw3ICs0MDcsNyBAQAogCQkgKiBPdGhlcndpc2UsIGdyYWIgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHJpZ2h0IGZvcgogCQkgKiBmdXR1cmUgcmVmZXJlbmNlLgogCQkgKi8KLQkJbHJlY3MgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWxyZWNzID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7CiAJfQogCS8qCiAJICogRGVsZXRlIHRoZSB0ZW1wIGN1cnNvciwgd2UncmUgZG9uZSB3aXRoIGl0LgpAQCAtNDMzLDcgKzQyMSw3IEBACiAJICogU2VlIGlmIHdlIGNhbiBqb2luIHdpdGggdGhlIGxlZnQgbmVpZ2hib3IgYmxvY2suCiAJICovCiAJaWYgKGxibm8gIT0gTlVMTEFHQkxPQ0sgJiYKLQkgICAgbHJlY3MgKyBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJICAgIGxyZWNzICsgYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpIDw9IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CiAJCS8qCiAJCSAqIFNldCAicmlnaHQiIHRvIGJlIHRoZSBzdGFydGluZyBibG9jaywKIAkJICogImxlZnQiIHRvIGJlIHRoZSBsZWZ0IG5laWdoYm9yLgpAQCAtNDUzLDcgKzQ0MSw3IEBACiAJICogSWYgdGhhdCB3b24ndCB3b3JrLCBzZWUgaWYgd2UgY2FuIGpvaW4gd2l0aCB0aGUgcmlnaHQgbmVpZ2hib3IgYmxvY2suCiAJICovCiAJZWxzZSBpZiAocmJubyAhPSBOVUxMQUdCTE9DSyAmJgotCQkgcnJlY3MgKyBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9CisJCSBycmVjcyArIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA8PQogCQkgIFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CiAJCS8qCiAJCSAqIFNldCAibGVmdCIgdG8gYmUgdGhlIHN0YXJ0aW5nIGJsb2NrLApAQCAtNDg4LDMxICs0NzYsMzQgQEAKIAkJLyoKIAkJICogSXQncyBhIG5vbi1sZWFmLiAgTW92ZSBrZXlzIGFuZCBwb2ludGVycy4KIAkJICovCi0JCWxrcCA9IFhGU19BTExPQ19LRVlfQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxLCBjdXIpOwotCQlscHAgPSBYRlNfQUxMT0NfUFRSX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSwgY3VyKTsKKwkJbGtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGxlZnQsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICsgMSwgY3VyKTsKKwkJbHBwID0gWEZTX0FMTE9DX1BUUl9BRERSKGxlZnQsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICsgMSwgY3VyKTsKIAkJcmtwID0gWEZTX0FMTE9DX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOwogCQlycHAgPSBYRlNfQUxMT0NfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7CiAjaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChycHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCWZvciAoaSA9IDA7IGkgPCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcyk7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUocnBwW2ldKSwgbGV2ZWwpKSkKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCX0KICNlbmRpZgotCQltZW1jcHkobGtwLCBya3AsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKmxrcCkpOyAvKiBJTlRfOiBzdHJ1Y3R1cmUgY29weSAqLwotCQltZW1jcHkobHBwLCBycHAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKmxwcCkpOyAvKiBJTlRfOiBzdHJ1Y3R1cmUgY29weSAqLwotCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCBsYnAsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEsCi0JCQkJICAgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7Ci0JCXhmc19hbGxvY19sb2dfcHRycyhjdXIsIGxicCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSwKLQkJCQkgICBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJbWVtY3B5KGxrcCwgcmtwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKmxrcCkpOworCQltZW1jcHkobHBwLCBycHAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqbHBwKSk7CisJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGxicCwgYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgKyAxLAorCQkJCSAgIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICsKKwkJCQkgICBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOworCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCBsYnAsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICsgMSwKKwkJCQkgICBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSArCisJCQkJICAgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBJdCdzIGEgbGVhZi4gIE1vdmUgcmVjb3Jkcy4KIAkJICovCi0JCWxycCA9IFhGU19BTExPQ19SRUNfQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxLCBjdXIpOworCQlscnAgPSBYRlNfQUxMT0NfUkVDX0FERFIobGVmdCwgYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgKyAxLCBjdXIpOwogCQlycnAgPSBYRlNfQUxMT0NfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7Ci0JCW1lbWNweShscnAsIHJycCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqbHJwKSk7Ci0JCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIGxicCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSwKLQkJCQkgICBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJbWVtY3B5KGxycCwgcnJwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKmxycCkpOworCQl4ZnNfYWxsb2NfbG9nX3JlY3MoY3VyLCBsYnAsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICsgMSwKKwkJCQkgICBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSArCisJCQkJICAgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKIAl9CiAJLyoKIAkgKiBJZiB3ZSBqb2luZWQgd2l0aCB0aGUgbGVmdCBuZWlnaGJvciwgc2V0IHRoZSBidWZmZXIgaW4gdGhlCkBAIC01MjAsNyArNTExLDcgQEAKIAkgKi8KIAlpZiAoYnAgIT0gbGJwKSB7CiAJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgbGJwKTsKLQkJY3VyLT5iY19wdHJzW2xldmVsXSArPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWN1ci0+YmNfcHRyc1tsZXZlbF0gKz0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7CiAJfQogCS8qCiAJICogSWYgd2Ugam9pbmVkIHdpdGggdGhlIHJpZ2h0IG5laWdoYm9yIGFuZCB0aGVyZSdzIGEgbGV2ZWwgYWJvdmUKQEAgLTUzMiwyOCArNTIzLDI4IEBACiAJLyoKIAkgKiBGaXggdXAgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBzdXJ2aXZpbmcgYmxvY2suCiAJICovCi0JSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCWJlMTZfYWRkKCZsZWZ0LT5iYl9udW1yZWNzLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwogCS8qCiAJICogRml4IHVwIHRoZSByaWdodCBibG9jayBwb2ludGVyIGluIHRoZSBzdXJ2aXZpbmcgYmxvY2ssIGFuZCBsb2cgaXQuCiAJICovCi0JbGVmdC0+YmJfcmlnaHRzaWIgPSByaWdodC0+YmJfcmlnaHRzaWI7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJbGVmdC0+YmJfcmlnaHRzaWIgPSByaWdodC0+YmJfcmlnaHRzaWI7CiAJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTIHwgWEZTX0JCX1JJR0hUU0lCKTsKIAkvKgogCSAqIElmIHRoZXJlIGlzIGEgcmlnaHQgc2libGluZyBub3csIG1ha2UgaXQgcG9pbnQgdG8gdGhlCiAJICogcmVtYWluaW5nIGJsb2NrLgogCSAqLwotCWlmIChJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0JMT0NLKSB7CisJaWYgKGJlMzJfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKSAhPSBOVUxMQUdCTE9DSykgewogCQl4ZnNfYWxsb2NfYmxvY2tfdAkqcnJibG9jazsKIAkJeGZzX2J1Zl90CQkqcnJicDsKIAogCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKLQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAwLAorCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGJlMzJfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKSwgMCwKIAkJCQkmcnJicCwgWEZTX0FMTE9DX0JUUkVFX1JFRikpKQogCQkJcmV0dXJuIGVycm9yOwogCQlycmJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhycmJwKTsKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBycmJsb2NrLCBsZXZlbCwgcnJicCkpKQogCQkJcmV0dXJuIGVycm9yOwotCQlJTlRfU0VUKHJyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgbGJubyk7CisJCXJyYmxvY2stPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmUzMihsYm5vKTsKIAkJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBycmJwLCBYRlNfQkJfTEVGVFNJQik7CiAJfQogCS8qCkBAIC01NzQsMTAgKzU2NSw5IEBACiAJICogYnVzeSBibG9jayBpcyBhbGxvY2F0ZWQsIHRoZSBpY2xvZyBpcyBwdXNoZWQgdXAgdG8gdGhlCiAJICogTFNOIHRoYXQgZnJlZWQgdGhlIGJsb2NrLgogCSAqLwotCXhmc19hbGxvY19tYXJrX2J1c3koY3VyLT5iY190cCwKLQkJSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKSwgYm5vLCAxKTsKLQorCXhmc19hbGxvY19tYXJrX2J1c3koY3VyLT5iY190cCwgYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pLCBibm8sIDEpOwogCXhmc190cmFuc19hZ2J0cmVlX2RlbHRhKGN1ci0+YmNfdHAsIC0xKTsKKwogCS8qCiAJICogQWRqdXN0IHRoZSBjdXJyZW50IGxldmVsJ3MgY3Vyc29yIHNvIHRoYXQgd2UncmUgbGVmdCByZWZlcnJpbmcKIAkgKiB0byB0aGUgcmlnaHQgbm9kZSwgYWZ0ZXIgd2UncmUgZG9uZS4KQEAgLTYyNSw3ICs2MTUsMTUgQEAKIAlpbnQJCQlwdHI7CS8qIGluZGV4IGluIGJ0cmVlIGJsb2NrIGZvciB0aGlzIHJlYyAqLwogCXhmc19hbGxvY19yZWNfdAkJKnJwOwkvKiBwb2ludGVyIHRvIGJ0cmVlIHJlY29yZHMgKi8KIAotCUFTU0VSVChJTlRfR0VUKHJlY3AtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKTsKKwlBU1NFUlQoYmUzMl90b19jcHUocmVjcC0+YXJfYmxvY2tjb3VudCkgPiAwKTsKKworCS8qCisJICogR0NDIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgKGFyZ3VhYmx5IGNvbXBsZXgpIGNvbnRyb2wgZmxvdyBpbgorCSAqIHRoaXMgZnVuY3Rpb24gYW5kIGNvbXBsYWlucyBhYm91dCB1bmluaXRpYWxpemVkIHN0cnVjdHVyZSBmaWVsZHMKKwkgKiB3aXRob3V0IHRoaXMuCisJICovCisJbWVtc2V0KCZucmVjLCAwLCBzaXplb2YobnJlYykpOworCiAJLyoKIAkgKiBJZiB3ZSBtYWRlIGl0IHRvIHRoZSByb290IGxldmVsLCBhbGxvY2F0ZSBhIG5ldyByb290IGJsb2NrCiAJICogYW5kIHdlJ3JlIGRvbmUuCkBAIC02NDEsOCArNjM5LDggQEAKIAkvKgogCSAqIE1ha2UgYSBrZXkgb3V0IG9mIHRoZSByZWNvcmQgZGF0YSB0byBiZSBpbnNlcnRlZCwgYW5kIHNhdmUgaXQuCiAJICovCi0Ja2V5LmFyX3N0YXJ0YmxvY2sgPSByZWNwLT5hcl9zdGFydGJsb2NrOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLwotCWtleS5hcl9ibG9ja2NvdW50ID0gcmVjcC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwlrZXkuYXJfc3RhcnRibG9jayA9IHJlY3AtPmFyX3N0YXJ0YmxvY2s7CisJa2V5LmFyX2Jsb2NrY291bnQgPSByZWNwLT5hcl9ibG9ja2NvdW50OwogCW9wdHIgPSBwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOwogCS8qCiAJICogSWYgd2UncmUgb2ZmIHRoZSBsZWZ0IGVkZ2UsIHJldHVybiBmYWlsdXJlLgpAQCAtNjYzLDcgKzY2MSw3IEBACiAJLyoKIAkgKiBDaGVjayB0aGF0IHRoZSBuZXcgZW50cnkgaXMgYmVpbmcgaW5zZXJ0ZWQgaW4gdGhlIHJpZ2h0IHBsYWNlLgogCSAqLwotCWlmIChwdHIgPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCWlmIChwdHIgPD0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKSB7CiAJCWlmIChsZXZlbCA9PSAwKSB7CiAJCQlycCA9IFhGU19BTExPQ19SRUNfQUREUihibG9jaywgcHRyLCBjdXIpOwogCQkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCByZWNwLCBycCk7CkBAIC02NzksNyArNjc3LDcgQEAKIAkgKiBJZiB0aGUgYmxvY2sgaXMgZnVsbCwgd2UgY2FuJ3QgaW5zZXJ0IHRoZSBuZXcgZW50cnkgdW50aWwgd2UKIAkgKiBtYWtlIHRoZSBibG9jayB1bi1mdWxsLgogCSAqLwotCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJaWYgKGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA9PSBYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgewogCQkvKgogCQkgKiBGaXJzdCwgdHJ5IHNoaWZ0aW5nIGFuIGVudHJ5IHRvIHRoZSByaWdodCBuZWlnaGJvci4KIAkJICovCkBAIC03MTYsOCArNzE0LDggQEAKIAkJCQkJCXJldHVybiBlcnJvcjsKICNlbmRpZgogCQkJCQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOwotCQkJCQlucmVjLmFyX3N0YXJ0YmxvY2sgPSBua2V5LmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCi0JCQkJCW5yZWMuYXJfYmxvY2tjb3VudCA9IG5rZXkuYXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCQkJbnJlYy5hcl9zdGFydGJsb2NrID0gbmtleS5hcl9zdGFydGJsb2NrOworCQkJCQlucmVjLmFyX2Jsb2NrY291bnQgPSBua2V5LmFyX2Jsb2NrY291bnQ7CiAJCQkJfQogCQkJCS8qCiAJCQkJICogT3RoZXJ3aXNlIHRoZSBpbnNlcnQgZmFpbHMuCkBAIC03NDEsMTUgKzczOSwxNSBAQAogCQlrcCA9IFhGU19BTExPQ19LRVlfQUREUihibG9jaywgMSwgY3VyKTsKIAkJcHAgPSBYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIDEsIGN1cik7CiAjaWZkZWYgREVCVUcKLQkJZm9yIChpID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsgaSA+PSBwdHI7IGktLSkgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChwcFtpIC0gMV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCWZvciAoaSA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsgaSA+PSBwdHI7IGktLSkgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUocHBbaSAtIDFdKSwgbGV2ZWwpKSkKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCX0KICNlbmRpZgogCQltZW1tb3ZlKCZrcFtwdHJdLCAma3BbcHRyIC0gMV0sCi0JCQkoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIHB0ciArIDEpICogc2l6ZW9mKCprcCkpOyAvKiBJTlRfOiBjb3B5ICovCisJCQkoYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpIC0gcHRyICsgMSkgKiBzaXplb2YoKmtwKSk7CiAJCW1lbW1vdmUoJnBwW3B0cl0sICZwcFtwdHIgLSAxXSwKLQkJCShJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gcHRyICsgMSkgKiBzaXplb2YoKnBwKSk7IC8qIElOVF86IGNvcHkgKi8KKwkJCShiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgLSBwdHIgKyAxKSAqIHNpemVvZigqcHApKTsKICNpZmRlZiBERUJVRwogCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCAqYm5vcCwgbGV2ZWwpKSkKIAkJCXJldHVybiBlcnJvcjsKQEAgLTc1OCwxMiArNzU2LDEyIEBACiAJCSAqIE5vdyBzdHVmZiB0aGUgbmV3IGRhdGEgaW4sIGJ1bXAgbnVtcmVjcyBhbmQgbG9nIHRoZSBuZXcgZGF0YS4KIAkJICovCiAJCWtwW3B0ciAtIDFdID0ga2V5OwotCQlJTlRfU0VUKHBwW3B0ciAtIDFdLCBBUkNIX0NPTlZFUlQsICpibm9wKTsKLQkJSU5UX01PRChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7Ci0JCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOwotCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCBicCwgcHRyLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJcHBbcHRyIC0gMV0gPSBjcHVfdG9fYmUzMigqYm5vcCk7CisJCWJlMTZfYWRkKCZibG9jay0+YmJfbnVtcmVjcywgMSk7CisJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSk7CisJCXhmc19hbGxvY19sb2dfcHRycyhjdXIsIGJwLCBwdHIsIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSk7CiAjaWZkZWYgREVCVUcKLQkJaWYgKHB0ciA8IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisJCWlmIChwdHIgPCBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpCiAJCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sIGtwICsgcHRyIC0gMSwKIAkJCQlrcCArIHB0cik7CiAjZW5kaWYKQEAgLTc3MywxNiArNzcxLDE2IEBACiAJCSAqLwogCQlycCA9IFhGU19BTExPQ19SRUNfQUREUihibG9jaywgMSwgY3VyKTsKIAkJbWVtbW92ZSgmcnBbcHRyXSwgJnJwW3B0ciAtIDFdLAotCQkJKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBwdHIgKyAxKSAqIHNpemVvZigqcnApKTsKKwkJCShiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgLSBwdHIgKyAxKSAqIHNpemVvZigqcnApKTsKIAkJLyoKIAkJICogTm93IHN0dWZmIHRoZSBuZXcgcmVjb3JkIGluLCBidW1wIG51bXJlY3MKIAkJICogYW5kIGxvZyB0aGUgbmV3IGRhdGEuCiAJCSAqLwogCQlycFtwdHIgLSAxXSA9ICpyZWNwOyAvKiBJTlRfOiBzdHJ1Y3QgY29weSAqLwotCQlJTlRfTU9EKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKLQkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgYnAsIHB0ciwgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCWJlMTZfYWRkKCZibG9jay0+YmJfbnVtcmVjcywgMSk7CisJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSk7CiAjaWZkZWYgREVCVUcKLQkJaWYgKHB0ciA8IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisJCWlmIChwdHIgPCBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpCiAJCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGN1ci0+YmNfYnRudW0sIHJwICsgcHRyIC0gMSwKIAkJCQlycCArIHB0cik7CiAjZW5kaWYKQEAgLTgwNCwxNiArODAyLDE2IEBACiAJYWdmID0gWEZTX0JVRl9UT19BR0YoY3VyLT5iY19wcml2YXRlLmEuYWdicCk7CiAJaWYgKGxldmVsID09IDAgJiYKIAkgICAgY3VyLT5iY19idG51bSA9PSBYRlNfQlROVU1fQ05UICYmCi0JICAgIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLICYmCi0JICAgIElOVF9HRVQocmVjcC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSA+IElOVF9HRVQoYWdmLT5hZ2ZfbG9uZ2VzdCwgQVJDSF9DT05WRVJUKSkgeworCSAgICBiZTMyX3RvX2NwdShibG9jay0+YmJfcmlnaHRzaWIpID09IE5VTExBR0JMT0NLICYmCisJICAgIGJlMzJfdG9fY3B1KHJlY3AtPmFyX2Jsb2NrY291bnQpID4gYmUzMl90b19jcHUoYWdmLT5hZ2ZfbG9uZ2VzdCkpIHsKIAkJLyoKIAkJICogSWYgdGhpcyBpcyBhIGxlYWYgaW4gdGhlIGJ5LXNpemUgYnRyZWUgYW5kIHRoZXJlCiAJCSAqIGlzIG5vIHJpZ2h0IHNpYmxpbmcgYmxvY2sgYW5kIHRoaXMgYmxvY2sgaXMgYmlnZ2VyCiAJCSAqIHRoYW4gdGhlIHByZXZpb3VzIGxvbmdlc3QgYmxvY2ssIHVwZGF0ZSBpdC4KIAkJICovCi0JCUlOVF9DT1BZKGFnZi0+YWdmX2xvbmdlc3QsIHJlY3AtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCk7Ci0JCWN1ci0+YmNfbXAtPm1fcGVyYWdbSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKV0ucGFnZl9sb25nZXN0Ci0JCQk9IElOVF9HRVQocmVjcC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJYWdmLT5hZ2ZfbG9uZ2VzdCA9IHJlY3AtPmFyX2Jsb2NrY291bnQ7CisJCWN1ci0+YmNfbXAtPm1fcGVyYWdbYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pXS5wYWdmX2xvbmdlc3QKKwkJCT0gYmUzMl90b19jcHUocmVjcC0+YXJfYmxvY2tjb3VudCk7CiAJCXhmc19hbGxvY19sb2dfYWdmKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCiAJCQlYRlNfQUdGX0xPTkdFU1QpOwogCX0KQEAgLTkyMyw4ICs5MjEsOSBAQAogCiAJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnApOwogCQlmb3IgKHAgPSAmcnBbcmZpcnN0IC0gMV07IHAgPD0gJnJwW3JsYXN0IC0gMV07IHArKykKLQkJCUFTU0VSVChJTlRfR0VUKHAtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKHAtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgPD0KLQkJCSAgICAgICBJTlRfR0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoYmUzMl90b19jcHUocC0+YXJfc3RhcnRibG9jaykgKworCQkJICAgICAgIGJlMzJfdG9fY3B1KHAtPmFyX2Jsb2NrY291bnQpIDw9CisJCQkgICAgICAgYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKSk7CiAJfQogI2VuZGlmCiAJZmlyc3QgPSAoaW50KSgoeGZzX2NhZGRyX3QpJnJwW3JmaXJzdCAtIDFdIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKQEAgLTk2MSw4ICs5NjAsOCBAQAogCQl4ZnNfYWdmX3QJKmFnZjsJLyogYS5nLiBmcmVlc3BhY2UgaGVhZGVyICovCiAKIAkJYWdmID0gWEZTX0JVRl9UT19BR0YoY3VyLT5iY19wcml2YXRlLmEuYWdicCk7Ci0JCWFnbm8gPSBJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpOwotCQlhZ2JubyA9IElOVF9HRVQoYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0sIEFSQ0hfQ09OVkVSVCk7CisJCWFnbm8gPSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9zZXFubyk7CisJCWFnYm5vID0gYmUzMl90b19jcHUoYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0pOwogCX0KIAkvKgogCSAqIEl0ZXJhdGUgb3ZlciBlYWNoIGxldmVsIGluIHRoZSBidHJlZSwgc3RhcnRpbmcgYXQgdGhlIHJvb3QuCkBAIC0xMDI5LDcgKzEwMjgsNyBAQAogCQkJICogU2V0IGxvdyBhbmQgaGlnaCBlbnRyeSBudW1iZXJzLCAxLWJhc2VkLgogCQkJICovCiAJCQlsb3cgPSAxOwotCQkJaWYgKCEoaGlnaCA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCQlpZiAoIShoaWdoID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKSkgewogCQkJCS8qCiAJCQkJICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCB0aGUgdHJlZSBtdXN0CiAJCQkJICogYmUgYW4gZW1wdHkgbGVhZi4KQEAgLTEwNTgsMTQgKzEwNTcsMTQgQEAKIAkJCQkJeGZzX2FsbG9jX2tleV90CSpra3A7CiAKIAkJCQkJa2twID0ga2tiYXNlICsga2V5bm8gLSAxOwotCQkJCQlzdGFydGJsb2NrID0gSU5UX0dFVChra3AtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCk7Ci0JCQkJCWJsb2NrY291bnQgPSBJTlRfR0VUKGtrcC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJCQkJc3RhcnRibG9jayA9IGJlMzJfdG9fY3B1KGtrcC0+YXJfc3RhcnRibG9jayk7CisJCQkJCWJsb2NrY291bnQgPSBiZTMyX3RvX2NwdShra3AtPmFyX2Jsb2NrY291bnQpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXhmc19hbGxvY19yZWNfdAkqa3JwOwogCiAJCQkJCWtycCA9IGtyYmFzZSArIGtleW5vIC0gMTsKLQkJCQkJc3RhcnRibG9jayA9IElOVF9HRVQoa3JwLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpOwotCQkJCQlibG9ja2NvdW50ID0gSU5UX0dFVChrcnAtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCQkJCXN0YXJ0YmxvY2sgPSBiZTMyX3RvX2NwdShrcnAtPmFyX3N0YXJ0YmxvY2spOworCQkJCQlibG9ja2NvdW50ID0gYmUzMl90b19jcHUoa3JwLT5hcl9ibG9ja2NvdW50KTsKIAkJCQl9CiAJCQkJLyoKIAkJCQkgKiBDb21wdXRlIGRpZmZlcmVuY2UgdG8gZ2V0IG5leHQgZGlyZWN0aW9uLgpAQCAtMTEwNSw3ICsxMTA0LDcgQEAKIAkJCSAqLwogCQkJaWYgKGRpZmYgPiAwICYmIC0ta2V5bm8gPCAxKQogCQkJCWtleW5vID0gMTsKLQkJCWFnYm5vID0gSU5UX0dFVCgqWEZTX0FMTE9DX1BUUl9BRERSKGJsb2NrLCBrZXlubywgY3VyKSwgQVJDSF9DT05WRVJUKTsKKwkJCWFnYm5vID0gYmUzMl90b19jcHUoKlhGU19BTExPQ19QVFJfQUREUihibG9jaywga2V5bm8sIGN1cikpOwogI2lmZGVmIERFQlVHCiAJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBhZ2JubywgbGV2ZWwpKSkKIAkJCQlyZXR1cm4gZXJyb3I7CkBAIC0xMTI0LDggKzExMjMsOCBAQAogCQkgKiBub3QgdGhlIGxhc3QgYmxvY2ssIHdlJ3JlIGluIHRoZSB3cm9uZyBibG9jay4KIAkJICovCiAJCWlmIChkaXIgPT0gWEZTX0xPT0tVUF9HRSAmJgotCQkgICAga2V5bm8gPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICYmCi0JCSAgICBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQkgICAga2V5bm8gPiBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgJiYKKwkJICAgIGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgIT0gTlVMTEFHQkxPQ0spIHsKIAkJCWludAlpOwogCiAJCQljdXItPmJjX3B0cnNbMF0gPSBrZXlubzsKQEAgLTExNDIsNyArMTE0MSw3IEBACiAJLyoKIAkgKiBSZXR1cm4gaWYgd2Ugc3VjY2VlZGVkIG9yIG5vdC4KIAkgKi8KLQlpZiAoa2V5bm8gPT0gMCB8fCBrZXlubyA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisJaWYgKGtleW5vID09IDAgfHwga2V5bm8gPiBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpCiAJCSpzdGF0ID0gMDsKIAllbHNlCiAJCSpzdGF0ID0gKChkaXIgIT0gWEZTX0xPT0tVUF9FUSkgfHwgKGRpZmYgPT0gMCkpOwpAQCAtMTE4NSw3ICsxMTg0LDcgQEAKIAkvKgogCSAqIElmIHdlJ3ZlIGdvdCBubyBsZWZ0IHNpYmxpbmcgdGhlbiB3ZSBjYW4ndCBzaGlmdCBhbiBlbnRyeSBsZWZ0LgogCSAqLwotCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLKSB7CisJaWYgKGJlMzJfdG9fY3B1KHJpZ2h0LT5iYl9sZWZ0c2liKSA9PSBOVUxMQUdCTE9DSykgewogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwogCX0KQEAgLTEyMDEsOCArMTIwMCw4IEBACiAJICogU2V0IHVwIHRoZSBsZWZ0IG5laWdoYm9yIGFzICJsZWZ0Ii4KIAkgKi8KIAlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAotCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSwgMCwgJmxicCwKLQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGJlMzJfdG9fY3B1KHJpZ2h0LT5iYl9sZWZ0c2liKSwKKwkJCTAsICZsYnAsIFhGU19BTExPQ19CVFJFRV9SRUYpKSkKIAkJcmV0dXJuIGVycm9yOwogCWxlZnQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGxicCk7CiAJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCkBAIC0xMjEwLDExICsxMjA5LDExIEBACiAJLyoKIAkgKiBJZiBpdCdzIGZ1bGwsIGl0IGNhbid0IHRha2UgYW5vdGhlciBlbnRyeS4KIAkgKi8KLQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJaWYgKGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpID09IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CiAJCSpzdGF0ID0gMDsKIAkJcmV0dXJuIDA7CiAJfQotCW5yZWMgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxOworCW5yZWMgPSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSArIDE7CiAJLyoKIAkgKiBJZiBub24tbGVhZiwgY29weSBhIGtleSBhbmQgYSBwdHIgdG8gdGhlIGxlZnQgYmxvY2suCiAJICovCkBAIC0xMjI5LDcgKzEyMjgsNyBAQAogCQlscHAgPSBYRlNfQUxMT0NfUFRSX0FERFIobGVmdCwgbnJlYywgY3VyKTsKIAkJcnBwID0gWEZTX0FMTE9DX1BUUl9BRERSKHJpZ2h0LCAxLCBjdXIpOwogI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQoKnJwcCwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUoKnJwcCksIGxldmVsKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAjZW5kaWYKIAkJKmxwcCA9ICpycHA7IC8qIElOVF86IGNvcHkgKi8KQEAgLTEyNTEsMzAgKzEyNTAsMzAgQEAKIAkvKgogCSAqIEJ1bXAgYW5kIGxvZyBsZWZ0J3MgbnVtcmVjcywgZGVjcmVtZW50IGFuZCBsb2cgcmlnaHQncyBudW1yZWNzLgogCSAqLwotCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7CisJYmUxNl9hZGQoJmxlZnQtPmJiX251bXJlY3MsIDEpOwogCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyk7Ci0JSU5UX01PRChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJYmUxNl9hZGQoJnJpZ2h0LT5iYl9udW1yZWNzLCAtMSk7CiAJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCByYnAsIFhGU19CQl9OVU1SRUNTKTsKIAkvKgogCSAqIFNsaWRlIHRoZSBjb250ZW50cyBvZiByaWdodCBkb3duIG9uZSBlbnRyeS4KIAkgKi8KIAlpZiAobGV2ZWwgPiAwKSB7CiAjaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChycHBbaSArIDFdLCBBUkNIX0NPTlZFUlQpLAorCQlmb3IgKGkgPSAwOyBpIDwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KHJwcFtpICsgMV0pLAogCQkJCQlsZXZlbCkpKQogCQkJCXJldHVybiBlcnJvcjsKIAkJfQogI2VuZGlmCi0JCW1lbW1vdmUocmtwLCBya3AgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKLQkJbWVtbW92ZShycHAsIHJwcCArIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJwcCkpOwotCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOwotCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQltZW1tb3ZlKHJrcCwgcmtwICsgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpya3ApKTsKKwkJbWVtbW92ZShycHAsIHJwcCArIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnBwKSk7CisJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKKwkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwogCX0gZWxzZSB7Ci0JCW1lbW1vdmUocnJwLCBycnAgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKLQkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKLQkJa2V5LmFyX3N0YXJ0YmxvY2sgPSBycnAtPmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCi0JCWtleS5hcl9ibG9ja2NvdW50ID0gcnJwLT5hcl9ibG9ja2NvdW50OyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQltZW1tb3ZlKHJycCwgcnJwICsgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpycnApKTsKKwkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOworCQlrZXkuYXJfc3RhcnRibG9jayA9IHJycC0+YXJfc3RhcnRibG9jazsKKwkJa2V5LmFyX2Jsb2NrY291bnQgPSBycnAtPmFyX2Jsb2NrY291bnQ7CiAJCXJrcCA9ICZrZXk7CiAJfQogCS8qCkBAIC0xMzM5LDkgKzEzMzgsOSBAQAogCQl4ZnNfYWdudW1iZXJfdAlzZXFubzsKIAogCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKLQkJSU5UX1NFVChhZ2YtPmFnZl9yb290c1tjdXItPmJjX2J0bnVtXSwgQVJDSF9DT05WRVJULCBuYm5vKTsKLQkJSU5UX01PRChhZ2YtPmFnZl9sZXZlbHNbY3VyLT5iY19idG51bV0sIEFSQ0hfQ09OVkVSVCwgMSk7Ci0JCXNlcW5vID0gSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKTsKKwkJYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0gPSBjcHVfdG9fYmUzMihuYm5vKTsKKwkJYmUzMl9hZGQoJmFnZi0+YWdmX2xldmVsc1tjdXItPmJjX2J0bnVtXSwgMSk7CisJCXNlcW5vID0gYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pOwogCQltcC0+bV9wZXJhZ1tzZXFub10ucGFnZl9sZXZlbHNbY3VyLT5iY19idG51bV0rKzsKIAkJeGZzX2FsbG9jX2xvZ19hZ2YoY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKIAkJCVhGU19BR0ZfUk9PVFMgfCBYRlNfQUdGX0xFVkVMUyk7CkBAIC0xMzU4LDEyICsxMzU3LDEyIEBACiAJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBjdXItPmJjX25sZXZlbHMgLSAxLCBsYnApKSkKIAkJcmV0dXJuIGVycm9yOwogI2VuZGlmCi0JaWYgKElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwlpZiAoYmUzMl90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpICE9IE5VTExBR0JMT0NLKSB7CiAJCS8qCiAJCSAqIE91ciBibG9jayBpcyBsZWZ0LCBwaWNrIHVwIHRoZSByaWdodCBibG9jay4KIAkJICovCiAJCWxibm8gPSBYRlNfREFERFJfVE9fQUdCTk8obXAsIFhGU19CVUZfQUREUihsYnApKTsKLQkJcmJubyA9IElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCXJibm8gPSBiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYik7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKG1wLCBjdXItPmJjX3RwLAogCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIHJibm8sIDAsICZyYnAsCiAJCQkJWEZTX0FMTE9DX0JUUkVFX1JFRikpKQpAQCAtMTM4MCw3ICsxMzc5LDcgQEAKIAkJcmJwID0gbGJwOwogCQlyaWdodCA9IGxlZnQ7CiAJCXJibm8gPSBYRlNfREFERFJfVE9fQUdCTk8obXAsIFhGU19CVUZfQUREUihyYnApKTsKLQkJbGJubyA9IElOVF9HRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCWxibm8gPSBiZTMyX3RvX2NwdShyaWdodC0+YmJfbGVmdHNpYik7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKG1wLCBjdXItPmJjX3RwLAogCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGxibm8sIDAsICZsYnAsCiAJCQkJWEZTX0FMTE9DX0JUUkVFX1JFRikpKQpAQCAtMTM5NCwxMSArMTM5MywxMSBAQAogCS8qCiAJICogRmlsbCBpbiB0aGUgbmV3IGJsb2NrJ3MgYnRyZWUgaGVhZGVyIGFuZCBsb2cgaXQuCiAJICovCi0JSU5UX1NFVChuZXctPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0pOwotCUlOVF9TRVQobmV3LT5iYl9sZXZlbCwgQVJDSF9DT05WRVJULCAoX191aW50MTZfdCljdXItPmJjX25sZXZlbHMpOwotCUlOVF9TRVQobmV3LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDIpOwotCUlOVF9TRVQobmV3LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKLQlJTlRfU0VUKG5ldy0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCW5ldy0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMih4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dKTsKKwluZXctPmJiX2xldmVsID0gY3B1X3RvX2JlMTYoY3VyLT5iY19ubGV2ZWxzKTsKKwluZXctPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNigyKTsKKwluZXctPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7CisJbmV3LT5iYl9yaWdodHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKIAl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIG5icCwgWEZTX0JCX0FMTF9CSVRTKTsKIAlBU1NFUlQobGJubyAhPSBOVUxMQUdCTE9DSyAmJiByYm5vICE9IE5VTExBR0JMT0NLKTsKIAkvKgpAQCAtMTQwOCwxOCArMTQwNywxOCBAQAogCQl4ZnNfYWxsb2Nfa2V5X3QJCSprcDsJLyogYnRyZWUga2V5IHBvaW50ZXIgKi8KIAogCQlrcCA9IFhGU19BTExPQ19LRVlfQUREUihuZXcsIDEsIGN1cik7Ci0JCWlmIChJTlRfR0VUKGxlZnQtPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID4gMCkgeworCQlpZiAoYmUxNl90b19jcHUobGVmdC0+YmJfbGV2ZWwpID4gMCkgewogCQkJa3BbMF0gPSAqWEZTX0FMTE9DX0tFWV9BRERSKGxlZnQsIDEsIGN1cik7IC8qIElOVF86IHN0cnVjdHVyZSBjb3B5ICovCiAJCQlrcFsxXSA9ICpYRlNfQUxMT0NfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7LyogSU5UXzogc3RydWN0dXJlIGNvcHkgKi8KIAkJfSBlbHNlIHsKIAkJCXhmc19hbGxvY19yZWNfdAkqcnA7CS8qIGJ0cmVlIHJlY29yZCBwb2ludGVyICovCiAKIAkJCXJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGxlZnQsIDEsIGN1cik7Ci0JCQlrcFswXS5hcl9zdGFydGJsb2NrID0gcnAtPmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCi0JCQlrcFswXS5hcl9ibG9ja2NvdW50ID0gcnAtPmFyX2Jsb2NrY291bnQ7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCQlrcFswXS5hcl9zdGFydGJsb2NrID0gcnAtPmFyX3N0YXJ0YmxvY2s7CisJCQlrcFswXS5hcl9ibG9ja2NvdW50ID0gcnAtPmFyX2Jsb2NrY291bnQ7CiAJCQlycCA9IFhGU19BTExPQ19SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKLQkJCWtwWzFdLmFyX3N0YXJ0YmxvY2sgPSBycC0+YXJfc3RhcnRibG9jazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KLQkJCWtwWzFdLmFyX2Jsb2NrY291bnQgPSBycC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCWtwWzFdLmFyX3N0YXJ0YmxvY2sgPSBycC0+YXJfc3RhcnRibG9jazsKKwkJCWtwWzFdLmFyX2Jsb2NrY291bnQgPSBycC0+YXJfYmxvY2tjb3VudDsKIAkJfQogCX0KIAl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCBuYnAsIDEsIDIpOwpAQCAtMTQzMCw4ICsxNDI5LDggQEAKIAkJeGZzX2FsbG9jX3B0cl90CQkqcHA7CS8qIGJ0cmVlIGFkZHJlc3MgcG9pbnRlciAqLwogCiAJCXBwID0gWEZTX0FMTE9DX1BUUl9BRERSKG5ldywgMSwgY3VyKTsKLQkJSU5UX1NFVChwcFswXSwgQVJDSF9DT05WRVJULCBsYm5vKTsKLQkJSU5UX1NFVChwcFsxXSwgQVJDSF9DT05WRVJULCByYm5vKTsKKwkJcHBbMF0gPSBjcHVfdG9fYmUzMihsYm5vKTsKKwkJcHBbMV0gPSBjcHVfdG9fYmUzMihyYm5vKTsKIAl9CiAJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgbmJwLCAxLCAyKTsKIAkvKgpAQCAtMTQ3Niw3ICsxNDc1LDcgQEAKIAkvKgogCSAqIElmIHdlJ3ZlIGdvdCBubyByaWdodCBzaWJsaW5nIHRoZW4gd2UgY2FuJ3Qgc2hpZnQgYW4gZW50cnkgcmlnaHQuCiAJICovCi0JaWYgKElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwlpZiAoYmUzMl90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpID09IE5VTExBR0JMT0NLKSB7CiAJCSpzdGF0ID0gMDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTQ4NCw3ICsxNDgzLDcgQEAKIAkgKiBJZiB0aGUgY3Vyc29yIGVudHJ5IGlzIHRoZSBvbmUgdGhhdCB3b3VsZCBiZSBtb3ZlZCwgZG9uJ3QKIAkgKiBkbyBpdC4uLiBpdCdzIHRvbyBjb21wbGljYXRlZC4KIAkgKi8KLQlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+PSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+PSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSkgewogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwogCX0KQEAgLTE0OTIsOCArMTQ5MSw4IEBACiAJICogU2V0IHVwIHRoZSByaWdodCBuZWlnaGJvciBhcyAicmlnaHQiLgogCSAqLwogCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCi0JCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAwLCAmcmJwLAotCQkJWEZTX0FMTE9DX0JUUkVFX1JFRikpKQorCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgYmUzMl90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpLAorCQkJMCwgJnJicCwgWEZTX0FMTE9DX0JUUkVFX1JFRikpKQogCQlyZXR1cm4gZXJyb3I7CiAJcmlnaHQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJicCk7CiAJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKQpAQCAtMTUwMSw3ICsxNTAwLDcgQEAKIAkvKgogCSAqIElmIGl0J3MgZnVsbCwgaXQgY2FuJ3QgdGFrZSBhbm90aGVyIGVudHJ5LgogCSAqLwotCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJaWYgKGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSA9PSBYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgewogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwogCX0KQEAgLTE1MTQsNDcgKzE1MTMsNDcgQEAKIAkJeGZzX2FsbG9jX3B0cl90CSpscHA7CS8qIGFkZHJlc3MgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLwogCQl4ZnNfYWxsb2NfcHRyX3QJKnJwcDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciByaWdodCBibG9jayAqLwogCi0JCWxrcCA9IFhGU19BTExPQ19LRVlfQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksIGN1cik7Ci0JCWxwcCA9IFhGU19BTExPQ19QVFJfQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJCWxrcCA9IFhGU19BTExPQ19LRVlfQUREUihsZWZ0LCBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSwgY3VyKTsKKwkJbHBwID0gWEZTX0FMTE9DX1BUUl9BRERSKGxlZnQsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpLCBjdXIpOwogCQlya3AgPSBYRlNfQUxMT0NfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7CiAJCXJwcCA9IFhGU19BTExPQ19QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKICNpZmRlZiBERUJVRwotCQlmb3IgKGkgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocnBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQlmb3IgKGkgPSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUocnBwW2ldKSwgbGV2ZWwpKSkKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCX0KICNlbmRpZgotCQltZW1tb3ZlKHJrcCArIDEsIHJrcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcmtwKSk7Ci0JCW1lbW1vdmUocnBwICsgMSwgcnBwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycHApKTsKKwkJbWVtbW92ZShya3AgKyAxLCBya3AsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcmtwKSk7CisJCW1lbW1vdmUocnBwICsgMSwgcnBwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJwcCkpOwogI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQoKmxwcCwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUoKmxwcCksIGxldmVsKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAjZW5kaWYKIAkJKnJrcCA9ICpsa3A7IC8qIElOVF86IGNvcHkgKi8KIAkJKnJwcCA9ICpscHA7IC8qIElOVF86IGNvcHkgKi8KLQkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7Ci0JCXhmc19hbGxvY19sb2dfcHRycyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSArIDEpOworCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSArIDEpOwogCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sIHJrcCwgcmtwICsgMSk7CiAJfSBlbHNlIHsKIAkJeGZzX2FsbG9jX3JlY190CSpscnA7CS8qIHJlY29yZCBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCiAJCXhmc19hbGxvY19yZWNfdAkqcnJwOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KIAotCQlscnAgPSBYRlNfQUxMT0NfUkVDX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlscnAgPSBYRlNfQUxMT0NfUkVDX0FERFIobGVmdCwgYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyksIGN1cik7CiAJCXJycCA9IFhGU19BTExPQ19SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKLQkJbWVtbW92ZShycnAgKyAxLCBycnAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJycCkpOworCQltZW1tb3ZlKHJycCArIDEsIHJycCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpycnApKTsKIAkJKnJycCA9ICpscnA7Ci0JCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOwotCQlrZXkuYXJfc3RhcnRibG9jayA9IHJycC0+YXJfc3RhcnRibG9jazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KLQkJa2V5LmFyX2Jsb2NrY291bnQgPSBycnAtPmFyX2Jsb2NrY291bnQ7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMSk7CisJCWtleS5hcl9zdGFydGJsb2NrID0gcnJwLT5hcl9zdGFydGJsb2NrOworCQlrZXkuYXJfYmxvY2tjb3VudCA9IHJycC0+YXJfYmxvY2tjb3VudDsKIAkJcmtwID0gJmtleTsKIAkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCBycnAsIHJycCArIDEpOwogCX0KIAkvKgogCSAqIERlY3JlbWVudCBhbmQgbG9nIGxlZnQncyBudW1yZWNzLCBidW1wIGFuZCBsb2cgcmlnaHQncyBudW1yZWNzLgogCSAqLwotCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJYmUxNl9hZGQoJmxlZnQtPmJiX251bXJlY3MsIC0xKTsKIAl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGxicCwgWEZTX0JCX05VTVJFQ1MpOwotCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOworCWJlMTZfYWRkKCZyaWdodC0+YmJfbnVtcmVjcywgMSk7CiAJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCByYnAsIFhGU19CQl9OVU1SRUNTKTsKIAkvKgogCSAqIFVzaW5nIGEgdGVtcG9yYXJ5IGN1cnNvciwgdXBkYXRlIHRoZSBwYXJlbnQga2V5IHZhbHVlcyBvZiB0aGUKQEAgLTE2MjcsMTcgKzE2MjYsMTcgQEAKIAkvKgogCSAqIEZpbGwgaW4gdGhlIGJ0cmVlIGhlYWRlciBmb3IgdGhlIG5ldyBibG9jay4KIAkgKi8KLQlJTlRfU0VUKHJpZ2h0LT5iYl9tYWdpYywgQVJDSF9DT05WRVJULCB4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dKTsKLQlyaWdodC0+YmJfbGV2ZWwgPSBsZWZ0LT5iYl9sZXZlbDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KLQlJTlRfU0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIChfX3VpbnQxNl90KShJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLyAyKSk7CisJcmlnaHQtPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoeGZzX21hZ2ljc1tjdXItPmJjX2J0bnVtXSk7CisJcmlnaHQtPmJiX2xldmVsID0gbGVmdC0+YmJfbGV2ZWw7CisJcmlnaHQtPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSAvIDIpOwogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUncyBhbiBvZGQgbnVtYmVyIG9mIGVudHJpZXMgbm93LCB0aGF0CiAJICogZWFjaCBuZXcgYmxvY2sgd2lsbCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzLgogCSAqLwotCWlmICgoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICYgMSkgJiYKLQkgICAgY3VyLT5iY19wdHJzW2xldmVsXSA8PSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSkKLQkJSU5UX01PRChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7Ci0JaSA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxOworCWlmICgoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgJiAxKSAmJgorCSAgICBjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSArIDEpCisJCWJlMTZfYWRkKCZyaWdodC0+YmJfbnVtcmVjcywgMSk7CisJaSA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpIC0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMTsKIAkvKgogCSAqIEZvciBub24tbGVhZiBibG9ja3MsIGNvcHkga2V5cyBhbmQgYWRkcmVzc2VzIG92ZXIgdG8gdGhlIG5ldyBibG9jay4KIAkgKi8KQEAgLTE2NTIsMTUgKzE2NTEsMTUgQEAKIAkJcmtwID0gWEZTX0FMTE9DX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOwogCQlycHAgPSBYRlNfQUxMT0NfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7CiAjaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChscHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCWZvciAoaSA9IDA7IGkgPCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcyk7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUobHBwW2ldKSwgbGV2ZWwpKSkKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCX0KICNlbmRpZgotCQltZW1jcHkocmtwLCBsa3AsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJrcCkpOyAvKiBJTlRfOiBjb3B5ICovCi0JCW1lbWNweShycHAsIGxwcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnBwKSk7IC8qIElOVF86IGNvcHkgKi8KLQkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKLQkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJbWVtY3B5KHJrcCwgbGtwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJrcCkpOworCQltZW1jcHkocnBwLCBscHAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnBwKSk7CisJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKKwkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwogCQkqa2V5cCA9ICpya3A7CiAJfQogCS8qCkBAIC0xNjcyLDM4ICsxNjcxLDM4IEBACiAKIAkJbHJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGxlZnQsIGksIGN1cik7CiAJCXJycCA9IFhGU19BTExPQ19SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKLQkJbWVtY3B5KHJycCwgbHJwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKLQkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKLQkJa2V5cC0+YXJfc3RhcnRibG9jayA9IHJycC0+YXJfc3RhcnRibG9jazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KLQkJa2V5cC0+YXJfYmxvY2tjb3VudCA9IHJycC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJbWVtY3B5KHJycCwgbHJwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJycCkpOworCQl4ZnNfYWxsb2NfbG9nX3JlY3MoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSk7CisJCWtleXAtPmFyX3N0YXJ0YmxvY2sgPSBycnAtPmFyX3N0YXJ0YmxvY2s7CisJCWtleXAtPmFyX2Jsb2NrY291bnQgPSBycnAtPmFyX2Jsb2NrY291bnQ7CiAJfQogCS8qCiAJICogRmluZCB0aGUgbGVmdCBibG9jayBudW1iZXIgYnkgbG9va2luZyBpbiB0aGUgYnVmZmVyLgogCSAqIEFkanVzdCBudW1yZWNzLCBzaWJsaW5nIHBvaW50ZXJzLgogCSAqLwogCWxibm8gPSBYRlNfREFERFJfVE9fQUdCTk8oY3VyLT5iY19tcCwgWEZTX0JVRl9BRERSKGxicCkpOwotCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtKElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpKTsKLQlyaWdodC0+YmJfcmlnaHRzaWIgPSBsZWZ0LT5iYl9yaWdodHNpYjsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KLQlJTlRfU0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIHJibm8pOwotCUlOVF9TRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgbGJubyk7CisJYmUxNl9hZGQoJmxlZnQtPmJiX251bXJlY3MsIC0oYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKSk7CisJcmlnaHQtPmJiX3JpZ2h0c2liID0gbGVmdC0+YmJfcmlnaHRzaWI7CisJbGVmdC0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihyYm5vKTsKKwlyaWdodC0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKGxibm8pOwogCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgcmJwLCBYRlNfQkJfQUxMX0JJVFMpOwogCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyB8IFhGU19CQl9SSUdIVFNJQik7CiAJLyoKIAkgKiBJZiB0aGVyZSdzIGEgYmxvY2sgdG8gdGhlIG5ldyBibG9jaydzIHJpZ2h0LCBtYWtlIHRoYXQgYmxvY2sKIAkgKiBwb2ludCBiYWNrIHRvIHJpZ2h0IGluc3RlYWQgb2YgdG8gbGVmdC4KIAkgKi8KLQlpZiAoSU5UX0dFVChyaWdodC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwlpZiAoYmUzMl90b19jcHUocmlnaHQtPmJiX3JpZ2h0c2liKSAhPSBOVUxMQUdCTE9DSykgewogCQl4ZnNfYWxsb2NfYmxvY2tfdAkqcnJibG9jazsJLyogcnIgYnRyZWUgYmxvY2sgKi8KIAkJeGZzX2J1Zl90CQkqcnJicDsJCS8qIGJ1ZmZlciBmb3IgcnJibG9jayAqLwogCiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCi0JCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgSU5UX0dFVChyaWdodC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsCisJCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgYmUzMl90b19jcHUocmlnaHQtPmJiX3JpZ2h0c2liKSwgMCwKIAkJCQkmcnJicCwgWEZTX0FMTE9DX0JUUkVFX1JFRikpKQogCQkJcmV0dXJuIGVycm9yOwogCQlycmJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhycmJwKTsKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBycmJsb2NrLCBsZXZlbCwgcnJicCkpKQogCQkJcmV0dXJuIGVycm9yOwotCQlJTlRfU0VUKHJyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgcmJubyk7CisJCXJyYmxvY2stPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmUzMihyYm5vKTsKIAkJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBycmJwLCBYRlNfQkJfTEVGVFNJQik7CiAJfQogCS8qCkBAIC0xNzExLDkgKzE3MTAsOSBAQAogCSAqIElmIGl0J3MganVzdCBwb2ludGluZyBwYXN0IHRoZSBsYXN0IGVudHJ5IGluIGxlZnQsIHRoZW4gd2UnbGwKIAkgKiBpbnNlcnQgdGhlcmUsIHNvIGRvbid0IGNoYW5nZSBhbnl0aGluZyBpbiB0aGF0IGNhc2UuCiAJICovCi0JaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPiBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKSB7CisJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPiBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSArIDEpIHsKIAkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCByYnApOwotCQljdXItPmJjX3B0cnNbbGV2ZWxdIC09IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJY3VyLT5iY19wdHJzW2xldmVsXSAtPSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKTsKIAl9CiAJLyoKIAkgKiBJZiB0aGVyZSBhcmUgbW9yZSBsZXZlbHMsIHdlJ2xsIG5lZWQgYW5vdGhlciBjdXJzb3Igd2hpY2ggcmVmZXJzIHRvCkBAIC0xODExLDcgKzE4MTAsNyBAQAogCS8qCiAJICogSWYgd2UganVzdCB3ZW50IG9mZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSB0cmVlLCByZXR1cm4gZmFpbHVyZS4KIAkgKi8KLQlpZiAoSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykgeworCWlmIChiZTMyX3RvX2NwdShibG9jay0+YmJfbGVmdHNpYikgPT0gTlVMTEFHQkxPQ0spIHsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xODQwLDcgKzE4MzksNyBAQAogCQl4ZnNfYWdibG9ja190CWFnYm5vOwkvKiBibG9jayBudW1iZXIgb2YgYnRyZWUgYmxvY2sgKi8KIAkJeGZzX2J1Zl90CSpicDsJLyogYnVmZmVyIHBvaW50ZXIgZm9yIGJsb2NrICovCiAKLQkJYWdibm8gPSBJTlRfR0VUKCpYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworCQlhZ2JubyA9IGJlMzJfdG9fY3B1KCpYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpKTsKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKIAkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBhZ2JubywgMCwgJmJwLAogCQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKQEAgLTE4NTAsNyArMTg0OSw3IEBACiAJCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldiwgYnApKSkKIAkJCXJldHVybiBlcnJvcjsKLQkJY3VyLT5iY19wdHJzW2xldl0gPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQljdXItPmJjX3B0cnNbbGV2XSA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKIAl9CiAJKnN0YXQgPSAxOwogCXJldHVybiAwOwpAQCAtMTkxNyw3ICsxOTE2LDcgQEAKIAkvKgogCSAqIE9mZiB0aGUgcmlnaHQgZW5kIG9yIGxlZnQgZW5kLCByZXR1cm4gZmFpbHVyZS4KIAkgKi8KLQlpZiAocHRyID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSB8fCBwdHIgPD0gMCkgeworCWlmIChwdHIgPiBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgfHwgcHRyIDw9IDApIHsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xOTI4LDggKzE5MjcsOCBAQAogCQl4ZnNfYWxsb2NfcmVjX3QJCSpyZWM7CS8qIHJlY29yZCBkYXRhICovCiAKIAkJcmVjID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCSpibm8gPSBJTlRfR0VUKHJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKTsKLQkJKmxlbiA9IElOVF9HRVQocmVjLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpOworCQkqYm5vID0gYmUzMl90b19jcHUocmVjLT5hcl9zdGFydGJsb2NrKTsKKwkJKmxlbiA9IGJlMzJfdG9fY3B1KHJlYy0+YXJfYmxvY2tjb3VudCk7CiAJfQogCSpzdGF0ID0gMTsKIAlyZXR1cm4gMDsKQEAgLTE5NjgsMTQgKzE5NjcsMTQgQEAKIAkgKiBJbmNyZW1lbnQgdGhlIHB0ciBhdCB0aGlzIGxldmVsLiAgSWYgd2UncmUgc3RpbGwgaW4gdGhlIGJsb2NrCiAJICogdGhlbiB3ZSdyZSBkb25lLgogCSAqLwotCWlmICgrK2N1ci0+YmNfcHRyc1tsZXZlbF0gPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCWlmICgrK2N1ci0+YmNfcHRyc1tsZXZlbF0gPD0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKSB7CiAJCSpzdGF0ID0gMTsKIAkJcmV0dXJuIDA7CiAJfQogCS8qCiAJICogSWYgd2UganVzdCB3ZW50IG9mZiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdHJlZSwgcmV0dXJuIGZhaWx1cmUuCiAJICovCi0JaWYgKElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLKSB7CisJaWYgKGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgPT0gTlVMTEFHQkxPQ0spIHsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xOTkwLDcgKzE5ODksNyBAQAogCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAjZW5kaWYKLQkJaWYgKCsrY3VyLT5iY19wdHJzW2xldl0gPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKKwkJaWYgKCsrY3VyLT5iY19wdHJzW2xldl0gPD0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKQogCQkJYnJlYWs7CiAJCS8qCiAJCSAqIFJlYWQtYWhlYWQgdGhlIHJpZ2h0IGJsb2NrLCB3ZSdyZSBnb2luZyB0byByZWFkIGl0CkBAIC0yMDEwLDcgKzIwMDksNyBAQAogCSAgICAgbGV2ID4gbGV2ZWw7ICkgewogCQl4ZnNfYWdibG9ja190CWFnYm5vOwkvKiBibG9jayBudW1iZXIgb2YgYnRyZWUgYmxvY2sgKi8KIAotCQlhZ2JubyA9IElOVF9HRVQoKlhGU19BTExPQ19QVFJfQUREUihibG9jaywgY3VyLT5iY19wdHJzW2xldl0sIGN1ciksIEFSQ0hfQ09OVkVSVCk7CisJCWFnYm5vID0gYmUzMl90b19jcHUoKlhGU19BTExPQ19QVFJfQUREUihibG9jaywgY3VyLT5iY19wdHJzW2xldl0sIGN1cikpOwogCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAogCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGFnYm5vLCAwLCAmYnAsCiAJCQkJWEZTX0FMTE9DX0JUUkVFX1JFRikpKQpAQCAtMjA0NSw4ICsyMDQ0LDggQEAKIAogCWxldmVsID0gMDsKIAluYm5vID0gTlVMTEFHQkxPQ0s7Ci0JSU5UX1NFVChucmVjLmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCwgY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrKTsKLQlJTlRfU0VUKG5yZWMuYXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJULCBjdXItPmJjX3JlYy5hLmFyX2Jsb2NrY291bnQpOworCW5yZWMuYXJfc3RhcnRibG9jayA9IGNwdV90b19iZTMyKGN1ci0+YmNfcmVjLmEuYXJfc3RhcnRibG9jayk7CisJbnJlYy5hcl9ibG9ja2NvdW50ID0gY3B1X3RvX2JlMzIoY3VyLT5iY19yZWMuYS5hcl9ibG9ja2NvdW50KTsKIAluY3VyID0gKHhmc19idHJlZV9jdXJfdCAqKTA7CiAJcGN1ciA9IGN1cjsKIAkvKgpAQCAtMjE2Nyw4ICsyMTY2LDggQEAKIAkJLyoKIAkJICogRmlsbCBpbiB0aGUgbmV3IGNvbnRlbnRzIGFuZCBsb2cgdGhlbS4KIAkJICovCi0JCUlOVF9TRVQocnAtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCwgYm5vKTsKLQkJSU5UX1NFVChycC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJULCBsZW4pOworCQlycC0+YXJfc3RhcnRibG9jayA9IGNwdV90b19iZTMyKGJubyk7CisJCXJwLT5hcl9ibG9ja2NvdW50ID0gY3B1X3RvX2JlMzIobGVuKTsKIAkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgY3VyLT5iY19idWZzWzBdLCBwdHIsIHB0cik7CiAJfQogCS8qCkBAIC0yMTc3LDE1ICsyMTc2LDE1IEBACiAJICogZXh0ZW50IGluIHRoZSBhLmcuLCB3aGljaCB3ZSBjYWNoZSBpbiB0aGUgYS5nLiBmcmVlbGlzdCBoZWFkZXIuCiAJICovCiAJaWYgKGN1ci0+YmNfYnRudW0gPT0gWEZTX0JUTlVNX0NOVCAmJgotCSAgICBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSyAmJgotCSAgICBwdHIgPT0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCSAgICBiZTMyX3RvX2NwdShibG9jay0+YmJfcmlnaHRzaWIpID09IE5VTExBR0JMT0NLICYmCisJICAgIHB0ciA9PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpIHsKIAkJeGZzX2FnZl90CSphZ2Y7CS8qIGEuZy4gZnJlZXNwYWNlIGhlYWRlciAqLwogCQl4ZnNfYWdudW1iZXJfdAlzZXFubzsKIAogCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKLQkJc2Vxbm8gPSBJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpOworCQlzZXFubyA9IGJlMzJfdG9fY3B1KGFnZi0+YWdmX3NlcW5vKTsKIAkJY3VyLT5iY19tcC0+bV9wZXJhZ1tzZXFub10ucGFnZl9sb25nZXN0ID0gbGVuOwotCQlJTlRfU0VUKGFnZi0+YWdmX2xvbmdlc3QsIEFSQ0hfQ09OVkVSVCwgbGVuKTsKKwkJYWdmLT5hZ2ZfbG9uZ2VzdCA9IGNwdV90b19iZTMyKGxlbik7CiAJCXhmc19hbGxvY19sb2dfYWdmKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCiAJCQlYRlNfQUdGX0xPTkdFU1QpOwogCX0KQEAgLTIxOTUsOCArMjE5NCw4IEBACiAJaWYgKHB0ciA9PSAxKSB7CiAJCXhmc19hbGxvY19rZXlfdAlrZXk7CS8qIGtleSBjb250YWluaW5nIFtibm8sIGxlbl0gKi8KIAotCQlJTlRfU0VUKGtleS5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQsIGJubyk7Ci0JCUlOVF9TRVQoa2V5LmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCwgbGVuKTsKKwkJa2V5LmFyX3N0YXJ0YmxvY2sgPSBjcHVfdG9fYmUzMihibm8pOworCQlrZXkuYXJfYmxvY2tjb3VudCA9IGNwdV90b19iZTMyKGxlbik7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdXBka2V5KGN1ciwgJmtleSwgMSkpKQogCQkJcmV0dXJuIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuaAppbmRleCBlZDUxNjFhLi5iY2U4MWM3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmgKKysrIGIvZnMveGZzL3hmc19hbGxvY19idHJlZS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19BTExPQ19CVFJFRV9IX18KICNkZWZpbmUJX19YRlNfQUxMT0NfQlRSRUVfSF9fCkBAIC01Miw0OCArMzgsMjkgQEAKIC8qCiAgKiBEYXRhIHJlY29yZC9rZXkgc3RydWN0dXJlCiAgKi8KLXR5cGVkZWYgc3RydWN0IHhmc19hbGxvY19yZWMKLXsKLQl4ZnNfYWdibG9ja190CWFyX3N0YXJ0YmxvY2s7CS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciAqLwotCXhmc19leHRsZW5fdAlhcl9ibG9ja2NvdW50OwkvKiBjb3VudCBvZiBmcmVlIGJsb2NrcyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FsbG9jX3JlYyB7CisJX19iZTMyCQlhcl9zdGFydGJsb2NrOwkvKiBzdGFydGluZyBibG9jayBudW1iZXIgKi8KKwlfX2JlMzIJCWFyX2Jsb2NrY291bnQ7CS8qIGNvdW50IG9mIGZyZWUgYmxvY2tzICovCiB9IHhmc19hbGxvY19yZWNfdCwgeGZzX2FsbG9jX2tleV90OwogCi10eXBlZGVmIHhmc19hZ2Jsb2NrX3QgeGZzX2FsbG9jX3B0cl90OwkvKiBidHJlZSBwb2ludGVyIHR5cGUgKi8KLQkJCQkJLyogYnRyZWUgYmxvY2sgaGVhZGVyIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19hbGxvY19yZWNfaW5jb3JlIHsKKwl4ZnNfYWdibG9ja190CWFyX3N0YXJ0YmxvY2s7CS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAlhcl9ibG9ja2NvdW50OwkvKiBjb3VudCBvZiBmcmVlIGJsb2NrcyAqLworfSB4ZnNfYWxsb2NfcmVjX2luY29yZV90OworCisvKiBidHJlZSBwb2ludGVyIHR5cGUgKi8KK3R5cGVkZWYgX19iZTMyIHhmc19hbGxvY19wdHJfdDsKKy8qIGJ0cmVlIGJsb2NrIGhlYWRlciB0eXBlICovCiB0eXBlZGVmCXN0cnVjdCB4ZnNfYnRyZWVfc2Jsb2NrIHhmc19hbGxvY19ibG9ja190OwogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fQUxMT0NfQkxPQ0spCi14ZnNfYWxsb2NfYmxvY2tfdCAqeGZzX2J1Zl90b19hbGxvY19ibG9jayhzdHJ1Y3QgeGZzX2J1ZiAqYnApOwotI2RlZmluZQlYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKQl4ZnNfYnVmX3RvX2FsbG9jX2Jsb2NrKGJwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCkgKCh4ZnNfYWxsb2NfYmxvY2tfdCAqKShYRlNfQlVGX1BUUihicCkpKQotI2VuZGlmCisjZGVmaW5lCVhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApCSgoeGZzX2FsbG9jX2Jsb2NrX3QgKilYRlNfQlVGX1BUUihicCkpCiAKIC8qCiAgKiBSZWFsIGJsb2NrIHN0cnVjdHVyZXMgaGF2ZSBhIHNpemUgZXF1YWwgdG8gdGhlIGRpc2sgYmxvY2sgc2l6ZS4KICAqLwotCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BTExPQ19CTE9DS19TSVpFKQotaW50IHhmc19hbGxvY19ibG9ja19zaXplKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOwotI2RlZmluZQlYRlNfQUxMT0NfQkxPQ0tfU0laRShsZXYsY3VyKQl4ZnNfYWxsb2NfYmxvY2tfc2l6ZShsZXYsY3VyKQotI2Vsc2UKICNkZWZpbmUJWEZTX0FMTE9DX0JMT0NLX1NJWkUobGV2LGN1cikJKDEgPDwgKGN1ciktPmJjX2Jsb2NrbG9nKQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MpCi1pbnQgeGZzX2FsbG9jX2Jsb2NrX21heHJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lCVhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldixjdXIpCXhmc19hbGxvY19ibG9ja19tYXhyZWNzKGxldixjdXIpCi0jZWxzZQotI2RlZmluZQlYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXYsY3VyKQlcCi0JKChjdXIpLT5iY19tcC0+bV9hbGxvY19teHJbbGV2ICE9IDBdKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BTExPQ19CTE9DS19NSU5SRUNTKQotaW50IHhmc19hbGxvY19ibG9ja19taW5yZWNzKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOwotI2RlZmluZQlYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyhsZXYsY3VyKQl4ZnNfYWxsb2NfYmxvY2tfbWlucmVjcyhsZXYsY3VyKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2LGN1cikJXAotCSgoY3VyKS0+YmNfbXAtPm1fYWxsb2NfbW5yW2xldiAhPSAwXSkKLSNlbmRpZgorI2RlZmluZQlYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXYsY3VyKSAoKGN1ciktPmJjX21wLT5tX2FsbG9jX214cltsZXYgIT0gMF0pCisjZGVmaW5lCVhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldixjdXIpICgoY3VyKS0+YmNfbXAtPm1fYWxsb2NfbW5yW2xldiAhPSAwXSkKIAogLyoKICAqIE1pbmltdW0gYW5kIG1heGltdW0gYmxvY2tzaXplIGFuZCBzZWN0b3JzaXplLgpAQCAtMTEzLDE0NSArODAsODAgQEAKICAqIEJsb2NrIG51bWJlcnMgaW4gdGhlIEFHOgogICogU0IgaXMgc2VjdG9yIDAsIEFHRiBpcyBzZWN0b3IgMSwgQUdJIGlzIHNlY3RvciAyLCBBR0ZMIGlzIHNlY3RvciAzLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTk9fQkxPQ0spCi14ZnNfYWdibG9ja190IHhmc19ibm9fYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXApOwotI2RlZmluZQlYRlNfQk5PX0JMT0NLKG1wKQl4ZnNfYm5vX2Jsb2NrKG1wKQotI2Vsc2UKICNkZWZpbmUJWEZTX0JOT19CTE9DSyhtcCkJKCh4ZnNfYWdibG9ja190KShYRlNfQUdGTF9CTE9DSyhtcCkgKyAxKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQ05UX0JMT0NLKQoteGZzX2FnYmxvY2tfdCB4ZnNfY250X2Jsb2NrKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKLSNkZWZpbmUJWEZTX0NOVF9CTE9DSyhtcCkJeGZzX2NudF9ibG9jayhtcCkKLSNlbHNlCiAjZGVmaW5lCVhGU19DTlRfQkxPQ0sobXApCSgoeGZzX2FnYmxvY2tfdCkoWEZTX0JOT19CTE9DSyhtcCkgKyAxKSkKLSNlbmRpZgogCiAvKgogICogUmVjb3JkLCBrZXksIGFuZCBwb2ludGVyIGFkZHJlc3MgbWFjcm9zIGZvciBidHJlZSBibG9ja3MuCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FMTE9DX1JFQ19BRERSKQoteGZzX2FsbG9jX3JlY190ICp4ZnNfYWxsb2NfcmVjX2FkZHIoeGZzX2FsbG9jX2Jsb2NrX3QgKmJiLCBpbnQgaSwKLQkJCQkgICAgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lCVhGU19BTExPQ19SRUNfQUREUihiYixpLGN1cikJeGZzX2FsbG9jX3JlY19hZGRyKGJiLGksY3VyKQotI2Vsc2UKICNkZWZpbmUJWEZTX0FMTE9DX1JFQ19BRERSKGJiLGksY3VyKQlcCi0JWEZTX0JUUkVFX1JFQ19BRERSKFhGU19BTExPQ19CTE9DS19TSVpFKDAsY3VyKSwgeGZzX2FsbG9jLCBiYiwgaSwgXAotCQlYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUygwLCBjdXIpKQotI2VuZGlmCisJWEZTX0JUUkVFX1JFQ19BRERSKFhGU19BTExPQ19CTE9DS19TSVpFKDAsY3VyKSwgeGZzX2FsbG9jLCBcCisJCQkJYmIsIGksIFhGU19BTExPQ19CTE9DS19NQVhSRUNTKDAsIGN1cikpCiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FMTE9DX0tFWV9BRERSKQoteGZzX2FsbG9jX2tleV90ICp4ZnNfYWxsb2Nfa2V5X2FkZHIoeGZzX2FsbG9jX2Jsb2NrX3QgKmJiLCBpbnQgaSwKLQkJCQkgICAgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lCVhGU19BTExPQ19LRVlfQUREUihiYixpLGN1cikJeGZzX2FsbG9jX2tleV9hZGRyKGJiLGksY3VyKQotI2Vsc2UKICNkZWZpbmUJWEZTX0FMTE9DX0tFWV9BRERSKGJiLGksY3VyKQlcCi0JWEZTX0JUUkVFX0tFWV9BRERSKFhGU19BTExPQ19CTE9DS19TSVpFKDEsY3VyKSwgeGZzX2FsbG9jLCBiYiwgaSwgXAotCQlYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUygxLCBjdXIpKQotI2VuZGlmCisJWEZTX0JUUkVFX0tFWV9BRERSKFhGU19BTExPQ19CTE9DS19TSVpFKDEsY3VyKSwgeGZzX2FsbG9jLCBcCisJCQkJYmIsIGksIFhGU19BTExPQ19CTE9DS19NQVhSRUNTKDEsIGN1cikpCiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FMTE9DX1BUUl9BRERSKQoteGZzX2FsbG9jX3B0cl90ICp4ZnNfYWxsb2NfcHRyX2FkZHIoeGZzX2FsbG9jX2Jsb2NrX3QgKmJiLCBpbnQgaSwKLQkJCQkgICAgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lCVhGU19BTExPQ19QVFJfQUREUihiYixpLGN1cikJeGZzX2FsbG9jX3B0cl9hZGRyKGJiLGksY3VyKQotI2Vsc2UKICNkZWZpbmUJWEZTX0FMTE9DX1BUUl9BRERSKGJiLGksY3VyKQlcCi0JWEZTX0JUUkVFX1BUUl9BRERSKFhGU19BTExPQ19CTE9DS19TSVpFKDEsY3VyKSwgeGZzX2FsbG9jLCBiYiwgaSwgXAotCQlYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUygxLCBjdXIpKQotI2VuZGlmCi0KLS8qCi0gKiBQcm90b3R5cGVzIGZvciBleHRlcm5hbGx5IHZpc2libGUgcm91dGluZXMuCi0gKi8KKwlYRlNfQlRSRUVfUFRSX0FERFIoWEZTX0FMTE9DX0JMT0NLX1NJWkUoMSxjdXIpLCB4ZnNfYWxsb2MsIFwKKwkJCQliYiwgaSwgWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MoMSwgY3VyKSkKIAogLyoKICAqIERlY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCiAgKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCiAgKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19hbGxvY19kZWNyZW1lbnQoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIGJ0cmVlLCAwIGlzIGxlYWYgKi8KLQlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworZXh0ZXJuIGludCB4ZnNfYWxsb2NfZGVjcmVtZW50KHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIGludCBsZXZlbCwgaW50ICpzdGF0KTsKIAogLyoKICAqIERlbGV0ZSB0aGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyLgogICogVGhlIGN1cnNvciByZWZlcnMgdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSByZWNvcmQgd2FzIChjb3VsZCBiZSBpbnNlcnRlZCkKICAqIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zLgogICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfYWxsb2NfZGVsZXRlKAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCitleHRlcm4gaW50IHhmc19hbGxvY19kZWxldGUoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgaW50ICpzdGF0KTsKIAogLyoKICAqIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBwb2ludGVkLXRvIHJlY29yZC4KICAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2dldF9yZWMoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2FnYmxvY2tfdAkJKmJubywJLyogb3V0cHV0OiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KLQl4ZnNfZXh0bGVuX3QJCSpsZW4sCS8qIG91dHB1dDogbGVuZ3RoIG9mIGV4dGVudCAqLwotCWludAkJCSpzdGF0KTsJLyogb3V0cHV0OiBzdWNjZXNzL2ZhaWx1cmUgKi8KK2V4dGVybiBpbnQgeGZzX2FsbG9jX2dldF9yZWMoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwJeGZzX2FnYmxvY2tfdCAqYm5vLAorCQkJCXhmc19leHRsZW5fdCAqbGVuLCBpbnQgKnN0YXQpOwogCiAvKgogICogSW5jcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KICAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KICAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2luY3JlbWVudCgKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUsIDAgaXMgbGVhZiAqLwotCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCitleHRlcm4gaW50IHhmc19hbGxvY19pbmNyZW1lbnQoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgaW50IGxldmVsLCBpbnQgKnN0YXQpOwogCiAvKgogICogSW5zZXJ0IHRoZSBjdXJyZW50IHJlY29yZCBhdCB0aGUgcG9pbnQgcmVmZXJlbmNlZCBieSBjdXIuCiAgKiBUaGUgY3Vyc29yIG1heSBiZSBpbmNvbnNpc3RlbnQgb24gcmV0dXJuIGlmIHNwbGl0cyBoYXZlIGJlZW4gZG9uZS4KICAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2luc2VydCgKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworZXh0ZXJuIGludCB4ZnNfYWxsb2NfaW5zZXJ0KHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIGludCAqc3RhdCk7CiAKIC8qCiAgKiBMb29rdXAgdGhlIHJlY29yZCBlcXVhbCB0byBbYm5vLCBsZW5dIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCiAgKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19hbGxvY19sb29rdXBfZXEoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2FnYmxvY2tfdAkJYm5vLAkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KLQl4ZnNfZXh0bGVuX3QJCWxlbiwJLyogbGVuZ3RoIG9mIGV4dGVudCAqLwotCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCitleHRlcm4gaW50IHhmc19hbGxvY19sb29rdXBfZXEoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgeGZzX2FnYmxvY2tfdCBibm8sCisJCQkJeGZzX2V4dGxlbl90IGxlbiwgaW50ICpzdGF0KTsKIAogLyoKICAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBbYm5vLCBsZW5dCiAgKiBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgogICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfYWxsb2NfbG9va3VwX2dlKAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19hZ2Jsb2NrX3QJCWJubywJLyogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCi0JeGZzX2V4dGxlbl90CQlsZW4sCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KLQlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworZXh0ZXJuIGludCB4ZnNfYWxsb2NfbG9va3VwX2dlKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19hZ2Jsb2NrX3QgYm5vLAorCQkJCXhmc19leHRsZW5fdCBsZW4sIGludCAqc3RhdCk7CiAKIC8qCiAgKiBMb29rdXAgdGhlIGZpcnN0IHJlY29yZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gW2JubywgbGVuXQogICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KICAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2xvb2t1cF9sZSgKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYWdibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLwotCXhmc19leHRsZW5fdAkJbGVuLAkvKiBsZW5ndGggb2YgZXh0ZW50ICovCi0JaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK2V4dGVybiBpbnQgeGZzX2FsbG9jX2xvb2t1cF9sZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCB4ZnNfYWdibG9ja190IGJubywKKwkJCQl4ZnNfZXh0bGVuX3QgbGVuLCBpbnQgKnN0YXQpOwogCiAvKgogICogVXBkYXRlIHRoZSByZWNvcmQgcmVmZXJyZWQgdG8gYnkgY3VyLCB0byB0aGUgdmFsdWUgZ2l2ZW4gYnkgW2JubywgbGVuXS4KICAqIFRoaXMgZWl0aGVyIHdvcmtzIChyZXR1cm4gMCkgb3IgZ2V0cyBhbiBFRlNDT1JSVVBURUQgZXJyb3IuCiAgKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19hbGxvY191cGRhdGUoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2FnYmxvY2tfdAkJYm5vLAkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KLQl4ZnNfZXh0bGVuX3QJCWxlbik7CS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KK2V4dGVybiBpbnQgeGZzX2FsbG9jX3VwZGF0ZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCB4ZnNfYWdibG9ja190IGJubywKKwkJCQl4ZnNfZXh0bGVuX3QgbGVuKTsKIAogI2VuZGlmCS8qIF9fWEZTX0FMTE9DX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hcmNoLmggYi9mcy94ZnMveGZzX2FyY2guaAppbmRleCA1YWIwZGQ4Li42OGU1MDUxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FyY2guaAorKysgYi9mcy94ZnMveGZzX2FyY2guaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0FSQ0hfSF9fCiAjZGVmaW5lIF9fWEZTX0FSQ0hfSF9fCkBAIC0xNjgsNiArMTU0LDIxIEBACiAgICAgfSBcCiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZTE2X2FkZChfX2JlMTYgKmEsIF9fczE2IGIpCit7CisJKmEgPSBjcHVfdG9fYmUxNihiZTE2X3RvX2NwdSgqYSkgKyBiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlMzJfYWRkKF9fYmUzMiAqYSwgX19zMzIgYikKK3sKKwkqYSA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KCphKSArIGIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmU2NF9hZGQoX19iZTY0ICphLCBfX3M2NCBiKQoreworCSphID0gY3B1X3RvX2JlNjQoYmU2NF90b19jcHUoKmEpICsgYik7Cit9CisKIC8qCiAgKiBJbiBkaXJlY3RvcmllcyBpbm9kZSBudW1iZXJzIGFyZSBzdG9yZWQgYXMgdW5hbGlnbmVkIGFycmF5cyBvZiB1bnNpZ25lZAogICogOGJpdCBpbnRlZ2VycyBvbiBkaXNrLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyLmMgYi9mcy94ZnMveGZzX2F0dHIuYwppbmRleCBhNDFhZDNhLi41NDg0ZWViIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHIuYworKysgYi9mcy94ZnMveGZzX2F0dHIuYwpAQCAtMSw0MSArMSwyNiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCkBAIC00MywyNyArMjgsMjYgQEAKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19hbGxvYy5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCi0jaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKICNpbmNsdWRlICJ4ZnNfYXR0cl9sZWFmLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgotI2luY2x1ZGUgInhmc19ydy5oIgogI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgogI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKIAogLyoKICAqIHhmc19hdHRyLmMKQEAgLTEyMiw3ICsxMDYsNyBAQAogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBpbnQKLXhmc19hdHRyX2ZldGNoKHhmc19pbm9kZV90ICppcCwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCit4ZnNfYXR0cl9mZXRjaCh4ZnNfaW5vZGVfdCAqaXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAogCSAgICAgICBjaGFyICp2YWx1ZSwgaW50ICp2YWx1ZWxlbnAsIGludCBmbGFncywgc3RydWN0IGNyZWQgKmNyZWQpCiB7CiAJeGZzX2RhX2FyZ3NfdCAgIGFyZ3M7CkBAIC0xNzcsNyArMTYxLDcgQEAKIH0KIAogaW50Ci14ZnNfYXR0cl9nZXQoYmh2X2Rlc2NfdCAqYmRwLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwgaW50ICp2YWx1ZWxlbnAsCit4ZnNfYXR0cl9nZXQoYmh2X2Rlc2NfdCAqYmRwLCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwgaW50ICp2YWx1ZWxlbnAsCiAJICAgICBpbnQgZmxhZ3MsIHN0cnVjdCBjcmVkICpjcmVkKQogewogCXhmc19pbm9kZV90CSppcCA9IFhGU19CSFZUT0koYmRwKTsKQEAgLTIwMCw0MCArMTg0LDE4IEBACiAJcmV0dXJuKGVycm9yKTsKIH0KIAotLypBUkdTVVNFRCovCi1pbnQJCQkJCQkJCS8qIGVycm9yICovCi14ZnNfYXR0cl9zZXQoYmh2X2Rlc2NfdCAqYmRwLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwgaW50IHZhbHVlbGVuLCBpbnQgZmxhZ3MsCi0JCSAgICAgc3RydWN0IGNyZWQgKmNyZWQpCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9zZXRfaW50KHhmc19pbm9kZV90ICpkcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCSBjaGFyICp2YWx1ZSwgaW50IHZhbHVlbGVuLCBpbnQgZmxhZ3MpCiB7CiAJeGZzX2RhX2FyZ3NfdAlhcmdzOwotCXhmc19pbm9kZV90CSpkcDsKIAl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CiAJeGZzX2JtYXBfZnJlZV90IGZsaXN0OwogCWludAkJZXJyb3IsIGVycjIsIGNvbW1pdHRlZDsKIAlpbnQJCWxvY2FsLCBzaXplOwogCXVpbnQJCW5ibGtzOwotCXhmc19tb3VudF90CSptcDsKKwl4ZnNfbW91bnRfdAkqbXAgPSBkcC0+aV9tb3VudDsKIAlpbnQgICAgICAgICAgICAgcnN2ZCA9IChmbGFncyAmIEFUVFJfUk9PVCkgIT0gMDsKLQlpbnQgICAgICAgICAgICAgbmFtZWxlbjsKLQotCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0JaWYgKG5hbWVsZW4gPj0gTUFYTkFNRUxFTikKLQkJcmV0dXJuIEVGQVVMVDsJCS8qIG1hdGNoIElSSVggYmVoYXZpb3VyICovCi0KLQlYRlNfU1RBVFNfSU5DKHhzX2F0dHJfc2V0KTsKLQotCWRwID0gWEZTX0JIVlRPSShiZHApOwotCW1wID0gZHAtPmlfbW91bnQ7Ci0JaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQotCQlyZXR1cm4gKEVJTyk7Ci0KLQl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOwotCWlmICghKGZsYWdzICYgQVRUUl9TRUNVUkUpICYmCi0JICAgICAoZXJyb3IgPSB4ZnNfaWFjY2VzcyhkcCwgU19JV1VTUiwgY3JlZCkpKSB7Ci0JCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQkJcmV0dXJuKFhGU19FUlJPUihlcnJvcikpOwotCX0KLQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAKIAkvKgogCSAqIEF0dGFjaCB0aGUgZHF1b3RzIHRvIHRoZSBpbm9kZS4KQEAgLTI0MiwxMiArMjA0LDE4IEBACiAJCXJldHVybiAoZXJyb3IpOwogCiAJLyoKKwkgKiBEZXRlcm1pbmUgc3BhY2UgbmV3IGF0dHJpYnV0ZSB3aWxsIHVzZSwgYW5kIGlmIGl0IHdvdWxkIGJlCisJICogImxvY2FsIiBvciAicmVtb3RlIiAobm90ZTogbG9jYWwgIT0gaW5saW5lKS4KKwkgKi8KKwlzaXplID0geGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKG5hbWVsZW4sIHZhbHVlbGVuLAorCQkJCQltcC0+bV9zYi5zYl9ibG9ja3NpemUsICZsb2NhbCk7CisKKwkvKgogCSAqIElmIHRoZSBpbm9kZSBkb2Vzbid0IGhhdmUgYW4gYXR0cmlidXRlIGZvcmssIGFkZCBvbmUuCiAJICogKGlub2RlIG11c3Qgbm90IGJlIGxvY2tlZCB3aGVuIHdlIGNhbGwgdGhpcyByb3V0aW5lKQogCSAqLwogCWlmIChYRlNfSUZPUktfUShkcCkgPT0gMCkgewotCQllcnJvciA9IHhmc19ibWFwX2FkZF9hdHRyZm9yayhkcCwgcnN2ZCk7Ci0JCWlmIChlcnJvcikKKwkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FkZF9hdHRyZm9yayhkcCwgc2l6ZSwgcnN2ZCkpKQogCQkJcmV0dXJuKGVycm9yKTsKIAl9CiAKQEAgLTI2NSwxMyArMjMzLDkgQEAKIAlhcmdzLmZpcnN0YmxvY2sgPSAmZmlyc3RibG9jazsKIAlhcmdzLmZsaXN0ID0gJmZsaXN0OwogCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0FUVFJfRk9SSzsKKwlhcmdzLmFkZG5hbWUgPSAxOwogCWFyZ3Mub2tub2VudCA9IDE7CiAKLQkvKiBEZXRlcm1pbmUgc3BhY2UgbmV3IGF0dHJpYnV0ZSB3aWxsIHVzZSwgYW5kIGlmIGl0IHdpbGwgYmUgaW5saW5lCi0JICogb3Igb3V0IG9mIGxpbmUuCi0JICovCi0Jc2l6ZSA9IHhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZSgmYXJncywgbXAtPm1fc2Iuc2JfYmxvY2tzaXplLCAmbG9jYWwpOwotCiAJbmJsa3MgPSBYRlNfREFFTlRFUl9TUEFDRV9SRVMobXAsIFhGU19BVFRSX0ZPUkspOwogCWlmIChsb2NhbCkgewogCQlpZiAoc2l6ZSA+IChtcC0+bV9zYi5zYl9ibG9ja3NpemUgPj4gMSkpIHsKQEAgLTM0Myw3ICszMDcsNyBAQAogCQkgKiBCdWlsZCBpbml0aWFsIGF0dHJpYnV0ZSBsaXN0IChpZiByZXF1aXJlZCkuCiAJCSAqLwogCQlpZiAoZHAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpCi0JCQkodm9pZCl4ZnNfYXR0cl9zaG9ydGZvcm1fY3JlYXRlKCZhcmdzKTsKKwkJCXhmc19hdHRyX3Nob3J0Zm9ybV9jcmVhdGUoJmFyZ3MpOwogCiAJCS8qCiAJCSAqIFRyeSB0byBhZGQgdGhlIGF0dHIgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0IGluCkBAIC00NTYsMzIgKzQyMCwyMSBAQAogCXJldHVybihlcnJvcik7CiB9CiAKLS8qCi0gKiBHZW5lcmljIGhhbmRsZXIgcm91dGluZSB0byByZW1vdmUgYSBuYW1lIGZyb20gYW4gYXR0cmlidXRlIGxpc3QuCi0gKiBUcmFuc2l0aW9ucyBhdHRyaWJ1dGUgbGlzdCBmcm9tIEJ0cmVlIHRvIHNob3J0Zm9ybSBhcyBuZWNlc3NhcnkuCi0gKi8KLS8qQVJHU1VTRUQqLwotaW50CQkJCQkJCQkvKiBlcnJvciAqLwoteGZzX2F0dHJfcmVtb3ZlKGJodl9kZXNjX3QgKmJkcCwgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBzdHJ1Y3QgY3JlZCAqY3JlZCkKK2ludAoreGZzX2F0dHJfc2V0KGJodl9kZXNjX3QgKmJkcCwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmFsdWUsIGludCB2YWx1ZWxlbiwgaW50IGZsYWdzLAorCSAgICAgc3RydWN0IGNyZWQgKmNyZWQpCiB7Ci0JeGZzX2RhX2FyZ3NfdCAgICAgICBhcmdzOwotCXhmc19pbm9kZV90ICAgICAgICAgKmRwOwotCXhmc19mc2Jsb2NrX3QgICAgICAgZmlyc3RibG9jazsKLQl4ZnNfYm1hcF9mcmVlX3QgICAgIGZsaXN0OwotCWludCAgICAgICAgICAgICAgICAgZXJyb3I7Ci0JeGZzX21vdW50X3QgICAgICAgICAqbXA7Ci0JaW50ICAgICAgICAgICAgICAgICBuYW1lbGVuOworCXhmc19pbm9kZV90CSpkcDsKKwlpbnQgICAgICAgICAgICAgbmFtZWxlbiwgZXJyb3I7CiAKLQlBU1NFUlQoTUFYTkFNRUxFTi0xPD0weGZmKTsgLyogbGVuZ3RoIGlzIHN0b3JlZCBpbiB1aW50OCAqLwogCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0JaWYgKG5hbWVsZW4+PU1BWE5BTUVMRU4pCi0JCXJldHVybiBFRkFVTFQ7IC8qIG1hdGNoIGlyaXggYmVoYXZpb3VyICovCisJaWYgKG5hbWVsZW4gPj0gTUFYTkFNRUxFTikKKwkJcmV0dXJuIEVGQVVMVDsJCS8qIG1hdGNoIElSSVggYmVoYXZpb3VyICovCiAKLQlYRlNfU1RBVFNfSU5DKHhzX2F0dHJfcmVtb3ZlKTsKKwlYRlNfU1RBVFNfSU5DKHhzX2F0dHJfc2V0KTsKIAogCWRwID0gWEZTX0JIVlRPSShiZHApOwotCW1wID0gZHAtPmlfbW91bnQ7Ci0JaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGRwLT5pX21vdW50KSkKIAkJcmV0dXJuIChFSU8pOwogCiAJeGZzX2lsb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKQEAgLTQ4OSwxNCArNDQyLDI1IEBACiAJICAgICAoZXJyb3IgPSB4ZnNfaWFjY2VzcyhkcCwgU19JV1VTUiwgY3JlZCkpKSB7CiAJCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAkJcmV0dXJuKFhGU19FUlJPUihlcnJvcikpOwotCX0gZWxzZSBpZiAoWEZTX0lGT1JLX1EoZHApID09IDAgfHwKLQkJICAgKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCi0JCSAgICBkcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKSkgewotCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0JCXJldHVybihYRlNfRVJST1IoRU5PQVRUUikpOwogCX0KIAl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAKKwlyZXR1cm4geGZzX2F0dHJfc2V0X2ludChkcCwgbmFtZSwgbmFtZWxlbiwgdmFsdWUsIHZhbHVlbGVuLCBmbGFncyk7Cit9CisKKy8qCisgKiBHZW5lcmljIGhhbmRsZXIgcm91dGluZSB0byByZW1vdmUgYSBuYW1lIGZyb20gYW4gYXR0cmlidXRlIGxpc3QuCisgKiBUcmFuc2l0aW9ucyBhdHRyaWJ1dGUgbGlzdCBmcm9tIEJ0cmVlIHRvIHNob3J0Zm9ybSBhcyBuZWNlc3NhcnkuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hdHRyX3JlbW92ZV9pbnQoeGZzX2lub2RlX3QgKmRwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGZsYWdzKQoreworCXhmc19kYV9hcmdzX3QJYXJnczsKKwl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CisJeGZzX2JtYXBfZnJlZV90CWZsaXN0OworCWludAkJZXJyb3I7CisJeGZzX21vdW50X3QJKm1wID0gZHAtPmlfbW91bnQ7CisKIAkvKgogCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KIAkgKi8KQEAgLTU0NCw3ICs1MDgsNiBAQAogCQkJCSAgICAgIFhGU19BVFRSUk1fTE9HX0NPVU5UKSkpIHsKIAkJeGZzX3RyYW5zX2NhbmNlbChhcmdzLnRyYW5zLCAwKTsKIAkJcmV0dXJuKGVycm9yKTsKLQogCX0KIAogCXhmc19pbG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOwpAQCAtNjEyLDYgKzU3NSwzOCBAQAogCXJldHVybihlcnJvcik7CiB9CiAKK2ludAoreGZzX2F0dHJfcmVtb3ZlKGJodl9kZXNjX3QgKmJkcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBzdHJ1Y3QgY3JlZCAqY3JlZCkKK3sKKwl4ZnNfaW5vZGVfdCAgICAgICAgICpkcDsKKwlpbnQgICAgICAgICAgICAgICAgIG5hbWVsZW4sIGVycm9yOworCisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAobmFtZWxlbiA+PSBNQVhOQU1FTEVOKQorCQlyZXR1cm4gRUZBVUxUOwkJLyogbWF0Y2ggSVJJWCBiZWhhdmlvdXIgKi8KKworCVhGU19TVEFUU19JTkMoeHNfYXR0cl9yZW1vdmUpOworCisJZHAgPSBYRlNfQkhWVE9JKGJkcCk7CisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKQorCQlyZXR1cm4gKEVJTyk7CisKKwl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCWlmICghKGZsYWdzICYgQVRUUl9TRUNVUkUpICYmCisJICAgICAoZXJyb3IgPSB4ZnNfaWFjY2VzcyhkcCwgU19JV1VTUiwgY3JlZCkpKSB7CisJCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJcmV0dXJuKFhGU19FUlJPUihlcnJvcikpOworCX0gZWxzZSBpZiAoWEZTX0lGT1JLX1EoZHApID09IDAgfHwKKwkJICAgKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJCSAgICBkcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKSkgeworCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXJldHVybihYRlNfRVJST1IoRU5PQVRUUikpOworCX0KKwl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwlyZXR1cm4geGZzX2F0dHJfcmVtb3ZlX2ludChkcCwgbmFtZSwgbmFtZWxlbiwgZmxhZ3MpOworfQorCiAvKgogICogR2VuZXJhdGUgYSBsaXN0IG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lcyBhbmQgb3B0aW9uYWxseQogICogYWxzbyB2YWx1ZSBsZW5ndGhzLiAgUG9zaXRpdmUgcmV0dXJuIHZhbHVlIGZvbGxvd3MgdGhlIFhGUwpAQCAtODExLDcgKzgwNiw3IEBACiBTVEFUSUMgaW50CiB4ZnNfYXR0cl9zaG9ydGZvcm1fYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKQogewotCWludCBuZXdzaXplLCByZXR2YWw7CisJaW50IG5ld3NpemUsIGZvcmtvZmYsIHJldHZhbDsKIAogCXJldHZhbCA9IHhmc19hdHRyX3Nob3J0Zm9ybV9sb29rdXAoYXJncyk7CiAJaWYgKChhcmdzLT5mbGFncyAmIEFUVFJfUkVQTEFDRSkgJiYgKHJldHZhbCA9PSBFTk9BVFRSKSkgewpAQCAtODIzLDE2ICs4MTgsMTggQEAKIAkJQVNTRVJUKHJldHZhbCA9PSAwKTsKIAl9CiAKKwlpZiAoYXJncy0+bmFtZWxlbiA+PSBYRlNfQVRUUl9TRl9FTlRTSVpFX01BWCB8fAorCSAgICBhcmdzLT52YWx1ZWxlbiA+PSBYRlNfQVRUUl9TRl9FTlRTSVpFX01BWCkKKwkJcmV0dXJuKFhGU19FUlJPUihFTk9TUEMpKTsKKwogCW5ld3NpemUgPSBYRlNfQVRUUl9TRl9UT1RTSVpFKGFyZ3MtPmRwKTsKIAluZXdzaXplICs9IFhGU19BVFRSX1NGX0VOVFNJWkVfQllOQU1FKGFyZ3MtPm5hbWVsZW4sIGFyZ3MtPnZhbHVlbGVuKTsKLQlpZiAoKG5ld3NpemUgPD0gWEZTX0lGT1JLX0FTSVpFKGFyZ3MtPmRwKSkgJiYKLQkgICAgKGFyZ3MtPm5hbWVsZW4gPCBYRlNfQVRUUl9TRl9FTlRTSVpFX01BWCkgJiYKLQkgICAgKGFyZ3MtPnZhbHVlbGVuIDwgWEZTX0FUVFJfU0ZfRU5UU0laRV9NQVgpKSB7Ci0JCXJldHZhbCA9IHhmc19hdHRyX3Nob3J0Zm9ybV9hZGQoYXJncyk7Ci0JCUFTU0VSVChyZXR2YWwgPT0gMCk7Ci0JfSBlbHNlIHsKKworCWZvcmtvZmYgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fYnl0ZXNmaXQoYXJncy0+ZHAsIG5ld3NpemUpOworCWlmICghZm9ya29mZikKIAkJcmV0dXJuKFhGU19FUlJPUihFTk9TUEMpKTsKLQl9CisKKwl4ZnNfYXR0cl9zaG9ydGZvcm1fYWRkKGFyZ3MsIGZvcmtvZmYpOwogCXJldHVybigwKTsKIH0KIApAQCAtODUyLDcgKzg0OSw3IEBACiB7CiAJeGZzX2lub2RlX3QgKmRwOwogCXhmc19kYWJ1Zl90ICpicDsKLQlpbnQgcmV0dmFsLCBlcnJvciwgY29tbWl0dGVkOworCWludCByZXR2YWwsIGVycm9yLCBjb21taXR0ZWQsIGZvcmtvZmY7CiAKIAkvKgogCSAqIFJlYWQgdGhlIChvbmx5KSBibG9jayBpbiB0aGUgYXR0cmlidXRlIGxpc3QgaW4uCkBAIC05OTUsOSArOTkyLDkgQEAKIAkJLyoKIAkJICogSWYgdGhlIHJlc3VsdCBpcyBzbWFsbCBlbm91Z2gsIHNocmluayBpdCBhbGwgaW50byB0aGUgaW5vZGUuCiAJCSAqLwotCQlpZiAoeGZzX2F0dHJfc2hvcnRmb3JtX2FsbGZpdChicCwgZHApKSB7CisJCWlmICgoZm9ya29mZiA9IHhmc19hdHRyX3Nob3J0Zm9ybV9hbGxmaXQoYnAsIGRwKSkpIHsKIAkJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOwotCQkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3RvX3Nob3J0Zm9ybShicCwgYXJncyk7CisJCQllcnJvciA9IHhmc19hdHRyX2xlYWZfdG9fc2hvcnRmb3JtKGJwLCBhcmdzLCBmb3Jrb2ZmKTsKIAkJCS8qIGJwIGlzIGdvbmUgZHVlIHRvIHhmc19kYV9zaHJpbmtfaW5vZGUgKi8KIAkJCWlmICghZXJyb3IpIHsKIAkJCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmYXJncy0+dHJhbnMsCkBAIC0xMDQ5LDggKzEwNDYsNyBAQAogewogCXhmc19pbm9kZV90ICpkcDsKIAl4ZnNfZGFidWZfdCAqYnA7Ci0JaW50IGNvbW1pdHRlZDsKLQlpbnQgZXJyb3I7CisJaW50IGVycm9yLCBjb21taXR0ZWQsIGZvcmtvZmY7CiAKIAkvKgogCSAqIFJlbW92ZSB0aGUgYXR0cmlidXRlLgpAQCAtMTA3NSw5ICsxMDcxLDkgQEAKIAkvKgogCSAqIElmIHRoZSByZXN1bHQgaXMgc21hbGwgZW5vdWdoLCBzaHJpbmsgaXQgYWxsIGludG8gdGhlIGlub2RlLgogCSAqLwotCWlmICh4ZnNfYXR0cl9zaG9ydGZvcm1fYWxsZml0KGJwLCBkcCkpIHsKKwlpZiAoKGZvcmtvZmYgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fYWxsZml0KGJwLCBkcCkpKSB7CiAJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOwotCQllcnJvciA9IHhmc19hdHRyX2xlYWZfdG9fc2hvcnRmb3JtKGJwLCBhcmdzKTsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3RvX3Nob3J0Zm9ybShicCwgYXJncywgZm9ya29mZik7CiAJCS8qIGJwIGlzIGdvbmUgZHVlIHRvIHhmc19kYV9zaHJpbmtfaW5vZGUgKi8KIAkJaWYgKCFlcnJvcikgewogCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLCBhcmdzLT5mbGlzdCwKQEAgLTE0NDgsNyArMTQ0NCw3IEBACiAJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CiAJeGZzX2lub2RlX3QgKmRwOwogCXhmc19kYWJ1Zl90ICpicDsKLQlpbnQgcmV0dmFsLCBlcnJvciwgY29tbWl0dGVkOworCWludCByZXR2YWwsIGVycm9yLCBjb21taXR0ZWQsIGZvcmtvZmY7CiAKIAkvKgogCSAqIFRpZSBhIHN0cmluZyBhcm91bmQgb3VyIGZpbmdlciB0byByZW1pbmQgdXMgd2hlcmUgd2UgYXJlLgpAQCAtMTU2OSw5ICsxNTY1LDkgQEAKIAkJCQkgICAgICBicC0+ZGF0YSktPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCiAJCQkJCQkgICAgICAgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CiAKLQkJaWYgKHhmc19hdHRyX3Nob3J0Zm9ybV9hbGxmaXQoYnAsIGRwKSkgeworCQlpZiAoKGZvcmtvZmYgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fYWxsZml0KGJwLCBkcCkpKSB7CiAJCQlYRlNfQk1BUF9JTklUKGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKLQkJCWVycm9yID0geGZzX2F0dHJfbGVhZl90b19zaG9ydGZvcm0oYnAsIGFyZ3MpOworCQkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3RvX3Nob3J0Zm9ybShicCwgYXJncywgZm9ya29mZik7CiAJCQkvKiBicCBpcyBnb25lIGR1ZSB0byB4ZnNfZGFfc2hyaW5rX2lub2RlICovCiAJCQlpZiAoIWVycm9yKSB7CiAJCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyLmggYi9mcy94ZnMveGZzX2F0dHIuaAppbmRleCA0NWFiMWM1Li5iMmM3YjlmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHIuaAorKysgYi9mcy94ZnMveGZzX2F0dHIuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMi0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMi0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfQVRUUl9IX18KICNkZWZpbmUJX19YRlNfQVRUUl9IX18KQEAgLTE3MiwxNSArMTU4LDE1IEBACiAvKgogICogT3ZlcmFsbCBleHRlcm5hbCBpbnRlcmZhY2Ugcm91dGluZXMuCiAgKi8KLWludCB4ZnNfYXR0cl9nZXQoYmh2X2Rlc2NfdCAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCwgc3RydWN0IGNyZWQgKik7Ci1pbnQgeGZzX2F0dHJfc2V0KGJodl9kZXNjX3QgKiwgY2hhciAqLCBjaGFyICosIGludCwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKLWludCB4ZnNfYXR0cl9yZW1vdmUoYmh2X2Rlc2NfdCAqLCBjaGFyICosIGludCwgc3RydWN0IGNyZWQgKik7CitpbnQgeGZzX2F0dHJfZ2V0KGJodl9kZXNjX3QgKiwgY29uc3QgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOworaW50IHhmc19hdHRyX3NldChiaHZfZGVzY190ICosIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCwgc3RydWN0IGNyZWQgKik7CitpbnQgeGZzX2F0dHJfcmVtb3ZlKGJodl9kZXNjX3QgKiwgY29uc3QgY2hhciAqLCBpbnQsIHN0cnVjdCBjcmVkICopOwogaW50IHhmc19hdHRyX2xpc3QoYmh2X2Rlc2NfdCAqLCBjaGFyICosIGludCwgaW50LAogCQkJIHN0cnVjdCBhdHRybGlzdF9jdXJzb3Jfa2VybiAqLCBzdHJ1Y3QgY3JlZCAqKTsKIGludCB4ZnNfYXR0cl9pbmFjdGl2ZShzdHJ1Y3QgeGZzX2lub2RlICpkcCk7CiAKIGludCB4ZnNfYXR0cl9zaG9ydGZvcm1fZ2V0dmFsdWUoc3RydWN0IHhmc19kYV9hcmdzICopOwotaW50IHhmc19hdHRyX2ZldGNoKHN0cnVjdCB4ZnNfaW5vZGUgKiwgY2hhciAqLCBpbnQsCitpbnQgeGZzX2F0dHJfZmV0Y2goc3RydWN0IHhmc19pbm9kZSAqLCBjb25zdCBjaGFyICosIGludCwKIAkJCWNoYXIgKiwgaW50ICosIGludCwgc3RydWN0IGNyZWQgKik7CiAKICNlbmRpZgkvKiBfX1hGU19BVFRSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKaW5kZXggMWNkZDU3NC4uMzVlNTU3YiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYworKysgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCkBAIC0xLDQ2ICsxLDI2IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0vKgotICogeGZzX2F0dHJfbGVhZi5jCi0gKgotICogR1JPVDogZmlndXJlIG91dCBob3cgdG8gcmVjb3ZlciBncmFjZWZ1bGx5IHdoZW4gYm1hcCByZXR1cm5zIEVOT1NQQy4KLSAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCkBAIC00OCwyMyArMjgsMjIgQEAKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19hbGxvYy5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCi0jaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKICNpbmNsdWRlICJ4ZnNfYXR0cl9sZWFmLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgogCiAvKgogICogeGZzX2F0dHJfbGVhZi5jCkBAIC0xMTgsMTMgKzk3LDgyIEBACiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEV4dGVybmFsIHJvdXRpbmVzIHdoZW4gZGlyc2l6ZSA8IFhGU19MSVRJTk8obXApLgorICogRXh0ZXJuYWwgcm91dGluZXMgd2hlbiBhdHRyaWJ1dGUgZm9yayBzaXplIDwgWEZTX0xJVElOTyhtcCkuCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qCisgKiBRdWVyeSB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGFkZGl0aW9uYWwgYnl0ZXMgb2YgZXh0ZW5kZWQKKyAqIGF0dHJpYnV0ZSBzcGFjZSB3aWxsIGJlIGFibGUgdG8gZml0IGlubGluZS4KKyAqIFJldHVybnMgemVybyBpZiBub3QsIGVsc2UgdGhlIGRpX2ZvcmtvZmYgZm9yayBvZmZzZXQgdG8gYmUgdXNlZCBpbiB0aGUKKyAqIGxpdGVyYWwgYXJlYSBmb3IgYXR0cmlidXRlIGRhdGEgb25jZSB0aGUgbmV3IGJ5dGVzIGhhdmUgYmVlbiBhZGRlZC4KKyAqCisgKiBkaV9mb3Jrb2ZmIG11c3QgYmUgOCBieXRlIGFsaWduZWQsIGhlbmNlIGlzIHN0b3JlZCBhcyBhID4+MyB2YWx1ZTsKKyAqIHNwZWNpYWwgY2FzZSBmb3IgZGV2L3V1aWQgaW5vZGVzLCB0aGV5IGhhdmUgZml4ZWQgc2l6ZSBkYXRhIGZvcmtzLgorICovCitpbnQKK3hmc19hdHRyX3Nob3J0Zm9ybV9ieXRlc2ZpdCh4ZnNfaW5vZGVfdCAqZHAsIGludCBieXRlcykKK3sKKwlpbnQgb2Zmc2V0OworCWludCBtaW5mb3Jrb2ZmOwkvKiBsb3dlciBsaW1pdCBvbiB2YWxpZCBmb3Jrb2ZmIGxvY2F0aW9ucyAqLworCWludCBtYXhmb3Jrb2ZmOwkvKiB1cHBlciBsaW1pdCBvbiB2YWxpZCBmb3Jrb2ZmIGxvY2F0aW9ucyAqLworCXhmc19tb3VudF90ICptcCA9IGRwLT5pX21vdW50OworCisJb2Zmc2V0ID0gKFhGU19MSVRJTk8obXApIC0gYnl0ZXMpID4+IDM7IC8qIHJvdW5kZWQgZG93biAqLworCisJc3dpdGNoIChkcC0+aV9kLmRpX2Zvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfREVWOgorCQltaW5mb3Jrb2ZmID0gcm91bmR1cChzaXplb2YoeGZzX2Rldl90KSwgOCkgPj4gMzsKKwkJcmV0dXJuIChvZmZzZXQgPj0gbWluZm9ya29mZikgPyBtaW5mb3Jrb2ZmIDogMDsKKwljYXNlIFhGU19ESU5PREVfRk1UX1VVSUQ6CisJCW1pbmZvcmtvZmYgPSByb3VuZHVwKHNpemVvZih1dWlkX3QpLCA4KSA+PiAzOworCQlyZXR1cm4gKG9mZnNldCA+PSBtaW5mb3Jrb2ZmKSA/IG1pbmZvcmtvZmYgOiAwOworCX0KKworCWlmICh1bmxpa2VseShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikpIHsKKwkJaWYgKGJ5dGVzIDw9IFhGU19JRk9SS19BU0laRShkcCkpCisJCQlyZXR1cm4gbXAtPm1fYXR0cm9mZnNldCA+PiAzOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkYXRhIGZvcmsgYnRyZWUgcm9vdCBjYW4gaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkga2V5L3B0ciBwYWlycyAqLworCW1pbmZvcmtvZmYgPSBNQVgoZHAtPmlfZGYuaWZfYnl0ZXMsIFhGU19CTURSX1NQQUNFX0NBTEMoTUlOREJUUFRSUykpOworCW1pbmZvcmtvZmYgPSByb3VuZHVwKG1pbmZvcmtvZmYsIDgpID4+IDM7CisKKwkvKiBhdHRyIGZvcmsgYnRyZWUgcm9vdCBjYW4gaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkga2V5L3B0ciBwYWlycyAqLworCW1heGZvcmtvZmYgPSBYRlNfTElUSU5PKG1wKSAtIFhGU19CTURSX1NQQUNFX0NBTEMoTUlOQUJUUFRSUyk7CisJbWF4Zm9ya29mZiA9IG1heGZvcmtvZmYgPj4gMzsJLyogcm91bmRlZCBkb3duICovCisKKwlpZiAob2Zmc2V0ID49IG1pbmZvcmtvZmYgJiYgb2Zmc2V0IDwgbWF4Zm9ya29mZikKKwkJcmV0dXJuIG9mZnNldDsKKwlpZiAob2Zmc2V0ID49IG1heGZvcmtvZmYpCisJCXJldHVybiBtYXhmb3Jrb2ZmOworCXJldHVybiAwOworfQorCisvKgorICogU3dpdGNoIG9uIHRoZSBBVFRSMiBzdXBlcmJsb2NrIGJpdCAoaW1wbGllcyBhbHNvIEZFQVRVUkVTMikKKyAqLworU1RBVElDIHZvaWQKK3hmc19zYnZlcnNpb25fYWRkX2F0dHIyKHhmc19tb3VudF90ICptcCwgeGZzX3RyYW5zX3QgKnRwKQoreworCXVuc2lnbmVkIGxvbmcgczsKKworCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0NPTVBBVF9BVFRSKSAmJgorCSAgICAhKFhGU19TQl9WRVJTSU9OX0hBU0FUVFIyKCZtcC0+bV9zYikpKSB7CisJCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTQVRUUjIoJm1wLT5tX3NiKSkgeworCQkJWEZTX1NCX1ZFUlNJT05fQUREQVRUUjIoJm1wLT5tX3NiKTsKKwkJCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCQkJeGZzX21vZF9zYih0cCwgWEZTX1NCX1ZFUlNJT05OVU0gfCBYRlNfU0JfRkVBVFVSRVMyKTsKKwkJfSBlbHNlCisJCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwl9Cit9CisKKy8qCiAgKiBDcmVhdGUgdGhlIGluaXRpYWwgY29udGVudHMgb2YgYSBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3QuCiAgKi8KLWludAordm9pZAogeGZzX2F0dHJfc2hvcnRmb3JtX2NyZWF0ZSh4ZnNfZGFfYXJnc190ICphcmdzKQogewogCXhmc19hdHRyX3NmX2hkcl90ICpoZHI7CkBAIC0xNDgsMjkgKzE5NiwzNyBAQAogCWhkci0+Y291bnQgPSAwOwogCUlOVF9TRVQoaGRyLT50b3RzaXplLCBBUkNIX0NPTlZFUlQsIHNpemVvZigqaGRyKSk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19BREFUQSk7Ci0JcmV0dXJuKDApOwogfQogCiAvKgogICogQWRkIGEgbmFtZS92YWx1ZSBwYWlyIHRvIHRoZSBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3QuCiAgKiBPdmVyZmxvdyBmcm9tIHRoZSBpbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgZm9yLgogICovCi1pbnQKLXhmc19hdHRyX3Nob3J0Zm9ybV9hZGQoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3ZvaWQKK3hmc19hdHRyX3Nob3J0Zm9ybV9hZGQoeGZzX2RhX2FyZ3NfdCAqYXJncywgaW50IGZvcmtvZmYpCiB7CiAJeGZzX2F0dHJfc2hvcnRmb3JtX3QgKnNmOwogCXhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZTsKIAlpbnQgaSwgb2Zmc2V0LCBzaXplOworCXhmc19tb3VudF90ICptcDsKIAl4ZnNfaW5vZGVfdCAqZHA7CiAJeGZzX2lmb3JrX3QgKmlmcDsKIAogCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlkcC0+aV9kLmRpX2ZvcmtvZmYgPSBmb3Jrb2ZmOworCWRwLT5pX2RmLmlmX2V4dF9tYXggPQorCQlYRlNfSUZPUktfRFNJWkUoZHApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwlkcC0+aV9hZnAtPmlmX2V4dF9tYXggPQorCQlYRlNfSUZPUktfQVNJWkUoZHApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwogCWlmcCA9IGRwLT5pX2FmcDsKIAlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CiAJc2YgPSAoeGZzX2F0dHJfc2hvcnRmb3JtX3QgKilpZnAtPmlmX3UxLmlmX2RhdGE7CiAJc2ZlID0gJnNmLT5saXN0WzBdOwogCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CiAJCQkJc2ZlID0gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZSksIGkrKykgeworI2lmZGVmIERFQlVHCiAJCWlmIChzZmUtPm5hbWVsZW4gIT0gYXJncy0+bmFtZWxlbikKIAkJCWNvbnRpbnVlOwogCQlpZiAobWVtY21wKGFyZ3MtPm5hbWUsIHNmZS0+bmFtZXZhbCwgYXJncy0+bmFtZWxlbikgIT0gMCkKQEAgLTE4MSw3ICsyMzcsOCBAQAogCQlpZiAoKChhcmdzLT5mbGFncyAmIEFUVFJfUk9PVCkgIT0gMCkgIT0KIAkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1JPT1QpICE9IDApKQogCQkJY29udGludWU7Ci0JCXJldHVybihYRlNfRVJST1IoRUVYSVNUKSk7CisJCUFTU0VSVCgwKTsKKyNlbmRpZgogCX0KIAogCW9mZnNldCA9IChjaGFyICopc2ZlIC0gKGNoYXIgKilzZjsKQEAgLTIwMCwxMSArMjU3LDExIEBACiAJSU5UX01PRChzZi0+aGRyLnRvdHNpemUsIEFSQ0hfQ09OVkVSVCwgc2l6ZSk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19BREFUQSk7CiAKLQlyZXR1cm4oMCk7CisJeGZzX3NidmVyc2lvbl9hZGRfYXR0cjIobXAsIGFyZ3MtPnRyYW5zKTsKIH0KIAogLyoKLSAqIFJlbW92ZSBhIG5hbWUgZnJvbSB0aGUgc2hvcnRmb3JtIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZS4KKyAqIFJlbW92ZSBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgc2hvcnRmb3JtIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZS4KICAqLwogaW50CiB4ZnNfYXR0cl9zaG9ydGZvcm1fcmVtb3ZlKHhmc19kYV9hcmdzX3QgKmFyZ3MpCkBAIC0yMTIsMTcgKzI2OSwxNiBAQAogCXhmc19hdHRyX3Nob3J0Zm9ybV90ICpzZjsKIAl4ZnNfYXR0cl9zZl9lbnRyeV90ICpzZmU7CiAJaW50IGJhc2UsIHNpemU9MCwgZW5kLCB0b3RzaXplLCBpOworCXhmc19tb3VudF90ICptcDsKIAl4ZnNfaW5vZGVfdCAqZHA7CiAKLQkvKgotCSAqIFJlbW92ZSB0aGUgYXR0cmlidXRlLgotCSAqLwogCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKIAliYXNlID0gc2l6ZW9mKHhmc19hdHRyX3NmX2hkcl90KTsKIAlzZiA9ICh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKWRwLT5pX2FmcC0+aWZfdTEuaWZfZGF0YTsKIAlzZmUgPSAmc2YtPmxpc3RbMF07Ci0JZm9yIChpID0gMDsgaSA8IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKLQkJCQlzZmUgPSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlKSwKKwllbmQgPSBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJZm9yIChpID0gMDsgaSA8IGVuZDsgc2ZlID0gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZSksCiAJCQkJCWJhc2UgKz0gc2l6ZSwgaSsrKSB7CiAJCXNpemUgPSBYRlNfQVRUUl9TRl9FTlRTSVpFKHNmZSk7CiAJCWlmIChzZmUtPm5hbWVsZW4gIT0gYXJncy0+bmFtZWxlbikKQEAgLTIzNywxOSArMjkzLDUxIEBACiAJCQljb250aW51ZTsKIAkJYnJlYWs7CiAJfQotCWlmIChpID09IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwlpZiAoaSA9PSBlbmQpCiAJCXJldHVybihYRlNfRVJST1IoRU5PQVRUUikpOwogCisJLyoKKwkgKiBGaXggdXAgdGhlIGF0dHJpYnV0ZSBmb3JrIGRhdGEsIGNvdmVyaW5nIHRoZSBob2xlCisJICovCiAJZW5kID0gYmFzZSArIHNpemU7CiAJdG90c2l6ZSA9IElOVF9HRVQoc2YtPmhkci50b3RzaXplLCBBUkNIX0NPTlZFUlQpOwotCWlmIChlbmQgIT0gdG90c2l6ZSkgewotCQltZW1tb3ZlKCYoKGNoYXIgKilzZilbYmFzZV0sICYoKGNoYXIgKilzZilbZW5kXSwKLQkJCQkJCQl0b3RzaXplIC0gZW5kKTsKLQl9CisJaWYgKGVuZCAhPSB0b3RzaXplKQorCQltZW1tb3ZlKCYoKGNoYXIgKilzZilbYmFzZV0sICYoKGNoYXIgKilzZilbZW5kXSwgdG90c2l6ZSAtIGVuZCk7CiAJSU5UX01PRChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKIAlJTlRfTU9EKHNmLT5oZHIudG90c2l6ZSwgQVJDSF9DT05WRVJULCAtc2l6ZSk7Ci0JeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1zaXplLCBYRlNfQVRUUl9GT1JLKTsKLQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0FEQVRBKTsKKworCS8qCisJICogRml4IHVwIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGF0dHJpYnV0ZSBmb3JrCisJICovCisJdG90c2l6ZSAtPSBzaXplOworCWlmICh0b3RzaXplID09IHNpemVvZih4ZnNfYXR0cl9zZl9oZHJfdCkgJiYgIWFyZ3MtPmFkZG5hbWUpIHsKKwkJLyoKKwkJICogTGFzdCBhdHRyaWJ1dGUgbm93IHJlbW92ZWQsIHJldmVydCB0byBvcmlnaW5hbAorCQkgKiBpbm9kZSBmb3JtYXQgbWFraW5nIGFsbCBsaXRlcmFsIGFyZWEgYXZhaWxhYmxlCisJCSAqIHRvIHRoZSBkYXRhIGZvcmsgb25jZSBtb3JlLgorCQkgKi8KKwkJeGZzX2lkZXN0cm95X2ZvcmsoZHAsIFhGU19BVFRSX0ZPUkspOworCQlkcC0+aV9kLmRpX2ZvcmtvZmYgPSAwOworCQlkcC0+aV9kLmRpX2Fmb3JtYXQgPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOworCQlBU1NFUlQoZHAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCk7CisJCUFTU0VSVChkcC0+aV9hZnAgPT0gTlVMTCk7CisJCWRwLT5pX2RmLmlmX2V4dF9tYXggPQorCQkJWEZTX0lGT1JLX0RTSVpFKGRwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFKTsKKwl9IGVsc2UgeworCQl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgLXNpemUsIFhGU19BVFRSX0ZPUkspOworCQlkcC0+aV9kLmRpX2ZvcmtvZmYgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fYnl0ZXNmaXQoZHAsIHRvdHNpemUpOworCQlBU1NFUlQoZHAtPmlfZC5kaV9mb3Jrb2ZmKTsKKwkJQVNTRVJUKHRvdHNpemUgPiBzaXplb2YoeGZzX2F0dHJfc2ZfaGRyX3QpIHx8IGFyZ3MtPmFkZG5hbWUpOworCQlkcC0+aV9hZnAtPmlmX2V4dF9tYXggPQorCQkJWEZTX0lGT1JLX0FTSVpFKGRwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJCWRwLT5pX2RmLmlmX2V4dF9tYXggPQorCQkJWEZTX0lGT1JLX0RTSVpFKGRwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLAorCQkJCQlYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfQURBVEEpOworCX0KKworCXhmc19zYnZlcnNpb25fYWRkX2F0dHIyKG1wLCBhcmdzLT50cmFucyk7CiAKIAlyZXR1cm4oMCk7CiB9CkBAIC01NjEsNyArNjQ5LDcgQEAKIAkvKgogCSAqIFNvcnQgdGhlIGVudHJpZXMgb24gaGFzaCB0aGVuIGVudG5vLgogCSAqLwotCXFzb3J0KHNidWYsIG5zYnVmLCBzaXplb2YoKnNidWYpLCB4ZnNfYXR0cl9zaG9ydGZvcm1fY29tcGFyZSk7CisJeGZzX3NvcnQoc2J1ZiwgbnNidWYsIHNpemVvZigqc2J1ZiksIHhmc19hdHRyX3Nob3J0Zm9ybV9jb21wYXJlKTsKIAogCS8qCiAJICogUmUtZmluZCBvdXIgcGxhY2UgSU4gVEhFIFNPUlRFRCBMSVNULgpAQCAtNjQ5LDE0ICs3MzcsMTYgQEAKIAkJCQkrIG5hbWVfbG9jLT5uYW1lbGVuCiAJCQkJKyBJTlRfR0VUKG5hbWVfbG9jLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJUKTsKIAl9Ci0JcmV0dXJuKCBieXRlcyA8IFhGU19JRk9SS19BU0laRShkcCkgKTsKKwlpZiAoYnl0ZXMgPT0gc2l6ZW9mKHN0cnVjdCB4ZnNfYXR0cl9zZl9oZHIpKQorCQlyZXR1cm4oLTEpOworCXJldHVybih4ZnNfYXR0cl9zaG9ydGZvcm1fYnl0ZXNmaXQoZHAsIGJ5dGVzKSk7CiB9CiAKIC8qCiAgKiBDb252ZXJ0IGEgbGVhZiBhdHRyaWJ1dGUgbGlzdCB0byBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3QKICAqLwogaW50Ci14ZnNfYXR0cl9sZWFmX3RvX3Nob3J0Zm9ybSh4ZnNfZGFidWZfdCAqYnAsIHhmc19kYV9hcmdzX3QgKmFyZ3MpCit4ZnNfYXR0cl9sZWFmX3RvX3Nob3J0Zm9ybSh4ZnNfZGFidWZfdCAqYnAsIHhmc19kYV9hcmdzX3QgKmFyZ3MsIGludCBmb3Jrb2ZmKQogewogCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOwogCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnk7CkBAIC02ODMsOSArNzczLDI1IEBACiAJZXJyb3IgPSB4ZnNfZGFfc2hyaW5rX2lub2RlKGFyZ3MsIDAsIGJwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwotCWVycm9yID0geGZzX2F0dHJfc2hvcnRmb3JtX2NyZWF0ZShhcmdzKTsKLQlpZiAoZXJyb3IpCisKKwlpZiAoZm9ya29mZiA9PSAtMSkgeworCQkvKgorCQkgKiBMYXN0IGF0dHJpYnV0ZSB3YXMgcmVtb3ZlZCwgcmV2ZXJ0IHRvIG9yaWdpbmFsCisJCSAqIGlub2RlIGZvcm1hdCBtYWtpbmcgYWxsIGxpdGVyYWwgYXJlYSBhdmFpbGFibGUKKwkJICogdG8gdGhlIGRhdGEgZm9yayBvbmNlIG1vcmUuCisJCSAqLworCQl4ZnNfaWRlc3Ryb3lfZm9yayhkcCwgWEZTX0FUVFJfRk9SSyk7CisJCWRwLT5pX2QuZGlfZm9ya29mZiA9IDA7CisJCWRwLT5pX2QuZGlfYWZvcm1hdCA9IFhGU19ESU5PREVfRk1UX0VYVEVOVFM7CisJCUFTU0VSVChkcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKTsKKwkJQVNTRVJUKGRwLT5pX2FmcCA9PSBOVUxMKTsKKwkJZHAtPmlfZGYuaWZfZXh0X21heCA9CisJCQlYRlNfSUZPUktfRFNJWkUoZHApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUpOwogCQlnb3RvIG91dDsKKwl9CisKKwl4ZnNfYXR0cl9zaG9ydGZvcm1fY3JlYXRlKGFyZ3MpOwogCiAJLyoKIAkgKiBDb3B5IHRoZSBhdHRyaWJ1dGVzCkBAIC03MTMsNyArODE5LDcgQEAKIAkJbmFyZ3MuaGFzaHZhbCA9IElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CiAJCW5hcmdzLmZsYWdzID0gKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgPyBBVFRSX1NFQ1VSRSA6CiAJCQkgICAgICAoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX1JPT1QpID8gQVRUUl9ST09UIDogMCk7Ci0JCXhmc19hdHRyX3Nob3J0Zm9ybV9hZGQoJm5hcmdzKTsKKwkJeGZzX2F0dHJfc2hvcnRmb3JtX2FkZCgmbmFyZ3MsIGZvcmtvZmYpOwogCX0KIAllcnJvciA9IDA7CiAKQEAgLTg5OCw3ICsxMDA0LDcgQEAKIAlBU1NFUlQoKGFyZ3MtPmluZGV4ID49IDApCiAJCSYmIChhcmdzLT5pbmRleCA8PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkpOwogCWhkciA9ICZsZWFmLT5oZHI7Ci0JZW50c2l6ZSA9IHhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZShhcmdzLAorCWVudHNpemUgPSB4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoYXJncy0+bmFtZWxlbiwgYXJncy0+dmFsdWVsZW4sCiAJCQkgICBhcmdzLT50cmFucy0+dF9tb3VudHAtPm1fc2Iuc2JfYmxvY2tzaXplLCBOVUxMKTsKIAogCS8qCkBAIC05OTUsMTMgKzExMDEsMTQgQEAKIAltcCA9IGFyZ3MtPnRyYW5zLT50X21vdW50cDsKIAlBU1NFUlQoSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfTEJTSVpFKG1wKSk7CiAJQVNTRVJUKChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSAmIDB4MykgPT0gMCk7Ci0JQVNTRVJUKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpCi0JCQkJPj0geGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKGFyZ3MsCi0JCQkJCSAgICAgbXAtPm1fc2Iuc2JfYmxvY2tzaXplLCBOVUxMKSk7CisJQVNTRVJUKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpID49CisJCXhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZShhcmdzLT5uYW1lbGVuLCBhcmdzLT52YWx1ZWxlbiwKKwkJCQkJIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgTlVMTCkpOwogCUFTU0VSVChJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSA8IFhGU19MQlNJWkUobXApKTsKIAlBU1NFUlQoKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpICYgMHgzKSA9PSAwKTsKIAlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULAotCQkteGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKGFyZ3MsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgJnRtcCkpOworCQkteGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKGFyZ3MtPm5hbWVsZW4sIGFyZ3MtPnZhbHVlbGVuLAorCQkJCQkgIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgJnRtcCkpOwogCUlOVF9TRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCwKIAkJCQkJSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkKIAkJCQkgICAgICArIElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpKTsKQEAgLTEzNTcsOCArMTQ2NCwxMCBAQAogCWhhbGYgID0gKG1heCsxKSAqIHNpemVvZigqZW50cnkpOwogCWhhbGYgKz0gSU5UX0dFVChoZHIxLT51c2VkYnl0ZXMsIEFSQ0hfQ09OVkVSVCkKIAkJCQkrIElOVF9HRVQoaGRyMi0+dXNlZGJ5dGVzLCBBUkNIX0NPTlZFUlQpCi0JCQkJKyB4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoc3RhdGUtPmFyZ3MsCi0JCQkJCQkgICAgIHN0YXRlLT5ibG9ja3NpemUsIE5VTEwpOworCQkJCSsgeGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKAorCQkJCQkJc3RhdGUtPmFyZ3MtPm5hbWVsZW4sCisJCQkJCQlzdGF0ZS0+YXJncy0+dmFsdWVsZW4sCisJCQkJCQlzdGF0ZS0+YmxvY2tzaXplLCBOVUxMKTsKIAloYWxmIC89IDI7CiAJbGFzdGRlbHRhID0gc3RhdGUtPmJsb2Nrc2l6ZTsKIAllbnRyeSA9ICZsZWFmMS0+ZW50cmllc1swXTsKQEAgLTEzNzAsOSArMTQ3OSwxMCBAQAogCQkgKi8KIAkJaWYgKGNvdW50ID09IGJsazEtPmluZGV4KSB7CiAJCQl0bXAgPSB0b3RhbGxlbiArIHNpemVvZigqZW50cnkpICsKLQkJCQl4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoc3RhdGUtPmFyZ3MsCi0JCQkJCQkJIHN0YXRlLT5ibG9ja3NpemUsCi0JCQkJCQkJIE5VTEwpOworCQkJCXhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZSgKKwkJCQkJCXN0YXRlLT5hcmdzLT5uYW1lbGVuLAorCQkJCQkJc3RhdGUtPmFyZ3MtPnZhbHVlbGVuLAorCQkJCQkJc3RhdGUtPmJsb2Nrc2l6ZSwgTlVMTCk7CiAJCQlpZiAoWEZTX0FUVFJfQUJTKGhhbGYgLSB0bXApID4gbGFzdGRlbHRhKQogCQkJCWJyZWFrOwogCQkJbGFzdGRlbHRhID0gWEZTX0FUVFJfQUJTKGhhbGYgLSB0bXApOwpAQCAtMTQwOCw5ICsxNTE4LDEwIEBACiAJdG90YWxsZW4gLT0gY291bnQgKiBzaXplb2YoKmVudHJ5KTsKIAlpZiAoZm91bmRpdCkgewogCQl0b3RhbGxlbiAtPSBzaXplb2YoKmVudHJ5KSArCi0JCQkJeGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKHN0YXRlLT5hcmdzLAotCQkJCQkJCSBzdGF0ZS0+YmxvY2tzaXplLAotCQkJCQkJCSBOVUxMKTsKKwkJCQl4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoCisJCQkJCQlzdGF0ZS0+YXJncy0+bmFtZWxlbiwKKwkJCQkJCXN0YXRlLT5hcmdzLT52YWx1ZWxlbiwKKwkJCQkJCXN0YXRlLT5ibG9ja3NpemUsIE5VTEwpOwogCX0KIAogCSpjb3VudGFyZyA9IGNvdW50OwpAQCAtMjI1MywxNyArMjM2NCwxNyBAQAogICogYSAibG9jYWwiIG9yIGEgInJlbW90ZSIgYXR0cmlidXRlLgogICovCiBpbnQKLXhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZSh4ZnNfZGFfYXJnc190ICphcmdzLCBpbnQgYmxvY2tzaXplLCBpbnQgKmxvY2FsKQoreGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKGludCBuYW1lbGVuLCBpbnQgdmFsdWVsZW4sIGludCBibG9ja3NpemUsIGludCAqbG9jYWwpCiB7CiAJaW50IHNpemU7CiAKLQlzaXplID0gWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMKGFyZ3MtPm5hbWVsZW4sIGFyZ3MtPnZhbHVlbGVuKTsKKwlzaXplID0gWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMKG5hbWVsZW4sIHZhbHVlbGVuKTsKIAlpZiAoc2l6ZSA8IFhGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTF9NQVgoYmxvY2tzaXplKSkgewogCQlpZiAobG9jYWwpIHsKIAkJCSpsb2NhbCA9IDE7CiAJCX0KIAl9IGVsc2UgewotCQlzaXplID0gWEZTX0FUVFJfTEVBRl9FTlRTSVpFX1JFTU9URShhcmdzLT5uYW1lbGVuKTsKKwkJc2l6ZSA9IFhGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUobmFtZWxlbik7CiAJCWlmIChsb2NhbCkgewogCQkJKmxvY2FsID0gMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuaCBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmgKaW5kZXggMGE0Y2ZhZC4uZjYxNDNmZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyX2xlYWYuaAorKysgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAyLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19BVFRSX0xFQUZfSF9fCiAjZGVmaW5lCV9fWEZTX0FUVFJfTEVBRl9IX18KQEAgLTE0Niw2NSArMTMyLDU4IEBACiAvKgogICogQ2FzdCB0eXBlZCBwb2ludGVycyBmb3IgImxvY2FsIiBhbmQgInJlbW90ZSIgbmFtZS92YWx1ZSBzdHJ1Y3RzLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUpCi14ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKgoteGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZSh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpOwogI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWZwLGlkeCkJXAogCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUobGVhZnAsaWR4KQotI2Vsc2UKLSNkZWZpbmUgWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmcCxpZHgpCS8qIHJlbW90ZSBuYW1lIHN0cnVjdCBwdHIgKi8gXAotCSgoeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICopCQlcCi0JICYoKGNoYXIgKikobGVhZnApKVsgSU5UX0dFVCgobGVhZnApLT5lbnRyaWVzW2lkeF0ubmFtZWlkeCwgQVJDSF9DT05WRVJUKSBdKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfTkFNRV9MT0NBTCkKLXhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICoKLXhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpOworc3RhdGljIGlubGluZSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKgoreGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZSh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpCit7CisJcmV0dXJuICh4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKikgJigoY2hhciAqKQorCQkobGVhZnApKVtJTlRfR0VUKChsZWFmcCktPmVudHJpZXNbaWR4XS5uYW1laWR4LCBBUkNIX0NPTlZFUlQpXTsKK30KKwogI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZnAsaWR4KQlcCiAJeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsKGxlYWZwLGlkeCkKLSNlbHNlCi0jZGVmaW5lIFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmcCxpZHgpCS8qIGxvY2FsIG5hbWUgc3RydWN0IHB0ciAqLyBcCi0JKCh4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqKQkJXAotCSAmKChjaGFyICopKGxlYWZwKSlbIElOVF9HRVQoKGxlYWZwKS0+ZW50cmllc1tpZHhdLm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgXSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX05BTUUpCi1jaGFyICp4ZnNfYXR0cl9sZWFmX25hbWUoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgaWR4KTsKK3N0YXRpYyBpbmxpbmUgeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKgoreGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmcCwgaW50IGlkeCkKK3sKKwlyZXR1cm4gKHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICopICYoKGNoYXIgKikKKwkJKGxlYWZwKSlbSU5UX0dFVCgobGVhZnApLT5lbnRyaWVzW2lkeF0ubmFtZWlkeCwgQVJDSF9DT05WRVJUKV07Cit9CisKICNkZWZpbmUgWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWZwLGlkeCkJCXhmc19hdHRyX2xlYWZfbmFtZShsZWFmcCxpZHgpCi0jZWxzZQotI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUUobGVhZnAsaWR4KQkJLyogZ2VuZXJpYyBuYW1lIHN0cnVjdCBwdHIgKi8gXAotCSgmKChjaGFyICopKGxlYWZwKSlbIElOVF9HRVQoKGxlYWZwKS0+ZW50cmllc1tpZHhdLm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgXSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBjaGFyICp4ZnNfYXR0cl9sZWFmX25hbWUoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgaWR4KQoreworCXJldHVybiAoJigoY2hhciAqKQorCQkobGVhZnApKVtJTlRfR0VUKChsZWFmcCktPmVudHJpZXNbaWR4XS5uYW1laWR4LCBBUkNIX0NPTlZFUlQpXSk7Cit9CiAKIC8qCiAgKiBDYWxjdWxhdGUgdG90YWwgYnl0ZXMgdXNlZCAoaW5jbHVkaW5nIHRyYWlsaW5nIHBhZCBmb3IgYWxpZ25tZW50KSBmb3IKICAqIGEgImxvY2FsIiBuYW1lL3ZhbHVlIHN0cnVjdHVyZSwgYSAicmVtb3RlIiBuYW1lL3ZhbHVlIHN0cnVjdHVyZSwgYW5kCiAgKiBhIHBvaW50ZXIgd2hpY2ggbWlnaHQgYmUgZWl0aGVyLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUpCi1pbnQgeGZzX2F0dHJfbGVhZl9lbnRzaXplX3JlbW90ZShpbnQgbmxlbik7CiAjZGVmaW5lIFhGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUobmxlbikJXAogCXhmc19hdHRyX2xlYWZfZW50c2l6ZV9yZW1vdGUobmxlbikKLSNlbHNlCi0jZGVmaW5lIFhGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUobmxlbikJLyogc3BhY2UgZm9yIHJlbW90ZSBzdHJ1Y3QgKi8gXAotCSgoKHVpbnQpc2l6ZW9mKHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCkgLSAxICsgKG5sZW4pICsgXAotCSAgWEZTX0FUVFJfTEVBRl9OQU1FX0FMSUdOIC0gMSkgJiB+KFhGU19BVFRSX0xFQUZfTkFNRV9BTElHTiAtIDEpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTCkKLWludCB4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWwoaW50IG5sZW4sIGludCB2bGVuKTsKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19hdHRyX2xlYWZfZW50c2l6ZV9yZW1vdGUoaW50IG5sZW4pCit7CisJcmV0dXJuICgodWludClzaXplb2YoeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90KSAtIDEgKyAobmxlbikgKyBcCisJCVhGU19BVFRSX0xFQUZfTkFNRV9BTElHTiAtIDEpICYgfihYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04gLSAxKTsKK30KKwogI2RlZmluZSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUwobmxlbix2bGVuKQlcCiAJeGZzX2F0dHJfbGVhZl9lbnRzaXplX2xvY2FsKG5sZW4sdmxlbikKLSNlbHNlCi0jZGVmaW5lIFhGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTChubGVuLHZsZW4pCS8qIHNwYWNlIGZvciBsb2NhbCBzdHJ1Y3QgKi8gXAotCSgoKHVpbnQpc2l6ZW9mKHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90KSAtIDEgKyAobmxlbikgKyAodmxlbikgKyBcCi0JICBYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04gLSAxKSAmIH4oWEZTX0FUVFJfTEVBRl9OQU1FX0FMSUdOIC0gMSkpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMX01BWCkKLWludCB4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWxfbWF4KGludCBic2l6ZSk7CitzdGF0aWMgaW5saW5lIGludCB4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWwoaW50IG5sZW4sIGludCB2bGVuKQoreworCXJldHVybiAoKHVpbnQpc2l6ZW9mKHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90KSAtIDEgKyAobmxlbikgKyAodmxlbikgKworCQlYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04gLSAxKSAmIH4oWEZTX0FUVFJfTEVBRl9OQU1FX0FMSUdOIC0gMSk7Cit9CisKICNkZWZpbmUgWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMX01BWChic2l6ZSkJXAogCXhmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbF9tYXgoYnNpemUpCi0jZWxzZQotI2RlZmluZSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUxfTUFYKGJzaXplKQkvKiBtYXggbG9jYWwgc3RydWN0IHNpemUgKi8gXAotCSgoKGJzaXplKSA+PiAxKSArICgoYnNpemUpID4+IDIpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCB4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWxfbWF4KGludCBic2l6ZSkKK3sKKwlyZXR1cm4gKCgoYnNpemUpID4+IDEpICsgKChic2l6ZSkgPj4gMikpOworfQogCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yMzcsMjMgKzIxNiwyNSBAQAogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKgotICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplIDwgWEZTX0xJVElOTyhtcCkuCisgKiBJbnRlcm5hbCByb3V0aW5lcyB3aGVuIGF0dHJpYnV0ZSBmb3JrIHNpemUgPCBYRlNfTElUSU5PKG1wKS4KICAqLwotaW50CXhmc19hdHRyX3Nob3J0Zm9ybV9jcmVhdGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLWludAl4ZnNfYXR0cl9zaG9ydGZvcm1fYWRkKHN0cnVjdCB4ZnNfZGFfYXJncyAqYWRkKTsKK3ZvaWQJeGZzX2F0dHJfc2hvcnRmb3JtX2NyZWF0ZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwordm9pZAl4ZnNfYXR0cl9zaG9ydGZvcm1fYWRkKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgaW50IGZvcmtvZmYpOwogaW50CXhmc19hdHRyX3Nob3J0Zm9ybV9sb29rdXAoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKIGludAl4ZnNfYXR0cl9zaG9ydGZvcm1fZ2V0dmFsdWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKIGludAl4ZnNfYXR0cl9zaG9ydGZvcm1fdG9fbGVhZihzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwotaW50CXhmc19hdHRyX3Nob3J0Zm9ybV9yZW1vdmUoc3RydWN0IHhmc19kYV9hcmdzICpyZW1vdmUpOworaW50CXhmc19hdHRyX3Nob3J0Zm9ybV9yZW1vdmUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKIGludAl4ZnNfYXR0cl9zaG9ydGZvcm1fbGlzdChzdHJ1Y3QgeGZzX2F0dHJfbGlzdF9jb250ZXh0ICpjb250ZXh0KTsKIGludAl4ZnNfYXR0cl9zaG9ydGZvcm1fYWxsZml0KHN0cnVjdCB4ZnNfZGFidWYgKmJwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCk7CitpbnQJeGZzX2F0dHJfc2hvcnRmb3JtX2J5dGVzZml0KHhmc19pbm9kZV90ICpkcCwgaW50IGJ5dGVzKTsKKwogCiAvKgotICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplID09IFhGU19MQlNJWkUobXApLgorICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBhdHRyaWJ1dGUgZm9yayBzaXplID09IFhGU19MQlNJWkUobXApLgogICovCiBpbnQJeGZzX2F0dHJfbGVhZl90b19ub2RlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CiBpbnQJeGZzX2F0dHJfbGVhZl90b19zaG9ydGZvcm0oc3RydWN0IHhmc19kYWJ1ZiAqYnAsCi0JCQkJCSAgc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKwkJCQkgICBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIGludCBmb3Jrb2ZmKTsKIGludAl4ZnNfYXR0cl9sZWFmX2NsZWFyZmxhZyhzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwogaW50CXhmc19hdHRyX2xlYWZfc2V0ZmxhZyhzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwogaW50CXhmc19hdHRyX2xlYWZfZmxpcGZsYWdzKHhmc19kYV9hcmdzX3QgKmFyZ3MpOwpAQCAtMjg5LDcgKzI3MCw3IEBACiB4ZnNfZGFoYXNoX3QJeGZzX2F0dHJfbGVhZl9sYXN0aGFzaChzdHJ1Y3QgeGZzX2RhYnVmICpicCwgaW50ICpjb3VudCk7CiBpbnQJeGZzX2F0dHJfbGVhZl9vcmRlcihzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmMV9icCwKIAkJCQkgICBzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmMl9icCk7Ci1pbnQJeGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgaW50IGJsb2Nrc2l6ZSwKK2ludAl4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoaW50IG5hbWVsZW4sIGludCB2YWx1ZWxlbiwgaW50IGJsb2Nrc2l6ZSwKIAkJCQkJaW50ICpsb2NhbCk7CiBpbnQJeGZzX2F0dHJfcm9sbHRyYW5zKHN0cnVjdCB4ZnNfdHJhbnMgKip0cmFuc3AsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX3NmLmggYi9mcy94ZnMveGZzX2F0dHJfc2YuaAppbmRleCBlZjdkMjk0Li5mZmVkNmNhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHJfc2YuaAorKysgYi9mcy94ZnMveGZzX2F0dHJfc2YuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19BVFRSX1NGX0hfXwogI2RlZmluZQlfX1hGU19BVFRSX1NGX0hfXwpAQCAtNzEsMzggKzU3LDE3IEBACiAJY2hhcgkJKm5hbWU7CQkvKiBuYW1lIHZhbHVlLCBwb2ludGVyIGludG8gYnVmZmVyICovCiB9IHhmc19hdHRyX3NmX3NvcnRfdDsKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQVRUUl9TRl9FTlRTSVpFX0JZTkFNRSkKLWludCB4ZnNfYXR0cl9zZl9lbnRzaXplX2J5bmFtZShpbnQgbmxlbiwgaW50IHZsZW4pOwotI2RlZmluZSBYRlNfQVRUUl9TRl9FTlRTSVpFX0JZTkFNRShubGVuLHZsZW4pCVwKLQl4ZnNfYXR0cl9zZl9lbnRzaXplX2J5bmFtZShubGVuLHZsZW4pCi0jZWxzZQogI2RlZmluZSBYRlNfQVRUUl9TRl9FTlRTSVpFX0JZTkFNRShubGVuLHZsZW4pCS8qIHNwYWNlIG5hbWUvdmFsdWUgdXNlcyAqLyBcCi0JKChpbnQpc2l6ZW9mKHhmc19hdHRyX3NmX2VudHJ5X3QpLTEgKyAobmxlbikrKHZsZW4pKQotI2VuZGlmCisJKCgoaW50KXNpemVvZih4ZnNfYXR0cl9zZl9lbnRyeV90KS0xICsgKG5sZW4pKyh2bGVuKSkpCiAjZGVmaW5lIFhGU19BVFRSX1NGX0VOVFNJWkVfTUFYCQkJLyogbWF4IHNwYWNlIGZvciBuYW1lJnZhbHVlICovIFwKIAkoKDEgPDwgKE5CQlkqKGludClzaXplb2YoX191aW50OF90KSkpIC0gMSkKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FUVFJfU0ZfRU5UU0laRSkKLWludCB4ZnNfYXR0cl9zZl9lbnRzaXplKHhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZXApOwotI2RlZmluZSBYRlNfQVRUUl9TRl9FTlRTSVpFKHNmZXApCXhmc19hdHRyX3NmX2VudHNpemUoc2ZlcCkKLSNlbHNlCiAjZGVmaW5lIFhGU19BVFRSX1NGX0VOVFNJWkUoc2ZlcCkJCS8qIHNwYWNlIGFuIGVudHJ5IHVzZXMgKi8gXAogCSgoaW50KXNpemVvZih4ZnNfYXR0cl9zZl9lbnRyeV90KS0xICsgKHNmZXApLT5uYW1lbGVuKyhzZmVwKS0+dmFsdWVsZW4pCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKQoteGZzX2F0dHJfc2ZfZW50cnlfdCAqeGZzX2F0dHJfc2ZfbmV4dGVudHJ5KHhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZXApOwotI2RlZmluZSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlcCkJeGZzX2F0dHJfc2ZfbmV4dGVudHJ5KHNmZXApCi0jZWxzZQogI2RlZmluZSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlcCkJCS8qIG5leHQgZW50cnkgaW4gc3RydWN0ICovIFwKLQkoKHhmc19hdHRyX3NmX2VudHJ5X3QgKikgXAotCQkoKGNoYXIgKikoc2ZlcCkgKyBYRlNfQVRUUl9TRl9FTlRTSVpFKHNmZXApKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQVRUUl9TRl9UT1RTSVpFKQotaW50IHhmc19hdHRyX3NmX3RvdHNpemUoc3RydWN0IHhmc19pbm9kZSAqZHApOwotI2RlZmluZSBYRlNfQVRUUl9TRl9UT1RTSVpFKGRwKQkJeGZzX2F0dHJfc2ZfdG90c2l6ZShkcCkKLSNlbHNlCisJKCh4ZnNfYXR0cl9zZl9lbnRyeV90ICopKChjaGFyICopKHNmZXApICsgWEZTX0FUVFJfU0ZfRU5UU0laRShzZmVwKSkpCiAjZGVmaW5lIFhGU19BVFRSX1NGX1RPVFNJWkUoZHApCQkJLyogdG90YWwgc3BhY2UgaW4gdXNlICovIFwKLQkoSU5UX0dFVCgoKHhmc19hdHRyX3Nob3J0Zm9ybV90ICopKChkcCktPmlfYWZwLT5pZl91MS5pZl9kYXRhKSktPmhkci50b3RzaXplLCBBUkNIX0NPTlZFUlQpKQotI2VuZGlmCisJKElOVF9HRVQoKCh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKQlcCisJCSgoZHApLT5pX2FmcC0+aWZfdTEuaWZfZGF0YSkpLT5oZHIudG90c2l6ZSwgQVJDSF9DT05WRVJUKSkKIAogI2lmIGRlZmluZWQoWEZTX0FUVFJfVFJBQ0UpCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19iZWhhdmlvci5jIGIvZnMveGZzL3hmc19iZWhhdmlvci5jCmluZGV4IDE2MDg4ZTEuLjk4ODBhZGEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYmVoYXZpb3IuYworKysgYi9mcy94ZnMveGZzX2JlaGF2aW9yLmMKQEAgLTEsMzQgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLwotICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpbmNsdWRlICJ4ZnMuaCIKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19iZWhhdmlvci5oIGIvZnMveGZzL3hmc19iZWhhdmlvci5oCmluZGV4IGQ1ZWQ1YTguLjJjZDg5YmIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYmVoYXZpb3IuaAorKysgYi9mcy94ZnMveGZzX2JlaGF2aW9yLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19CRUhBVklPUl9IX18KICNkZWZpbmUgX19YRlNfQkVIQVZJT1JfSF9fCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JpdC5jIGIvZnMveGZzL3hmc19iaXQuYwppbmRleCA3NmM5YWQzLi40M2JlNmE3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JpdC5jCisrKyBiL2ZzL3hmcy94ZnNfYml0LmMKQEAgLTEsNDUgKzEsMjkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQotLyoKLSAqIFhGUyBiaXQgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLCB1c2VkIGluIG5vbi1yZWFsdGltZSBjb2RlLgotICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKICNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogCisvKgorICogWEZTIGJpdCBtYW5pcHVsYXRpb24gcm91dGluZXMsIHVzZWQgaW4gbm9uLXJlYWx0aW1lIGNvZGUuCisgKi8KIAogI2lmbmRlZiBIQVZFX0FSQ0hfSElHSEJJVAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYml0LmggYi9mcy94ZnMveGZzX2JpdC5oCmluZGV4IDFlN2Y1N2QuLjBiYmU1NjggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYml0LmgKKysrIGIvZnMveGZzL3hmc19iaXQuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19CSVRfSF9fCiAjZGVmaW5lCV9fWEZTX0JJVF9IX18KQEAgLTM5LDMwICsyNSwyNiBAQAogLyoKICAqIG1hc2tzIHdpdGggbiBoaWdoL2xvdyBiaXRzIHNldCwgMzItYml0IHZhbHVlcyAmIDY0LWJpdCB2YWx1ZXMKICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUFTSzMySEkpCi1fX3VpbnQzMl90IHhmc19tYXNrMzJoaShpbnQgbik7CiAjZGVmaW5lCVhGU19NQVNLMzJISShuKQkJeGZzX21hc2szMmhpKG4pCi0jZWxzZQotI2RlZmluZQlYRlNfTUFTSzMySEkobikJCSgoX191aW50MzJfdCktMSA8PCAoMzIgLSAobikpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NQVNLNjRISSkKLV9fdWludDY0X3QgeGZzX21hc2s2NGhpKGludCBuKTsKK3N0YXRpYyBpbmxpbmUgX191aW50MzJfdCB4ZnNfbWFzazMyaGkoaW50IG4pCit7CisJcmV0dXJuIChfX3VpbnQzMl90KS0xIDw8ICgzMiAtIChuKSk7Cit9CiAjZGVmaW5lCVhGU19NQVNLNjRISShuKQkJeGZzX21hc2s2NGhpKG4pCi0jZWxzZQotI2RlZmluZQlYRlNfTUFTSzY0SEkobikJCSgoX191aW50NjRfdCktMSA8PCAoNjQgLSAobikpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NQVNLMzJMTykKLV9fdWludDMyX3QgeGZzX21hc2szMmxvKGludCBuKTsKK3N0YXRpYyBpbmxpbmUgX191aW50NjRfdCB4ZnNfbWFzazY0aGkoaW50IG4pCit7CisJcmV0dXJuIChfX3VpbnQ2NF90KS0xIDw8ICg2NCAtIChuKSk7Cit9CiAjZGVmaW5lCVhGU19NQVNLMzJMTyhuKQkJeGZzX21hc2szMmxvKG4pCi0jZWxzZQotI2RlZmluZQlYRlNfTUFTSzMyTE8obikJCSgoKF9fdWludDMyX3QpMSA8PCAobikpIC0gMSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUFTSzY0TE8pCi1fX3VpbnQ2NF90IHhmc19tYXNrNjRsbyhpbnQgbik7CitzdGF0aWMgaW5saW5lIF9fdWludDMyX3QgeGZzX21hc2szMmxvKGludCBuKQoreworCXJldHVybiAoKF9fdWludDMyX3QpMSA8PCAobikpIC0gMTsKK30KICNkZWZpbmUJWEZTX01BU0s2NExPKG4pCQl4ZnNfbWFzazY0bG8obikKLSNlbHNlCi0jZGVmaW5lCVhGU19NQVNLNjRMTyhuKQkJKCgoX191aW50NjRfdCkxIDw8IChuKSkgLSAxKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIF9fdWludDY0X3QgeGZzX21hc2s2NGxvKGludCBuKQoreworCXJldHVybiAoKF9fdWludDY0X3QpMSA8PCAobikpIC0gMTsKK30KIAogLyogR2V0IGhpZ2ggYml0IHNldCBvdXQgb2YgMzItYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldCAqLwogZXh0ZXJuIGludCB4ZnNfaGlnaGJpdDMyKF9fdWludDMyX3Qgdik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXAuYyBiL2ZzL3hmcy94ZnNfYm1hcC5jCmluZGV4IDNlNzZkZWYuLmU0MTVhNDYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcC5jCisrKyBiL2ZzL3hmcy94ZnNfYm1hcC5jCkBAIC0xLDY4ICsxLDUzIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLQotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKLSNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfZXh0ZnJlZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgotI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9sZWFmLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCkBAIC00MzgsNiArNDIzLDEyIEBACiAJaW50CQkJbnVtcmVjcywKIAlpbnQJCQkqY291bnQpOwogCitTVEFUSUMgaW50Cit4ZnNfYm1hcF9kaXNrX2NvdW50X2xlYXZlcygKKwl4ZnNfYm1idF9yZWNfdAkJKmZycCwKKwlpbnQJCQludW1yZWNzLAorCWludAkJCSpjb3VudCk7CisKIC8qCiAgKiBCbWFwIGludGVybmFsIHJvdXRpbmVzLgogICovCkBAIC0yNzcyLDggKzI3NjMsOCBAQAogCUFTU0VSVChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUyk7CiAJQVNTRVJUKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpOwogCXJibG9jayA9IGlmcC0+aWZfYnJvb3Q7Ci0JQVNTRVJUKElOVF9HRVQocmJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA9PSAxKTsKLQlBU1NFUlQoSU5UX0dFVChyYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gMSk7CisJQVNTRVJUKGJlMTZfdG9fY3B1KHJibG9jay0+YmJfbGV2ZWwpID09IDEpOworCUFTU0VSVChiZTE2X3RvX2NwdShyYmxvY2stPmJiX251bXJlY3MpID09IDEpOwogCUFTU0VSVChYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKGlmcC0+aWZfYnJvb3RfYnl0ZXMpID09IDEpOwogCW1wID0gaXAtPmlfbW91bnQ7CiAJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihyYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwpAQCAtMzIxNiwxMSArMzIwNywxMSBAQAogCSAqIEZpbGwgaW4gdGhlIHJvb3QuCiAJICovCiAJYmxvY2sgPSBpZnAtPmlmX2Jyb290OwotCUlOVF9TRVQoYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19CTUFQX01BR0lDKTsKLQlJTlRfU0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJULCAxKTsKLQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDEpOwotCUlOVF9TRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTERGU0JOTyk7Ci0JSU5UX1NFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTERGU0JOTyk7CisJYmxvY2stPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoWEZTX0JNQVBfTUFHSUMpOworCWJsb2NrLT5iYl9sZXZlbCA9IGNwdV90b19iZTE2KDEpOworCWJsb2NrLT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYoMSk7CisJYmxvY2stPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKKwlibG9jay0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKIAkvKgogCSAqIE5lZWQgYSBjdXJzb3IuICBDYW4ndCBhbGxvY2F0ZSB1bnRpbCBiYl9sZXZlbCBpcyBmaWxsZWQgaW4uCiAJICovCkBAIC0zMjczLDEwICszMjY0LDEwIEBACiAJICogRmlsbCBpbiB0aGUgY2hpbGQgYmxvY2suCiAJICovCiAJYWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGFicCk7Ci0JSU5UX1NFVChhYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19CTUFQX01BR0lDKTsKKwlhYmxvY2stPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoWEZTX0JNQVBfTUFHSUMpOwogCWFibG9jay0+YmJfbGV2ZWwgPSAwOwotCUlOVF9TRVQoYWJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExERlNCTk8pOwotCUlOVF9TRVQoYWJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJULCBOVUxMREZTQk5PKTsKKwlhYmxvY2stPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKKwlhYmxvY2stPmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlNjQoTlVMTERGU0JOTyk7CiAJYXJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGFibG9jaywgMSwgY3VyKTsKIAluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwogCWZvciAoZXAgPSBpZnAtPmlmX3UxLmlmX2V4dGVudHMsIGNudCA9IGkgPSAwOyBpIDwgbmV4dGVudHM7IGkrKywgZXArKykgewpAQCAtMzI4Niw4ICszMjc3LDggQEAKIAkJCWFycCsrOyBjbnQrKzsKIAkJfQogCX0KLQlJTlRfU0VUKGFibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBjbnQpOwotCUFTU0VSVChJTlRfR0VUKGFibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykpOworCUFTU0VSVChjbnQgPT0gWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspKTsKKwlhYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihjbnQpOwogCS8qCiAJICogRmlsbCBpbiB0aGUgcm9vdCBrZXkgYW5kIHBvaW50ZXIuCiAJICovCkBAIC0zMzAxLDcgKzMyOTIsNyBAQAogCSAqIHRoZSByb290IGlzIGF0IHRoZSByaWdodCBsZXZlbC4KIAkgKi8KIAl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBhYnAsIFhGU19CQl9BTExfQklUUyk7Ci0JeGZzX2JtYnRfbG9nX3JlY3MoY3VyLCBhYnAsIDEsIElOVF9HRVQoYWJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGFicCwgMSwgYmUxNl90b19jcHUoYWJsb2NrLT5iYl9udW1yZWNzKSk7CiAJQVNTRVJUKCpjdXJwID09IE5VTEwpOwogCSpjdXJwID0gY3VyOwogCSpsb2dmbGFnc3AgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRkJST09UKHdoaWNoZm9yayk7CkBAIC0zMzM3LDYgKzMzMjgsMjkgQEAKIH0KIAogLyoKKyAqIEhlbHBlciByb3V0aW5lIHRvIHJlc2V0IGlub2RlIGRpX2ZvcmtvZmYgZmllbGQgd2hlbiBzd2l0Y2hpbmcKKyAqIGF0dHJpYnV0ZSBmb3JrIGZyb20gbG9jYWwgdG8gZXh0ZW50IGZvcm1hdCAtIHdlIHJlc2V0IGl0IHdoZXJlCisgKiBwb3NzaWJsZSB0byBtYWtlIHNwYWNlIGF2YWlsYWJsZSBmb3IgaW5saW5lIGRhdGEgZm9yayBleHRlbnRzLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfZm9ya29mZl9yZXNldCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2lub2RlX3QJKmlwLAorCWludAkJd2hpY2hmb3JrKQoreworCWlmICh3aGljaGZvcmsgPT0gWEZTX0FUVFJfRk9SSyAmJgorCSAgICAoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfREVWKSAmJgorCSAgICAoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfVVVJRCkgJiYKKwkgICAgKChtcC0+bV9hdHRyb2Zmc2V0ID4+IDMpID4gaXAtPmlfZC5kaV9mb3Jrb2ZmKSkgeworCQlpcC0+aV9kLmRpX2ZvcmtvZmYgPSBtcC0+bV9hdHRyb2Zmc2V0ID4+IDM7CisJCWlwLT5pX2RmLmlmX2V4dF9tYXggPSBYRlNfSUZPUktfRFNJWkUoaXApIC8KKwkJCQkJKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwkJaXAtPmlfYWZwLT5pZl9leHRfbWF4ID0gWEZTX0lGT1JLX0FTSVpFKGlwKSAvCisJCQkJCSh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJfQorfQorCisvKgogICogQ29udmVydCBhIGxvY2FsIGZpbGUgdG8gYW4gZXh0ZW50cyBmaWxlLgogICogVGhpcyBjb2RlIGlzIG91dCBvZiBib3VuZHMgZm9yIGRhdGEgZm9ya3Mgb2YgcmVndWxhciBmaWxlcywKICAqIHNpbmNlIHRoZSBmaWxlIGRhdGEgbmVlZHMgdG8gZ2V0IGxvZ2dlZCBzbyB0aGluZ3Mgd2lsbCBzdGF5IGNvbnNpc3RlbnQuCkBAIC0zNDAzLDYgKzM0MTcsNyBAQAogCQltZW1jcHkoKGNoYXIgKilYRlNfQlVGX1BUUihicCksIGlmcC0+aWZfdTEuaWZfZGF0YSwKIAkJCWlmcC0+aWZfYnl0ZXMpOwogCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIDAsIGlmcC0+aWZfYnl0ZXMgLSAxKTsKKwkJeGZzX2JtYXBfZm9ya29mZl9yZXNldChhcmdzLm1wLCBpcCwgd2hpY2hmb3JrKTsKIAkJeGZzX2lkYXRhX3JlYWxsb2MoaXAsIC1pZnAtPmlmX2J5dGVzLCB3aGljaGZvcmspOwogCQl4ZnNfaWV4dF9yZWFsbG9jKGlwLCAxLCB3aGljaGZvcmspOwogCQllcCA9IGlmcC0+aWZfdTEuaWZfZXh0ZW50czsKQEAgLTM0MTMsOCArMzQyOCwxMCBAQAogCQlYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKGFyZ3MubXAsIHRwLCBpcCwKIAkJCVhGU19UUkFOU19EUV9CQ09VTlQsIDFMKTsKIAkJZmxhZ3MgfD0gWEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCUFTU0VSVChYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPT0gMCk7CisJCXhmc19ibWFwX2ZvcmtvZmZfcmVzZXQoaXAtPmlfbW91bnQsIGlwLCB3aGljaGZvcmspOworCX0KIAlpZnAtPmlmX2ZsYWdzICY9IH5YRlNfSUZJTkxJTkU7CiAJaWZwLT5pZl9mbGFncyB8PSBYRlNfSUZFWFRFTlRTOwogCVhGU19JRk9SS19GTVRfU0VUKGlwLCB3aGljaGZvcmssIFhGU19ESU5PREVfRk1UX0VYVEVOVFMpOwpAQCAtMzc5NiwyMiArMzgxMywyNCBAQAogaW50CQkJCQkJLyogZXJyb3IgY29kZSAqLwogeGZzX2JtYXBfYWRkX2F0dHJmb3JrKAogCXhmc19pbm9kZV90CQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCWludAkJCXJzdmQpCQkvKiBPSyB0byBhbGxvY2F0ZWQgcmVzZXJ2ZWQgYmxvY2tzIGluIHRyYW5zICovCisJaW50CQkJc2l6ZSwJCS8qIHNwYWNlIG5ldyBhdHRyaWJ1dGUgbmVlZHMgKi8KKwlpbnQJCQlyc3ZkKQkJLyogeGFjdCBtYXkgdXNlIHJlc2VydmVkIGJsa3MgKi8KIHsKLQlpbnQJCQlibGtzOwkJLyogc3BhY2UgcmVzZXJ2YXRpb24gKi8KLQlpbnQJCQljb21taXR0ZWQ7CS8qIHhhY3Rpb24gd2FzIGNvbW1pdHRlZCAqLwotCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCiAJeGZzX2ZzYmxvY2tfdAkJZmlyc3RibG9jazsJLyogMXN0IGJsb2NrL2FnIGFsbG9jYXRlZCAqLwogCXhmc19ibWFwX2ZyZWVfdAkJZmxpc3Q7CQkvKiBmcmVlZCBleHRlbnQgbGlzdCAqLwotCWludAkJCWxvZ2ZsYWdzOwkvKiBsb2dnaW5nIGZsYWdzICovCiAJeGZzX21vdW50X3QJCSptcDsJCS8qIG1vdW50IHN0cnVjdHVyZSAqLwotCXVuc2lnbmVkIGxvbmcJCXM7CQkvKiBzcGlubG9jayBzcGwgdmFsdWUgKi8KIAl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXVuc2lnbmVkIGxvbmcJCXM7CQkvKiBzcGlubG9jayBzcGwgdmFsdWUgKi8KKwlpbnQJCQlibGtzOwkJLyogc3BhY2UgcmVzZXJ2YXRpb24gKi8KKwlpbnQJCQl2ZXJzaW9uID0gMTsJLyogc3VwZXJibG9jayBhdHRyIHZlcnNpb24gKi8KKwlpbnQJCQljb21taXR0ZWQ7CS8qIHhhY3Rpb24gd2FzIGNvbW1pdHRlZCAqLworCWludAkJCWxvZ2ZsYWdzOwkvKiBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KIAorCUFTU0VSVChYRlNfSUZPUktfUShpcCkgPT0gMCk7CiAJQVNTRVJUKGlwLT5pX2RmLmlmX2V4dF9tYXggPT0KIAkgICAgICAgWEZTX0lGT1JLX0RTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOwotCWlmIChYRlNfSUZPUktfUShpcCkpCi0JCXJldHVybiAwOworCiAJbXAgPSBpcC0+aV9tb3VudDsKIAlBU1NFUlQoIVhGU19OT1RfRFFBVFRBQ0hFRChtcCwgaXApKTsKIAl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0FEREFGT1JLKTsKQEAgLTM4NTMsNyArMzg3MiwxMSBAQAogCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CiAJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgogCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6Ci0JCWlwLT5pX2QuZGlfZm9ya29mZiA9IG1wLT5tX2F0dHJvZmZzZXQgPj4gMzsKKwkJaXAtPmlfZC5kaV9mb3Jrb2ZmID0geGZzX2F0dHJfc2hvcnRmb3JtX2J5dGVzZml0KGlwLCBzaXplKTsKKwkJaWYgKCFpcC0+aV9kLmRpX2ZvcmtvZmYpCisJCQlpcC0+aV9kLmRpX2ZvcmtvZmYgPSBtcC0+bV9hdHRyb2Zmc2V0ID4+IDM7CisJCWVsc2UgaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0FUVFIpKQorCQkJdmVyc2lvbiA9IDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKQEAgLTM4OTAsMTIgKzM5MTMsMjIgQEAKIAkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIGxvZ2ZsYWdzKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IyOwotCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTQVRUUigmbXAtPm1fc2IpKSB7CisJaWYgKCFYRlNfU0JfVkVSU0lPTl9IQVNBVFRSKCZtcC0+bV9zYikgfHwKKwkgICAoIVhGU19TQl9WRVJTSU9OX0hBU0FUVFIyKCZtcC0+bV9zYikgJiYgdmVyc2lvbiA9PSAyKSkgeworCQlfX2ludDY0X3Qgc2JmaWVsZHMgPSAwOworCiAJCXMgPSBYRlNfU0JfTE9DSyhtcCk7CiAJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTQVRUUigmbXAtPm1fc2IpKSB7CiAJCQlYRlNfU0JfVkVSU0lPTl9BRERBVFRSKCZtcC0+bV9zYik7CisJCQlzYmZpZWxkcyB8PSBYRlNfU0JfVkVSU0lPTk5VTTsKKwkJfQorCQlpZiAoIVhGU19TQl9WRVJTSU9OX0hBU0FUVFIyKCZtcC0+bV9zYikgJiYgdmVyc2lvbiA9PSAyKSB7CisJCQlYRlNfU0JfVkVSU0lPTl9BRERBVFRSMigmbXAtPm1fc2IpOworCQkJc2JmaWVsZHMgfD0gKFhGU19TQl9WRVJTSU9OTlVNIHwgWEZTX1NCX0ZFQVRVUkVTMik7CisJCX0KKwkJaWYgKHNiZmllbGRzKSB7CiAJCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKLQkJCXhmc19tb2Rfc2IodHAsIFhGU19TQl9WRVJTSU9OTlVNKTsKKwkJCXhmc19tb2Rfc2IodHAsIHNiZmllbGRzKTsKIAkJfSBlbHNlCiAJCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKIAl9CkBAIC0zOTg4LDEzICs0MDIxLDE5IEBACiAJICogKGEgc2lnbmVkIDMyLWJpdCBudW1iZXIsIHhmc19leHRudW1fdCksIG9yIGJ5IGRpX2FuZXh0ZW50cwogCSAqIChhIHNpZ25lZCAxNi1iaXQgbnVtYmVyLCB4ZnNfYWV4dG51bV90KS4KIAkgKi8KLQltYXhsZWFmZW50cyA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgPyBNQVhFWFROVU0gOiBNQVhBRVhUTlVNOworCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgeworCQltYXhsZWFmZW50cyA9IE1BWEVYVE5VTTsKKwkJc3ogPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0FUVFIpID8KKwkJCW1wLT5tX2F0dHJvZmZzZXQgOiBYRlNfQk1EUl9TUEFDRV9DQUxDKE1JTkRCVFBUUlMpOworCX0gZWxzZSB7CisJCW1heGxlYWZlbnRzID0gTUFYQUVYVE5VTTsKKwkJc3ogPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0FUVFIpID8KKwkJCW1wLT5tX3NiLnNiX2lub2Rlc2l6ZSAtIG1wLT5tX2F0dHJvZmZzZXQgOgorCQkJWEZTX0JNRFJfU1BBQ0VfQ0FMQyhNSU5BQlRQVFJTKTsKKwl9CisJbWF4cm9vdHJlY3MgPSAoaW50KVhGU19CVFJFRV9CTE9DS19NQVhSRUNTKHN6LCB4ZnNfYm1kciwgMCk7CiAJbWlubGVhZnJlY3MgPSBtcC0+bV9ibWFwX2RtbnJbMF07CiAJbWlubm9kZXJlY3MgPSBtcC0+bV9ibWFwX2RtbnJbMV07Ci0Jc3ogPSAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspID8KLQkJbXAtPm1fYXR0cm9mZnNldCA6Ci0JCW1wLT5tX3NiLnNiX2lub2Rlc2l6ZSAtIG1wLT5tX2F0dHJvZmZzZXQ7Ci0JbWF4cm9vdHJlY3MgPSAoaW50KVhGU19CVFJFRV9CTE9DS19NQVhSRUNTKHN6LCB4ZnNfYm1kciwgMCk7CiAJbWF4YmxvY2tzID0gKG1heGxlYWZlbnRzICsgbWlubGVhZnJlY3MgLSAxKSAvIG1pbmxlYWZyZWNzOwogCWZvciAobGV2ZWwgPSAxOyBtYXhibG9ja3MgPiAxOyBsZXZlbCsrKSB7CiAJCWlmIChtYXhibG9ja3MgPD0gbWF4cm9vdHJlY3MpCkBAIC00MzMyLDggKzQzNzEsOCBAQAogCS8qCiAJICogUm9vdCBsZXZlbCBtdXN0IHVzZSBCTUFQX0JST09UX1BUUl9BRERSIG1hY3JvIHRvIGdldCBwdHIgb3V0LgogCSAqLwotCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApOwotCWxldmVsID0gSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCk7CisJbGV2ZWwgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbGV2ZWwpOworCUFTU0VSVChsZXZlbCA+IDApOwogCXBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwogCUFTU0VSVChJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKTsKIAlBU1NFUlQoWEZTX0ZTQl9UT19BR05PKG1wLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSkgPCBtcC0+bV9zYi5zYl9hZ2NvdW50KTsKQEAgLTQzNzYsNyArNDQxNSw3IEBACiAJCXhmc19leHRudW1fdAludW1fcmVjczsKIAogCi0JCW51bV9yZWNzID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJbnVtX3JlY3MgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7CiAJCWlmICh1bmxpa2VseShpICsgbnVtX3JlY3MgPiByb29tKSkgewogCQkJQVNTRVJUKGkgKyBudW1fcmVjcyA8PSByb29tKTsKIAkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LApAQCAtNDM5Myw3ICs0NDMyLDcgQEAKIAkJLyoKIAkJICogUmVhZC1haGVhZCB0aGUgbmV4dCBsZWFmIGJsb2NrLCBpZiBhbnkuCiAJCSAqLwotCQluZXh0Ym5vID0gSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCW5leHRibm8gPSBiZTY0X3RvX2NwdShibG9jay0+YmJfcmlnaHRzaWIpOwogCQlpZiAobmV4dGJubyAhPSBOVUxMRlNCTE9DSykKIAkJCXhmc19idHJlZV9yZWFkYV9idWZsKG1wLCBuZXh0Ym5vLCAxKTsKIAkJLyoKQEAgLTQ2NTAsNyArNDY4OSw3IEBACiAJfQogCWlmICh3ciAmJiAqZmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSykgewogCQlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkKLQkJCW1pbmxlZnQgPSBJTlRfR0VUKGlmcC0+aWZfYnJvb3QtPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpICsgMTsKKwkJCW1pbmxlZnQgPSBiZTE2X3RvX2NwdShpZnAtPmlmX2Jyb290LT5iYl9sZXZlbCkgKyAxOwogCQllbHNlCiAJCQltaW5sZWZ0ID0gMTsKIAl9IGVsc2UKQEAgLTU2OTIsMTIgKzU3MzEsMTMgQEAKIAkJCW91dC5ibXZfb2Zmc2V0ID0gWEZTX0ZTQl9UT19CQihtcCwgbWFwW2ldLmJyX3N0YXJ0b2ZmKTsKIAkJCW91dC5ibXZfbGVuZ3RoID0gWEZTX0ZTQl9UT19CQihtcCwgbWFwW2ldLmJyX2Jsb2NrY291bnQpOwogCQkJQVNTRVJUKG1hcFtpXS5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyk7Ci0JCQlpZiAocHJlYWxsb2NlZCAmJgotCQkJICAgIG1hcFtpXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLICYmCi0JCQkgICAgb3V0LmJtdl9vZmZzZXQgKyBvdXQuYm12X2xlbmd0aCA9PSBibXZlbmQpIHsKLQkJCQkvKgotCQkJCSAqIGNhbWUgdG8gaG9sZSBhdCBlbmQgb2YgZmlsZQotCQkJCSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcFtpXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHByZWFsbG9jZWQgJiYgb3V0LmJtdl9vZmZzZXQgKyBvdXQuYm12X2xlbmd0aCA9PSBibXZlbmQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLICkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FtZSB0byBob2xlIGF0IGVuZCBvZiBmaWxlIG9yIHRoZSBlbmQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIGZvcmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAJCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKIAkJCX0gZWxzZSB7CiAJCQkJb3V0LmJtdl9ibG9jayA9CkBAIC01OTI3LDEwICs1OTY3LDEwIEBACiAJeGZzX2JtYnRfcHRyX3QJCSpwcCwgKnRoaXNwYTsJLyogcG9pbnRlciB0byBibG9jayBhZGRyZXNzICovCiAJeGZzX2JtYnRfa2V5X3QJCSpwcmV2cCwgKmtleXA7CiAKLQlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPiAwKTsKKwlBU1NFUlQoYmUxNl90b19jcHUoYmxvY2stPmJiX2xldmVsKSA+IDApOwogCiAJcHJldnAgPSBOVUxMOwotCWZvciggaSA9IDE7IGkgPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTtpKyspIHsKKwlmb3IoIGkgPSAxOyBpIDw9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsgaSsrKSB7CiAJCWRteHIgPSBtcC0+bV9ibWFwX2RteHJbMF07CiAKIAkJaWYgKHJvb3QpIHsKQEAgLTU5NTUsNyArNTk5NSw3IEBACiAJCQlwcCA9IFhGU19CVFJFRV9QVFJfQUREUihtcC0+bV9zYi5zYl9ibG9ja3NpemUsCiAJCQkJeGZzX2JtYnQsIGJsb2NrLCBpLCBkbXhyKTsKIAkJfQotCQlmb3IgKGogPSBpKzE7IGogPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsgaisrKSB7CisJCWZvciAoaiA9IGkrMTsgaiA8PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7IGorKykgewogCQkJaWYgKHJvb3QpIHsKIAkJCQl0aGlzcGEgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgaiwgc3opOwogCQkJfSBlbHNlIHsKQEAgLTYwMDgsOCArNjA0OCw4IEBACiAJLyoKIAkgKiBSb290IGxldmVsIG11c3QgdXNlIEJNQVBfQlJPT1RfUFRSX0FERFIgbWFjcm8gdG8gZ2V0IHB0ciBvdXQuCiAJICovCi0JQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID4gMCk7Ci0JbGV2ZWwgPSBJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKTsKKwlsZXZlbCA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9sZXZlbCk7CisJQVNTRVJUKGxldmVsID4gMCk7CiAJeGZzX2NoZWNrX2Jsb2NrKGJsb2NrLCBtcCwgMSwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CiAJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgMSwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CiAJQVNTRVJUKElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpICE9IE5VTExERlNCTk8pOwpAQCAtNjA2OSwxMyArNjEwOSwxMyBAQAogCQl4ZnNfZXh0bnVtX3QJbnVtX3JlY3M7CiAKIAotCQludW1fcmVjcyA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCW51bV9yZWNzID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwogCiAJCS8qCiAJCSAqIFJlYWQtYWhlYWQgdGhlIG5leHQgbGVhZiBibG9jaywgaWYgYW55LgogCQkgKi8KIAotCQluZXh0Ym5vID0gSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCW5leHRibm8gPSBiZTY0X3RvX2NwdShibG9jay0+YmJfcmlnaHRzaWIpOwogCiAJCS8qCiAJCSAqIENoZWNrIGFsbCB0aGUgZXh0ZW50cyB0byBtYWtlIHN1cmUgdGhleSBhcmUgT0suCkBAIC02MTMxLDcgKzYxNzEsNyBAQAogCQl4ZnNfdHJhbnNfYnJlbHNlKE5VTEwsIGJwKTsKIGVycm9yX25vcmVsc2U6CiAJY21uX2VycihDRV9XQVJOLCAiJXM6IEJBRCBhZnRlciBidHJlZSBsZWF2ZXMgZm9yICVkIGV4dGVudHMiLAotCQlpLCBfX0ZVTkNUSU9OX18pOworCQlfX0ZVTkNUSU9OX18sIGkpOwogCXBhbmljKCIlczogQ09SUlVQVEVEIEJUUkVFIE9SIFNPTUVUSElORyIsIF9fRlVOQ1RJT05fXyk7CiAJcmV0dXJuOwogfQpAQCAtNjE3Miw4ICs2MjEyLDggQEAKIAkgKiBSb290IGxldmVsIG11c3QgdXNlIEJNQVBfQlJPT1RfUFRSX0FERFIgbWFjcm8gdG8gZ2V0IHB0ciBvdXQuCiAJICovCiAJYmxvY2sgPSBpZnAtPmlmX2Jyb290OwotCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApOwotCWxldmVsID0gSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCk7CisJbGV2ZWwgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbGV2ZWwpOworCUFTU0VSVChsZXZlbCA+IDApOwogCXBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwogCUFTU0VSVChJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKTsKIAlBU1NFUlQoWEZTX0ZTQl9UT19BR05PKG1wLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSkgPCBtcC0+bV9zYi5zYl9hZ2NvdW50KTsKQEAgLTYyMTgsMTQgKzYyNTgsMTQgQEAKIAogCWlmICgtLWxldmVsKSB7CiAJCS8qIE5vdCBhdCBub2RlIGFib3ZlIGxlYWZzLCBjb3VudCB0aGlzIGxldmVsIG9mIG5vZGVzICovCi0JCW5leHRibm8gPSBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJbmV4dGJubyA9IGJlNjRfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYik7CiAJCXdoaWxlIChuZXh0Ym5vICE9IE5VTExGU0JMT0NLKSB7CiAJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgdHAsIG5leHRibm8sCiAJCQkJMCwgJm5icCwgWEZTX0JNQVBfQlRSRUVfUkVGKSkpCiAJCQkJcmV0dXJuIGVycm9yOwogCQkJKmNvdW50ICs9IDE7CiAJCQluZXh0YmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0sobmJwKTsKLQkJCW5leHRibm8gPSBJTlRfR0VUKG5leHRibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCQluZXh0Ym5vID0gYmU2NF90b19jcHUobmV4dGJsb2NrLT5iYl9yaWdodHNpYik7CiAJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBuYnApOwogCQl9CiAKQEAgLTYyNDQsMTEgKzYyODQsMTEgQEAKIAl9IGVsc2UgewogCQkvKiBjb3VudCBhbGwgbGV2ZWwgMSBub2RlcyBhbmQgdGhlaXIgbGVhdmVzICovCiAJCWZvciAoOzspIHsKLQkJCW5leHRibm8gPSBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKLQkJCW51bXJlY3MgPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQkJbmV4dGJubyA9IGJlNjRfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYik7CisJCQludW1yZWNzID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwogCQkJZnJwID0gWEZTX0JUUkVFX1JFQ19BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKIAkJCQl4ZnNfYm1idCwgYmxvY2ssIDEsIG1wLT5tX2JtYXBfZG14clswXSk7Ci0JCQlpZiAodW5saWtlbHkoeGZzX2JtYXBfY291bnRfbGVhdmVzKGZycCwgbnVtcmVjcywgY291bnQpIDwgMCkpIHsKKwkJCWlmICh1bmxpa2VseSh4ZnNfYm1hcF9kaXNrX2NvdW50X2xlYXZlcyhmcnAsIG51bXJlY3MsIGNvdW50KSA8IDApKSB7CiAJCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOwogCQkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwX2NvdW50X3RyZWUoMikiLAogCQkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKQEAgLTYyODAsNiArNjMyMCwyMiBAQAogCWludAkJYjsKIAogCWZvciAoIGIgPSAxOyBiIDw9IG51bXJlY3M7IGIrKywgZnJwKyspCisJCSpjb3VudCArPSB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChmcnApOworCXJldHVybiAwOworfQorCisvKgorICogQ291bnQgbGVhZiBibG9ja3MgZ2l2ZW4gYSBwb2ludGVyIHRvIGFuIGV4dGVudCBsaXN0IG9yaWdpbmFsbHkgaW4gYnRyZWUgZm9ybWF0LgorICovCitpbnQKK3hmc19ibWFwX2Rpc2tfY291bnRfbGVhdmVzKAorCXhmc19ibWJ0X3JlY190CQkqZnJwLAorCWludAkJCW51bXJlY3MsCisJaW50CQkJKmNvdW50KQoreworCWludAkJYjsKKworCWZvciAoIGIgPSAxOyBiIDw9IG51bXJlY3M7IGIrKywgZnJwKyspCiAJCSpjb3VudCArPSB4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KGZycCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXAuaCBiL2ZzL3hmcy94ZnNfYm1hcC5oCmluZGV4IGU2ZDIyZWMuLjJlMDcxN2EgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcC5oCisrKyBiL2ZzL3hmcy94ZnNfYm1hcC5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfQk1BUF9IX18KICNkZWZpbmUJX19YRlNfQk1BUF9IX18KQEAgLTc3LDEyICs2MywxMSBAQAogCQkJCQkvKiBjb21iaW5lIGNvbnRpZy4gc3BhY2UgKi8KICNkZWZpbmUJWEZTX0JNQVBJX0NPTlRJRwkweDQwMAkvKiBtdXN0IGFsbG9jYXRlIG9ubHkgb25lIGV4dGVudCAqLwogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQSV9BRkxBRykKLWludCB4ZnNfYm1hcGlfYWZsYWcoaW50IHcpOwogI2RlZmluZQlYRlNfQk1BUElfQUZMQUcodykJeGZzX2JtYXBpX2FmbGFnKHcpCi0jZWxzZQotI2RlZmluZQlYRlNfQk1BUElfQUZMQUcodykJKCh3KSA9PSBYRlNfQVRUUl9GT1JLID8gWEZTX0JNQVBJX0FUVFJGT1JLIDogMCkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX2JtYXBpX2FmbGFnKGludCB3KQoreworCXJldHVybiAodyA9PSBYRlNfQVRUUl9GT1JLID8gWEZTX0JNQVBJX0FUVFJGT1JLIDogMCk7Cit9CiAKIC8qCiAgKiBTcGVjaWFsIHZhbHVlcyBmb3IgeGZzX2JtYnRfaXJlY190IGJyX3N0YXJ0YmxvY2sgZmllbGQuCkBAIC05MCwxNCArNzUsMTIgQEAKICNkZWZpbmUJREVMQVlTVEFSVEJMT0NLCQkoKHhmc19mc2Jsb2NrX3QpLTFMTCkKICNkZWZpbmUJSE9MRVNUQVJUQkxPQ0sJCSgoeGZzX2ZzYmxvY2tfdCktMkxMKQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0lOSVQpCi12b2lkIHhmc19ibWFwX2luaXQoeGZzX2JtYXBfZnJlZV90ICpmbHAsIHhmc19mc2Jsb2NrX3QgKmZicCk7CiAjZGVmaW5lCVhGU19CTUFQX0lOSVQoZmxwLGZicCkJeGZzX2JtYXBfaW5pdChmbHAsZmJwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0JNQVBfSU5JVChmbHAsZmJwKQlcCitzdGF0aWMgaW5saW5lIHZvaWQgeGZzX2JtYXBfaW5pdCh4ZnNfYm1hcF9mcmVlX3QgKmZscCwgeGZzX2ZzYmxvY2tfdCAqZmJwKQorewogCSgoZmxwKS0+eGJmX2ZpcnN0ID0gTlVMTCwgKGZscCktPnhiZl9jb3VudCA9IDAsIFwKLQkgKGZscCktPnhiZl9sb3cgPSAwLCAqKGZicCkgPSBOVUxMRlNCTE9DSykKLSNlbmRpZgorCQkoZmxwKS0+eGJmX2xvdyA9IDAsICooZmJwKSA9IE5VTExGU0JMT0NLKTsKK30KIAogLyoKICAqIEFyZ3VtZW50IHN0cnVjdHVyZSBmb3IgeGZzX2JtYXBfYWxsb2MuCkBAIC0xNTYsNyArMTM5LDggQEAKIGludAkJCQkJLyogZXJyb3IgY29kZSAqLwogeGZzX2JtYXBfYWRkX2F0dHJmb3JrKAogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCWludAkJCQkJcnN2ZCk7CS8qIGZsYWcgZm9yIHJlc2VydmVkIGJsb2NrIGFsbG9jYXRpb24gKi8KKwlpbnQJCQlzaXplLAkvKiBzcGFjZSBuZWVkZWQgZm9yIG5ldyBhdHRyaWJ1dGUgKi8KKwlpbnQJCQlyc3ZkKTsJLyogZmxhZyBmb3IgcmVzZXJ2ZWQgYmxvY2sgYWxsb2NhdGlvbiAqLwogCiAvKgogICogQWRkIHRoZSBleHRlbnQgdG8gdGhlIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlIGF0IHRyYW5zYWN0aW9uIGVuZC4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKaW5kZXggMDlhNzdiMS4uM2YxMzgzZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKQEAgLTEsNDEgKzEsMjYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCkBAIC00MywyMCArMjgsMTkgQEAKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgotI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgotI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19hbGxvYy5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgpAQCAtMzgyLDcgKzM2Niw3IEBACiAJCXJldHVybiAwOwogCX0KIAlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOwotCW51bXJlY3MgPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCW51bXJlY3MgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7CiAjaWZkZWYgREVCVUcKIAlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkgewogCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CkBAIC00MjcsNyArNDExLDcgQEAKIAkJfQogCX0KIAludW1yZWNzLS07Ci0JSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBudW1yZWNzKTsKKwlibG9jay0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KG51bXJlY3MpOwogCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGJwLCBYRlNfQkJfTlVNUkVDUyk7CiAJLyoKIAkgKiBXZSdyZSBhdCB0aGUgcm9vdCBsZXZlbC4KQEAgLTQ2Myw4ICs0NDcsOCBAQAogCQkqc3RhdCA9IDE7CiAJCXJldHVybiAwOwogCX0KLQlyYm5vID0gSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7Ci0JbGJubyA9IElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJcmJubyA9IGJlNjRfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYik7CisJbGJubyA9IGJlNjRfdG9fY3B1KGJsb2NrLT5iYl9sZWZ0c2liKTsKIAkvKgogCSAqIE9uZSBjaGlsZCBvZiByb290LCBuZWVkIHRvIGdldCBhIGNoYW5jZSB0byBjb3B5IGl0cyBjb250ZW50cwogCSAqIGludG8gdGhlIHJvb3QgYW5kIGRlbGV0ZSBpdC4gQ2FuJ3QgZ28gdXAgdG8gbmV4dCBsZXZlbCwKQEAgLTUwOCwxNSArNDkyLDE1IEBACiAJCQlnb3RvIGVycm9yMDsKIAkJfQogI2VuZGlmCi0JCWJubyA9IElOVF9HRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCk7Ci0JCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSA+PQorCQlibm8gPSBiZTY0X3RvX2NwdShyaWdodC0+YmJfbGVmdHNpYik7CisJCWlmIChiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgLSAxID49CiAJCSAgICBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXZlbCwgY3VyKSkgewogCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkgewogCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKIAkJCQlnb3RvIGVycm9yMDsKIAkJCX0KIAkJCWlmIChpKSB7Ci0JCQkJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQlBU1NFUlQoYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpID49CiAJCQkJICAgICAgIFhGU19CTUFQX0JMT0NLX0lNSU5SRUNTKGxldmVsLCB0Y3VyKSk7CiAJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwogCQkJCXRjdXIgPSBOVUxMOwpAQCAtNTMzLDcgKzUxNyw3IEBACiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KLQkJcnJlY3MgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlycmVjcyA9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKTsKIAkJaWYgKGxibm8gIT0gTlVMTEZTQkxPQ0spIHsKIAkJCWkgPSB4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwpAQCAtNTY0LDE1ICs1NDgsMTUgQEAKIAkJCWdvdG8gZXJyb3IwOwogCQl9CiAjZW5kaWYKLQkJYm5vID0gSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKLQkJaWYgKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIDEgPj0KKwkJYm5vID0gYmU2NF90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpOworCQlpZiAoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgLSAxID49CiAJCSAgICBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXZlbCwgY3VyKSkgewogCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3JzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkgewogCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKIAkJCQlnb3RvIGVycm9yMDsKIAkJCX0KIAkJCWlmIChpKSB7Ci0JCQkJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQlBU1NFUlQoYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpID49CiAJCQkJICAgICAgIFhGU19CTUFQX0JMT0NLX0lNSU5SRUNTKGxldmVsLCB0Y3VyKSk7CiAJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwogCQkJCXRjdXIgPSBOVUxMOwpAQCAtNTgzLDE0ICs1NjcsMTQgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQotCQlscmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJbHJlY3MgPSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKTsKIAl9CiAJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwogCXRjdXIgPSBOVUxMOwogCW1wID0gY3VyLT5iY19tcDsKIAlBU1NFUlQoYm5vICE9IE5VTExGU0JMT0NLKTsKIAlpZiAobGJubyAhPSBOVUxMRlNCTE9DSyAmJgotCSAgICBscmVjcyArIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPD0gWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkgICAgbHJlY3MgKyBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgPD0gWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKIAkJcmJubyA9IGJubzsKIAkJcmlnaHQgPSBibG9jazsKIAkJcmJwID0gYnA7CkBAIC02MDUsNyArNTg5LDcgQEAKIAkJCWdvdG8gZXJyb3IwOwogCQl9CiAJfSBlbHNlIGlmIChyYm5vICE9IE5VTExGU0JMT0NLICYmCi0JCSAgIHJyZWNzICsgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA8PQorCQkgICBycmVjcyArIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA8PQogCQkgICBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXZlbCwgY3VyKSkgewogCQlsYm5vID0gYm5vOwogCQlsZWZ0ID0gYmxvY2s7CkBAIC02MjAsNyArNjA0LDcgQEAKIAkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKIAkJCWdvdG8gZXJyb3IwOwogCQl9Ci0JCWxyZWNzID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlscmVjcyA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpOwogCX0gZWxzZSB7CiAJCWlmIChsZXZlbCA+IDAgJiYgKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpIHsKIAkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKQEAgLTYzMCw4ICs2MTQsOCBAQAogCQkqc3RhdCA9IDE7CiAJCXJldHVybiAwOwogCX0KLQludW1scmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKLQludW1ycmVjcyA9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJbnVtbHJlY3MgPSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKTsKKwludW1ycmVjcyA9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKTsKIAlpZiAobGV2ZWwgPiAwKSB7CiAJCWxrcCA9IFhGU19CTUFQX0tFWV9JQUREUihsZWZ0LCBudW1scmVjcyArIDEsIGN1cik7CiAJCWxwcCA9IFhGU19CTUFQX1BUUl9JQUREUihsZWZ0LCBudW1scmVjcyArIDEsIGN1cik7CkBAIC02NTUsMTIgKzYzOSwxMiBAQAogCQltZW1jcHkobHJwLCBycnAsIG51bXJyZWNzICogc2l6ZW9mKCpscnApKTsKIAkJeGZzX2JtYnRfbG9nX3JlY3MoY3VyLCBsYnAsIG51bWxyZWNzICsgMSwgbnVtbHJlY3MgKyBudW1ycmVjcyk7CiAJfQotCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBudW1ycmVjcyk7Ci0JbGVmdC0+YmJfcmlnaHRzaWIgPSByaWdodC0+YmJfcmlnaHRzaWI7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJYmUxNl9hZGQoJmxlZnQtPmJiX251bXJlY3MsIG51bXJyZWNzKTsKKwlsZWZ0LT5iYl9yaWdodHNpYiA9IHJpZ2h0LT5iYl9yaWdodHNpYjsKIAl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBsYnAsIFhGU19CQl9SSUdIVFNJQiB8IFhGU19CQl9OVU1SRUNTKTsKLQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKSB7CisJaWYgKGJlNjRfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKSAhPSBOVUxMREZTQk5PKSB7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBjdXItPmJjX3RwLAotCQkJCUlOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksCisJCQkJYmU2NF90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpLAogCQkJCTAsICZycmJwLCBYRlNfQk1BUF9CVFJFRV9SRUYpKSkgewogCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwogCQkJZ290byBlcnJvcjA7CkBAIC02NzAsNyArNjU0LDcgQEAKIAkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKIAkJCWdvdG8gZXJyb3IwOwogCQl9Ci0JCUlOVF9TRVQocnJibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBsYm5vKTsKKwkJcnJibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTY0KGxibm8pOwogCQl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBycmJwLCBYRlNfQkJfTEVGVFNJQik7CiAJfQogCXhmc19ibWFwX2FkZF9mcmVlKFhGU19EQUREUl9UT19GU0IobXAsIFhGU19CVUZfQUREUihyYnApKSwgMSwKQEAgLTcyNyw3ICs3MTEsNyBAQAogCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIDAsIGJwKSkpCiAJCXJldHVybiBlcnJvcjsKICNlbmRpZgotCWlmIChwdHIgPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIHx8IHB0ciA8PSAwKSB7CisJaWYgKHB0ciA+IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSB8fCBwdHIgPD0gMCkgewogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwogCX0KQEAgLTc4OCw3ICs3NzIsNyBAQAogCX0KIAlYRlNfU1RBVFNfSU5DKHhzX2JtYnRfaW5zcmVjKTsKIAlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOwotCW51bXJlY3MgPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCW51bXJlY3MgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7CiAjaWZkZWYgREVCVUcKIAlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkgewogCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CkBAIC04NzAsNyArODU0LDcgQEAKIAkJCX0KIAkJfQogCX0KLQludW1yZWNzID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwludW1yZWNzID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwogCWlmIChsZXZlbCA+IDApIHsKIAkJa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoYmxvY2ssIDEsIGN1cik7CiAJCXBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCAxLCBjdXIpOwpAQCAtODk3LDcgKzg4MSw3IEBACiAJCWtwW3B0ciAtIDFdID0ga2V5OwogCQlJTlRfU0VUKHBwW3B0ciAtIDFdLCBBUkNIX0NPTlZFUlQsICpibm9wKTsKIAkJbnVtcmVjcysrOwotCQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIG51bXJlY3MpOworCQlibG9jay0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KG51bXJlY3MpOwogCQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOwogCQl4ZnNfYm1idF9sb2dfcHRycyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOwogCX0gZWxzZSB7CkBAIC05MDYsNyArODkwLDcgQEAKIAkJCShudW1yZWNzIC0gcHRyICsgMSkgKiBzaXplb2YoKnJwKSk7CiAJCXJwW3B0ciAtIDFdID0gKnJlY3A7CiAJCW51bXJlY3MrKzsKLQkJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBudW1yZWNzKTsKKwkJYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihudW1yZWNzKTsKIAkJeGZzX2JtYnRfbG9nX3JlY3MoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKIAl9CiAJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgYnAsIFhGU19CQl9OVU1SRUNTKTsKQEAgLTk3MSw3ICs5NTUsNyBAQAogCS8qCiAJICogR2l2ZSB1cCBpZiB0aGUgcm9vdCBoYXMgbXVsdGlwbGUgY2hpbGRyZW4uCiAJICovCi0JaWYgKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgIT0gMSkgeworCWlmIChiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgIT0gMSkgewogCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTgyLDM3ICs5NjYsMzcgQEAKIAkgKi8KIAljYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWwgLSAxXTsKIAljYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soY2JwKTsKLQlpZiAoSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPiBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCWlmIChiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpID4gWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKIAkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CiAJCXJldHVybiAwOwogCX0KLQlBU1NFUlQoSU5UX0dFVChjYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTyk7Ci0JQVNTRVJUKElOVF9HRVQoY2Jsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKTsKKwlBU1NFUlQoYmU2NF90b19jcHUoY2Jsb2NrLT5iYl9sZWZ0c2liKSA9PSBOVUxMREZTQk5PKTsKKwlBU1NFUlQoYmU2NF90b19jcHUoY2Jsb2NrLT5iYl9yaWdodHNpYikgPT0gTlVMTERGU0JOTyk7CiAJaXAgPSBjdXItPmJjX3ByaXZhdGUuYi5pcDsKIAlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOwogCUFTU0VSVChYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXZlbCwgY3VyKSA9PQogCSAgICAgICBYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKGlmcC0+aWZfYnJvb3RfYnl0ZXMpKTsKLQlpID0gKGludCkoSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXZlbCwgY3VyKSk7CisJaSA9IChpbnQpKGJlMTZfdG9fY3B1KGNibG9jay0+YmJfbnVtcmVjcykgLSBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXZlbCwgY3VyKSk7CiAJaWYgKGkpIHsKIAkJeGZzX2lyb290X3JlYWxsb2MoaXAsIGksIGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CiAJCWJsb2NrID0gaWZwLT5pZl9icm9vdDsKIAl9Ci0JSU5UX01PRChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBpKTsKLQlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKGNibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJYmUxNl9hZGQoJmJsb2NrLT5iYl9udW1yZWNzLCBpKTsKKwlBU1NFUlQoYmxvY2stPmJiX251bXJlY3MgPT0gY2Jsb2NrLT5iYl9udW1yZWNzKTsKIAlrcCA9IFhGU19CTUFQX0tFWV9JQUREUihibG9jaywgMSwgY3VyKTsKIAlja3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoY2Jsb2NrLCAxLCBjdXIpOwotCW1lbWNweShrcCwgY2twLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCprcCkpOworCW1lbWNweShrcCwgY2twLCBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgKiBzaXplb2YoKmtwKSk7CiAJcHAgPSBYRlNfQk1BUF9QVFJfSUFERFIoYmxvY2ssIDEsIGN1cik7CiAJY3BwID0gWEZTX0JNQVBfUFRSX0lBRERSKGNibG9jaywgMSwgY3VyKTsKICNpZmRlZiBERUJVRwotCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGNibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJlMTZfdG9fY3B1KGNibG9jay0+YmJfbnVtcmVjcyk7IGkrKykgewogCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKGNwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwgLSAxKSkpIHsKIAkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKIAkJCXJldHVybiBlcnJvcjsKIAkJfQogCX0KICNlbmRpZgotCW1lbWNweShwcCwgY3BwLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpwcCkpOworCW1lbWNweShwcCwgY3BwLCBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnBwKSk7CiAJeGZzX2JtYXBfYWRkX2ZyZWUoWEZTX0RBRERSX1RPX0ZTQihjdXItPmJjX21wLCBYRlNfQlVGX0FERFIoY2JwKSksIDEsCiAJCQljdXItPmJjX3ByaXZhdGUuYi5mbGlzdCwgY3VyLT5iY19tcCk7CiAJaXAtPmlfZC5kaV9uYmxvY2tzLS07CkBAIC0xMDIwLDcgKzEwMDQsNyBAQAogCQkJWEZTX1RSQU5TX0RRX0JDT1VOVCwgLTFMKTsKIAl4ZnNfdHJhbnNfYmludmFsKGN1ci0+YmNfdHAsIGNicCk7CiAJY3VyLT5iY19idWZzW2xldmVsIC0gMV0gPSBOVUxMOwotCUlOVF9NT0QoYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQsIC0xKTsKKwliZTE2X2FkZCgmYmxvY2stPmJiX2xldmVsLCAtMSk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZShjdXItPmJjX3RwLCBpcCwKIAkJWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZCUk9PVChjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspKTsKIAljdXItPmJjX25sZXZlbHMtLTsKQEAgLTExNzYsNyArMTE2MCw3IEBACiAJCQllbHNlCiAJCQkJa3JiYXNlID0gWEZTX0JNQVBfUkVDX0lBRERSKGJsb2NrLCAxLCBjdXIpOwogCQkJbG93ID0gMTsKLQkJCWlmICghKGhpZ2ggPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSkgeworCQkJaWYgKCEoaGlnaCA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSkpIHsKIAkJCQlBU1NFUlQobGV2ZWwgPT0gMCk7CiAJCQkJY3VyLT5iY19wdHJzWzBdID0gZGlyICE9IFhGU19MT09LVVBfTEU7CiAJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CkBAIC0xMjIzLDggKzEyMDcsOCBAQAogCQkgKiBJZiBnZSBzZWFyY2ggYW5kIHdlIHdlbnQgb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBidXQgaXQncwogCQkgKiBub3QgdGhlIGxhc3QgYmxvY2ssIHdlJ3JlIGluIHRoZSB3cm9uZyBibG9jay4KIAkJICovCi0JCWlmIChkaXIgPT0gWEZTX0xPT0tVUF9HRSAmJiBrZXlubyA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgJiYKLQkJICAgIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExERlNCTk8pIHsKKwkJaWYgKGRpciA9PSBYRlNfTE9PS1VQX0dFICYmIGtleW5vID4gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpICYmCisJCSAgICBiZTY0X3RvX2NwdShibG9jay0+YmJfcmlnaHRzaWIpICE9IE5VTExERlNCTk8pIHsKIAkJCWN1ci0+YmNfcHRyc1swXSA9IGtleW5vOwogCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luY3JlbWVudChjdXIsIDAsICZpKSkpIHsKIAkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CkBAIC0xMjM5LDcgKzEyMjMsNyBAQAogCWVsc2UgaWYgKGRpciA9PSBYRlNfTE9PS1VQX0xFICYmIGRpZmYgPiAwKQogCQlrZXluby0tOwogCWN1ci0+YmNfcHRyc1swXSA9IGtleW5vOwotCWlmIChrZXlubyA9PSAwIHx8IGtleW5vID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCWlmIChrZXlubyA9PSAwIHx8IGtleW5vID4gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKSB7CiAJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwogCQkqc3RhdCA9IDA7CiAJfSBlbHNlIHsKQEAgLTEyOTYsNyArMTI4MCw3IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAjZW5kaWYKLQlpZiAoSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKSB7CisJaWYgKGJlNjRfdG9fY3B1KHJpZ2h0LT5iYl9sZWZ0c2liKSA9PSBOVUxMREZTQk5PKSB7CiAJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwpAQCAtMTMwNyw3ICsxMjkxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCW1wID0gY3VyLT5iY19tcDsKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgY3VyLT5iY190cCwgSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSwgMCwKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgY3VyLT5iY190cCwgYmU2NF90b19jcHUocmlnaHQtPmJiX2xlZnRzaWIpLCAwLAogCQkJJmxicCwgWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKIAkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwogCQlyZXR1cm4gZXJyb3I7CkBAIC0xMzE3LDEyICsxMzAxLDEyIEBACiAJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJaWYgKGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpID09IFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7CiAJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwogCX0KLQlscmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDE7CisJbHJlY3MgPSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSArIDE7CiAJaWYgKGxldmVsID4gMCkgewogCQlsa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIobGVmdCwgbHJlY3MsIGN1cik7CiAJCXJrcCA9IFhGU19CTUFQX0tFWV9JQUREUihyaWdodCwgMSwgY3VyKTsKQEAgLTEzNDQsNyArMTMyOCw3IEBACiAJCSpscnAgPSAqcnJwOwogCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGxicCwgbHJlY3MsIGxyZWNzKTsKIAl9Ci0JSU5UX1NFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIGxyZWNzKTsKKwlsZWZ0LT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYobHJlY3MpOwogCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGxicCwgWEZTX0JCX05VTVJFQ1MpOwogI2lmZGVmIERFQlVHCiAJaWYgKGxldmVsID4gMCkKQEAgLTEzNTIsOCArMTMzNiw4IEBACiAJZWxzZQogCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCBscnAgLSAxLCBscnApOwogI2VuZGlmCi0JcnJlY3MgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMTsKLQlJTlRfU0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIHJyZWNzKTsKKwlycmVjcyA9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAtIDE7CisJcmlnaHQtPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihycmVjcyk7CiAJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgcmJwLCBYRlNfQkJfTlVNUkVDUyk7CiAJaWYgKGxldmVsID4gMCkgewogI2lmZGVmIERFQlVHCkBAIC0xNDMwLDE4ICsxNDE0LDE4IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAjZW5kaWYKLQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKSB7CisJaWYgKGJlNjRfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKSA9PSBOVUxMREZTQk5PKSB7CiAJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+PSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+PSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSkgewogCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAJbXAgPSBjdXItPmJjX21wOwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBjdXItPmJjX3RwLCBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAwLAorCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBjdXItPmJjX3RwLCBiZTY0X3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYiksIDAsCiAJCQkmcmJwLCBYRlNfQk1BUF9CVFJFRV9SRUYpKSkgewogCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CiAJCXJldHVybiBlcnJvcjsKQEAgLTE0NTEsMjYgKzE0MzUsMjYgQEAKIAkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJaWYgKGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSA9PSBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXZlbCwgY3VyKSkgewogCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGxldmVsID4gMCkgewotCQlsa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOwotCQlscHAgPSBYRlNfQk1BUF9QVFJfSUFERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlsa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIobGVmdCwgYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyksIGN1cik7CisJCWxwcCA9IFhGU19CTUFQX1BUUl9JQUREUihsZWZ0LCBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSwgY3VyKTsKIAkJcmtwID0gWEZTX0JNQVBfS0VZX0lBRERSKHJpZ2h0LCAxLCBjdXIpOwogCQlycHAgPSBYRlNfQk1BUF9QVFJfSUFERFIocmlnaHQsIDEsIGN1cik7CiAjaWZkZWYgREVCVUcKLQkJZm9yIChpID0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWZvciAoaSA9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKHJwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkgewogCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCQl9CiAJCX0KICNlbmRpZgotCQltZW1tb3ZlKHJrcCArIDEsIHJrcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcmtwKSk7Ci0JCW1lbW1vdmUocnBwICsgMSwgcnBwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycHApKTsKKwkJbWVtbW92ZShya3AgKyAxLCBya3AsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcmtwKSk7CisJCW1lbW1vdmUocnBwICsgMSwgcnBwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJwcCkpOwogI2lmZGVmIERFQlVHCiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQoKmxwcCwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkgewogCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwpAQCAtMTQ3OSwyMSArMTQ2MywyMSBAQAogI2VuZGlmCiAJCSpya3AgPSAqbGtwOwogCQkqcnBwID0gKmxwcDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KLQkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKTsKLQkJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKTsKKwkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSArIDEpOworCQl4ZnNfYm1idF9sb2dfcHRycyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMSk7CiAJfSBlbHNlIHsKLQkJbHJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwkJbHJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGxlZnQsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpLCBjdXIpOwogCQlycnAgPSBYRlNfQk1BUF9SRUNfSUFERFIocmlnaHQsIDEsIGN1cik7Ci0JCW1lbW1vdmUocnJwICsgMSwgcnJwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKKwkJbWVtbW92ZShycnAgKyAxLCBycnAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnJwKSk7CiAJCSpycnAgPSAqbHJwOwotCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMSk7CiAJCUlOVF9TRVQoa2V5LmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQsCiAJCQl4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihycnApKTsKIAkJcmtwID0gJmtleTsKIAl9Ci0JSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIC0xKTsKKwliZTE2X2FkZCgmbGVmdC0+YmJfbnVtcmVjcywgLTEpOwogCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGxicCwgWEZTX0JCX05VTVJFQ1MpOwotCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOworCWJlMTZfYWRkKCZyaWdodC0+YmJfbnVtcmVjcywgMSk7CiAjaWZkZWYgREVCVUcKIAlpZiAobGV2ZWwgPiAwKQogCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KFhGU19CVE5VTV9CTUFQLCBya3AsIHJrcCArIDEpOwpAQCAtMTYyNCw0NyArMTYwOCw0NyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogI2VuZGlmCi0JSU5UX1NFVChyaWdodC0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0JNQVBfTUFHSUMpOwotCXJpZ2h0LT5iYl9sZXZlbCA9IGxlZnQtPmJiX2xldmVsOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLwotCUlOVF9TRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKF9fdWludDE2X3QpKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAvIDIpKTsKLQlpZiAoKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAmIDEpICYmCi0JICAgIGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpCi0JCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOwotCWkgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMTsKKwlyaWdodC0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfQk1BUF9NQUdJQyk7CisJcmlnaHQtPmJiX2xldmVsID0gbGVmdC0+YmJfbGV2ZWw7CisJcmlnaHQtPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSAvIDIpOworCWlmICgoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgJiAxKSAmJgorCSAgICBjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSArIDEpCisJCWJlMTZfYWRkKCZyaWdodC0+YmJfbnVtcmVjcywgMSk7CisJaSA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpIC0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMTsKIAlpZiAobGV2ZWwgPiAwKSB7CiAJCWxrcCA9IFhGU19CTUFQX0tFWV9JQUREUihsZWZ0LCBpLCBjdXIpOwogCQlscHAgPSBYRlNfQk1BUF9QVFJfSUFERFIobGVmdCwgaSwgY3VyKTsKIAkJcmtwID0gWEZTX0JNQVBfS0VZX0lBRERSKHJpZ2h0LCAxLCBjdXIpOwogCQlycHAgPSBYRlNfQk1BUF9QVFJfSUFERFIocmlnaHQsIDEsIGN1cik7CiAjaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOyBpKyspIHsKIAkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQobHBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKSB7CiAJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwogCQkJCXJldHVybiBlcnJvcjsKIAkJCX0KIAkJfQogI2VuZGlmCi0JCW1lbWNweShya3AsIGxrcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcmtwKSk7Ci0JCW1lbWNweShycHAsIGxwcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnBwKSk7Ci0JCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKLQkJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQltZW1jcHkocmtwLCBsa3AsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcmtwKSk7CisJCW1lbWNweShycHAsIGxwcCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpycHApKTsKKwkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSk7CisJCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwogCQlrZXlwLT5icl9zdGFydG9mZiA9IElOVF9HRVQocmtwLT5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJUKTsKIAl9IGVsc2UgewogCQlscnAgPSBYRlNfQk1BUF9SRUNfSUFERFIobGVmdCwgaSwgY3VyKTsKIAkJcnJwID0gWEZTX0JNQVBfUkVDX0lBRERSKHJpZ2h0LCAxLCBjdXIpOwotCQltZW1jcHkocnJwLCBscnAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJycCkpOwotCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCW1lbWNweShycnAsIGxycCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpycnApKTsKKwkJeGZzX2JtYnRfbG9nX3JlY3MoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSk7CiAJCWtleXAtPmJyX3N0YXJ0b2ZmID0geGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocnJwKTsKIAl9Ci0JSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIC0oSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkpOwotCXJpZ2h0LT5iYl9yaWdodHNpYiA9IGxlZnQtPmJiX3JpZ2h0c2liOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLwotCUlOVF9TRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgYXJncy5mc2Jubyk7Ci0JSU5UX1NFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBsYm5vKTsKKwliZTE2X2FkZCgmbGVmdC0+YmJfbnVtcmVjcywgLShiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpKTsKKwlyaWdodC0+YmJfcmlnaHRzaWIgPSBsZWZ0LT5iYl9yaWdodHNpYjsKKwlsZWZ0LT5iYl9yaWdodHNpYiA9IGNwdV90b19iZTY0KGFyZ3MuZnNibm8pOworCXJpZ2h0LT5iYl9sZWZ0c2liID0gY3B1X3RvX2JlNjQobGJubyk7CiAJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgcmJwLCBYRlNfQkJfQUxMX0JJVFMpOwogCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGxicCwgWEZTX0JCX05VTVJFQ1MgfCBYRlNfQkJfUklHSFRTSUIpOwotCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKSB7CisJaWYgKGJlNjRfdG9fY3B1KHJpZ2h0LT5iYl9yaWdodHNpYikgIT0gTlVMTERGU0JOTykgewogCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChhcmdzLm1wLCBhcmdzLnRwLAotCQkJCUlOVF9HRVQocmlnaHQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAwLCAmcnJicCwKKwkJCQliZTY0X3RvX2NwdShyaWdodC0+YmJfcmlnaHRzaWIpLCAwLCAmcnJicCwKIAkJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkgewogCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwogCQkJcmV0dXJuIGVycm9yOwpAQCAtMTY3NCwxMiArMTY1OCwxMiBAQAogCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwogCQkJcmV0dXJuIGVycm9yOwogCQl9Ci0JCUlOVF9TRVQocnJibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBhcmdzLmZzYm5vKTsKKwkJcnJibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTY0KGFyZ3MuZnNibm8pOwogCQl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBycmJwLCBYRlNfQkJfTEVGVFNJQik7CiAJfQotCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID4gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSkgeworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID4gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgKyAxKSB7CiAJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgcmJwKTsKLQkJY3VyLT5iY19wdHJzW2xldmVsXSAtPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWN1ci0+YmNfcHRyc1tsZXZlbF0gLT0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7CiAJfQogCWlmIChsZXZlbCArIDEgPCBjdXItPmJjX25sZXZlbHMpIHsKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgY3VycCkpKSB7CkBAIC0xNzUxLDE4ICsxNzM1LDE4IEBACiAJeGZzX2JtYnRfa2V5X3QJCSp0a3A7CiAJeGZzX2JtYnRfcHRyX3QJCSp0cHA7CiAKLQlJTlRfU0VUKHJibG9jay0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0JNQVBfTUFHSUMpOwotCXJibG9jay0+YmJfbGV2ZWwgPSBkYmxvY2stPmJiX2xldmVsOwkvKiBib3RoIGluIG9uLWRpc2sgZm9ybWF0ICovCi0JQVNTRVJUKElOVF9HRVQocmJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApOwotCXJibG9jay0+YmJfbnVtcmVjcyA9IGRibG9jay0+YmJfbnVtcmVjczsvKiBib3RoIGluIG9uLWRpc2sgZm9ybWF0ICovCi0JSU5UX1NFVChyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTERGU0JOTyk7Ci0JSU5UX1NFVChyYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExERlNCTk8pOworCXJibG9jay0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfQk1BUF9NQUdJQyk7CisJcmJsb2NrLT5iYl9sZXZlbCA9IGRibG9jay0+YmJfbGV2ZWw7CisJQVNTRVJUKGJlMTZfdG9fY3B1KHJibG9jay0+YmJfbGV2ZWwpID4gMCk7CisJcmJsb2NrLT5iYl9udW1yZWNzID0gZGJsb2NrLT5iYl9udW1yZWNzOworCXJibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTY0KE5VTExERlNCTk8pOworCXJibG9jay0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKIAlkbXhyID0gKGludClYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhkYmxvY2tsZW4sIHhmc19ibWRyLCAwKTsKIAlma3AgPSBYRlNfQlRSRUVfS0VZX0FERFIoZGJsb2NrbGVuLCB4ZnNfYm1kciwgZGJsb2NrLCAxLCBkbXhyKTsKIAl0a3AgPSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihyYmxvY2ssIDEsIHJibG9ja2xlbik7CiAJZnBwID0gWEZTX0JUUkVFX1BUUl9BRERSKGRibG9ja2xlbiwgeGZzX2JtZHIsIGRibG9jaywgMSwgZG14cik7CiAJdHBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIocmJsb2NrLCAxLCByYmxvY2tsZW4pOwotCWRteHIgPSBJTlRfR0VUKGRibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwlkbXhyID0gYmUxNl90b19jcHUoZGJsb2NrLT5iYl9udW1yZWNzKTsKIAltZW1jcHkodGtwLCBma3AsIHNpemVvZigqZmtwKSAqIGRteHIpOwogCW1lbWNweSh0cHAsIGZwcCwgc2l6ZW9mKCpmcHApICogZG14cik7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCiB9CkBAIC0xODA1LDcgKzE3ODksNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogI2VuZGlmCi0JaWYgKElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTykgeworCWlmIChiZTY0X3RvX2NwdShibG9jay0+YmJfbGVmdHNpYikgPT0gTlVMTERGU0JOTykgewogCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKQEAgLTE4MzcsNyArMTgyMSw3IEBACiAJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CiAJCQlyZXR1cm4gZXJyb3I7CiAJCX0KLQkJY3VyLT5iY19wdHJzW2xldl0gPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQljdXItPmJjX3B0cnNbbGV2XSA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKIAl9CiAJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CiAJKnN0YXQgPSAxOwpAQCAtMjEyMywxMiArMjEwNywxMiBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogI2VuZGlmCi0JaWYgKCsrY3VyLT5iY19wdHJzW2xldmVsXSA8PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJaWYgKCsrY3VyLT5iY19wdHJzW2xldmVsXSA8PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpIHsKIAkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CiAJCSpzdGF0ID0gMTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKSB7CisJaWYgKGJlNjRfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgPT0gTlVMTERGU0JOTykgewogCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKQEAgLTIxNDEsNyArMjEyNSw3IEBACiAJCQlyZXR1cm4gZXJyb3I7CiAJCX0KICNlbmRpZgotCQlpZiAoKytjdXItPmJjX3B0cnNbbGV2XSA8PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKQorCQlpZiAoKytjdXItPmJjX3B0cnNbbGV2XSA8PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpCiAJCQlicmVhazsKIAkJaWYgKGxldiA8IGN1ci0+YmNfbmxldmVscyAtIDEpCiAJCQl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2LCBYRlNfQlRDVVJfUklHSFRSQSk7CkBAIC0yNDAzLDIzICsyMzg3LDIzIEBACiAJYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZmwoYXJncy5tcCwgY3VyLT5iY190cCwgYXJncy5mc2JubywgMCk7CiAJY2Jsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKIAkqY2Jsb2NrID0gKmJsb2NrOwotCUlOVF9NT0QoYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQsICsxKTsKLQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDEpOworCWJlMTZfYWRkKCZibG9jay0+YmJfbGV2ZWwsIDEpOworCWJsb2NrLT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYoMSk7CiAJY3VyLT5iY19ubGV2ZWxzKys7CiAJY3VyLT5iY19wdHJzW2xldmVsICsgMV0gPSAxOwogCWtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGJsb2NrLCAxLCBjdXIpOwogCWNrcCA9IFhGU19CTUFQX0tFWV9JQUREUihjYmxvY2ssIDEsIGN1cik7Ci0JbWVtY3B5KGNrcCwga3AsIElOVF9HRVQoY2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCprcCkpOworCW1lbWNweShja3AsIGtwLCBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpICogc2l6ZW9mKCprcCkpOwogCWNwcCA9IFhGU19CTUFQX1BUUl9JQUREUihjYmxvY2ssIDEsIGN1cik7CiAjaWZkZWYgREVCVUcKLQlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpOyBpKyspIHsKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVChwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkgewogCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwogCQkJcmV0dXJuIGVycm9yOwogCQl9CiAJfQogI2VuZGlmCi0JbWVtY3B5KGNwcCwgcHAsIElOVF9HRVQoY2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpwcCkpOworCW1lbWNweShjcHAsIHBwLCBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpICogc2l6ZW9mKCpwcCkpOwogI2lmZGVmIERFQlVHCiAJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgKHhmc19ibWJ0X3B0cl90KWFyZ3MuZnNibm8sCiAJCQlsZXZlbCkpKSB7CkBAIC0yNDI4LDcgKzI0MTIsNyBAQAogCX0KICNlbmRpZgogCUlOVF9TRVQoKnBwLCBBUkNIX0NPTlZFUlQsIGFyZ3MuZnNibm8pOwotCXhmc19pcm9vdF9yZWFsbG9jKGN1ci0+YmNfcHJpdmF0ZS5iLmlwLCAxIC0gSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksCisJeGZzX2lyb290X3JlYWxsb2MoY3VyLT5iY19wcml2YXRlLmIuaXAsIDEgLSBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpLAogCQljdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOwogCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgYnApOwogCS8qCkBAIC0yNDM2LDggKzI0MjAsOCBAQAogCSAqIHRoZSByb290IGlzIGF0IHRoZSByaWdodCBsZXZlbC4KIAkgKi8KIAl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBicCwgWEZTX0JCX0FMTF9CSVRTKTsKLQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIGJwLCAxLCBJTlRfR0VUKGNibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7Ci0JeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCBicCwgMSwgSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgYnAsIDEsIGJlMTZfdG9fY3B1KGNibG9jay0+YmJfbnVtcmVjcykpOworCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgYnAsIDEsIGJlMTZfdG9fY3B1KGNibG9jay0+YmJfbnVtcmVjcykpOwogCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwogCSpsb2dmbGFncyB8PQogCQlYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRkJST09UKGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CkBAIC0yNzA1LDE4ICsyNjg5LDE4IEBACiAJeGZzX2JtYnRfa2V5X3QJCSp0a3A7CiAJeGZzX2JtYnRfcHRyX3QJCSp0cHA7CiAKLQlBU1NFUlQoSU5UX0dFVChyYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19CTUFQX01BR0lDKTsKLQlBU1NFUlQoSU5UX0dFVChyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTyk7Ci0JQVNTRVJUKElOVF9HRVQocmJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKTsKLQlBU1NFUlQoSU5UX0dFVChyYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID4gMCk7Ci0JZGJsb2NrLT5iYl9sZXZlbCA9IHJibG9jay0+YmJfbGV2ZWw7CS8qIGJvdGggaW4gb24tZGlzayBmb3JtYXQgKi8KLQlkYmxvY2stPmJiX251bXJlY3MgPSByYmxvY2stPmJiX251bXJlY3M7LyogYm90aCBpbiBvbi1kaXNrIGZvcm1hdCAqLworCUFTU0VSVChiZTMyX3RvX2NwdShyYmxvY2stPmJiX21hZ2ljKSA9PSBYRlNfQk1BUF9NQUdJQyk7CisJQVNTRVJUKGJlNjRfdG9fY3B1KHJibG9jay0+YmJfbGVmdHNpYikgPT0gTlVMTERGU0JOTyk7CisJQVNTRVJUKGJlNjRfdG9fY3B1KHJibG9jay0+YmJfcmlnaHRzaWIpID09IE5VTExERlNCTk8pOworCUFTU0VSVChiZTE2X3RvX2NwdShyYmxvY2stPmJiX2xldmVsKSA+IDApOworCWRibG9jay0+YmJfbGV2ZWwgPSByYmxvY2stPmJiX2xldmVsOworCWRibG9jay0+YmJfbnVtcmVjcyA9IHJibG9jay0+YmJfbnVtcmVjczsKIAlkbXhyID0gKGludClYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhkYmxvY2tsZW4sIHhmc19ibWRyLCAwKTsKIAlma3AgPSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihyYmxvY2ssIDEsIHJibG9ja2xlbik7CiAJdGtwID0gWEZTX0JUUkVFX0tFWV9BRERSKGRibG9ja2xlbiwgeGZzX2JtZHIsIGRibG9jaywgMSwgZG14cik7CiAJZnBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIocmJsb2NrLCAxLCByYmxvY2tsZW4pOwogCXRwcCA9IFhGU19CVFJFRV9QVFJfQUREUihkYmxvY2tsZW4sIHhmc19ibWRyLCBkYmxvY2ssIDEsIGRteHIpOwotCWRteHIgPSBJTlRfR0VUKGRibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwlkbXhyID0gYmUxNl90b19jcHUoZGJsb2NrLT5iYl9udW1yZWNzKTsKIAltZW1jcHkodGtwLCBma3AsIHNpemVvZigqZmtwKSAqIGRteHIpOwogCW1lbWNweSh0cHAsIGZwcCwgc2l6ZW9mKCpmcHApICogZG14cik7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5oCmluZGV4IDJjZjRmZTQuLmUwOTVhMmQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5oCisrKyBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDItMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDItMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19CTUFQX0JUUkVFX0hfXwogI2RlZmluZSBfX1hGU19CTUFQX0JUUkVFX0hfXwpAQCAtNDIsMTAgKzI4LDkgQEAKIC8qCiAgKiBCbWFwIHJvb3QgaGVhZGVyLCBvbi1kaXNrIGZvcm0gb25seS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2JtZHJfYmxvY2sKLXsKLQlfX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLwotCV9fdWludDE2X3QJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtZHJfYmxvY2sgeworCV9fYmUxNgkJYmJfbGV2ZWw7CS8qIDAgaXMgYSBsZWFmICovCisJX19iZTE2CQliYl9udW1yZWNzOwkvKiBjdXJyZW50ICMgb2YgZGF0YSByZWNvcmRzICovCiB9IHhmc19ibWRyX2Jsb2NrX3Q7CiAKIC8qCkBAIC0xMTQsMzEgKzk5LDMxIEBACiAJKCgoKCh4ZnNfZnNibG9ja190KTEpIDw8IFNUQVJUQkxPQ0tNQVNLQklUUykgLSAxKSA8PCBTVEFSVEJMT0NLVkFMQklUUykKICNkZWZpbmUgRFNUQVJUQkxPQ0tNQVNLCQlcCiAJKCgoKCh4ZnNfZGZzYm5vX3QpMSkgPDwgRFNUQVJUQkxPQ0tNQVNLQklUUykgLSAxKSA8PCBTVEFSVEJMT0NLVkFMQklUUykKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fSVNOVUxMU1RBUlRCTE9DSykKLWludCBpc251bGxzdGFydGJsb2NrKHhmc19mc2Jsb2NrX3QgeCk7CisKICNkZWZpbmUgSVNOVUxMU1RBUlRCTE9DSyh4KQlpc251bGxzdGFydGJsb2NrKHgpCi0jZWxzZQotI2RlZmluZSBJU05VTExTVEFSVEJMT0NLKHgpCSgoKHgpICYgU1RBUlRCTE9DS01BU0spID09IFNUQVJUQkxPQ0tNQVNLKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX0lTTlVMTERTVEFSVEJMT0NLKQotaW50IGlzbnVsbGRzdGFydGJsb2NrKHhmc19kZnNibm9fdCB4KTsKK3N0YXRpYyBpbmxpbmUgaW50IGlzbnVsbHN0YXJ0YmxvY2soeGZzX2ZzYmxvY2tfdCB4KQoreworCXJldHVybiAoKHgpICYgU1RBUlRCTE9DS01BU0spID09IFNUQVJUQkxPQ0tNQVNLOworfQorCiAjZGVmaW5lIElTTlVMTERTVEFSVEJMT0NLKHgpCWlzbnVsbGRzdGFydGJsb2NrKHgpCi0jZWxzZQotI2RlZmluZSBJU05VTExEU1RBUlRCTE9DSyh4KQkoKCh4KSAmIERTVEFSVEJMT0NLTUFTSykgPT0gRFNUQVJUQkxPQ0tNQVNLKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX05VTExTVEFSVEJMT0NLKQoteGZzX2ZzYmxvY2tfdCBudWxsc3RhcnRibG9jayhpbnQgayk7CitzdGF0aWMgaW5saW5lIGludCBpc251bGxkc3RhcnRibG9jayh4ZnNfZGZzYm5vX3QgeCkKK3sKKwlyZXR1cm4gKCh4KSAmIERTVEFSVEJMT0NLTUFTSykgPT0gRFNUQVJUQkxPQ0tNQVNLOworfQorCiAjZGVmaW5lIE5VTExTVEFSVEJMT0NLKGspCW51bGxzdGFydGJsb2NrKGspCi0jZWxzZQotI2RlZmluZSBOVUxMU1RBUlRCTE9DSyhrKQlcCi0JKChBU1NFUlQoayA8ICgxIDw8IFNUQVJUQkxPQ0tWQUxCSVRTKSkpLCAoU1RBUlRCTE9DS01BU0sgfCAoaykpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1NUQVJUQkxPQ0tWQUwpCi14ZnNfZmlsYmxrc190IHN0YXJ0YmxvY2t2YWwoeGZzX2ZzYmxvY2tfdCB4KTsKK3N0YXRpYyBpbmxpbmUgeGZzX2ZzYmxvY2tfdCBudWxsc3RhcnRibG9jayhpbnQgaykKK3sKKwlBU1NFUlQoayA8ICgxIDw8IFNUQVJUQkxPQ0tWQUxCSVRTKSk7CisJcmV0dXJuIFNUQVJUQkxPQ0tNQVNLIHwgKGspOworfQorCiAjZGVmaW5lIFNUQVJUQkxPQ0tWQUwoeCkJc3RhcnRibG9ja3ZhbCh4KQotI2Vsc2UKLSNkZWZpbmUgU1RBUlRCTE9DS1ZBTCh4KQkoKHhmc19maWxibGtzX3QpKCh4KSAmIH5TVEFSVEJMT0NLTUFTSykpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgeGZzX2ZpbGJsa3NfdCBzdGFydGJsb2NrdmFsKHhmc19mc2Jsb2NrX3QgeCkKK3sKKwlyZXR1cm4gKHhmc19maWxibGtzX3QpKCh4KSAmIH5TVEFSVEJMT0NLTUFTSyk7Cit9CiAKIC8qCiAgKiBQb3NzaWJsZSBleHRlbnQgZm9ybWF0cy4KQEAgLTE1OSwxNCArMTQ0LDkgQEAKIC8qCiAgKiBFeHRlbnQgc3RhdGUgYW5kIGV4dGVudCBmb3JtYXQgbWFjcm9zLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19FWFRGTVRfSU5PREUgKQoteGZzX2V4bnRmbXRfdCB4ZnNfZXh0Zm10X2lub2RlKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKTsKLSNkZWZpbmUgWEZTX0VYVEZNVF9JTk9ERSh4KQl4ZnNfZXh0Zm10X2lub2RlKHgpCi0jZWxzZQotI2RlZmluZSBYRlNfRVhURk1UX0lOT0RFKHgpIFwKLSAgKFhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCgmKCh4KS0+aV9tb3VudC0+bV9zYikpID8gXAotCVhGU19FWFRGTVRfSEFTU1RBVEUgOiBYRlNfRVhURk1UX05PU1RBVEUpCi0jZW5kaWYKKyNkZWZpbmUgWEZTX0VYVEZNVF9JTk9ERSh4KQlcCisJKFhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCgmKCh4KS0+aV9tb3VudC0+bV9zYikpID8gXAorCQlYRlNfRVhURk1UX0hBU1NUQVRFIDogWEZTX0VYVEZNVF9OT1NUQVRFKQogI2RlZmluZSBJU1VOV1JJVFRFTih4KQkoKHgpLT5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTikKIAogLyoKQEAgLTE5MiwyNDggKzE3MiwxMTAgQEAKIAkJCQkJLyogYnRyZWUgYmxvY2sgaGVhZGVyIHR5cGUgKi8KIHR5cGVkZWYgc3RydWN0IHhmc19idHJlZV9sYmxvY2sgeGZzX2JtYnRfYmxvY2tfdDsKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0JNQlRfQkxPQ0spCi14ZnNfYm1idF9ibG9ja190ICp4ZnNfYnVmX3RvX2JtYnRfYmxvY2soc3RydWN0IHhmc19idWYgKmJwKTsKLSNkZWZpbmUgWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKQkJeGZzX2J1Zl90b19ibWJ0X2Jsb2NrKGJwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKSAoKHhmc19ibWJ0X2Jsb2NrX3QgKikoWEZTX0JVRl9QVFIoYnApKSkKLSNlbmRpZgorI2RlZmluZSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApCSgoeGZzX2JtYnRfYmxvY2tfdCAqKVhGU19CVUZfUFRSKGJwKSkKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9SQkxPQ0tfRFNJWkUpCi1pbnQgeGZzX2JtYXBfcmJsb2NrX2RzaXplKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOwotI2RlZmluZSBYRlNfQk1BUF9SQkxPQ0tfRFNJWkUobGV2LGN1cikJCXhmc19ibWFwX3JibG9ja19kc2l6ZShsZXYsY3VyKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0JNQVBfUkJMT0NLX0RTSVpFKGxldixjdXIpICgoY3VyKS0+YmNfcHJpdmF0ZS5iLmZvcmtzaXplKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX1JCTE9DS19JU0laRSkKLWludCB4ZnNfYm1hcF9yYmxvY2tfaXNpemUoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lIFhGU19CTUFQX1JCTE9DS19JU0laRShsZXYsY3VyKQkJeGZzX2JtYXBfcmJsb2NrX2lzaXplKGxldixjdXIpCi0jZWxzZQotI2RlZmluZSBYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1cikgXAorI2RlZmluZSBYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsY3VyKQkoMSA8PCAoY3VyKS0+YmNfYmxvY2tsb2cpCisjZGVmaW5lIFhGU19CTUFQX1JCTE9DS19EU0laRShsZXYsY3VyKQkoKGN1ciktPmJjX3ByaXZhdGUuYi5mb3Jrc2l6ZSkKKyNkZWZpbmUgWEZTX0JNQVBfUkJMT0NLX0lTSVpFKGxldixjdXIpCVwKIAkoKGludClYRlNfSUZPUktfUFRSKChjdXIpLT5iY19wcml2YXRlLmIuaXAsIFwKLQkJCSAgICAoY3VyKS0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayktPmlmX2Jyb290X2J5dGVzKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0lCTE9DS19TSVpFKQotaW50IHhmc19ibWFwX2libG9ja19zaXplKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOwotI2RlZmluZSBYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsY3VyKQkJeGZzX2JtYXBfaWJsb2NrX3NpemUobGV2LGN1cikKLSNlbHNlCi0jZGVmaW5lIFhGU19CTUFQX0lCTE9DS19TSVpFKGxldixjdXIpICgxIDw8IChjdXIpLT5iY19ibG9ja2xvZykKLSNlbmRpZgorCQkgICAgKGN1ciktPmJjX3ByaXZhdGUuYi53aGljaGZvcmspLT5pZl9icm9vdF9ieXRlcykKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CTE9DS19EU0laRSkKLWludCB4ZnNfYm1hcF9ibG9ja19kc2l6ZShpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKLSNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfRFNJWkUobGV2LGN1cikJCXhmc19ibWFwX2Jsb2NrX2RzaXplKGxldixjdXIpCi0jZWxzZQotI2RlZmluZSBYRlNfQk1BUF9CTE9DS19EU0laRShsZXYsY3VyKSBcCi0JKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKLQkJWEZTX0JNQVBfUkJMT0NLX0RTSVpFKGxldixjdXIpIDogXAotCQlYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsY3VyKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CTE9DS19JU0laRSkKLWludCB4ZnNfYm1hcF9ibG9ja19pc2l6ZShpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKLSNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfSVNJWkUobGV2LGN1cikJCXhmc19ibWFwX2Jsb2NrX2lzaXplKGxldixjdXIpCi0jZWxzZQotI2RlZmluZSBYRlNfQk1BUF9CTE9DS19JU0laRShsZXYsY3VyKSBcCi0JKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKLQkJWEZTX0JNQVBfUkJMT0NLX0lTSVpFKGxldixjdXIpIDogXAotCQlYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsY3VyKSkKLSNlbmRpZgorI2RlZmluZSBYRlNfQk1BUF9CTE9DS19EU0laRShsZXYsY3VyKQlcCisJKCgobGV2KSA9PSAoY3VyKS0+YmNfbmxldmVscyAtIDEgPyBcCisJCVhGU19CTUFQX1JCTE9DS19EU0laRShsZXYsY3VyKSA6IFhGU19CTUFQX0lCTE9DS19TSVpFKGxldixjdXIpKSkKKyNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfSVNJWkUobGV2LGN1cikJXAorCSgoKGxldikgPT0gKGN1ciktPmJjX25sZXZlbHMgLSAxID8gXAorCQlYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1cikgOiBYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsY3VyKSkpCiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MpCi1pbnQgeGZzX2JtYXBfYmxvY2tfZG1heHJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lIFhGU19CTUFQX0JMT0NLX0RNQVhSRUNTKGxldixjdXIpCXhmc19ibWFwX2Jsb2NrX2RtYXhyZWNzKGxldixjdXIpCi0jZWxzZQogI2RlZmluZSBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUyhsZXYsY3VyKSBcCi0JKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKKwkoKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKIAkJWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1MoWEZTX0JNQVBfUkJMT0NLX0RTSVpFKGxldixjdXIpLCBcCiAJCQl4ZnNfYm1kciwgKGxldikgPT0gMCkgOiBcCi0JCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbXhyWyhsZXYpICE9IDBdKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CTE9DS19JTUFYUkVDUykKLWludCB4ZnNfYm1hcF9ibG9ja19pbWF4cmVjcyhpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKLSNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2LGN1cikJeGZzX2JtYXBfYmxvY2tfaW1heHJlY3MobGV2LGN1cikKLSNlbHNlCisJCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbXhyWyhsZXYpICE9IDBdKSkpCiAjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldixjdXIpIFwKLQkoKGxldikgPT0gKGN1ciktPmJjX25sZXZlbHMgLSAxID8gXAotCQlYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1ciksIFwKLQkJCXhmc19ibWJ0LCAobGV2KSA9PSAwKSA6IFwKLQkJKChjdXIpLT5iY19tcC0+bV9ibWFwX2RteHJbKGxldikgIT0gMF0pKQotI2VuZGlmCisJKCgobGV2KSA9PSAoY3VyKS0+YmNfbmxldmVscyAtIDEgPyBcCisJCQlYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1ciksXAorCQkJCXhmc19ibWJ0LCAobGV2KSA9PSAwKSA6IFwKKwkJCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbXhyWyhsZXYpICE9IDBdKSkpCiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRE1JTlJFQ1MpCi1pbnQgeGZzX2JtYXBfYmxvY2tfZG1pbnJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lIFhGU19CTUFQX0JMT0NLX0RNSU5SRUNTKGxldixjdXIpCXhmc19ibWFwX2Jsb2NrX2RtaW5yZWNzKGxldixjdXIpCi0jZWxzZQogI2RlZmluZSBYRlNfQk1BUF9CTE9DS19ETUlOUkVDUyhsZXYsY3VyKSBcCi0JKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKLQkJWEZTX0JUUkVFX0JMT0NLX01JTlJFQ1MoWEZTX0JNQVBfUkJMT0NLX0RTSVpFKGxldixjdXIpLCBcCi0JCQl4ZnNfYm1kciwgKGxldikgPT0gMCkgOiBcCi0JCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbW5yWyhsZXYpICE9IDBdKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CTE9DS19JTUlOUkVDUykKLWludCB4ZnNfYm1hcF9ibG9ja19pbWlucmVjcyhpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKLSNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2LGN1cikJeGZzX2JtYXBfYmxvY2tfaW1pbnJlY3MobGV2LGN1cikKLSNlbHNlCisJKCgobGV2KSA9PSAoY3VyKS0+YmNfbmxldmVscyAtIDEgPyBcCisJCQlYRlNfQlRSRUVfQkxPQ0tfTUlOUkVDUyhYRlNfQk1BUF9SQkxPQ0tfRFNJWkUobGV2LGN1ciksXAorCQkJCXhmc19ibWRyLCAobGV2KSA9PSAwKSA6IFwKKwkJCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbW5yWyhsZXYpICE9IDBdKSkpCiAjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0lNSU5SRUNTKGxldixjdXIpIFwKLQkoKGxldikgPT0gKGN1ciktPmJjX25sZXZlbHMgLSAxID8gXAotCQlYRlNfQlRSRUVfQkxPQ0tfTUlOUkVDUyhYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1ciksIFwKLQkJCXhmc19ibWJ0LCAobGV2KSA9PSAwKSA6IFwKLQkJKChjdXIpLT5iY19tcC0+bV9ibWFwX2RtbnJbKGxldikgIT0gMF0pKQotI2VuZGlmCisJKCgobGV2KSA9PSAoY3VyKS0+YmNfbmxldmVscyAtIDEgPyBcCisJCQlYRlNfQlRSRUVfQkxPQ0tfTUlOUkVDUyhYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1ciksXAorCQkJCXhmc19ibWJ0LCAobGV2KSA9PSAwKSA6IFwKKwkJCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbW5yWyhsZXYpICE9IDBdKSkpCiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfUkVDX0RBRERSKQoteGZzX2JtYnRfcmVjX3QgKgoteGZzX2JtYXBfcmVjX2RhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lIFhGU19CTUFQX1JFQ19EQUREUihiYixpLGN1cikJCXhmc19ibWFwX3JlY19kYWRkcihiYixpLGN1cikKLSNlbHNlCi0jZGVmaW5lIFhGU19CTUFQX1JFQ19EQUREUihiYixpLGN1cikgXAotCVhGU19CVFJFRV9SRUNfQUREUihYRlNfQk1BUF9CTE9DS19EU0laRSgJCVwKLQkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSwJXAotCQl4ZnNfYm1idCwgYmIsIGksIFhGU19CTUFQX0JMT0NLX0RNQVhSRUNTKAlcCi0JCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX1JFQ19JQUREUikKLXhmc19ibWJ0X3JlY190ICoKLXhmc19ibWFwX3JlY19pYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOwotI2RlZmluZSBYRlNfQk1BUF9SRUNfSUFERFIoYmIsaSxjdXIpCQl4ZnNfYm1hcF9yZWNfaWFkZHIoYmIsaSxjdXIpCi0jZWxzZQotI2RlZmluZSBYRlNfQk1BUF9SRUNfSUFERFIoYmIsaSxjdXIpIFwKLQlYRlNfQlRSRUVfUkVDX0FERFIoWEZTX0JNQVBfQkxPQ0tfSVNJWkUoCQlcCi0JCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1ciksCVwKLQkJeGZzX2JtYnQsIGJiLCBpLCBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUygJXAotCQkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSkKLSNlbmRpZgorI2RlZmluZSBYRlNfQk1BUF9SRUNfREFERFIoYmIsaSxjdXIpCVwKKwkoWEZTX0JUUkVFX1JFQ19BRERSKFhGU19CTUFQX0JMT0NLX0RTSVpFKAkJCVwKKwkJCWJlMTZfdG9fY3B1KChiYiktPmJiX2xldmVsKSwgY3VyKSwJCVwKKwkJCXhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MoCVwKKwkJCQliZTE2X3RvX2NwdSgoYmIpLT5iYl9sZXZlbCksIGN1cikpKQorI2RlZmluZSBYRlNfQk1BUF9SRUNfSUFERFIoYmIsaSxjdXIpCVwKKwkoWEZTX0JUUkVFX1JFQ19BRERSKFhGU19CTUFQX0JMT0NLX0lTSVpFKAkJCVwKKwkJCWJlMTZfdG9fY3B1KChiYiktPmJiX2xldmVsKSwgY3VyKSwJCVwKKwkJCXhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MoCVwKKwkJCQliZTE2X3RvX2NwdSgoYmIpLT5iYl9sZXZlbCksIGN1cikpKQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0tFWV9EQUREUikKLXhmc19ibWJ0X2tleV90ICoKLXhmc19ibWFwX2tleV9kYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOwotI2RlZmluZSBYRlNfQk1BUF9LRVlfREFERFIoYmIsaSxjdXIpCQl4ZnNfYm1hcF9rZXlfZGFkZHIoYmIsaSxjdXIpCi0jZWxzZQotI2RlZmluZSBYRlNfQk1BUF9LRVlfREFERFIoYmIsaSxjdXIpIFwKLQlYRlNfQlRSRUVfS0VZX0FERFIoWEZTX0JNQVBfQkxPQ0tfRFNJWkUoCQlcCi0JCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1ciksCVwKLQkJeGZzX2JtYnQsIGJiLCBpLCBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUygJXAotCQkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9LRVlfSUFERFIpCi14ZnNfYm1idF9rZXlfdCAqCi14ZnNfYm1hcF9rZXlfaWFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKLSNkZWZpbmUgWEZTX0JNQVBfS0VZX0lBRERSKGJiLGksY3VyKQkJeGZzX2JtYXBfa2V5X2lhZGRyKGJiLGksY3VyKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0JNQVBfS0VZX0lBRERSKGJiLGksY3VyKSBcCi0JWEZTX0JUUkVFX0tFWV9BRERSKFhGU19CTUFQX0JMT0NLX0lTSVpFKAkJXAotCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpLAlcCi0JCXhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MoCVwKLQkJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cikpCi0jZW5kaWYKKyNkZWZpbmUgWEZTX0JNQVBfS0VZX0RBRERSKGJiLGksY3VyKQlcCisJKFhGU19CVFJFRV9LRVlfQUREUihYRlNfQk1BUF9CTE9DS19EU0laRSgJCQlcCisJCQliZTE2X3RvX2NwdSgoYmIpLT5iYl9sZXZlbCksIGN1ciksCQlcCisJCQl4ZnNfYm1idCwgYmIsIGksIFhGU19CTUFQX0JMT0NLX0RNQVhSRUNTKAlcCisJCQkJYmUxNl90b19jcHUoKGJiKS0+YmJfbGV2ZWwpLCBjdXIpKSkKKyNkZWZpbmUgWEZTX0JNQVBfS0VZX0lBRERSKGJiLGksY3VyKQlcCisJKFhGU19CVFJFRV9LRVlfQUREUihYRlNfQk1BUF9CTE9DS19JU0laRSgJCQlcCisJCQliZTE2X3RvX2NwdSgoYmIpLT5iYl9sZXZlbCksIGN1ciksCQlcCisJCQl4ZnNfYm1idCwgYmIsIGksIFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKAlcCisJCQkJYmUxNl90b19jcHUoKGJiKS0+YmJfbGV2ZWwpLCBjdXIpKSkKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9QVFJfREFERFIpCi14ZnNfYm1idF9wdHJfdCAqCi14ZnNfYm1hcF9wdHJfZGFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKLSNkZWZpbmUgWEZTX0JNQVBfUFRSX0RBRERSKGJiLGksY3VyKQkJeGZzX2JtYXBfcHRyX2RhZGRyKGJiLGksY3VyKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0JNQVBfUFRSX0RBRERSKGJiLGksY3VyKSBcCi0JWEZTX0JUUkVFX1BUUl9BRERSKFhGU19CTUFQX0JMT0NLX0RTSVpFKAkJXAotCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpLAlcCi0JCXhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MoCVwKLQkJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cikpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfUFRSX0lBRERSKQoteGZzX2JtYnRfcHRyX3QgKgoteGZzX2JtYXBfcHRyX2lhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lIFhGU19CTUFQX1BUUl9JQUREUihiYixpLGN1cikJCXhmc19ibWFwX3B0cl9pYWRkcihiYixpLGN1cikKLSNlbHNlCi0jZGVmaW5lIFhGU19CTUFQX1BUUl9JQUREUihiYixpLGN1cikgXAotCVhGU19CVFJFRV9QVFJfQUREUihYRlNfQk1BUF9CTE9DS19JU0laRSgJCVwKLQkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSwJXAotCQl4ZnNfYm1idCwgYmIsIGksIFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKAlcCi0JCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpKQotI2VuZGlmCisjZGVmaW5lIFhGU19CTUFQX1BUUl9EQUREUihiYixpLGN1cikJXAorCShYRlNfQlRSRUVfUFRSX0FERFIoWEZTX0JNQVBfQkxPQ0tfRFNJWkUoCQkJXAorCQkJYmUxNl90b19jcHUoKGJiKS0+YmJfbGV2ZWwpLCBjdXIpLAkJXAorCQkJeGZzX2JtYnQsIGJiLCBpLCBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUygJXAorCQkJCWJlMTZfdG9fY3B1KChiYiktPmJiX2xldmVsKSwgY3VyKSkpCisjZGVmaW5lIFhGU19CTUFQX1BUUl9JQUREUihiYixpLGN1cikJXAorCShYRlNfQlRSRUVfUFRSX0FERFIoWEZTX0JNQVBfQkxPQ0tfSVNJWkUoCQkJXAorCQkJYmUxNl90b19jcHUoKGJiKS0+YmJfbGV2ZWwpLCBjdXIpLAkJXAorCQkJeGZzX2JtYnQsIGJiLCBpLCBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUygJXAorCQkJCWJlMTZfdG9fY3B1KChiYiktPmJiX2xldmVsKSwgY3VyKSkpCiAKIC8qCiAgKiBUaGVzZSBhcmUgdG8gYmUgdXNlZCB3aGVuIHdlIGtub3cgdGhlIHNpemUgb2YgdGhlIGJsb2NrIGFuZAogICogd2UgZG9uJ3QgaGF2ZSBhIGN1cnNvci4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9SRUNfQUREUikKLXhmc19ibWJ0X3JlY190ICp4ZnNfYm1hcF9icm9vdF9yZWNfYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIGludCBzeik7Ci0jZGVmaW5lIFhGU19CTUFQX0JST09UX1JFQ19BRERSKGJiLGksc3opCXhmc19ibWFwX2Jyb290X3JlY19hZGRyKGJiLGksc3opCi0jZWxzZQogI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9SRUNfQUREUihiYixpLHN6KSBcCi0JWEZTX0JUUkVFX1JFQ19BRERSKHN6LHhmc19ibWJ0LGJiLGksWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfS0VZX0FERFIpCi14ZnNfYm1idF9rZXlfdCAqeGZzX2JtYXBfYnJvb3Rfa2V5X2FkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBpbnQgc3opOwotI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihiYixpLHN6KQl4ZnNfYm1hcF9icm9vdF9rZXlfYWRkcihiYixpLHN6KQotI2Vsc2UKKwkoWEZTX0JUUkVFX1JFQ19BRERSKHN6LHhmc19ibWJ0LGJiLGksWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikpKQogI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihiYixpLHN6KSBcCi0JWEZTX0JUUkVFX0tFWV9BRERSKHN6LHhmc19ibWJ0LGJiLGksWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIpCi14ZnNfYm1idF9wdHJfdCAqeGZzX2JtYXBfYnJvb3RfcHRyX2FkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBpbnQgc3opOwotI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihiYixpLHN6KQl4ZnNfYm1hcF9icm9vdF9wdHJfYWRkcihiYixpLHN6KQotI2Vsc2UKKwkoWEZTX0JUUkVFX0tFWV9BRERSKHN6LHhmc19ibWJ0LGJiLGksWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikpKQogI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihiYixpLHN6KSBcCi0JWEZTX0JUUkVFX1BUUl9BRERSKHN6LHhmc19ibWJ0LGJiLGksWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikpCi0jZW5kaWYKKwkoWEZTX0JUUkVFX1BUUl9BRERSKHN6LHhmc19ibWJ0LGJiLGksWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikpKQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JST09UX05VTVJFQ1MpCi1pbnQgeGZzX2JtYXBfYnJvb3RfbnVtcmVjcyh4ZnNfYm1kcl9ibG9ja190ICpiYik7Ci0jZGVmaW5lIFhGU19CTUFQX0JST09UX05VTVJFQ1MoYmIpCQl4ZnNfYm1hcF9icm9vdF9udW1yZWNzKGJiKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfTlVNUkVDUyhiYikgKElOVF9HRVQoKGJiKS0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9NQVhSRUNTKQotaW50IHhmc19ibWFwX2Jyb290X21heHJlY3MoaW50IHN6KTsKLSNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikJCXhmc19ibWFwX2Jyb290X21heHJlY3Moc3opCi0jZWxzZQotI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKHN6KSBYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhzeix4ZnNfYm1idCwwKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JST09UX1NQQUNFX0NBTEMpCi1pbnQgeGZzX2JtYXBfYnJvb3Rfc3BhY2VfY2FsYyhpbnQgbnJlY3MpOwotI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKG5yZWNzKQl4ZnNfYm1hcF9icm9vdF9zcGFjZV9jYWxjKG5yZWNzKQotI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfTlVNUkVDUyhiYikJYmUxNl90b19jcHUoKGJiKS0+YmJfbnVtcmVjcykKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikJWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1Moc3oseGZzX2JtYnQsMCkKKwogI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKG5yZWNzKSBcCi0JKChpbnQpKHNpemVvZih4ZnNfYm1idF9ibG9ja190KSArIFwKLQkgICAgICAgKChucmVjcykgKiAoc2l6ZW9mKHhmc19ibWJ0X2tleV90KSArIHNpemVvZih4ZnNfYm1idF9wdHJfdCkpKSkpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfU1BBQ0UpCi1pbnQgeGZzX2JtYXBfYnJvb3Rfc3BhY2UoeGZzX2JtZHJfYmxvY2tfdCAqYmIpOwotI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9TUEFDRShiYikJCXhmc19ibWFwX2Jyb290X3NwYWNlKGJiKQotI2Vsc2UKKwkoaW50KShzaXplb2YoeGZzX2JtYnRfYmxvY2tfdCkgKyBcCisJICAgICAgICgobnJlY3MpICogKHNpemVvZih4ZnNfYm1idF9rZXlfdCkgKyBzaXplb2YoeGZzX2JtYnRfcHRyX3QpKSkpCisKICNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfU1BBQ0UoYmIpIFwKLQlYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKElOVF9HRVQoKGJiKS0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1EUl9TUEFDRV9DQUxDKQotaW50IHhmc19ibWRyX3NwYWNlX2NhbGMoaW50IG5yZWNzKTsKLSNkZWZpbmUgWEZTX0JNRFJfU1BBQ0VfQ0FMQyhucmVjcykJCXhmc19ibWRyX3NwYWNlX2NhbGMobnJlY3MpCi0jZWxzZQotI2RlZmluZSBYRlNfQk1EUl9TUEFDRV9DQUxDKG5yZWNzKQlcCi0JKChpbnQpKHNpemVvZih4ZnNfYm1kcl9ibG9ja190KSArIFwKLQkgICAgICAgKChucmVjcykgKiAoc2l6ZW9mKHhmc19ibWJ0X2tleV90KSArIHNpemVvZih4ZnNfYm1idF9wdHJfdCkpKSkpCi0jZW5kaWYKKwkoWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhiZTE2X3RvX2NwdSgoYmIpLT5iYl9udW1yZWNzKSkpCisjZGVmaW5lIFhGU19CTURSX1NQQUNFX0NBTEMobnJlY3MpIFwKKwkoaW50KShzaXplb2YoeGZzX2JtZHJfYmxvY2tfdCkgKyBcCisJICAgICAgICgobnJlY3MpICogKHNpemVvZih4ZnNfYm1idF9rZXlfdCkgKyBzaXplb2YoeGZzX2JtYnRfcHRyX3QpKSkpCiAKIC8qCiAgKiBNYXhpbXVtIG51bWJlciBvZiBibWFwIGJ0cmVlIGxldmVscy4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1fTUFYTEVWRUxTKQotaW50IHhmc19ibV9tYXhsZXZlbHMoc3RydWN0IHhmc19tb3VudCAqbXAsIGludCB3KTsKLSNkZWZpbmUgWEZTX0JNX01BWExFVkVMUyhtcCx3KQkJCXhmc19ibV9tYXhsZXZlbHMobXAsdykKLSNlbHNlCi0jZGVmaW5lIFhGU19CTV9NQVhMRVZFTFMobXAsdykJCSgobXApLT5tX2JtX21heGxldmVsc1t3XSkKLSNlbmRpZgorI2RlZmluZSBYRlNfQk1fTUFYTEVWRUxTKG1wLHcpCQkoKG1wKS0+bV9ibV9tYXhsZXZlbHNbKHcpXSkKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9TQU5JVFlfQ0hFQ0spCi1pbnQgeGZzX2JtYXBfc2FuaXR5X2NoZWNrKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfYm1idF9ibG9ja190ICpiYiwKLQlpbnQgbGV2ZWwpOwotI2RlZmluZSBYRlNfQk1BUF9TQU5JVFlfQ0hFQ0sobXAsYmIsbGV2ZWwpCVwKLQl4ZnNfYm1hcF9zYW5pdHlfY2hlY2sobXAsYmIsbGV2ZWwpCi0jZWxzZQotI2RlZmluZSBYRlNfQk1BUF9TQU5JVFlfQ0hFQ0sobXAsYmIsbGV2ZWwpCVwKLQkoSU5UX0dFVCgoYmIpLT5iYl9tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQk1BUF9NQUdJQyAmJiBcCi0JIElOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPT0gbGV2ZWwgJiYgXAotCSBJTlRfR0VUKChiYiktPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPiAwICYmIFwKLQkgSU5UX0dFVCgoYmIpLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9IChtcCktPm1fYm1hcF9kbXhyWyhsZXZlbCkgIT0gMF0pCi0jZW5kaWYKKyNkZWZpbmUgWEZTX0JNQVBfU0FOSVRZX0NIRUNLKG1wLGJiLGxldmVsKSBcCisJKGJlMzJfdG9fY3B1KChiYiktPmJiX21hZ2ljKSA9PSBYRlNfQk1BUF9NQUdJQyAmJiBcCisJIGJlMTZfdG9fY3B1KChiYiktPmJiX2xldmVsKSA9PSBsZXZlbCAmJiBcCisJIGJlMTZfdG9fY3B1KChiYiktPmJiX251bXJlY3MpID4gMCAmJiBcCisJIGJlMTZfdG9fY3B1KChiYiktPmJiX251bXJlY3MpIDw9IChtcCktPm1fYm1hcF9kbXhyWyhsZXZlbCkgIT0gMF0pCiAKIAogI2lmZGVmIF9fS0VSTkVMX18KQEAgLTQ1OSwyMzQgKzMwMSw4NCBAQAogLyoKICAqIFByb3RvdHlwZXMgZm9yIHhmc19ibWFwLmMgdG8gY2FsbC4KICAqLwotCi12b2lkCi14ZnNfYm1kcl90b19ibWJ0KAotCXhmc19ibWRyX2Jsb2NrX3QgKiwKLQlpbnQsCi0JeGZzX2JtYnRfYmxvY2tfdCAqLAotCWludCk7Ci0KLWludAoteGZzX2JtYnRfZGVjcmVtZW50KAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCi0JaW50LAotCWludCAqKTsKLQotaW50Ci14ZnNfYm1idF9kZWxldGUoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIgKiwKLQlpbnQgKik7Ci0KLXZvaWQKLXhmc19ibWJ0X2dldF9hbGwoCi0JeGZzX2JtYnRfcmVjX3QJKnIsCi0JeGZzX2JtYnRfaXJlY190ICpzKTsKLQoteGZzX2JtYnRfYmxvY2tfdCAqCi14ZnNfYm1idF9nZXRfYmxvY2soCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKLQlpbnQJCQlsZXZlbCwKLQlzdHJ1Y3QgeGZzX2J1ZgkJKipicHApOwotCi14ZnNfZmlsYmxrc190Ci14ZnNfYm1idF9nZXRfYmxvY2tjb3VudCgKLQl4ZnNfYm1idF9yZWNfdAkqcik7Ci0KLXhmc19mc2Jsb2NrX3QKLXhmc19ibWJ0X2dldF9zdGFydGJsb2NrKAotCXhmc19ibWJ0X3JlY190CSpyKTsKLQoteGZzX2ZpbGVvZmZfdAoteGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKAotCXhmc19ibWJ0X3JlY190CSpyKTsKLQoteGZzX2V4bnRzdF90Ci14ZnNfYm1idF9nZXRfc3RhdGUoCi0JeGZzX2JtYnRfcmVjX3QJKnIpOworZXh0ZXJuIHZvaWQgeGZzX2JtZHJfdG9fYm1idCh4ZnNfYm1kcl9ibG9ja190ICosIGludCwgeGZzX2JtYnRfYmxvY2tfdCAqLCBpbnQpOworZXh0ZXJuIGludCB4ZnNfYm1idF9kZWNyZW1lbnQoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgaW50LCBpbnQgKik7CitleHRlcm4gaW50IHhmc19ibWJ0X2RlbGV0ZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQgKik7CitleHRlcm4gdm9pZCB4ZnNfYm1idF9nZXRfYWxsKHhmc19ibWJ0X3JlY190ICpyLCB4ZnNfYm1idF9pcmVjX3QgKnMpOworZXh0ZXJuIHhmc19ibWJ0X2Jsb2NrX3QgKnhmc19ibWJ0X2dldF9ibG9jayhzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLAorCQkJCQkJaW50LCBzdHJ1Y3QgeGZzX2J1ZiAqKmJwcCk7CitleHRlcm4geGZzX2ZpbGJsa3NfdCB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudCh4ZnNfYm1idF9yZWNfdCAqcik7CitleHRlcm4geGZzX2ZzYmxvY2tfdCB4ZnNfYm1idF9nZXRfc3RhcnRibG9jayh4ZnNfYm1idF9yZWNfdCAqcik7CitleHRlcm4geGZzX2ZpbGVvZmZfdCB4ZnNfYm1idF9nZXRfc3RhcnRvZmYoeGZzX2JtYnRfcmVjX3QgKnIpOworZXh0ZXJuIHhmc19leG50c3RfdCB4ZnNfYm1idF9nZXRfc3RhdGUoeGZzX2JtYnRfcmVjX3QgKnIpOwogCiAjaWZuZGVmIFhGU19OQVRJVkVfSE9TVAotdm9pZAoteGZzX2JtYnRfZGlza19nZXRfYWxsKAotCXhmc19ibWJ0X3JlY190CSpyLAotCXhmc19ibWJ0X2lyZWNfdCAqcyk7Ci0KLXhmc19leG50c3RfdAoteGZzX2JtYnRfZGlza19nZXRfc3RhdGUoCi0JeGZzX2JtYnRfcmVjX3QJKnIpOwotCi14ZnNfZmlsYmxrc190Ci14ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KAotCXhmc19ibWJ0X3JlY190CSpyKTsKLQoteGZzX2ZzYmxvY2tfdAoteGZzX2JtYnRfZGlza19nZXRfc3RhcnRibG9jaygKLQl4ZnNfYm1idF9yZWNfdAkqcik7Ci0KLXhmc19maWxlb2ZmX3QKLXhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKAotCXhmc19ibWJ0X3JlY190CSpyKTsKLQorZXh0ZXJuIHZvaWQgeGZzX2JtYnRfZGlza19nZXRfYWxsKHhmc19ibWJ0X3JlY190ICpyLCB4ZnNfYm1idF9pcmVjX3QgKnMpOworZXh0ZXJuIHhmc19leG50c3RfdCB4ZnNfYm1idF9kaXNrX2dldF9zdGF0ZSh4ZnNfYm1idF9yZWNfdCAqcik7CitleHRlcm4geGZzX2ZpbGJsa3NfdCB4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KHhmc19ibWJ0X3JlY190ICpyKTsKK2V4dGVybiB4ZnNfZnNibG9ja190IHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0YmxvY2soeGZzX2JtYnRfcmVjX3QgKnIpOworZXh0ZXJuIHhmc19maWxlb2ZmX3QgeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYoeGZzX2JtYnRfcmVjX3QgKnIpOwogI2Vsc2UKLSNkZWZpbmUgeGZzX2JtYnRfZGlza19nZXRfYWxsKHIsIHMpIFwKLQl4ZnNfYm1idF9nZXRfYWxsKHIsIHMpCi0jZGVmaW5lIHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXRlKHIpIFwKLQl4ZnNfYm1idF9nZXRfc3RhdGUocikKLSNkZWZpbmUgeGZzX2JtYnRfZGlza19nZXRfYmxvY2tjb3VudChyKSBcCi0JeGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQocikKLSNkZWZpbmUgeGZzX2JtYnRfZGlza19nZXRfc3RhcnRibG9jayhyKSBcCi0JeGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQocikKLSNkZWZpbmUgeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocikgXAotCXhmc19ibWJ0X2dldF9zdGFydG9mZihyKQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9hbGwociwgcykJeGZzX2JtYnRfZ2V0X2FsbChyLCBzKQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9zdGF0ZShyKQl4ZnNfYm1idF9nZXRfc3RhdGUocikKKyNkZWZpbmUgeGZzX2JtYnRfZGlza19nZXRfYmxvY2tjb3VudChyKQl4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChyKQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9zdGFydGJsb2NrKHIpCXhmc19ibWJ0X2dldF9ibG9ja2NvdW50KHIpCisjZGVmaW5lIHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHIpCXhmc19ibWJ0X2dldF9zdGFydG9mZihyKQogI2VuZGlmIC8qIFhGU19OQVRJVkVfSE9TVCAqLwogCi1pbnQKLXhmc19ibWJ0X2luY3JlbWVudCgKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAotCWludCwKLQlpbnQgKik7Ci0KLWludAoteGZzX2JtYnRfaW5zZXJ0KAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCi0JaW50ICopOwotCi12b2lkCi14ZnNfYm1idF9sb2dfYmxvY2soCi0Jc3RydWN0IHhmc19idHJlZV9jdXIgKiwKLQlzdHJ1Y3QgeGZzX2J1ZiAqLAotCWludCk7Ci0KLXZvaWQKLXhmc19ibWJ0X2xvZ19yZWNzKAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCi0Jc3RydWN0IHhmc19idWYgKiwKLQlpbnQsCi0JaW50KTsKLQotaW50Ci14ZnNfYm1idF9sb29rdXBfZXEoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIgKiwKLQl4ZnNfZmlsZW9mZl90LAotCXhmc19mc2Jsb2NrX3QsCi0JeGZzX2ZpbGJsa3NfdCwKLQlpbnQgKik7Ci0KLWludAoteGZzX2JtYnRfbG9va3VwX2dlKAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCi0JeGZzX2ZpbGVvZmZfdCwKLQl4ZnNfZnNibG9ja190LAotCXhmc19maWxibGtzX3QsCi0JaW50ICopOworZXh0ZXJuIGludCB4ZnNfYm1idF9pbmNyZW1lbnQoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgaW50LCBpbnQgKik7CitleHRlcm4gaW50IHhmc19ibWJ0X2luc2VydChzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQgKik7CitleHRlcm4gdm9pZCB4ZnNfYm1idF9sb2dfYmxvY2soc3RydWN0IHhmc19idHJlZV9jdXIgKiwgc3RydWN0IHhmc19idWYgKiwgaW50KTsKK2V4dGVybiB2b2lkIHhmc19ibWJ0X2xvZ19yZWNzKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosIHN0cnVjdCB4ZnNfYnVmICosIGludCwKKwkJCQlpbnQpOworZXh0ZXJuIGludCB4ZnNfYm1idF9sb29rdXBfZXEoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgeGZzX2ZpbGVvZmZfdCwKKwkJCQl4ZnNfZnNibG9ja190LCB4ZnNfZmlsYmxrc190LCBpbnQgKik7CitleHRlcm4gaW50IHhmc19ibWJ0X2xvb2t1cF9nZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCB4ZnNfZmlsZW9mZl90LAorCQkJCXhmc19mc2Jsb2NrX3QsIHhmc19maWxibGtzX3QsIGludCAqKTsKIAogLyoKICAqIEdpdmUgdGhlIGJtYXAgYnRyZWUgYSBuZXcgcm9vdCBibG9jay4gIENvcHkgdGhlIG9sZCBicm9vdCBjb250ZW50cwogICogZG93biBpbnRvIGEgcmVhbCBibG9jayBhbmQgbWFrZSB0aGUgYnJvb3QgcG9pbnQgdG8gaXQuCiAgKi8KLWludAkJCQkJCS8qIGVycm9yICovCi14ZnNfYm1idF9uZXdyb290KAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQkqbG9nZmxhZ3MsCS8qIGxvZ2dpbmcgZmxhZ3MgZm9yIGlub2RlICovCi0JaW50CQkJKnN0YXQpOwkJLyogcmV0dXJuIHN0YXR1cyAtIDAgZmFpbCAqLworZXh0ZXJuIGludCB4ZnNfYm1idF9uZXdyb290KHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIGludCAqbGZsYWdzLCBpbnQgKnN0YXQpOwogCi12b2lkCi14ZnNfYm1idF9zZXRfYWxsKAotCXhmc19ibWJ0X3JlY190CSpyLAotCXhmc19ibWJ0X2lyZWNfdCAqcyk7Ci0KLXZvaWQKLXhmc19ibWJ0X3NldF9hbGxmKAotCXhmc19ibWJ0X3JlY190CSpyLAotCXhmc19maWxlb2ZmX3QJbywKLQl4ZnNfZnNibG9ja190CWIsCi0JeGZzX2ZpbGJsa3NfdAljLAotCXhmc19leG50c3RfdAl2KTsKLQotdm9pZAoteGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoCi0JeGZzX2JtYnRfcmVjX3QJKnIsCi0JeGZzX2ZpbGJsa3NfdAl2KTsKLQotdm9pZAoteGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soCi0JeGZzX2JtYnRfcmVjX3QJKnIsCi0JeGZzX2ZzYmxvY2tfdAl2KTsKLQotdm9pZAoteGZzX2JtYnRfc2V0X3N0YXJ0b2ZmKAotCXhmc19ibWJ0X3JlY190CSpyLAotCXhmc19maWxlb2ZmX3QJdik7Ci0KLXZvaWQKLXhmc19ibWJ0X3NldF9zdGF0ZSgKLQl4ZnNfYm1idF9yZWNfdAkqciwKLQl4ZnNfZXhudHN0X3QJdik7CitleHRlcm4gdm9pZCB4ZnNfYm1idF9zZXRfYWxsKHhmc19ibWJ0X3JlY190ICpyLCB4ZnNfYm1idF9pcmVjX3QgKnMpOworZXh0ZXJuIHZvaWQgeGZzX2JtYnRfc2V0X2FsbGYoeGZzX2JtYnRfcmVjX3QgKnIsIHhmc19maWxlb2ZmX3QgbywKKwkJCXhmc19mc2Jsb2NrX3QgYiwgeGZzX2ZpbGJsa3NfdCBjLCB4ZnNfZXhudHN0X3Qgdik7CitleHRlcm4gdm9pZCB4ZnNfYm1idF9zZXRfYmxvY2tjb3VudCh4ZnNfYm1idF9yZWNfdCAqciwgeGZzX2ZpbGJsa3NfdCB2KTsKK2V4dGVybiB2b2lkIHhmc19ibWJ0X3NldF9zdGFydGJsb2NrKHhmc19ibWJ0X3JlY190ICpyLCB4ZnNfZnNibG9ja190IHYpOworZXh0ZXJuIHZvaWQgeGZzX2JtYnRfc2V0X3N0YXJ0b2ZmKHhmc19ibWJ0X3JlY190ICpyLCB4ZnNfZmlsZW9mZl90IHYpOworZXh0ZXJuIHZvaWQgeGZzX2JtYnRfc2V0X3N0YXRlKHhmc19ibWJ0X3JlY190ICpyLCB4ZnNfZXhudHN0X3Qgdik7CiAKICNpZm5kZWYgWEZTX05BVElWRV9IT1NUCi12b2lkCi14ZnNfYm1idF9kaXNrX3NldF9hbGwoCi0JeGZzX2JtYnRfcmVjX3QJKnIsCi0JeGZzX2JtYnRfaXJlY190ICpzKTsKLQotdm9pZAoteGZzX2JtYnRfZGlza19zZXRfYWxsZigKLQl4ZnNfYm1idF9yZWNfdAkqciwKLQl4ZnNfZmlsZW9mZl90CW8sCi0JeGZzX2ZzYmxvY2tfdAliLAotCXhmc19maWxibGtzX3QJYywKLQl4ZnNfZXhudHN0X3QJdik7CitleHRlcm4gdm9pZCB4ZnNfYm1idF9kaXNrX3NldF9hbGwoeGZzX2JtYnRfcmVjX3QgKnIsIHhmc19ibWJ0X2lyZWNfdCAqcyk7CitleHRlcm4gdm9pZCB4ZnNfYm1idF9kaXNrX3NldF9hbGxmKHhmc19ibWJ0X3JlY190ICpyLCB4ZnNfZmlsZW9mZl90IG8sCisJCQl4ZnNfZnNibG9ja190IGIsIHhmc19maWxibGtzX3QgYywgeGZzX2V4bnRzdF90IHYpOwogI2Vsc2UKLSNkZWZpbmUgeGZzX2JtYnRfZGlza19zZXRfYWxsKHIsIHMpIFwKLQl4ZnNfYm1idF9zZXRfYWxsKHIsIHMpCi0jZGVmaW5lIHhmc19ibWJ0X2Rpc2tfc2V0X2FsbGYociwgbywgYiwgYywgdikgXAotCXhmc19ibWJ0X3NldF9hbGxmKHIsIG8sIGIsIGMsIHYpCisjZGVmaW5lIHhmc19ibWJ0X2Rpc2tfc2V0X2FsbChyLCBzKQkJeGZzX2JtYnRfc2V0X2FsbChyLCBzKQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX3NldF9hbGxmKHIsIG8sIGIsIGMsIHYpCXhmc19ibWJ0X3NldF9hbGxmKHIsIG8sIGIsIGMsIHYpCiAjZW5kaWYgLyogWEZTX05BVElWRV9IT1NUICovCiAKLXZvaWQKLXhmc19ibWJ0X3RvX2JtZHIoCi0JeGZzX2JtYnRfYmxvY2tfdCAqLAotCWludCwKLQl4ZnNfYm1kcl9ibG9ja190ICosCi0JaW50KTsKLQotaW50Ci14ZnNfYm1idF91cGRhdGUoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIgKiwKLQl4ZnNfZmlsZW9mZl90LAotCXhmc19mc2Jsb2NrX3QsCi0JeGZzX2ZpbGJsa3NfdCwKLQl4ZnNfZXhudHN0X3QpOworZXh0ZXJuIHZvaWQgeGZzX2JtYnRfdG9fYm1kcih4ZnNfYm1idF9ibG9ja190ICosIGludCwgeGZzX2JtZHJfYmxvY2tfdCAqLCBpbnQpOworZXh0ZXJuIGludCB4ZnNfYm1idF91cGRhdGUoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgeGZzX2ZpbGVvZmZfdCwKKwkJCQl4ZnNfZnNibG9ja190LCB4ZnNfZmlsYmxrc190LCB4ZnNfZXhudHN0X3QpOwogCiAjaWZkZWYgREVCVUcKIC8qCiAgKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgcG9pbnRlZC10byByZWNvcmQuCiAgKi8KLWludAoteGZzX2JtYnRfZ2V0X3JlYygKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAotCXhmc19maWxlb2ZmX3QgKiwKLQl4ZnNfZnNibG9ja190ICosCi0JeGZzX2ZpbGJsa3NfdCAqLAotCXhmc19leG50c3RfdCAqLAotCWludCAqKTsKK2V4dGVybiBpbnQgeGZzX2JtYnRfZ2V0X3JlYyhzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCB4ZnNfZmlsZW9mZl90ICosCisJCQkJeGZzX2ZzYmxvY2tfdCAqLCB4ZnNfZmlsYmxrc190ICosCisJCQkJeGZzX2V4bnRzdF90ICosIGludCAqKTsKICNlbmRpZgogCi0KIC8qCiAgKiBTZWFyY2ggYW4gZXh0ZW50IGxpc3QgZm9yIHRoZSBleHRlbnQgd2hpY2ggaW5jbHVkZXMgYmxvY2sKICAqIGJuby4KICAqLwoteGZzX2JtYnRfcmVjX3QgKgoteGZzX2JtYXBfZG9fc2VhcmNoX2V4dGVudHMoCi0JeGZzX2JtYnRfcmVjX3QgKiwKLQl4ZnNfZXh0bnVtX3QsCi0JeGZzX2V4dG51bV90LAotCXhmc19maWxlb2ZmX3QsCi0JaW50ICosCi0JeGZzX2V4dG51bV90ICosCi0JeGZzX2JtYnRfaXJlY190ICosCi0JeGZzX2JtYnRfaXJlY190ICopOworeGZzX2JtYnRfcmVjX3QgKnhmc19ibWFwX2RvX3NlYXJjaF9leHRlbnRzKHhmc19ibWJ0X3JlY190ICosCisJCQl4ZnNfZXh0bnVtX3QsIHhmc19leHRudW1fdCwgeGZzX2ZpbGVvZmZfdCwgaW50ICosCisJCQl4ZnNfZXh0bnVtX3QgKiwgeGZzX2JtYnRfaXJlY190ICosIHhmc19ibWJ0X2lyZWNfdCAqKTsKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idHJlZS5jIGIvZnMveGZzL3hmc19idHJlZS5jCmluZGV4IDBjYzYzZDYuLjUyZDVkMDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnRyZWUuYworKysgYi9mcy94ZnMveGZzX2J0cmVlLmMKQEAgLTEsNDUgKzEsMjYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBjb2RlIGZvciB0aGUgc3BhY2UgbWFuYWdlcidzIGJ0cmVlIGltcGxlbWVudGF0aW9ucy4KLSAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCkBAIC00NywxNyArMjgsMTYgQEAKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAKIC8qCkBAIC0xMTAsMTEgKzkwLDE0IEBACiAJc3dpdGNoIChjdXItPmJjX2J0bnVtKSB7CiAJY2FzZSBYRlNfQlROVU1fQk5POgogCWNhc2UgWEZTX0JUTlVNX0NOVDoKLQkJcmV0dXJuIChpbnQpWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MoSU5UX0dFVChibG9jay0+YmJfaC5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwkJcmV0dXJuIChpbnQpWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MoCisJCQkJYmUxNl90b19jcHUoYmxvY2stPmJiX2guYmJfbGV2ZWwpLCBjdXIpOwogCWNhc2UgWEZTX0JUTlVNX0JNQVA6Ci0JCXJldHVybiAoaW50KVhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKElOVF9HRVQoYmxvY2stPmJiX2guYmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJCXJldHVybiAoaW50KVhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKAorCQkJCWJlMTZfdG9fY3B1KGJsb2NrLT5iYl9oLmJiX2xldmVsKSwgY3VyKTsKIAljYXNlIFhGU19CVE5VTV9JTk86Ci0JCXJldHVybiAoaW50KVhGU19JTk9CVF9CTE9DS19NQVhSRUNTKElOVF9HRVQoYmxvY2stPmJiX2guYmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJCXJldHVybiAoaW50KVhGU19JTk9CVF9CTE9DS19NQVhSRUNTKAorCQkJCWJlMTZfdG9fY3B1KGJsb2NrLT5iYl9oLmJiX2xldmVsKSwgY3VyKTsKIAlkZWZhdWx0OgogCQlBU1NFUlQoMCk7CiAJCXJldHVybiAwOwpAQCAtMTYwLDcgKzE0Myw3IEBACiAKIAkJazEgPSBhazE7CiAJCWsyID0gYWsyOwotCQlBU1NFUlQoSU5UX0dFVChrMS0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQoazItPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkpOworCQlBU1NFUlQoYmUzMl90b19jcHUoazEtPmFyX3N0YXJ0YmxvY2spIDwgYmUzMl90b19jcHUoazItPmFyX3N0YXJ0YmxvY2spKTsKIAkJYnJlYWs7CiAJICAgIH0KIAljYXNlIFhGU19CVE5VTV9DTlQ6IHsKQEAgLTE2OSw5ICsxNTIsOSBAQAogCiAJCWsxID0gYWsxOwogCQlrMiA9IGFrMjsKLQkJQVNTRVJUKElOVF9HRVQoazEtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGsyLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpIHx8Ci0JCSAgICAgICAoSU5UX0dFVChrMS0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKGsyLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpICYmCi0JCQlJTlRfR0VUKGsxLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChrMi0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSkpOworCQlBU1NFUlQoYmUzMl90b19jcHUoazEtPmFyX2Jsb2NrY291bnQpIDwgYmUzMl90b19jcHUoazItPmFyX2Jsb2NrY291bnQpIHx8CisJCSAgICAgICAoazEtPmFyX2Jsb2NrY291bnQgPT0gazItPmFyX2Jsb2NrY291bnQgJiYKKwkJCWJlMzJfdG9fY3B1KGsxLT5hcl9zdGFydGJsb2NrKSA8IGJlMzJfdG9fY3B1KGsyLT5hcl9zdGFydGJsb2NrKSkpOwogCQlicmVhazsKIAkgICAgfQogCWNhc2UgWEZTX0JUTlVNX0JNQVA6IHsKQEAgLTIxNCwxNiArMTk3LDE2IEBACiAKIAltcCA9IGN1ci0+YmNfbXA7CiAJbGJsb2NrX29rID0KLQkJSU5UX0dFVChibG9jay0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0geGZzX21hZ2ljc1tjdXItPmJjX2J0bnVtXSAmJgotCQlJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA9PSBsZXZlbCAmJgotCQlJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9CisJCWJlMzJfdG9fY3B1KGJsb2NrLT5iYl9tYWdpYykgPT0geGZzX21hZ2ljc1tjdXItPmJjX2J0bnVtXSAmJgorCQliZTE2X3RvX2NwdShibG9jay0+YmJfbGV2ZWwpID09IGxldmVsICYmCisJCWJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA8PQogCQkJeGZzX2J0cmVlX21heHJlY3MoY3VyLCAoeGZzX2J0cmVlX2Jsb2NrX3QgKilibG9jaykgJiYKIAkJYmxvY2stPmJiX2xlZnRzaWIgJiYKLQkJKElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTyB8fAotCQkgWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsIElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkpKSAmJgorCQkoYmU2NF90b19jcHUoYmxvY2stPmJiX2xlZnRzaWIpID09IE5VTExERlNCTk8gfHwKKwkJIFhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBiZTY0X3RvX2NwdShibG9jay0+YmJfbGVmdHNpYikpKSAmJgogCQlibG9jay0+YmJfcmlnaHRzaWIgJiYKLQkJKElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExERlNCTk8gfHwKLQkJIFhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSkpOworCQkoYmU2NF90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSA9PSBOVUxMREZTQk5PIHx8CisJCSBYRlNfRlNCX1NBTklUWV9DSEVDSyhtcCwgYmU2NF90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSkpOwogCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighbGJsb2NrX29rLCBtcCwgWEZTX0VSUlRBR19CVFJFRV9DSEVDS19MQkxPQ0ssCiAJCQlYRlNfUkFORE9NX0JUUkVFX0NIRUNLX0xCTE9DSykpKSB7CiAJCWlmIChicCkKQEAgLTI3MSw4ICsyNTQsOSBAQAogCiAJCXIxID0gYXIxOwogCQlyMiA9IGFyMjsKLQkJQVNTRVJUKElOVF9HRVQocjEtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKHIxLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpIDw9Ci0JCSAgICAgICBJTlRfR0VUKHIyLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpKTsKKwkJQVNTRVJUKGJlMzJfdG9fY3B1KHIxLT5hcl9zdGFydGJsb2NrKSArCisJCSAgICAgICBiZTMyX3RvX2NwdShyMS0+YXJfYmxvY2tjb3VudCkgPD0KKwkJICAgICAgIGJlMzJfdG9fY3B1KHIyLT5hcl9zdGFydGJsb2NrKSk7CiAJCWJyZWFrOwogCSAgICB9CiAJY2FzZSBYRlNfQlROVU1fQ05UOiB7CkBAIC0yODEsOSArMjY1LDkgQEAKIAogCQlyMSA9IGFyMTsKIAkJcjIgPSBhcjI7Ci0JCUFTU0VSVChJTlRfR0VUKHIxLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChyMi0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSB8fAotCQkgICAgICAgKElOVF9HRVQocjEtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChyMi0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSAmJgotCQkJSU5UX0dFVChyMS0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQocjItPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkpKTsKKwkJQVNTRVJUKGJlMzJfdG9fY3B1KHIxLT5hcl9ibG9ja2NvdW50KSA8IGJlMzJfdG9fY3B1KHIyLT5hcl9ibG9ja2NvdW50KSB8fAorCQkgICAgICAgKHIxLT5hcl9ibG9ja2NvdW50ID09IHIyLT5hcl9ibG9ja2NvdW50ICYmCisJCQliZTMyX3RvX2NwdShyMS0+YXJfc3RhcnRibG9jaykgPCBiZTMyX3RvX2NwdShyMi0+YXJfc3RhcnRibG9jaykpKTsKIAkJYnJlYWs7CiAJICAgIH0KIAljYXNlIFhGU19CVE5VTV9CTUFQOiB7CkBAIC0zMzEsMTcgKzMxNSwxNyBAQAogCiAJYWdicCA9IGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnA7CiAJYWdmID0gWEZTX0JVRl9UT19BR0YoYWdicCk7Ci0JYWdmbGVuID0gSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJYWdmbGVuID0gYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKTsKIAlzYmxvY2tfb2sgPQotCQlJTlRfR0VUKGJsb2NrLT5iYl9tYWdpYywgQVJDSF9DT05WRVJUKSA9PSB4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dICYmCi0JCUlOVF9HRVQoYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID09IGxldmVsICYmCi0JCUlOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPD0KKwkJYmUzMl90b19jcHUoYmxvY2stPmJiX21hZ2ljKSA9PSB4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dICYmCisJCWJlMTZfdG9fY3B1KGJsb2NrLT5iYl9sZXZlbCkgPT0gbGV2ZWwgJiYKKwkJYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpIDw9CiAJCQl4ZnNfYnRyZWVfbWF4cmVjcyhjdXIsICh4ZnNfYnRyZWVfYmxvY2tfdCAqKWJsb2NrKSAmJgotCQkoSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSyB8fAotCQkgSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA8IGFnZmxlbikgJiYKKwkJKGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9sZWZ0c2liKSA9PSBOVUxMQUdCTE9DSyB8fAorCQkgYmUzMl90b19jcHUoYmxvY2stPmJiX2xlZnRzaWIpIDwgYWdmbGVuKSAmJgogCQlibG9jay0+YmJfbGVmdHNpYiAmJgotCQkoSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0sgfHwKLQkJIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpIDwgYWdmbGVuKSAmJgorCQkoYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSyB8fAorCQkgYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSA8IGFnZmxlbikgJiYKIAkJYmxvY2stPmJiX3JpZ2h0c2liOwogCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighc2Jsb2NrX29rLCBjdXItPmJjX21wLAogCQkJWEZTX0VSUlRBR19CVFJFRV9DSEVDS19TQkxPQ0ssCkBAIC0zNzIsNyArMzU2LDcgQEAKIAlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKAogCQlsZXZlbCA+IDAgJiYKIAkJcHRyICE9IE5VTExBR0JMT0NLICYmIHB0ciAhPSAwICYmCi0JCXB0ciA8IElOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwkJcHRyIDwgYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxMSwxNSArNTk1LDE1IEBACiAJY2FzZSBYRlNfQlROVU1fQk5POgogCWNhc2UgWEZTX0JUTlVNX0NOVDoKIAkJYWdmID0gWEZTX0JVRl9UT19BR0YoYWdicCk7Ci0JCW5sZXZlbHMgPSBJTlRfR0VUKGFnZi0+YWdmX2xldmVsc1tidG51bV0sIEFSQ0hfQ09OVkVSVCk7CisJCW5sZXZlbHMgPSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9sZXZlbHNbYnRudW1dKTsKIAkJYnJlYWs7CiAJY2FzZSBYRlNfQlROVU1fQk1BUDoKIAkJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKLQkJbmxldmVscyA9IElOVF9HRVQoaWZwLT5pZl9icm9vdC0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgKyAxOworCQlubGV2ZWxzID0gYmUxNl90b19jcHUoaWZwLT5pZl9icm9vdC0+YmJfbGV2ZWwpICsgMTsKIAkJYnJlYWs7CiAJY2FzZSBYRlNfQlROVU1fSU5POgogCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2JwKTsKLQkJbmxldmVscyA9IElOVF9HRVQoYWdpLT5hZ2lfbGV2ZWwsIEFSQ0hfQ09OVkVSVCk7CisJCW5sZXZlbHMgPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9sZXZlbCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKQEAgLTY4Myw5ICs2NjcsOSBAQAogCWJsb2NrID0geGZzX2J0cmVlX2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOwogCXhmc19idHJlZV9jaGVja19ibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApOwogCWlmIChYRlNfQlRSRUVfTE9OR19QVFJTKGN1ci0+YmNfYnRudW0pKQotCQlyZXR1cm4gSU5UX0dFVChibG9jay0+YmJfdS5sLmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExERlNCTk87CisJCXJldHVybiBiZTY0X3RvX2NwdShibG9jay0+YmJfdS5sLmJiX3JpZ2h0c2liKSA9PSBOVUxMREZTQk5POwogCWVsc2UKLQkJcmV0dXJuIElOVF9HRVQoYmxvY2stPmJiX3Uucy5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSzsKKwkJcmV0dXJuIGJlMzJfdG9fY3B1KGJsb2NrLT5iYl91LnMuYmJfcmlnaHRzaWIpID09IE5VTExBR0JMT0NLOwogfQogCiAvKgpAQCAtNzEzLDcgKzY5Nyw3IEBACiAJLyoKIAkgKiBTZXQgdGhlIHB0ciB2YWx1ZSB0byBudW1yZWNzLCB0aGF0J3MgdGhlIGxhc3QgcmVjb3JkL2tleS4KIAkgKi8KLQljdXItPmJjX3B0cnNbbGV2ZWxdID0gSU5UX0dFVChibG9jay0+YmJfaC5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCWN1ci0+YmNfcHRyc1tsZXZlbF0gPSBiZTE2X3RvX2NwdShibG9jay0+YmJfaC5iYl9udW1yZWNzKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtODgzLDM4ICs4NjcsMzggQEAKIAljYXNlIFhGU19CVE5VTV9CTk86CiAJY2FzZSBYRlNfQlROVU1fQ05UOgogCQlhID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhjdXItPmJjX2J1ZnNbbGV2XSk7Ci0JCWlmICgobHIgJiBYRlNfQlRDVVJfTEVGVFJBKSAmJiBJTlRfR0VUKGEtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJaWYgKChsciAmIFhGU19CVENVUl9MRUZUUkEpICYmIGJlMzJfdG9fY3B1KGEtPmJiX2xlZnRzaWIpICE9IE5VTExBR0JMT0NLKSB7CiAJCQl4ZnNfYnRyZWVfcmVhZGFfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3ByaXZhdGUuYS5hZ25vLAotCQkJCUlOVF9HRVQoYS0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSwgMSk7CisJCQkJYmUzMl90b19jcHUoYS0+YmJfbGVmdHNpYiksIDEpOwogCQkJcnZhbCsrOwogCQl9Ci0JCWlmICgobHIgJiBYRlNfQlRDVVJfUklHSFRSQSkgJiYgSU5UX0dFVChhLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQlpZiAoKGxyICYgWEZTX0JUQ1VSX1JJR0hUUkEpICYmIGJlMzJfdG9fY3B1KGEtPmJiX3JpZ2h0c2liKSAhPSBOVUxMQUdCTE9DSykgewogCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKLQkJCQlJTlRfR0VUKGEtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAxKTsKKwkJCQliZTMyX3RvX2NwdShhLT5iYl9yaWdodHNpYiksIDEpOwogCQkJcnZhbCsrOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgWEZTX0JUTlVNX0JNQVA6CiAJCWIgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soY3VyLT5iY19idWZzW2xldl0pOwotCQlpZiAoKGxyICYgWEZTX0JUQ1VSX0xFRlRSQSkgJiYgSU5UX0dFVChiLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExERlNCTk8pIHsKLQkJCXhmc19idHJlZV9yZWFkYV9idWZsKGN1ci0+YmNfbXAsIElOVF9HRVQoYi0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSwgMSk7CisJCWlmICgobHIgJiBYRlNfQlRDVVJfTEVGVFJBKSAmJiBiZTY0X3RvX2NwdShiLT5iYl9sZWZ0c2liKSAhPSBOVUxMREZTQk5PKSB7CisJCQl4ZnNfYnRyZWVfcmVhZGFfYnVmbChjdXItPmJjX21wLCBiZTY0X3RvX2NwdShiLT5iYl9sZWZ0c2liKSwgMSk7CiAJCQlydmFsKys7CiAJCX0KLQkJaWYgKChsciAmIFhGU19CVENVUl9SSUdIVFJBKSAmJiBJTlRfR0VUKGItPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExERlNCTk8pIHsKLQkJCXhmc19idHJlZV9yZWFkYV9idWZsKGN1ci0+YmNfbXAsIElOVF9HRVQoYi0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksIDEpOworCQlpZiAoKGxyICYgWEZTX0JUQ1VSX1JJR0hUUkEpICYmIGJlNjRfdG9fY3B1KGItPmJiX3JpZ2h0c2liKSAhPSBOVUxMREZTQk5PKSB7CisJCQl4ZnNfYnRyZWVfcmVhZGFfYnVmbChjdXItPmJjX21wLCBiZTY0X3RvX2NwdShiLT5iYl9yaWdodHNpYiksIDEpOwogCQkJcnZhbCsrOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgWEZTX0JUTlVNX0lOTzoKIAkJaSA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soY3VyLT5iY19idWZzW2xldl0pOwotCQlpZiAoKGxyICYgWEZTX0JUQ1VSX0xFRlRSQSkgJiYgSU5UX0dFVChpLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0JMT0NLKSB7CisJCWlmICgobHIgJiBYRlNfQlRDVVJfTEVGVFJBKSAmJiBiZTMyX3RvX2NwdShpLT5iYl9sZWZ0c2liKSAhPSBOVUxMQUdCTE9DSykgewogCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmkuYWdubywKLQkJCQlJTlRfR0VUKGktPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCksIDEpOworCQkJCWJlMzJfdG9fY3B1KGktPmJiX2xlZnRzaWIpLCAxKTsKIAkJCXJ2YWwrKzsKIAkJfQotCQlpZiAoKGxyICYgWEZTX0JUQ1VSX1JJR0hUUkEpICYmIElOVF9HRVQoaS0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJaWYgKChsciAmIFhGU19CVENVUl9SSUdIVFJBKSAmJiBiZTMyX3RvX2NwdShpLT5iYl9yaWdodHNpYikgIT0gTlVMTEFHQkxPQ0spIHsKIAkJCXhmc19idHJlZV9yZWFkYV9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sCi0JCQkJSU5UX0dFVChpLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMSk7CisJCQkJYmUzMl90b19jcHUoaS0+YmJfcmlnaHRzaWIpLCAxKTsKIAkJCXJ2YWwrKzsKIAkJfQogCQlicmVhazsKQEAgLTk0NiwxNCArOTMwLDE0IEBACiAJCXJldHVybjsKIAliID0gWEZTX0JVRl9UT19CTE9DSyhicCk7CiAJaWYgKFhGU19CVFJFRV9MT05HX1BUUlMoY3VyLT5iY19idG51bSkpIHsKLQkJaWYgKElOVF9HRVQoYi0+YmJfdS5sLmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTykKKwkJaWYgKGJlNjRfdG9fY3B1KGItPmJiX3UubC5iYl9sZWZ0c2liKSA9PSBOVUxMREZTQk5PKQogCQkJY3VyLT5iY19yYVtsZXZdIHw9IFhGU19CVENVUl9MRUZUUkE7Ci0JCWlmIChJTlRfR0VUKGItPmJiX3UubC5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKQorCQlpZiAoYmU2NF90b19jcHUoYi0+YmJfdS5sLmJiX3JpZ2h0c2liKSA9PSBOVUxMREZTQk5PKQogCQkJY3VyLT5iY19yYVtsZXZdIHw9IFhGU19CVENVUl9SSUdIVFJBOwogCX0gZWxzZSB7Ci0JCWlmIChJTlRfR0VUKGItPmJiX3Uucy5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLKQorCQlpZiAoYmUzMl90b19jcHUoYi0+YmJfdS5zLmJiX2xlZnRzaWIpID09IE5VTExBR0JMT0NLKQogCQkJY3VyLT5iY19yYVtsZXZdIHw9IFhGU19CVENVUl9MRUZUUkE7Ci0JCWlmIChJTlRfR0VUKGItPmJiX3Uucy5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykKKwkJaWYgKGJlMzJfdG9fY3B1KGItPmJiX3Uucy5iYl9yaWdodHNpYikgPT0gTlVMTEFHQkxPQ0spCiAJCQljdXItPmJjX3JhW2xldl0gfD0gWEZTX0JUQ1VSX1JJR0hUUkE7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idHJlZS5oIGIvZnMveGZzL3hmc19idHJlZS5oCmluZGV4IDA5YjRlMTUuLjQ0ZjFiZDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnRyZWUuaAorKysgYi9mcy94ZnMveGZzX2J0cmVlLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19CVFJFRV9IX18KICNkZWZpbmUJX19YRlNfQlRSRUVfSF9fCkBAIC01MywyNSArMzksMjMgQEAKIC8qCiAgKiBTaG9ydCBmb3JtIGhlYWRlcjogc3BhY2UgYWxsb2NhdGlvbiBidHJlZXMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IHhmc19idHJlZV9zYmxvY2sKLXsKLQlfX3VpbnQzMl90CWJiX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgZm9yIGJsb2NrIHR5cGUgKi8KLQlfX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLwotCV9fdWludDE2X3QJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLwotCXhmc19hZ2Jsb2NrX3QJYmJfbGVmdHNpYjsJLyogbGVmdCBzaWJsaW5nIGJsb2NrIG9yIE5VTExBR0JMT0NLICovCi0JeGZzX2FnYmxvY2tfdAliYl9yaWdodHNpYjsJLyogcmlnaHQgc2libGluZyBibG9jayBvciBOVUxMQUdCTE9DSyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2J0cmVlX3NibG9jayB7CisJX19iZTMyCQliYl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBibG9jayB0eXBlICovCisJX19iZTE2CQliYl9sZXZlbDsJLyogMCBpcyBhIGxlYWYgKi8KKwlfX2JlMTYJCWJiX251bXJlY3M7CS8qIGN1cnJlbnQgIyBvZiBkYXRhIHJlY29yZHMgKi8KKwlfX2JlMzIJCWJiX2xlZnRzaWI7CS8qIGxlZnQgc2libGluZyBibG9jayBvciBOVUxMQUdCTE9DSyAqLworCV9fYmUzMgkJYmJfcmlnaHRzaWI7CS8qIHJpZ2h0IHNpYmxpbmcgYmxvY2sgb3IgTlVMTEFHQkxPQ0sgKi8KIH0geGZzX2J0cmVlX3NibG9ja190OwogCiAvKgogICogTG9uZyBmb3JtIGhlYWRlcjogYm1hcCBidHJlZXMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IHhmc19idHJlZV9sYmxvY2sKLXsKLQlfX3VpbnQzMl90CWJiX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgZm9yIGJsb2NrIHR5cGUgKi8KLQlfX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLwotCV9fdWludDE2X3QJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLwotCXhmc19kZnNibm9fdAliYl9sZWZ0c2liOwkvKiBsZWZ0IHNpYmxpbmcgYmxvY2sgb3IgTlVMTERGU0JOTyAqLwotCXhmc19kZnNibm9fdAliYl9yaWdodHNpYjsJLyogcmlnaHQgc2libGluZyBibG9jayBvciBOVUxMREZTQk5PICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfbGJsb2NrIHsKKwlfX2JlMzIJCWJiX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgZm9yIGJsb2NrIHR5cGUgKi8KKwlfX2JlMTYJCWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLworCV9fYmUxNgkJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLworCV9fYmU2NAkJYmJfbGVmdHNpYjsJLyogbGVmdCBzaWJsaW5nIGJsb2NrIG9yIE5VTExERlNCTk8gKi8KKwlfX2JlNjQJCWJiX3JpZ2h0c2liOwkvKiByaWdodCBzaWJsaW5nIGJsb2NrIG9yIE5VTExERlNCTk8gKi8KIH0geGZzX2J0cmVlX2xibG9ja190OwogCiAvKgpAQCAtNzksMjQgKzYzLDIzIEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IHhmc19idHJlZV9oZHIKIHsKLQlfX3VpbnQzMl90CWJiX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgZm9yIGJsb2NrIHR5cGUgKi8KLQlfX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLwotCV9fdWludDE2X3QJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLworCV9fYmUzMgkJYmJfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgYmxvY2sgdHlwZSAqLworCV9fYmUxNgkJYmJfbGV2ZWw7CS8qIDAgaXMgYSBsZWFmICovCisJX19iZTE2CQliYl9udW1yZWNzOwkvKiBjdXJyZW50ICMgb2YgZGF0YSByZWNvcmRzICovCiB9IHhmc19idHJlZV9oZHJfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCi17Cit0eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sgewogCXhmc19idHJlZV9oZHJfdAliYl9oOwkJLyogaGVhZGVyICovCi0JdW5pb24JCXsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2JlMzIJCWJiX2xlZnRzaWI7CisJCQlfX2JlMzIJCWJiX3JpZ2h0c2liOworCQl9IHM7CQkJLyogc2hvcnQgZm9ybSBwb2ludGVycyAqLwogCQlzdHJ1Y3QJewotCQkJeGZzX2FnYmxvY2tfdAliYl9sZWZ0c2liOwotCQkJeGZzX2FnYmxvY2tfdAliYl9yaWdodHNpYjsKLQkJfQlzOwkJLyogc2hvcnQgZm9ybSBwb2ludGVycyAqLwotCQlzdHJ1Y3QJewotCQkJeGZzX2Rmc2Jub190CWJiX2xlZnRzaWI7Ci0JCQl4ZnNfZGZzYm5vX3QJYmJfcmlnaHRzaWI7Ci0JCX0JbDsJCS8qIGxvbmcgZm9ybSBwb2ludGVycyAqLwotCX0JCWJiX3U7CQkvKiByZXN0ICovCisJCQlfX2JlNjQJCWJiX2xlZnRzaWI7CisJCQlfX2JlNjQJCWJiX3JpZ2h0c2liOworCQl9IGw7CQkJLyogbG9uZyBmb3JtIHBvaW50ZXJzICovCisJfSBiYl91OwkJCQkvKiByZXN0ICovCiB9IHhmc19idHJlZV9ibG9ja190OwogCiAvKgpAQCAtMTEzLDEyICs5Niw3IEBACiAvKgogICogQm9vbGVhbiB0byBzZWxlY3Qgd2hpY2ggZm9ybSBvZiB4ZnNfYnRyZWVfYmxvY2tfdC5iYl91IHRvIHVzZS4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlRSRUVfTE9OR19QVFJTKQotaW50IHhmc19idHJlZV9sb25nX3B0cnMoeGZzX2J0bnVtX3QgYnRudW0pOwogI2RlZmluZQlYRlNfQlRSRUVfTE9OR19QVFJTKGJ0bnVtKQkoKGJ0bnVtKSA9PSBYRlNfQlROVU1fQk1BUCkKLSNlbHNlCi0jZGVmaW5lCVhGU19CVFJFRV9MT05HX1BUUlMoYnRudW0pCSgoYnRudW0pID09IFhGU19CVE5VTV9CTUFQKQotI2VuZGlmCiAKIC8qCiAgKiBNYWdpYyBudW1iZXJzIGZvciBidHJlZSBibG9ja3MuCkBAIC0xNjUsNyArMTQzLDcgQEAKIAlzdHJ1Y3QgeGZzX3RyYW5zCSpiY190cDsJLyogdHJhbnNhY3Rpb24gd2UncmUgaW4sIGlmIGFueSAqLwogCXN0cnVjdCB4ZnNfbW91bnQJKmJjX21wOwkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3QgKi8KIAl1bmlvbiB7Ci0JCXhmc19hbGxvY19yZWNfdAkJYTsKKwkJeGZzX2FsbG9jX3JlY19pbmNvcmVfdAlhOwogCQl4ZnNfYm1idF9pcmVjX3QJCWI7CiAJCXhmc19pbm9idF9yZWNfdAkJaTsKIAl9CQliY19yZWM7CQkvKiBjdXJyZW50IGluc2VydC9zZWFyY2ggcmVjb3JkIHZhbHVlICovCkBAIC0yMDUsMjQgKzE4MywxMCBAQAogLyoKICAqIENvbnZlcnQgZnJvbSBidWZmZXIgdG8gYnRyZWUgYmxvY2sgaGVhZGVyLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fQkxPQ0spCi14ZnNfYnRyZWVfYmxvY2tfdCAqeGZzX2J1Zl90b19ibG9jayhzdHJ1Y3QgeGZzX2J1ZiAqYnApOwotI2RlZmluZQlYRlNfQlVGX1RPX0JMT0NLKGJwKQl4ZnNfYnVmX3RvX2Jsb2NrKGJwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0JVRl9UT19CTE9DSyhicCkJKCh4ZnNfYnRyZWVfYmxvY2tfdCAqKShYRlNfQlVGX1BUUihicCkpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fTEJMT0NLKQoteGZzX2J0cmVlX2xibG9ja190ICp4ZnNfYnVmX3RvX2xibG9jayhzdHJ1Y3QgeGZzX2J1ZiAqYnApOwotI2RlZmluZQlYRlNfQlVGX1RPX0xCTE9DSyhicCkJeGZzX2J1Zl90b19sYmxvY2soYnApCi0jZWxzZQotI2RlZmluZQlYRlNfQlVGX1RPX0xCTE9DSyhicCkJKCh4ZnNfYnRyZWVfbGJsb2NrX3QgKikoWEZTX0JVRl9QVFIoYnApKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX1NCTE9DSykKLXhmc19idHJlZV9zYmxvY2tfdCAqeGZzX2J1Zl90b19zYmxvY2soc3RydWN0IHhmc19idWYgKmJwKTsKLSNkZWZpbmUJWEZTX0JVRl9UT19TQkxPQ0soYnApCXhmc19idWZfdG9fc2Jsb2NrKGJwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0JVRl9UT19TQkxPQ0soYnApCSgoeGZzX2J0cmVlX3NibG9ja190ICopKFhGU19CVUZfUFRSKGJwKSkpCi0jZW5kaWYKKyNkZWZpbmUJWEZTX0JVRl9UT19CTE9DSyhicCkJKCh4ZnNfYnRyZWVfYmxvY2tfdCAqKVhGU19CVUZfUFRSKGJwKSkKKyNkZWZpbmUJWEZTX0JVRl9UT19MQkxPQ0soYnApCSgoeGZzX2J0cmVlX2xibG9ja190ICopWEZTX0JVRl9QVFIoYnApKQorI2RlZmluZQlYRlNfQlVGX1RPX1NCTE9DSyhicCkJKCh4ZnNfYnRyZWVfc2Jsb2NrX3QgKilYRlNfQlVGX1BUUihicCkpCisKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtNDc3LDEwNiArNDQxLDMzIEBACiAvKgogICogTWluIGFuZCBtYXggZnVuY3Rpb25zIGZvciBleHRsZW4sIGFnYmxvY2ssIGZpbGVvZmYsIGFuZCBmaWxibGtzIHR5cGVzLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19FWFRMRU5fTUlOKQoteGZzX2V4dGxlbl90IHhmc19leHRsZW5fbWluKHhmc19leHRsZW5fdCBhLCB4ZnNfZXh0bGVuX3QgYik7Ci0jZGVmaW5lCVhGU19FWFRMRU5fTUlOKGEsYikJeGZzX2V4dGxlbl9taW4oYSxiKQotI2Vsc2UKICNkZWZpbmUJWEZTX0VYVExFTl9NSU4oYSxiKQlcCiAJKCh4ZnNfZXh0bGVuX3QpKGEpIDwgKHhmc19leHRsZW5fdCkoYikgPyBcCi0JICh4ZnNfZXh0bGVuX3QpKGEpIDogKHhmc19leHRsZW5fdCkoYikpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0VYVExFTl9NQVgpCi14ZnNfZXh0bGVuX3QgeGZzX2V4dGxlbl9tYXgoeGZzX2V4dGxlbl90IGEsIHhmc19leHRsZW5fdCBiKTsKLSNkZWZpbmUJWEZTX0VYVExFTl9NQVgoYSxiKQl4ZnNfZXh0bGVuX21heChhLGIpCi0jZWxzZQorCQkoeGZzX2V4dGxlbl90KShhKSA6ICh4ZnNfZXh0bGVuX3QpKGIpKQogI2RlZmluZQlYRlNfRVhUTEVOX01BWChhLGIpCVwKIAkoKHhmc19leHRsZW5fdCkoYSkgPiAoeGZzX2V4dGxlbl90KShiKSA/IFwKLQkgKHhmc19leHRsZW5fdCkoYSkgOiAoeGZzX2V4dGxlbl90KShiKSkKLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0JMT0NLX01JTikKLXhmc19hZ2Jsb2NrX3QgeGZzX2FnYmxvY2tfbWluKHhmc19hZ2Jsb2NrX3QgYSwgeGZzX2FnYmxvY2tfdCBiKTsKLSNkZWZpbmUJWEZTX0FHQkxPQ0tfTUlOKGEsYikJeGZzX2FnYmxvY2tfbWluKGEsYikKLSNlbHNlCisJCSh4ZnNfZXh0bGVuX3QpKGEpIDogKHhmc19leHRsZW5fdCkoYikpCiAjZGVmaW5lCVhGU19BR0JMT0NLX01JTihhLGIpCVwKIAkoKHhmc19hZ2Jsb2NrX3QpKGEpIDwgKHhmc19hZ2Jsb2NrX3QpKGIpID8gXAotCSAoeGZzX2FnYmxvY2tfdCkoYSkgOiAoeGZzX2FnYmxvY2tfdCkoYikpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHQkxPQ0tfTUFYKQoteGZzX2FnYmxvY2tfdCB4ZnNfYWdibG9ja19tYXgoeGZzX2FnYmxvY2tfdCBhLCB4ZnNfYWdibG9ja190IGIpOwotI2RlZmluZQlYRlNfQUdCTE9DS19NQVgoYSxiKQl4ZnNfYWdibG9ja19tYXgoYSxiKQotI2Vsc2UKKwkJKHhmc19hZ2Jsb2NrX3QpKGEpIDogKHhmc19hZ2Jsb2NrX3QpKGIpKQogI2RlZmluZQlYRlNfQUdCTE9DS19NQVgoYSxiKQlcCiAJKCh4ZnNfYWdibG9ja190KShhKSA+ICh4ZnNfYWdibG9ja190KShiKSA/IFwKLQkgKHhmc19hZ2Jsb2NrX3QpKGEpIDogKHhmc19hZ2Jsb2NrX3QpKGIpKQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZJTEVPRkZfTUlOKQoteGZzX2ZpbGVvZmZfdCB4ZnNfZmlsZW9mZl9taW4oeGZzX2ZpbGVvZmZfdCBhLCB4ZnNfZmlsZW9mZl90IGIpOwotI2RlZmluZQlYRlNfRklMRU9GRl9NSU4oYSxiKQl4ZnNfZmlsZW9mZl9taW4oYSxiKQotI2Vsc2UKKwkJKHhmc19hZ2Jsb2NrX3QpKGEpIDogKHhmc19hZ2Jsb2NrX3QpKGIpKQogI2RlZmluZQlYRlNfRklMRU9GRl9NSU4oYSxiKQlcCiAJKCh4ZnNfZmlsZW9mZl90KShhKSA8ICh4ZnNfZmlsZW9mZl90KShiKSA/IFwKLQkgKHhmc19maWxlb2ZmX3QpKGEpIDogKHhmc19maWxlb2ZmX3QpKGIpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GSUxFT0ZGX01BWCkKLXhmc19maWxlb2ZmX3QgeGZzX2ZpbGVvZmZfbWF4KHhmc19maWxlb2ZmX3QgYSwgeGZzX2ZpbGVvZmZfdCBiKTsKLSNkZWZpbmUJWEZTX0ZJTEVPRkZfTUFYKGEsYikJeGZzX2ZpbGVvZmZfbWF4KGEsYikKLSNlbHNlCisJCSh4ZnNfZmlsZW9mZl90KShhKSA6ICh4ZnNfZmlsZW9mZl90KShiKSkKICNkZWZpbmUJWEZTX0ZJTEVPRkZfTUFYKGEsYikJXAogCSgoeGZzX2ZpbGVvZmZfdCkoYSkgPiAoeGZzX2ZpbGVvZmZfdCkoYikgPyBcCi0JICh4ZnNfZmlsZW9mZl90KShhKSA6ICh4ZnNfZmlsZW9mZl90KShiKSkKLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GSUxCTEtTX01JTikKLXhmc19maWxibGtzX3QgeGZzX2ZpbGJsa3NfbWluKHhmc19maWxibGtzX3QgYSwgeGZzX2ZpbGJsa3NfdCBiKTsKLSNkZWZpbmUJWEZTX0ZJTEJMS1NfTUlOKGEsYikJeGZzX2ZpbGJsa3NfbWluKGEsYikKLSNlbHNlCisJCSh4ZnNfZmlsZW9mZl90KShhKSA6ICh4ZnNfZmlsZW9mZl90KShiKSkKICNkZWZpbmUJWEZTX0ZJTEJMS1NfTUlOKGEsYikJXAogCSgoeGZzX2ZpbGJsa3NfdCkoYSkgPCAoeGZzX2ZpbGJsa3NfdCkoYikgPyBcCi0JICh4ZnNfZmlsYmxrc190KShhKSA6ICh4ZnNfZmlsYmxrc190KShiKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRklMQkxLU19NQVgpCi14ZnNfZmlsYmxrc190IHhmc19maWxibGtzX21heCh4ZnNfZmlsYmxrc190IGEsIHhmc19maWxibGtzX3QgYik7Ci0jZGVmaW5lCVhGU19GSUxCTEtTX01BWChhLGIpCXhmc19maWxibGtzX21heChhLGIpCi0jZWxzZQorCQkoeGZzX2ZpbGJsa3NfdCkoYSkgOiAoeGZzX2ZpbGJsa3NfdCkoYikpCiAjZGVmaW5lCVhGU19GSUxCTEtTX01BWChhLGIpCVwKIAkoKHhmc19maWxibGtzX3QpKGEpID4gKHhmc19maWxibGtzX3QpKGIpID8gXAotCSAoeGZzX2ZpbGJsa3NfdCkoYSkgOiAoeGZzX2ZpbGJsa3NfdCkoYikpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZTQl9TQU5JVFlfQ0hFQ0spCi1pbnQgeGZzX2ZzYl9zYW5pdHlfY2hlY2soc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19mc2Jsb2NrX3QgZnNiKTsKLSNkZWZpbmUJWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsZnNiKQl4ZnNfZnNiX3Nhbml0eV9jaGVjayhtcCxmc2IpCi0jZWxzZQorCQkoeGZzX2ZpbGJsa3NfdCkoYSkgOiAoeGZzX2ZpbGJsa3NfdCkoYikpCisKICNkZWZpbmUJWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsZnNiKQlcCiAJKFhGU19GU0JfVE9fQUdOTyhtcCwgZnNiKSA8IG1wLT5tX3NiLnNiX2FnY291bnQgJiYgXAotCSBYRlNfRlNCX1RPX0FHQk5PKG1wLCBmc2IpIDwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpCi0jZW5kaWYKLQotLyoKLSAqIE1hY3JvcyB0byBzZXQgRUZTQ09SUlVQVEVEICYgcmV0dXJuL2JyYW5jaC4KLSAqLwotI2RlZmluZQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyh4LGwpCVwKLQl7IFwKLQkJaW50IGZzX2lzX29rID0gKHgpOyBcCi0JCUFTU0VSVChmc19pc19vayk7IFwKLQkJaWYgKHVubGlrZWx5KCFmc19pc19vaykpIHsgXAotCQkJWEZTX0VSUk9SX1JFUE9SVCgiWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8iLCBcCi0JCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBOVUxMKTsgXAotCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsgXAotCQkJZ290byBsOyBcCi0JCX0gXAotCX0KLQotI2RlZmluZQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKHgpCVwKLQl7IFwKLQkJaW50IGZzX2lzX29rID0gKHgpOyBcCi0JCUFTU0VSVChmc19pc19vayk7IFwKLQkJaWYgKHVubGlrZWx5KCFmc19pc19vaykpIHsgXAotCQkJWEZTX0VSUk9SX1JFUE9SVCgiWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTiIsIFwKLQkJCQkJIFhGU19FUlJMRVZFTF9MT1csIE5VTEwpOyBcCi0JCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7IFwKLQkJfSBcCi0JfQorCQlYRlNfRlNCX1RPX0FHQk5PKG1wLCBmc2IpIDwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpCiAKICNlbmRpZgkvKiBfX1hGU19CVFJFRV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwppbmRleCBhMjY0NjU3Li4wN2UyMzI0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCkBAIC0xLDU3ICsxLDMzIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB4ZnNfYnVmX2xvZ19pdGVtLgotICogSXQgY29udGFpbnMgdGhlIGl0ZW0gb3BlcmF0aW9ucyB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGJ1ZiBsb2cKLSAqIGl0ZW1zIGFzIHdlbGwgYXMgdXRpbGl0eSByb3V0aW5lcyB1c2VkIGJ5IHRoZSBidWZmZXIgc3BlY2lmaWMKLSAqIHRyYW5zYWN0aW9uIHJvdXRpbmVzLgotICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLQotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKLSNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKLSNpbmNsdWRlICJ4ZnNfcncuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWZfaXRlbS5oIGIvZnMveGZzL3hmc19idWZfaXRlbS5oCmluZGV4IDAxYWVkNWYuLjA3YzcwOGMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaAorKysgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZglfX1hGU19CVUZfSVRFTV9IX18KICNkZWZpbmUJX19YRlNfQlVGX0lURU1fSF9fCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2NhcC5oIGIvZnMveGZzL3hmc19jYXAuaAppbmRleCAyZGVhYzczLi40MzNlYzUzIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2NhcC5oCisrKyBiL2ZzL3hmcy94ZnNfY2FwLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19DQVBfSF9fCiAjZGVmaW5lIF9fWEZTX0NBUF9IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfY2xudC5oIGIvZnMveGZzL3hmc19jbG50LmgKaW5kZXggYjMyMTVmZi4uMzI4YTUyOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19jbG50LmgKKysrIGIvZnMveGZzL3hmc19jbG50LmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfQ0xOVF9IX18KICNkZWZpbmUgX19YRlNfQ0xOVF9IX18KQEAgLTU1LDYgKzQxLDcgQEAKICAqLwogc3RydWN0IHhmc19tb3VudF9hcmdzIHsKIAlpbnQJZmxhZ3M7CQkvKiBmbGFncyAtPiBzZWUgWEZTTU5UXy4uLiBtYWNyb3MgYmVsb3cgKi8KKwlpbnQJZmxhZ3MyOwkJLyogZmxhZ3MgLT4gc2VlIFhGU01OVDJfLi4uIG1hY3JvcyBiZWxvdyAqLwogCWludAlsb2didWZzOwkvKiBOdW1iZXIgb2YgbG9nIGJ1ZmZlcnMsIC0xIHRvIGRlZmF1bHQgKi8KIAlpbnQJbG9nYnVmc2l6ZTsJLyogU2l6ZSBvZiBsb2cgYnVmZmVycywgLTEgdG8gZGVmYXVsdCAqLwogCWNoYXIJZnNuYW1lW01BWE5BTUVMRU4rMV07CS8qIGRhdGEgZGV2aWNlIG5hbWUgKi8KQEAgLTY4LDkgKzU1LDkgQEAKIH07CiAKIC8qCi0gKiBYRlMgbW91bnQgb3B0aW9uIGZsYWdzCisgKiBYRlMgbW91bnQgb3B0aW9uIGZsYWdzIC0tIGFyZ3MtPmZsYWdzMQogICovCi0jZGVmaW5lCVhGU01OVF9DSEtMT0cJCTB4MDAwMDAwMDEJLyogY2hlY2sgbG9nICovCisjZGVmaW5lCVhGU01OVF9DT01QQVRfQVRUUgkweDAwMDAwMDAxCS8qIGRvIG5vdCB1c2UgQVRUUjIgZm9ybWF0ICovCiAjZGVmaW5lCVhGU01OVF9XU1lOQwkJMHgwMDAwMDAwMgkvKiBzYWZlIG1vZGUgbmZzIG1vdW50CiAJCQkJCQkgKiBjb21wYXRpYmxlICovCiAjZGVmaW5lCVhGU01OVF9JTk82NAkJMHgwMDAwMDAwNAkvKiBtb3ZlIGlub2RlIG51bWJlcnMgdXAKQEAgLTkxLDcgKzc4LDcgQEAKICNkZWZpbmUgWEZTTU5UX1NIQVJFRAkJMHgwMDAwMTAwMAkvKiBzaGFyZWQgWEZTIG1vdW50ICovCiAjZGVmaW5lIFhGU01OVF9JT1NJWkUJCTB4MDAwMDIwMDAJLyogb3B0aW1pemUgZm9yIEkvTyBzaXplICovCiAjZGVmaW5lIFhGU01OVF9PU1lOQ0lTT1NZTkMJMHgwMDAwNDAwMAkvKiBvX3N5bmMgaXMgUkVBTExZIG9fc3luYyAqLwotCQkJCQkJLyogKG9zeW5jaXNkc3luYyBpcyBub3cgZGVmYXVsdCkgKi8KKwkJCQkJCS8qIChvc3luY2lzZHN5bmMgaXMgZGVmYXVsdCkgKi8KICNkZWZpbmUgWEZTTU5UXzMyQklUSU5PREVTCTB4MDAyMDAwMDAJLyogcmVzdHJpY3QgaW5vZGVzIHRvIDMyCiAJCQkJCQkgKiBiaXRzIG9mIGFkZHJlc3Mgc3BhY2UgKi8KICNkZWZpbmUgWEZTTU5UX0dRVU9UQQkJMHgwMDQwMDAwMAkvKiBncm91cCBxdW90YSBhY2NvdW50aW5nICovCkBAIC05OSwxMiArODYsMTkgQEAKIAkJCQkJCSAqIGVuZm9yY2VtZW50ICovCiAjZGVmaW5lIFhGU01OVF9OT1VVSUQJCTB4MDEwMDAwMDAJLyogSWdub3JlIGZzIHV1aWQgKi8KICNkZWZpbmUgWEZTTU5UX0RNQVBJCQkweDAyMDAwMDAwCS8qIGVuYWJsZSBkbWFwaS94ZHNtICovCi0jZGVmaW5lIFhGU01OVF9OT0xPR0ZMVVNICTB4MDQwMDAwMDAJLyogRG9uJ3QgZmx1c2ggZm9yIGxvZyBibG9ja3MgKi8KKyNkZWZpbmUgWEZTTU5UX0JBUlJJRVIJCTB4MDQwMDAwMDAJLyogdXNlIHdyaXRlIGJhcnJpZXJzICovCiAjZGVmaW5lIFhGU01OVF9JREVMRVRFCQkweDA4MDAwMDAwCS8qIGlub2RlIGNsdXN0ZXIgZGVsZXRlICovCiAjZGVmaW5lIFhGU01OVF9TV0FMTE9DCQkweDEwMDAwMDAwCS8qIHR1cm4gb24gc3RyaXBlIHdpZHRoCiAJCQkJCQkgKiBhbGxvY2F0aW9uICovCiAjZGVmaW5lIFhGU01OVF9JSEFTSFNJWkUJMHgyMDAwMDAwMAkvKiBpbm9kZSBoYXNoIHRhYmxlIHNpemUgKi8KICNkZWZpbmUgWEZTTU5UX0RJUlNZTkMJCTB4NDAwMDAwMDAJLyogc3luYyBjcmVhdCxsaW5rLHVubGluayxyZW5hbWUKIAkJCQkJCSAqIHN5bWxpbmssbWtkaXIscm1kaXIsbWtub2QgKi8KKyNkZWZpbmUgWEZTTU5UX0ZMQUdTMgkJMHg4MDAwMDAwMAkvKiBtb3JlIGZsYWdzIHNldCBpbiBmbGFnczIgKi8KKworLyoKKyAqIFhGUyBtb3VudCBvcHRpb24gZmxhZ3MgLS0gYXJncy0+ZmxhZ3MyCisgKi8KKyNkZWZpbmUgWEZTTU5UMl9DT01QQVRfSU9TSVpFCTB4MDAwMDAwMDEJLyogZG9uJ3QgcmVwb3J0IGxhcmdlIHByZWZlcnJlZAorCQkJCQkJICogSS9PIHNpemUgaW4gc3RhdCgyKSAqLwogCiAjZW5kaWYJLyogX19YRlNfQ0xOVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYwppbmRleCA4Yjc5MmRkLi40NzM2NzFmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RhX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19kYV9idHJlZS5jCkBAIC0xLDQxICsxLDI2IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLQotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKQEAgLTQzLDE5ICsyOCwxOSBAQAogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKLSNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgogI2luY2x1ZGUgInhmc19hdHRyX2xlYWYuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKQEAgLTY0LDcgKzQ5LDYgQEAKICNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgogI2luY2x1ZGUgInhmc19kaXIyX25vZGUuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAKIC8qCiAgKiB4ZnNfZGFfYnRyZWUuYwpAQCAtMTkwLDkgKzE3NCw2IEBACiAJCSAqLwogCQlzd2l0Y2ggKG9sZGJsay0+bWFnaWMpIHsKIAkJY2FzZSBYRlNfQVRUUl9MRUFGX01BR0lDOgotI2lmbmRlZiBfX0tFUk5FTF9fCi0JCQlyZXR1cm4oRU5PVFRZKTsKLSNlbHNlCiAJCQllcnJvciA9IHhmc19hdHRyX2xlYWZfc3BsaXQoc3RhdGUsIG9sZGJsaywgbmV3YmxrKTsKIAkJCWlmICgoZXJyb3IgIT0gMCkgJiYgKGVycm9yICE9IEVOT1NQQykpIHsKIAkJCQlyZXR1cm4oZXJyb3IpOwkvKiBHUk9UOiBhdHRyIGlzIGluY29uc2lzdGVudCAqLwpAQCAtMjE4LDcgKzE5OSw2IEBACiAJCQkJcmV0dXJuKGVycm9yKTsJLyogR1JPVDogYXR0ciBpbmNvbnNpc3RlbnQgKi8KIAkJCWFkZGJsayA9IG5ld2JsazsKIAkJCWJyZWFrOwotI2VuZGlmCiAJCWNhc2UgWEZTX0RJUl9MRUFGX01BR0lDOgogCQkJQVNTRVJUKFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKSk7CiAJCQllcnJvciA9IHhmc19kaXJfbGVhZl9zcGxpdChzdGF0ZSwgb2xkYmxrLCBuZXdibGspOwpAQCAtNDQ5LDcgKzQyOSw4IEBACiAJLyoKIAkgKiBXaXRoIFYyIHRoZSBleHRyYSBibG9jayBpcyBkYXRhIG9yIGZyZWVzcGFjZS4KIAkgKi8KLQl1c2VleHRyYSA9IHN0YXRlLT5leHRyYXZhbGlkICYmIFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKTsKKwl1c2VleHRyYSA9IHN0YXRlLT5leHRyYXZhbGlkICYmIChYRlNfRElSX0lTX1YxKHN0YXRlLT5tcCkgfHwKKwkJCXN0YXRlLT5hcmdzLT53aGljaGZvcmsgPT0gWEZTX0FUVFJfRk9SSyk7CiAJbmV3Y291bnQgPSAxICsgdXNlZXh0cmE7CiAJLyoKIAkgKiBEbyB3ZSBoYXZlIHRvIHNwbGl0IHRoZSBub2RlPwpAQCAtNzA2LDE4ICs2ODcsMTIgQEAKIAkJICovCiAJCXN3aXRjaCAoZHJvcF9ibGstPm1hZ2ljKSB7CiAJCWNhc2UgWEZTX0FUVFJfTEVBRl9NQUdJQzoKLSNpZm5kZWYgX19LRVJORUxfXwotCQkJZXJyb3IgPSBFTk9UVFk7Ci0jZWxzZQogCQkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3Rvb3NtYWxsKHN0YXRlLCAmYWN0aW9uKTsKLSNlbmRpZgogCQkJaWYgKGVycm9yKQogCQkJCXJldHVybihlcnJvcik7CiAJCQlpZiAoYWN0aW9uID09IDApCiAJCQkJcmV0dXJuKDApOwotI2lmZGVmIF9fS0VSTkVMX18KIAkJCXhmc19hdHRyX2xlYWZfdW5iYWxhbmNlKHN0YXRlLCBkcm9wX2Jsaywgc2F2ZV9ibGspOwotI2VuZGlmCiAJCQlicmVhazsKIAkJY2FzZSBYRlNfRElSX0xFQUZfTUFHSUM6CiAJCQlBU1NFUlQoWEZTX0RJUl9JU19WMShzdGF0ZS0+bXApKTsKQEAgLTk3MywxMyArOTQ4LDExIEBACiAJbGV2ZWwgPSBwYXRoLT5hY3RpdmUtMTsKIAlibGsgPSAmcGF0aC0+YmxrWyBsZXZlbCBdOwogCXN3aXRjaCAoYmxrLT5tYWdpYykgewotI2lmZGVmIF9fS0VSTkVMX18KIAljYXNlIFhGU19BVFRSX0xFQUZfTUFHSUM6CiAJCWxhc3RoYXNoID0geGZzX2F0dHJfbGVhZl9sYXN0aGFzaChibGstPmJwLCAmY291bnQpOwogCQlpZiAoY291bnQgPT0gMCkKIAkJCXJldHVybjsKIAkJYnJlYWs7Ci0jZW5kaWYKIAljYXNlIFhGU19ESVJfTEVBRl9NQUdJQzoKIAkJQVNTRVJUKFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKSk7CiAJCWxhc3RoYXNoID0geGZzX2Rpcl9sZWFmX2xhc3RoYXNoKGJsay0+YnAsICZjb3VudCk7CkBAIC0xMjIwLDEyICsxMTkzLDEwIEBACiAJCQkJYmxrbm8gPSBJTlRfR0VUKGJ0cmVlLT5iZWZvcmUsIEFSQ0hfQ09OVkVSVCk7CiAJCQl9CiAJCX0KLSNpZmRlZiBfX0tFUk5FTF9fCiAJCWVsc2UgaWYgKElOVF9HRVQoY3Vyci0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgewogCQkJYmxrLT5oYXNodmFsID0geGZzX2F0dHJfbGVhZl9sYXN0aGFzaChibGstPmJwLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9Ci0jZW5kaWYKIAkJZWxzZSBpZiAoSU5UX0dFVChjdXJyLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpIHsKIAkJCWJsay0+aGFzaHZhbCA9IHhmc19kaXJfbGVhZl9sYXN0aGFzaChibGstPmJwLCBOVUxMKTsKIAkJCWJyZWFrOwpAQCAtMTI1MiwxMyArMTIyMywxMSBAQAogCQkJcmV0dmFsID0geGZzX2RpcjJfbGVhZm5fbG9va3VwX2ludChibGstPmJwLCBhcmdzLAogCQkJCQkJCSZibGstPmluZGV4LCBzdGF0ZSk7CiAJCX0KLSNpZmRlZiBfX0tFUk5FTF9fCiAJCWVsc2UgaWYgKGJsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgewogCQkJcmV0dmFsID0geGZzX2F0dHJfbGVhZl9sb29rdXBfaW50KGJsay0+YnAsIGFyZ3MpOwogCQkJYmxrLT5pbmRleCA9IGFyZ3MtPmluZGV4OwogCQkJYXJncy0+Ymxrbm8gPSBibGstPmJsa25vOwogCQl9Ci0jZW5kaWYKIAkJaWYgKCgocmV0dmFsID09IEVOT0VOVCkgfHwgKHJldHZhbCA9PSBFTk9BVFRSKSkgJiYKIAkJICAgIChibGstPmhhc2h2YWwgPT0gYXJncy0+aGFzaHZhbCkpIHsKIAkJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+cGF0aCwgMSwgMSwKQEAgLTEyNjgsMTIgKzEyMzcsMTAgQEAKIAkJCWlmIChyZXR2YWwgPT0gMCkgewogCQkJCWNvbnRpbnVlOwogCQkJfQotI2lmZGVmIF9fS0VSTkVMX18KIAkJCWVsc2UgaWYgKGJsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgewogCQkJCS8qIHBhdGhfc2hpZnQoKSBnaXZlcyBFTk9FTlQgKi8KIAkJCQlyZXR2YWwgPSBYRlNfRVJST1IoRU5PQVRUUik7CiAJCQl9Ci0jZW5kaWYKIAkJfQogCQlicmVhazsKIAl9CkBAIC0xMzEyLDExICsxMjc5LDkgQEAKIAlBU1NFUlQob2xkX2Jsay0+bWFnaWMgPT0gbmV3X2Jsay0+bWFnaWMpOwogCiAJc3dpdGNoIChvbGRfYmxrLT5tYWdpYykgewotI2lmZGVmIF9fS0VSTkVMX18KIAljYXNlIFhGU19BVFRSX0xFQUZfTUFHSUM6CiAJCWJlZm9yZSA9IHhmc19hdHRyX2xlYWZfb3JkZXIob2xkX2Jsay0+YnAsIG5ld19ibGstPmJwKTsKIAkJYnJlYWs7Ci0jZW5kaWYKIAljYXNlIFhGU19ESVJfTEVBRl9NQUdJQzoKIAkJQVNTRVJUKFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKSk7CiAJCWJlZm9yZSA9IHhmc19kaXJfbGVhZl9vcmRlcihvbGRfYmxrLT5icCwgbmV3X2Jsay0+YnApOwpAQCAtMTU4NywxMiArMTU1MiwxMCBAQAogCQkJQVNTRVJUKGxldmVsID09IHBhdGgtPmFjdGl2ZS0xKTsKIAkJCWJsay0+aW5kZXggPSAwOwogCQkJc3dpdGNoKGJsay0+bWFnaWMpIHsKLSNpZmRlZiBfX0tFUk5FTF9fCiAJCQljYXNlIFhGU19BVFRSX0xFQUZfTUFHSUM6CiAJCQkJYmxrLT5oYXNodmFsID0geGZzX2F0dHJfbGVhZl9sYXN0aGFzaChibGstPmJwLAogCQkJCQkJCQkgICAgICBOVUxMKTsKIAkJCQlicmVhazsKLSNlbmRpZgogCQkJY2FzZSBYRlNfRElSX0xFQUZfTUFHSUM6CiAJCQkJQVNTRVJUKFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKSk7CiAJCQkJYmxrLT5oYXNodmFsID0geGZzX2Rpcl9sZWFmX2xhc3RoYXNoKGJsay0+YnAsCkBAIC0xNjI2LDE5ICsxNTg5LDEwIEBACiAgKiBUaGlzIGlzIGltcGxlbWVudGVkIHdpdGggc29tZSBzb3VyY2UtbGV2ZWwgbG9vcCB1bnJvbGxpbmcuCiAgKi8KIHhmc19kYWhhc2hfdAoteGZzX2RhX2hhc2huYW1lKHVjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKQoreGZzX2RhX2hhc2huYW1lKGNvbnN0IHVjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKQogewogCXhmc19kYWhhc2hfdCBoYXNoOwogCi0jaWZkZWYgU0xPV1ZFUlNJT04KLQkvKgotCSAqIFRoaXMgaXMgdGhlIG9sZCBvbmUtYnl0ZS1hdC1hLXRpbWUgdmVyc2lvbi4KLQkgKi8KLQlmb3IgKGhhc2ggPSAwOyBuYW1lbGVuID4gMDsgbmFtZWxlbi0tKQotCQloYXNoID0gKm5hbWUrKyBeIHJvbDMyKGhhc2gsIDcpOwotCi0JcmV0dXJuKGhhc2gpOwotI2Vsc2UKIAkvKgogCSAqIERvIGZvdXIgY2hhcmFjdGVycyBhdCBhIHRpbWUgYXMgbG9uZyBhcyB3ZSBjYW4uCiAJICovCkBAIC0xNjU3LDEyICsxNjExLDkgQEAKIAkJcmV0dXJuIChuYW1lWzBdIDw8IDcpIF4gKG5hbWVbMV0gPDwgMCkgXiByb2wzMihoYXNoLCA3ICogMik7CiAJY2FzZSAxOgogCQlyZXR1cm4gKG5hbWVbMF0gPDwgMCkgXiByb2wzMihoYXNoLCA3ICogMSk7Ci0JY2FzZSAwOgorCWRlZmF1bHQ6IC8qIGNhc2UgMDogKi8KIAkJcmV0dXJuIGhhc2g7CiAJfQotCS8qIE5PVFJFQUNIRUQgKi8KLSNlbmRpZgotCXJldHVybiAwOyAvKiBrZWVwIGdjYyBoYXBweSAqLwogfQogCiAvKgpAQCAtMjIwMCwyMCArMjE1MSwxNiBAQAogCQkJZXJyb3IgPSBicCA/IFhGU19CVUZfR0VURVJST1IoYnApIDogWEZTX0VSUk9SKEVJTyk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgotI2lmbmRlZiBfX0tFUk5FTF9fCiAJCWNhc2UgMjoKLSNlbmRpZgogCQkJYnAgPSBOVUxMOwogCQkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYobXAsIHRyYW5zLCBtcC0+bV9kZGV2X3RhcmdwLAogCQkJCW1hcHBlZGJubywgbm1hcHBlZCwgMCwgJmJwKTsKIAkJCWJyZWFrOwotI2lmZGVmIF9fS0VSTkVMX18KIAkJY2FzZSAzOgogCQkJeGZzX2JhcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBtYXBwZWRibm8sIG5tYXBwZWQpOwogCQkJZXJyb3IgPSAwOwogCQkJYnAgPSBOVUxMOwogCQkJYnJlYWs7Ci0jZW5kaWYKIAkJfQogCQlpZiAoZXJyb3IpIHsKIAkJCWlmIChicCkKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGFfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuaAppbmRleCAzYTliOWU4Li40MTM1MjExIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RhX2J0cmVlLmgKKysrIGIvZnMveGZzL3hmc19kYV9idHJlZS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0RBX0JUUkVFX0hfXwogI2RlZmluZQlfX1hGU19EQV9CVFJFRV9IX18KQEAgLTkyLDcyICs3OCwyNCBAQAogCiAjZGVmaW5lIFhGU19EQV9NQVhIQVNICSgoeGZzX2RhaGFzaF90KS0xKSAvKiBsYXJnZXN0IHZhbGlkIGhhc2ggdmFsdWUgKi8KIAotLyoKLSAqIE1hY3JvcyB1c2VkIGJ5IGRpcmVjdG9yeSBjb2RlIHRvIGludGVyZmFjZSB0byB0aGUgZmlsZXN5c3RlbS4KLSAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTEJTSVpFKQotaW50IHhmc19sYnNpemUoc3RydWN0IHhmc19tb3VudCAqbXApOwotI2RlZmluZQlYRlNfTEJTSVpFKG1wKQkJCXhmc19sYnNpemUobXApCi0jZWxzZQotI2RlZmluZQlYRlNfTEJTSVpFKG1wKQkoKG1wKS0+bV9zYi5zYl9ibG9ja3NpemUpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xCTE9HKQotaW50IHhmc19sYmxvZyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19MQkxPRyhtcCkJCQl4ZnNfbGJsb2cobXApCi0jZWxzZQotI2RlZmluZQlYRlNfTEJMT0cobXApCSgobXApLT5tX3NiLnNiX2Jsb2NrbG9nKQotI2VuZGlmCisjZGVmaW5lCVhGU19MQlNJWkUobXApCShtcCktPm1fc2Iuc2JfYmxvY2tzaXplCisjZGVmaW5lCVhGU19MQkxPRyhtcCkJKG1wKS0+bV9zYi5zYl9ibG9ja2xvZwogCi0vKgotICogTWFjcm9zIHVzZWQgYnkgZGlyZWN0b3J5IGNvZGUgdG8gaW50ZXJmYWNlIHRvIHRoZSBrZXJuZWwKLSAqLwotCi0vKgotICogTWFjcm9zIHVzZWQgdG8gbWFuaXB1bGF0ZSBkaXJlY3Rvcnkgb2ZmX3QncwotICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQV9NQUtFX0JOT0VOVFJZKQotX191aW50MzJfdCB4ZnNfZGFfbWFrZV9ibm9lbnRyeShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhYmxrX3QgYm5vLAotCQkJCWludCBlbnRyeSk7CiAjZGVmaW5lCVhGU19EQV9NQUtFX0JOT0VOVFJZKG1wLGJubyxlbnRyeSkJXAotCXhmc19kYV9tYWtlX2Jub2VudHJ5KG1wLGJubyxlbnRyeSkKLSNlbHNlCi0jZGVmaW5lCVhGU19EQV9NQUtFX0JOT0VOVFJZKG1wLGJubyxlbnRyeSkgXAogCSgoKGJubykgPDwgKG1wKS0+bV9kaXJjb29rX2Vsb2cpIHwgKGVudHJ5KSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFfTUFLRV9DT09LSUUpCi14ZnNfb2ZmX3QgeGZzX2RhX21ha2VfY29va2llKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFibGtfdCBibm8sIGludCBlbnRyeSwKLQkJCQl4ZnNfZGFoYXNoX3QgaGFzaCk7CiAjZGVmaW5lCVhGU19EQV9NQUtFX0NPT0tJRShtcCxibm8sZW50cnksaGFzaCkJXAotCXhmc19kYV9tYWtlX2Nvb2tpZShtcCxibm8sZW50cnksaGFzaCkKLSNlbHNlCi0jZGVmaW5lCVhGU19EQV9NQUtFX0NPT0tJRShtcCxibm8sZW50cnksaGFzaCkgXAogCSgoKHhmc19vZmZfdClYRlNfREFfTUFLRV9CTk9FTlRSWShtcCwgYm5vLCBlbnRyeSkgPDwgMzIpIHwgKGhhc2gpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQV9DT09LSUVfSEFTSCkKLXhmc19kYWhhc2hfdCB4ZnNfZGFfY29va2llX2hhc2goc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19vZmZfdCBjb29raWUpOwotI2RlZmluZQlYRlNfREFfQ09PS0lFX0hBU0gobXAsY29va2llKQkJeGZzX2RhX2Nvb2tpZV9oYXNoKG1wLGNvb2tpZSkKLSNlbHNlCi0jZGVmaW5lCVhGU19EQV9DT09LSUVfSEFTSChtcCxjb29raWUpCSgoeGZzX2RhaGFzaF90KShjb29raWUpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQV9DT09LSUVfQk5PKQoteGZzX2RhYmxrX3QgeGZzX2RhX2Nvb2tpZV9ibm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19vZmZfdCBjb29raWUpOwotI2RlZmluZQlYRlNfREFfQ09PS0lFX0JOTyhtcCxjb29raWUpCQl4ZnNfZGFfY29va2llX2JubyhtcCxjb29raWUpCi0jZWxzZQotI2RlZmluZQlYRlNfREFfQ09PS0lFX0JOTyhtcCxjb29raWUpIFwKLQkoKCh4ZnNfb2ZmX3QpKGNvb2tpZSkgPj4gMzEpID09IC0xTEwgPyBcCisjZGVmaW5lCVhGU19EQV9DT09LSUVfSEFTSChtcCxjb29raWUpCQkoKHhmc19kYWhhc2hfdCljb29raWUpCisjZGVmaW5lCVhGU19EQV9DT09LSUVfQk5PKG1wLGNvb2tpZSkJCVwKKwkoKCgoeGZzX29mZl90KShjb29raWUpID4+IDMxKSA9PSAtMUxMID8gXAogCQkoeGZzX2RhYmxrX3QpMCA6IFwKLQkJKHhmc19kYWJsa190KSgoeGZzX29mZl90KShjb29raWUpID4+ICgobXApLT5tX2RpcmNvb2tfZWxvZyArIDMyKSkpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RBX0NPT0tJRV9FTlRSWSkKLWludCB4ZnNfZGFfY29va2llX2VudHJ5KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfb2ZmX3QgY29va2llKTsKLSNkZWZpbmUJWEZTX0RBX0NPT0tJRV9FTlRSWShtcCxjb29raWUpCQl4ZnNfZGFfY29va2llX2VudHJ5KG1wLGNvb2tpZSkKLSNlbHNlCi0jZGVmaW5lCVhGU19EQV9DT09LSUVfRU5UUlkobXAsY29va2llKSBcCi0JKCgoeGZzX29mZl90KShjb29raWUpID4+IDMxKSA9PSAtMUxMID8gXAorCQkoeGZzX2RhYmxrX3QpKCh4ZnNfb2ZmX3QpKGNvb2tpZSkgPj4gXAorCQkJCSgobXApLT5tX2RpcmNvb2tfZWxvZyArIDMyKSkpKQorI2RlZmluZQlYRlNfREFfQ09PS0lFX0VOVFJZKG1wLGNvb2tpZSkJCVwKKwkoKCgoeGZzX29mZl90KShjb29raWUpID4+IDMxKSA9PSAtMUxMID8JXAogCQkoeGZzX2RhYmxrX3QpMCA6IFwKIAkJKHhmc19kYWJsa190KSgoKHhmc19vZmZfdCkoY29va2llKSA+PiAzMikgJiBcCi0JCQkgICAgICAoKDEgPDwgKG1wKS0+bV9kaXJjb29rX2Vsb2cpIC0gMSkpKQotI2VuZGlmCisJCQkJKCgxIDw8IChtcCktPm1fZGlyY29va19lbG9nKSAtIDEpKSkpCiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE2OCw3ICsxMDYsNyBAQAogICogU3RydWN0dXJlIHRvIGVhc2UgcGFzc2luZyBhcm91bmQgY29tcG9uZW50IG5hbWVzLgogICovCiB0eXBlZGVmIHN0cnVjdCB4ZnNfZGFfYXJncyB7Ci0JdWNoYXJfdAkJKm5hbWU7CQkvKiBzdHJpbmcgKG1heWJlIG5vdCBOVUxMIHRlcm1pbmF0ZWQpICovCisJY29uc3QgdWNoYXJfdAkqbmFtZTsJCS8qIHN0cmluZyAobWF5YmUgbm90IE5VTEwgdGVybWluYXRlZCkgKi8KIAlpbnQJCW5hbWVsZW47CS8qIGxlbmd0aCBvZiBzdHJpbmcgKG1heWJlIG5vIE5VTEwpICovCiAJdWNoYXJfdAkJKnZhbHVlOwkJLyogc2V0IG9mIGJ5dGVzIChtYXliZSBjb250YWluIE5VTExzKSAqLwogCWludAkJdmFsdWVsZW47CS8qIGxlbmd0aCBvZiB2YWx1ZSAqLwpAQCAtMzE0LDcgKzI1Miw3IEBACiBpbnQJeGZzX2RhX3Nocmlua19pbm9kZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFibGtfdCBkZWFkX2Jsa25vLAogCQkJCQkgIHhmc19kYWJ1Zl90ICpkZWFkX2J1Zik7CiAKLXVpbnQgeGZzX2RhX2hhc2huYW1lKHVjaGFyX3QgKm5hbWVfc3RyaW5nLCBpbnQgbmFtZV9sZW5ndGgpOwordWludCB4ZnNfZGFfaGFzaG5hbWUoY29uc3QgdWNoYXJfdCAqbmFtZV9zdHJpbmcsIGludCBuYW1lX2xlbmd0aCk7CiB1aW50IHhmc19kYV9sb2cyX3JvdW5kdXAodWludCBpKTsKIHhmc19kYV9zdGF0ZV90ICp4ZnNfZGFfc3RhdGVfYWxsb2Modm9pZCk7CiB2b2lkIHhmc19kYV9zdGF0ZV9mcmVlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RmcmFnLmMgYi9mcy94ZnMveGZzX2RmcmFnLmMKaW5kZXggNjgxYmU1Yy4uMDcwMjU5YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kZnJhZy5jCisrKyBiL2ZzL3hmcy94ZnNfZGZyYWcuYwpAQCAtMSw1OCArMSw0NCBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2Rpci5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgogI2luY2x1ZGUgInhmc19kZnJhZy5oIgpAQCAtNjUsOSArNTEsOSBAQAogICovCiBpbnQKIHhmc19zd2FwZXh0KAotCXhmc19zd2FwZXh0X3QJX191c2VyICpzeHApCisJeGZzX3N3YXBleHRfdAlfX3VzZXIgKnN4dSkKIHsKLQl4ZnNfc3dhcGV4dF90CXN4OworCXhmc19zd2FwZXh0X3QJKnN4cDsKIAl4ZnNfaW5vZGVfdCAgICAgKmlwPU5VTEwsICp0aXA9TlVMTCwgKmlwc1syXTsKIAl4ZnNfdHJhbnNfdCAgICAgKnRwOwogCXhmc19tb3VudF90ICAgICAqbXA7CkBAIC03NiwyMCArNjIsMjkgQEAKIAl2bm9kZV90CQkqdnAsICp0dnA7CiAJYmh2X2Rlc2NfdCAgICAgICpiZHAsICp0YmRwOwogCXZuX2Jodl9oZWFkX3QgICAqYmhwLCAqdGJocDsKLQl1aW50CQlsb2NrX2ZsYWdzPTA7CisJc3RhdGljIHVpbnQJbG9ja19mbGFncyA9IFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMOwogCWludAkJaWxmX2ZpZWxkcywgdGlsZl9maWVsZHM7CiAJaW50CQllcnJvciA9IDA7Ci0JeGZzX2lmb3JrX3QJdGVtcGlmLCAqaWZwLCAqdGlmcDsKKwl4ZnNfaWZvcmtfdAkqdGVtcGlmcCwgKmlmcCwgKnRpZnA7CiAJX191aW50NjRfdAl0bXA7CiAJaW50CQlhZm9ya2Jsa3MgPSAwOwogCWludAkJdGFmb3JrYmxrcyA9IDA7Ci0JaW50CQlsb2NrZWQgPSAwOworCWNoYXIJCWxvY2tlZCA9IDA7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnN4LCBzeHAsIHNpemVvZihzeCkpKQotCQlyZXR1cm4gWEZTX0VSUk9SKEVGQVVMVCk7CisJc3hwID0ga21lbV9hbGxvYyhzaXplb2YoeGZzX3N3YXBleHRfdCksIEtNX01BWUZBSUwpOworCXRlbXBpZnAgPSBrbWVtX2FsbG9jKHNpemVvZih4ZnNfaWZvcmtfdCksIEtNX01BWUZBSUwpOworCWlmICghc3hwIHx8ICF0ZW1waWZwKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVOT01FTSk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihzeHAsIHN4dSwgc2l6ZW9mKHhmc19zd2FwZXh0X3QpKSkgeworCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOworCQlnb3RvIGVycm9yMDsKKwl9CiAKIAkvKiBQdWxsIGluZm9ybWF0aW9uIGZvciB0aGUgdGFyZ2V0IGZkICovCi0JaWYgKCgoZnAgPSBmZ2V0KChpbnQpc3guc3hfZmR0YXJnZXQpKSA9PSBOVUxMKSB8fAorCWlmICgoKGZwID0gZmdldCgoaW50KXN4cC0+c3hfZmR0YXJnZXQpKSA9PSBOVUxMKSB8fAogCSAgICAoKHZwID0gTElOVkZTX0dFVF9WUChmcC0+Zl9kZW50cnktPmRfaW5vZGUpKSA9PSBOVUxMKSkgIHsKIAkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKIAkJZ290byBlcnJvcjA7CkBAIC0xMDQsNyArOTksNyBAQAogCQlpcCA9IFhGU19CSFZUT0koYmRwKTsKIAl9CiAKLQlpZiAoKCh0ZnAgPSBmZ2V0KChpbnQpc3guc3hfZmR0bXApKSA9PSBOVUxMKSB8fAorCWlmICgoKHRmcCA9IGZnZXQoKGludClzeHAtPnN4X2ZkdG1wKSkgPT0gTlVMTCkgfHwKIAkgICAgKCh0dnAgPSBMSU5WRlNfR0VUX1ZQKHRmcC0+Zl9kZW50cnktPmRfaW5vZGUpKSA9PSBOVUxMKSkgewogCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOwogCQlnb3RvIGVycm9yMDsKQEAgLTEzMSw3ICsxMjYsNyBAQAogCiAJbXAgPSBpcC0+aV9tb3VudDsKIAotCXNicCA9ICZzeC5zeF9zdGF0OworCXNicCA9ICZzeHAtPnN4X3N0YXQ7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKIAkJZXJyb3IgPSAgWEZTX0VSUk9SKEVJTyk7CkBAIC0xNDgsNyArMTQzLDcgQEAKIAkJaXBzWzBdID0gdGlwOwogCQlpcHNbMV0gPSBpcDsKIAl9Ci0JbG9ja19mbGFncyA9IFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMOworCiAJeGZzX2xvY2tfaW5vZGVzKGlwcywgMiwgMCwgbG9ja19mbGFncyk7CiAKIAkvKiBDaGVjayBwZXJtaXNzaW9ucyAqLwpAQCAtMTkyLDkgKzE4Nyw5IEBACiAJfQogCiAJLyogVmVyaWZ5IGFsbCBkYXRhIGFyZSBiZWluZyBzd2FwcGVkICovCi0JaWYgKHN4LnN4X29mZnNldCAhPSAwIHx8Ci0JICAgIHN4LnN4X2xlbmd0aCAhPSBpcC0+aV9kLmRpX3NpemUgfHwKLQkgICAgc3guc3hfbGVuZ3RoICE9IHRpcC0+aV9kLmRpX3NpemUpIHsKKwlpZiAoc3hwLT5zeF9vZmZzZXQgIT0gMCB8fAorCSAgICBzeHAtPnN4X2xlbmd0aCAhPSBpcC0+aV9kLmRpX3NpemUgfHwKKwkgICAgc3hwLT5zeF9sZW5ndGggIT0gdGlwLT5pX2QuZGlfc2l6ZSkgewogCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOwogCQlnb3RvIGVycm9yMDsKIAl9CkBAIC0yNTUsNyArMjUwLDggQEAKIAkJeGZzX2l1bmxvY2soaXAsICBYRlNfSU9MT0NLX0VYQ0wpOwogCQl4ZnNfaXVubG9jayh0aXAsIFhGU19JT0xPQ0tfRVhDTCk7CiAJCXhmc190cmFuc19jYW5jZWwodHAsIDApOwotCQlyZXR1cm4gZXJyb3I7CisJCWxvY2tlZCA9IDA7CisJCWdvdG8gZXJyb3IwOwogCX0KIAl4ZnNfbG9ja19pbm9kZXMoaXBzLCAyLCAwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKQEAgLTI2NiwxMCArMjYyLDggQEAKIAkgICAgIChpcC0+aV9kLmRpX2Fmb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpKSB7CiAJCWVycm9yID0geGZzX2JtYXBfY291bnRfYmxvY2tzKHRwLCBpcCwgWEZTX0FUVFJfRk9SSywgJmFmb3JrYmxrcyk7CiAJCWlmIChlcnJvcikgewotCQkJeGZzX2l1bmxvY2soaXAsICBsb2NrX2ZsYWdzKTsKLQkJCXhmc19pdW5sb2NrKHRpcCwgbG9ja19mbGFncyk7CiAJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKLQkJCXJldHVybiBlcnJvcjsKKwkJCWdvdG8gZXJyb3IwOwogCQl9CiAJfQogCWlmICggKChYRlNfSUZPUktfUSh0aXApICE9IDApICYmICh0aXAtPmlfZC5kaV9hbmV4dGVudHMgPiAwKSkgJiYKQEAgLTI3NywxMCArMjcxLDggQEAKIAkJZXJyb3IgPSB4ZnNfYm1hcF9jb3VudF9ibG9ja3ModHAsIHRpcCwgWEZTX0FUVFJfRk9SSywKIAkJCSZ0YWZvcmtibGtzKTsKIAkJaWYgKGVycm9yKSB7Ci0JCQl4ZnNfaXVubG9jayhpcCwgIGxvY2tfZmxhZ3MpOwotCQkJeGZzX2l1bmxvY2sodGlwLCBsb2NrX2ZsYWdzKTsKIAkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOwotCQkJcmV0dXJuIGVycm9yOworCQkJZ290byBlcnJvcjA7CiAJCX0KIAl9CiAKQEAgLTI4OSw5ICsyODEsOSBAQAogCSAqLwogCWlmcCA9ICZpcC0+aV9kZjsKIAl0aWZwID0gJnRpcC0+aV9kZjsKLQl0ZW1waWYgPSAqaWZwOwkvKiBzdHJ1Y3QgY29weSAqLwotCSppZnAgPSAqdGlmcDsJLyogc3RydWN0IGNvcHkgKi8KLQkqdGlmcCA9IHRlbXBpZjsJLyogc3RydWN0IGNvcHkgKi8KKwkqdGVtcGlmcCA9ICppZnA7CS8qIHN0cnVjdCBjb3B5ICovCisJKmlmcCA9ICp0aWZwOwkJLyogc3RydWN0IGNvcHkgKi8KKwkqdGlmcCA9ICp0ZW1waWZwOwkvKiBzdHJ1Y3QgY29weSAqLwogCiAJLyoKIAkgKiBGaXggdGhlIG9uLWRpc2sgaW5vZGUgdmFsdWVzCkBAIC0zNjksMTEgKzM2MSw3IEBACiAJfQogCiAJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfU1dBUEVYVCwgTlVMTCk7Ci0KLQlmcHV0KGZwKTsKLQlmcHV0KHRmcCk7Ci0KLQlyZXR1cm4gZXJyb3I7CisJbG9ja2VkID0gMDsKIAogIGVycm9yMDoKIAlpZiAobG9ja2VkKSB7CkBAIC0zODEsOCArMzY5LDE1IEBACiAJCXhmc19pdW5sb2NrKHRpcCwgbG9ja19mbGFncyk7CiAJfQogCi0JaWYgKGZwICE9IE5VTEwpIGZwdXQoZnApOwotCWlmICh0ZnAgIT0gTlVMTCkgZnB1dCh0ZnApOworCWlmIChmcCAhPSBOVUxMKQorCQlmcHV0KGZwKTsKKwlpZiAodGZwICE9IE5VTEwpCisJCWZwdXQodGZwKTsKKworCWlmIChzeHAgIT0gTlVMTCkKKwkJa21lbV9mcmVlKHN4cCwgc2l6ZW9mKHhmc19zd2FwZXh0X3QpKTsKKwlpZiAodGVtcGlmcCAhPSBOVUxMKQorCQlrbWVtX2ZyZWUodGVtcGlmcCwgc2l6ZW9mKHhmc19pZm9ya190KSk7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RmcmFnLmggYi9mcy94ZnMveGZzX2RmcmFnLmgKaW5kZXggOTA0ODYwNS4uZjY3ODU1OSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kZnJhZy5oCisrKyBiL2ZzL3hmcy94ZnNfZGZyYWcuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfREZSQUdfSF9fCiAjZGVmaW5lCV9fWEZTX0RGUkFHX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaW5vZGUuaCBiL2ZzL3hmcy94ZnNfZGlub2RlLmgKaW5kZXggZjVjOTMyYi4uYzVhMGU1MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaW5vZGUuaAorKysgYi9mcy94ZnMveGZzX2Rpbm9kZS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0RJTk9ERV9IX18KICNkZWZpbmUJX19YRlNfRElOT0RFX0hfXwpAQCAtMzcsMTMgKzIzLDggQEAKIAogI2RlZmluZQlYRlNfRElOT0RFX1ZFUlNJT05fMQkxCiAjZGVmaW5lCVhGU19ESU5PREVfVkVSU0lPTl8yCTIKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04pCi1pbnQgeGZzX2Rpbm9kZV9nb29kX3ZlcnNpb24oaW50IHYpOwotI2RlZmluZSBYRlNfRElOT0RFX0dPT0RfVkVSU0lPTih2KQl4ZnNfZGlub2RlX2dvb2RfdmVyc2lvbih2KQotI2Vsc2UKLSNkZWZpbmUgWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04odikJKCgodikgPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHx8IFwKLQkJCQkJICgodikgPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzIpKQotI2VuZGlmCisjZGVmaW5lIFhGU19ESU5PREVfR09PRF9WRVJTSU9OKHYpCVwKKwkoKCh2KSA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSB8fCAodikgPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzIpKQogI2RlZmluZQlYRlNfRElOT0RFX01BR0lDCTB4NDk0ZQkvKiAnSU4nICovCiAKIC8qCkBAIC0xODQsNzUgKzE2NSwzMCBAQAogLyoKICAqIElub2RlIHNpemUgZm9yIGdpdmVuIGZzLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSVRJTk8pCi1pbnQgeGZzX2xpdGlubyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19MSVRJTk8obXApCQl4ZnNfbGl0aW5vKG1wKQotI2Vsc2UKICNkZWZpbmUJWEZTX0xJVElOTyhtcCkJKChtcCktPm1fbGl0aW5vKQotI2VuZGlmCiAjZGVmaW5lCVhGU19CUk9PVF9TSVpFX0FESglcCiAJKHNpemVvZih4ZnNfYm1idF9ibG9ja190KSAtIHNpemVvZih4ZnNfYm1kcl9ibG9ja190KSkKIAogLyoKLSAqIEZvcmsgaWRlbnRpZmllcnMuICBIZXJlIHNvIHV0aWxpdGllcyBjYW4gdXNlIHRoZW0gd2l0aG91dCBpbmNsdWRpbmcKLSAqIHhmc19pbm9kZS5oLgotICovCi0jZGVmaW5lCVhGU19EQVRBX0ZPUksJMAotI2RlZmluZQlYRlNfQVRUUl9GT1JLCTEKLQotLyoKICAqIElub2RlIGRhdGEgJiBhdHRyaWJ1dGUgZm9yayBzaXplcywgcGVyIGlub2RlLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DRk9SS19RKQotaW50IHhmc19jZm9ya19xX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCk7Ci1pbnQgeGZzX2Nmb3JrX3EoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCk7Ci0jZGVmaW5lCVhGU19DRk9SS19RX0RJU0soZGNwKSAgICAgICAgICAgICAgIHhmc19jZm9ya19xX2Rpc2soZGNwKQotI2RlZmluZQlYRlNfQ0ZPUktfUShkY3ApICAgICAgICAgICAgICAgICAgICB4ZnNfY2ZvcmtfcShkY3ApCi0jZWxzZQotI2RlZmluZQlYRlNfQ0ZPUktfUV9ESVNLKGRjcCkJCSAgICAoKGRjcCktPmRpX2ZvcmtvZmYgIT0gMCkKICNkZWZpbmUgWEZTX0NGT1JLX1EoZGNwKSAgICAgICAgICAgICAgICAgICAgKChkY3ApLT5kaV9mb3Jrb2ZmICE9IDApCisjZGVmaW5lCVhGU19DRk9SS19RX0RJU0soZGNwKQkJICAgICgoZGNwKS0+ZGlfZm9ya29mZiAhPSAwKQogCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX0JPRkYpCi1pbnQgeGZzX2Nmb3JrX2JvZmZfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKTsKLWludCB4ZnNfY2ZvcmtfYm9mZih4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKTsKLSNkZWZpbmUJWEZTX0NGT1JLX0JPRkZfRElTSyhkY3ApCSAgICB4ZnNfY2ZvcmtfYm9mZl9kaXNrKGRjcCkKLSNkZWZpbmUJWEZTX0NGT1JLX0JPRkYoZGNwKQkgICAgICAgICAgICB4ZnNfY2ZvcmtfYm9mZihkY3ApCi0jZWxzZQotI2RlZmluZQlYRlNfQ0ZPUktfQk9GRl9ESVNLKGRjcCkJICAgICgoaW50KShJTlRfR0VUKChkY3ApLT5kaV9mb3Jrb2ZmLCBBUkNIX0NPTlZFUlQpIDw8IDMpKQogI2RlZmluZSBYRlNfQ0ZPUktfQk9GRihkY3ApICAgICAgICAgICAgICAgICAoKGludCkoKGRjcCktPmRpX2ZvcmtvZmYgPDwgMykpCisjZGVmaW5lCVhGU19DRk9SS19CT0ZGX0RJU0soZGNwKSBcCisJKChpbnQpKElOVF9HRVQoKGRjcCktPmRpX2ZvcmtvZmYsIEFSQ0hfQ09OVkVSVCkgPDwgMykpCiAKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQ0ZPUktfRFNJWkUpCi1pbnQgeGZzX2Nmb3JrX2RzaXplX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgc3RydWN0IHhmc19tb3VudCAqbXApOwotaW50IHhmc19jZm9ya19kc2l6ZSh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19DRk9SS19EU0laRV9ESVNLKGRjcCxtcCkgICAgICAgIHhmc19jZm9ya19kc2l6ZV9kaXNrKGRjcCxtcCkKLSNkZWZpbmUJWEZTX0NGT1JLX0RTSVpFKGRjcCxtcCkgICAgICAgICAgICAgeGZzX2Nmb3JrX2RzaXplKGRjcCxtcCkKLSNlbHNlCiAjZGVmaW5lCVhGU19DRk9SS19EU0laRV9ESVNLKGRjcCxtcCkgXAogCShYRlNfQ0ZPUktfUV9ESVNLKGRjcCkgPyBYRlNfQ0ZPUktfQk9GRl9ESVNLKGRjcCkgOiBYRlNfTElUSU5PKG1wKSkKICNkZWZpbmUgWEZTX0NGT1JLX0RTSVpFKGRjcCxtcCkgXAogCShYRlNfQ0ZPUktfUShkY3ApID8gWEZTX0NGT1JLX0JPRkYoZGNwKSA6IFhGU19MSVRJTk8obXApKQogCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX0FTSVpFKQotaW50IHhmc19jZm9ya19hc2l6ZV9kaXNrKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKLWludCB4ZnNfY2ZvcmtfYXNpemUoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgc3RydWN0IHhmc19tb3VudCAqbXApOwotI2RlZmluZQlYRlNfQ0ZPUktfQVNJWkVfRElTSyhkY3AsbXApICAgICAgICB4ZnNfY2ZvcmtfYXNpemVfZGlzayhkY3AsbXApCi0jZGVmaW5lCVhGU19DRk9SS19BU0laRShkY3AsbXApICAgICAgICAgICAgIHhmc19jZm9ya19hc2l6ZShkY3AsbXApCi0jZWxzZQogI2RlZmluZQlYRlNfQ0ZPUktfQVNJWkVfRElTSyhkY3AsbXApIFwKIAkoWEZTX0NGT1JLX1FfRElTSyhkY3ApID8gWEZTX0xJVElOTyhtcCkgLSBYRlNfQ0ZPUktfQk9GRl9ESVNLKGRjcCkgOiAwKQogI2RlZmluZSBYRlNfQ0ZPUktfQVNJWkUoZGNwLG1wKSBcCiAJKFhGU19DRk9SS19RKGRjcCkgPyBYRlNfTElUSU5PKG1wKSAtIFhGU19DRk9SS19CT0ZGKGRjcCkgOiAwKQogCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX1NJWkUpCi1pbnQgeGZzX2Nmb3JrX3NpemVfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IHcpOwotaW50IHhmc19jZm9ya19zaXplKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgdyk7Ci0jZGVmaW5lCVhGU19DRk9SS19TSVpFX0RJU0soZGNwLG1wLHcpICAgICAgIHhmc19jZm9ya19zaXplX2Rpc2soZGNwLG1wLHcpCi0jZGVmaW5lCVhGU19DRk9SS19TSVpFKGRjcCxtcCx3KSAgICAgICAgICAgIHhmc19jZm9ya19zaXplKGRjcCxtcCx3KQotI2Vsc2UKICNkZWZpbmUJWEZTX0NGT1JLX1NJWkVfRElTSyhkY3AsbXAsdykgXAogCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKIAkJWEZTX0NGT1JLX0RTSVpFX0RJU0soZGNwLCBtcCkgOiBcCkBAIC0yNjEsOTMgKzE5NywyNiBAQAogCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKIAkJWEZTX0NGT1JLX0RTSVpFKGRjcCwgbXApIDogWEZTX0NGT1JLX0FTSVpFKGRjcCwgbXApKQogCi0jZW5kaWYKKyNkZWZpbmUgWEZTX0RGT1JLX0RTSVpFKGRpcCxtcCkgXAorCVhGU19DRk9SS19EU0laRV9ESVNLKCYoZGlwKS0+ZGlfY29yZSwgbXApCisjZGVmaW5lIFhGU19ERk9SS19BU0laRShkaXAsbXApIFwKKwlYRlNfQ0ZPUktfQVNJWkVfRElTSygmKGRpcCktPmRpX2NvcmUsIG1wKQorI2RlZmluZQlYRlNfREZPUktfU0laRShkaXAsbXAsdykgXAorCVhGU19DRk9SS19TSVpFX0RJU0soJihkaXApLT5kaV9jb3JlLCBtcCwgdykKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREZPUktfRFNJWkUpCi1pbnQgeGZzX2Rmb3JrX2RzaXplKHhmc19kaW5vZGVfdCAqZGlwLCBzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19ERk9SS19EU0laRShkaXAsbXApICAgICAgICAgICAgIHhmc19kZm9ya19kc2l6ZShkaXAsbXApCi0jZWxzZQotI2RlZmluZSBYRlNfREZPUktfRFNJWkUoZGlwLG1wKSAgICAgICAgICAgICBYRlNfQ0ZPUktfRFNJWkVfRElTSygmKGRpcCktPmRpX2NvcmUsIG1wKQotCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RGT1JLX0FTSVpFKQotaW50IHhmc19kZm9ya19hc2l6ZSh4ZnNfZGlub2RlX3QgKmRpcCwgc3RydWN0IHhmc19tb3VudCAqbXApOwotI2RlZmluZQlYRlNfREZPUktfQVNJWkUoZGlwLG1wKSAgICAgICAgICAgICB4ZnNfZGZvcmtfYXNpemUoZGlwLG1wKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0RGT1JLX0FTSVpFKGRpcCxtcCkgICAgICAgICAgICAgWEZTX0NGT1JLX0FTSVpFX0RJU0soJihkaXApLT5kaV9jb3JlLCBtcCkKLQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ERk9SS19TSVpFKQotaW50IHhmc19kZm9ya19zaXplKHhmc19kaW5vZGVfdCAqZGlwLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IHcpOwotI2RlZmluZQlYRlNfREZPUktfU0laRShkaXAsbXAsdykgICAgICAgICAgICB4ZnNfZGZvcmtfc2l6ZShkaXAsbXAsdykKLSNlbHNlCi0jZGVmaW5lCVhGU19ERk9SS19TSVpFKGRpcCxtcCx3KQkgICAgWEZTX0NGT1JLX1NJWkVfRElTSygmKGRpcCktPmRpX2NvcmUsIG1wLCB3KQotCi0jZW5kaWYKLQotLyoKLSAqIE1hY3JvcyBmb3IgYWNjZXNzaW5nIHBlci1mb3JrIGRpc2sgaW5vZGUgaW5mb3JtYXRpb24uCi0gKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RGT1JLX1EpCi1pbnQgeGZzX2Rmb3JrX3EoeGZzX2Rpbm9kZV90ICpkaXApOwotI2RlZmluZQlYRlNfREZPUktfUShkaXApCSAgICAgICAgICAgIHhmc19kZm9ya19xKGRpcCkKLSNlbHNlCiAjZGVmaW5lCVhGU19ERk9SS19RKGRpcCkgICAgICAgICAgICAgICAgICAgIFhGU19DRk9SS19RX0RJU0soJihkaXApLT5kaV9jb3JlKQotCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RGT1JLX0JPRkYpCi1pbnQgeGZzX2Rmb3JrX2JvZmYoeGZzX2Rpbm9kZV90ICpkaXApOwotI2RlZmluZQlYRlNfREZPUktfQk9GRihkaXApCQkgICAgeGZzX2Rmb3JrX2JvZmYoZGlwKQotI2Vsc2UKICNkZWZpbmUJWEZTX0RGT1JLX0JPRkYoZGlwKQkJICAgIFhGU19DRk9SS19CT0ZGX0RJU0soJihkaXApLT5kaV9jb3JlKQotCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RGT1JLX0RQVFIpCi1jaGFyICp4ZnNfZGZvcmtfZHB0cih4ZnNfZGlub2RlX3QgKmRpcCk7Ci0jZGVmaW5lCVhGU19ERk9SS19EUFRSKGRpcCkJICAgICAgICAgICAgeGZzX2Rmb3JrX2RwdHIoZGlwKQotI2Vsc2UKICNkZWZpbmUJWEZTX0RGT1JLX0RQVFIoZGlwKQkJICAgICgoZGlwKS0+ZGlfdS5kaV9jKQotCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RGT1JLX0FQVFIpCi1jaGFyICp4ZnNfZGZvcmtfYXB0cih4ZnNfZGlub2RlX3QgKmRpcCk7Ci0jZGVmaW5lCVhGU19ERk9SS19BUFRSKGRpcCkgICAgICAgICAgICAgICAgIHhmc19kZm9ya19hcHRyKGRpcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19ERk9SS19BUFRSKGRpcCkJCSAgICAoKGRpcCktPmRpX3UuZGlfYyArIFhGU19ERk9SS19CT0ZGKGRpcCkpCi0KLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREZPUktfUFRSKQotY2hhciAqeGZzX2Rmb3JrX3B0cih4ZnNfZGlub2RlX3QgKmRpcCwgaW50IHcpOwotI2RlZmluZQlYRlNfREZPUktfUFRSKGRpcCx3KSAgICAgICAgICAgICAgICB4ZnNfZGZvcmtfcHRyKGRpcCx3KQotI2Vsc2UKKyNkZWZpbmUJWEZTX0RGT1JLX0FQVFIoZGlwKQlcCisJKChkaXApLT5kaV91LmRpX2MgKyBYRlNfREZPUktfQk9GRihkaXApKQogI2RlZmluZQlYRlNfREZPUktfUFRSKGRpcCx3KQlcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0RGT1JLX0RQVFIoZGlwKSA6IFhGU19ERk9SS19BUFRSKGRpcCkpCi0KLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQ0ZPUktfRk9STUFUKQotaW50IHhmc19jZm9ya19mb3JtYXQoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcpOwotI2RlZmluZQlYRlNfQ0ZPUktfRk9STUFUKGRjcCx3KSAgICAgICAgICAgICB4ZnNfY2ZvcmtfZm9ybWF0KGRjcCx3KQotI2Vsc2UKLSNkZWZpbmUJWEZTX0NGT1JLX0ZPUk1BVChkY3AsdykgXAorI2RlZmluZQlYRlNfQ0ZPUktfRk9STUFUKGRjcCx3KQlcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gKGRjcCktPmRpX2Zvcm1hdCA6IChkY3ApLT5kaV9hZm9ybWF0KQotCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX0ZNVF9TRVQpCi12b2lkIHhmc19jZm9ya19mbXRfc2V0KHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3LCBpbnQgbik7Ci0jZGVmaW5lCVhGU19DRk9SS19GTVRfU0VUKGRjcCx3LG4pICAgICAgICAgICB4ZnNfY2ZvcmtfZm10X3NldChkY3AsdyxuKQotI2Vsc2UKICNkZWZpbmUJWEZTX0NGT1JLX0ZNVF9TRVQoZGNwLHcsbikgXAogCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKLQkJKChkY3ApLT5kaV9mb3JtYXQgPSAobikpIDogXAotCQkoKGRjcCktPmRpX2Fmb3JtYXQgPSAobikpKQorCQkoKGRjcCktPmRpX2Zvcm1hdCA9IChuKSkgOiAoKGRjcCktPmRpX2Fmb3JtYXQgPSAobikpKQogCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX05FWFRFTlRTKQotaW50IHhmc19jZm9ya19uZXh0ZW50c19kaXNrKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3KTsKLWludCB4ZnNfY2ZvcmtfbmV4dGVudHMoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcpOwotI2RlZmluZQlYRlNfQ0ZPUktfTkVYVEVOVFNfRElTSyhkY3AsdykgICAgICAgeGZzX2Nmb3JrX25leHRlbnRzX2Rpc2soZGNwLHcpCi0jZGVmaW5lCVhGU19DRk9SS19ORVhURU5UUyhkY3AsdykgICAgICAgICAgICB4ZnNfY2ZvcmtfbmV4dGVudHMoZGNwLHcpCi0jZWxzZQogI2RlZmluZQlYRlNfQ0ZPUktfTkVYVEVOVFNfRElTSyhkY3AsdykgXAogCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKIAkgCUlOVF9HRVQoKGRjcCktPmRpX25leHRlbnRzLCBBUkNIX0NPTlZFUlQpIDogXApAQCAtMzU1LDMxICsyMjQsMTMgQEAKICNkZWZpbmUgWEZTX0NGT1JLX05FWFRFTlRTKGRjcCx3KSBcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gKGRjcCktPmRpX25leHRlbnRzIDogKGRjcCktPmRpX2FuZXh0ZW50cykKIAotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DRk9SS19ORVhUX1NFVCkKLXZvaWQgeGZzX2Nmb3JrX25leHRfc2V0KHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3LCBpbnQgbik7Ci0jZGVmaW5lCVhGU19DRk9SS19ORVhUX1NFVChkY3AsdyxuKQkgICAgICAgIHhmc19jZm9ya19uZXh0X3NldChkY3AsdyxuKQotI2Vsc2UKICNkZWZpbmUJWEZTX0NGT1JLX05FWFRfU0VUKGRjcCx3LG4pIFwKIAkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCi0JCSgoZGNwKS0+ZGlfbmV4dGVudHMgPSAobikpIDogXAotCQkoKGRjcCktPmRpX2FuZXh0ZW50cyA9IChuKSkpCisJCSgoZGNwKS0+ZGlfbmV4dGVudHMgPSAobikpIDogKChkY3ApLT5kaV9hbmV4dGVudHMgPSAobikpKQogCi0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREZPUktfTkVYVEVOVFMpCi1pbnQgeGZzX2Rmb3JrX25leHRlbnRzKHhmc19kaW5vZGVfdCAqZGlwLCBpbnQgdyk7Ci0jZGVmaW5lCVhGU19ERk9SS19ORVhURU5UUyhkaXAsdykgeGZzX2Rmb3JrX25leHRlbnRzKGRpcCx3KQotI2Vsc2UKICNkZWZpbmUJWEZTX0RGT1JLX05FWFRFTlRTKGRpcCx3KSBYRlNfQ0ZPUktfTkVYVEVOVFNfRElTSygmKGRpcCktPmRpX2NvcmUsIHcpCi0jZW5kaWYKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0RJTk9ERSkKLXhmc19kaW5vZGVfdCAqeGZzX2J1Zl90b19kaW5vZGUoc3RydWN0IHhmc19idWYgKmJwKTsKLSNkZWZpbmUJWEZTX0JVRl9UT19ESU5PREUoYnApCXhmc19idWZfdG9fZGlub2RlKGJwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0JVRl9UT19ESU5PREUoYnApCSgoeGZzX2Rpbm9kZV90ICopKFhGU19CVUZfUFRSKGJwKSkpCi0jZW5kaWYKKyNkZWZpbmUJWEZTX0JVRl9UT19ESU5PREUoYnApCSgoeGZzX2Rpbm9kZV90ICopWEZTX0JVRl9QVFIoYnApKQogCiAvKgogICogVmFsdWVzIGZvciBkaV9mbGFncwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIuYyBiL2ZzL3hmcy94ZnNfZGlyLmMKaW5kZXggYmEzMGJjNy4uM2RkMzAzOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIuYworKysgYi9mcy94ZnMveGZzX2Rpci5jCkBAIC0xLDU5ICsxLDQzIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2Rpci5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogCkBAIC0xOTIsMTEgKzE3NiwyMyBAQAogCXVpbnQgc2hvcnRjb3VudCwgbGVhZmNvdW50LCBjb3VudDsKIAogCW1wLT5tX2RpcnZlcnNpb24gPSAxOwotCXNob3J0Y291bnQgPSAobXAtPm1fYXR0cm9mZnNldCAtICh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2hkcl90KSkgLwotCQkgICAgICh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2VudHJ5X3QpOwotCWxlYWZjb3VudCA9IChYRlNfTEJTSVpFKG1wKSAtICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfaGRyX3QpKSAvCi0JCSAgICAoKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSArCi0JCSAgICAgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpKTsKKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0FUVFIpIHsKKwkJc2hvcnRjb3VudCA9IChtcC0+bV9hdHRyb2Zmc2V0IC0KKwkJCQkodWludClzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkpIC8KKwkJCQkgKHVpbnQpc2l6ZW9mKHhmc19kaXJfc2ZfZW50cnlfdCk7CisJCWxlYWZjb3VudCA9IChYRlNfTEJTSVpFKG1wKSAtCisJCQkJKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCkpIC8KKwkJCQkgKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkgKworCQkJCSAgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpKTsKKwl9IGVsc2UgeworCQlzaG9ydGNvdW50ID0gKFhGU19CTURSX1NQQUNFX0NBTEMoTUlOQUJUUFRSUykgLQorCQkJICAgICAgKHVpbnQpc2l6ZW9mKHhmc19kaXJfc2ZfaGRyX3QpKSAvCisJCQkgICAgICAgKHVpbnQpc2l6ZW9mKHhmc19kaXJfc2ZfZW50cnlfdCk7CisJCWxlYWZjb3VudCA9IChYRlNfTEJTSVpFKG1wKSAtCisJCQkgICAgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCkpIC8KKwkJCSAgICAgKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkgKworCQkJICAgICAgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpKTsKKwl9CiAJY291bnQgPSBzaG9ydGNvdW50ID4gbGVhZmNvdW50ID8gc2hvcnRjb3VudCA6IGxlYWZjb3VudDsKIAltcC0+bV9kaXJjb29rX2Vsb2cgPSB4ZnNfZGFfbG9nMl9yb3VuZHVwKGNvdW50ICsgMSk7CiAJQVNTRVJUKG1wLT5tX2RpcmNvb2tfZWxvZyA8PSBtcC0+bV9zYi5zYl9ibG9ja2xvZyk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpci5oIGIvZnMveGZzL3hmc19kaXIuaAppbmRleCA0ZGJjOWY1Li40ODhkZWZlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rpci5oCisrKyBiL2ZzL3hmcy94ZnNfZGlyLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0RJUl9IX18KICNkZWZpbmUJX19YRlNfRElSX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyLmMgYi9mcy94ZnMveGZzX2RpcjIuYwppbmRleCA0OWZjMGEzLi4wMjJjODM5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjIuYworKysgYi9mcy94ZnMveGZzX2RpcjIuYwpAQCAtMSw0NiArMSwyNiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KLS8qCi0gKiBYRlMgdjIgZGlyZWN0b3J5IGltcGxtZW50YXRpb24uCi0gKiBUb3AtbGV2ZWwgYW5kIHV0aWxpdHkgcm91dGluZXMuCi0gKi8KLQogI2luY2x1ZGUgInhmcy5oIgotCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgpAQCAtNDgsMTYgKzI4LDE2IEBACiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCi0jaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9sZWFmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgogI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKQEAgLTY1LDcgKzQ1LDYgQEAKICNpbmNsdWRlICJ4ZnNfZGlyMl9ub2RlLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAKIC8qCiAgKiBEZWNsYXJhdGlvbnMgZm9yIGludGVyZmFjZSByb3V0aW5lcy4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMi5oIGIvZnMveGZzL3hmc19kaXIyLmgKaW5kZXggOGY0ZmM3Zi4uN2UyNGZmZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyLmgKKysrIGIvZnMveGZzL3hmc19kaXIyLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19ESVIyX0hfXwogI2RlZmluZQlfX1hGU19ESVIyX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmMgYi9mcy94ZnMveGZzX2RpcjJfYmxvY2suYwppbmRleCBiYzRjNDBmLi4zMWJjOTlmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfYmxvY2suYworKysgYi9mcy94ZnMveGZzX2RpcjJfYmxvY2suYwpAQCAtMSw2MSArMSwzOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KLS8qCi0gKiB4ZnNfZGlyMl9ibG9jay5jCi0gKiBYRlMgVjIgZGlyZWN0b3J5IGltcGxlbWVudGF0aW9uLCBzaW5nbGUtYmxvY2sgZm9ybS4KLSAqIFNlZSB4ZnNfZGlyMl9ibG9jay5oIGZvciB0aGUgZm9ybWF0LgotICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLQotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9sZWFmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgogI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKQEAgLTEyMzQsNyArMTIxMiw3IEBACiAJLyoKIAkgKiBTb3J0IHRoZSBsZWFmIGVudHJpZXMgYnkgaGFzaCB2YWx1ZS4KIAkgKi8KLQlxc29ydChibHAsIElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgc2l6ZW9mKCpibHApLCB4ZnNfZGlyMl9ibG9ja19zb3J0KTsKKwl4ZnNfc29ydChibHAsIElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgc2l6ZW9mKCpibHApLCB4ZnNfZGlyMl9ibG9ja19zb3J0KTsKIAkvKgogCSAqIExvZyB0aGUgbGVhZiBlbnRyeSBhcmVhIGFuZCB0YWlsLgogCSAqIEFscmVhZHkgbG9nZ2VkIHRoZSBoZWFkZXIgaW4gZGF0YV9pbml0LCBpZ25vcmUgbmVlZGxvZy4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9ibG9jay5oIGIvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmgKaW5kZXggNWE1NzhiOC4uYTJlNWNiOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmgKKysrIGIvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19ESVIyX0JMT0NLX0hfXwogI2RlZmluZQlfX1hGU19ESVIyX0JMT0NLX0hfXwpAQCAtNzQsNTMgKzYwLDM3IEBACiAvKgogICogUG9pbnRlciB0byB0aGUgbGVhZiBoZWFkZXIgZW1iZWRkZWQgaW4gYSBkYXRhIGJsb2NrICgxLWJsb2NrIGZvcm1hdCkKICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9CTE9DS19UQUlMX1ApCi14ZnNfZGlyMl9ibG9ja190YWlsX3QgKgoteGZzX2RpcjJfYmxvY2tfdGFpbF9wKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9ibG9ja190ICpibG9jayk7CiAjZGVmaW5lCVhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCxibG9jaykJeGZzX2RpcjJfYmxvY2tfdGFpbF9wKG1wLGJsb2NrKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKG1wLGJsb2NrKQlcCi0JKCgoeGZzX2RpcjJfYmxvY2tfdGFpbF90ICopKChjaGFyICopKGJsb2NrKSArIChtcCktPm1fZGlyYmxrc2l6ZSkpIC0gMSkKLSNlbmRpZgorc3RhdGljIGlubGluZSB4ZnNfZGlyMl9ibG9ja190YWlsX3QgKgoreGZzX2RpcjJfYmxvY2tfdGFpbF9wKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9ibG9ja190ICpibG9jaykKK3sKKwlyZXR1cm4gKCgoeGZzX2RpcjJfYmxvY2tfdGFpbF90ICopCisJCSgoY2hhciAqKShibG9jaykgKyAobXApLT5tX2RpcmJsa3NpemUpKSAtIDEpOworfQogCiAvKgogICogUG9pbnRlciB0byB0aGUgbGVhZiBlbnRyaWVzIGVtYmVkZGVkIGluIGEgZGF0YSBibG9jayAoMS1ibG9jayBmb3JtYXQpCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKQotc3RydWN0IHhmc19kaXIyX2xlYWZfZW50cnkgKnhmc19kaXIyX2Jsb2NrX2xlYWZfcCh4ZnNfZGlyMl9ibG9ja190YWlsX3QgKmJ0cCk7Ci0jZGVmaW5lCVhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApIFwKLQl4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCkJXAotCSgoKHN0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5ICopKGJ0cCkpIC0gSU5UX0dFVCgoYnRwKS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpCi0jZW5kaWYKKyNkZWZpbmUJWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCkJeGZzX2RpcjJfYmxvY2tfbGVhZl9wKGJ0cCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHhmc19kaXIyX2xlYWZfZW50cnkgKgoreGZzX2RpcjJfYmxvY2tfbGVhZl9wKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCAqYnRwKQoreworCXJldHVybiAoKChzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9lbnRyeSAqKQorCQkoYnRwKSkgLSBJTlRfR0VUKChidHApLT5jb3VudCwgQVJDSF9DT05WRVJUKSk7Cit9CiAKIC8qCiAgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuCiAgKi8KLQotZXh0ZXJuIGludAotCXhmc19kaXIyX2Jsb2NrX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLQotZXh0ZXJuIGludAotCXhmc19kaXIyX2Jsb2NrX2dldGRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKLQkJCQlzdHJ1Y3QgdWlvICp1aW8sIGludCAqZW9mcCwgc3RydWN0IHhmc19kaXJlbnQgKmRicCwKLQkJCQl4ZnNfZGlyMl9wdXRfdCBwdXQpOwotCi1leHRlcm4gaW50Ci0JeGZzX2RpcjJfYmxvY2tfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9ibG9ja19yZW1vdmVuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9ibG9ja19yZXBsYWNlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9sZWFmX3RvX2Jsb2NrKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgc3RydWN0IHhmc19kYWJ1ZiAqbGJwLAotCQkJICAgICAgIHN0cnVjdCB4ZnNfZGFidWYgKmRicCk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9zZl90b19ibG9jayhzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ibG9ja19hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX2Jsb2NrX2dldGRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgICBzdHJ1Y3QgdWlvICp1aW8sIGludCAqZW9mcCwKKwkJCQkgICBzdHJ1Y3QgeGZzX2RpcmVudCAqZGJwLCB4ZnNfZGlyMl9wdXRfdCBwdXQpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ibG9ja19sb29rdXAoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfYmxvY2tfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ibG9ja19yZXBsYWNlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfdG9fYmxvY2soc3RydWN0IHhmc19kYV9hcmdzICphcmdzLAorCQkJCSAgc3RydWN0IHhmc19kYWJ1ZiAqbGJwLCBzdHJ1Y3QgeGZzX2RhYnVmICpkYnApOworZXh0ZXJuIGludCB4ZnNfZGlyMl9zZl90b19ibG9jayhzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwogCiAjZW5kaWYJLyogX19YRlNfRElSMl9CTE9DS19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9kYXRhLmMgYi9mcy94ZnMveGZzX2RpcjJfZGF0YS5jCmluZGV4IGEwYWEwZTQuLjViN2M0N2UgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMl9kYXRhLmMKKysrIGIvZnMveGZzL3hmc19kaXIyX2RhdGEuYwpAQCAtMSw2MCArMSwzOCBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KLS8qCi0gKiB4ZnNfZGlyMl9kYXRhLmMKLSAqIENvcmUgZGF0YSBibG9jayBoYW5kbGluZyByb3V0aW5lcyBmb3IgWEZTIFYyIGRpcmVjdG9yaWVzLgotICogU2VlIHhmc19kaXIyX2RhdGEuaCBmb3IgZGF0YSBzdHJ1Y3R1cmVzLgotICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLQotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2RhdGEuaCBiL2ZzL3hmcy94ZnNfZGlyMl9kYXRhLmgKaW5kZXggNDc2Y2FjOS4uNWUzYTdmOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX2RhdGEuaAorKysgYi9mcy94ZnMveGZzX2RpcjJfZGF0YS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19ESVIyX0RBVEFfSF9fCiAjZGVmaW5lCV9fWEZTX0RJUjJfREFUQV9IX18KQEAgLTEzNyw4OCArMTIzLDY1IEBACiAvKgogICogU2l6ZSBvZiBhIGRhdGEgZW50cnkuCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFUQV9FTlRTSVpFKQotaW50IHhmc19kaXIyX2RhdGFfZW50c2l6ZShpbnQgbik7CiAjZGVmaW5lIFhGU19ESVIyX0RBVEFfRU5UU0laRShuKQl4ZnNfZGlyMl9kYXRhX2VudHNpemUobikKLSNlbHNlCi0jZGVmaW5lCVhGU19ESVIyX0RBVEFfRU5UU0laRShuKQlcCi0JKChpbnQpKHJvdW5kdXAob2Zmc2V0b2YoeGZzX2RpcjJfZGF0YV9lbnRyeV90LCBuYW1lWzBdKSArIChuKSArIFwKLQkJICh1aW50KXNpemVvZih4ZnNfZGlyMl9kYXRhX29mZl90KSwgWEZTX0RJUjJfREFUQV9BTElHTikpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyMl9kYXRhX2VudHNpemUoaW50IG4pCit7CisJcmV0dXJuIChpbnQpcm91bmR1cChvZmZzZXRvZih4ZnNfZGlyMl9kYXRhX2VudHJ5X3QsIG5hbWVbMF0pICsgKG4pICsgXAorCQkgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpLCBYRlNfRElSMl9EQVRBX0FMSUdOKTsKK30KIAogLyoKICAqIFBvaW50ZXIgdG8gYW4gZW50cnkncyB0YWcgd29yZC4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKQoteGZzX2RpcjJfZGF0YV9vZmZfdCAqeGZzX2RpcjJfZGF0YV9lbnRyeV90YWdfcCh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKmRlcCk7CiAjZGVmaW5lCVhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKQl4ZnNfZGlyMl9kYXRhX2VudHJ5X3RhZ19wKGRlcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKQlcCi0JKCh4ZnNfZGlyMl9kYXRhX29mZl90ICopXAotCSAoKGNoYXIgKikoZGVwKSArIFhGU19ESVIyX0RBVEFfRU5UU0laRSgoZGVwKS0+bmFtZWxlbikgLSBcCi0JICAodWludClzaXplb2YoeGZzX2RpcjJfZGF0YV9vZmZfdCkpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIHhmc19kaXIyX2RhdGFfb2ZmX3QgKgoreGZzX2RpcjJfZGF0YV9lbnRyeV90YWdfcCh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKmRlcCkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX2RhdGFfb2ZmX3QgKikgXAorCQkgKChjaGFyICopKGRlcCkgKyBYRlNfRElSMl9EQVRBX0VOVFNJWkUoKGRlcCktPm5hbWVsZW4pIC0gXAorCQkgICh1aW50KXNpemVvZih4ZnNfZGlyMl9kYXRhX29mZl90KSk7Cit9CiAKIC8qCiAgKiBQb2ludGVyIHRvIGEgZnJlZXNwYWNlJ3MgdGFnIHdvcmQuCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1ApCi14ZnNfZGlyMl9kYXRhX29mZl90ICp4ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcCh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXApOwogI2RlZmluZQlYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApIFwKIAl4ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcChkdXApCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApCVwKLQkoKHhmc19kaXIyX2RhdGFfb2ZmX3QgKilcCi0JICgoY2hhciAqKShkdXApICsgSU5UX0dFVCgoZHVwKS0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpIFwKLQkJCS0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSB4ZnNfZGlyMl9kYXRhX29mZl90ICoKK3hmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKmR1cCkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX2RhdGFfb2ZmX3QgKikgXAorCQkgKChjaGFyICopKGR1cCkgKyBJTlRfR0VUKChkdXApLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgXAorCQkJCS0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpKTsKK30KIAogLyoKICAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KICAqLwotCiAjaWZkZWYgREVCVUcKLWV4dGVybiB2b2lkCi0JeGZzX2RpcjJfZGF0YV9jaGVjayhzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHhmc19kYWJ1ZiAqYnApOworZXh0ZXJuIHZvaWQgeGZzX2RpcjJfZGF0YV9jaGVjayhzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHhmc19kYWJ1ZiAqYnApOwogI2Vsc2UKICNkZWZpbmUJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCxicCkKICNlbmRpZgotCi1leHRlcm4geGZzX2RpcjJfZGF0YV9mcmVlX3QgKgotCXhmc19kaXIyX2RhdGFfZnJlZWZpbmQoeGZzX2RpcjJfZGF0YV90ICpkLAotCQkJICAgICAgIHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKmR1cCk7Ci0KLWV4dGVybiB4ZnNfZGlyMl9kYXRhX2ZyZWVfdCAqCi0JeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KHhmc19kaXIyX2RhdGFfdCAqZCwKLQkJCQkgeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwLCBpbnQgKmxvZ2hlYWQpOwotCi1leHRlcm4gdm9pZAotCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RhdGFfdCAqZCwKLQkJCSAgICAgICBpbnQgKmxvZ2hlYWQsIGNoYXIgKmFlbmRwKTsKLQotZXh0ZXJuIGludAotCXhmc19kaXIyX2RhdGFfaW5pdChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19kaXIyX2RiX3QgYmxrbm8sCi0JCQkgICBzdHJ1Y3QgeGZzX2RhYnVmICoqYnBwKTsKLQotZXh0ZXJuIHZvaWQKLQl4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCitleHRlcm4geGZzX2RpcjJfZGF0YV9mcmVlX3QgKnhmc19kaXIyX2RhdGFfZnJlZWZpbmQoeGZzX2RpcjJfZGF0YV90ICpkLAorCQkJCXhmc19kaXIyX2RhdGFfdW51c2VkX3QgKmR1cCk7CitleHRlcm4geGZzX2RpcjJfZGF0YV9mcmVlX3QgKnhmc19kaXIyX2RhdGFfZnJlZWluc2VydCh4ZnNfZGlyMl9kYXRhX3QgKmQsCisJCQkJeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwLCBpbnQgKmxvZ2hlYWQpOworZXh0ZXJuIHZvaWQgeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YV90ICpkLAorCQkJCWludCAqbG9naGVhZCwgY2hhciAqYWVuZHApOworZXh0ZXJuIGludCB4ZnNfZGlyMl9kYXRhX2luaXQoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZGlyMl9kYl90IGJsa25vLAorCQkJCXN0cnVjdCB4ZnNfZGFidWYgKipicHApOworZXh0ZXJuIHZvaWQgeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAogCQkJCXhmc19kaXIyX2RhdGFfZW50cnlfdCAqZGVwKTsKLQotZXh0ZXJuIHZvaWQKLQl4ZnNfZGlyMl9kYXRhX2xvZ19oZWFkZXIoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKLQotZXh0ZXJuIHZvaWQKLQl4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAotCQkJCSB4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXApOwotCi1leHRlcm4gdm9pZAotCXhmc19kaXIyX2RhdGFfbWFrZV9mcmVlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKK2V4dGVybiB2b2lkIHhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcihzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCQlzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CitleHRlcm4gdm9pZCB4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQkJCXhmc19kaXIyX2RhdGFfdW51c2VkX3QgKmR1cCk7CitleHRlcm4gdm9pZCB4ZnNfZGlyMl9kYXRhX21ha2VfZnJlZShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCiAJCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2Zmc2V0LAogCQkJCXhmc19kaXIyX2RhdGFfYW9mZl90IGxlbiwgaW50ICpuZWVkbG9ncCwKIAkJCQlpbnQgKm5lZWRzY2FucCk7Ci0KLWV4dGVybiB2b2lkCi0JeGZzX2RpcjJfZGF0YV91c2VfZnJlZShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCitleHRlcm4gdm9pZCB4ZnNfZGlyMl9kYXRhX3VzZV9mcmVlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKIAkJCSAgICAgICB4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXAsCiAJCQkgICAgICAgeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2Zmc2V0LAogCQkJICAgICAgIHhmc19kaXIyX2RhdGFfYW9mZl90IGxlbiwgaW50ICpuZWVkbG9ncCwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmMgYi9mcy94ZnMveGZzX2RpcjJfbGVhZi5jCmluZGV4IDA1NmY1MjguLmQzNDJiNmIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuYwpAQCAtMSw0OSArMSwyNiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KLS8qCi0gKiB4ZnNfZGlyMl9sZWFmLmMKLSAqIFhGUyBkaXJlY3RvcnkgdmVyc2lvbiAyIGltcGxlbWVudGF0aW9uIC0gc2luZ2xlIGxlYWYgZm9ybQotICogc2VlIHhmc19kaXIyX2xlYWYuaCBmb3IgZGF0YSBzdHJ1Y3R1cmVzLgotICogVGhlc2UgZGlyZWN0b3JpZXMgaGF2ZSBtdWx0aXBsZSBYRlNfRElSMl9EQVRBIGJsb2NrcyBhbmQgb25lCi0gKiBYRlNfRElSMl9MRUFGMSBibG9jayBjb250YWluaW5nIHRoZSBoYXNoIHRhYmxlIGFuZCBmcmVlc3BhY2UgbWFwLgotICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLQotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKQEAgLTUxLDYgKzI4LDcgQEAKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCkBAIC01OCwxNCArMzYsMTIgQEAKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKLSNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX2Jsb2NrLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfbm9kZS5oIgogI2luY2x1ZGUgInhmc19kaXIyX3RyYWNlLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgogCiAvKgogICogTG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2xlYWYuaCBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmgKaW5kZXggMzMwM2NkNi4uMTM5Mzk5MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX2xlYWYuaAorKysgYi9mcy94ZnMveGZzX2RpcjJfbGVhZi5oCkBAIC0xLDQxICsxLDIzIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfRElSMl9MRUFGX0hfXwogI2RlZmluZQlfX1hGU19ESVIyX0xFQUZfSF9fCiAKLS8qCi0gKiBEaXJlY3RvcnkgdmVyc2lvbiAyLCBsZWFmIGJsb2NrIHN0cnVjdHVyZXMuCi0gKi8KLQogc3RydWN0IHVpbzsKIHN0cnVjdCB4ZnNfZGFidWY7CiBzdHJ1Y3QgeGZzX2RhX2FyZ3M7CkBAIC00NCwxMCArMjYsNiBAQAogc3RydWN0IHhmc190cmFuczsKIAogLyoKLSAqIENvbnN0YW50cy4KLSAqLwotCi0vKgogICogT2Zmc2V0IG9mIHRoZSBsZWFmL25vZGUgc3BhY2UuICBGaXJzdCBibG9jayBpbiB0aGlzIHNwYWNlCiAgKiBpcyB0aGUgYnRyZWUgcm9vdC4KICAqLwpAQCAtNTcsMTAgKzM1LDYgQEAKIAlYRlNfRElSMl9CWVRFX1RPX0RCKG1wLCBYRlNfRElSMl9MRUFGX09GRlNFVCkKIAogLyoKLSAqIFR5cGVzLgotICovCi0KLS8qCiAgKiBPZmZzZXQgaW4gZGF0YSBzcGFjZSBvZiBhIGRhdGEgZW50cnkuCiAgKi8KIHR5cGVkZWYJX191aW50MzJfdAl4ZnNfZGlyMl9kYXRhcHRyX3Q7CkBAIC02OCwxMCArNDIsNiBAQAogI2RlZmluZQlYRlNfRElSMl9OVUxMX0RBVEFQVFIJKCh4ZnNfZGlyMl9kYXRhcHRyX3QpMCkKIAogLyoKLSAqIFN0cnVjdHVyZXMuCi0gKi8KLQotLyoKICAqIExlYWYgYmxvY2sgaGVhZGVyLgogICovCiB0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9sZWFmX2hkciB7CkBAIC0xMDksMjQ1ICs3OSwxOTMgQEAKIH0geGZzX2RpcjJfbGVhZl90OwogCiAvKgotICogTWFjcm9zLgotICogVGhlIERCIGJsb2NrcyBhcmUgbG9naWNhbCBkaXJlY3RvcnkgYmxvY2sgbnVtYmVycywgbm90IGZpbGVzeXN0ZW0gYmxvY2tzLgorICogREIgYmxvY2tzIGhlcmUgYXJlIGxvZ2ljYWwgZGlyZWN0b3J5IGJsb2NrIG51bWJlcnMsIG5vdCBmaWxlc3lzdGVtIGJsb2Nrcy4KICAqLwogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX01BWF9MRUFGX0VOVFMpCi1pbnQKLXhmc19kaXIyX21heF9sZWFmX2VudHMoc3RydWN0IHhmc19tb3VudCAqbXApOwotI2RlZmluZQlYRlNfRElSMl9NQVhfTEVBRl9FTlRTKG1wKQlcCi0JeGZzX2RpcjJfbWF4X2xlYWZfZW50cyhtcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19ESVIyX01BWF9MRUFGX0VOVFMobXApCVwKLQkoKGludCkoKChtcCktPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX2hkcl90KSkgLyBcCi0JICAgICAgICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpKSkKLSNlbmRpZgorI2RlZmluZQlYRlNfRElSMl9NQVhfTEVBRl9FTlRTKG1wKQl4ZnNfZGlyMl9tYXhfbGVhZl9lbnRzKG1wKQorc3RhdGljIGlubGluZSBpbnQgeGZzX2RpcjJfbWF4X2xlYWZfZW50cyhzdHJ1Y3QgeGZzX21vdW50ICptcCkKK3sKKwlyZXR1cm4gKGludCkoKChtcCktPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX2hkcl90KSkgLworCSAgICAgICAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KSk7Cit9CiAKIC8qCiAgKiBHZXQgYWRkcmVzcyBvZiB0aGUgYmVzdGNvdW50IGZpZWxkIGluIHRoZSBzaW5nbGUtbGVhZiBibG9jay4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9MRUFGX1RBSUxfUCkKLXhmc19kaXIyX2xlYWZfdGFpbF90ICoKLXhmc19kaXIyX2xlYWZfdGFpbF9wKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9sZWFmX3QgKmxwKTsKLSNkZWZpbmUJWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsbHApCVwKLQl4ZnNfZGlyMl9sZWFmX3RhaWxfcChtcCwgbHApCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9MRUFGX1RBSUxfUChtcCxscCkJXAotCSgoeGZzX2RpcjJfbGVhZl90YWlsX3QgKilcCi0JICgoY2hhciAqKShscCkgKyAobXApLT5tX2RpcmJsa3NpemUgLSBcCi0JICAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl90YWlsX3QpKSkKLSNlbmRpZgorI2RlZmluZQlYRlNfRElSMl9MRUFGX1RBSUxfUChtcCxscCkJeGZzX2RpcjJfbGVhZl90YWlsX3AobXAsIGxwKQorc3RhdGljIGlubGluZSB4ZnNfZGlyMl9sZWFmX3RhaWxfdCAqCit4ZnNfZGlyMl9sZWFmX3RhaWxfcChzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfbGVhZl90ICpscCkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX2xlYWZfdGFpbF90ICopCisJCSgoY2hhciAqKShscCkgKyAobXApLT5tX2RpcmJsa3NpemUgLSAKKwkJICAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl90YWlsX3QpKTsKK30KIAogLyoKICAqIEdldCBhZGRyZXNzIG9mIHRoZSBiZXN0cyBhcnJheSBpbiB0aGUgc2luZ2xlLWxlYWYgYmxvY2suCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfTEVBRl9CRVNUU19QKQoteGZzX2RpcjJfZGF0YV9vZmZfdCAqCi14ZnNfZGlyMl9sZWFmX2Jlc3RzX3AoeGZzX2RpcjJfbGVhZl90YWlsX3QgKmx0cCk7CiAjZGVmaW5lCVhGU19ESVIyX0xFQUZfQkVTVFNfUChsdHApCXhmc19kaXIyX2xlYWZfYmVzdHNfcChsdHApCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKQlcCi0JKCh4ZnNfZGlyMl9kYXRhX29mZl90ICopKGx0cCkgLSBJTlRfR0VUKChsdHApLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGF0YV9vZmZfdCAqCit4ZnNfZGlyMl9sZWFmX2Jlc3RzX3AoeGZzX2RpcjJfbGVhZl90YWlsX3QgKmx0cCkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX2RhdGFfb2ZmX3QgKikKKwkJKGx0cCkgLSBJTlRfR0VUKChsdHApLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCk7Cit9CiAKIC8qCiAgKiBDb252ZXJ0IGRhdGFwdHIgdG8gYnl0ZSBpbiBmaWxlIHNwYWNlCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKQoteGZzX2RpcjJfb2ZmX3QKLXhmc19kaXIyX2RhdGFwdHJfdG9fYnl0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKTsKICNkZWZpbmUJWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKG1wLGRwKQl4ZnNfZGlyMl9kYXRhcHRyX3RvX2J5dGUobXAsIGRwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKG1wLGRwKQlcCi0JKCh4ZnNfZGlyMl9vZmZfdCkoZHApIDw8IFhGU19ESVIyX0RBVEFfQUxJR05fTE9HKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIHhmc19kaXIyX29mZl90Cit4ZnNfZGlyMl9kYXRhcHRyX3RvX2J5dGUoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RhdGFwdHJfdCBkcCkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX29mZl90KShkcCkgPDwgWEZTX0RJUjJfREFUQV9BTElHTl9MT0c7Cit9CiAKIC8qCiAgKiBDb252ZXJ0IGJ5dGUgaW4gZmlsZSBzcGFjZSB0byBkYXRhcHRyLiAgSXQgaGFkIGJldHRlciBiZSBhbGlnbmVkLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0JZVEVfVE9fREFUQVBUUikKLXhmc19kaXIyX2RhdGFwdHJfdAoteGZzX2RpcjJfYnl0ZV90b19kYXRhcHRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSk7CiAjZGVmaW5lCVhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCxieSkJeGZzX2RpcjJfYnl0ZV90b19kYXRhcHRyKG1wLGJ5KQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUjJfQllURV9UT19EQVRBUFRSKG1wLGJ5KQlcCi0JKCh4ZnNfZGlyMl9kYXRhcHRyX3QpKChieSkgPj4gWEZTX0RJUjJfREFUQV9BTElHTl9MT0cpKQotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IGRhdGFwdHIgdG8gYSBibG9jayBudW1iZXIKLSAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQVRBUFRSX1RPX0RCKQoteGZzX2RpcjJfZGJfdAoteGZzX2RpcjJfZGF0YXB0cl90b19kYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKTsKLSNkZWZpbmUJWEZTX0RJUjJfREFUQVBUUl9UT19EQihtcCxkcCkJeGZzX2RpcjJfZGF0YXB0cl90b19kYihtcCwgZHApCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9EQVRBUFRSX1RPX0RCKG1wLGRwKQlcCi0JWEZTX0RJUjJfQllURV9UT19EQihtcCwgWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKG1wLCBkcCkpCi0jZW5kaWYKLQotLyoKLSAqIENvbnZlcnQgZGF0YXB0ciB0byBhIGJ5dGUgb2Zmc2V0IGluIGEgYmxvY2sKLSAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQVRBUFRSX1RPX09GRikKLXhmc19kaXIyX2RhdGFfYW9mZl90Ci14ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKTsKLSNkZWZpbmUJWEZTX0RJUjJfREFUQVBUUl9UT19PRkYobXAsZHApCXhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKG1wLCBkcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLGRwKQlcCi0JWEZTX0RJUjJfQllURV9UT19PRkYobXAsIFhGU19ESVIyX0RBVEFQVFJfVE9fQllURShtcCwgZHApKQotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IGJsb2NrIGFuZCBvZmZzZXQgdG8gYnl0ZSBpbiBzcGFjZQotICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RCX09GRl9UT19CWVRFKQoteGZzX2RpcjJfb2ZmX3QKLXhmc19kaXIyX2RiX29mZl90b19ieXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiLAotCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgbyk7Ci0jZGVmaW5lCVhGU19ESVIyX0RCX09GRl9UT19CWVRFKG1wLGRiLG8pCVwKLQl4ZnNfZGlyMl9kYl9vZmZfdG9fYnl0ZShtcCwgZGIsIG8pCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9EQl9PRkZfVE9fQllURShtcCxkYixvKQlcCi0JKCgoeGZzX2RpcjJfb2ZmX3QpKGRiKSA8PCBcCi0JICgobXApLT5tX3NiLnNiX2Jsb2NrbG9nICsgKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpKSArIChvKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSB4ZnNfZGlyMl9kYXRhcHRyX3QKK3hmc19kaXIyX2J5dGVfdG9fZGF0YXB0cihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpCit7CisJcmV0dXJuICh4ZnNfZGlyMl9kYXRhcHRyX3QpKChieSkgPj4gWEZTX0RJUjJfREFUQV9BTElHTl9MT0cpOworfQogCiAvKgogICogQ29udmVydCBieXRlIGluIHNwYWNlIHRvIChEQikgYmxvY2sKICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX0RCKQoteGZzX2RpcjJfZGJfdCB4ZnNfZGlyMl9ieXRlX3RvX2RiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSk7CiAjZGVmaW5lCVhGU19ESVIyX0JZVEVfVE9fREIobXAsYnkpCXhmc19kaXIyX2J5dGVfdG9fZGIobXAsIGJ5KQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUjJfQllURV9UT19EQihtcCxieSkJXAotCSgoeGZzX2RpcjJfZGJfdCkoKGJ5KSA+PiBcCi0JCQkgKChtcCktPm1fc2Iuc2JfYmxvY2tsb2cgKyAobXApLT5tX3NiLnNiX2RpcmJsa2xvZykpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIHhmc19kaXIyX2RiX3QKK3hmc19kaXIyX2J5dGVfdG9fZGIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQoreworCXJldHVybiAoeGZzX2RpcjJfZGJfdCkoKGJ5KSA+PiBcCisJCSAoKG1wKS0+bV9zYi5zYl9ibG9ja2xvZyArIChtcCktPm1fc2Iuc2JfZGlyYmxrbG9nKSk7Cit9CiAKIC8qCi0gKiBDb252ZXJ0IGJ5dGUgaW4gc3BhY2UgdG8gKERBKSBibG9jaworICogQ29udmVydCBkYXRhcHRyIHRvIGEgYmxvY2sgbnVtYmVyCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfQllURV9UT19EQSkKLXhmc19kYWJsa190IHhmc19kaXIyX2J5dGVfdG9fZGEoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KTsKLSNkZWZpbmUJWEZTX0RJUjJfQllURV9UT19EQShtcCxieSkJeGZzX2RpcjJfYnl0ZV90b19kYShtcCwgYnkpCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9CWVRFX1RPX0RBKG1wLGJ5KQlcCi0JWEZTX0RJUjJfREJfVE9fREEobXAsIFhGU19ESVIyX0JZVEVfVE9fREIobXAsIGJ5KSkKLSNlbmRpZgorI2RlZmluZQlYRlNfRElSMl9EQVRBUFRSX1RPX0RCKG1wLGRwKQl4ZnNfZGlyMl9kYXRhcHRyX3RvX2RiKG1wLCBkcCkKK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGJfdAoreGZzX2RpcjJfZGF0YXB0cl90b19kYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKQoreworCXJldHVybiBYRlNfRElSMl9CWVRFX1RPX0RCKG1wLCBYRlNfRElSMl9EQVRBUFRSX1RPX0JZVEUobXAsIGRwKSk7Cit9CiAKIC8qCiAgKiBDb252ZXJ0IGJ5dGUgaW4gc3BhY2UgdG8gb2Zmc2V0IGluIGEgYmxvY2sKICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX09GRikKLXhmc19kaXIyX2RhdGFfYW9mZl90Ci14ZnNfZGlyMl9ieXRlX3RvX29mZihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpOwogI2RlZmluZQlYRlNfRElSMl9CWVRFX1RPX09GRihtcCxieSkJeGZzX2RpcjJfYnl0ZV90b19vZmYobXAsIGJ5KQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUjJfQllURV9UT19PRkYobXAsYnkpCVwKLQkoKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoYnkpICYgXAotCQkJCSgoMSA8PCAoKG1wKS0+bV9zYi5zYl9ibG9ja2xvZyArIFwKLQkJCQkJKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpKSAtIDEpKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSB4ZnNfZGlyMl9kYXRhX2FvZmZfdAoreGZzX2RpcjJfYnl0ZV90b19vZmYoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQoreworCXJldHVybiAoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChieSkgJiBcCisJCSgoMSA8PCAoKG1wKS0+bV9zYi5zYl9ibG9ja2xvZyArIChtcCktPm1fc2Iuc2JfZGlyYmxrbG9nKSkgLSAxKSk7Cit9CiAKIC8qCi0gKiBDb252ZXJ0IGJsb2NrIGFuZCBvZmZzZXQgdG8gZGF0YXB0cgorICogQ29udmVydCBkYXRhcHRyIHRvIGEgYnl0ZSBvZmZzZXQgaW4gYSBibG9jawogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKQoteGZzX2RpcjJfZGF0YXB0cl90Ci14ZnNfZGlyMl9kYl9vZmZfdG9fZGF0YXB0cihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYiwKLQkJCSAgIHhmc19kaXIyX2RhdGFfYW9mZl90IG8pOwotI2RlZmluZQlYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCxkYixvKQlcCi0JeGZzX2RpcjJfZGJfb2ZmX3RvX2RhdGFwdHIobXAsIGRiLCBvKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsZGIsbykJXAotCVhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUobXAsIGRiLCBvKSkKLSNlbmRpZgorI2RlZmluZQlYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCxkcCkJeGZzX2RpcjJfZGF0YXB0cl90b19vZmYobXAsIGRwKQorc3RhdGljIGlubGluZSB4ZnNfZGlyMl9kYXRhX2FvZmZfdAoreGZzX2RpcjJfZGF0YXB0cl90b19vZmYoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RhdGFwdHJfdCBkcCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfQllURV9UT19PRkYobXAsIFhGU19ESVIyX0RBVEFQVFJfVE9fQllURShtcCwgZHApKTsKK30KKworLyoKKyAqIENvbnZlcnQgYmxvY2sgYW5kIG9mZnNldCB0byBieXRlIGluIHNwYWNlCisgKi8KKyNkZWZpbmUJWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUobXAsZGIsbykJXAorCXhmc19kaXIyX2RiX29mZl90b19ieXRlKG1wLCBkYiwgbykKK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfb2ZmX3QKK3hmc19kaXIyX2RiX29mZl90b19ieXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiLAorCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbykKK3sKKwlyZXR1cm4gKCh4ZnNfZGlyMl9vZmZfdCkoZGIpIDw8IFwKKwkJKChtcCktPm1fc2Iuc2JfYmxvY2tsb2cgKyAobXApLT5tX3NiLnNiX2RpcmJsa2xvZykpICsgKG8pOworfQogCiAvKgogICogQ29udmVydCBibG9jayAoREIpIHRvIGJsb2NrIChkYWJsaykKICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQl9UT19EQSkKLXhmc19kYWJsa190IHhmc19kaXIyX2RiX3RvX2RhKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKTsKICNkZWZpbmUJWEZTX0RJUjJfREJfVE9fREEobXAsZGIpCXhmc19kaXIyX2RiX3RvX2RhKG1wLCBkYikKLSNlbHNlCi0jZGVmaW5lCVhGU19ESVIyX0RCX1RPX0RBKG1wLGRiKQlcCi0JKCh4ZnNfZGFibGtfdCkoKGRiKSA8PCAobXApLT5tX3NiLnNiX2RpcmJsa2xvZykpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgeGZzX2RhYmxrX3QKK3hmc19kaXIyX2RiX3RvX2RhKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKQoreworCXJldHVybiAoeGZzX2RhYmxrX3QpKChkYikgPDwgKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpOworfQorCisvKgorICogQ29udmVydCBieXRlIGluIHNwYWNlIHRvIChEQSkgYmxvY2sKKyAqLworI2RlZmluZQlYRlNfRElSMl9CWVRFX1RPX0RBKG1wLGJ5KQl4ZnNfZGlyMl9ieXRlX3RvX2RhKG1wLCBieSkKK3N0YXRpYyBpbmxpbmUgeGZzX2RhYmxrX3QKK3hmc19kaXIyX2J5dGVfdG9fZGEoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQoreworCXJldHVybiBYRlNfRElSMl9EQl9UT19EQShtcCwgWEZTX0RJUjJfQllURV9UT19EQihtcCwgYnkpKTsKK30KKworLyoKKyAqIENvbnZlcnQgYmxvY2sgYW5kIG9mZnNldCB0byBkYXRhcHRyCisgKi8KKyNkZWZpbmUJWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsZGIsbykJXAorCXhmc19kaXIyX2RiX29mZl90b19kYXRhcHRyKG1wLCBkYiwgbykKK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGF0YXB0cl90Cit4ZnNfZGlyMl9kYl9vZmZfdG9fZGF0YXB0cihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYiwKKwkJCSAgIHhmc19kaXIyX2RhdGFfYW9mZl90IG8pCit7CisJcmV0dXJuIFhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUobXAsIGRiLCBvKSk7Cit9CiAKIC8qCiAgKiBDb252ZXJ0IGJsb2NrIChkYWJsaykgdG8gYmxvY2sgKERCKQogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RBX1RPX0RCKQoteGZzX2RpcjJfZGJfdCB4ZnNfZGlyMl9kYV90b19kYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhYmxrX3QgZGEpOwogI2RlZmluZQlYRlNfRElSMl9EQV9UT19EQihtcCxkYSkJeGZzX2RpcjJfZGFfdG9fZGIobXAsIGRhKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUjJfREFfVE9fREIobXAsZGEpCVwKLQkoKHhmc19kaXIyX2RiX3QpKChkYSkgPj4gKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIHhmc19kaXIyX2RiX3QKK3hmc19kaXIyX2RhX3RvX2RiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFibGtfdCBkYSkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX2RiX3QpKChkYSkgPj4gKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpOworfQogCiAvKgogICogQ29udmVydCBibG9jayAoZGFibGspIHRvIGJ5dGUgb2Zmc2V0IGluIHNwYWNlCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFfVE9fQllURSkKLXhmc19kaXIyX29mZl90IHhmc19kaXIyX2RhX3RvX2J5dGUoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kYWJsa190IGRhKTsKICNkZWZpbmUgWEZTX0RJUjJfREFfVE9fQllURShtcCxkYSkJeGZzX2RpcjJfZGFfdG9fYnl0ZShtcCwgZGEpCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9EQV9UT19CWVRFKG1wLGRhKQlcCi0JWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUobXAsIFhGU19ESVIyX0RBX1RPX0RCKG1wLCBkYSksIDApCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfb2ZmX3QKK3hmc19kaXIyX2RhX3RvX2J5dGUoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kYWJsa190IGRhKQoreworCXJldHVybiBYRlNfRElSMl9EQl9PRkZfVE9fQllURShtcCwgWEZTX0RJUjJfREFfVE9fREIobXAsIGRhKSwgMCk7Cit9CiAKIC8qCiAgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuCiAgKi8KLQotZXh0ZXJuIGludAotCXhmc19kaXIyX2Jsb2NrX3RvX2xlYWYoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBzdHJ1Y3QgeGZzX2RhYnVmICpkYnApOwotCi1leHRlcm4gaW50Ci0JeGZzX2RpcjJfbGVhZl9hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci0KLWV4dGVybiB2b2lkCi0JeGZzX2RpcjJfbGVhZl9jb21wYWN0KHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgc3RydWN0IHhmc19kYWJ1ZiAqYnApOwotCi1leHRlcm4gdm9pZAotCXhmc19kaXIyX2xlYWZfY29tcGFjdF94MShzdHJ1Y3QgeGZzX2RhYnVmICpicCwgaW50ICppbmRleHAsCi0JCQkJIGludCAqbG93c3RhbGVwLCBpbnQgKmhpZ2hzdGFsZXAsIGludCAqbG93bG9ncCwKLQkJCQkgaW50ICpoaWdobG9ncCk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9sZWFmX2dldGRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKLQkJCSAgICAgICBzdHJ1Y3QgdWlvICp1aW8sIGludCAqZW9mcCwgc3RydWN0IHhmc19kaXJlbnQgKmRicCwKLQkJCSAgICAgICB4ZnNfZGlyMl9wdXRfdCBwdXQpOwotCi1leHRlcm4gaW50Ci0JeGZzX2RpcjJfbGVhZl9pbml0KHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2RpcjJfZGJfdCBibm8sCi0JCQkgICBzdHJ1Y3QgeGZzX2RhYnVmICoqYnBwLCBpbnQgbWFnaWMpOwotCi1leHRlcm4gdm9pZAotCXhmc19kaXIyX2xlYWZfbG9nX2VudHMoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAotCQkJICAgICAgIGludCBmaXJzdCwgaW50IGxhc3QpOwotCi1leHRlcm4gdm9pZAotCXhmc19kaXIyX2xlYWZfbG9nX2hlYWRlcihzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnApOwotCi1leHRlcm4gaW50Ci0JeGZzX2RpcjJfbGVhZl9sb29rdXAoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLQotZXh0ZXJuIGludAotCXhmc19kaXIyX2xlYWZfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwotCi1leHRlcm4gaW50Ci0JeGZzX2RpcjJfbGVhZl9yZXBsYWNlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9sZWFmX3NlYXJjaF9oYXNoKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKLQkJCQkgIHN0cnVjdCB4ZnNfZGFidWYgKmxicCk7Ci1leHRlcm4gaW50Ci0JeGZzX2RpcjJfbGVhZl90cmltX2RhdGEoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBzdHJ1Y3QgeGZzX2RhYnVmICpsYnAsCQkJCXhmc19kaXIyX2RiX3QgZGIpOwotCi1leHRlcm4gaW50Ci0JeGZzX2RpcjJfbm9kZV90b19sZWFmKHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfYmxvY2tfdG9fbGVhZihzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCisJCQkJICBzdHJ1Y3QgeGZzX2RhYnVmICpkYnApOworZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2xlYWZfY29tcGFjdChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCisJCQkJICBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CitleHRlcm4gdm9pZCB4ZnNfZGlyMl9sZWFmX2NvbXBhY3RfeDEoc3RydWN0IHhmc19kYWJ1ZiAqYnAsIGludCAqaW5kZXhwLAorCQkJCSAgICAgaW50ICpsb3dzdGFsZXAsIGludCAqaGlnaHN0YWxlcCwKKwkJCQkgICAgIGludCAqbG93bG9ncCwgaW50ICpoaWdobG9ncCk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfZ2V0ZGVudHMoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCSAgc3RydWN0IHVpbyAqdWlvLCBpbnQgKmVvZnAsCisJCQkJICBzdHJ1Y3QgeGZzX2RpcmVudCAqZGJwLCB4ZnNfZGlyMl9wdXRfdCBwdXQpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX2luaXQoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZGlyMl9kYl90IGJubywKKwkJCSAgICAgIHN0cnVjdCB4ZnNfZGFidWYgKipicHAsIGludCBtYWdpYyk7CitleHRlcm4gdm9pZCB4ZnNfZGlyMl9sZWFmX2xvZ19lbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCQkgICBpbnQgZmlyc3QsIGludCBsYXN0KTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2xlYWZfbG9nX2hlYWRlcihzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCQkgICAgIHN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfbGVhZl9sb29rdXAoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfbGVhZl9yZW1vdmVuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfcmVwbGFjZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX3NlYXJjaF9oYXNoKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJCQkgICAgIHN0cnVjdCB4ZnNfZGFidWYgKmxicCk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfdHJpbV9kYXRhKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJCQkgICBzdHJ1Y3QgeGZzX2RhYnVmICpsYnAsIHhmc19kaXIyX2RiX3QgZGIpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ub2RlX3RvX2xlYWYoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUpOwogCiAjZW5kaWYJLyogX19YRlNfRElSMl9MRUFGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX25vZGUuYyBiL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmMKaW5kZXggYTc2MTVkODYuLjY0MWY4NjMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmMKKysrIGIvZnMveGZzL3hmc19kaXIyX25vZGUuYwpAQCAtMSw2MSArMSwzOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCi0vKgotICogeGZzX2RpcjJfbm9kZS5jCi0gKiBYRlMgZGlyZWN0b3J5IGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDIsIG5vZGUgZm9ybSBmaWxlcwotICogU2VlIGRhdGEgc3RydWN0dXJlcyBpbiB4ZnNfZGlyMl9ub2RlLmggYW5kIHhmc19kYV9idHJlZS5oLgotICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLQotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmggYi9mcy94ZnMveGZzX2RpcjJfbm9kZS5oCmluZGV4IDk2ZGI0MjAuLjBhYjhmYmQ1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0RJUjJfTk9ERV9IX18KICNkZWZpbmUJX19YRlNfRElSMl9OT0RFX0hfXwpAQCAtNDUsMTAgKzMxLDYgQEAKIHN0cnVjdCB4ZnNfdHJhbnM7CiAKIC8qCi0gKiBDb25zdGFudHMuCi0gKi8KLQotLyoKICAqIE9mZnNldCBvZiB0aGUgZnJlZXNwYWNlIGluZGV4LgogICovCiAjZGVmaW5lCVhGU19ESVIyX0ZSRUVfU1BBQ0UJMgpAQCAtNTgsOSArNDAsNiBAQAogCiAjZGVmaW5lCVhGU19ESVIyX0ZSRUVfTUFHSUMJMHg1ODQ0MzI0NgkvKiBYRDJGICovCiAKLS8qCi0gKiBTdHJ1Y3R1cmVzLgotICovCiB0eXBlZGVmCXN0cnVjdCB4ZnNfZGlyMl9mcmVlX2hkciB7CiAJX191aW50MzJfdAkJbWFnaWM7CQkvKiBYRlNfRElSMl9GUkVFX01BR0lDICovCiAJX19pbnQzMl90CQlmaXJzdGRiOwkvKiBkYiBvZiBmaXJzdCBlbnRyeSAqLwpAQCAtNzMsODcgKzUyLDUzIEBACiAJeGZzX2RpcjJfZGF0YV9vZmZfdAliZXN0c1sxXTsJLyogYmVzdCBmcmVlIGNvdW50cyAqLwogCQkJCQkJLyogdW51c2VkIGVudHJpZXMgYXJlIC0xICovCiB9IHhmc19kaXIyX2ZyZWVfdDsKKwogI2RlZmluZQlYRlNfRElSMl9NQVhfRlJFRV9CRVNUUyhtcCkJXAogCSgoKG1wKS0+bV9kaXJibGtzaXplIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2ZyZWVfaGRyX3QpKSAvIFwKIAkgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpKQogCiAvKgotICogTWFjcm9zLgotICovCi0KLS8qCiAgKiBDb252ZXJ0IGRhdGEgc3BhY2UgZGIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZnJlZSBkYi4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQl9UT19GREIpCi14ZnNfZGlyMl9kYl90Ci14ZnNfZGlyMl9kYl90b19mZGIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RiX3QgZGIpOwogI2RlZmluZQlYRlNfRElSMl9EQl9UT19GREIobXAsZGIpCXhmc19kaXIyX2RiX3RvX2ZkYihtcCwgZGIpCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9EQl9UT19GREIobXAsZGIpCVwKLQkoWEZTX0RJUjJfRlJFRV9GSVJTVERCKG1wKSArIChkYikgLyBYRlNfRElSMl9NQVhfRlJFRV9CRVNUUyhtcCkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGJfdAoreGZzX2RpcjJfZGJfdG9fZmRiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKQoreworCXJldHVybiAoWEZTX0RJUjJfRlJFRV9GSVJTVERCKG1wKSArIChkYikgLyBYRlNfRElSMl9NQVhfRlJFRV9CRVNUUyhtcCkpOworfQogCiAvKgogICogQ29udmVydCBkYXRhIHNwYWNlIGRiIHRvIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4IGluIGEgZnJlZSBkYi4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQl9UT19GRElOREVYKQotaW50Ci14ZnNfZGlyMl9kYl90b19mZGluZGV4KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKTsKICNkZWZpbmUJWEZTX0RJUjJfREJfVE9fRkRJTkRFWChtcCxkYikJeGZzX2RpcjJfZGJfdG9fZmRpbmRleChtcCwgZGIpCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9EQl9UT19GRElOREVYKG1wLGRiKQkoKGRiKSAlIFhGU19ESVIyX01BWF9GUkVFX0JFU1RTKG1wKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQKK3hmc19kaXIyX2RiX3RvX2ZkaW5kZXgoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RiX3QgZGIpCit7CisJcmV0dXJuICgoZGIpICUgWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApKTsKK30KIAotLyoKLSAqIEZ1bmN0aW9ucy4KLSAqLwotCi1leHRlcm4gdm9pZAotCXhmc19kaXIyX2ZyZWVfbG9nX2Jlc3RzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKLQkJCQlpbnQgZmlyc3QsIGludCBsYXN0KTsKLQotZXh0ZXJuIGludAotCXhmc19kaXIyX2xlYWZfdG9fbm9kZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHN0cnVjdCB4ZnNfZGFidWYgKmxicCk7Ci0KLWV4dGVybiB4ZnNfZGFoYXNoX3QKLQl4ZnNfZGlyMl9sZWFmbl9sYXN0aGFzaChzdHJ1Y3QgeGZzX2RhYnVmICpicCwgaW50ICpjb3VudCk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9sZWFmbl9sb29rdXBfaW50KHN0cnVjdCB4ZnNfZGFidWYgKmJwLAotCQkJCSAgc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBpbnQgKmluZGV4cCwKLQkJCQkgIHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlKTsKLQotZXh0ZXJuIGludAotCXhmc19kaXIyX2xlYWZuX29yZGVyKHN0cnVjdCB4ZnNfZGFidWYgKmxlYWYxX2JwLAotCQkJICAgICBzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmMl9icCk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9sZWFmbl9zcGxpdChzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwKLQkJCSAgICAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKm9sZGJsaywKLQkJCSAgICAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKm5ld2Jsayk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9sZWFmbl90b29zbWFsbChzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwgaW50ICphY3Rpb24pOwotCi1leHRlcm4gdm9pZAotCXhmc19kaXIyX2xlYWZuX3VuYmFsYW5jZShzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwKLQkJCQkgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKmRyb3BfYmxrLAotCQkJCSBzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqc2F2ZV9ibGspOwotCi1leHRlcm4gaW50Ci0JeGZzX2RpcjJfbm9kZV9hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9ub2RlX2xvb2t1cChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwotCi1leHRlcm4gaW50Ci0JeGZzX2RpcjJfbm9kZV9yZW1vdmVuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9ub2RlX3JlcGxhY2Uoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLQotZXh0ZXJuIGludAotCXhmc19kaXIyX25vZGVfdHJpbV9mcmVlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2ZpbGVvZmZfdCBmbywKLQkJCQlpbnQgKnJ2YWxwKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2ZyZWVfbG9nX2Jlc3RzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCQkgICAgaW50IGZpcnN0LCBpbnQgbGFzdCk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfdG9fbm9kZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCisJCQkJIHN0cnVjdCB4ZnNfZGFidWYgKmxicCk7CitleHRlcm4geGZzX2RhaGFzaF90IHhmc19kaXIyX2xlYWZuX2xhc3RoYXNoKHN0cnVjdCB4ZnNfZGFidWYgKmJwLCBpbnQgKmNvdW50KTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfbGVhZm5fbG9va3VwX2ludChzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCQkgICAgIHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgaW50ICppbmRleHAsCisJCQkJICAgICBzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZuX29yZGVyKHN0cnVjdCB4ZnNfZGFidWYgKmxlYWYxX2JwLAorCQkJCXN0cnVjdCB4ZnNfZGFidWYgKmxlYWYyX2JwKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfbGVhZm5fc3BsaXQoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsCisJCQkJc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKm9sZGJsaywKKwkJCQlzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqbmV3YmxrKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfbGVhZm5fdG9vc21hbGwoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsIGludCAqYWN0aW9uKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2xlYWZuX3VuYmFsYW5jZShzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpkcm9wX2JsaywKKwkJCQkgICAgIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpzYXZlX2Jsayk7CitleHRlcm4gaW50IHhmc19kaXIyX25vZGVfYWRkbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ub2RlX2xvb2t1cChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ub2RlX3JlbW92ZW5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfbm9kZV9yZXBsYWNlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX25vZGVfdHJpbV9mcmVlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2ZpbGVvZmZfdCBmbywKKwkJCQkgICBpbnQgKnJ2YWxwKTsKIAogI2VuZGlmCS8qIF9fWEZTX0RJUjJfTk9ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9zZi5jIGIvZnMveGZzL3hmc19kaXIyX3NmLmMKaW5kZXggNmJiYzYxNi4uZWM4ZTc0NyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX3NmLmMKKysrIGIvZnMveGZzL3hmc19kaXIyX3NmLmMKQEAgLTEsNjAgKzEsMzkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCi0vKgotICogeGZzX2RpcjJfc2YuYwotICogU2hvcnRmb3JtIGRpcmVjdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgdjIgZGlyZWN0b3JpZXMuCi0gKi8KLQogI2luY2x1ZGUgInhmcy5oIgotCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2Rpci5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgotI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCi0jaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCkBAIC0xMDcsNyArODYsNyBAQAogCWludAkJCWlzZG90ZG90OwkvKiBlbnRyeSBpcyAiLi4iICovCiAJeGZzX21vdW50X3QJCSptcDsJCS8qIG1vdW50IHN0cnVjdHVyZSBwb2ludGVyICovCiAJaW50CQkJbmFtZWxlbjsJLyogdG90YWwgbmFtZSBieXRlcyAqLwotCXhmc19pbm9fdAkJcGFyZW50OwkJLyogcGFyZW50IGlub2RlIG51bWJlciAqLworCXhmc19pbm9fdAkJcGFyZW50ID0gMDsJLyogcGFyZW50IGlub2RlIG51bWJlciAqLwogCWludAkJCXNpemU9MDsJCS8qIHRvdGFsIGNvbXB1dGVkIHNpemUgKi8KIAogCW1wID0gZHAtPmlfbW91bnQ7CkBAIC0yOTgsMTEgKzI3NywxMSBAQAogCWludAkJCWluY3JfaXNpemU7CS8qIHRvdGFsIGNoYW5nZSBpbiBzaXplICovCiAJaW50CQkJbmV3X2lzaXplOwkvKiBkaV9zaXplIGFmdGVyIGFkZGluZyBuYW1lICovCiAJaW50CQkJb2JqY2hhbmdlOwkvKiBjaGFuZ2luZyB0byA4LWJ5dGUgaW5vZGVzICovCi0JeGZzX2RpcjJfZGF0YV9hb2ZmX3QJb2Zmc2V0OwkJLyogb2Zmc2V0IGZvciBuZXcgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlvZmZzZXQgPSAwOwkvKiBvZmZzZXQgZm9yIG5ldyBlbnRyeSAqLwogCWludAkJCW9sZF9pc2l6ZTsJLyogZGlfc2l6ZSBiZWZvcmUgYWRkaW5nIG5hbWUgKi8KIAlpbnQJCQlwaWNrOwkJLyogd2hpY2ggYWxnb3JpdGhtIHRvIHVzZSAqLwogCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCi0JeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIHNob3J0Zm9ybSBlbnRyeSAqLworCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXAgPSBOVUxMOwkvKiBzaG9ydGZvcm0gZW50cnkgKi8KIAogCXhmc19kaXIyX3RyYWNlX2FyZ3MoInNmX2FkZG5hbWUiLCBhcmdzKTsKIAlBU1NFUlQoeGZzX2RpcjJfc2ZfbG9va3VwKGFyZ3MpID09IEVOT0VOVCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfc2YuaCBiL2ZzL3hmcy94ZnNfZGlyMl9zZi5oCmluZGV4IGJhYzZmNWEuLjQyZjAxNWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMl9zZi5oCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9zZi5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfRElSMl9TRl9IX18KICNkZWZpbmUJX19YRlNfRElSMl9TRl9IX18KQEAgLTEwNCwxNDAgKzkwLDEwNiBAQAogCXhmc19kaXIyX3NmX2VudHJ5X3QJbGlzdFsxXTsJLyogc2hvcnRmb3JtIGVudHJpZXMgKi8KIH0geGZzX2RpcjJfc2ZfdDsKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9IRFJfU0laRSkKLWludCB4ZnNfZGlyMl9zZl9oZHJfc2l6ZShpbnQgaThjb3VudCk7CiAjZGVmaW5lCVhGU19ESVIyX1NGX0hEUl9TSVpFKGk4Y291bnQpCXhmc19kaXIyX3NmX2hkcl9zaXplKGk4Y291bnQpCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9TRl9IRFJfU0laRShpOGNvdW50KQlcCi0JKCh1aW50KXNpemVvZih4ZnNfZGlyMl9zZl9oZHJfdCkgLSBcCi0JICgoaThjb3VudCkgPT0gMCkgKiBcCi0JICgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX2RpcjJfc2ZfaGRyX3NpemUoaW50IGk4Y291bnQpCit7CisJcmV0dXJuICgodWludClzaXplb2YoeGZzX2RpcjJfc2ZfaGRyX3QpIC0gXAorCQkoKGk4Y291bnQpID09IDApICogXAorCQkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLSAodWludClzaXplb2YoeGZzX2RpcjJfaW5vNF90KSkpOworfQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX1NGX0lOVU1CRVJQKQoteGZzX2RpcjJfaW5vdV90ICp4ZnNfZGlyMl9zZl9pbnVtYmVycCh4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKTsKICNkZWZpbmUJWEZTX0RJUjJfU0ZfSU5VTUJFUlAoc2ZlcCkJeGZzX2RpcjJfc2ZfaW51bWJlcnAoc2ZlcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApCVwKLQkoKHhmc19kaXIyX2lub3VfdCAqKSYoc2ZlcCktPm5hbWVbKHNmZXApLT5uYW1lbGVuXSkKLSNlbmRpZgorc3RhdGljIGlubGluZSB4ZnNfZGlyMl9pbm91X3QgKnhmc19kaXIyX3NmX2ludW1iZXJwKHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXApCit7CisJcmV0dXJuICh4ZnNfZGlyMl9pbm91X3QgKikmKHNmZXApLT5uYW1lWyhzZmVwKS0+bmFtZWxlbl07Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIpCi14ZnNfaW50aW5vX3QgeGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9pbm91X3QgKmZyb20pOwotI2RlZmluZQlYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsIGZyb20pCVwKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLCBmcm9tKSBcCiAJeGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIoc2ZwLCBmcm9tKQotCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsIGZyb20pCVwKLQkoKHNmcCktPmhkci5pOGNvdW50ID09IDAgPyBcCitzdGF0aWMgaW5saW5lIHhmc19pbnRpbm9fdAoreGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9pbm91X3QgKmZyb20pCit7CisJcmV0dXJuICgoc2ZwKS0+aGRyLmk4Y291bnQgPT0gMCA/IFwKIAkJKHhmc19pbnRpbm9fdClYRlNfR0VUX0RJUl9JTk80KChmcm9tKS0+aTQpIDogXAotCQkoeGZzX2ludGlub190KVhGU19HRVRfRElSX0lOTzgoKGZyb20pLT5pOCkpCi0jZW5kaWYKKwkJKHhmc19pbnRpbm9fdClYRlNfR0VUX0RJUl9JTk84KChmcm9tKS0+aTgpKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9QVVRfSU5VTUJFUikKLXZvaWQgeGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfaW5vX3QgKmZyb20sCi0JCQkJICAgICB4ZnNfZGlyMl9pbm91X3QgKnRvKTsKLSNkZWZpbmUJWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLGZyb20sdG8pCVwKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLGZyb20sdG8pIFwKIAl4ZnNfZGlyMl9zZl9wdXRfaW51bWJlcihzZnAsZnJvbSx0bykKLSNlbHNlCi0jZGVmaW5lCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCxmcm9tLHRvKQlcCi0JaWYgKChzZnApLT5oZHIuaThjb3VudCA9PSAwKSB7IFwKLQkJWEZTX1BVVF9ESVJfSU5PNCgqKGZyb20pLCAodG8pLT5pNCk7IFwKLQl9IGVsc2UgeyBcCi0JCVhGU19QVVRfRElSX0lOTzgoKihmcm9tKSwgKHRvKS0+aTgpOyBcCi0JfQotI2VuZGlmCitzdGF0aWMgaW5saW5lIHZvaWQgeGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfaW5vX3QgKmZyb20sCisJCQkJCQl4ZnNfZGlyMl9pbm91X3QgKnRvKQoreworCWlmICgoc2ZwKS0+aGRyLmk4Y291bnQgPT0gMCkKKwkJWEZTX1BVVF9ESVJfSU5PNCgqKGZyb20pLCAodG8pLT5pNCk7CisJZWxzZQorCQlYRlNfUFVUX0RJUl9JTk84KCooZnJvbSksICh0byktPmk4KTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9HRVRfT0ZGU0VUKQoteGZzX2RpcjJfZGF0YV9hb2ZmX3QgeGZzX2RpcjJfc2ZfZ2V0X29mZnNldCh4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKTsKICNkZWZpbmUJWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKQlcCiAJeGZzX2RpcjJfc2ZfZ2V0X29mZnNldChzZmVwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKQlcCi0JSU5UX0dFVF9VTkFMSUdORURfMTZfQkUoJihzZmVwKS0+b2Zmc2V0LmkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGF0YV9hb2ZmX3QKK3hmc19kaXIyX3NmX2dldF9vZmZzZXQoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCkKK3sKKwlyZXR1cm4gSU5UX0dFVF9VTkFMSUdORURfMTZfQkUoJihzZmVwKS0+b2Zmc2V0LmkpOworfQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX1NGX1BVVF9PRkZTRVQpCi12b2lkIHhmc19kaXIyX3NmX3B1dF9vZmZzZXQoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCwKLQkJCQkgICAgeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2ZmKTsKICNkZWZpbmUJWEZTX0RJUjJfU0ZfUFVUX09GRlNFVChzZmVwLG9mZikgXAogCXhmc19kaXIyX3NmX3B1dF9vZmZzZXQoc2ZlcCxvZmYpCi0jZWxzZQotI2RlZmluZQlYRlNfRElSMl9TRl9QVVRfT0ZGU0VUKHNmZXAsb2ZmKQlcCi0JSU5UX1NFVF9VTkFMSUdORURfMTZfQkUoJihzZmVwKS0+b2Zmc2V0Lmksb2ZmKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIHZvaWQKK3hmc19kaXIyX3NmX3B1dF9vZmZzZXQoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCwgeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2ZmKQoreworCUlOVF9TRVRfVU5BTElHTkVEXzE2X0JFKCYoc2ZlcCktPm9mZnNldC5pLCBvZmYpOworfQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKQotaW50IHhmc19kaXIyX3NmX2VudHNpemVfYnluYW1lKHhmc19kaXIyX3NmX3QgKnNmcCwgaW50IGxlbik7CiAjZGVmaW5lIFhGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKHNmcCxsZW4pCVwKIAl4ZnNfZGlyMl9zZl9lbnRzaXplX2J5bmFtZShzZnAsbGVuKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0RJUjJfU0ZfRU5UU0laRV9CWU5BTUUoc2ZwLGxlbikJLyogc3BhY2UgYSBuYW1lIHVzZXMgKi8gXAotCSgodWludClzaXplb2YoeGZzX2RpcjJfc2ZfZW50cnlfdCkgLSAxICsgKGxlbikgLSBcCi0JICgoc2ZwKS0+aGRyLmk4Y291bnQgPT0gMCkgKiBcCi0JICgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX2RpcjJfc2ZfZW50c2l6ZV9ieW5hbWUoeGZzX2RpcjJfc2ZfdCAqc2ZwLCBpbnQgbGVuKQoreworCXJldHVybiAoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX3NmX2VudHJ5X3QpIC0gMSArIChsZW4pIC0gXAorCQkoKHNmcCktPmhkci5pOGNvdW50ID09IDApICogXAorCQkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLSAodWludClzaXplb2YoeGZzX2RpcjJfaW5vNF90KSkpOworfQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX1NGX0VOVFNJWkVfQllFTlRSWSkKLWludCB4ZnNfZGlyMl9zZl9lbnRzaXplX2J5ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKTsKICNkZWZpbmUgWEZTX0RJUjJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmcCxzZmVwKQlcCiAJeGZzX2RpcjJfc2ZfZW50c2l6ZV9ieWVudHJ5KHNmcCxzZmVwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0RJUjJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmcCxzZmVwKQkvKiBzcGFjZSBhbiBlbnRyeSB1c2VzICovIFwKLQkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX3NmX2VudHJ5X3QpIC0gMSArIChzZmVwKS0+bmFtZWxlbiAtIFwKLQkgKChzZnApLT5oZHIuaThjb3VudCA9PSAwKSAqIFwKLQkgKCh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludAoreGZzX2RpcjJfc2ZfZW50c2l6ZV9ieWVudHJ5KHhmc19kaXIyX3NmX3QgKnNmcCwgeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCkKK3sKKwlyZXR1cm4gKCh1aW50KXNpemVvZih4ZnNfZGlyMl9zZl9lbnRyeV90KSAtIDEgKyAoc2ZlcCktPm5hbWVsZW4gLSBcCisJCSgoc2ZwKS0+aGRyLmk4Y291bnQgPT0gMCkgKiBcCisJCSgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpKSk7Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfU0ZfRklSU1RFTlRSWSkKLXhmc19kaXIyX3NmX2VudHJ5X3QgKnhmc19kaXIyX3NmX2ZpcnN0ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwKTsKICNkZWZpbmUgWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApCXhmc19kaXIyX3NmX2ZpcnN0ZW50cnkoc2ZwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApCS8qIGZpcnN0IGVudHJ5IGluIHN0cnVjdCAqLyBcCi0JKCh4ZnNfZGlyMl9zZl9lbnRyeV90ICopIFwKLQkgKChjaGFyICopKHNmcCkgKyBYRlNfRElSMl9TRl9IRFJfU0laRShzZnAtPmhkci5pOGNvdW50KSkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfc2ZfZW50cnlfdCAqeGZzX2RpcjJfc2ZfZmlyc3RlbnRyeSh4ZnNfZGlyMl9zZl90ICpzZnApCit7CisJcmV0dXJuICgoeGZzX2RpcjJfc2ZfZW50cnlfdCAqKSBcCisJCSgoY2hhciAqKShzZnApICsgWEZTX0RJUjJfU0ZfSERSX1NJWkUoc2ZwLT5oZHIuaThjb3VudCkpKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9ORVhURU5UUlkpCi14ZnNfZGlyMl9zZl9lbnRyeV90ICp4ZnNfZGlyMl9zZl9uZXh0ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwLAotCQkJCQkgICB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKTsKLSNkZWZpbmUgWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCxzZmVwKQkJeGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHNmcCxzZmVwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCxzZmVwKQkJLyogbmV4dCBlbnRyeSBpbiBzdHJ1Y3QgKi8gXAotCSgoeGZzX2RpcjJfc2ZfZW50cnlfdCAqKSBcCi0JCSgoY2hhciAqKShzZmVwKSArIFhGU19ESVIyX1NGX0VOVFNJWkVfQllFTlRSWShzZnAsc2ZlcCkpKQotI2VuZGlmCisjZGVmaW5lIFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsc2ZlcCkJeGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHNmcCxzZmVwKQorc3RhdGljIGlubGluZSB4ZnNfZGlyMl9zZl9lbnRyeV90ICoKK3hmc19kaXIyX3NmX25leHRlbnRyeSh4ZnNfZGlyMl9zZl90ICpzZnAsIHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXApCit7CisJcmV0dXJuICgoeGZzX2RpcjJfc2ZfZW50cnlfdCAqKSBcCisJCSgoY2hhciAqKShzZmVwKSArIFhGU19ESVIyX1NGX0VOVFNJWkVfQllFTlRSWShzZnAsc2ZlcCkpKTsKK30KIAogLyoKICAqIEZ1bmN0aW9ucy4KICAqLwotCi1leHRlcm4gaW50Ci0JeGZzX2RpcjJfYmxvY2tfc2ZzaXplKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAotCQkJICAgICAgc3RydWN0IHhmc19kaXIyX2Jsb2NrICpibG9jaywKLQkJCSAgICAgIHhmc19kaXIyX3NmX2hkcl90ICpzZmhwKTsKLQotZXh0ZXJuIGludAotCXhmc19kaXIyX2Jsb2NrX3RvX3NmKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCi0JCQkgICAgIGludCBzaXplLCB4ZnNfZGlyMl9zZl9oZHJfdCAqc2ZocCk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9zZl9hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9zZl9jcmVhdGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfaW5vX3QgcGlubyk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9zZl9nZXRkZW50cyhzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHVpbyAqdWlvLCBpbnQgKmVvZnAsCi0JCQkgICAgIHN0cnVjdCB4ZnNfZGlyZW50ICpkYnAsIHhmc19kaXIyX3B1dF90IHB1dCk7Ci0KLWV4dGVybiBpbnQKLQl4ZnNfZGlyMl9zZl9sb29rdXAoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLQotZXh0ZXJuIGludAotCXhmc19kaXIyX3NmX3JlbW92ZW5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLQotZXh0ZXJuIGludAotCXhmc19kaXIyX3NmX3JlcGxhY2Uoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfYmxvY2tfc2ZzaXplKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCSBzdHJ1Y3QgeGZzX2RpcjJfYmxvY2sgKmJsb2NrLAorCQkJCSB4ZnNfZGlyMl9zZl9oZHJfdCAqc2ZocCk7CitleHRlcm4gaW50IHhmc19kaXIyX2Jsb2NrX3RvX3NmKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCQkJaW50IHNpemUsIHhmc19kaXIyX3NmX2hkcl90ICpzZmhwKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfc2ZfYWRkbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9zZl9jcmVhdGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfaW5vX3QgcGlubyk7CitleHRlcm4gaW50IHhmc19kaXIyX3NmX2dldGRlbnRzKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgdWlvICp1aW8sCisJCQkJaW50ICplb2ZwLCBzdHJ1Y3QgeGZzX2RpcmVudCAqZGJwLAorCQkJCXhmc19kaXIyX3B1dF90IHB1dCk7CitleHRlcm4gaW50IHhmc19kaXIyX3NmX2xvb2t1cChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9zZl9yZW1vdmVuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX3NmX3JlcGxhY2Uoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKIAogI2VuZGlmCS8qIF9fWEZTX0RJUjJfU0ZfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfdHJhY2UuYyBiL2ZzL3hmcy94ZnNfZGlyMl90cmFjZS5jCmluZGV4IDlkNjQxNzMuLmM2MjY5NDMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMl90cmFjZS5jCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl90cmFjZS5jCkBAIC0xLDUyICsxLDMzIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KLSAqLwotCi0vKgotICogeGZzX2RpcjJfdHJhY2UuYwotICogVHJhY2luZyBmb3IgeGZzIHYyIGRpcmVjdG9yaWVzLgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2luY2x1ZGUgInhmcy5oIgotCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCiAjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCi0jaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfdHJhY2UuaCIKIAogI2lmZGVmIFhGU19ESVIyX1RSQUNFCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfdHJhY2UuaCBiL2ZzL3hmcy94ZnNfZGlyMl90cmFjZS5oCmluZGV4IDBhMTc4YmYuLmNhM2M3NTQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMl90cmFjZS5oCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl90cmFjZS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19ESVIyX1RSQUNFX0hfXwogI2RlZmluZSBfX1hGU19ESVIyX1RSQUNFX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXJfbGVhZi5jIGIvZnMveGZzL3hmc19kaXJfbGVhZi5jCmluZGV4IGMyZWE2MTcuLjk1MGRmMzFlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rpcl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19kaXJfbGVhZi5jCkBAIC0xLDY2ICsxLDQ0IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQotLyoKLSAqIHhmc19kaXJfbGVhZi5jCi0gKgotICogR1JPVDogZmlndXJlIG91dCBob3cgdG8gcmVjb3ZlciBncmFjZWZ1bGx5IHdoZW4gYm1hcCByZXR1cm5zIEVOT1NQQy4KLSAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgotI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogCkBAIC01MDgsNyArNDg2LDcgQEAKIAkvKgogCSAqIFNvcnQgdGhlIGVudHJpZXMgb24gaGFzaCB0aGVuIGVudG5vLgogCSAqLwotCXFzb3J0KHNidWYsIG5zYnVmLCBzaXplb2YoKnNidWYpLCB4ZnNfZGlyX3Nob3J0Zm9ybV9jb21wYXJlKTsKKwl4ZnNfc29ydChzYnVmLCBuc2J1Ziwgc2l6ZW9mKCpzYnVmKSwgeGZzX2Rpcl9zaG9ydGZvcm1fY29tcGFyZSk7CiAJLyoKIAkgKiBTdHVmZiBpbiBsYXN0IGVudHJ5LgogCSAqLwpAQCAtNjUwLDcgKzYyOCw3IEBACiAJeGZzX2Rpcl9sZWFmX25hbWVfdCAqbmFtZXN0OwogCXhmc19kYV9hcmdzX3QgYXJnczsKIAl4ZnNfaW5vZGVfdCAqZHA7Ci0JeGZzX2lub190IHBhcmVudDsKKwl4ZnNfaW5vX3QgcGFyZW50ID0gMDsKIAljaGFyICp0bXBidWZmZXI7CiAJaW50IHJldHZhbCwgaTsKIAl4ZnNfZGFidWZfdCAqYnA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpcl9sZWFmLmggYi9mcy94ZnMveGZzX2Rpcl9sZWFmLmgKaW5kZXggNDgwYmZmYy4uYWI2YjA5ZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXJfbGVhZi5oCisrKyBiL2ZzL3hmcy94ZnNfZGlyX2xlYWYuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0RJUl9MRUFGX0hfXwogI2RlZmluZQlfX1hGU19ESVJfTEVBRl9IX18KQEAgLTE1MiwzMCArMTM4LDI2IEBACiAJc3RydWN0IHVpbwkqdWlvOwkJLyogdWlvIGNvbnRyb2wgc3RydWN0dXJlICovCiB9IHhmc19kaXJfcHV0X2FyZ3NfdDsKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUpCi1pbnQgeGZzX2Rpcl9sZWFmX2VudHNpemVfYnluYW1lKGludCBsZW4pOwogI2RlZmluZSBYRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUobGVuKQl4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieW5hbWUobGVuKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllOQU1FKGxlbikJLyogc3BhY2UgYSBuYW1lIHdpbGwgdXNlICovIFwKLQkoKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpLTEgKyBsZW4pCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllFTlRSWSkKLWludCB4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieWVudHJ5KHhmc19kaXJfbGVhZl9lbnRyeV90ICplbnRyeSk7CitzdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieW5hbWUoaW50IGxlbikKK3sKKwlyZXR1cm4gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpLTEgKyBsZW47Cit9CisKICNkZWZpbmUgWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllFTlRSWShlbnRyeSkJXAogCXhmc19kaXJfbGVhZl9lbnRzaXplX2J5ZW50cnkoZW50cnkpCi0jZWxzZQotI2RlZmluZSBYRlNfRElSX0xFQUZfRU5UU0laRV9CWUVOVFJZKGVudHJ5KQkvKiBzcGFjZSBhbiBlbnRyeSB3aWxsIHVzZSAqLyBcCi0JKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KS0xICsgKGVudHJ5KS0+bmFtZWxlbikKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSX0xFQUZfTkFNRVNUUlVDVCkKLXhmc19kaXJfbGVhZl9uYW1lX3QgKgoteGZzX2Rpcl9sZWFmX25hbWVzdHJ1Y3QoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBvZmZzZXQpOworc3RhdGljIGlubGluZSBpbnQgeGZzX2Rpcl9sZWFmX2VudHNpemVfYnllbnRyeSh4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnkpCit7CisJcmV0dXJuICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KS0xICsgKGVudHJ5KS0+bmFtZWxlbjsKK30KKwogI2RlZmluZSBYRlNfRElSX0xFQUZfTkFNRVNUUlVDVChsZWFmcCxvZmZzZXQpCVwKIAl4ZnNfZGlyX2xlYWZfbmFtZXN0cnVjdChsZWFmcCxvZmZzZXQpCi0jZWxzZQotI2RlZmluZSBYRlNfRElSX0xFQUZfTkFNRVNUUlVDVChsZWFmcCxvZmZzZXQpCS8qIHBvaW50IHRvIG5hbWUgc3RydWN0ICovIFwKLQkoKHhmc19kaXJfbGVhZl9uYW1lX3QgKikmKChjaGFyICopKGxlYWZwKSlbb2Zmc2V0XSkKLSNlbmRpZgorc3RhdGljIGlubGluZSB4ZnNfZGlyX2xlYWZfbmFtZV90ICoKK3hmc19kaXJfbGVhZl9uYW1lc3RydWN0KHhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiAoeGZzX2Rpcl9sZWFmX25hbWVfdCAqKSYoKGNoYXIgKikobGVhZnApKVtvZmZzZXRdOworfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGtlcm5lbC4KQEAgLTE5MCw3ICsxNzIsNyBAQAogaW50IHhmc19kaXJfc2hvcnRmb3JtX3RvX2xlYWYoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKIGludCB4ZnNfZGlyX3Nob3J0Zm9ybV9yZW1vdmVuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CiBpbnQgeGZzX2Rpcl9zaG9ydGZvcm1fZ2V0ZGVudHMoc3RydWN0IHhmc19pbm9kZSAqZHAsIHN0cnVjdCB1aW8gKnVpbywgaW50ICplb2ZwLAotCQkJCSAgICAgIHN0cnVjdCB4ZnNfZGlyZW50ICpkYnAsIHhmc19kaXJfcHV0X3QgcHV0KTsKKwkJCSAgICAgICBzdHJ1Y3QgeGZzX2RpcmVudCAqZGJwLCB4ZnNfZGlyX3B1dF90IHB1dCk7CiBpbnQgeGZzX2Rpcl9zaG9ydGZvcm1fcmVwbGFjZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwogCiAvKgpAQCAtMjM3LDcgKzIxOSw2IEBACiBpbnQJeGZzX2Rpcl9wdXRfZGlyZW50NjRfdWlvKHhmc19kaXJfcHV0X2FyZ3NfdCAqcGEpOwogaW50CXhmc19kaXJfaW5vX3ZhbGlkYXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfaW5vX3QgaW5vKTsKIAotCiAvKgogICogR2xvYmFsIGRhdGEuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyX3NmLmggYi9mcy94ZnMveGZzX2Rpcl9zZi5oCmluZGV4IGE2MWJjZmMuLmZlNDRjNmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyX3NmLmgKKysrIGIvZnMveGZzL3hmc19kaXJfc2YuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfRElSX1NGX0hfXwogI2RlZmluZQlfX1hGU19ESVJfU0ZfSF9fCkBAIC03Niw0OSArNjIsNDQgQEAKIAljaGFyCQkqbmFtZTsJCS8qIG5hbWUgdmFsdWUsIHBvaW50ZXIgaW50byBidWZmZXIgKi8KIH0geGZzX2Rpcl9zZl9zb3J0X3Q7CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9TRl9HRVRfRElSSU5PKQotdm9pZCB4ZnNfZGlyX3NmX2dldF9kaXJpbm8oeGZzX2Rpcl9pbm9fdCAqZnJvbSwgeGZzX2lub190ICp0byk7Ci0jZGVmaW5lCVhGU19ESVJfU0ZfR0VUX0RJUklOTyhmcm9tLHRvKQkJICAgIHhmc19kaXJfc2ZfZ2V0X2Rpcmlubyhmcm9tLCB0bykKLSNlbHNlCi0jZGVmaW5lCVhGU19ESVJfU0ZfR0VUX0RJUklOTyhmcm9tLHRvKQkJICAgICgqKHRvKSA9IFhGU19HRVRfRElSX0lOTzgoKmZyb20pKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVJfU0ZfUFVUX0RJUklOTykKLXZvaWQgeGZzX2Rpcl9zZl9wdXRfZGlyaW5vKHhmc19pbm9fdCAqZnJvbSwgeGZzX2Rpcl9pbm9fdCAqdG8pOwotI2RlZmluZQlYRlNfRElSX1NGX1BVVF9ESVJJTk8oZnJvbSx0bykgICAgeGZzX2Rpcl9zZl9wdXRfZGlyaW5vKGZyb20sIHRvKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0RJUl9TRl9QVVRfRElSSU5PKGZyb20sdG8pICAgIFhGU19QVVRfRElSX0lOTzgoKihmcm9tKSwgKih0bykpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9TRl9FTlRTSVpFX0JZTkFNRSkKLWludCB4ZnNfZGlyX3NmX2VudHNpemVfYnluYW1lKGludCBsZW4pOwotI2RlZmluZSBYRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKGxlbikJCXhmc19kaXJfc2ZfZW50c2l6ZV9ieW5hbWUobGVuKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0RJUl9TRl9FTlRTSVpFX0JZTkFNRShsZW4pCQkvKiBzcGFjZSBhIG5hbWUgdXNlcyAqLyBcCi0JKCh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2VudHJ5X3QpLTEgKyAobGVuKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWSkKLWludCB4ZnNfZGlyX3NmX2VudHNpemVfYnllbnRyeSh4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZXApOworI2RlZmluZQlYRlNfRElSX1NGX0dFVF9ESVJJTk8oZnJvbSx0bykJeGZzX2Rpcl9zZl9nZXRfZGlyaW5vKGZyb20sIHRvKQorc3RhdGljIGlubGluZSB2b2lkIHhmc19kaXJfc2ZfZ2V0X2Rpcmlubyh4ZnNfZGlyX2lub190ICpmcm9tLCB4ZnNfaW5vX3QgKnRvKQoreworCSoodG8pID0gWEZTX0dFVF9ESVJfSU5POCgqZnJvbSk7Cit9CisKKyNkZWZpbmUJWEZTX0RJUl9TRl9QVVRfRElSSU5PKGZyb20sdG8pCXhmc19kaXJfc2ZfcHV0X2Rpcmlubyhmcm9tLCB0bykKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfZGlyX3NmX3B1dF9kaXJpbm8oeGZzX2lub190ICpmcm9tLCB4ZnNfZGlyX2lub190ICp0bykKK3sKKwlYRlNfUFVUX0RJUl9JTk84KCooZnJvbSksICoodG8pKTsKK30KKworI2RlZmluZSBYRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKGxlbikJeGZzX2Rpcl9zZl9lbnRzaXplX2J5bmFtZShsZW4pCitzdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyX3NmX2VudHNpemVfYnluYW1lKGludCBsZW4pCit7CisJcmV0dXJuICh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2VudHJ5X3QpLTEgKyAobGVuKTsKK30KKwogI2RlZmluZSBYRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWShzZmVwKQl4ZnNfZGlyX3NmX2VudHNpemVfYnllbnRyeShzZmVwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0RJUl9TRl9FTlRTSVpFX0JZRU5UUlkoc2ZlcCkJLyogc3BhY2UgYW4gZW50cnkgdXNlcyAqLyBcCi0JKCh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2VudHJ5X3QpLTEgKyAoc2ZlcCktPm5hbWVsZW4pCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9TRl9ORVhURU5UUlkpCi14ZnNfZGlyX3NmX2VudHJ5X3QgKnhmc19kaXJfc2ZfbmV4dGVudHJ5KHhmc19kaXJfc2ZfZW50cnlfdCAqc2ZlcCk7CitzdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyX3NmX2VudHNpemVfYnllbnRyeSh4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZXApCit7CisJcmV0dXJuICh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2VudHJ5X3QpLTEgKyAoc2ZlcCktPm5hbWVsZW47Cit9CisKICNkZWZpbmUgWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlcCkJCXhmc19kaXJfc2ZfbmV4dGVudHJ5KHNmZXApCi0jZWxzZQotI2RlZmluZSBYRlNfRElSX1NGX05FWFRFTlRSWShzZmVwKQkJLyogbmV4dCBlbnRyeSBpbiBzdHJ1Y3QgKi8gXAotCSgoeGZzX2Rpcl9zZl9lbnRyeV90ICopIFwKLQkJKChjaGFyICopKHNmZXApICsgWEZTX0RJUl9TRl9FTlRTSVpFX0JZRU5UUlkoc2ZlcCkpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVJfU0ZfQUxMRklUKQotaW50IHhmc19kaXJfc2ZfYWxsZml0KGludCBjb3VudCwgaW50IHRvdGFsbGVuKTsKK3N0YXRpYyBpbmxpbmUgeGZzX2Rpcl9zZl9lbnRyeV90ICp4ZnNfZGlyX3NmX25leHRlbnRyeSh4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZXApCit7CisJcmV0dXJuICh4ZnNfZGlyX3NmX2VudHJ5X3QgKikgXAorCQkoKGNoYXIgKikoc2ZlcCkgKyBYRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWShzZmVwKSk7Cit9CisKICNkZWZpbmUgWEZTX0RJUl9TRl9BTExGSVQoY291bnQsdG90YWxsZW4pCVwKIAl4ZnNfZGlyX3NmX2FsbGZpdChjb3VudCx0b3RhbGxlbikKLSNlbHNlCi0jZGVmaW5lIFhGU19ESVJfU0ZfQUxMRklUKGNvdW50LHRvdGFsbGVuKQkvKiB3aWxsIGFsbCBlbnRyaWVzIGZpdD8gKi8gXAotCSgodWludClzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkgKyBcCi0JICAgICAgICgodWludClzaXplb2YoeGZzX2Rpcl9zZl9lbnRyeV90KS0xKSooY291bnQpICsgKHRvdGFsbGVuKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX2Rpcl9zZl9hbGxmaXQoaW50IGNvdW50LCBpbnQgdG90YWxsZW4pCit7CisJcmV0dXJuICgodWludClzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkgKyBcCisJICAgICAgICgodWludClzaXplb2YoeGZzX2Rpcl9zZl9lbnRyeV90KS0xKSooY291bnQpICsgKHRvdGFsbGVuKSk7Cit9CiAKICNpZiBkZWZpbmVkKFhGU19ESVJfVFJBQ0UpCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZG1hcGkuaCBiL2ZzL3hmcy94ZnNfZG1hcGkuaAppbmRleCAxOWU4NzI4Li41YTVjN2E2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RtYXBpLmgKKysrIGIvZnMveGZzL3hmc19kbWFwaS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0RNQVBJX0hfXwogI2RlZmluZSBfX1hGU19ETUFQSV9IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZG1vcHMuYyBiL2ZzL3hmcy94ZnNfZG1vcHMuYwppbmRleCBjZWM1NGJhLi42Mjk3OTViIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rtb3BzLmMKKysrIGIvZnMveGZzL3hmc19kbW9wcy5jCkBAIC0xLDQwICsxLDI1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpbmNsdWRlICJ4ZnMuaCIKLQotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19lcnJvci5jIGIvZnMveGZzL3hmc19lcnJvci5jCmluZGV4IGRjZDNmZGQuLmQ3YjZiNWQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXJyb3IuYworKysgYi9mcy94ZnMveGZzX2Vycm9yLmMKQEAgLTEsNTEgKzEsMzUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCi0jaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX3V0aWxzLmgiCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Vycm9yLmggYi9mcy94ZnMveGZzX2Vycm9yLmgKaW5kZXggNTJlZTJiOS4uMDZkOGE4NCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19lcnJvci5oCisrKyBiL2ZzL3hmcy94ZnNfZXJyb3IuaApAQCAtMSwzOSArMSwyNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmCV9fWEZTX0VSUk9SX0hfXwogI2RlZmluZQlfX1hGU19FUlJPUl9IX18KIAogI2RlZmluZSBwcmRldihmbXQsdGFyZyxhcmdzLi4uKSBcCi0JcHJpbnRrKCJYRlM6IGRldmljZSAlcy0gIiBmbXQgIlxuIiwgWEZTX0JVRlRBUkdfTkFNRSh0YXJnKSwgIyMgYXJncykKKwlwcmludGsoIlhGUzogZGV2aWNlICVzIC0gIiBmbXQgIlxuIiwgWEZTX0JVRlRBUkdfTkFNRSh0YXJnKSwgIyMgYXJncykKIAogI2RlZmluZSBYRlNfRVJFQ09WRVIJMQkvKiBGYWlsdXJlIHRvIHJlY292ZXIgbG9nICovCiAjZGVmaW5lIFhGU19FTE9HU1RBVAkyCS8qIEZhaWx1cmUgdG8gc3RhdCBsb2cgaW4gdXNlciBzcGFjZSAqLwpAQCAtNTQsMjQgKzQwLDEwIEBACiAKIHN0cnVjdCB4ZnNfbW91bnQ7CiAKLWV4dGVybiB2b2lkCi14ZnNfZXJyb3JfcmVwb3J0KAotCWNoYXIJCSp0YWcsCi0JaW50CQlsZXZlbCwKLQlzdHJ1Y3QgeGZzX21vdW50ICptcCwKLQljaGFyCQkqZm5hbWUsCi0JaW50CQlsaW5lbnVtLAotCWluc3RfdAkJKnJhKTsKLQotZXh0ZXJuIHZvaWQKLXhmc19jb3JydXB0aW9uX2Vycm9yKAotCWNoYXIJCSp0YWcsCi0JaW50CQlsZXZlbCwKLQlzdHJ1Y3QgeGZzX21vdW50ICptcCwKLQl2b2lkCQkqcCwKLQljaGFyCQkqZm5hbWUsCi0JaW50CQlsaW5lbnVtLAotCWluc3RfdAkJKnJhKTsKK2V4dGVybiB2b2lkIHhmc19lcnJvcl9yZXBvcnQoY2hhciAqdGFnLCBpbnQgbGV2ZWwsIHN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCQkJCWNoYXIgKmZuYW1lLCBpbnQgbGluZW51bSwgaW5zdF90ICpyYSk7CitleHRlcm4gdm9pZCB4ZnNfY29ycnVwdGlvbl9lcnJvcihjaGFyICp0YWcsIGludCBsZXZlbCwgc3RydWN0IHhmc19tb3VudCAqbXAsCisJCQkJdm9pZCAqcCwgY2hhciAqZm5hbWUsIGludCBsaW5lbnVtLCBpbnN0X3QgKnJhKTsKIAogI2RlZmluZQlYRlNfRVJST1JfUkVQT1JUKGUsIGx2bCwgbXApCVwKIAl4ZnNfZXJyb3JfcmVwb3J0KGUsIGx2bCwgbXAsIF9fRklMRV9fLCBfX0xJTkVfXywgX19yZXR1cm5fYWRkcmVzcykKQEAgLTg0LDYgKzU2LDMyIEBACiAjZGVmaW5lIFhGU19FUlJMRVZFTF9ISUdICTUKIAogLyoKKyAqIE1hY3JvcyB0byBzZXQgRUZTQ09SUlVQVEVEICYgcmV0dXJuL2JyYW5jaC4KKyAqLworI2RlZmluZQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyh4LGwpCVwKKwl7IFwKKwkJaW50IGZzX2lzX29rID0gKHgpOyBcCisJCUFTU0VSVChmc19pc19vayk7IFwKKwkJaWYgKHVubGlrZWx5KCFmc19pc19vaykpIHsgXAorCQkJWEZTX0VSUk9SX1JFUE9SVCgiWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8iLCBcCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBOVUxMKTsgXAorCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsgXAorCQkJZ290byBsOyBcCisJCX0gXAorCX0KKworI2RlZmluZQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKHgpCVwKKwl7IFwKKwkJaW50IGZzX2lzX29rID0gKHgpOyBcCisJCUFTU0VSVChmc19pc19vayk7IFwKKwkJaWYgKHVubGlrZWx5KCFmc19pc19vaykpIHsgXAorCQkJWEZTX0VSUk9SX1JFUE9SVCgiWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTiIsIFwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIE5VTEwpOyBcCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7IFwKKwkJfSBcCisJfQorCisvKgogICogZXJyb3IgaW5qZWN0aW9uIHRhZ3MgLSB0aGUgbGFiZWxzIGNhbiBiZSBhbnl0aGluZyB5b3Ugd2FudAogICogYnV0IGVhY2ggdGFnIHNob3VsZCBoYXZlIGl0cyBvd24gdW5pcXVlIG51bWJlcgogICovCkBAIC0xMzksOCArMTM3LDggQEAKICNkZWZpbmUJWEZTX1JBTkRPTV9CTUFQSUZPUk1BVAkJCQlYRlNfUkFORE9NX0RFRkFVTFQKIAogI2lmIChkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKElORFVDRV9JT19FUlJPUikpCi1leHRlcm4gaW50CXhmc19lcnJvcl90ZXN0KGludCwgaW50ICosIGNoYXIgKiwgaW50LCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwotdm9pZCB4ZnNfZXJyb3JfdGVzdF9pbml0KHZvaWQpOworZXh0ZXJuIGludCB4ZnNfZXJyb3JfdGVzdChpbnQsIGludCAqLCBjaGFyICosIGludCwgY2hhciAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIHhmc19lcnJvcl90ZXN0X2luaXQodm9pZCk7CiAKICNkZWZpbmUJWEZTX05VTV9JTkpFQ1RfRVJST1IJCQkJMTAKIApAQCAtMTU2LDEyICsxNTQsMTAgQEAKIAkJCShyZikpKQogI2VuZGlmIC8qIF9fQU5TSV9DUFBfXyAqLwogCi1pbnQJCXhmc19lcnJvcnRhZ19hZGQoaW50IGVycm9yX3RhZywgeGZzX21vdW50X3QgKm1wKTsKLWludAkJeGZzX2Vycm9ydGFnX2NsZWFyKGludCBlcnJvcl90YWcsIHhmc19tb3VudF90ICptcCk7Ci0KLWludAkJeGZzX2Vycm9ydGFnX2NsZWFyYWxsKHhmc19tb3VudF90ICptcCk7Ci1pbnQJCXhmc19lcnJvcnRhZ19jbGVhcmFsbF91bW91bnQoaW50NjRfdCBmc2lkLCBjaGFyICpmc25hbWUsCi0JCQkJCQlpbnQgbG91ZCk7CitleHRlcm4gaW50IHhmc19lcnJvcnRhZ19hZGQoaW50IGVycm9yX3RhZywgeGZzX21vdW50X3QgKm1wKTsKK2V4dGVybiBpbnQgeGZzX2Vycm9ydGFnX2NsZWFyKGludCBlcnJvcl90YWcsIHhmc19tb3VudF90ICptcCk7CitleHRlcm4gaW50IHhmc19lcnJvcnRhZ19jbGVhcmFsbCh4ZnNfbW91bnRfdCAqbXApOworZXh0ZXJuIGludCB4ZnNfZXJyb3J0YWdfY2xlYXJhbGxfdW1vdW50KGludDY0X3QgZnNpZCwgY2hhciAqZnNuYW1lLCBpbnQgbG91ZCk7CiAjZWxzZQogI2RlZmluZSBYRlNfVEVTVF9FUlJPUihleHByLCBtcCwgdGFnLCByZikJKGV4cHIpCiAjZGVmaW5lIHhmc19lcnJvcnRhZ19hZGQodGFnLCBtcCkJCShFTk9TWVMpCkBAIC0xODUsOSArMTgxLDkgQEAKIAogc3RydWN0IHhmc19tb3VudDsKIC8qIFBSSU5URkxJS0U0ICovCi12b2lkCQl4ZnNfY21uX2VycihpbnQgcGFuaWNfdGFnLCBpbnQgbGV2ZWwsIHN0cnVjdCB4ZnNfbW91bnQgKm1wLAorZXh0ZXJuIHZvaWQgeGZzX2Ntbl9lcnIoaW50IHBhbmljX3RhZywgaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwKIAkJCSAgICBjaGFyICpmbXQsIC4uLik7CiAvKiBQUklOVEZMSUtFMyAqLwotdm9pZAkJeGZzX2ZzX2Ntbl9lcnIoaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIHZvaWQgeGZzX2ZzX2Ntbl9lcnIoaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY2hhciAqZm10LCAuLi4pOwogCiAjZW5kaWYJLyogX19YRlNfRVJST1JfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYwppbmRleCBjYzdkMTQ5Li5mMTkyODJlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKQEAgLTEsNDYgKzEsMjUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgeGZzX2VmaV9sb2dfaXRlbQotICogYW5kIHhmc19lZmRfbG9nX2l0ZW0gaXRlbXMuCi0gKi8KLQogI2luY2x1ZGUgInhmcy5oIgotCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5oIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uaAppbmRleCBkNDMzYmFjLi41YmY2ODE3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5oCisrKyBiL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmCV9fWEZTX0VYVEZSRUVfSVRFTV9IX18KICNkZWZpbmUJX19YRlNfRVhURlJFRV9JVEVNX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mcy5oIGIvZnMveGZzL3hmc19mcy5oCmluZGV4IDA5NWFmMGEuLmJhMDk2ZjggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZnMuaAorKysgYi9mcy94ZnMveGZzX2ZzLmgKQEAgLTEsMzQgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMi4xIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywKLSAqIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0ZTX0hfXwogI2RlZmluZSBfX1hGU19GU19IX18KQEAgLTI1MSw2ICsyMzYsNyBAQAogI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0RJUlYyCTB4MDA4MAkvKiBkaXJlY3RvcnkgdmVyc2lvbiAyCSovCiAjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfTE9HVjIJMHgwMTAwCS8qIGxvZyBmb3JtYXQgdmVyc2lvbiAyCSovCiAjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfU0VDVE9SCTB4MDIwMAkvKiBzZWN0b3Igc2l6ZXMgPjFCQgkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0FUVFIyCTB4MDQwMAkvKiBpbmxpbmUgYXR0cmlidXRlcyByZXdvcmsgKi8KIAogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mc29wcy5jIGIvZnMveGZzL3hmc19mc29wcy5jCmluZGV4IGNhNTM1ZDYuLjdjZWFiZDAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZnNvcHMuYworKysgYi9mcy94ZnMveGZzX2Zzb3BzLmMKQEAgLTEsNjYgKzEsNTEgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2Zzb3BzLmgiCiAjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgotI2luY2x1ZGUgInhmc19ydy5oIgotI2luY2x1ZGUgInhmc19yZWZjYWNoZS5oIgogI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgogI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgotI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgogCiAvKgogICogRmlsZSBzeXN0ZW0gb3BlcmF0aW9ucwpAQCAtMTEwLDcgKzk1LDkgQEAKIAkJCShYRlNfU0JfVkVSU0lPTl9IQVNESVJWMigmbXAtPm1fc2IpID8KIAkJCQlYRlNfRlNPUF9HRU9NX0ZMQUdTX0RJUlYyIDogMCkgfAogCQkJKFhGU19TQl9WRVJTSU9OX0hBU1NFQ1RPUigmbXAtPm1fc2IpID8KLQkJCQlYRlNfRlNPUF9HRU9NX0ZMQUdTX1NFQ1RPUiA6IDApOworCQkJCVhGU19GU09QX0dFT01fRkxBR1NfU0VDVE9SIDogMCkgfAorCQkJKFhGU19TQl9WRVJTSU9OX0hBU0FUVFIyKCZtcC0+bV9zYikgPworCQkJCVhGU19GU09QX0dFT01fRkxBR1NfQVRUUjIgOiAwKTsKIAkJZ2VvLT5sb2dzZWN0c2l6ZSA9IFhGU19TQl9WRVJTSU9OX0hBU1NFQ1RPUigmbXAtPm1fc2IpID8KIAkJCQltcC0+bV9zYi5zYl9sb2dzZWN0c2l6ZSA6IEJCU0laRTsKIAkJZ2VvLT5ydHNlY3RzaXplID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplOwpAQCAtMTg0LDcgKzE3MSw3IEBACiAJCW1lbXNldCgmbXAtPm1fcGVyYWdbb2FnY291bnRdLCAwLAogCQkJKG5hZ2NvdW50IC0gb2FnY291bnQpICogc2l6ZW9mKHhmc19wZXJhZ190KSk7CiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF8zMkJJVElOT0RFUzsKLQkJbmFnaW1heCA9IHhmc19pbml0aWFsaXplX3BlcmFnKG1wLCBuYWdjb3VudCk7CisJCW5hZ2ltYXggPSB4ZnNfaW5pdGlhbGl6ZV9wZXJhZyhYRlNfTVRPVkZTKG1wKSwgbXAsIG5hZ2NvdW50KTsKIAkJdXBfd3JpdGUoJm1wLT5tX3BlcmFnbG9jayk7CiAJfQogCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfR1JPV0ZTKTsKQEAgLTIwNCwyOCArMTkxLDI2IEBACiAJCQkJICBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCk7CiAJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGJwKTsKIAkJbWVtc2V0KGFnZiwgMCwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpOwotCQlJTlRfU0VUKGFnZi0+YWdmX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQsIFhGU19BR0ZfTUFHSUMpOwotCQlJTlRfU0VUKGFnZi0+YWdmX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCwgWEZTX0FHRl9WRVJTSU9OKTsKLQkJSU5UX1NFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJULCBhZ25vKTsKKwkJYWdmLT5hZ2ZfbWFnaWNudW0gPSBjcHVfdG9fYmUzMihYRlNfQUdGX01BR0lDKTsKKwkJYWdmLT5hZ2ZfdmVyc2lvbm51bSA9IGNwdV90b19iZTMyKFhGU19BR0ZfVkVSU0lPTik7CisJCWFnZi0+YWdmX3NlcW5vID0gY3B1X3RvX2JlMzIoYWdubyk7CiAJCWlmIChhZ25vID09IG5hZ2NvdW50IC0gMSkKIAkJCWFnc2l6ZSA9CiAJCQkJbmIgLQogCQkJCShhZ25vICogKHhmc19yZnNibG9ja190KW1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKIAkJZWxzZQogCQkJYWdzaXplID0gbXAtPm1fc2Iuc2JfYWdibG9ja3M7Ci0JCUlOVF9TRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQsIGFnc2l6ZSk7Ci0JCUlOVF9TRVQoYWdmLT5hZ2Zfcm9vdHNbWEZTX0JUTlVNX0JOT2ldLCBBUkNIX0NPTlZFUlQsCi0JCQlYRlNfQk5PX0JMT0NLKG1wKSk7Ci0JCUlOVF9TRVQoYWdmLT5hZ2Zfcm9vdHNbWEZTX0JUTlVNX0NOVGldLCBBUkNIX0NPTlZFUlQsCi0JCQlYRlNfQ05UX0JMT0NLKG1wKSk7Ci0JCUlOVF9TRVQoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSwgQVJDSF9DT05WRVJULCAxKTsKLQkJSU5UX1NFVChhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldLCBBUkNIX0NPTlZFUlQsIDEpOworCQlhZ2YtPmFnZl9sZW5ndGggPSBjcHVfdG9fYmUzMihhZ3NpemUpOworCQlhZ2YtPmFnZl9yb290c1tYRlNfQlROVU1fQk5PaV0gPSBjcHVfdG9fYmUzMihYRlNfQk5PX0JMT0NLKG1wKSk7CisJCWFnZi0+YWdmX3Jvb3RzW1hGU19CVE5VTV9DTlRpXSA9IGNwdV90b19iZTMyKFhGU19DTlRfQkxPQ0sobXApKTsKKwkJYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSA9IGNwdV90b19iZTMyKDEpOworCQlhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldID0gY3B1X3RvX2JlMzIoMSk7CiAJCWFnZi0+YWdmX2ZsZmlyc3QgPSAwOwotCQlJTlRfU0VUKGFnZi0+YWdmX2ZsbGFzdCwgQVJDSF9DT05WRVJULCBYRlNfQUdGTF9TSVpFKG1wKSAtIDEpOworCQlhZ2YtPmFnZl9mbGxhc3QgPSBjcHVfdG9fYmUzMihYRlNfQUdGTF9TSVpFKG1wKSAtIDEpOwogCQlhZ2YtPmFnZl9mbGNvdW50ID0gMDsKIAkJdG1wc2l6ZSA9IGFnc2l6ZSAtIFhGU19QUkVBTExPQ19CTE9DS1MobXApOwotCQlJTlRfU0VUKGFnZi0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQsIHRtcHNpemUpOwotCQlJTlRfU0VUKGFnZi0+YWdmX2xvbmdlc3QsIEFSQ0hfQ09OVkVSVCwgdG1wc2l6ZSk7CisJCWFnZi0+YWdmX2ZyZWVibGtzID0gY3B1X3RvX2JlMzIodG1wc2l6ZSk7CisJCWFnZi0+YWdmX2xvbmdlc3QgPSBjcHVfdG9fYmUzMih0bXBzaXplKTsKIAkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CiAJCWlmIChlcnJvcikgewogCQkJZ290byBlcnJvcjA7CkBAIC0yMzgsMTkgKzIyMywxOCBAQAogCQkJCSAgWEZTX0ZTU19UT19CQihtcCwgMSksIDApOwogCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7CiAJCW1lbXNldChhZ2ksIDAsIG1wLT5tX3NiLnNiX3NlY3RzaXplKTsKLQkJSU5UX1NFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJULCBYRlNfQUdJX01BR0lDKTsKLQkJSU5UX1NFVChhZ2ktPmFnaV92ZXJzaW9ubnVtLCBBUkNIX0NPTlZFUlQsIFhGU19BR0lfVkVSU0lPTik7Ci0JCUlOVF9TRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCwgYWdubyk7Ci0JCUlOVF9TRVQoYWdpLT5hZ2lfbGVuZ3RoLCBBUkNIX0NPTlZFUlQsIGFnc2l6ZSk7CisJCWFnaS0+YWdpX21hZ2ljbnVtID0gY3B1X3RvX2JlMzIoWEZTX0FHSV9NQUdJQyk7CisJCWFnaS0+YWdpX3ZlcnNpb25udW0gPSBjcHVfdG9fYmUzMihYRlNfQUdJX1ZFUlNJT04pOworCQlhZ2ktPmFnaV9zZXFubyA9IGNwdV90b19iZTMyKGFnbm8pOworCQlhZ2ktPmFnaV9sZW5ndGggPSBjcHVfdG9fYmUzMihhZ3NpemUpOwogCQlhZ2ktPmFnaV9jb3VudCA9IDA7Ci0JCUlOVF9TRVQoYWdpLT5hZ2lfcm9vdCwgQVJDSF9DT05WRVJULCBYRlNfSUJUX0JMT0NLKG1wKSk7Ci0JCUlOVF9TRVQoYWdpLT5hZ2lfbGV2ZWwsIEFSQ0hfQ09OVkVSVCwgMSk7CisJCWFnaS0+YWdpX3Jvb3QgPSBjcHVfdG9fYmUzMihYRlNfSUJUX0JMT0NLKG1wKSk7CisJCWFnaS0+YWdpX2xldmVsID0gY3B1X3RvX2JlMzIoMSk7CiAJCWFnaS0+YWdpX2ZyZWVjb3VudCA9IDA7Ci0JCUlOVF9TRVQoYWdpLT5hZ2lfbmV3aW5vLCBBUkNIX0NPTlZFUlQsIE5VTExBR0lOTyk7Ci0JCUlOVF9TRVQoYWdpLT5hZ2lfZGlyaW5vLCBBUkNIX0NPTlZFUlQsIE5VTExBR0lOTyk7CisJCWFnaS0+YWdpX25ld2lubyA9IGNwdV90b19iZTMyKE5VTExBR0lOTyk7CisJCWFnaS0+YWdpX2RpcmlubyA9IGNwdV90b19iZTMyKE5VTExBR0lOTyk7CiAJCWZvciAoYnVja2V0ID0gMDsgYnVja2V0IDwgWEZTX0FHSV9VTkxJTktFRF9CVUNLRVRTOyBidWNrZXQrKykKLQkJCUlOVF9TRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0XSwgQVJDSF9DT05WRVJULAotCQkJCU5VTExBR0lOTyk7CisJCQlhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRdID0gY3B1X3RvX2JlMzIoTlVMTEFHSU5PKTsKIAkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CiAJCWlmIChlcnJvcikgewogCQkJZ290byBlcnJvcjA7CkBAIC0yNjMsMTcgKzI0NywxNiBAQAogCQkJQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwgMCk7CiAJCWJsb2NrID0gWEZTX0JVRl9UT19TQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7Ci0JCUlOVF9TRVQoYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19BQlRCX01BR0lDKTsKKwkJYmxvY2stPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoWEZTX0FCVEJfTUFHSUMpOwogCQlibG9jay0+YmJfbGV2ZWwgPSAwOwotCQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDEpOwotCQlJTlRfU0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKLQkJSU5UX1NFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCQlibG9jay0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KDEpOworCQlibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKKwkJYmxvY2stPmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlMzIoTlVMTEFHQkxPQ0spOwogCQlhcmVjID0gWEZTX0JUUkVFX1JFQ19BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgeGZzX2FsbG9jLAogCQkJYmxvY2ssIDEsIG1wLT5tX2FsbG9jX214clswXSk7Ci0JCUlOVF9TRVQoYXJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJULAotCQkJWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCkpOwotCQlJTlRfU0VUKGFyZWMtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCwKLQkJCWFnc2l6ZSAtIElOVF9HRVQoYXJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSk7CisJCWFyZWMtPmFyX3N0YXJ0YmxvY2sgPSBjcHVfdG9fYmUzMihYRlNfUFJFQUxMT0NfQkxPQ0tTKG1wKSk7CisJCWFyZWMtPmFyX2Jsb2NrY291bnQgPSBjcHVfdG9fYmUzMigKKwkJCWFnc2l6ZSAtIGJlMzJfdG9fY3B1KGFyZWMtPmFyX3N0YXJ0YmxvY2spKTsKIAkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CiAJCWlmIChlcnJvcikgewogCQkJZ290byBlcnJvcjA7CkBAIC0yODYsMTggKzI2OSwxNyBAQAogCQkJQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwgMCk7CiAJCWJsb2NrID0gWEZTX0JVRl9UT19TQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7Ci0JCUlOVF9TRVQoYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19BQlRDX01BR0lDKTsKKwkJYmxvY2stPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoWEZTX0FCVENfTUFHSUMpOwogCQlibG9jay0+YmJfbGV2ZWwgPSAwOwotCQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDEpOwotCQlJTlRfU0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKLQkJSU5UX1NFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCQlibG9jay0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KDEpOworCQlibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKKwkJYmxvY2stPmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlMzIoTlVMTEFHQkxPQ0spOwogCQlhcmVjID0gWEZTX0JUUkVFX1JFQ19BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgeGZzX2FsbG9jLAogCQkJYmxvY2ssIDEsIG1wLT5tX2FsbG9jX214clswXSk7Ci0JCUlOVF9TRVQoYXJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJULAotCQkJWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCkpOwotCQlJTlRfU0VUKGFyZWMtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCwKLQkJCWFnc2l6ZSAtIElOVF9HRVQoYXJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSk7Ci0JCW5mcmVlICs9IElOVF9HRVQoYXJlYy0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJYXJlYy0+YXJfc3RhcnRibG9jayA9IGNwdV90b19iZTMyKFhGU19QUkVBTExPQ19CTE9DS1MobXApKTsKKwkJYXJlYy0+YXJfYmxvY2tjb3VudCA9IGNwdV90b19iZTMyKAorCQkJYWdzaXplIC0gYmUzMl90b19jcHUoYXJlYy0+YXJfc3RhcnRibG9jaykpOworCQluZnJlZSArPSBiZTMyX3RvX2NwdShhcmVjLT5hcl9ibG9ja2NvdW50KTsKIAkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CiAJCWlmIChlcnJvcikgewogCQkJZ290byBlcnJvcjA7CkBAIC0zMTAsMTEgKzI5MiwxMSBAQAogCQkJQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwgMCk7CiAJCWJsb2NrID0gWEZTX0JVRl9UT19TQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7Ci0JCUlOVF9TRVQoYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19JQlRfTUFHSUMpOworCQlibG9jay0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfSUJUX01BR0lDKTsKIAkJYmxvY2stPmJiX2xldmVsID0gMDsKIAkJYmxvY2stPmJiX251bXJlY3MgPSAwOwotCQlJTlRfU0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKLQkJSU5UX1NFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCQlibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKKwkJYmxvY2stPmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlMzIoTlVMTEFHQkxPQ0spOwogCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlnb3RvIGVycm9yMDsKQEAgLTMzNCwxMCArMzE2LDkgQEAKIAkJfQogCQlBU1NFUlQoYnApOwogCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7Ci0JCUlOVF9NT0QoYWdpLT5hZ2lfbGVuZ3RoLCBBUkNIX0NPTlZFUlQsIG5ldyk7CisJCWJlMzJfYWRkKCZhZ2ktPmFnaV9sZW5ndGgsIG5ldyk7CiAJCUFTU0VSVChuYWdjb3VudCA9PSBvYWdjb3VudCB8fAotCQkgICAgICAgSU5UX0dFVChhZ2ktPmFnaV9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0KLQkJCQltcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJCSAgICAgICBiZTMyX3RvX2NwdShhZ2ktPmFnaV9sZW5ndGgpID09IG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKIAkJeGZzX2lhbGxvY19sb2dfYWdpKHRwLCBicCwgWEZTX0FHSV9MRU5HVEgpOwogCQkvKgogCQkgKiBDaGFuZ2UgYWdmIGxlbmd0aC4KQEAgLTM0OCwxNCArMzI5LDE0IEBACiAJCX0KIAkJQVNTRVJUKGJwKTsKIAkJYWdmID0gWEZTX0JVRl9UT19BR0YoYnApOwotCQlJTlRfTU9EKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJULCBuZXcpOwotCQlBU1NFUlQoSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0KLQkJCQlJTlRfR0VUKGFnaS0+YWdpX2xlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCWJlMzJfYWRkKCZhZ2YtPmFnZl9sZW5ndGgsIG5ldyk7CisJCUFTU0VSVChiZTMyX3RvX2NwdShhZ2YtPmFnZl9sZW5ndGgpID09CisJCSAgICAgICBiZTMyX3RvX2NwdShhZ2ktPmFnaV9sZW5ndGgpKTsKIAkJLyoKIAkJICogRnJlZSB0aGUgbmV3IHNwYWNlLgogCQkgKi8KIAkJZXJyb3IgPSB4ZnNfZnJlZV9leHRlbnQodHAsIFhGU19BR0JfVE9fRlNCKG1wLCBhZ25vLAotCQkJSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgLSBuZXcpLCBuZXcpOworCQkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKSAtIG5ldyksIG5ldyk7CiAJCWlmIChlcnJvcikgewogCQkJZ290byBlcnJvcjA7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnNvcHMuaCBiL2ZzL3hmcy94ZnNfZnNvcHMuaAppbmRleCBiNjE0ODYxLi5mMzI3MTNmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Zzb3BzLmgKKysrIGIvZnMveGZzL3hmc19mc29wcy5oCkBAIC0xLDY3ICsxLDI5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfRlNPUFNfSF9fCiAjZGVmaW5lCV9fWEZTX0ZTT1BTX0hfXwogCi1pbnQKLXhmc19mc19nZW9tZXRyeSgKLQl4ZnNfbW91bnRfdAkJKm1wLAotCXhmc19mc29wX2dlb21fdAkJKmdlbywKLQlpbnQJCQluZXdfdmVyc2lvbik7Ci0KLWludAoteGZzX2dyb3dmc19kYXRhKAotCXhmc19tb3VudF90CQkqbXAsCi0JeGZzX2dyb3dmc19kYXRhX3QJKmluKTsKLQotaW50Ci14ZnNfZ3Jvd2ZzX2xvZygKLQl4ZnNfbW91bnRfdAkJKm1wLAotCXhmc19ncm93ZnNfbG9nX3QJKmluKTsKLQotaW50Ci14ZnNfZnNfY291bnRzKAotCXhmc19tb3VudF90CQkqbXAsCi0JeGZzX2Zzb3BfY291bnRzX3QJKmNudCk7Ci0KLWludAoteGZzX3Jlc2VydmVfYmxvY2tzKAotCXhmc19tb3VudF90CQkqbXAsCi0JX191aW50NjRfdAkJKmludmFsLAotCXhmc19mc29wX3Jlc2Jsa3NfdAkqb3V0dmFsKTsKLQotaW50Ci14ZnNfZnNfZ29pbmdkb3duKAotCXhmc19tb3VudF90CQkqbXAsCi0JX191aW50MzJfdAkJaW5mbGFncyk7CitleHRlcm4gaW50IHhmc19mc19nZW9tZXRyeSh4ZnNfbW91bnRfdCAqbXAsIHhmc19mc29wX2dlb21fdCAqZ2VvLCBpbnQgbnZlcnNpb24pOworZXh0ZXJuIGludCB4ZnNfZ3Jvd2ZzX2RhdGEoeGZzX21vdW50X3QgKm1wLCB4ZnNfZ3Jvd2ZzX2RhdGFfdCAqaW4pOworZXh0ZXJuIGludCB4ZnNfZ3Jvd2ZzX2xvZyh4ZnNfbW91bnRfdCAqbXAsIHhmc19ncm93ZnNfbG9nX3QgKmluKTsKK2V4dGVybiBpbnQgeGZzX2ZzX2NvdW50cyh4ZnNfbW91bnRfdCAqbXAsIHhmc19mc29wX2NvdW50c190ICpjbnQpOworZXh0ZXJuIGludCB4ZnNfcmVzZXJ2ZV9ibG9ja3MoeGZzX21vdW50X3QgKm1wLCBfX3VpbnQ2NF90ICppbnZhbCwKKwkJCQl4ZnNfZnNvcF9yZXNibGtzX3QgKm91dHZhbCk7CitleHRlcm4gaW50IHhmc19mc19nb2luZ2Rvd24oeGZzX21vdW50X3QgKm1wLCBfX3VpbnQzMl90IGluZmxhZ3MpOwogCiAjZW5kaWYJLyogX19YRlNfRlNPUFNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvYy5jIGIvZnMveGZzL3hmc19pYWxsb2MuYwppbmRleCBjZTVmZWU5Li44ZjNmYWUxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmMKQEAgLTEsNDEgKzEsMjYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCkBAIC00MywxOCArMjgsMTcgQEAKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgpAQCAtMTk0LDggKzE3OCw4IEBACiAJICogSWRlYWxseSB0aGV5IHNob3VsZCBiZSBzcGFjZWQgb3V0IHRocm91Z2ggdGhlIGEuZy4KIAkgKiBGb3Igbm93LCBqdXN0IGFsbG9jYXRlIGJsb2NrcyB1cCBmcm9udC4KIAkgKi8KLQlhcmdzLmFnYm5vID0gSU5UX0dFVChhZ2ktPmFnaV9yb290LCBBUkNIX0NPTlZFUlQpOwotCWFyZ3MuZnNibm8gPSBYRlNfQUdCX1RPX0ZTQihhcmdzLm1wLCBJTlRfR0VUKGFnaS0+YWdpX3NlcW5vLCBBUkNIX0NPTlZFUlQpLAorCWFyZ3MuYWdibm8gPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9yb290KTsKKwlhcmdzLmZzYm5vID0gWEZTX0FHQl9UT19GU0IoYXJncy5tcCwgYmUzMl90b19jcHUoYWdpLT5hZ2lfc2Vxbm8pLAogCQkJCSAgICBhcmdzLmFnYm5vKTsKIAkvKgogCSAqIEFsbG9jYXRlIGEgZml4ZWQtc2l6ZSBleHRlbnQgb2YgaW5vZGVzLgpAQCAtMjE3LDkgKzIwMSw5IEBACiAJICovCiAJaWYgKGlzYWxpZ25lZCAmJiBhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLKSB7CiAJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87Ci0JCWFyZ3MuYWdibm8gPSBJTlRfR0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCk7CisJCWFyZ3MuYWdibm8gPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9yb290KTsKIAkJYXJncy5mc2JubyA9IFhGU19BR0JfVE9fRlNCKGFyZ3MubXAsCi0JCQkJSU5UX0dFVChhZ2ktPmFnaV9zZXFubywgQVJDSF9DT05WRVJUKSwgYXJncy5hZ2Jubyk7CisJCQkJYmUzMl90b19jcHUoYWdpLT5hZ2lfc2Vxbm8pLCBhcmdzLmFnYm5vKTsKIAkJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0FMSUdOKCZhcmdzLm1wLT5tX3NiKSAmJgogCQkJYXJncy5tcC0+bV9zYi5zYl9pbm9hbGlnbm10ID49CiAJCQlYRlNfQl9UT19GU0JUKGFyZ3MubXAsIFhGU19JTk9ERV9DTFVTVEVSX1NJWkUoYXJncy5tcCkpKQpAQCAtMjc0LDcgKzI1OCw3IEBACiAJCS8qCiAJCSAqIEdldCB0aGUgYmxvY2suCiAJCSAqLwotCQlkID0gWEZTX0FHQl9UT19EQUREUihhcmdzLm1wLCBJTlRfR0VUKGFnaS0+YWdpX3NlcW5vLCBBUkNIX0NPTlZFUlQpLAorCQlkID0gWEZTX0FHQl9UT19EQUREUihhcmdzLm1wLCBiZTMyX3RvX2NwdShhZ2ktPmFnaV9zZXFubyksCiAJCQkJICAgICBhcmdzLmFnYm5vICsgKGogKiBibGtzX3Blcl9jbHVzdGVyKSk7CiAJCWZidWYgPSB4ZnNfdHJhbnNfZ2V0X2J1Zih0cCwgYXJncy5tcC0+bV9kZGV2X3RhcmdwLCBkLAogCQkJCQkgYXJncy5tcC0+bV9ic2l6ZSAqIGJsa3NfcGVyX2NsdXN0ZXIsCkBAIC0yOTQsMTcgKzI3OCwxNyBAQAogCQl9CiAJCXhmc190cmFuc19pbm9kZV9hbGxvY19idWYodHAsIGZidWYpOwogCX0KLQlJTlRfTU9EKGFnaS0+YWdpX2NvdW50LCBBUkNIX0NPTlZFUlQsIG5ld2xlbik7Ci0JSU5UX01PRChhZ2ktPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCwgbmV3bGVuKTsKKwliZTMyX2FkZCgmYWdpLT5hZ2lfY291bnQsIG5ld2xlbik7CisJYmUzMl9hZGQoJmFnaS0+YWdpX2ZyZWVjb3VudCwgbmV3bGVuKTsKIAlkb3duX3JlYWQoJmFyZ3MubXAtPm1fcGVyYWdsb2NrKTsKLQlhcmdzLm1wLT5tX3BlcmFnW0lOVF9HRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCldLnBhZ2lfZnJlZWNvdW50ICs9IG5ld2xlbjsKKwlhcmdzLm1wLT5tX3BlcmFnW2JlMzJfdG9fY3B1KGFnaS0+YWdpX3NlcW5vKV0ucGFnaV9mcmVlY291bnQgKz0gbmV3bGVuOwogCXVwX3JlYWQoJmFyZ3MubXAtPm1fcGVyYWdsb2NrKTsKLQlJTlRfU0VUKGFnaS0+YWdpX25ld2lubywgQVJDSF9DT05WRVJULCBuZXdpbm8pOworCWFnaS0+YWdpX25ld2lubyA9IGNwdV90b19iZTMyKG5ld2lubyk7CiAJLyoKIAkgKiBJbnNlcnQgcmVjb3JkcyBkZXNjcmliaW5nIHRoZSBuZXcgaW5vZGUgY2h1bmsgaW50byB0aGUgYnRyZWUuCiAJICovCiAJY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKGFyZ3MubXAsIHRwLCBhZ2JwLAotCQkJSU5UX0dFVChhZ2ktPmFnaV9zZXFubywgQVJDSF9DT05WRVJUKSwKKwkJCWJlMzJfdG9fY3B1KGFnaS0+YWdpX3NlcW5vKSwKIAkJCVhGU19CVE5VTV9JTk8sICh4ZnNfaW5vZGVfdCAqKTAsIDApOwogCWZvciAodGhpc2lubyA9IG5ld2lubzsKIAkgICAgIHRoaXNpbm8gPCBuZXdpbm8gKyBuZXdsZW47CkBAIC01NDQsNyArNTI4LDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnYnApOwotCQlBU1NFUlQoSU5UX0dFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdJX01BR0lDKTsKKwkJQVNTRVJUKGJlMzJfdG9fY3B1KGFnaS0+YWdpX21hZ2ljbnVtKSA9PSBYRlNfQUdJX01BR0lDKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBDb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZiBiZWZvcmUuICBJbiB0aGlzIGNhc2UsIHdlCkBAIC01NTIsMTIgKzUzNiwxMiBAQAogCQkgKi8KIAkJYWdicCA9ICpJT19hZ2JwOwogCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2JwKTsKLQkJQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyk7Ci0JCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJUKSA+IDApOworCQlBU1NFUlQoYmUzMl90b19jcHUoYWdpLT5hZ2lfbWFnaWNudW0pID09IFhGU19BR0lfTUFHSUMpOworCQlBU1NFUlQoYmUzMl90b19jcHUoYWdpLT5hZ2lfZnJlZWNvdW50KSA+IDApOwogCX0KIAltcCA9IHRwLT50X21vdW50cDsKIAlhZ2NvdW50ID0gbXAtPm1fc2Iuc2JfYWdjb3VudDsKLQlhZ25vID0gSU5UX0dFVChhZ2ktPmFnaV9zZXFubywgQVJDSF9DT05WRVJUKTsKKwlhZ25vID0gYmUzMl90b19jcHUoYWdpLT5hZ2lfc2Vxbm8pOwogCXRhZ25vID0gYWdubzsKIAlwYWdubyA9IFhGU19JTk9fVE9fQUdOTyhtcCwgcGFyZW50KTsKIAlwYWdpbm8gPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBwYXJlbnQpOwpAQCAtNjA1LDcgKzU4OSw3IEBACiAJCQkJICogY2FuIGNvbW1pdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBhbmQgY2FsbAogCQkJCSAqIHVzIGFnYWluIHdoZXJlIHdlIGxlZnQgb2ZmLgogCQkJCSAqLwotCQkJCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJUKSA+IDApOworCQkJCUFTU0VSVChiZTMyX3RvX2NwdShhZ2ktPmFnaV9mcmVlY291bnQpID4gMCk7CiAJCQkJKmFsbG9jX2RvbmUgPSBCX1RSVUU7CiAJCQkJKklPX2FnYnAgPSBhZ2JwOwogCQkJCSppbm9wID0gTlVMTEZTSU5POwpAQCAtNjM2LDcgKzYyMCw3IEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gbmV4dGFnOwogCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2JwKTsKLQkJQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyk7CisJCUFTU0VSVChiZTMyX3RvX2NwdShhZ2ktPmFnaV9tYWdpY251bSkgPT0gWEZTX0FHSV9NQUdJQyk7CiAJfQogCS8qCiAJICogSGVyZSB3aXRoIGFuIGFsbG9jYXRpb24gZ3JvdXAgdGhhdCBoYXMgYSBmcmVlIGlub2RlLgpAQCAtNjQ1LDE0ICs2MjksMTQgQEAKIAkgKi8KIAlhZ25vID0gdGFnbm87CiAJKklPX2FnYnAgPSBOVUxMOwotCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIElOVF9HRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksCisJY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKG1wLCB0cCwgYWdicCwgYmUzMl90b19jcHUoYWdpLT5hZ2lfc2Vxbm8pLAogCQkJCSAgICBYRlNfQlROVU1fSU5PLCAoeGZzX2lub2RlX3QgKikwLCAwKTsKIAkvKgogCSAqIElmIHBhZ2lubyBpcyAwICh0aGlzIGlzIHRoZSByb290IGlub2RlIGFsbG9jYXRpb24pIHVzZSBuZXdpbm8uCiAJICogVGhpcyBtdXN0IHdvcmsgYmVjYXVzZSB3ZSd2ZSBqdXN0IGFsbG9jYXRlZCBzb21lLgogCSAqLwogCWlmICghcGFnaW5vKQotCQlwYWdpbm8gPSBJTlRfR0VUKGFnaS0+YWdpX25ld2lubywgQVJDSF9DT05WRVJUKTsKKwkJcGFnaW5vID0gYmUzMl90b19jcHUoYWdpLT5hZ2lfbmV3aW5vKTsKICNpZmRlZiBERUJVRwogCWlmIChjdXItPmJjX25sZXZlbHMgPT0gMSkgewogCQlpbnQJZnJlZWNvdW50ID0gMDsKQEAgLTY3MCw3ICs2NTQsNyBAQAogCQkJCWdvdG8gZXJyb3IwOwogCQl9IHdoaWxlIChpID09IDEpOwogCi0JCUFTU0VSVChmcmVlY291bnQgPT0gSU5UX0dFVChhZ2ktPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwKKwkJQVNTRVJUKGZyZWVjb3VudCA9PSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9mcmVlY291bnQpIHx8CiAJCSAgICAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CiAJfQogI2VuZGlmCkBAIC04MjksOSArODEzLDkgQEAKIAkgKiBJbiBhIGRpZmZlcmVudCBhLmcuIGZyb20gdGhlIHBhcmVudC4KIAkgKiBTZWUgaWYgdGhlIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2NrIGhhcyBhbnkgZnJlZS4KIAkgKi8KLQllbHNlIGlmIChJTlRfR0VUKGFnaS0+YWdpX25ld2lubywgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdJTk8pIHsKKwllbHNlIGlmIChiZTMyX3RvX2NwdShhZ2ktPmFnaV9uZXdpbm8pICE9IE5VTExBR0lOTykgewogCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xvb2t1cF9lcShjdXIsCi0JCQkJSU5UX0dFVChhZ2ktPmFnaV9uZXdpbm8sIEFSQ0hfQ09OVkVSVCksIDAsIDAsICZpKSkpCisJCQkJYmUzMl90b19jcHUoYWdpLT5hZ2lfbmV3aW5vKSwgMCwgMCwgJmkpKSkKIAkJCWdvdG8gZXJyb3IwOwogCQlpZiAoaSA9PSAxICYmCiAJCSAgICAoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZyZWMuaXJfc3RhcnRpbm8sCkBAIC04NzgsNyArODYyLDcgQEAKIAlpZiAoKGVycm9yID0geGZzX2lub2J0X3VwZGF0ZShjdXIsIHJlYy5pcl9zdGFydGlubywgcmVjLmlyX2ZyZWVjb3VudCwKIAkJCXJlYy5pcl9mcmVlKSkpCiAJCWdvdG8gZXJyb3IwOwotCUlOVF9NT0QoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwliZTMyX2FkZCgmYWdpLT5hZ2lfZnJlZWNvdW50LCAtMSk7CiAJeGZzX2lhbGxvY19sb2dfYWdpKHRwLCBhZ2JwLCBYRlNfQUdJX0ZSRUVDT1VOVCk7CiAJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOwogCW1wLT5tX3BlcmFnW3RhZ25vXS5wYWdpX2ZyZWVjb3VudC0tOwpAQCAtODk4LDcgKzg4Miw3IEBACiAJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCiAJCQkJZ290byBlcnJvcjA7CiAJCX0gd2hpbGUgKGkgPT0gMSk7Ci0JCUFTU0VSVChmcmVlY291bnQgPT0gSU5UX0dFVChhZ2ktPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwKKwkJQVNTRVJUKGZyZWVjb3VudCA9PSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9mcmVlY291bnQpIHx8CiAJCSAgICAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CiAJfQogI2VuZGlmCkBAIC05NTcsOCArOTQxLDExIEBACiAJYWdpbm8gPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpbm9kZSk7CiAJaWYgKGlub2RlICE9IFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSkgIHsKIAkJY21uX2VycihDRV9XQVJOLAotCQkJInhmc19kaWZyZWU6IGlub2RlICE9IFhGU19BR0lOT19UT19JTk8oKSAoJWQgIT0gJWQpIG9uICVzLiAgUmV0dXJuaW5nIEVJTlZBTC4iLAotCQkJaW5vZGUsIFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSwgbXAtPm1fZnNuYW1lKTsKKwkJCSJ4ZnNfZGlmcmVlOiBpbm9kZSAhPSBYRlNfQUdJTk9fVE9fSU5PKCkgIgorCQkJIiglbGx1ICE9ICVsbHUpIG9uICVzLiAgUmV0dXJuaW5nIEVJTlZBTC4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpbm9kZSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pLAorCQkJbXAtPm1fZnNuYW1lKTsKIAkJQVNTRVJUKDApOwogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAJfQpAQCAtOTgzLDggKzk3MCw4IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7Ci0JQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyk7Ci0JQVNTRVJUKGFnYm5vIDwgSU5UX0dFVChhZ2ktPmFnaV9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChiZTMyX3RvX2NwdShhZ2ktPmFnaV9tYWdpY251bSkgPT0gWEZTX0FHSV9NQUdJQyk7CisJQVNTRVJUKGFnYm5vIDwgYmUzMl90b19jcHUoYWdpLT5hZ2lfbGVuZ3RoKSk7CiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBjdXJzb3IuCiAJICovCkBAIC0xMDA2LDcgKzk5Myw3IEBACiAJCQkJCWdvdG8gZXJyb3IwOwogCQkJfQogCQl9IHdoaWxlIChpID09IDEpOwotCQlBU1NFUlQoZnJlZWNvdW50ID09IElOVF9HRVQoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJCUFTU0VSVChmcmVlY291bnQgPT0gYmUzMl90b19jcHUoYWdpLT5hZ2lfZnJlZWNvdW50KSB8fAogCQkgICAgICAgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOwogCX0KICNlbmRpZgpAQCAtMTA1NSw4ICsxMDQyLDggQEAKIAkJICogdG8gYmUgZnJlZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLgogCQkgKi8KIAkJaWxlbiA9IFhGU19JQUxMT0NfSU5PREVTKG1wKTsKLQkJSU5UX01PRChhZ2ktPmFnaV9jb3VudCwgQVJDSF9DT05WRVJULCAtaWxlbik7Ci0JCUlOVF9NT0QoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsIC0oaWxlbiAtIDEpKTsKKwkJYmUzMl9hZGQoJmFnaS0+YWdpX2NvdW50LCAtaWxlbik7CisJCWJlMzJfYWRkKCZhZ2ktPmFnaV9mcmVlY291bnQsIC0oaWxlbiAtIDEpKTsKIAkJeGZzX2lhbGxvY19sb2dfYWdpKHRwLCBhZ2JwLCBYRlNfQUdJX0NPVU5UIHwgWEZTX0FHSV9GUkVFQ09VTlQpOwogCQlkb3duX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CiAJCW1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2lfZnJlZWNvdW50IC09IGlsZW4gLSAxOwpAQCAtMTA4NSw3ICsxMDcyLDcgQEAKIAkJLyogCiAJCSAqIENoYW5nZSB0aGUgaW5vZGUgZnJlZSBjb3VudHMgYW5kIGxvZyB0aGUgYWcvc2IgY2hhbmdlcy4KIAkJICovCi0JCUlOVF9NT0QoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsIDEpOworCQliZTMyX2FkZCgmYWdpLT5hZ2lfZnJlZWNvdW50LCAxKTsKIAkJeGZzX2lhbGxvY19sb2dfYWdpKHRwLCBhZ2JwLCBYRlNfQUdJX0ZSRUVDT1VOVCk7CiAJCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKIAkJbXAtPm1fcGVyYWdbYWdub10ucGFnaV9mcmVlY291bnQrKzsKQEAgLTExMTEsNyArMTA5OCw3IEBACiAJCQkJCWdvdG8gZXJyb3IwOwogCQkJfQogCQl9IHdoaWxlIChpID09IDEpOwotCQlBU1NFUlQoZnJlZWNvdW50ID09IElOVF9HRVQoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJCUFTU0VSVChmcmVlY291bnQgPT0gYmUzMl90b19jcHUoYWdpLT5hZ2lfZnJlZWNvdW50KSB8fAogCQkgICAgICAgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOwogCX0KICNlbmRpZgpAQCAtMTMyMCw3ICsxMzA3LDcgQEAKIAl4ZnNfYWdpX3QJCSphZ2k7CS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyICovCiAKIAlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7Ci0JQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyk7CisJQVNTRVJUKGJlMzJfdG9fY3B1KGFnaS0+YWdpX21hZ2ljbnVtKSA9PSBYRlNfQUdJX01BR0lDKTsKICNlbmRpZgogCS8qCiAJICogQ29tcHV0ZSBieXRlIG9mZnNldHMgZm9yIHRoZSBmaXJzdCBhbmQgbGFzdCBmaWVsZHMuCkBAIC0xMzYyLDkgKzEzNDksOCBAQAogCSAqLwogCWFnaSA9IFhGU19CVUZfVE9fQUdJKGJwKTsKIAlhZ2lfb2sgPQotCQlJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0lfTUFHSUMgJiYKLQkJWEZTX0FHSV9HT09EX1ZFUlNJT04oCi0JCQlJTlRfR0VUKGFnaS0+YWdpX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCkpOworCQliZTMyX3RvX2NwdShhZ2ktPmFnaV9tYWdpY251bSkgPT0gWEZTX0FHSV9NQUdJQyAmJgorCQlYRlNfQUdJX0dPT0RfVkVSU0lPTihiZTMyX3RvX2NwdShhZ2ktPmFnaV92ZXJzaW9ubnVtKSk7CiAJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFhZ2lfb2ssIG1wLCBYRlNfRVJSVEFHX0lBTExPQ19SRUFEX0FHSSwKIAkJCVhGU19SQU5ET01fSUFMTE9DX1JFQURfQUdJKSkpIHsKIAkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pYWxsb2NfcmVhZF9hZ2kiLCBYRlNfRVJSTEVWRUxfTE9XLApAQCAtMTM3NCwxNiArMTM2MCwxNSBAQAogCX0KIAlwYWcgPSAmbXAtPm1fcGVyYWdbYWdub107CiAJaWYgKCFwYWctPnBhZ2lfaW5pdCkgewotCQlwYWctPnBhZ2lfZnJlZWNvdW50ID0gSU5UX0dFVChhZ2ktPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCXBhZy0+cGFnaV9mcmVlY291bnQgPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9mcmVlY291bnQpOwogCQlwYWctPnBhZ2lfaW5pdCA9IDE7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogSXQncyBwb3NzaWJsZSBmb3IgdGhlc2UgdG8gYmUgb3V0IG9mIHN5bmMgaWYKIAkJICogd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBmb3JjZWQgc2h1dGRvd24uCiAJCSAqLwotCQlBU1NFUlQocGFnLT5wYWdpX2ZyZWVjb3VudCA9PQotCQkJCUlOVF9HRVQoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpCi0JCQl8fCBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJCUFTU0VSVChwYWctPnBhZ2lfZnJlZWNvdW50ID09IGJlMzJfdG9fY3B1KGFnaS0+YWdpX2ZyZWVjb3VudCkgfHwKKwkJCVhGU19GT1JDRURfU0hVVERPV04obXApKTsKIAl9CiAKICNpZmRlZiBERUJVRwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pYWxsb2MuaCBiL2ZzL3hmcy94ZnNfaWFsbG9jLmgKaW5kZXggZGI2ZDAwMS4uN2Y1ZGViZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pYWxsb2MuaAorKysgYi9mcy94ZnMveGZzX2lhbGxvYy5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19JQUxMT0NfSF9fCiAjZGVmaW5lCV9fWEZTX0lBTExPQ19IX18KQEAgLTQwLDE4ICsyNiw4IEBACiAvKgogICogQWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBpbm9kZSBhbGxvY2F0aW9uLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JQUxMT0NfSU5PREVTKQotaW50IHhmc19pYWxsb2NfaW5vZGVzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKLSNkZWZpbmUJWEZTX0lBTExPQ19JTk9ERVMobXApCXhmc19pYWxsb2NfaW5vZGVzKG1wKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0lBTExPQ19JTk9ERVMobXApCSgobXApLT5tX2lhbGxvY19pbm9zKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JQUxMT0NfQkxPQ0tTKQoteGZzX2V4dGxlbl90IHhmc19pYWxsb2NfYmxvY2tzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKLSNkZWZpbmUJWEZTX0lBTExPQ19CTE9DS1MobXApCXhmc19pYWxsb2NfYmxvY2tzKG1wKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0lBTExPQ19CTE9DS1MobXApCSgobXApLT5tX2lhbGxvY19ibGtzKQotI2VuZGlmCisjZGVmaW5lCVhGU19JQUxMT0NfSU5PREVTKG1wKQkobXApLT5tX2lhbGxvY19pbm9zCisjZGVmaW5lCVhGU19JQUxMT0NfQkxPQ0tTKG1wKQkobXApLT5tX2lhbGxvY19ibGtzCiAKIC8qCiAgKiBGb3Igc21hbGwgYmxvY2sgZmlsZSBzeXN0ZW1zLCBtb3ZlIGlub2RlcyBpbiBjbHVzdGVycyBvZiB0aGlzIHNpemUuCkBAIC02NywzMSArNDMsMjUgQEAKIC8qCiAgKiBNYWtlIGFuIGlub2RlIHBvaW50ZXIgb3V0IG9mIHRoZSBidWZmZXIvb2Zmc2V0LgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NQUtFX0lQVFIpCi1zdHJ1Y3QgeGZzX2Rpbm9kZSAqeGZzX21ha2VfaXB0cihzdHJ1Y3QgeGZzX21vdW50ICptcCwgc3RydWN0IHhmc19idWYgKmIsIGludCBvKTsKICNkZWZpbmUJWEZTX01BS0VfSVBUUihtcCxiLG8pCQl4ZnNfbWFrZV9pcHRyKG1wLGIsbykKLSNlbHNlCi0jZGVmaW5lCVhGU19NQUtFX0lQVFIobXAsYixvKSBcCi0JKCh4ZnNfZGlub2RlX3QgKikoeGZzX2J1Zl9vZmZzZXQoYiwgKG8pIDw8IChtcCktPm1fc2Iuc2JfaW5vZGVsb2cpKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBzdHJ1Y3QgeGZzX2Rpbm9kZSAqCit4ZnNfbWFrZV9pcHRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX2J1ZiAqYiwgaW50IG8pCit7CisJcmV0dXJuICh4ZnNfZGlub2RlX3QgKikKKwkJKHhmc19idWZfb2Zmc2V0KGIsIG8gPDwgKG1wKS0+bV9zYi5zYl9pbm9kZWxvZykpOworfQogCiAvKgogICogRmluZCBhIGZyZWUgKHNldCkgYml0IGluIHRoZSBpbm9kZSBiaXRtYXNrLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JQUxMT0NfRklORF9GUkVFKQotaW50IHhmc19pYWxsb2NfZmluZF9mcmVlKHhmc19pbm9mcmVlX3QgKmZwKTsKICNkZWZpbmUJWEZTX0lBTExPQ19GSU5EX0ZSRUUoZnApCXhmc19pYWxsb2NfZmluZF9mcmVlKGZwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0lBTExPQ19GSU5EX0ZSRUUoZnApCXhmc19sb3diaXQ2NCgqKGZwKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX2lhbGxvY19maW5kX2ZyZWUoeGZzX2lub2ZyZWVfdCAqZnApCit7CisJcmV0dXJuIHhmc19sb3diaXQ2NCgqZnApOworfQogCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0KLS8qCi0gKiBQcm90b3R5cGVzIGZvciB2aXNpYmxlIHhmc19pYWxsb2MuYyByb3V0aW5lcy4KLSAqLwotCiAvKgogICogQWxsb2NhdGUgYW4gaW5vZGUgb24gZGlzay4KICAqIE1vZGUgaXMgdXNlZCB0byB0ZWxsIHdoZXRoZXIgdGhlIG5ldyBpbm9kZSB3aWxsIG5lZWQgc3BhY2UsIGFuZCB3aGV0aGVyCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5jIGIvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuYwppbmRleCAyZDRkYWVjLi42MGM2NTY4MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuYworKysgYi9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5jCkBAIC0xLDYzICsxLDQ2IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKIAotLyoKLSAqIElub2RlIGFsbG9jYXRpb24gbWFuYWdlbWVudCBmb3IgWEZTLgotICovCi0KLS8qCi0gKiBQcm90b3R5cGVzIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMuCi0gKi8KLQogU1RBVElDIHZvaWQgeGZzX2lub2J0X2xvZ19ibG9jayh4ZnNfdHJhbnNfdCAqLCB4ZnNfYnVmX3QgKiwgaW50KTsKIFNUQVRJQyB2b2lkIHhmc19pbm9idF9sb2dfa2V5cyh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2J1Zl90ICosIGludCwgaW50KTsKIFNUQVRJQyB2b2lkIHhmc19pbm9idF9sb2dfcHRycyh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2J1Zl90ICosIGludCwgaW50KTsKQEAgLTcwLDEwICs1Myw2IEBACiBTVEFUSUMgaW50IHhmc19pbm9idF91cGRrZXkoeGZzX2J0cmVlX2N1cl90ICosIHhmc19pbm9idF9rZXlfdCAqLCBpbnQpOwogCiAvKgotICogSW50ZXJuYWwgZnVuY3Rpb25zLgotICovCi0KLS8qCiAgKiBTaW5nbGUgbGV2ZWwgb2YgdGhlIHhmc19pbm9idF9kZWxldGUgcmVjb3JkIGRlbGV0aW9uIHJvdXRpbmUuCiAgKiBEZWxldGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyL2xldmVsLgogICogUmVtb3ZlIHRoZSByZWNvcmQgZnJvbSBpdHMgYmxvY2sgdGhlbiByZWJhbGFuY2UgdGhlIHRyZWUuCkBAIC0xMzksNyArMTE4LDcgQEAKIAkgKiBGYWlsIGlmIHdlJ3JlIG9mZiB0aGUgZW5kIG9mIHRoZSBibG9jay4KIAkgKi8KIAotCW51bXJlY3MgPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCW51bXJlY3MgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7CiAJaWYgKHB0ciA+IG51bXJlY3MpIHsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKQEAgLTE1NCw3ICsxMzMsNyBAQAogCQlwcCA9IFhGU19JTk9CVF9QVFJfQUREUihibG9jaywgMSwgY3VyKTsKICNpZmRlZiBERUJVRwogCQlmb3IgKGkgPSBwdHI7IGkgPCBudW1yZWNzOyBpKyspIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBiZTMyX3RvX2NwdShwcFtpXSksIGxldmVsKSkpCiAJCQkJcmV0dXJuIGVycm9yOwogCQl9CiAjZW5kaWYKQEAgLTE5MSw3ICsxNzAsNyBAQAogCSAqIERlY3JlbWVudCBhbmQgbG9nIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYmxvY2suCiAJICovCiAJbnVtcmVjcy0tOwotCUlOVF9TRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgbnVtcmVjcyk7CisJYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihudW1yZWNzKTsKIAl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGJwLCBYRlNfQkJfTlVNUkVDUyk7CiAJLyoKIAkgKiBJcyB0aGlzIHRoZSByb290IGxldmVsPyAgSWYgc28sIHdlJ3JlIGFsbW9zdCBkb25lLgpAQCAtMjEwLDkgKzE4OSw5IEBACiAJCQkgKiBwcCBpcyBzdGlsbCBzZXQgdG8gdGhlIGZpcnN0IHBvaW50ZXIgaW4gdGhlIGJsb2NrLgogCQkJICogTWFrZSBpdCB0aGUgbmV3IHJvb3Qgb2YgdGhlIGJ0cmVlLgogCQkJICovCi0JCQlibm8gPSBJTlRfR0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCk7CisJCQlibm8gPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9yb290KTsKIAkJCWFnaS0+YWdpX3Jvb3QgPSAqcHA7Ci0JCQlJTlRfTU9EKGFnaS0+YWdpX2xldmVsLCBBUkNIX0NPTlZFUlQsIC0xKTsKKwkJCWJlMzJfYWRkKCZhZ2ktPmFnaV9sZXZlbCwgLTEpOwogCQkJLyoKIAkJCSAqIEZyZWUgdGhlIGJsb2NrLgogCQkJICovCkBAIC0yNTUsOCArMjM0LDggQEAKIAkgKiB0cmVlIGJhbGFuY2VkLiAgTG9vayBhdCB0aGUgbGVmdCBhbmQgcmlnaHQgc2libGluZyBibG9ja3MgdG8KIAkgKiBzZWUgaWYgd2UgY2FuIHJlLWJhbGFuY2UgYnkgbW92aW5nIG9ubHkgb25lIHJlY29yZC4KIAkgKi8KLQlyYm5vID0gSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7Ci0JbGJubyA9IElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJcmJubyA9IGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYik7CisJbGJubyA9IGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9sZWZ0c2liKTsKIAlibm8gPSBOVUxMQUdCTE9DSzsKIAlBU1NFUlQocmJubyAhPSBOVUxMQUdCTE9DSyB8fCBsYm5vICE9IE5VTExBR0JMT0NLKTsKIAkvKgpAQCAtMjkzLDE4ICsyNzIsMTggQEAKIAkJLyoKIAkJICogR3JhYiB0aGUgY3VycmVudCBibG9jayBudW1iZXIsIGZvciBmdXR1cmUgdXNlLgogCQkgKi8KLQkJYm5vID0gSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJYm5vID0gYmUzMl90b19jcHUocmlnaHQtPmJiX2xlZnRzaWIpOwogCQkvKgogCQkgKiBJZiByaWdodCBibG9jayBpcyBmdWxsIGVub3VnaCBzbyB0aGF0IHJlbW92aW5nIG9uZSBlbnRyeQogCQkgKiB3b24ndCBtYWtlIGl0IHRvbyBlbXB0eSwgYW5kIGxlZnQtc2hpZnRpbmcgYW4gZW50cnkgb3V0CiAJCSAqIG9mIHJpZ2h0IHRvIHVzIHdvcmtzLCB3ZSdyZSBkb25lLgogCQkgKi8KLQkJaWYgKElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxID49CisJCWlmIChiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgLSAxID49CiAJCSAgICAgWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKIAkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfbHNoaWZ0KHRjdXIsIGxldmVsLCAmaSkpKQogCQkJCWdvdG8gZXJyb3IwOwogCQkJaWYgKGkpIHsKLQkJCQlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA+PQorCQkJCUFTU0VSVChiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgPj0KIAkJCQkgICAgICAgWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpOwogCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsCiAJCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKQEAgLTMyMSw3ICszMDAsNyBAQAogCQkgKiBmdXR1cmUgcmVmZXJlbmNlLCBhbmQgZml4IHVwIHRoZSB0ZW1wIGN1cnNvciB0byBwb2ludAogCQkgKiB0byBvdXIgYmxvY2sgYWdhaW4gKGxhc3QgcmVjb3JkKS4KIAkJICovCi0JCXJyZWNzID0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJcnJlY3MgPSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcyk7CiAJCWlmIChsYm5vICE9IE5VTExBR0JMT0NLKSB7CiAJCQl4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOwogCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCkBAIC0zNTMsMTggKzMzMiwxOCBAQAogCQkvKgogCQkgKiBHcmFiIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgZm9yIGZ1dHVyZSB1c2UuCiAJCSAqLwotCQlibm8gPSBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQlibm8gPSBiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYik7CiAJCS8qCiAJCSAqIElmIGxlZnQgYmxvY2sgaXMgZnVsbCBlbm91Z2ggc28gdGhhdCByZW1vdmluZyBvbmUgZW50cnkKIAkJICogd29uJ3QgbWFrZSBpdCB0b28gZW1wdHksIGFuZCByaWdodC1zaGlmdGluZyBhbiBlbnRyeSBvdXQKIAkJICogb2YgbGVmdCB0byB1cyB3b3Jrcywgd2UncmUgZG9uZS4KIAkJICovCi0JCWlmIChJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxID49CisJCWlmIChiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSAtIDEgPj0KIAkJICAgICBYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSkgewogCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9yc2hpZnQodGN1ciwgbGV2ZWwsICZpKSkpCiAJCQkJZ290byBlcnJvcjA7CiAJCQlpZiAoaSkgewotCQkJCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID49CisJCQkJQVNTRVJUKGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA+PQogCQkJCSAgICAgICBYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSk7CiAJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwKIAkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOwpAQCAtMzc4LDcgKzM1Nyw3IEBACiAJCSAqIE90aGVyd2lzZSwgZ3JhYiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gcmlnaHQgZm9yCiAJCSAqIGZ1dHVyZSByZWZlcmVuY2UuCiAJCSAqLwotCQlscmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJbHJlY3MgPSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKTsKIAl9CiAJLyoKIAkgKiBEZWxldGUgdGhlIHRlbXAgY3Vyc29yLCB3ZSdyZSBkb25lIHdpdGggaXQuCkBAIC0zOTksMTQgKzM3OCwxNCBAQAogCQkgKi8KIAkJcmJubyA9IGJubzsKIAkJcmlnaHQgPSBibG9jazsKLQkJcnJlY3MgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlycmVjcyA9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKTsKIAkJcmJwID0gYnA7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKG1wLCBjdXItPmJjX3RwLAogCQkJCWN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sIGxibm8sIDAsICZsYnAsCiAJCQkJWEZTX0lOT19CVFJFRV9SRUYpKSkKIAkJCXJldHVybiBlcnJvcjsKIAkJbGVmdCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0sobGJwKTsKLQkJbHJlY3MgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWxyZWNzID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQogCQkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTQyMSwxNCArNDAwLDE0IEBACiAJCSAqLwogCQlsYm5vID0gYm5vOwogCQlsZWZ0ID0gYmxvY2s7Ci0JCWxyZWNzID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlscmVjcyA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpOwogCQlsYnAgPSBicDsKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCiAJCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgcmJubywgMCwgJnJicCwKIAkJCQlYRlNfSU5PX0JUUkVFX1JFRikpKQogCQkJcmV0dXJuIGVycm9yOwogCQlyaWdodCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socmJwKTsKLQkJcnJlY3MgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlycmVjcyA9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKTsKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKQogCQkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTQ1Niw3ICs0MzUsNyBAQAogCQlycHAgPSBYRlNfSU5PQlRfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7CiAjaWZkZWYgREVCVUcKIAkJZm9yIChpID0gMDsgaSA8IHJyZWNzOyBpKyspIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocnBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUocnBwW2ldKSwgbGV2ZWwpKSkKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCX0KICNlbmRpZgpAQCAtNDkyLDcgKzQ3MSw3IEBACiAJICogRml4IHVwIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgc3Vydml2aW5nIGJsb2NrLgogCSAqLwogCWxyZWNzICs9IHJyZWNzOwotCUlOVF9TRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBscmVjcyk7CisJbGVmdC0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KGxyZWNzKTsKIAkvKgogCSAqIEZpeCB1cCB0aGUgcmlnaHQgYmxvY2sgcG9pbnRlciBpbiB0aGUgc3Vydml2aW5nIGJsb2NrLCBhbmQgbG9nIGl0LgogCSAqLwpAQCAtNTAyLDE4ICs0ODEsMTggQEAKIAkgKiBJZiB0aGVyZSBpcyBhIHJpZ2h0IHNpYmxpbmcgbm93LCBtYWtlIGl0IHBvaW50IHRvIHRoZQogCSAqIHJlbWFpbmluZyBibG9jay4KIAkgKi8KLQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCWlmIChiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYikgIT0gTlVMTEFHQkxPQ0spIHsKIAkJeGZzX2lub2J0X2Jsb2NrX3QJKnJyYmxvY2s7CiAJCXhmc19idWZfdAkJKnJyYnA7CiAKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCi0JCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMCwKKwkJCQljdXItPmJjX3ByaXZhdGUuaS5hZ25vLCBiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYiksIDAsCiAJCQkJJnJyYnAsIFhGU19JTk9fQlRSRUVfUkVGKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAJCXJyYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKHJyYnApOwogCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJyYmxvY2ssIGxldmVsLCBycmJwKSkpCiAJCQlyZXR1cm4gZXJyb3I7Ci0JCUlOVF9TRVQocnJibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBsYm5vKTsKKwkJcnJibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKGxibm8pOwogCQl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJyYnAsIFhGU19CQl9MRUZUU0lCKTsKIAl9CiAJLyoKQEAgLTU3Miw2ICs1NTEsMTMgQEAKIAl4ZnNfaW5vYnRfcmVjX3QJCSpycD1OVUxMOwkvKiBwb2ludGVyIHRvIGJ0cmVlIHJlY29yZHMgKi8KIAogCS8qCisJICogR0NDIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgKGFyZ3VhYmx5IGNvbXBsZXgpIGNvbnRyb2wgZmxvdyBpbgorCSAqIHRoaXMgZnVuY3Rpb24gYW5kIGNvbXBsYWlucyBhYm91dCB1bmluaXRpYWxpemVkIHN0cnVjdHVyZSBmaWVsZHMKKwkgKiB3aXRob3V0IHRoaXMuCisJICovCisJbWVtc2V0KCZucmVjLCAwLCBzaXplb2YobnJlYykpOworCisJLyoKIAkgKiBJZiB3ZSBtYWRlIGl0IHRvIHRoZSByb290IGxldmVsLCBhbGxvY2F0ZSBhIG5ldyByb290IGJsb2NrCiAJICogYW5kIHdlJ3JlIGRvbmUuCiAJICovCkBAIC01OTgsNyArNTg0LDcgQEAKIAkgKi8KIAlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CiAJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKLQludW1yZWNzID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwludW1yZWNzID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwogI2lmZGVmIERFQlVHCiAJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpCiAJCXJldHVybiBlcnJvcjsKQEAgLTY3Miw3ICs2NTgsNyBAQAogCSAqIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGVyZSdzIHJvb20gZm9yIG91ciBuZXcgZW50cnkgaW4gdGhlIGJsb2NrCiAJICogd2UncmUgcG9pbnRpbmcgYXQuCiAJICovCi0JbnVtcmVjcyA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJbnVtcmVjcyA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKIAlpZiAobGV2ZWwgPiAwKSB7CiAJCS8qCiAJCSAqIEl0J3MgYSBub24tbGVhZiBlbnRyeS4gIE1ha2UgYSBob2xlIGZvciB0aGUgbmV3IGRhdGEKQEAgLTY4Miw3ICs2NjgsNyBAQAogCQlwcCA9IFhGU19JTk9CVF9QVFJfQUREUihibG9jaywgMSwgY3VyKTsKICNpZmRlZiBERUJVRwogCQlmb3IgKGkgPSBudW1yZWNzOyBpID49IHB0cjsgaS0tKSB7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKHBwW2kgLSAxXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KHBwW2kgLSAxXSksIGxldmVsKSkpCiAJCQkJcmV0dXJuIGVycm9yOwogCQl9CiAjZW5kaWYKQEAgLTY5OCw5ICs2ODQsOSBAQAogCQkJcmV0dXJuIGVycm9yOwogI2VuZGlmCiAJCWtwW3B0ciAtIDFdID0ga2V5OyAvKiBJTlRfOiBzdHJ1Y3QgY29weSAqLwotCQlJTlRfU0VUKHBwW3B0ciAtIDFdLCBBUkNIX0NPTlZFUlQsICpibm9wKTsKKwkJcHBbcHRyIC0gMV0gPSBjcHVfdG9fYmUzMigqYm5vcCk7CiAJCW51bXJlY3MrKzsKLQkJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBudW1yZWNzKTsKKwkJYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihudW1yZWNzKTsKIAkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyk7CiAJCXhmc19pbm9idF9sb2dfcHRycyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOwogCX0gZWxzZSB7CkBAIC03MTYsNyArNzAyLDcgQEAKIAkJICovCiAJCXJwW3B0ciAtIDFdID0gKnJlY3A7IC8qIElOVF86IHN0cnVjdCBjb3B5ICovCiAJCW51bXJlY3MrKzsKLQkJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBudW1yZWNzKTsKKwkJYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihudW1yZWNzKTsKIAkJeGZzX2lub2J0X2xvZ19yZWNzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyk7CiAJfQogCS8qCkBAIC04NzEsOCArODU3LDggQEAKIAkJeGZzX2FnaV90CSphZ2k7CS8qIGEuZy4gaW5vZGUgaGVhZGVyICovCiAKIAkJYWdpID0gWEZTX0JVRl9UT19BR0koY3VyLT5iY19wcml2YXRlLmkuYWdicCk7Ci0JCWFnbm8gPSBJTlRfR0VUKGFnaS0+YWdpX3NlcW5vLCBBUkNIX0NPTlZFUlQpOwotCQlhZ2JubyA9IElOVF9HRVQoYWdpLT5hZ2lfcm9vdCwgQVJDSF9DT05WRVJUKTsKKwkJYWdubyA9IGJlMzJfdG9fY3B1KGFnaS0+YWdpX3NlcW5vKTsKKwkJYWdibm8gPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9yb290KTsKIAl9CiAJLyoKIAkgKiBJdGVyYXRlIG92ZXIgZWFjaCBsZXZlbCBpbiB0aGUgYnRyZWUsIHN0YXJ0aW5nIGF0IHRoZSByb290LgpAQCAtOTM5LDcgKzkyNSw3IEBACiAJCQkgKiBTZXQgbG93IGFuZCBoaWdoIGVudHJ5IG51bWJlcnMsIDEtYmFzZWQuCiAJCQkgKi8KIAkJCWxvdyA9IDE7Ci0JCQlpZiAoIShoaWdoID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkpIHsKKwkJCWlmICghKGhpZ2ggPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpKSB7CiAJCQkJLyoKIAkJCQkgKiBJZiB0aGUgYmxvY2sgaXMgZW1wdHksIHRoZSB0cmVlIG11c3QKIAkJCQkgKiBiZSBhbiBlbXB0eSBsZWFmLgpAQCAtMTAwNiw3ICs5OTIsNyBAQAogCQkJICovCiAJCQlpZiAoZGlmZiA+IDAgJiYgLS1rZXlubyA8IDEpCiAJCQkJa2V5bm8gPSAxOwotCQkJYWdibm8gPSBJTlRfR0VUKCpYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIGtleW5vLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworCQkJYWdibm8gPSBiZTMyX3RvX2NwdSgqWEZTX0lOT0JUX1BUUl9BRERSKGJsb2NrLCBrZXlubywgY3VyKSk7CiAjaWZkZWYgREVCVUcKIAkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGFnYm5vLCBsZXZlbCkpKQogCQkJCXJldHVybiBlcnJvcjsKQEAgLTEwMjUsOCArMTAxMSw4IEBACiAJCSAqIG5vdCB0aGUgbGFzdCBibG9jaywgd2UncmUgaW4gdGhlIHdyb25nIGJsb2NrLgogCQkgKi8KIAkJaWYgKGRpciA9PSBYRlNfTE9PS1VQX0dFICYmCi0JCSAgICBrZXlubyA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgJiYKLQkJICAgIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0JMT0NLKSB7CisJCSAgICBrZXlubyA+IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSAmJgorCQkgICAgYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSAhPSBOVUxMQUdCTE9DSykgewogCQkJaW50CWk7CiAKIAkJCWN1ci0+YmNfcHRyc1swXSA9IGtleW5vOwpAQCAtMTA0Myw3ICsxMDI5LDcgQEAKIAkvKgogCSAqIFJldHVybiBpZiB3ZSBzdWNjZWVkZWQgb3Igbm90LgogCSAqLwotCWlmIChrZXlubyA9PSAwIHx8IGtleW5vID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKKwlpZiAoa2V5bm8gPT0gMCB8fCBrZXlubyA+IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSkKIAkJKnN0YXQgPSAwOwogCWVsc2UKIAkJKnN0YXQgPSAoKGRpciAhPSBYRlNfTE9PS1VQX0VRKSB8fCAoZGlmZiA9PSAwKSk7CkBAIC0xMDg5LDcgKzEwNzUsNyBAQAogCS8qCiAJICogSWYgd2UndmUgZ290IG5vIGxlZnQgc2libGluZyB0aGVuIHdlIGNhbid0IHNoaWZ0IGFuIGVudHJ5IGxlZnQuCiAJICovCi0JaWYgKElOVF9HRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwlpZiAoYmUzMl90b19jcHUocmlnaHQtPmJiX2xlZnRzaWIpID09IE5VTExBR0JMT0NLKSB7CiAJCSpzdGF0ID0gMDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTEwNSw4ICsxMDkxLDggQEAKIAkgKiBTZXQgdXAgdGhlIGxlZnQgbmVpZ2hib3IgYXMgImxlZnQiLgogCSAqLwogCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCi0JCQljdXItPmJjX3ByaXZhdGUuaS5hZ25vLCBJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpLCAwLCAmbGJwLAotCQkJWEZTX0lOT19CVFJFRV9SRUYpKSkKKwkJCWN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sIGJlMzJfdG9fY3B1KHJpZ2h0LT5iYl9sZWZ0c2liKSwKKwkJCTAsICZsYnAsIFhGU19JTk9fQlRSRUVfUkVGKSkpCiAJCXJldHVybiBlcnJvcjsKIAlsZWZ0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhsYnApOwogCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQpAQCAtMTExNCwxMSArMTEwMCwxMSBAQAogCS8qCiAJICogSWYgaXQncyBmdWxsLCBpdCBjYW4ndCB0YWtlIGFub3RoZXIgZW50cnkuCiAJICovCi0JaWYgKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCWlmIChiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSA9PSBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgewogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwogCX0KLQlucmVjID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMTsKKwlucmVjID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgKyAxOwogCS8qCiAJICogSWYgbm9uLWxlYWYsIGNvcHkgYSBrZXkgYW5kIGEgcHRyIHRvIHRoZSBsZWZ0IGJsb2NrLgogCSAqLwpAQCAtMTEzMCw3ICsxMTE2LDcgQEAKIAkJbHBwID0gWEZTX0lOT0JUX1BUUl9BRERSKGxlZnQsIG5yZWMsIGN1cik7CiAJCXJwcCA9IFhGU19JTk9CVF9QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKICNpZmRlZiBERUJVRwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKCpycHAsIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KCpycHApLCBsZXZlbCkpKQogCQkJcmV0dXJuIGVycm9yOwogI2VuZGlmCiAJCSpscHAgPSAqcnBwOyAvKiBJTlRfOiBuby1jaGFuZ2UgY29weSAqLwpAQCAtMTE0OCw3ICsxMTM0LDcgQEAKIAkvKgogCSAqIEJ1bXAgYW5kIGxvZyBsZWZ0J3MgbnVtcmVjcywgZGVjcmVtZW50IGFuZCBsb2cgcmlnaHQncyBudW1yZWNzLgogCSAqLwotCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7CisJYmUxNl9hZGQoJmxlZnQtPmJiX251bXJlY3MsIDEpOwogCXhmc19pbm9idF9sb2dfYmxvY2soY3VyLT5iY190cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyk7CiAjaWZkZWYgREVCVUcKIAlpZiAobGV2ZWwgPiAwKQpAQCAtMTE1NiwyNiArMTE0MiwyNiBAQAogCWVsc2UKIAkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCBscnAgLSAxLCBscnApOwogI2VuZGlmCi0JSU5UX01PRChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJYmUxNl9hZGQoJnJpZ2h0LT5iYl9udW1yZWNzLCAtMSk7CiAJeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCByYnAsIFhGU19CQl9OVU1SRUNTKTsKIAkvKgogCSAqIFNsaWRlIHRoZSBjb250ZW50cyBvZiByaWdodCBkb3duIG9uZSBlbnRyeS4KIAkgKi8KIAlpZiAobGV2ZWwgPiAwKSB7CiAjaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChycHBbaSArIDFdLCBBUkNIX0NPTlZFUlQpLAorCQlmb3IgKGkgPSAwOyBpIDwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KHJwcFtpICsgMV0pLAogCQkJCQlsZXZlbCkpKQogCQkJCXJldHVybiBlcnJvcjsKIAkJfQogI2VuZGlmCi0JCW1lbW1vdmUocmtwLCBya3AgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKLQkJbWVtbW92ZShycHAsIHJwcCArIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJwcCkpOwotCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOwotCQl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQltZW1tb3ZlKHJrcCwgcmtwICsgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpya3ApKTsKKwkJbWVtbW92ZShycHAsIHJwcCArIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnBwKSk7CisJCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKKwkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwogCX0gZWxzZSB7Ci0JCW1lbW1vdmUocnJwLCBycnAgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKLQkJeGZzX2lub2J0X2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJbWVtbW92ZShycnAsIHJycCArIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnJwKSk7CisJCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKIAkJa2V5LmlyX3N0YXJ0aW5vID0gcnJwLT5pcl9zdGFydGlubzsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KIAkJcmtwID0gJmtleTsKIAl9CkBAIC0xMjI3LDcgKzEyMTMsNyBAQAogCWFyZ3MudHAgPSBjdXItPmJjX3RwOwogCWFyZ3MubXAgPSBjdXItPmJjX21wOwogCWFyZ3MuZnNibm8gPSBYRlNfQUdCX1RPX0ZTQihhcmdzLm1wLCBjdXItPmJjX3ByaXZhdGUuaS5hZ25vLAotCQlJTlRfR0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCkpOworCQliZTMyX3RvX2NwdShhZ2ktPmFnaV9yb290KSk7CiAJYXJncy5tb2QgPSBhcmdzLm1pbmxlZnQgPSBhcmdzLmFsaWdubWVudCA9IGFyZ3MudG90YWwgPSBhcmdzLndhc2RlbCA9CiAJCWFyZ3MuaXNmbCA9IGFyZ3MudXNlcmRhdGEgPSBhcmdzLm1pbmFsaWduc2xvcCA9IDA7CiAJYXJncy5taW5sZW4gPSBhcmdzLm1heGxlbiA9IGFyZ3MucHJvZCA9IDE7CkBAIC0xMjQ3LDggKzEyMzMsOCBAQAogCS8qCiAJICogU2V0IHRoZSByb290IGRhdGEgaW4gdGhlIGEuZy4gaW5vZGUgc3RydWN0dXJlLgogCSAqLwotCUlOVF9TRVQoYWdpLT5hZ2lfcm9vdCwgQVJDSF9DT05WRVJULCBhcmdzLmFnYm5vKTsKLQlJTlRfTU9EKGFnaS0+YWdpX2xldmVsLCBBUkNIX0NPTlZFUlQsIDEpOworCWFnaS0+YWdpX3Jvb3QgPSBjcHVfdG9fYmUzMihhcmdzLmFnYm5vKTsKKwliZTMyX2FkZCgmYWdpLT5hZ2lfbGV2ZWwsIDEpOwogCXhmc19pYWxsb2NfbG9nX2FnaShhcmdzLnRwLCBjdXItPmJjX3ByaXZhdGUuaS5hZ2JwLAogCQlYRlNfQUdJX1JPT1QgfCBYRlNfQUdJX0xFVkVMKTsKIAkvKgpAQCAtMTI2MywxNCArMTI0OSwxNCBAQAogCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGN1ci0+YmNfbmxldmVscyAtIDEsIGJwKSkpCiAJCXJldHVybiBlcnJvcjsKICNlbmRpZgotCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCWlmIChiZTMyX3RvX2NwdShibG9jay0+YmJfcmlnaHRzaWIpICE9IE5VTExBR0JMT0NLKSB7CiAJCS8qCiAJCSAqIE91ciBibG9jayBpcyBsZWZ0LCBwaWNrIHVwIHRoZSByaWdodCBibG9jay4KIAkJICovCiAJCWxicCA9IGJwOwogCQlsYm5vID0gWEZTX0RBRERSX1RPX0FHQk5PKGFyZ3MubXAsIFhGU19CVUZfQUREUihsYnApKTsKIAkJbGVmdCA9IGJsb2NrOwotCQlyYm5vID0gSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJcmJubyA9IGJlMzJfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKTsKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoYXJncy5tcCwgYXJncy50cCwgYXJncy5hZ25vLAogCQkJCXJibm8sIDAsICZyYnAsIFhGU19JTk9fQlRSRUVfUkVGKSkpCiAJCQlyZXR1cm4gZXJyb3I7CkBAIC0xMjg3LDcgKzEyNzMsNyBAQAogCQlyYnAgPSBicDsKIAkJcmJubyA9IFhGU19EQUREUl9UT19BR0JOTyhhcmdzLm1wLCBYRlNfQlVGX0FERFIocmJwKSk7CiAJCXJpZ2h0ID0gYmxvY2s7Ci0JCWxibm8gPSBJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpOworCQlsYm5vID0gYmUzMl90b19jcHUocmlnaHQtPmJiX2xlZnRzaWIpOwogCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhhcmdzLm1wLCBhcmdzLnRwLCBhcmdzLmFnbm8sCiAJCQkJbGJubywgMCwgJmxicCwgWEZTX0lOT19CVFJFRV9SRUYpKSkKIAkJCXJldHVybiBlcnJvcjsKQEAgLTEzMDEsMTggKzEyODcsMTggQEAKIAkvKgogCSAqIEZpbGwgaW4gdGhlIG5ldyBibG9jaydzIGJ0cmVlIGhlYWRlciBhbmQgbG9nIGl0LgogCSAqLwotCUlOVF9TRVQobmV3LT5iYl9tYWdpYywgQVJDSF9DT05WRVJULCB4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dKTsKLQlJTlRfU0VUKG5ldy0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCwgKF9fdWludDE2X3QpY3VyLT5iY19ubGV2ZWxzKTsKLQlJTlRfU0VUKG5ldy0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAyKTsKLQlJTlRfU0VUKG5ldy0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBOVUxMQUdCTE9DSyk7Ci0JSU5UX1NFVChuZXctPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwluZXctPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoeGZzX21hZ2ljc1tjdXItPmJjX2J0bnVtXSk7CisJbmV3LT5iYl9sZXZlbCA9IGNwdV90b19iZTE2KGN1ci0+YmNfbmxldmVscyk7CisJbmV3LT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYoMik7CisJbmV3LT5iYl9sZWZ0c2liID0gY3B1X3RvX2JlMzIoTlVMTEFHQkxPQ0spOworCW5ldy0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7CiAJeGZzX2lub2J0X2xvZ19ibG9jayhhcmdzLnRwLCBuYnAsIFhGU19CQl9BTExfQklUUyk7CiAJQVNTRVJUKGxibm8gIT0gTlVMTEFHQkxPQ0sgJiYgcmJubyAhPSBOVUxMQUdCTE9DSyk7CiAJLyoKIAkgKiBGaWxsIGluIHRoZSBrZXkgZGF0YSBpbiB0aGUgbmV3IHJvb3QuCiAJICovCiAJa3AgPSBYRlNfSU5PQlRfS0VZX0FERFIobmV3LCAxLCBjdXIpOwotCWlmIChJTlRfR0VUKGxlZnQtPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID4gMCkgeworCWlmIChiZTE2X3RvX2NwdShsZWZ0LT5iYl9sZXZlbCkgPiAwKSB7CiAJCWtwWzBdID0gKlhGU19JTk9CVF9LRVlfQUREUihsZWZ0LCAxLCBjdXIpOyAvKiBJTlRfOiBzdHJ1Y3QgY29weSAqLwogCQlrcFsxXSA9ICpYRlNfSU5PQlRfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7IC8qIElOVF86IHN0cnVjdCBjb3B5ICovCiAJfSBlbHNlIHsKQEAgLTEzMjYsOCArMTMxMiw4IEBACiAJICogRmlsbCBpbiB0aGUgcG9pbnRlciBkYXRhIGluIHRoZSBuZXcgcm9vdC4KIAkgKi8KIAlwcCA9IFhGU19JTk9CVF9QVFJfQUREUihuZXcsIDEsIGN1cik7Ci0JSU5UX1NFVChwcFswXSwgQVJDSF9DT05WRVJULCBsYm5vKTsKLQlJTlRfU0VUKHBwWzFdLCBBUkNIX0NPTlZFUlQsIHJibm8pOworCXBwWzBdID0gY3B1X3RvX2JlMzIobGJubyk7CisJcHBbMV0gPSBjcHVfdG9fYmUzMihyYm5vKTsKIAl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCBuYnAsIDEsIDIpOwogCS8qCiAJICogRml4IHVwIHRoZSBjdXJzb3IuCkBAIC0xMzc2LDcgKzEzNjIsNyBAQAogCS8qCiAJICogSWYgd2UndmUgZ290IG5vIHJpZ2h0IHNpYmxpbmcgdGhlbiB3ZSBjYW4ndCBzaGlmdCBhbiBlbnRyeSByaWdodC4KIAkgKi8KLQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykgeworCWlmIChiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYikgPT0gTlVMTEFHQkxPQ0spIHsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMzg0LDcgKzEzNzAsNyBAQAogCSAqIElmIHRoZSBjdXJzb3IgZW50cnkgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIG1vdmVkLCBkb24ndAogCSAqIGRvIGl0Li4uIGl0J3MgdG9vIGNvbXBsaWNhdGVkLgogCSAqLwotCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID49IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID49IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpKSB7CiAJCSpzdGF0ID0gMDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTM5Miw4ICsxMzc4LDggQEAKIAkgKiBTZXQgdXAgdGhlIHJpZ2h0IG5laWdoYm9yIGFzICJyaWdodCIuCiAJICovCiAJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKLQkJCWN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sIElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsICZyYnAsCi0JCQlYRlNfSU5PX0JUUkVFX1JFRikpKQorCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgYmUzMl90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpLAorCQkJMCwgJnJicCwgWEZTX0lOT19CVFJFRV9SRUYpKSkKIAkJcmV0dXJuIGVycm9yOwogCXJpZ2h0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhyYnApOwogCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkKQEAgLTE0MDEsNyArMTM4Nyw3IEBACiAJLyoKIAkgKiBJZiBpdCdzIGZ1bGwsIGl0IGNhbid0IHRha2UgYW5vdGhlciBlbnRyeS4KIAkgKi8KLQlpZiAoSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCWlmIChiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgPT0gWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNDEwLDQxICsxMzk2LDQxIEBACiAJICogY29weSB0aGUgbGFzdCBsZWZ0IGJsb2NrIGVudHJ5IHRvIHRoZSBob2xlLgogCSAqLwogCWlmIChsZXZlbCA+IDApIHsKLQkJbGtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSwgY3VyKTsKLQkJbHBwID0gWEZTX0lOT0JUX1BUUl9BRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwkJbGtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGxlZnQsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpLCBjdXIpOworCQlscHAgPSBYRlNfSU5PQlRfUFRSX0FERFIobGVmdCwgYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyksIGN1cik7CiAJCXJrcCA9IFhGU19JTk9CVF9LRVlfQUREUihyaWdodCwgMSwgY3VyKTsKIAkJcnBwID0gWEZTX0lOT0JUX1BUUl9BRERSKHJpZ2h0LCAxLCBjdXIpOwogI2lmZGVmIERFQlVHCi0JCWZvciAoaSA9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChycHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCWZvciAoaSA9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBiZTMyX3RvX2NwdShycHBbaV0pLCBsZXZlbCkpKQogCQkJCXJldHVybiBlcnJvcjsKIAkJfQogI2VuZGlmCi0JCW1lbW1vdmUocmtwICsgMSwgcmtwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKLQkJbWVtbW92ZShycHAgKyAxLCBycHAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJwcCkpOworCQltZW1tb3ZlKHJrcCArIDEsIHJrcCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpya3ApKTsKKwkJbWVtbW92ZShycHAgKyAxLCBycHAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnBwKSk7CiAjaWZkZWYgREVCVUcKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVCgqbHBwLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBiZTMyX3RvX2NwdSgqbHBwKSwgbGV2ZWwpKSkKIAkJCXJldHVybiBlcnJvcjsKICNlbmRpZgogCQkqcmtwID0gKmxrcDsgLyogSU5UXzogbm8gY2hhbmdlIGNvcHkgKi8KIAkJKnJwcCA9ICpscHA7IC8qIElOVF86IG5vIGNoYW5nZSBjb3B5ICovCi0JCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOwotCQl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKTsKKwkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKyAxKTsKKwkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKyAxKTsKIAl9IGVsc2UgewotCQlscnAgPSBYRlNfSU5PQlRfUkVDX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlscnAgPSBYRlNfSU5PQlRfUkVDX0FERFIobGVmdCwgYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyksIGN1cik7CiAJCXJycCA9IFhGU19JTk9CVF9SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKLQkJbWVtbW92ZShycnAgKyAxLCBycnAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJycCkpOworCQltZW1tb3ZlKHJycCArIDEsIHJycCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpycnApKTsKIAkJKnJycCA9ICpscnA7Ci0JCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCQl4ZnNfaW5vYnRfbG9nX3JlY3MoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSArIDEpOwogCQlrZXkuaXJfc3RhcnRpbm8gPSBycnAtPmlyX3N0YXJ0aW5vOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLwogCQlya3AgPSAma2V5OwogCX0KIAkvKgogCSAqIERlY3JlbWVudCBhbmQgbG9nIGxlZnQncyBudW1yZWNzLCBidW1wIGFuZCBsb2cgcmlnaHQncyBudW1yZWNzLgogCSAqLwotCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJYmUxNl9hZGQoJmxlZnQtPmJiX251bXJlY3MsIC0xKTsKIAl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGxicCwgWEZTX0JCX05VTVJFQ1MpOwotCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOworCWJlMTZfYWRkKCZyaWdodC0+YmJfbnVtcmVjcywgMSk7CiAjaWZkZWYgREVCVUcKIAlpZiAobGV2ZWwgPiAwKQogCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sIHJrcCwgcmtwICsgMSk7CkBAIC0xNTM2LDE3ICsxNTIyLDE3IEBACiAJLyoKIAkgKiBGaWxsIGluIHRoZSBidHJlZSBoZWFkZXIgZm9yIHRoZSBuZXcgYmxvY2suCiAJICovCi0JSU5UX1NFVChyaWdodC0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgeGZzX21hZ2ljc1tjdXItPmJjX2J0bnVtXSk7Ci0JcmlnaHQtPmJiX2xldmVsID0gbGVmdC0+YmJfbGV2ZWw7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCi0JSU5UX1NFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAoX191aW50MTZfdCkoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC8gMikpOworCXJpZ2h0LT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0pOworCXJpZ2h0LT5iYl9sZXZlbCA9IGxlZnQtPmJiX2xldmVsOworCXJpZ2h0LT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgLyAyKTsKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZXJlJ3MgYW4gb2RkIG51bWJlciBvZiBlbnRyaWVzIG5vdywgdGhhdAogCSAqIGVhY2ggbmV3IGJsb2NrIHdpbGwgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcy4KIAkgKi8KLQlpZiAoKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAmIDEpICYmCi0JICAgIGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpCi0JCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOwotCWkgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMTsKKwlpZiAoKGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICYgMSkgJiYKKwkgICAgY3VyLT5iY19wdHJzW2xldmVsXSA8PSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKyAxKQorCQliZTE2X2FkZCgmcmlnaHQtPmJiX251bXJlY3MsIDEpOworCWkgPSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSAtIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSArIDE7CiAJLyoKIAkgKiBGb3Igbm9uLWxlYWYgYmxvY2tzLCBjb3B5IGtleXMgYW5kIGFkZHJlc3NlcyBvdmVyIHRvIHRoZSBuZXcgYmxvY2suCiAJICovCkBAIC0xNTU2LDE1ICsxNTQyLDE1IEBACiAJCXJrcCA9IFhGU19JTk9CVF9LRVlfQUREUihyaWdodCwgMSwgY3VyKTsKIAkJcnBwID0gWEZTX0lOT0JUX1BUUl9BRERSKHJpZ2h0LCAxLCBjdXIpOwogI2lmZGVmIERFQlVHCi0JCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQobHBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQlmb3IgKGkgPSAwOyBpIDwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KGxwcFtpXSksIGxldmVsKSkpCiAJCQkJcmV0dXJuIGVycm9yOwogCQl9CiAjZW5kaWYKLQkJbWVtY3B5KHJrcCwgbGtwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKLQkJbWVtY3B5KHJwcCwgbHBwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycHApKTsKLQkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKLQkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJbWVtY3B5KHJrcCwgbGtwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJrcCkpOworCQltZW1jcHkocnBwLCBscHAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnBwKSk7CisJCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKKwkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwogCQkqa2V5cCA9ICpya3A7CiAJfQogCS8qCkBAIC0xNTczLDM2ICsxNTU5LDM2IEBACiAJZWxzZSB7CiAJCWxycCA9IFhGU19JTk9CVF9SRUNfQUREUihsZWZ0LCBpLCBjdXIpOwogCQlycnAgPSBYRlNfSU5PQlRfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7Ci0JCW1lbWNweShycnAsIGxycCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnJwKSk7Ci0JCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCW1lbWNweShycnAsIGxycCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpycnApKTsKKwkJeGZzX2lub2J0X2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwogCQlrZXlwLT5pcl9zdGFydGlubyA9IHJycC0+aXJfc3RhcnRpbm87IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCiAJfQogCS8qCiAJICogRmluZCB0aGUgbGVmdCBibG9jayBudW1iZXIgYnkgbG9va2luZyBpbiB0aGUgYnVmZmVyLgogCSAqIEFkanVzdCBudW1yZWNzLCBzaWJsaW5nIHBvaW50ZXJzLgogCSAqLwotCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtKElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpKTsKLQlyaWdodC0+YmJfcmlnaHRzaWIgPSBsZWZ0LT5iYl9yaWdodHNpYjsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KLQlJTlRfU0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIGFyZ3MuYWdibm8pOwotCUlOVF9TRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgbGJubyk7CisJYmUxNl9hZGQoJmxlZnQtPmJiX251bXJlY3MsIC0oYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKSk7CisJcmlnaHQtPmJiX3JpZ2h0c2liID0gbGVmdC0+YmJfcmlnaHRzaWI7CisJbGVmdC0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihhcmdzLmFnYm5vKTsKKwlyaWdodC0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKGxibm8pOwogCXhmc19pbm9idF9sb2dfYmxvY2soYXJncy50cCwgcmJwLCBYRlNfQkJfQUxMX0JJVFMpOwogCXhmc19pbm9idF9sb2dfYmxvY2soYXJncy50cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyB8IFhGU19CQl9SSUdIVFNJQik7CiAJLyoKIAkgKiBJZiB0aGVyZSdzIGEgYmxvY2sgdG8gdGhlIG5ldyBibG9jaydzIHJpZ2h0LCBtYWtlIHRoYXQgYmxvY2sKIAkgKiBwb2ludCBiYWNrIHRvIHJpZ2h0IGluc3RlYWQgb2YgdG8gbGVmdC4KIAkgKi8KLQlpZiAoSU5UX0dFVChyaWdodC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwlpZiAoYmUzMl90b19jcHUocmlnaHQtPmJiX3JpZ2h0c2liKSAhPSBOVUxMQUdCTE9DSykgewogCQl4ZnNfaW5vYnRfYmxvY2tfdAkqcnJibG9jazsJLyogcnIgYnRyZWUgYmxvY2sgKi8KIAkJeGZzX2J1Zl90CQkqcnJicDsJCS8qIGJ1ZmZlciBmb3IgcnJibG9jayAqLwogCiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGFyZ3MubXAsIGFyZ3MudHAsIGFyZ3MuYWdubywKLQkJCQlJTlRfR0VUKHJpZ2h0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMCwgJnJyYnAsCisJCQkJYmUzMl90b19jcHUocmlnaHQtPmJiX3JpZ2h0c2liKSwgMCwgJnJyYnAsCiAJCQkJWEZTX0lOT19CVFJFRV9SRUYpKSkKIAkJCXJldHVybiBlcnJvcjsKIAkJcnJibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socnJicCk7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcnJibG9jaywgbGV2ZWwsIHJyYnApKSkKIAkJCXJldHVybiBlcnJvcjsKLQkJSU5UX1NFVChycmJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIGFyZ3MuYWdibm8pOworCQlycmJsb2NrLT5iYl9sZWZ0c2liID0gY3B1X3RvX2JlMzIoYXJncy5hZ2Jubyk7CiAJCXhmc19pbm9idF9sb2dfYmxvY2soYXJncy50cCwgcnJicCwgWEZTX0JCX0xFRlRTSUIpOwogCX0KIAkvKgpAQCAtMTYxMCw5ICsxNTk2LDkgQEAKIAkgKiBJZiBpdCdzIGp1c3QgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBlbnRyeSBpbiBsZWZ0LCB0aGVuIHdlJ2xsCiAJICogaW5zZXJ0IHRoZXJlLCBzbyBkb24ndCBjaGFuZ2UgYW55dGhpbmcgaW4gdGhhdCBjYXNlLgogCSAqLwotCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID4gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSkgeworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID4gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgKyAxKSB7CiAJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgcmJwKTsKLQkJY3VyLT5iY19wdHJzW2xldmVsXSAtPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWN1ci0+YmNfcHRyc1tsZXZlbF0gLT0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7CiAJfQogCS8qCiAJICogSWYgdGhlcmUgYXJlIG1vcmUgbGV2ZWxzLCB3ZSdsbCBuZWVkIGFub3RoZXIgY3Vyc29yIHdoaWNoIHJlZmVycwpAQCAtMTcxMCw3ICsxNjk2LDcgQEAKIAkvKgogCSAqIElmIHdlIGp1c3Qgd2VudCBvZmYgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHJlZSwgcmV0dXJuIGZhaWx1cmUuCiAJICovCi0JaWYgKElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwlpZiAoYmUzMl90b19jcHUoYmxvY2stPmJiX2xlZnRzaWIpID09IE5VTExBR0JMT0NLKSB7CiAJCSpzdGF0ID0gMDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTczOSw3ICsxNzI1LDcgQEAKIAkJeGZzX2FnYmxvY2tfdAlhZ2JubzsJLyogYmxvY2sgbnVtYmVyIG9mIGJ0cmVlIGJsb2NrICovCiAJCXhmc19idWZfdAkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCiAKLQkJYWdibm8gPSBJTlRfR0VUKCpYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworCQlhZ2JubyA9IGJlMzJfdG9fY3B1KCpYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpKTsKIAkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKIAkJCQljdXItPmJjX3ByaXZhdGUuaS5hZ25vLCBhZ2JubywgMCwgJmJwLAogCQkJCVhGU19JTk9fQlRSRUVfUkVGKSkpCkBAIC0xNzQ5LDcgKzE3MzUsNyBAQAogCQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOwogCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCiAJCQlyZXR1cm4gZXJyb3I7Ci0JCWN1ci0+YmNfcHRyc1tsZXZdID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJY3VyLT5iY19wdHJzW2xldl0gPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7CiAJfQogCSpzdGF0ID0gMTsKIAlyZXR1cm4gMDsKQEAgLTE4MjEsNyArMTgwNyw3IEBACiAJLyoKIAkgKiBPZmYgdGhlIHJpZ2h0IGVuZCBvciBsZWZ0IGVuZCwgcmV0dXJuIGZhaWx1cmUuCiAJICovCi0JaWYgKHB0ciA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgfHwgcHRyIDw9IDApIHsKKwlpZiAocHRyID4gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpIHx8IHB0ciA8PSAwKSB7CiAJCSpzdGF0ID0gMDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTg2OSwxNCArMTg1NSwxNCBAQAogCSAqIEluY3JlbWVudCB0aGUgcHRyIGF0IHRoaXMgbGV2ZWwuICBJZiB3ZSdyZSBzdGlsbCBpbiB0aGUgYmxvY2sKIAkgKiB0aGVuIHdlJ3JlIGRvbmUuCiAJICovCi0JaWYgKCsrY3VyLT5iY19wdHJzW2xldmVsXSA8PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJaWYgKCsrY3VyLT5iY19wdHJzW2xldmVsXSA8PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpIHsKIAkJKnN0YXQgPSAxOwogCQlyZXR1cm4gMDsKIAl9CiAJLyoKIAkgKiBJZiB3ZSBqdXN0IHdlbnQgb2ZmIHRoZSByaWdodCBlZGdlIG9mIHRoZSB0cmVlLCByZXR1cm4gZmFpbHVyZS4KIAkgKi8KLQlpZiAoSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwlpZiAoYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSykgewogCQkqc3RhdCA9IDA7CiAJCXJldHVybiAwOwogCX0KQEAgLTE4OTEsNyArMTg3Nyw3IEBACiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldiwgYnApKSkKIAkJCXJldHVybiBlcnJvcjsKICNlbmRpZgotCQlpZiAoKytjdXItPmJjX3B0cnNbbGV2XSA8PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKQorCQlpZiAoKytjdXItPmJjX3B0cnNbbGV2XSA8PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpCiAJCQlicmVhazsKIAkJLyoKIAkJICogUmVhZC1haGVhZCB0aGUgcmlnaHQgYmxvY2ssIHdlJ3JlIGdvaW5nIHRvIHJlYWQgaXQKQEAgLTE5MTEsNyArMTg5Nyw3IEBACiAJICAgICBsZXYgPiBsZXZlbDsgKSB7CiAJCXhmc19hZ2Jsb2NrX3QJYWdibm87CS8qIGJsb2NrIG51bWJlciBvZiBidHJlZSBibG9jayAqLwogCi0JCWFnYm5vID0gSU5UX0dFVCgqWEZTX0lOT0JUX1BUUl9BRERSKGJsb2NrLCBjdXItPmJjX3B0cnNbbGV2XSwgY3VyKSwgQVJDSF9DT05WRVJUKTsKKwkJYWdibm8gPSBiZTMyX3RvX2NwdSgqWEZTX0lOT0JUX1BUUl9BRERSKGJsb2NrLCBjdXItPmJjX3B0cnNbbGV2XSwgY3VyKSk7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCiAJCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgYWdibm8sIDAsICZicCwKIAkJCQlYRlNfSU5PX0JUUkVFX1JFRikpKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmgKaW5kZXggNDRiZTE4OC4uYWUzOTA0YyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuaAorKysgYi9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19JQUxMT0NfQlRSRUVfSF9fCiAjZGVmaW5lCV9fWEZTX0lBTExPQ19CVFJFRV9IX18KQEAgLTUxLDE0ICszNywxMiBAQAogI2RlZmluZQlYRlNfSU5PREVTX1BFUl9DSFVOS19MT0cJKFhGU19OQkJZTE9HICsgMykKICNkZWZpbmUJWEZTX0lOT0JUX0FMTF9GUkVFCSgoeGZzX2lub2ZyZWVfdCktMSkKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfTUFTS04pCi14ZnNfaW5vZnJlZV90IHhmc19pbm9idF9tYXNrbihpbnQgaSwgaW50IG4pOwogI2RlZmluZQlYRlNfSU5PQlRfTUFTS04oaSxuKQkJeGZzX2lub2J0X21hc2tuKGksbikKLSNlbHNlCi0jZGVmaW5lCVhGU19JTk9CVF9NQVNLTihpLG4pCVwKLQkoKCgobikgPj0gWEZTX0lOT0RFU19QRVJfQ0hVTksgPyBcCi0JCSh4ZnNfaW5vZnJlZV90KTAgOiAoKHhmc19pbm9mcmVlX3QpMSA8PCAobikpKSAtIDEpIDw8IChpKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSB4ZnNfaW5vZnJlZV90IHhmc19pbm9idF9tYXNrbihpbnQgaSwgaW50IG4pCit7CisJcmV0dXJuICgoKG4pID49IFhGU19JTk9ERVNfUEVSX0NIVU5LID8gXAorCQkoeGZzX2lub2ZyZWVfdCkwIDogKCh4ZnNfaW5vZnJlZV90KTEgPDwgKG4pKSkgLSAxKSA8PCAoaSk7Cit9CiAKIC8qCiAgKiBEYXRhIHJlY29yZCBzdHJ1Y3R1cmUKQEAgLTc4LDI0MSArNjIsMTE2IEBACiAJeGZzX2FnaW5vX3QJaXJfc3RhcnRpbm87CS8qIHN0YXJ0aW5nIGlub2RlIG51bWJlciAqLwogfSB4ZnNfaW5vYnRfa2V5X3Q7CiAKLXR5cGVkZWYgeGZzX2FnYmxvY2tfdCB4ZnNfaW5vYnRfcHRyX3Q7CS8qIGJ0cmVlIHBvaW50ZXIgdHlwZSAqLwotCQkJCQkvKiBidHJlZSBibG9jayBoZWFkZXIgdHlwZSAqLworLyogYnRyZWUgcG9pbnRlciB0eXBlICovCit0eXBlZGVmIF9fYmUzMiB4ZnNfaW5vYnRfcHRyX3Q7CisKKy8qIGJ0cmVlIGJsb2NrIGhlYWRlciB0eXBlICovCiB0eXBlZGVmCXN0cnVjdCB4ZnNfYnRyZWVfc2Jsb2NrIHhmc19pbm9idF9ibG9ja190OwogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fSU5PQlRfQkxPQ0spCi14ZnNfaW5vYnRfYmxvY2tfdCAqeGZzX2J1Zl90b19pbm9idF9ibG9jayhzdHJ1Y3QgeGZzX2J1ZiAqYnApOwotI2RlZmluZQlYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKQl4ZnNfYnVmX3RvX2lub2J0X2Jsb2NrKGJwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCkgKCh4ZnNfaW5vYnRfYmxvY2tfdCAqKShYRlNfQlVGX1BUUihicCkpKQotI2VuZGlmCisjZGVmaW5lCVhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApCSgoeGZzX2lub2J0X2Jsb2NrX3QgKilYRlNfQlVGX1BUUihicCkpCiAKIC8qCiAgKiBCaXQgbWFuaXB1bGF0aW9ucyBmb3IgaXJfZnJlZS4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfTUFTSykKLXhmc19pbm9mcmVlX3QgeGZzX2lub2J0X21hc2soaW50IGkpOwotI2RlZmluZQlYRlNfSU5PQlRfTUFTSyhpKQkJeGZzX2lub2J0X21hc2soaSkKLSNlbHNlCiAjZGVmaW5lCVhGU19JTk9CVF9NQVNLKGkpCQkoKHhmc19pbm9mcmVlX3QpMSA8PCAoaSkpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX0lTX0ZSRUUpCi1pbnQgeGZzX2lub2J0X2lzX2ZyZWUoeGZzX2lub2J0X3JlY190ICpycCwgaW50IGkpOwotI2RlZmluZQlYRlNfSU5PQlRfSVNfRlJFRShycCxpKQkJeGZzX2lub2J0X2lzX2ZyZWUocnAsaSkKLSNkZWZpbmUJWEZTX0lOT0JUX0lTX0ZSRUVfRElTSyhycCxpKQl4ZnNfaW5vYnRfaXNfZnJlZV9kaXNrKHJwLGkpCi0jZWxzZQotI2RlZmluZQlYRlNfSU5PQlRfSVNfRlJFRShycCxpKQlcCi0JKCgocnApLT5pcl9mcmVlICYgWEZTX0lOT0JUX01BU0soaSkpICE9IDApCi0jZGVmaW5lIFhGU19JTk9CVF9JU19GUkVFX0RJU0socnAsaSkgXAotCSgoSU5UX0dFVCgocnApLT5pcl9mcmVlLCBBUkNIX0NPTlZFUlQpICYgWEZTX0lOT0JUX01BU0soaSkpICE9IDApCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX1NFVF9GUkVFKQotdm9pZCB4ZnNfaW5vYnRfc2V0X2ZyZWUoeGZzX2lub2J0X3JlY190ICpycCwgaW50IGkpOwotI2RlZmluZQlYRlNfSU5PQlRfU0VUX0ZSRUUocnAsaSkJeGZzX2lub2J0X3NldF9mcmVlKHJwLGkpCi0jZWxzZQorI2RlZmluZQlYRlNfSU5PQlRfSVNfRlJFRShycCxpKQkJXAorCQkoKChycCktPmlyX2ZyZWUgJiBYRlNfSU5PQlRfTUFTSyhpKSkgIT0gMCkKKyNkZWZpbmUJWEZTX0lOT0JUX0lTX0ZSRUVfRElTSyhycCxpKQlcCisJCSgoSU5UX0dFVCgocnApLT5pcl9mcmVlLEFSQ0hfQ09OVkVSVCkgJiBYRlNfSU5PQlRfTUFTSyhpKSkgIT0gMCkKICNkZWZpbmUJWEZTX0lOT0JUX1NFVF9GUkVFKHJwLGkpCSgocnApLT5pcl9mcmVlIHw9IFhGU19JTk9CVF9NQVNLKGkpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9CVF9DTFJfRlJFRSkKLXZvaWQgeGZzX2lub2J0X2Nscl9mcmVlKHhmc19pbm9idF9yZWNfdCAqcnAsIGludCBpKTsKLSNkZWZpbmUJWEZTX0lOT0JUX0NMUl9GUkVFKHJwLGkpCXhmc19pbm9idF9jbHJfZnJlZShycCxpKQotI2Vsc2UKICNkZWZpbmUJWEZTX0lOT0JUX0NMUl9GUkVFKHJwLGkpCSgocnApLT5pcl9mcmVlICY9IH5YRlNfSU5PQlRfTUFTSyhpKSkKLSNlbmRpZgogCiAvKgogICogUmVhbCBibG9jayBzdHJ1Y3R1cmVzIGhhdmUgYSBzaXplIGVxdWFsIHRvIHRoZSBkaXNrIGJsb2NrIHNpemUuCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX0JMT0NLX1NJWkUpCi1pbnQgeGZzX2lub2J0X2Jsb2NrX3NpemUoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lCVhGU19JTk9CVF9CTE9DS19TSVpFKGxldixjdXIpCXhmc19pbm9idF9ibG9ja19zaXplKGxldixjdXIpCi0jZWxzZQogI2RlZmluZQlYRlNfSU5PQlRfQkxPQ0tfU0laRShsZXYsY3VyKQkoMSA8PCAoY3VyKS0+YmNfYmxvY2tsb2cpCi0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUykKLWludCB4ZnNfaW5vYnRfYmxvY2tfbWF4cmVjcyhpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKLSNkZWZpbmUJWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MobGV2LGN1cikJeGZzX2lub2J0X2Jsb2NrX21heHJlY3MobGV2LGN1cikKLSNlbHNlCi0jZGVmaW5lCVhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldixjdXIpCVwKLQkoKGN1ciktPmJjX21wLT5tX2lub2J0X214cltsZXYgIT0gMF0pCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MpCi1pbnQgeGZzX2lub2J0X2Jsb2NrX21pbnJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lCVhGU19JTk9CVF9CTE9DS19NSU5SRUNTKGxldixjdXIpCXhmc19pbm9idF9ibG9ja19taW5yZWNzKGxldixjdXIpCi0jZWxzZQotI2RlZmluZQlYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXYsY3VyKQlcCi0JKChjdXIpLT5iY19tcC0+bV9pbm9idF9tbnJbbGV2ICE9IDBdKQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX0lTX0xBU1RfUkVDKQotaW50IHhmc19pbm9idF9pc19sYXN0X3JlYyhzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKLSNkZWZpbmUJWEZTX0lOT0JUX0lTX0xBU1RfUkVDKGN1cikJeGZzX2lub2J0X2lzX2xhc3RfcmVjKGN1cikKLSNlbHNlCisjZGVmaW5lCVhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldixjdXIpICgoY3VyKS0+YmNfbXAtPm1faW5vYnRfbXhyW2xldiAhPSAwXSkKKyNkZWZpbmUJWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2LGN1cikgKChjdXIpLT5iY19tcC0+bV9pbm9idF9tbnJbbGV2ICE9IDBdKQogI2RlZmluZQlYRlNfSU5PQlRfSVNfTEFTVF9SRUMoY3VyKQlcCi0JKChjdXIpLT5iY19wdHJzWzBdID09IFwKLQkJSU5UX0dFVChYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKChjdXIpLT5iY19idWZzWzBdKS0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKLSNlbmRpZgorCSgoY3VyKS0+YmNfcHRyc1swXSA9PSBiZTE2X3RvX2NwdShYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKChjdXIpLT5iY19idWZzWzBdKS0+YmJfbnVtcmVjcykpCiAKIC8qCiAgKiBNYXhpbXVtIG51bWJlciBvZiBpbm9kZSBidHJlZSBsZXZlbHMuCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOX01BWExFVkVMUykKLWludCB4ZnNfaW5fbWF4bGV2ZWxzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKLSNkZWZpbmUJWEZTX0lOX01BWExFVkVMUyhtcCkJCXhmc19pbl9tYXhsZXZlbHMobXApCi0jZWxzZQogI2RlZmluZQlYRlNfSU5fTUFYTEVWRUxTKG1wKQkJKChtcCktPm1faW5fbWF4bGV2ZWxzKQotI2VuZGlmCiAKIC8qCiAgKiBibG9jayBudW1iZXJzIGluIHRoZSBBRy4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUJUX0JMT0NLKQoteGZzX2FnYmxvY2tfdCB4ZnNfaWJ0X2Jsb2NrKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKLSNkZWZpbmUJWEZTX0lCVF9CTE9DSyhtcCkJCXhmc19pYnRfYmxvY2sobXApCi0jZWxzZQotI2RlZmluZQlYRlNfSUJUX0JMT0NLKG1wKQkoKHhmc19hZ2Jsb2NrX3QpKFhGU19DTlRfQkxPQ0sobXApICsgMSkpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1BSRUFMTE9DX0JMT0NLUykKLXhmc19hZ2Jsb2NrX3QgeGZzX3ByZWFsbG9jX2Jsb2NrcyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19QUkVBTExPQ19CTE9DS1MobXApCQl4ZnNfcHJlYWxsb2NfYmxvY2tzKG1wKQotI2Vsc2UKLSNkZWZpbmUJWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCkJKCh4ZnNfYWdibG9ja190KShYRlNfSUJUX0JMT0NLKG1wKSArIDEpKQotI2VuZGlmCisjZGVmaW5lCVhGU19JQlRfQkxPQ0sobXApCQkoKHhmc19hZ2Jsb2NrX3QpKFhGU19DTlRfQkxPQ0sobXApICsgMSkpCisjZGVmaW5lCVhGU19QUkVBTExPQ19CTE9DS1MobXApCQkoKHhmc19hZ2Jsb2NrX3QpKFhGU19JQlRfQkxPQ0sobXApICsgMSkpCiAKIC8qCiAgKiBSZWNvcmQsIGtleSwgYW5kIHBvaW50ZXIgYWRkcmVzcyBtYWNyb3MgZm9yIGJ0cmVlIGJsb2Nrcy4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfUkVDX0FERFIpCi14ZnNfaW5vYnRfcmVjX3QgKgoteGZzX2lub2J0X3JlY19hZGRyKHhmc19pbm9idF9ibG9ja190ICpiYiwgaW50IGksIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOwotI2RlZmluZQlYRlNfSU5PQlRfUkVDX0FERFIoYmIsaSxjdXIpCXhmc19pbm9idF9yZWNfYWRkcihiYixpLGN1cikKLSNlbHNlCi0jZGVmaW5lCVhGU19JTk9CVF9SRUNfQUREUihiYixpLGN1cikJXAotCVhGU19CVFJFRV9SRUNfQUREUihYRlNfSU5PQlRfQkxPQ0tfU0laRSgwLGN1ciksIHhmc19pbm9idCwgYmIsIGksIFwKLQkJWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MoMCwgY3VyKSkKLSNlbmRpZgorI2RlZmluZSBYRlNfSU5PQlRfUkVDX0FERFIoYmIsaSxjdXIpIFwKKwkoWEZTX0JUUkVFX1JFQ19BRERSKFhGU19JTk9CVF9CTE9DS19TSVpFKDAsY3VyKSwgeGZzX2lub2J0LCBiYiwgXAorCQkJCWksIFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKDAsIGN1cikpKQorI2RlZmluZQlYRlNfSU5PQlRfS0VZX0FERFIoYmIsaSxjdXIpIFwKKwkoWEZTX0JUUkVFX0tFWV9BRERSKFhGU19JTk9CVF9CTE9DS19TSVpFKDEsY3VyKSwgeGZzX2lub2J0LCBiYiwgXAorCQkJCWksIFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKDEsIGN1cikpKQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9CVF9LRVlfQUREUikKLXhmc19pbm9idF9rZXlfdCAqCi14ZnNfaW5vYnRfa2V5X2FkZHIoeGZzX2lub2J0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7Ci0jZGVmaW5lCVhGU19JTk9CVF9LRVlfQUREUihiYixpLGN1cikJeGZzX2lub2J0X2tleV9hZGRyKGJiLGksY3VyKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0lOT0JUX0tFWV9BRERSKGJiLGksY3VyKQlcCi0JWEZTX0JUUkVFX0tFWV9BRERSKFhGU19JTk9CVF9CTE9DS19TSVpFKDEsY3VyKSwgeGZzX2lub2J0LCBiYiwgaSwgXAotCQlYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUygxLCBjdXIpKQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX1BUUl9BRERSKQoteGZzX2lub2J0X3B0cl90ICoKLXhmc19pbm9idF9wdHJfYWRkcih4ZnNfaW5vYnRfYmxvY2tfdCAqYmIsIGludCBpLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKLSNkZWZpbmUJWEZTX0lOT0JUX1BUUl9BRERSKGJiLGksY3VyKQl4ZnNfaW5vYnRfcHRyX2FkZHIoYmIsaSxjdXIpCi0jZWxzZQotI2RlZmluZQlYRlNfSU5PQlRfUFRSX0FERFIoYmIsaSxjdXIpCVwKLQlYRlNfQlRSRUVfUFRSX0FERFIoWEZTX0lOT0JUX0JMT0NLX1NJWkUoMSxjdXIpLCB4ZnNfaW5vYnQsIGJiLCBpLCBcCi0JCVhGU19JTk9CVF9CTE9DS19NQVhSRUNTKDEsIGN1cikpCi0jZW5kaWYKLQotLyoKLSAqIFByb3RvdHlwZXMgZm9yIGV4dGVybmFsbHkgdmlzaWJsZSByb3V0aW5lcy4KLSAqLworI2RlZmluZQlYRlNfSU5PQlRfUFRSX0FERFIoYmIsaSxjdXIpIFwKKwkoWEZTX0JUUkVFX1BUUl9BRERSKFhGU19JTk9CVF9CTE9DS19TSVpFKDEsY3VyKSwgeGZzX2lub2J0LCBiYiwgXAorCQkJCWksIFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKDEsIGN1cikpKQogCiAvKgogICogRGVjcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KICAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KICAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X2RlY3JlbWVudCgKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUsIDAgaXMgbGVhZiAqLwotCWludAkJCSpzdGF0KTsgLyogc3VjY2Vzcy9mYWlsdXJlICovCitleHRlcm4gaW50IHhmc19pbm9idF9kZWNyZW1lbnQoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgaW50IGxldmVsLCBpbnQgKnN0YXQpOwogCiAvKgogICogRGVsZXRlIHRoZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIuCiAgKiBUaGUgY3Vyc29yIHJlZmVycyB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIHJlY29yZCB3YXMgKGNvdWxkIGJlIGluc2VydGVkKQogICogd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMuCiAgKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19pbm9idF9kZWxldGUoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK2V4dGVybiBpbnQgeGZzX2lub2J0X2RlbGV0ZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCBpbnQgKnN0YXQpOwogCiAvKgogICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIHBvaW50ZWQtdG8gcmVjb3JkLgogICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfZ2V0X3JlYygKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYWdpbm9fdAkJKmlubywJLyogb3V0cHV0OiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLwotCV9faW50MzJfdAkJKmZjbnQsCS8qIG91dHB1dDogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCi0JeGZzX2lub2ZyZWVfdAkJKmZyZWUsCS8qIG91dHB1dDogZnJlZSBpbm9kZSBtYXNrICovCi0JaW50CQkJKnN0YXQpOwkvKiBvdXRwdXQ6IHN1Y2Nlc3MvZmFpbHVyZSAqLworZXh0ZXJuIGludCB4ZnNfaW5vYnRfZ2V0X3JlYyhzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCB4ZnNfYWdpbm9fdCAqaW5vLAorCQkJICAgICBfX2ludDMyX3QgKmZjbnQsIHhmc19pbm9mcmVlX3QgKmZyZWUsIGludCAqc3RhdCk7CiAKIC8qCiAgKiBJbmNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgogICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgogICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfaW5jcmVtZW50KAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSwgMCBpcyBsZWFmICovCi0JaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK2V4dGVybiBpbnQgeGZzX2lub2J0X2luY3JlbWVudChzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCBpbnQgbGV2ZWwsIGludCAqc3RhdCk7CiAKIC8qCiAgKiBJbnNlcnQgdGhlIGN1cnJlbnQgcmVjb3JkIGF0IHRoZSBwb2ludCByZWZlcmVuY2VkIGJ5IGN1ci4KICAqIFRoZSBjdXJzb3IgbWF5IGJlIGluY29uc2lzdGVudCBvbiByZXR1cm4gaWYgc3BsaXRzIGhhdmUgYmVlbiBkb25lLgogICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfaW5zZXJ0KAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCitleHRlcm4gaW50IHhmc19pbm9idF9pbnNlcnQoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgaW50ICpzdGF0KTsKIAogLyoKICAqIExvb2t1cCB0aGUgcmVjb3JkIGVxdWFsIHRvIGlubyBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgogICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfbG9va3VwX2VxKAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19hZ2lub190CQlpbm8sCS8qIHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCi0JX19pbnQzMl90CQlmY250LAkvKiBmcmVlIGlub2RlIGNvdW50ICovCi0JeGZzX2lub2ZyZWVfdAkJZnJlZSwJLyogZnJlZSBpbm9kZSBtYXNrICovCi0JaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK2V4dGVybiBpbnQgeGZzX2lub2J0X2xvb2t1cF9lcShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCB4ZnNfYWdpbm9fdCBpbm8sCisJCQkJX19pbnQzMl90IGZjbnQsIHhmc19pbm9mcmVlX3QgZnJlZSwgaW50ICpzdGF0KTsKIAogLyoKICAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBpbm8KICAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCiAgKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19pbm9idF9sb29rdXBfZ2UoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2FnaW5vX3QJCWlubywJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KLQlfX2ludDMyX3QJCWZjbnQsCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KLQl4ZnNfaW5vZnJlZV90CQlmcmVlLAkvKiBmcmVlIGlub2RlIG1hc2sgKi8KLQlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworZXh0ZXJuIGludCB4ZnNfaW5vYnRfbG9va3VwX2dlKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19hZ2lub190IGlubywKKwkJCQlfX2ludDMyX3QgZmNudCwJeGZzX2lub2ZyZWVfdCBmcmVlLCBpbnQgKnN0YXQpOwogCiAvKgogICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGlubwogICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KICAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X2xvb2t1cF9sZSgKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYWdpbm9fdAkJaW5vLAkvKiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLwotCV9faW50MzJfdAkJZmNudCwJLyogZnJlZSBpbm9kZSBjb3VudCAqLwotCXhmc19pbm9mcmVlX3QJCWZyZWUsCS8qIGZyZWUgaW5vZGUgbWFzayAqLwotCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCitleHRlcm4gaW50IHhmc19pbm9idF9sb29rdXBfbGUoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgeGZzX2FnaW5vX3QgaW5vLAorCQkJCV9faW50MzJfdCBmY250LAl4ZnNfaW5vZnJlZV90IGZyZWUsIGludCAqc3RhdCk7CiAKIC8qCiAgKiBVcGRhdGUgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBjdXIsIHRvIHRoZSB2YWx1ZSBnaXZlbgogICogYnkgW2lubywgZmNudCwgZnJlZV0uCiAgKiBUaGlzIGVpdGhlciB3b3JrcyAocmV0dXJuIDApIG9yIGdldHMgYW4gRUZTQ09SUlVQVEVEIGVycm9yLgogICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfdXBkYXRlKAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19hZ2lub190CQlpbm8sCS8qIHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCi0JX19pbnQzMl90CQlmY250LAkvKiBmcmVlIGlub2RlIGNvdW50ICovCi0JeGZzX2lub2ZyZWVfdAkJZnJlZSk7CS8qIGZyZWUgaW5vZGUgbWFzayAqLworZXh0ZXJuIGludCB4ZnNfaW5vYnRfdXBkYXRlKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19hZ2lub190IGlubywKKwkJCQlfX2ludDMyX3QgZmNudCwgeGZzX2lub2ZyZWVfdCBmcmVlKTsKIAogI2VuZGlmCS8qIF9fWEZTX0lBTExPQ19CVFJFRV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWdldC5jIGIvZnMveGZzL3hmc19pZ2V0LmMKaW5kZXggMGQ5YWU4Zi4uZmMxOWVlZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pZ2V0LmMKKysrIGIvZnMveGZzL3hmc19pZ2V0LmMKQEAgLTEsNDMgKzEsMjYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KICNpbmNsdWRlICJ4ZnMuaCIKLQotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKQEAgLTQ1LDE5ICsyOCwxOCBAQAogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgogI2luY2x1ZGUgInhmc191dGlscy5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKIAogLyoKICAqIEluaXRpYWxpemUgdGhlIGlub2RlIGhhc2ggdGFibGUgZm9yIHRoZSBuZXdseSBtb3VudGVkIGZpbGUgc3lzdGVtLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbWFwLmggYi9mcy94ZnMveGZzX2ltYXAuaAppbmRleCBlMzg1MDY0Li5kMzY0NTAwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2ltYXAuaAorKysgYi9mcy94ZnMveGZzX2ltYXAuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfSU1BUF9IX18KICNkZWZpbmUJX19YRlNfSU1BUF9IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuYyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwppbmRleCBkYjQzMzA4Li5kZjBkNDU3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZS5jCkBAIC0xLDQwICsxLDI3IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW1hcC5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCkBAIC00MywyNCArMzAsMjIgQEAKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pbWFwLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCi0jaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc191dGlscy5oIgogI2luY2x1ZGUgInhmc19kaXIyX3RyYWNlLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCkBAIC0xOTQsOSArMTc5LDEwIEBACiAJaWYgKChpbWFwLmltX2Jsa25vICsgaW1hcC5pbV9sZW4pID4KIAkgICAgWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fc2Iuc2JfZGJsb2NrcykpIHsKIAkJY21uX2VycihDRV9XQVJOLAotCSJ4ZnNfaW5vdG9icDogaW5vZGUgbnVtYmVyICglZCArICVkKSBtYXBzIHRvIGEgYmxvY2sgb3V0c2lkZSB0aGUgYm91bmRzICIKKwkieGZzX2lub3RvYnA6IGlub2RlIG51bWJlciAoJWxsdSArICVkKSBtYXBzIHRvIGEgYmxvY2sgb3V0c2lkZSB0aGUgYm91bmRzICIKIAkib2YgdGhlIGZpbGUgc3lzdGVtICVzLiAgUmV0dXJuaW5nIEVJTlZBTC4iLAotCQkJaW1hcC5pbV9ibGtubywgaW1hcC5pbV9sZW4sbXAtPm1fZnNuYW1lKTsKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW1hcC5pbV9ibGtubywKKwkJCWltYXAuaW1fbGVuLCBtcC0+bV9mc25hbWUpOwogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAJfQogCkBAIC0xODc4LDggKzE4NjQsOCBAQAogCSAqLwogCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnaWJwKTsKIAlhZ2lfb2sgPQotCQlJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0lfTUFHSUMgJiYKLQkJWEZTX0FHSV9HT09EX1ZFUlNJT04oSU5UX0dFVChhZ2ktPmFnaV92ZXJzaW9ubnVtLCBBUkNIX0NPTlZFUlQpKTsKKwkJYmUzMl90b19jcHUoYWdpLT5hZ2lfbWFnaWNudW0pID09IFhGU19BR0lfTUFHSUMgJiYKKwkJWEZTX0FHSV9HT09EX1ZFUlNJT04oYmUzMl90b19jcHUoYWdpLT5hZ2lfdmVyc2lvbm51bSkpOwogCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighYWdpX29rLCBtcCwgWEZTX0VSUlRBR19JVU5MSU5LLAogCQkJWEZTX1JBTkRPTV9JVU5MSU5LKSkpIHsKIAkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pdW5saW5rIiwgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGFnaSk7CkBAIC0xODk0LDkgKzE4ODAsOSBAQAogCUFTU0VSVChhZ2lubyAhPSAwKTsKIAlidWNrZXRfaW5kZXggPSBhZ2lubyAlIFhGU19BR0lfVU5MSU5LRURfQlVDS0VUUzsKIAlBU1NFUlQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSk7Ci0JQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSwgQVJDSF9DT05WRVJUKSAhPSBhZ2lubyk7CisJQVNTRVJUKGJlMzJfdG9fY3B1KGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0pICE9IGFnaW5vKTsKIAotCWlmIChJTlRfR0VUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0sIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHSU5PKSB7CisJaWYgKGJlMzJfdG9fY3B1KGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0pICE9IE5VTExBR0lOTykgewogCQkvKgogCQkgKiBUaGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgaW5vZGUgaW4gdGhlIGJ1Y2tldCB3ZSBuZWVkCiAJCSAqIHRvIGFkZCBvdXJzZWx2ZXMgdG8uICBBZGQgdXMgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0LgpAQCAtMTkyMyw3ICsxOTA5LDcgQEAKIAkgKiBQb2ludCB0aGUgYnVja2V0IGhlYWQgcG9pbnRlciBhdCB0aGUgaW5vZGUgYmVpbmcgaW5zZXJ0ZWQuCiAJICovCiAJQVNTRVJUKGFnaW5vICE9IDApOwotCUlOVF9TRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSwgQVJDSF9DT05WRVJULCBhZ2lubyk7CisJYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSA9IGNwdV90b19iZTMyKGFnaW5vKTsKIAlvZmZzZXQgPSBvZmZzZXRvZih4ZnNfYWdpX3QsIGFnaV91bmxpbmtlZCkgKwogCQkoc2l6ZW9mKHhmc19hZ2lub190KSAqIGJ1Y2tldF9pbmRleCk7CiAJeGZzX3RyYW5zX2xvZ19idWYodHAsIGFnaWJwLCBvZmZzZXQsCkBAIC0xOTgxLDggKzE5NjcsOCBAQAogCSAqLwogCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnaWJwKTsKIAlhZ2lfb2sgPQotCQlJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0lfTUFHSUMgJiYKLQkJWEZTX0FHSV9HT09EX1ZFUlNJT04oSU5UX0dFVChhZ2ktPmFnaV92ZXJzaW9ubnVtLCBBUkNIX0NPTlZFUlQpKTsKKwkJYmUzMl90b19jcHUoYWdpLT5hZ2lfbWFnaWNudW0pID09IFhGU19BR0lfTUFHSUMgJiYKKwkJWEZTX0FHSV9HT09EX1ZFUlNJT04oYmUzMl90b19jcHUoYWdpLT5hZ2lfdmVyc2lvbm51bSkpOwogCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighYWdpX29rLCBtcCwgWEZTX0VSUlRBR19JVU5MSU5LX1JFTU9WRSwKIAkJCVhGU19SQU5ET01fSVVOTElOS19SRU1PVkUpKSkgewogCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2l1bmxpbmtfcmVtb3ZlIiwgWEZTX0VSUkxFVkVMX0xPVywKQEAgLTIwMDAsMTAgKzE5ODYsMTAgQEAKIAlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubyk7CiAJQVNTRVJUKGFnaW5vICE9IDApOwogCWJ1Y2tldF9pbmRleCA9IGFnaW5vICUgWEZTX0FHSV9VTkxJTktFRF9CVUNLRVRTOwotCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0sIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHSU5PKTsKKwlBU1NFUlQoYmUzMl90b19jcHUoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSkgIT0gTlVMTEFHSU5PKTsKIAlBU1NFUlQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSk7CiAKLQlpZiAoSU5UX0dFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdLCBBUkNIX0NPTlZFUlQpID09IGFnaW5vKSB7CisJaWYgKGJlMzJfdG9fY3B1KGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0pID09IGFnaW5vKSB7CiAJCS8qCiAJCSAqIFdlJ3JlIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAgR2V0IHRoZSBpbm9kZSdzCiAJCSAqIG9uLWRpc2sgYnVmZmVyIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnlvbmUgYWZ0ZXIgdXMKQEAgLTIwMzcsNyArMjAyMyw3IEBACiAJCSAqLwogCQlBU1NFUlQobmV4dF9hZ2lubyAhPSAwKTsKIAkJQVNTRVJUKG5leHRfYWdpbm8gIT0gYWdpbm8pOwotCQlJTlRfU0VUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0sIEFSQ0hfQ09OVkVSVCwgbmV4dF9hZ2lubyk7CisJCWFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0gPSBjcHVfdG9fYmUzMihuZXh0X2FnaW5vKTsKIAkJb2Zmc2V0ID0gb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfdW5saW5rZWQpICsKIAkJCShzaXplb2YoeGZzX2FnaW5vX3QpICogYnVja2V0X2luZGV4KTsKIAkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGFnaWJwLCBvZmZzZXQsCkBAIC0yMDQ2LDcgKzIwMzIsNyBAQAogCQkvKgogCQkgKiBXZSBuZWVkIHRvIHNlYXJjaCB0aGUgbGlzdCBmb3IgdGhlIGlub2RlIGJlaW5nIGZyZWVkLgogCQkgKi8KLQkJbmV4dF9hZ2lubyA9IElOVF9HRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSwgQVJDSF9DT05WRVJUKTsKKwkJbmV4dF9hZ2lubyA9IGJlMzJfdG9fY3B1KGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0pOwogCQlsYXN0X2licCA9IE5VTEw7CiAJCXdoaWxlIChuZXh0X2FnaW5vICE9IGFnaW5vKSB7CiAJCQkvKgpAQCAtMzY4Nyw3MyArMzY3Myw2IEBACiAJcmV0dXJuKCAwICk7CiB9CiAKLS8qCi0gKiBDaGFuZ2UgdGhlIHJlcXVlc3RlZCB0aW1lc3RhbXAgaW4gdGhlIGdpdmVuIGlub2RlLgotICogV2UgZG9uJ3QgbG9jayBhY3Jvc3MgdGltZXN0YW1wIHVwZGF0ZXMsIGFuZCB3ZSBkb24ndCBsb2cgdGhlbSBidXQKLSAqIHdlIGRvIHJlY29yZCB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzIGRpcnR5IGluZm9ybWF0aW9uIGluIGNvcmUuCi0gKgotICogTk9URSAtLSBjYWxsZXJzIE1VU1QgY29tYmluZSBYRlNfSUNIR1RJTUVfTU9EIG9yIFhGU19JQ0hHVElNRV9DSEcKLSAqCQl3aXRoIFhGU19JQ0hHVElNRV9BQ0MgdG8gYmUgc3VyZSB0aGF0IGFjY2VzcyB0aW1lCi0gKgkJdXBkYXRlIHdpbGwgdGFrZS4gIENhbGxpbmcgZmlyc3Qgd2l0aCBYRlNfSUNIR1RJTUVfQUNDCi0gKgkJYW5kIHRoZW4gWEZTX0lDSEdUSU1FX01PRCBtYXkgZmFpbCB0byBtb2RpZnkgdGhlIGFjY2VzcwotICoJCXRpbWVzdGFtcCBpZiB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkIG5vYWNjdG0uCi0gKi8KLXZvaWQKLXhmc19pY2hndGltZSh4ZnNfaW5vZGVfdCAqaXAsCi0JICAgICBpbnQgZmxhZ3MpCi17Ci0JdGltZXNwZWNfdAl0djsKLQl2bm9kZV90CQkqdnAgPSBYRlNfSVRPVihpcCk7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOwotCi0JLyoKLQkgKiBXZSdyZSBub3Qgc3VwcG9zZWQgdG8gY2hhbmdlIHRpbWVzdGFtcHMgaW4gcmVhZG9ubHktbW91bnRlZAotCSAqIGZpbGVzeXN0ZW1zLiAgVGhyb3cgaXQgYXdheSBpZiBhbnlvbmUgYXNrcyB1cy4KLQkgKi8KLQlpZiAodW5saWtlbHkodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBEb24ndCB1cGRhdGUgYWNjZXNzIHRpbWVzdGFtcHMgb24gcmVhZHMgaWYgbW91bnRlZCAibm9hdGltZSIKLQkgKiBUaHJvdyBpdCBhd2F5IGlmIGFueW9uZSBhc2tzIHVzLgotCSAqLwotCWlmICgoaXAtPmlfbW91bnQtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9BVElNRSB8fCBJU19OT0FUSU1FKGlub2RlKSkgJiYKLQkgICAgKChmbGFncyAmIChYRlNfSUNIR1RJTUVfQUNDfFhGU19JQ0hHVElNRV9NT0R8WEZTX0lDSEdUSU1FX0NIRykpCi0JCQk9PSBYRlNfSUNIR1RJTUVfQUNDKSkKLQkJcmV0dXJuOwotCi0JbmFub3RpbWUoJnR2KTsKLQlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfTU9EKSB7Ci0JCVZOX01USU1FU0VUKHZwLCAmdHYpOwotCQlpcC0+aV9kLmRpX210aW1lLnRfc2VjID0gKF9faW50MzJfdCl0di50dl9zZWM7Ci0JCWlwLT5pX2QuZGlfbXRpbWUudF9uc2VjID0gKF9faW50MzJfdCl0di50dl9uc2VjOwotCX0KLQlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfQUNDKSB7Ci0JCVZOX0FUSU1FU0VUKHZwLCAmdHYpOwotCQlpcC0+aV9kLmRpX2F0aW1lLnRfc2VjID0gKF9faW50MzJfdCl0di50dl9zZWM7Ci0JCWlwLT5pX2QuZGlfYXRpbWUudF9uc2VjID0gKF9faW50MzJfdCl0di50dl9uc2VjOwotCX0KLQlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfQ0hHKSB7Ci0JCVZOX0NUSU1FU0VUKHZwLCAmdHYpOwotCQlpcC0+aV9kLmRpX2N0aW1lLnRfc2VjID0gKF9faW50MzJfdCl0di50dl9zZWM7Ci0JCWlwLT5pX2QuZGlfY3RpbWUudF9uc2VjID0gKF9faW50MzJfdCl0di50dl9uc2VjOwotCX0KLQotCS8qCi0JICogV2UgdXBkYXRlIHRoZSBpX3VwZGF0ZV9jb3JlIGZpZWxkIF9hZnRlcl8gY2hhbmdpbmcKLQkgKiB0aGUgdGltZXN0YW1wcyBpbiBvcmRlciB0byBjb29yZGluYXRlIHByb3Blcmx5IHdpdGgKLQkgKiB4ZnNfaWZsdXNoKCkgc28gdGhhdCB3ZSBkb24ndCBsb3NlIHRpbWVzdGFtcCB1cGRhdGVzLgotCSAqIFRoaXMga2VlcHMgdXMgZnJvbSBoYXZpbmcgdG8gaG9sZCB0aGUgaW5vZGUgbG9jawotCSAqIHdoaWxlIGRvaW5nIHRoaXMuICBXZSB1c2UgdGhlIFNZTkNIUk9OSVpFIG1hY3JvIHRvCi0JICogZW5zdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHJlb3JkZXIgdGhlIHVwZGF0ZQotCSAqIG9mIGlfdXBkYXRlX2NvcmUgYWJvdmUgdGhlIHRpbWVzdGFtcCB1cGRhdGVzIGFib3ZlLgotCSAqLwotCVNZTkNIUk9OSVpFKCk7Ci0JaXAtPmlfdXBkYXRlX2NvcmUgPSAxOwotCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9MT0NLKSkKLQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKLX0KLQogI2lmZGVmIFhGU19JTE9DS19UUkFDRQoga3RyYWNlX3QJKnhmc19pbG9ja190cmFjZV9idWY7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuaCBiL2ZzL3hmcy94ZnNfaW5vZGUuaAppbmRleCA1NGQ5ZTU0Li4xMjRkMzBlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmgKKysrIGIvZnMveGZzL3hmc19pbm9kZS5oCkBAIC0xLDM4ICsxLDMwIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYJX19YRlNfSU5PREVfSF9fCiAjZGVmaW5lCV9fWEZTX0lOT0RFX0hfXwogCiAvKgorICogRm9yayBpZGVudGlmaWVycy4KKyAqLworI2RlZmluZQlYRlNfREFUQV9GT1JLCTAKKyNkZWZpbmUJWEZTX0FUVFJfRk9SSwkxCisKKy8qCiAgKiBGaWxlIGluY29yZSBleHRlbnQgaW5mb3JtYXRpb24sIHByZXNlbnQgZm9yIGVhY2ggb2YgZGF0YSAmIGF0dHIgZm9ya3MuCiAgKi8KICNkZWZpbmUJWEZTX0lOTElORV9FWFRTCTIKQEAgLTEwNywyNCArOTksNiBAQAogI2RlZmluZQl4ZnNfaWxvY2tfdHJhY2UoaSxuLGYscmEpCiAjZW5kaWYKIAotLyoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2hpY2ggZXh0ZW50cyBvZiBhIGZpbGUKLSAqIHdlcmUgaG9sZXMgd2hlbiBhIHdyaXRlIHN0YXJ0ZWQgZnJvbSB4ZnNfd3JpdGVfZmlsZSgpIHRvCi0gKiB4ZnNfc3RyYXRfcmVhZCgpLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB3ZSBjYW4ga25vdyB3aGljaAotICogYmxvY2tzIG5lZWQgdG8gYmUgemVyb2VkIHdoZW4gdGhleSBhcmUgcmVhZCBpbiBpbiB4ZnNfc3RyYXRfcmVhZCgpCi0gKiBpZiB0aGV5IHdlcmVuXCd0IGFsbG9jYXRlZCB3aGVuIHRoZSBidWZmZXIgZ2l2ZW4gdG8geGZzX3N0cmF0X3JlYWQoKQotICogd2FzIG1hcHBlZC4KLSAqCi0gKiBXZSBrZWVwIGEgbGlzdCBvZiB0aGVzZSBhdHRhY2hlZCB0byB0aGUgaW5vZGUuICBUaGUgbGlzdCBpcwotICogcHJvdGVjdGVkIGJ5IHRoZSBpbm9kZSBsb2NrIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSBpbyBsb2NrIGlzCi0gKiBoZWxkIGV4Y2x1c2l2ZWx5IGJ5IHdyaXRlcnMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhmc19nYXAgewotCXN0cnVjdCB4ZnNfZ2FwCSp4Z19uZXh0OwotCXhmc19maWxlb2ZmX3QJeGdfb2Zmc2V0X2ZzYjsKLQl4ZnNfZXh0bGVuX3QJeGdfY291bnRfZnNiOwotfSB4ZnNfZ2FwX3Q7Ci0KIHR5cGVkZWYgc3RydWN0IGRtX2F0dHJzX3MgewogCV9fdWludDMyX3QJZGFfZG1ldm1hc2s7CS8qIERNSUcgZXZlbnQgbWFzayAqLwogCV9fdWludDE2X3QJZGFfZG1zdGF0ZTsJLyogRE1JRyBzdGF0ZSBpbmZvICovCkBAIC0zMTEsNjAgKzI4NSwxNiBAQAogLyoKICAqIEZvcmsgaGFuZGxpbmcuCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX1BUUikKLXhmc19pZm9ya190ICp4ZnNfaWZvcmtfcHRyKHhmc19pbm9kZV90ICppcCwgaW50IHcpOwotI2RlZmluZQlYRlNfSUZPUktfUFRSKGlwLHcpCQl4ZnNfaWZvcmtfcHRyKGlwLHcpCi0jZWxzZQotI2RlZmluZQlYRlNfSUZPUktfUFRSKGlwLHcpICAgKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gJihpcCktPmlfZGYgOiAoaXApLT5pX2FmcCkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUZPUktfUSkKLWludCB4ZnNfaWZvcmtfcSh4ZnNfaW5vZGVfdCAqaXApOwotI2RlZmluZQlYRlNfSUZPUktfUShpcCkJCQl4ZnNfaWZvcmtfcShpcCkKLSNlbHNlCisjZGVmaW5lCVhGU19JRk9SS19QVFIoaXAsdykJCVwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyAmKGlwKS0+aV9kZiA6IChpcCktPmlfYWZwKQogI2RlZmluZQlYRlNfSUZPUktfUShpcCkJCQlYRlNfQ0ZPUktfUSgmKGlwKS0+aV9kKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JRk9SS19EU0laRSkKLWludCB4ZnNfaWZvcmtfZHNpemUoeGZzX2lub2RlX3QgKmlwKTsKLSNkZWZpbmUJWEZTX0lGT1JLX0RTSVpFKGlwKQkJeGZzX2lmb3JrX2RzaXplKGlwKQotI2Vsc2UKICNkZWZpbmUJWEZTX0lGT1JLX0RTSVpFKGlwKQkJWEZTX0NGT1JLX0RTSVpFKCZpcC0+aV9kLCBpcC0+aV9tb3VudCkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUZPUktfQVNJWkUpCi1pbnQgeGZzX2lmb3JrX2FzaXplKHhmc19pbm9kZV90ICppcCk7Ci0jZGVmaW5lCVhGU19JRk9SS19BU0laRShpcCkJCXhmc19pZm9ya19hc2l6ZShpcCkKLSNlbHNlCiAjZGVmaW5lCVhGU19JRk9SS19BU0laRShpcCkJCVhGU19DRk9SS19BU0laRSgmaXAtPmlfZCwgaXAtPmlfbW91bnQpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX1NJWkUpCi1pbnQgeGZzX2lmb3JrX3NpemUoeGZzX2lub2RlX3QgKmlwLCBpbnQgdyk7Ci0jZGVmaW5lCVhGU19JRk9SS19TSVpFKGlwLHcpCQl4ZnNfaWZvcmtfc2l6ZShpcCx3KQotI2Vsc2UKICNkZWZpbmUJWEZTX0lGT1JLX1NJWkUoaXAsdykJCVhGU19DRk9SS19TSVpFKCZpcC0+aV9kLCBpcC0+aV9tb3VudCwgdykKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUZPUktfRk9STUFUKQotaW50IHhmc19pZm9ya19mb3JtYXQoeGZzX2lub2RlX3QgKmlwLCBpbnQgdyk7Ci0jZGVmaW5lCVhGU19JRk9SS19GT1JNQVQoaXAsdykJCXhmc19pZm9ya19mb3JtYXQoaXAsdykKLSNlbHNlCiAjZGVmaW5lCVhGU19JRk9SS19GT1JNQVQoaXAsdykJCVhGU19DRk9SS19GT1JNQVQoJmlwLT5pX2QsIHcpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX0ZNVF9TRVQpCi12b2lkIHhmc19pZm9ya19mbXRfc2V0KHhmc19pbm9kZV90ICppcCwgaW50IHcsIGludCBuKTsKLSNkZWZpbmUJWEZTX0lGT1JLX0ZNVF9TRVQoaXAsdyxuKQl4ZnNfaWZvcmtfZm10X3NldChpcCx3LG4pCi0jZWxzZQogI2RlZmluZQlYRlNfSUZPUktfRk1UX1NFVChpcCx3LG4pCVhGU19DRk9SS19GTVRfU0VUKCZpcC0+aV9kLCB3LCBuKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JRk9SS19ORVhURU5UUykKLWludCB4ZnNfaWZvcmtfbmV4dGVudHMoeGZzX2lub2RlX3QgKmlwLCBpbnQgdyk7Ci0jZGVmaW5lCVhGU19JRk9SS19ORVhURU5UUyhpcCx3KQl4ZnNfaWZvcmtfbmV4dGVudHMoaXAsdykKLSNlbHNlCiAjZGVmaW5lCVhGU19JRk9SS19ORVhURU5UUyhpcCx3KQlYRlNfQ0ZPUktfTkVYVEVOVFMoJmlwLT5pX2QsIHcpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX05FWFRfU0VUKQotdm9pZCB4ZnNfaWZvcmtfbmV4dF9zZXQoeGZzX2lub2RlX3QgKmlwLCBpbnQgdywgaW50IG4pOwotI2RlZmluZQlYRlNfSUZPUktfTkVYVF9TRVQoaXAsdyxuKQl4ZnNfaWZvcmtfbmV4dF9zZXQoaXAsdyxuKQotI2Vsc2UKICNkZWZpbmUJWEZTX0lGT1JLX05FWFRfU0VUKGlwLHcsbikJWEZTX0NGT1JLX05FWFRfU0VUKCZpcC0+aV9kLCB3LCBuKQotI2VuZGlmCiAKIAogI2lmZGVmIF9fS0VSTkVMX18KQEAgLTM4OCw2ICszMTgsNyBAQAogI2RlZmluZQlYRlNfSUxPQ0tfRVhDTAkJMHgwMDQKICNkZWZpbmUJWEZTX0lMT0NLX1NIQVJFRAkweDAwOAogI2RlZmluZQlYRlNfSVVOTE9DS19OT05PVElGWQkweDAxMAorLyoJWEZTX0lPTE9DS19ORVNURUQJMHgwMjAgKi8KICNkZWZpbmUgWEZTX0VYVEVOVF9UT0tFTl9SRAkweDA0MAogI2RlZmluZSBYRlNfU0laRV9UT0tFTl9SRAkweDA4MAogI2RlZmluZSBYRlNfRVhUU0laRV9SRAkJKFhGU19FWFRFTlRfVE9LRU5fUkR8WEZTX1NJWkVfVE9LRU5fUkQpCkBAIC0zOTUsNyArMzI2LDcgQEAKICNkZWZpbmUgWEZTX0VYVEVOVF9UT0tFTl9XUgkoWEZTX0VYVEVOVF9UT0tFTl9SRCB8IFhGU19XSUxMTEVORCkKICNkZWZpbmUgWEZTX1NJWkVfVE9LRU5fV1IgICAgICAgKFhGU19TSVpFX1RPS0VOX1JEIHwgWEZTX1dJTExMRU5EKQogI2RlZmluZSBYRlNfRVhUU0laRV9XUgkJKFhGU19FWFRTSVpFX1JEIHwgWEZTX1dJTExMRU5EKQotCisvKglYRlNfU0laRV9UT0tFTl9XQU5UCTB4MjAwICovCiAKICNkZWZpbmUgWEZTX0xPQ0tfTUFTSwlcCiAJKFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfU0hBUkVEIHwgWEZTX0lMT0NLX0VYQ0wgfCBcCkBAIC00MTcsMjggKzM0OCwxMSBAQAogI2RlZmluZQlYRlNfSVRSVU5DX0RFRklOSVRFCTB4MQogI2RlZmluZQlYRlNfSVRSVU5DX01BWUJFCTB4MgogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JVE9WKQotc3RydWN0IHZub2RlICp4ZnNfaXRvdih4ZnNfaW5vZGVfdCAqaXApOwotI2RlZmluZQlYRlNfSVRPVihpcCkJCXhmc19pdG92KGlwKQotI2Vsc2UKICNkZWZpbmUJWEZTX0lUT1YoaXApCQlCSFZfVE9fVk5PREUoWEZTX0lUT0JIVihpcCkpCi0jZW5kaWYKICNkZWZpbmUJWEZTX0lUT1ZfTlVMTChpcCkJQkhWX1RPX1ZOT0RFX05VTEwoWEZTX0lUT0JIVihpcCkpCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JVE9CSFYpCi1zdHJ1Y3QgYmh2X2Rlc2MgKnhmc19pdG9iaHYoeGZzX2lub2RlX3QgKmlwKTsKLSNkZWZpbmUJWEZTX0lUT0JIVihpcCkJCXhmc19pdG9iaHYoaXApCi0jZWxzZQogI2RlZmluZQlYRlNfSVRPQkhWKGlwKQkJKChzdHJ1Y3QgYmh2X2Rlc2MgKikoJigoaXApLT5pX2Jodl9kZXNjKSkpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JIVlRPSSkKLXhmc19pbm9kZV90ICp4ZnNfYmh2dG9pKHN0cnVjdCBiaHZfZGVzYyAqYmh2cCk7Ci0jZGVmaW5lCVhGU19CSFZUT0koYmh2cCkJeGZzX2JodnRvaShiaHZwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0JIVlRPSShiaHZwKQlcCi0JKCh4ZnNfaW5vZGVfdCAqKSgoY2hhciAqKShiaHZwKSAtIFwKLQkJCSAoY2hhciAqKSYoKCh4ZnNfaW5vZGVfdCAqKTApLT5pX2Jodl9kZXNjKSkpCi0jZW5kaWYKLQorI2RlZmluZQlYRlNfQkhWVE9JKGJodnApCSgoeGZzX2lub2RlX3QgKikoKGNoYXIgKikoYmh2cCkgLSBcCisJCQkJKGNoYXIgKikmKCgoeGZzX2lub2RlX3QgKikwKS0+aV9iaHZfZGVzYykpKQogI2RlZmluZSBCSFZfSVNfWEZTKGJkcCkJCShCSFZfT1BTKGJkcCkgPT0gJnhmc192bm9kZW9wcykKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKaW5kZXggNTBlMmNhZC4uN2YzMzYzYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKQEAgLTEsNjYgKzEsNDYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLwotICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB4ZnNfaW5vZGVfbG9nX2l0ZW0uCi0gKiBJdCBjb250YWlucyB0aGUgaXRlbSBvcGVyYXRpb25zIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgaW5vZGUgbG9nCi0gKiBpdGVtcyBhcyB3ZWxsIGFzIHV0aWxpdHkgcm91dGluZXMgdXNlZCBieSB0aGUgaW5vZGUgc3BlY2lmaWMKLSAqIHRyYW5zYWN0aW9uIHJvdXRpbmVzLgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgotI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgotI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmggYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uaAppbmRleCBkODc3NWUwLi5jNWRiZjkzIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uaAorKysgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYJX19YRlNfSU5PREVfSVRFTV9IX18KICNkZWZpbmUJX19YRlNfSU5PREVfSVRFTV9IX18KQEAgLTE1OSwzOCArMTQ1LDMzIEBACiB9IHhmc19pbm9kZV9sb2dfaXRlbV90OwogCiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lMT0dfRkRBVEEpCi1pbnQgeGZzX2lsb2dfZmRhdGEoaW50IHcpOwogI2RlZmluZQlYRlNfSUxPR19GREFUQSh3KQl4ZnNfaWxvZ19mZGF0YSh3KQotI2Vsc2UKLSNkZWZpbmUJWEZTX0lMT0dfRkRBVEEodykJXAotCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFhGU19JTE9HX0REQVRBIDogWEZTX0lMT0dfQURBVEEpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19pbG9nX2ZkYXRhKGludCB3KQoreworCXJldHVybiAodyA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0lMT0dfRERBVEEgOiBYRlNfSUxPR19BREFUQSk7Cit9CiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lMT0dfRkJST09UKQotaW50IHhmc19pbG9nX2Zicm9vdChpbnQgdyk7CiAjZGVmaW5lCVhGU19JTE9HX0ZCUk9PVCh3KQl4ZnNfaWxvZ19mYnJvb3QodykKLSNlbHNlCi0jZGVmaW5lCVhGU19JTE9HX0ZCUk9PVCh3KQlcCi0JKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0lMT0dfREJST09UIDogWEZTX0lMT0dfQUJST09UKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTE9HX0ZFWFQpCi1pbnQgeGZzX2lsb2dfZmV4dChpbnQgdyk7CitzdGF0aWMgaW5saW5lIGludCB4ZnNfaWxvZ19mYnJvb3QoaW50IHcpCit7CisJcmV0dXJuICh3ID09IFhGU19EQVRBX0ZPUksgPyBYRlNfSUxPR19EQlJPT1QgOiBYRlNfSUxPR19BQlJPT1QpOworfQorCiAjZGVmaW5lCVhGU19JTE9HX0ZFWFQodykJeGZzX2lsb2dfZmV4dCh3KQotI2Vsc2UKLSNkZWZpbmUJWEZTX0lMT0dfRkVYVCh3KQlcCi0JKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0lMT0dfREVYVCA6IFhGU19JTE9HX0FFWFQpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19pbG9nX2ZleHQoaW50IHcpCit7CisJcmV0dXJuICh3ID09IFhGU19EQVRBX0ZPUksgPyBYRlNfSUxPR19ERVhUIDogWEZTX0lMT0dfQUVYVCk7Cit9CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLXZvaWQJeGZzX2lub2RlX2l0ZW1faW5pdChzdHJ1Y3QgeGZzX2lub2RlICosIHN0cnVjdCB4ZnNfbW91bnQgKik7Ci12b2lkCXhmc19pbm9kZV9pdGVtX2Rlc3Ryb3koc3RydWN0IHhmc19pbm9kZSAqKTsKLXZvaWQJeGZzX2lmbHVzaF9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHhmc19pbm9kZV9sb2dfaXRlbV90ICopOwotdm9pZAl4ZnNfaXN0YWxlX2RvbmUoc3RydWN0IHhmc19idWYgKiwgeGZzX2lub2RlX2xvZ19pdGVtX3QgKik7Ci12b2lkCXhmc19pZmx1c2hfYWJvcnQoc3RydWN0IHhmc19pbm9kZSAqKTsKK2V4dGVybiB2b2lkIHhmc19pbm9kZV9pdGVtX2luaXQoc3RydWN0IHhmc19pbm9kZSAqLCBzdHJ1Y3QgeGZzX21vdW50ICopOworZXh0ZXJuIHZvaWQgeGZzX2lub2RlX2l0ZW1fZGVzdHJveShzdHJ1Y3QgeGZzX2lub2RlICopOworZXh0ZXJuIHZvaWQgeGZzX2lmbHVzaF9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHhmc19pbm9kZV9sb2dfaXRlbV90ICopOworZXh0ZXJuIHZvaWQgeGZzX2lzdGFsZV9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHhmc19pbm9kZV9sb2dfaXRlbV90ICopOworZXh0ZXJuIHZvaWQgeGZzX2lmbHVzaF9hYm9ydChzdHJ1Y3QgeGZzX2lub2RlICopOwogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ludW0uaCBiL2ZzL3hmcy94ZnNfaW51bS5oCmluZGV4IGEzYWYyZDUuLjdhMjgxOTEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW51bS5oCisrKyBiL2ZzL3hmcy94ZnNfaW51bS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfSU5VTV9IX18KICNkZWZpbmUJX19YRlNfSU5VTV9IX18KQEAgLTU4LDEwOSArNDQsMzEgQEAKIAogc3RydWN0IHhmc19tb3VudDsKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX01BU0spCi1fX3VpbnQzMl90IHhmc19pbm9fbWFzayhpbnQgayk7Ci0jZGVmaW5lCVhGU19JTk9fTUFTSyhrKQkJCXhmc19pbm9fbWFzayhrKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0lOT19NQVNLKGspCSgoX191aW50MzJfdCkoKDFVTEwgPDwgKGspKSAtIDEpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fT0ZGU0VUX0JJVFMpCi1pbnQgeGZzX2lub19vZmZzZXRfYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19JTk9fT0ZGU0VUX0JJVFMobXApCQl4ZnNfaW5vX29mZnNldF9iaXRzKG1wKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0lOT19PRkZTRVRfQklUUyhtcCkJKChtcCktPm1fc2Iuc2JfaW5vcGJsb2cpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19BR0JOT19CSVRTKQotaW50IHhmc19pbm9fYWdibm9fYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19JTk9fQUdCTk9fQklUUyhtcCkJCXhmc19pbm9fYWdibm9fYml0cyhtcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19JTk9fQUdCTk9fQklUUyhtcCkJKChtcCktPm1fc2Iuc2JfYWdibGtsb2cpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19BR0lOT19CSVRTKQotaW50IHhmc19pbm9fYWdpbm9fYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19JTk9fQUdJTk9fQklUUyhtcCkJCXhmc19pbm9fYWdpbm9fYml0cyhtcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19JTk9fQUdJTk9fQklUUyhtcCkJCSgobXApLT5tX2FnaW5vX2xvZykKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX0FHTk9fQklUUykKLWludCB4ZnNfaW5vX2Fnbm9fYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19JTk9fQUdOT19CSVRTKG1wKQkJeGZzX2lub19hZ25vX2JpdHMobXApCi0jZWxzZQotI2RlZmluZQlYRlNfSU5PX0FHTk9fQklUUyhtcCkJKChtcCktPm1fYWdub19sb2cpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19CSVRTKQotaW50IHhmc19pbm9fYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19JTk9fQklUUyhtcCkJCXhmc19pbm9fYml0cyhtcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19JTk9fQklUUyhtcCkJKFhGU19JTk9fQUdOT19CSVRTKG1wKSArIFhGU19JTk9fQUdJTk9fQklUUyhtcCkpCi0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX1RPX0FHTk8pCi14ZnNfYWdudW1iZXJfdCB4ZnNfaW5vX3RvX2Fnbm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19pbm9fdCBpKTsKLSNkZWZpbmUJWEZTX0lOT19UT19BR05PKG1wLGkpCQl4ZnNfaW5vX3RvX2Fnbm8obXAsaSkKLSNlbHNlCi0jZGVmaW5lCVhGU19JTk9fVE9fQUdOTyhtcCxpKQlcCisjZGVmaW5lCVhGU19JTk9fTUFTSyhrKQkJCShfX3VpbnQzMl90KSgoMVVMTCA8PCAoaykpIC0gMSkKKyNkZWZpbmUJWEZTX0lOT19PRkZTRVRfQklUUyhtcCkJCShtcCktPm1fc2Iuc2JfaW5vcGJsb2cKKyNkZWZpbmUJWEZTX0lOT19BR0JOT19CSVRTKG1wKQkJKG1wKS0+bV9zYi5zYl9hZ2Jsa2xvZworI2RlZmluZQlYRlNfSU5PX0FHSU5PX0JJVFMobXApCQkobXApLT5tX2FnaW5vX2xvZworI2RlZmluZQlYRlNfSU5PX0FHTk9fQklUUyhtcCkJCShtcCktPm1fYWdub19sb2cKKyNkZWZpbmUJWEZTX0lOT19CSVRTKG1wKQkJXAorCVhGU19JTk9fQUdOT19CSVRTKG1wKSArIFhGU19JTk9fQUdJTk9fQklUUyhtcCkKKyNkZWZpbmUJWEZTX0lOT19UT19BR05PKG1wLGkpCQlcCiAJKCh4ZnNfYWdudW1iZXJfdCkoKGkpID4+IFhGU19JTk9fQUdJTk9fQklUUyhtcCkpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fVE9fQUdJTk8pCi14ZnNfYWdpbm9fdCB4ZnNfaW5vX3RvX2FnaW5vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfaW5vX3QgaSk7Ci0jZGVmaW5lCVhGU19JTk9fVE9fQUdJTk8obXAsaSkJCXhmc19pbm9fdG9fYWdpbm8obXAsaSkKLSNlbHNlCi0jZGVmaW5lCVhGU19JTk9fVE9fQUdJTk8obXAsaSkJXAorI2RlZmluZQlYRlNfSU5PX1RPX0FHSU5PKG1wLGkpCQlcCiAJKCh4ZnNfYWdpbm9fdCkoaSkgJiBYRlNfSU5PX01BU0soWEZTX0lOT19BR0lOT19CSVRTKG1wKSkpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19UT19BR0JOTykKLXhmc19hZ2Jsb2NrX3QgeGZzX2lub190b19hZ2JubyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2lub190IGkpOwotI2RlZmluZQlYRlNfSU5PX1RPX0FHQk5PKG1wLGkpCQl4ZnNfaW5vX3RvX2FnYm5vKG1wLGkpCi0jZWxzZQotI2RlZmluZQlYRlNfSU5PX1RPX0FHQk5PKG1wLGkpCVwKKyNkZWZpbmUJWEZTX0lOT19UT19BR0JOTyhtcCxpKQkJXAogCSgoKHhmc19hZ2Jsb2NrX3QpKGkpID4+IFhGU19JTk9fT0ZGU0VUX0JJVFMobXApKSAmIFwKLQkgWEZTX0lOT19NQVNLKFhGU19JTk9fQUdCTk9fQklUUyhtcCkpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fVE9fT0ZGU0VUKQotaW50IHhmc19pbm9fdG9fb2Zmc2V0KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfaW5vX3QgaSk7Ci0jZGVmaW5lCVhGU19JTk9fVE9fT0ZGU0VUKG1wLGkpCQl4ZnNfaW5vX3RvX29mZnNldChtcCxpKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0lOT19UT19PRkZTRVQobXAsaSkJXAorCQlYRlNfSU5PX01BU0soWEZTX0lOT19BR0JOT19CSVRTKG1wKSkpCisjZGVmaW5lCVhGU19JTk9fVE9fT0ZGU0VUKG1wLGkpCQlcCiAJKChpbnQpKGkpICYgWEZTX0lOT19NQVNLKFhGU19JTk9fT0ZGU0VUX0JJVFMobXApKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX1RPX0ZTQikKLXhmc19mc2Jsb2NrX3QgeGZzX2lub190b19mc2Ioc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19pbm9fdCBpKTsKLSNkZWZpbmUJWEZTX0lOT19UT19GU0IobXAsaSkJCXhmc19pbm9fdG9fZnNiKG1wLGkpCi0jZWxzZQotI2RlZmluZQlYRlNfSU5PX1RPX0ZTQihtcCxpKQlcCisjZGVmaW5lCVhGU19JTk9fVE9fRlNCKG1wLGkpCQlcCiAJWEZTX0FHQl9UT19GU0IobXAsIFhGU19JTk9fVE9fQUdOTyhtcCxpKSwgWEZTX0lOT19UT19BR0JOTyhtcCxpKSkKLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0lOT19UT19JTk8pCi14ZnNfaW5vX3QKLXhmc19hZ2lub190b19pbm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ251bWJlcl90IGEsIHhmc19hZ2lub190IGkpOwotI2RlZmluZQlYRlNfQUdJTk9fVE9fSU5PKG1wLGEsaSkJeGZzX2FnaW5vX3RvX2lubyhtcCxhLGkpCi0jZWxzZQogI2RlZmluZQlYRlNfQUdJTk9fVE9fSU5PKG1wLGEsaSkJXAogCSgoKHhmc19pbm9fdCkoYSkgPDwgWEZTX0lOT19BR0lOT19CSVRTKG1wKSkgfCAoaSkpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHSU5PX1RPX0FHQk5PKQoteGZzX2FnYmxvY2tfdCB4ZnNfYWdpbm9fdG9fYWdibm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ2lub190IGkpOwotI2RlZmluZQlYRlNfQUdJTk9fVE9fQUdCTk8obXAsaSkJeGZzX2FnaW5vX3RvX2FnYm5vKG1wLGkpCi0jZWxzZQogI2RlZmluZQlYRlNfQUdJTk9fVE9fQUdCTk8obXAsaSkJKChpKSA+PiBYRlNfSU5PX09GRlNFVF9CSVRTKG1wKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdJTk9fVE9fT0ZGU0VUKQotaW50IHhmc19hZ2lub190b19vZmZzZXQoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ2lub190IGkpOwotI2RlZmluZQlYRlNfQUdJTk9fVE9fT0ZGU0VUKG1wLGkpCXhmc19hZ2lub190b19vZmZzZXQobXAsaSkKLSNlbHNlCiAjZGVmaW5lCVhGU19BR0lOT19UT19PRkZTRVQobXAsaSkJXAogCSgoaSkgJiBYRlNfSU5PX01BU0soWEZTX0lOT19PRkZTRVRfQklUUyhtcCkpKQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX09GRkJOT19UT19BR0lOTykKLXhmc19hZ2lub190IHhmc19vZmZibm9fdG9fYWdpbm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ2Jsb2NrX3QgYiwgaW50IG8pOwotI2RlZmluZQlYRlNfT0ZGQk5PX1RPX0FHSU5PKG1wLGIsbykJeGZzX29mZmJub190b19hZ2lubyhtcCxiLG8pCi0jZWxzZQogI2RlZmluZQlYRlNfT0ZGQk5PX1RPX0FHSU5PKG1wLGIsbykJXAogCSgoeGZzX2FnaW5vX3QpKCgoYikgPDwgWEZTX0lOT19PRkZTRVRfQklUUyhtcCkpIHwgKG8pKSkKLSNlbmRpZgogCiAjaWYgWEZTX0JJR19JTlVNUwogI2RlZmluZQlYRlNfTUFYSU5VTUJFUgkJKCh4ZnNfaW5vX3QpKCgxVUxMIDw8IDU2KSAtIDFVTEwpKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb2NvcmUuYyBiL2ZzL3hmcy94ZnNfaW9jb3JlLmMKaW5kZXggNDE0ZWM0OS4uYTA3ODE1NiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb2NvcmUuYworKysgYi9mcy94ZnMveGZzX2lvY29yZS5jCkBAIC0xLDQwICsxLDI2IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKQEAgLTQyLDIyICsyOCwyMSBAQAogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgotI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCi0jaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmMgYi9mcy94ZnMveGZzX2lvbWFwLmMKaW5kZXggZDBmNWJlNi4uNDVhNzdhMyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb21hcC5jCisrKyBiL2ZzL3hmcy94ZnNfaW9tYXAuYwpAQCAtMSw0MCArMSwyNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0KICNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKQEAgLTQ0LDE2ICsyOSwxNiBAQAogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgpAQCAtMzc5LDE3ICszNjQsMTUgQEAKIAl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2I7CiAJeGZzX2ZpbGVvZmZfdAlsYXN0X2ZzYjsKIAl4ZnNfZmlsYmxrc190CWNvdW50X2ZzYjsKLQl4ZnNfZnNpemVfdAlpc2l6ZTsKIAl4ZnNfZnNibG9ja190CWZpcnN0ZnNiOwotCWludAkJbmltYXBzLCBtYXBzOworCWludAkJbmltYXBzOwogCWludAkJZXJyb3I7CiAJaW50CQlibWFwaV9mbGFnOwogCWludAkJcXVvdGFfZmxhZzsKIAlpbnQJCXJ0OwogCXhmc190cmFuc190CSp0cDsKLQl4ZnNfYm1idF9pcmVjX3QgaW1hcFtYRlNfV1JJVEVfSU1BUFNdLCAqaW1hcHA7CisJeGZzX2JtYnRfaXJlY190IGltYXA7CiAJeGZzX2JtYXBfZnJlZV90IGZyZWVfbGlzdDsKLQlpbnQJCWFlb2Y7CiAJeGZzX2ZpbGJsa3NfdAlxYmxvY2tzLCByZXNibGtzOwogCWludAkJY29tbWl0dGVkOwogCWludAkJcmVzcnRleHRlbnRzOwpAQCAtNDAyLDE1ICszODUsNiBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CiAKLQltYXBzID0gbWluKFhGU19XUklURV9JTUFQUywgKm5tYXBzKTsKLQluaW1hcHMgPSBtYXBzOwotCi0JaXNpemUgPSBpcC0+aV9kLmRpX3NpemU7Ci0JYWVvZiA9IChvZmZzZXQgKyBjb3VudCkgPiBpc2l6ZTsKLQotCWlmIChpby0+aW9fbmV3X3NpemUgPiBpc2l6ZSkKLQkJaXNpemUgPSBpby0+aW9fbmV3X3NpemU7Ci0KIAlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKIAlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOwogCWNvdW50X2ZzYiA9IGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYjsKQEAgLTQ3OSw5ICs0NTMsOCBAQAogCSAqLwogCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0ZnNiKTsKIAluaW1hcHMgPSAxOwotCWltYXBwID0gJmltYXBbMF07CiAJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsCi0JCWJtYXBpX2ZsYWcsICZmaXJzdGZzYiwgMCwgaW1hcHAsICZuaW1hcHMsICZmcmVlX2xpc3QpOworCQlibWFwaV9mbGFnLCAmZmlyc3Rmc2IsIDAsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IwOwogCkBAIC01MDMsNyArNDc2LDcgQEAKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCi0JKnJldF9pbWFwID0gaW1hcFswXTsKKwkqcmV0X2ltYXAgPSBpbWFwOwogCSpubWFwcyA9IDE7CiAJaWYgKCAhKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICAmJiAhcmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2spIHsKICAgICAgICAgICAgICAgICBjbW5fZXJyKENFX1BBTklDLCJBY2Nlc3MgdG8gYmxvY2sgemVybzogIGZzIDwlcz4gaW5vZGU6ICVsbGQgIgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5oIGIvZnMveGZzL3hmc19pb21hcC5oCmluZGV4IDRkYWFhNTIuLmZjZDZkNjMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuaAorKysgYi9mcy94ZnMveGZzX2lvbWFwLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfSU9NQVBfSF9fCiAjZGVmaW5lIF9fWEZTX0lPTUFQX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pdGFibGUuYyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmMKaW5kZXggOGZiYzhkMy4uZjYzNjQ2ZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pdGFibGUuYworKysgYi9mcy94ZnMveGZzX2l0YWJsZS5jCkBAIC0xLDU5ICsxLDQ1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWcuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAKICNpZm5kZWYgSEFWRV9VU0VSQUNDCiAjZGVmaW5lIHVzZXJhY2ModWJ1ZmZlciwgc2l6ZSwgZmxhZ3MsIGZvbykgKDApCkBAIC00NjIsNyArNDQ4LDcgQEAKIAkJCXdoaWxlIChlcnJvcikgewogCQkJCWFnaW5vICs9IFhGU19JTk9ERVNfUEVSX0NIVU5LOwogCQkJCWlmIChYRlNfQUdJTk9fVE9fQUdCTk8obXAsIGFnaW5vKSA+PQotCQkJCQkJSU5UX0dFVChhZ2ktPmFnaV9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpCisJCQkJCQliZTMyX3RvX2NwdShhZ2ktPmFnaV9sZW5ndGgpKQogCQkJCQlicmVhazsKIAkJCQllcnJvciA9IHhmc19pbm9idF9sb29rdXBfZ2UoY3VyLCBhZ2lubywgMCwgMCwKIAkJCQkJCQkgICAgJnRtcCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2l0YWJsZS5oIGIvZnMveGZzL3hmc19pdGFibGUuaAppbmRleCAyYmU5ZDE4Li4wNDdkODM0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2l0YWJsZS5oCisrKyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmgKQEAgLTEsMzMgKzEsMTggQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19JVEFCTEVfSF9fCiAjZGVmaW5lCV9fWEZTX0lUQUJMRV9IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmMgYi9mcy94ZnMveGZzX2xvZy5jCmluZGV4IDU0YTZmMTEuLjI5YWY1MTIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmMKKysrIGIvZnMveGZzL3hmc19sb2cuYwpAQCAtMSw1OCArMSw0NyBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCi0vKgotICogSGlnaCBsZXZlbCBpbnRlcmZhY2Ugcm91dGluZXMgZm9yIGxvZyBtYW5hZ2VyCi0gKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgotI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfbG9nX3ByaXYuaCIKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgogI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfbG9nX3JlY292ZXIuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCi0jaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKIAogCiAjZGVmaW5lIHhsb2dfd3JpdGVfYWR2X2NudChwdHIsIGxlbiwgb2ZmLCBieXRlcykgXApAQCAtOTMsOCArODIsMTEgQEAKIFNUQVRJQyB2b2lkIHhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyh4bG9nX3QJCSpsb2csCiAJCQkJICAgICB4bG9nX2luX2NvcmVfdCAqaWNsb2csCiAJCQkJICAgICBpbnQJCWV2ZW50dWFsX3NpemUpOwotU1RBVElDIGludCAgeGxvZ19zdGF0ZV9zeW5jKHhsb2dfdCAqbG9nLCB4ZnNfbHNuX3QgbHNuLCB1aW50IGZsYWdzKTsKLVNUQVRJQyBpbnQgIHhsb2dfc3RhdGVfc3luY19hbGwoeGxvZ190ICpsb2csIHVpbnQgZmxhZ3MpOworU1RBVElDIGludCAgeGxvZ19zdGF0ZV9zeW5jKHhsb2dfdAkJCSpsb2csCisJCQkgICAgeGZzX2xzbl90IAkJCWxzbiwKKwkJCSAgICB1aW50CQkJZmxhZ3MsCisJCQkgICAgaW50CQkJCSpsb2dfZmx1c2hlZCk7CitTVEFUSUMgaW50ICB4bG9nX3N0YXRlX3N5bmNfYWxsKHhsb2dfdCAqbG9nLCB1aW50IGZsYWdzLCBpbnQgKmxvZ19mbHVzaGVkKTsKIFNUQVRJQyB2b2lkIHhsb2dfc3RhdGVfd2FudF9zeW5jKHhsb2dfdAkqbG9nLCB4bG9nX2luX2NvcmVfdCAqaWNsb2cpOwogCiAvKiBsb2NhbCBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBncmFudCBoZWFkICovCkBAIC0xMTksOCArMTExLDcgQEAKIAkJCQkJIHVpbnQJZmxhZ3MpOwogU1RBVElDIHZvaWQJCXhsb2dfdGlja2V0X3B1dCh4bG9nX3QgKmxvZywgeGxvZ190aWNrZXRfdCAqdGlja2V0KTsKIAotLyogbG9jYWwgZGVidWcgZnVuY3Rpb25zICovCi0jaWYgZGVmaW5lZChERUJVRykgJiYgIWRlZmluZWQoWExPR19OT0xPRykKKyNpZiBkZWZpbmVkKERFQlVHKQogU1RBVElDIHZvaWQJeGxvZ192ZXJpZnlfZGVzdF9wdHIoeGxvZ190ICpsb2csIF9fcHNpbnRfdCBwdHIpOwogU1RBVElDIHZvaWQJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZCh4bG9nX3QgKmxvZywgaW50IGVxdWFscyk7CiBTVEFUSUMgdm9pZAl4bG9nX3ZlcmlmeV9pY2xvZyh4bG9nX3QgKmxvZywgeGxvZ19pbl9jb3JlX3QgKmljbG9nLApAQCAtMTM2LDI2ICsxMjcsNyBAQAogCiBTVEFUSUMgaW50CXhsb2dfaWNsb2dzX2VtcHR5KHhsb2dfdCAqbG9nKTsKIAotI2lmZGVmIERFQlVHCi1pbnQgeGxvZ19kb19lcnJvciA9IDA7Ci1pbnQgeGxvZ19yZXFfbnVtICA9IDA7Ci1pbnQgeGxvZ19lcnJvcl9tb2QgPSAzMzsKLSNlbmRpZgotCi0jZGVmaW5lIFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykJKGxvZy0+bF9mbGFncyAmIFhMT0dfSU9fRVJST1IpCi0KLS8qCi0gKiAwID0+IGRpc2FibGUgbG9nIG1hbmFnZXIKLSAqIDEgPT4gZW5hYmxlIGxvZyBtYW5hZ2VyCi0gKiAyID0+IGVuYWJsZSBsb2cgbWFuYWdlciBhbmQgbG9nIGRlYnVnZ2luZwotICovCi0jaWYgZGVmaW5lZChYTE9HX05PTE9HKSB8fCBkZWZpbmVkKERFQlVHKQotaW50ICAgeGxvZ19kZWJ1ZyA9IDE7Ci14ZnNfYnVmdGFyZ190ICp4bG9nX3RhcmdldDsKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChYRlNfTE9HX1RSQUNFKQotCiB2b2lkCiB4bG9nX3RyYWNlX2xvZ2dyYW50KHhsb2dfdCAqbG9nLCB4bG9nX3RpY2tldF90ICp0aWMsIHhmc19jYWRkcl90IHN0cmluZykKIHsKQEAgLTE5MSwzMSArMTYzLDE2IEBACiB2b2lkCiB4bG9nX3RyYWNlX2ljbG9nKHhsb2dfaW5fY29yZV90ICppY2xvZywgdWludCBzdGF0ZSkKIHsKLQlwaWRfdCBwaWQ7Ci0KLQlwaWQgPSBjdXJyZW50X3BpZCgpOwotCiAJaWYgKCFpY2xvZy0+aWNfdHJhY2UpCiAJCWljbG9nLT5pY190cmFjZSA9IGt0cmFjZV9hbGxvYygyNTYsIEtNX1NMRUVQKTsKIAlrdHJhY2VfZW50ZXIoaWNsb2ctPmljX3RyYWNlLAogCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXN0YXRlKSwKLQkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZylwaWQpLAotCQkgICAgICh2b2lkICopMCwKLQkJICAgICAodm9pZCAqKTAsCi0JCSAgICAgKHZvaWQgKikwLAotCQkgICAgICh2b2lkICopMCwKLQkJICAgICAodm9pZCAqKTAsCi0JCSAgICAgKHZvaWQgKikwLAotCQkgICAgICh2b2lkICopMCwKLQkJICAgICAodm9pZCAqKTAsCi0JCSAgICAgKHZvaWQgKikwLAotCQkgICAgICh2b2lkICopMCwKLQkJICAgICAodm9pZCAqKTAsCi0JCSAgICAgKHZvaWQgKikwLAotCQkgICAgICh2b2lkICopMCwKLQkJICAgICAodm9pZCAqKTApOworCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWN1cnJlbnRfcGlkKCkpLAorCQkgICAgICh2b2lkICopTlVMTCwgKHZvaWQgKilOVUxMLCAodm9pZCAqKU5VTEwsICh2b2lkICopTlVMTCwKKwkJICAgICAodm9pZCAqKU5VTEwsICh2b2lkICopTlVMTCwgKHZvaWQgKilOVUxMLCAodm9pZCAqKU5VTEwsCisJCSAgICAgKHZvaWQgKilOVUxMLCAodm9pZCAqKU5VTEwsICh2b2lkICopTlVMTCwgKHZvaWQgKilOVUxMLAorCQkgICAgICh2b2lkICopTlVMTCwgKHZvaWQgKilOVUxMKTsKIH0KLQogI2Vsc2UKICNkZWZpbmUJeGxvZ190cmFjZV9sb2dncmFudChsb2csdGljLHN0cmluZykKICNkZWZpbmUJeGxvZ190cmFjZV9pY2xvZyhpY2xvZyxzdGF0ZSkKQEAgLTI1MiwxMSArMjA5LDYgQEAKIAl4bG9nX3RpY2tldF90CSp0aWNrZXQgPSAoeGZzX2xvZ190aWNrZXRfdCkgeHRpYzsKIAl4ZnNfbHNuX3QJbHNuCT0gMDsKIAotI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKLQlpZiAoIXhsb2dfZGVidWcgJiYgeGxvZ190YXJnZXQgPT0gbG9nLT5sX3RhcmcpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KIAlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSB8fAogCSAgICAvKgogCSAgICAgKiBJZiBub3RoaW5nIHdhcyBldmVyIHdyaXR0ZW4sIGRvbid0IHdyaXRlIG91dCBjb21taXQgcmVjb3JkLgpAQCAtMzEyLDMzICsyNjQsMjggQEAKICAqIHNlbWFwaG9yZS4KICAqLwogaW50Ci14ZnNfbG9nX2ZvcmNlKHhmc19tb3VudF90ICptcCwKLQkgICAgICB4ZnNfbHNuX3QJICBsc24sCi0JICAgICAgdWludAkgIGZsYWdzKQorX3hmc19sb2dfZm9yY2UoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19sc25fdAlsc24sCisJdWludAkJZmxhZ3MsCisJaW50CQkqbG9nX2ZsdXNoZWQpCiB7Ci0JaW50CXJ2YWw7Ci0JeGxvZ190ICpsb2cgPSBtcC0+bV9sb2c7CisJeGxvZ190CQkqbG9nID0gbXAtPm1fbG9nOworCWludAkJZHVtbXk7CiAKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCi0JaWYgKCF4bG9nX2RlYnVnICYmIHhsb2dfdGFyZ2V0ID09IGxvZy0+bF90YXJnKQotCQlyZXR1cm4gMDsKLSNlbmRpZgorCWlmICghbG9nX2ZsdXNoZWQpCisJCWxvZ19mbHVzaGVkID0gJmR1bW15OwogCiAJQVNTRVJUKGZsYWdzICYgWEZTX0xPR19GT1JDRSk7CiAKIAlYRlNfU1RBVFNfSU5DKHhzX2xvZ19mb3JjZSk7CiAKLQlpZiAoKGxvZy0+bF9mbGFncyAmIFhMT0dfSU9fRVJST1IpID09IDApIHsKLQkJaWYgKGxzbiA9PSAwKQotCQkJcnZhbCA9IHhsb2dfc3RhdGVfc3luY19hbGwobG9nLCBmbGFncyk7Ci0JCWVsc2UKLQkJCXJ2YWwgPSB4bG9nX3N0YXRlX3N5bmMobG9nLCBsc24sIGZsYWdzKTsKLQl9IGVsc2UgewotCQlydmFsID0gWEZTX0VSUk9SKEVJTyk7Ci0JfQotCi0JcmV0dXJuIHJ2YWw7Ci0KKwlpZiAobG9nLT5sX2ZsYWdzICYgWExPR19JT19FUlJPUikKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCWlmIChsc24gPT0gMCkKKwkJcmV0dXJuIHhsb2dfc3RhdGVfc3luY19hbGwobG9nLCBmbGFncywgbG9nX2ZsdXNoZWQpOworCWVsc2UKKwkJcmV0dXJuIHhsb2dfc3RhdGVfc3luYyhsb2csIGxzbiwgZmxhZ3MsIGxvZ19mbHVzaGVkKTsKIH0JLyogeGZzX2xvZ19mb3JjZSAqLwogCiAvKgpAQCAtMzU2LDEwICszMDMsNiBAQAogCXhsb2dfaW5fY29yZV90CSAgKmljbG9nID0gKHhsb2dfaW5fY29yZV90ICopaWNsb2dfaG5kbDsKIAlpbnQJYWJvcnRmbGcsIHNwbDsKIAotI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKLQlpZiAoIXhsb2dfZGVidWcgJiYgeGxvZ190YXJnZXQgPT0gbG9nLT5sX3RhcmcpCi0JCXJldHVybiAwOwotI2VuZGlmCiAJY2ItPmNiX25leHQgPSBOVUxMOwogCXNwbCA9IExPR19MT0NLKGxvZyk7CiAJYWJvcnRmbGcgPSAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKTsKQEAgLTQxMCwxMyArMzUzLDggQEAKIHsKIAl4bG9nX3QJCSpsb2cgPSBtcC0+bV9sb2c7CiAJeGxvZ190aWNrZXRfdAkqaW50ZXJuYWxfdGlja2V0OwotCWludAkJcmV0dmFsOworCWludAkJcmV0dmFsID0gMDsKIAotI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKLQlpZiAoIXhsb2dfZGVidWcgJiYgeGxvZ190YXJnZXQgPT0gbG9nLT5sX3RhcmcpCi0JCXJldHVybiAwOwotI2VuZGlmCi0JcmV0dmFsID0gMDsKIAlBU1NFUlQoY2xpZW50ID09IFhGU19UUkFOU0FDVElPTiB8fCBjbGllbnQgPT0gWEZTX0xPRyk7CiAJQVNTRVJUKChmbGFncyAmIFhGU19MT0dfTk9TTEVFUCkgPT0gMCk7CiAKQEAgLTQ3OCwxMiArNDE2LDYgQEAKIAogCW1wLT5tX2xvZyA9IHhsb2dfYWxsb2NfbG9nKG1wLCBsb2dfdGFyZ2V0LCBibGtfb2Zmc2V0LCBudW1fYmJsa3MpOwogCi0jaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQotCWlmICgheGxvZ19kZWJ1ZykgewotCQljbW5fZXJyKENFX05PVEUsICJsb2cgZGV2OiAlcyIsIFhGU19CVUZUQVJHX05BTUUobG9nX3RhcmdldCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYKIAkvKgogCSAqIHNraXAgbG9nIHJlY292ZXJ5IG9uIGEgbm9yZWNvdmVyeSBtb3VudC4gIHByZXRlbmQgaXQgYWxsCiAJICoganVzdCB3b3JrZWQuCkBAIC01ODcsMTEgKzUxOSw2IEBACiAJICAgIF9fdWludDMyX3QgcGFkMjsgLyogbWF5IGFzIHdlbGwgbWFrZSBpdCA2NCBiaXRzICovCiAJfSBtYWdpYyA9IHsgWExPR19VTk1PVU5UX1RZUEUsIDAsIDAgfTsKIAotI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKLQlpZiAoIXhsb2dfZGVidWcgJiYgeGxvZ190YXJnZXQgPT0gbG9nLT5sX3RhcmcpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KIAkvKgogCSAqIERvbid0IHdyaXRlIG91dCB1bm1vdW50IHJlY29yZCBvbiByZWFkLW9ubHkgbW91bnRzLgogCSAqIE9yLCBpZiB3ZSBhcmUgZG9pbmcgYSBmb3JjZWQgdW1vdW50ICh0eXBpY2FsbHkgYmVjYXVzZSBvZiBJTyBlcnJvcnMpLgpAQCAtNzE4LDEyICs2NDUsNiBAQAogCWludAllcnJvcjsKIAl4bG9nX3QgKmxvZyA9IG1wLT5tX2xvZzsKIAotI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKLQlpZiAoIXhsb2dfZGVidWcgJiYgeGxvZ190YXJnZXQgPT0gbG9nLT5sX3RhcmcpIHsKLQkJKnN0YXJ0X2xzbiA9IDA7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgogCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiAKQEAgLTc0MywxMSArNjY0LDYgQEAKIAlpbnQJCW5lZWRfYnl0ZXMsIGZyZWVfYnl0ZXMsIGN5Y2xlLCBieXRlczsKIAlTUExERUNMKHMpOwogCi0jaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQotCWlmICgheGxvZ19kZWJ1ZyAmJiB4bG9nX3RhcmdldCA9PSBsb2ctPmxfdGFyZykKLQkJcmV0dXJuOwotI2VuZGlmCi0JLyogWFhYc3VwIHRtcCAqLwogCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQogCQlyZXR1cm47CiAJQVNTRVJUKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CkBAIC0xMDM0LDUxICs5NTAsMjIgQEAKIAlpbnQgc2l6ZTsKIAlpbnQgeGhkcnM7CiAKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCi0JLyoKLQkgKiBXaGVuIGxvZ2J1ZnMgPT0gMCwgc29tZW9uZSBoYXMgZGlzYWJsZWQgdGhlIGxvZyBmcm9tIHRoZSBGU1RBQgotCSAqIGZpbGUuICBUaGlzIGlzIG5vdCBhIGRvY3VtZW50ZWQgZmVhdHVyZS4gIFdlIG5lZWQgdG8gc2V0IHhsb2dfZGVidWcKLQkgKiB0byB6ZXJvICh0aGlzIGRlYWN0aXZhdGVzIHRoZSBsb2cpIGFuZCBzZXQgeGxvZ190YXJnZXQgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgZGV2aWNlLiAgT25seSBvbmUgZmlsZXN5c3RlbSBtYXkgYmUgYWZmZWN0ZWQgYXMgc3VjaAotCSAqIHNpbmNlIHRoaXMgaXMganVzdCBhIHBlcmZvcm1hbmNlIGhhY2sgdG8gdGVzdCB3aGF0IHdlIG1pZ2h0IGJlIGFibGUKLQkgKiB0byBnZXQgaWYgdGhlIGxvZyB3ZXJlIG5vdCBwcmVzZW50LgotCSAqLwotCWlmIChtcC0+bV9sb2didWZzID09IDApIHsKLQkJeGxvZ19kZWJ1ZyA9IDA7Ci0JCXhsb2dfdGFyZ2V0ID0gbG9nLT5sX3Rhcmc7Ci0JCWxvZy0+bF9pY2xvZ19idWZzID0gWExPR19NSU5fSUNMT0dTOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQkvKgotCQkgKiBUaGlzIGlzIHRoZSBub3JtYWwgcGF0aC4gIElmIG1fbG9nYnVmcyA9PSAtMSwgdGhlbiB0aGUKLQkJICogYWRtaW4gaGFzIGNob3NlbiB0byB1c2UgdGhlIHN5c3RlbSBkZWZhdWx0cyBmb3IgbG9nYnVmZmVycy4KLQkJICovCi0JCWlmIChtcC0+bV9sb2didWZzID09IC0xKSB7IAotCQkJaWYgKHhmc19waHlzbWVtIDw9IGJ0b2MoMTI4KjEwMjQqMTAyNCkpIHsgCi0JCQkJbG9nLT5sX2ljbG9nX2J1ZnMgPSBYTE9HX01JTl9JQ0xPR1M7IAotCQkJfSBlbHNlIGlmICh4ZnNfcGh5c21lbSA8PSBidG9jKDQwMCoxMDI0KjEwMjQpKSB7IAotCQkJCWxvZy0+bF9pY2xvZ19idWZzID0gWExPR19NRURfSUNMT0dTOyAKLQkJCX0gZWxzZSB7Ci0JCQkJLyogMjU2SyB3aXRoIDMySyBidWZzICovCi0JCQkJbG9nLT5sX2ljbG9nX2J1ZnMgPSBYTE9HX01BWF9JQ0xPR1M7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJbG9nLT5sX2ljbG9nX2J1ZnMgPSBtcC0+bV9sb2didWZzOwotCi0jaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQotCQkvKiBXZSBhcmUgcmVhY3RpdmF0aW5nIGEgZmlsZXN5c3RlbSBhZnRlciBpdCB3YXMgaW5hY3RpdmUgKi8KLQkJaWYgKGxvZy0+bF90YXJnID09IHhsb2dfdGFyZ2V0KSB7Ci0JCQl4bG9nX3RhcmdldCA9IE5VTEw7Ci0JCQl4bG9nX2RlYnVnID0gMTsKKwlpZiAobXAtPm1fbG9nYnVmcyA8PSAwKSB7CisJCWlmICh4ZnNfcGh5c21lbSA8PSBidG9jKDEyOCoxMDI0KjEwMjQpKSB7CisJCQlsb2ctPmxfaWNsb2dfYnVmcyA9IFhMT0dfTUlOX0lDTE9HUzsKKwkJfSBlbHNlIGlmICh4ZnNfcGh5c21lbSA8PSBidG9jKDQwMCoxMDI0KjEwMjQpKSB7CisJCQlsb2ctPmxfaWNsb2dfYnVmcyA9IFhMT0dfTUVEX0lDTE9HUzsKKwkJfSBlbHNlIHsJLyogMjU2SyB3aXRoIDMySyBidWZzICovCisJCQlsb2ctPmxfaWNsb2dfYnVmcyA9IFhMT0dfTUFYX0lDTE9HUzsKIAkJfQotI2VuZGlmCisJfSBlbHNlIHsKKwkJbG9nLT5sX2ljbG9nX2J1ZnMgPSBtcC0+bV9sb2didWZzOwogCX0KIAogCS8qCiAJICogQnVmZmVyIHNpemUgcGFzc2VkIGluIGZyb20gbW91bnQgc3lzdGVtIGNhbGwuCiAJICovCi0JaWYgKG1wLT5tX2xvZ2JzaXplICE9IC0xKSB7CisJaWYgKG1wLT5tX2xvZ2JzaXplID4gMCkgewogCQlzaXplID0gbG9nLT5sX2ljbG9nX3NpemUgPSBtcC0+bV9sb2dic2l6ZTsKIAkJbG9nLT5sX2ljbG9nX3NpemVfbG9nID0gMDsKIAkJd2hpbGUgKHNpemUgIT0gMSkgewpAQCAtMTEwMSw3ICs5ODgsNyBAQAogCQkJbG9nLT5sX2ljbG9nX2hzaXplID0gQkJTSVpFOwogCQkJbG9nLT5sX2ljbG9nX2hlYWRzID0gMTsKIAkJfQotCQlyZXR1cm47CisJCWdvdG8gZG9uZTsKIAl9CiAKIAkvKgpAQCAtMTEyOCw3ICsxMDE1LDcgQEAKIAlpZiAobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IDE2KjEwMjQpIHsKIAkJbG9nLT5sX2ljbG9nX3NpemUgPSBYTE9HX0JJR19SRUNPUkRfQlNJWkU7CiAJCWxvZy0+bF9pY2xvZ19zaXplX2xvZyA9IFhMT0dfQklHX1JFQ09SRF9CU0hJRlQ7Ci0JCWlmIChtcC0+bV9sb2didWZzID09IC0xKSB7CisJCWlmIChtcC0+bV9sb2didWZzIDw9IDApIHsKIAkJCXN3aXRjaCAobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSB7CiAJCQkgICAgY2FzZSAxNioxMDI0OgkJCS8qIDE2IEtCICovCiAJCQkJbG9nLT5sX2ljbG9nX2J1ZnMgPSAzOwpAQCAtMTE0NSw2ICsxMDMyLDEyIEBACiAJCQl9CiAJCX0KIAl9CisKK2RvbmU6CS8qIGFyZSB3ZSBiZWluZyBhc2tlZCB0byBtYWtlIHRoZSBzaXplcyBzZWxlY3RlZCBhYm92ZSB2aXNpYmxlPyAqLworCWlmIChtcC0+bV9sb2didWZzID09IDApCisJCW1wLT5tX2xvZ2J1ZnMgPSBsb2ctPmxfaWNsb2dfYnVmczsKKwlpZiAobXAtPm1fbG9nYnNpemUgPT0gMCkKKwkJbXAtPm1fbG9nYnNpemUgPSBsb2ctPmxfaWNsb2dfc2l6ZTsKIH0JLyogeGxvZ19nZXRfaWNsb2dfYnVmZmVyX3NpemUgKi8KIAogCkBAIC0xNDY3LDE0ICsxMzYwLDEzIEBACiAJWEZTX0JVRl9CVVNZKGJwKTsKIAlYRlNfQlVGX0FTWU5DKGJwKTsKIAkvKgotCSAqIERvIGEgZGlzayB3cml0ZSBjYWNoZSBmbHVzaCBmb3IgdGhlIGxvZyBibG9jay4KLQkgKiBUaGlzIGlzIGEgYml0IG9mIGEgc2xlZGdlaGFtbWVyLCBpdCB3b3VsZCBiZSBiZXR0ZXIKLQkgKiB0byB1c2UgYSB0YWcgYmFycmllciBoZXJlIHRoYXQganVzdCBwcmV2ZW50cyByZW9yZGVyaW5nLgorCSAqIERvIGFuIG9yZGVyZWQgd3JpdGUgZm9yIHRoZSBsb2cgYmxvY2suCisJICoKIAkgKiBJdCBtYXkgbm90IGJlIG5lZWRlZCB0byBmbHVzaCB0aGUgZmlyc3Qgc3BsaXQgYmxvY2sgaW4gdGhlIGxvZyB3cmFwCiAJICogY2FzZSwgYnV0IGRvIGl0IGFueXdheXMgdG8gYmUgc2FmZSAtQUsKIAkgKi8KLQlpZiAoIShsb2ctPmxfbXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9MT0dGTFVTSCkpCi0JCVhGU19CVUZfRkxVU0goYnApOworCWlmIChsb2ctPmxfbXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikKKwkJWEZTX0JVRl9PUkRFUkVEKGJwKTsKIAogCUFTU0VSVChYRlNfQlVGX0FERFIoYnApIDw9IGxvZy0+bF9sb2dCQnNpemUtMSk7CiAJQVNTRVJUKFhGU19CVUZfQUREUihicCkgKyBCVE9CQihjb3VudCkgPD0gbG9nLT5sX2xvZ0JCc2l6ZSk7CkBAIC0xNTA1LDggKzEzOTcsOCBAQAogCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIGljbG9nKTsKIAkJWEZTX0JVRl9CVVNZKGJwKTsKIAkJWEZTX0JVRl9BU1lOQyhicCk7Ci0JCWlmICghKGxvZy0+bF9tcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0xPR0ZMVVNIKSkKLQkJCVhGU19CVUZfRkxVU0goYnApOworCQlpZiAobG9nLT5sX21wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpCisJCQlYRlNfQlVGX09SREVSRUQoYnApOwogCQlkcHRyID0gWEZTX0JVRl9QVFIoYnApOwogCQkvKgogCQkgKiBCdW1wIHRoZSBjeWNsZSBudW1iZXJzIGF0IHRoZSBzdGFydCBvZiBlYWNoIGJsb2NrCkBAIC0yOTUxLDcgKzI4NDMsNyBAQAogICoJCW5vdCBpbiB0aGUgYWN0aXZlIG5vciBkaXJ0eSBzdGF0ZS4KICAqLwogU1RBVElDIGludAoteGxvZ19zdGF0ZV9zeW5jX2FsbCh4bG9nX3QgKmxvZywgdWludCBmbGFncykKK3hsb2dfc3RhdGVfc3luY19hbGwoeGxvZ190ICpsb2csIHVpbnQgZmxhZ3MsIGludCAqbG9nX2ZsdXNoZWQpCiB7CiAJeGxvZ19pbl9jb3JlX3QJKmljbG9nOwogCXhmc19sc25fdAlsc247CkBAIC0zMDAwLDYgKzI4OTIsNyBAQAogCiAJCQkJaWYgKHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKSkKIAkJCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCQkJCSpsb2dfZmx1c2hlZCA9IDE7CiAJCQkJcyA9IExPR19MT0NLKGxvZyk7CiAJCQkJaWYgKElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX2xzbiwgQVJDSF9DT05WRVJUKSA9PSBsc24gJiYKIAkJCQkgICAgaWNsb2ctPmljX3N0YXRlICE9IFhMT0dfU1RBVEVfRElSVFkpCkBAIC0zMDQzLDYgKzI5MzYsNyBAQAogCQkgKi8KIAkJaWYgKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikKIAkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkJKmxvZ19mbHVzaGVkID0gMTsKIAogCX0gZWxzZSB7CiAKQEAgLTMwNjgsNyArMjk2Miw4IEBACiBpbnQKIHhsb2dfc3RhdGVfc3luYyh4bG9nX3QJICAqbG9nLAogCQl4ZnNfbHNuX3QgbHNuLAotCQl1aW50CSAgZmxhZ3MpCisJCXVpbnQJICBmbGFncywKKwkJaW50CSAgKmxvZ19mbHVzaGVkKQogewogICAgIHhsb2dfaW5fY29yZV90CSppY2xvZzsKICAgICBpbnQJCQlhbHJlYWR5X3NsZXB0ID0gMDsKQEAgLTMxMjAsNiArMzAxNSw3IEBACiAJCQlYRlNfU1RBVFNfSU5DKHhzX2xvZ19mb3JjZV9zbGVlcCk7CiAJCQlzdl93YWl0KCZpY2xvZy0+aWNfcHJldi0+aWNfd3JpdGVzZW1hLCBQU1dQLAogCQkJCSZsb2ctPmxfaWNsb2dsb2NrLCBzKTsKKwkJCSpsb2dfZmx1c2hlZCA9IDE7CiAJCQlhbHJlYWR5X3NsZXB0ID0gMTsKIAkJCWdvdG8gdHJ5X2FnYWluOwogCQl9IGVsc2UgewpAQCAtMzEyOCw2ICszMDI0LDcgQEAKIAkJCUxPR19VTkxPQ0sobG9nLCBzKTsKIAkJCWlmICh4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cobG9nLCBpY2xvZykpCiAJCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCQkJKmxvZ19mbHVzaGVkID0gMTsKIAkJCXMgPSBMT0dfTE9DSyhsb2cpOwogCQl9CiAJfQpAQCAtMzE1Miw2ICszMDQ5LDcgQEAKIAkJICovCiAJCWlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpCiAJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCSpsb2dfZmx1c2hlZCA9IDE7CiAJfSBlbHNlIHsJCS8qIGp1c3QgcmV0dXJuICovCiAJCUxPR19VTkxPQ0sobG9nLCBzKTsKIAl9CkBAIC0zMzkyLDcgKzMyOTAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwotI2lmIGRlZmluZWQoREVCVUcpICYmICFkZWZpbmVkKFhMT0dfTk9MT0cpCisjaWYgZGVmaW5lZChERUJVRykKIC8qCiAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gcHRyIGlzIHdpdGhpbiB0aGUgdmFsaWQgZGF0YSByZWdpb24gb2YKICAqIG9uZSBvZiB0aGUgaWNsb2dzLiAgVGhpcyB1c2VzIGJhY2t1cCBwb2ludGVycyBzdG9yZWQgaW4gYSBkaWZmZXJlbnQKQEAgLTM1MzMsNyArMzQzMSw5IEBACiAJCQl9CiAJCX0KIAkJaWYgKGNsaWVudGlkICE9IFhGU19UUkFOU0FDVElPTiAmJiBjbGllbnRpZCAhPSBYRlNfTE9HKQotCQkJY21uX2VycihDRV9XQVJOLCAieGxvZ192ZXJpZnlfaWNsb2c6IGludmFsaWQgY2xpZW50aWQgJWQgb3AgMHglcCBvZmZzZXQgMHgleCIsIGNsaWVudGlkLCBvcGhlYWQsIGZpZWxkX29mZnNldCk7CisJCQljbW5fZXJyKENFX1dBUk4sICJ4bG9nX3ZlcmlmeV9pY2xvZzogIgorCQkJCSJpbnZhbGlkIGNsaWVudGlkICVkIG9wIDB4JXAgb2Zmc2V0IDB4JWx4IiwKKwkJCQljbGllbnRpZCwgb3BoZWFkLCAodW5zaWduZWQgbG9uZylmaWVsZF9vZmZzZXQpOwogCiAJCS8qIGNoZWNrIGxlbmd0aCAqLwogCQlmaWVsZF9vZmZzZXQgPSAoX19wc2ludF90KQpAQCAtMzU1NCw3ICszNDU0LDcgQEAKIAkJcHRyICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KSArIG9wX2xlbjsKIAl9CiB9CS8qIHhsb2dfdmVyaWZ5X2ljbG9nICovCi0jZW5kaWYgLyogREVCVUcgJiYgIVhMT0dfTk9MT0cgKi8KKyNlbmRpZgogCiAvKgogICogTWFyayBhbGwgaWNsb2dzIElPRVJST1IuIExPR19MT0NLIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4KQEAgLTM2MDQsNiArMzUwNCw3IEBACiAJeGxvZ190aWNrZXRfdAkqdGljOwogCXhsb2dfdAkJKmxvZzsKIAlpbnQJCXJldHZhbDsKKwlpbnQJCWR1bW15OwogCVNQTERFQ0wocyk7CiAJU1BMREVDTChzMik7CiAKQEAgLTM2ODIsNyArMzU4Myw3IEBACiAJCSAqIEZvcmNlIHRoZSBpbmNvcmUgbG9ncyB0byBkaXNrIGJlZm9yZSBzaHV0dGluZyB0aGUKIAkJICogbG9nIGRvd24gY29tcGxldGVseS4KIAkJICovCi0JCXhsb2dfc3RhdGVfc3luY19hbGwobG9nLCBYRlNfTE9HX0ZPUkNFfFhGU19MT0dfU1lOQyk7CisJCXhsb2dfc3RhdGVfc3luY19hbGwobG9nLCBYRlNfTE9HX0ZPUkNFfFhGU19MT0dfU1lOQywgJmR1bW15KTsKIAkJczIgPSBMT0dfTE9DSyhsb2cpOwogCQlyZXR2YWwgPSB4bG9nX3N0YXRlX2lvZXJyb3IobG9nKTsKIAkJTE9HX1VOTE9DSyhsb2csIHMyKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmggYi9mcy94ZnMveGZzX2xvZy5oCmluZGV4IDE4OTYxMTEuLjE1ODgyOWMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmgKKysrIGIvZnMveGZzL3hmc19sb2cuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmCV9fWEZTX0xPR19IX18KICNkZWZpbmUgX19YRlNfTE9HX0hfXwpAQCAtMTc0LDkgKzE2MCwxMiBAQAogCQkgICAgICAgeGZzX2xvZ190aWNrZXRfdCB0aWNrZXQsCiAJCSAgICAgICB2b2lkCQkqKmljbG9nLAogCQkgICAgICAgdWludAkJZmxhZ3MpOwotaW50CSAgeGZzX2xvZ19mb3JjZShzdHJ1Y3QgeGZzX21vdW50ICptcCwKLQkJCXhmc19sc25fdAkgbHNuLAotCQkJdWludAkJIGZsYWdzKTsKK2ludAkgIF94ZnNfbG9nX2ZvcmNlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCQkJIHhmc19sc25fdAlsc24sCisJCQkgdWludAkJZmxhZ3MsCisJCQkgaW50CQkqbG9nX2ZvcmNlZCk7CisjZGVmaW5lIHhmc19sb2dfZm9yY2UobXAsIGxzbiwgZmxhZ3MpIFwKKwlfeGZzX2xvZ19mb3JjZShtcCwgbHNuLCBmbGFncywgTlVMTCk7CiBpbnQJICB4ZnNfbG9nX21vdW50KHN0cnVjdCB4ZnNfbW91bnQJKm1wLAogCQkJc3RydWN0IHhmc19idWZ0YXJnCSpsb2dfdGFyZ2V0LAogCQkJeGZzX2RhZGRyX3QJCXN0YXJ0X2Jsb2NrLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcHJpdi5oIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCmluZGV4IGE4ODRjZWEuLjhmMjg1MTQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaAorKysgYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZglfX1hGU19MT0dfUFJJVl9IX18KICNkZWZpbmUgX19YRlNfTE9HX1BSSVZfSF9fCkBAIC0zNSw2ICsyMSw3IEBACiBzdHJ1Y3QgeGZzX2J1ZjsKIHN0cnVjdCBrdHJhY2U7CiBzdHJ1Y3QgbG9nOworc3RydWN0IHhsb2dfdGlja2V0Owogc3RydWN0IHhmc19idWZfY2FuY2VsOwogc3RydWN0IHhmc19tb3VudDsKIApAQCAtMTIwLDc3ICsxMDcsNiBAQAogICAgICgoaSkgPj4gMjQpCiAjZW5kaWYKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YTE9HX0dSQU5UX1NVQl9TUEFDRSkKLXZvaWQgeGxvZ19ncmFudF9zdWJfc3BhY2Uoc3RydWN0IGxvZyAqbG9nLCBpbnQgYnl0ZXMsIGludCB0eXBlKTsKLSNkZWZpbmUgWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLGJ5dGVzLHR5cGUpCVwKLQl4bG9nX2dyYW50X3N1Yl9zcGFjZShsb2csYnl0ZXMsdHlwZSkKLSNlbHNlCi0jZGVmaW5lIFhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZyxieXRlcyx0eXBlKQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLQlpZiAodHlwZSA9PSAndycpIHsJCQkJCQlcCi0JCShsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzIC09IChieXRlcyk7CQkJXAotCQlpZiAoKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPCAwKSB7CQkJXAotCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgKz0gKGxvZyktPmxfbG9nc2l6ZTsJXAotCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfY3ljbGUtLTsJCQlcCi0JCX0JCQkJCQkJXAotCX0gZWxzZSB7CQkJCQkJCVwKLQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSAoYnl0ZXMpOwkJXAotCQlpZiAoKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA8IDApIHsJCQlcCi0JCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzICs9IChsb2cpLT5sX2xvZ3NpemU7XAotCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZS0tOwkJCVwKLQkJfQkJCQkJCQlcCi0JIH0JCQkJCQkJCVwKLSAgICB9Ci0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWExPR19HUkFOVF9BRERfU1BBQ0UpCi12b2lkIHhsb2dfZ3JhbnRfYWRkX3NwYWNlKHN0cnVjdCBsb2cgKmxvZywgaW50IGJ5dGVzLCBpbnQgdHlwZSk7Ci0jZGVmaW5lIFhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZyxieXRlcyx0eXBlKQlcCi0JeGxvZ19ncmFudF9hZGRfc3BhY2UobG9nLGJ5dGVzLHR5cGUpCi0jZWxzZQotI2RlZmluZSBYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csYnl0ZXMsdHlwZSkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0JaWYgKHR5cGUgPT0gJ3cnKSB7CQkJCQkJXAotCQkobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyArPSAoYnl0ZXMpOwkJCVwKLQkJaWYgKChsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzID4gKGxvZyktPmxfbG9nc2l6ZSkgewlcCi0JCQkobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyAtPSAobG9nKS0+bF9sb2dzaXplOwlcCi0JCQkobG9nKS0+bF9ncmFudF93cml0ZV9jeWNsZSsrOwkJCVwKLQkJfQkJCQkJCQlcCi0JfSBlbHNlIHsJCQkJCQkJXAotCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzICs9IChieXRlcyk7CQlcCi0JCWlmICgobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzID4gKGxvZyktPmxfbG9nc2l6ZSkgewlcCi0JCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzIC09IChsb2cpLT5sX2xvZ3NpemU7XAotCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZSsrOwkJCVwKLQkJfQkJCQkJCQlcCi0JIH0JCQkJCQkJCVwKLSAgICB9Ci0jZW5kaWYKLSNkZWZpbmUgWExPR19JTlNfVElDS0VUUShxLHRpYykJCQkJXAotICAgIHsJCQkJCQkJXAotCWlmIChxKSB7CQkJCQlcCi0JCSh0aWMpLT50X25leHQJICAgID0gKHEpOwkJXAotCQkodGljKS0+dF9wcmV2CSAgICA9IChxKS0+dF9wcmV2OwlcCi0JCShxKS0+dF9wcmV2LT50X25leHQgPSAodGljKTsJCVwKLQkJKHEpLT50X3ByZXYJICAgID0gKHRpYyk7CQlcCi0JfSBlbHNlIHsJCQkJCVwKLQkJKHRpYyktPnRfcHJldiA9ICh0aWMpLT50X25leHQgPSAodGljKTsJXAotCQkocSkgPSAodGljKTsJCQkJXAotCX0JCQkJCQlcCi0JKHRpYyktPnRfZmxhZ3MgfD0gWExPR19USUNfSU5fUTsJCVwKLSAgICB9Ci0jZGVmaW5lIFhMT0dfREVMX1RJQ0tFVFEocSx0aWMpCQkJCVwKLSAgICB7CQkJCQkJCVwKLQlpZiAoKHRpYykgPT0gKHRpYyktPnRfbmV4dCkgewkJCVwKLQkJKHEpID0gTlVMTDsJCQkJXAotCX0gZWxzZSB7CQkJCQlcCi0JCShxKSA9ICh0aWMpLT50X25leHQ7CQkJXAotCQkodGljKS0+dF9uZXh0LT50X3ByZXYgPSAodGljKS0+dF9wcmV2OwlcCi0JCSh0aWMpLT50X3ByZXYtPnRfbmV4dCA9ICh0aWMpLT50X25leHQ7CVwKLQl9CQkJCQkJXAotCSh0aWMpLT50X25leHQgPSAodGljKS0+dF9wcmV2ID0gTlVMTDsJCVwKLQkodGljKS0+dF9mbGFncyAmPSB+WExPR19USUNfSU5fUTsJCVwKLSAgICB9Ci0KLQogI2RlZmluZSBHUkFOVF9MT0NLKGxvZykJCW11dGV4X3NwaW5sb2NrKCYobG9nKS0+bF9ncmFudF9sb2NrKQogI2RlZmluZSBHUkFOVF9VTkxPQ0sobG9nLCBzKQltdXRleF9zcGludW5sb2NrKCYobG9nKS0+bF9ncmFudF9sb2NrLCBzKQogI2RlZmluZSBMT0dfTE9DSyhsb2cpCQltdXRleF9zcGlubG9jaygmKGxvZyktPmxfaWNsb2dsb2NrKQpAQCAtNTc2LDYgKzQ5Miw3NyBAQAogCQkJCQkJICogYWxpZ25tZW50IG1hc2sgKi8KIH0geGxvZ190OwogCisjZGVmaW5lIFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykJKChsb2cpLT5sX2ZsYWdzICYgWExPR19JT19FUlJPUikKKworI2RlZmluZSBYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csYnl0ZXMsdHlwZSkJXAorCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZyxieXRlcyx0eXBlKQorc3RhdGljIGlubGluZSB2b2lkIHhsb2dfZ3JhbnRfc3ViX3NwYWNlKHN0cnVjdCBsb2cgKmxvZywgaW50IGJ5dGVzLCBpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSAndycpIHsJCQkJCQlcCisJCShsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzIC09IChieXRlcyk7CQkJXAorCQlpZiAoKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPCAwKSB7CQkJXAorCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgKz0gKGxvZyktPmxfbG9nc2l6ZTsJXAorCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfY3ljbGUtLTsJCQlcCisJCX0JCQkJCQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSAoYnl0ZXMpOwkJXAorCQlpZiAoKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA8IDApIHsJCQlcCisJCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzICs9IChsb2cpLT5sX2xvZ3NpemU7XAorCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZS0tOwkJCVwKKwkJfQkJCQkJCQlcCisJIH0JCQkJCQkJCVwKK30KKworI2RlZmluZSBYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csYnl0ZXMsdHlwZSkJXAorCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZyxieXRlcyx0eXBlKQorc3RhdGljIGlubGluZSB2b2lkCit4bG9nX2dyYW50X2FkZF9zcGFjZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcywgaW50IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gJ3cnKSB7CQkJCQkJXAorCQkobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyArPSAoYnl0ZXMpOwkJCVwKKwkJaWYgKChsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzID4gKGxvZyktPmxfbG9nc2l6ZSkgewlcCisJCQkobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyAtPSAobG9nKS0+bF9sb2dzaXplOwlcCisJCQkobG9nKS0+bF9ncmFudF93cml0ZV9jeWNsZSsrOwkJCVwKKwkJfQkJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzICs9IChieXRlcyk7CQlcCisJCWlmICgobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzID4gKGxvZyktPmxfbG9nc2l6ZSkgewlcCisJCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzIC09IChsb2cpLT5sX2xvZ3NpemU7XAorCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZSsrOwkJCVwKKwkJfQkJCQkJCQlcCisJIH0JCQkJCQkJCVwKK30KKworI2RlZmluZSBYTE9HX0lOU19USUNLRVRRKHEsIHRpYykJeGxvZ19pbnNfdGlja2V0cShxLCB0aWMpCitzdGF0aWMgaW5saW5lIHZvaWQKK3hsb2dfaW5zX3RpY2tldHEoc3RydWN0IHhsb2dfdGlja2V0ICpxLCBzdHJ1Y3QgeGxvZ190aWNrZXQgKnRpYykKK3sJCQkJCQkJXAorCWlmIChxKSB7CQkJCQlcCisJCSh0aWMpLT50X25leHQJICAgID0gKHEpOwkJXAorCQkodGljKS0+dF9wcmV2CSAgICA9IChxKS0+dF9wcmV2OwlcCisJCShxKS0+dF9wcmV2LT50X25leHQgPSAodGljKTsJCVwKKwkJKHEpLT50X3ByZXYJICAgID0gKHRpYyk7CQlcCisJfSBlbHNlIHsJCQkJCVwKKwkJKHRpYyktPnRfcHJldiA9ICh0aWMpLT50X25leHQgPSAodGljKTsJXAorCQkocSkgPSAodGljKTsJCQkJXAorCX0JCQkJCQlcCisJKHRpYyktPnRfZmxhZ3MgfD0gWExPR19USUNfSU5fUTsJCVwKK30KKworI2RlZmluZSBYTE9HX0RFTF9USUNLRVRRKHEsIHRpYykJeGxvZ19kZWxfdGlja2V0cShxLCB0aWMpCitzdGF0aWMgaW5saW5lIHZvaWQKK3hsb2dfZGVsX3RpY2tldHEoc3RydWN0IHhsb2dfdGlja2V0ICpxLCBzdHJ1Y3QgeGxvZ190aWNrZXQgKnRpYykKK3sJCQkJCQkJXAorCWlmICgodGljKSA9PSAodGljKS0+dF9uZXh0KSB7CQkJXAorCQkocSkgPSBOVUxMOwkJCQlcCisJfSBlbHNlIHsJCQkJCVwKKwkJKHEpID0gKHRpYyktPnRfbmV4dDsJCQlcCisJCSh0aWMpLT50X25leHQtPnRfcHJldiA9ICh0aWMpLT50X3ByZXY7CVwKKwkJKHRpYyktPnRfcHJldi0+dF9uZXh0ID0gKHRpYyktPnRfbmV4dDsJXAorCX0JCQkJCQlcCisJKHRpYyktPnRfbmV4dCA9ICh0aWMpLT50X3ByZXYgPSBOVUxMOwkJXAorCSh0aWMpLT50X2ZsYWdzICY9IH5YTE9HX1RJQ19JTl9ROwkJXAorfQogCiAvKiBjb21tb24gcm91dGluZXMgKi8KIGV4dGVybiB4ZnNfbHNuX3QgeGxvZ19hc3NpZ25fdGFpbF9sc24oc3RydWN0IHhmc19tb3VudCAqbXApOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCmluZGV4IDE0ZmFhYmEuLjhhYjdkZjcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYworKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKQEAgLTEsNjYgKzEsNTEgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKLSNpbmNsdWRlICJ4ZnNfYWcuaCIKLSNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCi0jaW5jbHVkZSAieGZzX2ltYXAuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbWFwLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19sb2dfcHJpdi5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19sb2dfcmVjb3Zlci5oIgogI2luY2x1ZGUgInhmc19leHRmcmVlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgotI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKICNpbmNsdWRlICJ4ZnNfcncuaCIKIApAQCAtMjAxMyw3OSArMTk5OCw3NCBAQAogCSAqIFRoaXMgaXMgYWxsIGZpbmU7IHRoaW5ncyBhcmUgc3RpbGwgY29uc2lzdGVudCwgYW5kIHdlIGhhdmVuJ3QgbG9zdAogCSAqIGFueSBxdW90YSBpbmZvcm1hdGlvbi4gSnVzdCBkb24ndCBjb21wbGFpbiBhYm91dCBiYWQgZHF1b3QgYmxrcy4KIAkgKi8KLQlpZiAoSU5UX0dFVChkZHEtPmRfbWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RRVU9UX01BR0lDKSB7CisJaWYgKGJlMTZfdG9fY3B1KGRkcS0+ZF9tYWdpYykgIT0gWEZTX0RRVU9UX01BR0lDKSB7CiAJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCiAJCQljbW5fZXJyKENFX0FMRVJULAogCQkJIiVzIDogWEZTIGRxdW90IElEIDB4JXgsIG1hZ2ljIDB4JXggIT0gMHgleCIsCi0JCQlzdHIsIGlkLAotCQkJSU5UX0dFVChkZHEtPmRfbWFnaWMsIEFSQ0hfQ09OVkVSVCksIFhGU19EUVVPVF9NQUdJQyk7CisJCQlzdHIsIGlkLCBiZTE2X3RvX2NwdShkZHEtPmRfbWFnaWMpLCBYRlNfRFFVT1RfTUFHSUMpOwogCQllcnJzKys7CiAJfQotCWlmIChJTlRfR0VUKGRkcS0+ZF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQpICE9IFhGU19EUVVPVF9WRVJTSU9OKSB7CisJaWYgKGRkcS0+ZF92ZXJzaW9uICE9IFhGU19EUVVPVF9WRVJTSU9OKSB7CiAJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCiAJCQljbW5fZXJyKENFX0FMRVJULAogCQkJIiVzIDogWEZTIGRxdW90IElEIDB4JXgsIHZlcnNpb24gMHgleCAhPSAweCV4IiwKLQkJCXN0ciwgaWQsCi0JCQlJTlRfR0VUKGRkcS0+ZF9tYWdpYywgQVJDSF9DT05WRVJUKSwgWEZTX0RRVU9UX1ZFUlNJT04pOworCQkJc3RyLCBpZCwgZGRxLT5kX3ZlcnNpb24sIFhGU19EUVVPVF9WRVJTSU9OKTsKIAkJZXJycysrOwogCX0KIAotCWlmIChJTlRfR0VUKGRkcS0+ZF9mbGFncywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRFFfVVNFUiAmJgotCSAgICBJTlRfR0VUKGRkcS0+ZF9mbGFncywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRFFfUFJPSiAmJgotCSAgICBJTlRfR0VUKGRkcS0+ZF9mbGFncywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRFFfR1JPVVApIHsKKwlpZiAoZGRxLT5kX2ZsYWdzICE9IFhGU19EUV9VU0VSICYmCisJICAgIGRkcS0+ZF9mbGFncyAhPSBYRlNfRFFfUFJPSiAmJgorCSAgICBkZHEtPmRfZmxhZ3MgIT0gWEZTX0RRX0dST1VQKSB7CiAJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCiAJCQljbW5fZXJyKENFX0FMRVJULAogCQkJIiVzIDogWEZTIGRxdW90IElEIDB4JXgsIHVua25vd24gZmxhZ3MgMHgleCIsCi0JCQlzdHIsIGlkLCBJTlRfR0VUKGRkcS0+ZF9mbGFncywgQVJDSF9DT05WRVJUKSk7CisJCQlzdHIsIGlkLCBkZHEtPmRfZmxhZ3MpOwogCQllcnJzKys7CiAJfQogCi0JaWYgKGlkICE9IC0xICYmIGlkICE9IElOVF9HRVQoZGRxLT5kX2lkLCBBUkNIX0NPTlZFUlQpKSB7CisJaWYgKGlkICE9IC0xICYmIGlkICE9IGJlMzJfdG9fY3B1KGRkcS0+ZF9pZCkpIHsKIAkJaWYgKGZsYWdzICYgWEZTX1FNT1BUX0RPV0FSTikKIAkJCWNtbl9lcnIoQ0VfQUxFUlQsCiAJCQkiJXMgOiBvbmRpc2stZHF1b3QgMHglcCwgSUQgbWlzbWF0Y2g6ICIKIAkJCSIweCV4IGV4cGVjdGVkLCBmb3VuZCBpZCAweCV4IiwKLQkJCXN0ciwgZGRxLCBpZCwgSU5UX0dFVChkZHEtPmRfaWQsIEFSQ0hfQ09OVkVSVCkpOworCQkJc3RyLCBkZHEsIGlkLCBiZTMyX3RvX2NwdShkZHEtPmRfaWQpKTsKIAkJZXJycysrOwogCX0KIAogCWlmICghZXJycyAmJiBkZHEtPmRfaWQpIHsKLQkJaWYgKElOVF9HRVQoZGRxLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKLQkJICAgIElOVF9HRVQoZGRxLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA+PQotCQkJCUlOVF9HRVQoZGRxLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJaWYgKGRkcS0+ZF9ibGtfc29mdGxpbWl0ICYmCisJCSAgICBiZTY0X3RvX2NwdShkZHEtPmRfYmNvdW50KSA+PQorCQkJCWJlNjRfdG9fY3B1KGRkcS0+ZF9ibGtfc29mdGxpbWl0KSkgewogCQkJaWYgKCFkZHEtPmRfYnRpbWVyKSB7CiAJCQkJaWYgKGZsYWdzICYgWEZTX1FNT1BUX0RPV0FSTikKIAkJCQkJY21uX2VycihDRV9BTEVSVCwKIAkJCQkJIiVzIDogRHF1b3QgSUQgMHgleCAoMHglcCkgIgogCQkJCQkiQkxLIFRJTUVSIE5PVCBTVEFSVEVEIiwKLQkJCQkJc3RyLCAoaW50KQotCQkJCQlJTlRfR0VUKGRkcS0+ZF9pZCwgQVJDSF9DT05WRVJUKSwgZGRxKTsKKwkJCQkJc3RyLCAoaW50KWJlMzJfdG9fY3B1KGRkcS0+ZF9pZCksIGRkcSk7CiAJCQkJZXJycysrOwogCQkJfQogCQl9Ci0JCWlmIChJTlRfR0VUKGRkcS0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCi0JCSAgICBJTlRfR0VUKGRkcS0+ZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KLQkJCQlJTlRfR0VUKGRkcS0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSB7CisJCWlmIChkZHEtPmRfaW5vX3NvZnRsaW1pdCAmJgorCQkgICAgYmU2NF90b19jcHUoZGRxLT5kX2ljb3VudCkgPj0KKwkJCQliZTY0X3RvX2NwdShkZHEtPmRfaW5vX3NvZnRsaW1pdCkpIHsKIAkJCWlmICghZGRxLT5kX2l0aW1lcikgewogCQkJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCiAJCQkJCWNtbl9lcnIoQ0VfQUxFUlQsCiAJCQkJCSIlcyA6IERxdW90IElEIDB4JXggKDB4JXApICIKIAkJCQkJIklOT0RFIFRJTUVSIE5PVCBTVEFSVEVEIiwKLQkJCQkJc3RyLCAoaW50KQotCQkJCQlJTlRfR0VUKGRkcS0+ZF9pZCwgQVJDSF9DT05WRVJUKSwgZGRxKTsKKwkJCQkJc3RyLCAoaW50KWJlMzJfdG9fY3B1KGRkcS0+ZF9pZCksIGRkcSk7CiAJCQkJZXJycysrOwogCQkJfQogCQl9Ci0JCWlmIChJTlRfR0VUKGRkcS0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCi0JCSAgICBJTlRfR0VUKGRkcS0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSA+PQotCQkJCUlOVF9HRVQoZGRxLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJaWYgKGRkcS0+ZF9ydGJfc29mdGxpbWl0ICYmCisJCSAgICBiZTY0X3RvX2NwdShkZHEtPmRfcnRiY291bnQpID49CisJCQkJYmU2NF90b19jcHUoZGRxLT5kX3J0Yl9zb2Z0bGltaXQpKSB7CiAJCQlpZiAoIWRkcS0+ZF9ydGJ0aW1lcikgewogCQkJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCiAJCQkJCWNtbl9lcnIoQ0VfQUxFUlQsCiAJCQkJCSIlcyA6IERxdW90IElEIDB4JXggKDB4JXApICIKIAkJCQkJIlJUQkxLIFRJTUVSIE5PVCBTVEFSVEVEIiwKLQkJCQkJc3RyLCAoaW50KQotCQkJCQlJTlRfR0VUKGRkcS0+ZF9pZCwgQVJDSF9DT05WRVJUKSwgZGRxKTsKKwkJCQkJc3RyLCAoaW50KWJlMzJfdG9fY3B1KGRkcS0+ZF9pZCksIGRkcSk7CiAJCQkJZXJycysrOwogCQkJfQogCQl9CkBAIC0yMTAzLDEwICsyMDgzLDExIEBACiAJQVNTRVJUKGlkICE9IC0xKTsKIAlBU1NFUlQoZmxhZ3MgJiBYRlNfUU1PUFRfRFFSRVBBSVIpOwogCW1lbXNldChkLCAwLCBzaXplb2YoeGZzX2RxYmxrX3QpKTsKLQlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19EUVVPVF9NQUdJQyk7Ci0JSU5UX1NFVChkLT5kZF9kaXNrZHEuZF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQsIFhGU19EUVVPVF9WRVJTSU9OKTsKLQlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX2lkLCBBUkNIX0NPTlZFUlQsIGlkKTsKLQlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX2ZsYWdzLCBBUkNIX0NPTlZFUlQsIHR5cGUpOworCisJZC0+ZGRfZGlza2RxLmRfbWFnaWMgPSBjcHVfdG9fYmUxNihYRlNfRFFVT1RfTUFHSUMpOworCWQtPmRkX2Rpc2tkcS5kX3ZlcnNpb24gPSBYRlNfRFFVT1RfVkVSU0lPTjsKKwlkLT5kZF9kaXNrZHEuZF9mbGFncyA9IHR5cGU7CisJZC0+ZGRfZGlza2RxLmRfaWQgPSBjcHVfdG9fYmUzMihpZCk7CiAKIAlyZXR1cm4gZXJyczsKIH0KQEAgLTIyMjYsOCArMjIwNyw5IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBsb2ctPmxfbXAsCi0JCQkieGZzX2xvZ19yZWNvdmVyOiB1bmtub3duIGJ1ZmZlciB0eXBlIDB4JXgsIGRldiAlcyIsCi0JCQlidWZfZi0+YmxmX3R5cGUsIFhGU19CVUZUQVJHX05BTUUobG9nLT5sX3RhcmcpKTsKKwkJCSJ4ZnNfbG9nX3JlY292ZXI6IHVua25vd24gYnVmZmVyIHR5cGUgMHgleCwgbG9nZGV2ICVzIiwKKwkJCWJ1Zl9mLT5ibGZfdHlwZSwgbG9nLT5sX21wLT5tX2xvZ25hbWUgPworCQkJbG9nLT5sX21wLT5tX2xvZ25hbWUgOiAiaW50ZXJuYWwiKTsKIAkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ19yZWNvdmVyX2RvX2J1ZmZlcl90cmFucyIsCiAJCQkJIFhGU19FUlJMRVZFTF9MT1csIGxvZy0+bF9tcCk7CiAJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKQEAgLTMxNzgsMTMgKzMxNjAsMTIgQEAKIAl9CiAKIAlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2licCk7Ci0JaWYgKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0FHSV9NQUdJQykgeworCWlmIChiZTMyX3RvX2NwdShhZ2ktPmFnaV9tYWdpY251bSkgIT0gWEZTX0FHSV9NQUdJQykgewogCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfQUJPUlQpOwogCQlyZXR1cm47CiAJfQotCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0lfTUFHSUMpOwogCi0JSU5UX1NFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRdLCBBUkNIX0NPTlZFUlQsIE5VTExBR0lOTyk7CisJYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0XSA9IGNwdV90b19iZTMyKE5VTExBR0lOTyk7CiAJb2Zmc2V0ID0gb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfdW5saW5rZWQpICsKIAkJIChzaXplb2YoeGZzX2FnaW5vX3QpICogYnVja2V0KTsKIAl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYWdpYnAsIG9mZnNldCwKQEAgLTMyNDMsMTIgKzMyMjQsMTEgQEAKIAkJCQlYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKSk7CiAJCX0KIAkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdpYnApOwotCQlBU1NFUlQoWEZTX0FHSV9NQUdJQyA9PQotCQkJSU5UX0dFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSk7CisJCUFTU0VSVChYRlNfQUdJX01BR0lDID09IGJlMzJfdG9fY3B1KGFnaS0+YWdpX21hZ2ljbnVtKSk7CiAKIAkJZm9yIChidWNrZXQgPSAwOyBidWNrZXQgPCBYRlNfQUdJX1VOTElOS0VEX0JVQ0tFVFM7IGJ1Y2tldCsrKSB7CiAKLQkJCWFnaW5vID0gSU5UX0dFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRdLCBBUkNIX0NPTlZFUlQpOworCQkJYWdpbm8gPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRdKTsKIAkJCXdoaWxlIChhZ2lubyAhPSBOVUxMQUdJTk8pIHsKIAogCQkJCS8qCkBAIC0zMzM2LDggKzMzMTYsOCBAQAogCQkJCQkJCVhGU19BR0lfREFERFIobXApKSk7CiAJCQkJfQogCQkJCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnaWJwKTsKLQkJCQlBU1NFUlQoWEZTX0FHSV9NQUdJQyA9PSBJTlRfR0VUKAotCQkJCQlhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSk7CisJCQkJQVNTRVJUKFhGU19BR0lfTUFHSUMgPT0gYmUzMl90b19jcHUoCisJCQkJCWFnaS0+YWdpX21hZ2ljbnVtKSk7CiAJCQl9CiAJCX0KIApAQCAtMzkzOCw4ICszOTE4LDkgQEAKIAkJfQogCiAJCWNtbl9lcnIoQ0VfTk9URSwKLQkJCSJTdGFydGluZyBYRlMgcmVjb3Zlcnkgb24gZmlsZXN5c3RlbTogJXMgKGRldjogJXMpIiwKLQkJCWxvZy0+bF9tcC0+bV9mc25hbWUsIFhGU19CVUZUQVJHX05BTUUobG9nLT5sX3RhcmcpKTsKKwkJCSJTdGFydGluZyBYRlMgcmVjb3Zlcnkgb24gZmlsZXN5c3RlbTogJXMgKGxvZ2RldjogJXMpIiwKKwkJCWxvZy0+bF9tcC0+bV9mc25hbWUsIGxvZy0+bF9tcC0+bV9sb2duYW1lID8KKwkJCWxvZy0+bF9tcC0+bV9sb2duYW1lIDogImludGVybmFsIik7CiAKIAkJZXJyb3IgPSB4bG9nX2RvX3JlY292ZXIobG9nLCBoZWFkX2JsaywgdGFpbF9ibGspOwogCQlsb2ctPmxfZmxhZ3MgfD0gWExPR19SRUNPVkVSWV9ORUVERUQ7CkBAIC0zOTg3LDggKzM5NjgsOSBAQAogCQl4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeShsb2cpOwogCiAJCWNtbl9lcnIoQ0VfTk9URSwKLQkJCSJFbmRpbmcgWEZTIHJlY292ZXJ5IG9uIGZpbGVzeXN0ZW06ICVzIChkZXY6ICVzKSIsCi0JCQlsb2ctPmxfbXAtPm1fZnNuYW1lLCBYRlNfQlVGVEFSR19OQU1FKGxvZy0+bF90YXJnKSk7CisJCQkiRW5kaW5nIFhGUyByZWNvdmVyeSBvbiBmaWxlc3lzdGVtOiAlcyAobG9nZGV2OiAlcykiLAorCQkJbG9nLT5sX21wLT5tX2ZzbmFtZSwgbG9nLT5sX21wLT5tX2xvZ25hbWUgPworCQkJbG9nLT5sX21wLT5tX2xvZ25hbWUgOiAiaW50ZXJuYWwiKTsKIAkJbG9nLT5sX2ZsYWdzICY9IH5YTE9HX1JFQ09WRVJZX05FRURFRDsKIAl9IGVsc2UgewogCQljbW5fZXJyKENFX0RFQlVHLApAQCAtNDAzOCwxNCArNDAyMCwxMiBAQAogCQkJCQkJbXAsIGFnZmJwLCBhZ2ZkYWRkcik7CiAJCX0KIAkJYWdmcCA9IFhGU19CVUZfVE9fQUdGKGFnZmJwKTsKLQkJQVNTRVJUKFhGU19BR0ZfTUFHSUMgPT0KLQkJCUlOVF9HRVQoYWdmcC0+YWdmX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpKTsKLQkJQVNTRVJUKFhGU19BR0ZfR09PRF9WRVJTSU9OKAotCQkJSU5UX0dFVChhZ2ZwLT5hZ2ZfdmVyc2lvbm51bSwgQVJDSF9DT05WRVJUKSkpOwotCQlBU1NFUlQoSU5UX0dFVChhZ2ZwLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCkgPT0gYWdubyk7CisJCUFTU0VSVChYRlNfQUdGX01BR0lDID09IGJlMzJfdG9fY3B1KGFnZnAtPmFnZl9tYWdpY251bSkpOworCQlBU1NFUlQoWEZTX0FHRl9HT09EX1ZFUlNJT04oYmUzMl90b19jcHUoYWdmcC0+YWdmX3ZlcnNpb25udW0pKSk7CisJCUFTU0VSVChiZTMyX3RvX2NwdShhZ2ZwLT5hZ2Zfc2Vxbm8pID09IGFnbm8pOwogCi0JCWZyZWVibGtzICs9IElOVF9HRVQoYWdmcC0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQpICsKLQkJCSAgICBJTlRfR0VUKGFnZnAtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlmcmVlYmxrcyArPSBiZTMyX3RvX2NwdShhZ2ZwLT5hZ2ZfZnJlZWJsa3MpICsKKwkJCSAgICBiZTMyX3RvX2NwdShhZ2ZwLT5hZ2ZfZmxjb3VudCk7CiAJCXhmc19idWZfcmVsc2UoYWdmYnApOwogCiAJCWFnaWRhZGRyID0gWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdJX0RBRERSKG1wKSk7CkBAIC00MDU2LDE0ICs0MDM2LDEyIEBACiAJCQkJCSAgbXAsIGFnaWJwLCBhZ2lkYWRkcik7CiAJCX0KIAkJYWdpcCA9IFhGU19CVUZfVE9fQUdJKGFnaWJwKTsKLQkJQVNTRVJUKFhGU19BR0lfTUFHSUMgPT0KLQkJCUlOVF9HRVQoYWdpcC0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpKTsKLQkJQVNTRVJUKFhGU19BR0lfR09PRF9WRVJTSU9OKAotCQkJSU5UX0dFVChhZ2lwLT5hZ2lfdmVyc2lvbm51bSwgQVJDSF9DT05WRVJUKSkpOwotCQlBU1NFUlQoSU5UX0dFVChhZ2lwLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCkgPT0gYWdubyk7CisJCUFTU0VSVChYRlNfQUdJX01BR0lDID09IGJlMzJfdG9fY3B1KGFnaXAtPmFnaV9tYWdpY251bSkpOworCQlBU1NFUlQoWEZTX0FHSV9HT09EX1ZFUlNJT04oYmUzMl90b19jcHUoYWdpcC0+YWdpX3ZlcnNpb25udW0pKSk7CisJCUFTU0VSVChiZTMyX3RvX2NwdShhZ2lwLT5hZ2lfc2Vxbm8pID09IGFnbm8pOwogCi0JCWl0b3RhbCArPSBJTlRfR0VUKGFnaXAtPmFnaV9jb3VudCwgQVJDSF9DT05WRVJUKTsKLQkJaWZyZWUgKz0gSU5UX0dFVChhZ2lwLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlpdG90YWwgKz0gYmUzMl90b19jcHUoYWdpcC0+YWdpX2NvdW50KTsKKwkJaWZyZWUgKz0gYmUzMl90b19jcHUoYWdpcC0+YWdpX2ZyZWVjb3VudCk7CiAJCXhmc19idWZfcmVsc2UoYWdpYnApOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5oIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5oCmluZGV4IDQyMTU4YjQuLmIyMjU0NTUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuaAorKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmCV9fWEZTX0xPR19SRUNPVkVSX0hfXwogI2RlZmluZSBfX1hGU19MT0dfUkVDT1ZFUl9IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbWFjLmggYi9mcy94ZnMveGZzX21hYy5oCmluZGV4IDhkNTlhYWYuLjE4ZTBlOTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbWFjLmgKKysrIGIvZnMveGZzL3hmc19tYWMuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX01BQ19IX18KICNkZWZpbmUgX19YRlNfTUFDX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tYWNyb3MuYyBiL2ZzL3hmcy94ZnNfbWFjcm9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OGMyY2QuLjAwMDAwMDAKLS0tIGEvZnMveGZzL3hmc19tYWNyb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCi0gKi8KLQotI2RlZmluZQlYRlNfTUFDUk9fQwotCi0jaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgotI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCi0jaW5jbHVkZSAieGZzX2xvZy5oIgotI2luY2x1ZGUgInhmc190cmFucy5oIgotI2luY2x1ZGUgInhmc19zYi5oIgotI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgotI2luY2x1ZGUgInhmc19tb3VudC5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgotI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX3J3LmgiCi0jaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCi0jaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfbGVhZi5oIgotI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgotI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9ub2RlLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19JU05VTExEU1RBUlRCTE9DSykKLWludAotaXNudWxsZHN0YXJ0YmxvY2soeGZzX2Rmc2Jub190IHgpCi17Ci0JcmV0dXJuIElTTlVMTERTVEFSVEJMT0NLKHgpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX0lTTlVMTFNUQVJUQkxPQ0spCi1pbnQKLWlzbnVsbHN0YXJ0YmxvY2soeGZzX2ZzYmxvY2tfdCB4KQotewotCXJldHVybiBJU05VTExTVEFSVEJMT0NLKHgpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX05VTExTVEFSVEJMT0NLKQoteGZzX2ZzYmxvY2tfdAotbnVsbHN0YXJ0YmxvY2soaW50IGspCi17Ci0JcmV0dXJuIE5VTExTVEFSVEJMT0NLKGspOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1NUQVJUQkxPQ0tWQUwpCi14ZnNfZmlsYmxrc190Ci1zdGFydGJsb2NrdmFsKHhmc19mc2Jsb2NrX3QgeCkKLXsKLQlyZXR1cm4gU1RBUlRCTE9DS1ZBTCh4KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdfQ0hFQ0tfREFERFIpCi12b2lkCi14ZnNfYWdfY2hlY2tfZGFkZHIoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkLCB4ZnNfZXh0bGVuX3QgbGVuKQotewotCVhGU19BR19DSEVDS19EQUREUihtcCwgZCwgbGVuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdfREFERFIpCi14ZnNfZGFkZHJfdAoteGZzX2FnX2RhZGRyKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywgeGZzX2RhZGRyX3QgZCkKLXsKLQlyZXR1cm4gWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBkKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdfTUFYTEVWRUxTKQotaW50Ci14ZnNfYWdfbWF4bGV2ZWxzKHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX0FHX01BWExFVkVMUyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHQl9UT19EQUREUikKLXhmc19kYWRkcl90Ci14ZnNfYWdiX3RvX2RhZGRyKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywgeGZzX2FnYmxvY2tfdCBhZ2JubykKLXsKLQlyZXR1cm4gWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgYWdibm8pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0JfVE9fRlNCKQoteGZzX2ZzYmxvY2tfdAoteGZzX2FnYl90b19mc2IoeGZzX21vdW50X3QgKm1wLCB4ZnNfYWdudW1iZXJfdCBhZ25vLCB4ZnNfYWdibG9ja190IGFnYm5vKQotewotCXJldHVybiBYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywgYWdibm8pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0JMT0NLX01BWCkKLXhmc19hZ2Jsb2NrX3QKLXhmc19hZ2Jsb2NrX21heCh4ZnNfYWdibG9ja190IGEsIHhmc19hZ2Jsb2NrX3QgYikKLXsKLQlyZXR1cm4gWEZTX0FHQkxPQ0tfTUFYKGEsIGIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0JMT0NLX01JTikKLXhmc19hZ2Jsb2NrX3QKLXhmc19hZ2Jsb2NrX21pbih4ZnNfYWdibG9ja190IGEsIHhmc19hZ2Jsb2NrX3QgYikKLXsKLQlyZXR1cm4gWEZTX0FHQkxPQ0tfTUlOKGEsIGIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0ZfQkxPQ0spCi14ZnNfYWdibG9ja190Ci14ZnNfYWdmX2Jsb2NrKHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX0FHRl9CTE9DSyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHRl9HT09EX1ZFUlNJT04pCi1pbnQKLXhmc19hZ2ZfZ29vZF92ZXJzaW9uKHVuc2lnbmVkIHYpCi17Ci0JcmV0dXJuIFhGU19BR0ZfR09PRF9WRVJTSU9OKHYpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0ZMX0JMT0NLKQoteGZzX2FnYmxvY2tfdAoteGZzX2FnZmxfYmxvY2soeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfQUdGTF9CTE9DSyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHSV9CTE9DSykKLXhmc19hZ2Jsb2NrX3QKLXhmc19hZ2lfYmxvY2soeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfQUdJX0JMT0NLKG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdJX0dPT0RfVkVSU0lPTikKLWludAoteGZzX2FnaV9nb29kX3ZlcnNpb24odW5zaWduZWQgdikKLXsKLQlyZXR1cm4gWEZTX0FHSV9HT09EX1ZFUlNJT04odik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHSU5PX1RPX0FHQk5PKQoteGZzX2FnYmxvY2tfdAoteGZzX2FnaW5vX3RvX2FnYm5vKHhmc19tb3VudF90ICptcCwgeGZzX2FnaW5vX3QgaSkKLXsKLQlyZXR1cm4gWEZTX0FHSU5PX1RPX0FHQk5PKG1wLCBpKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdJTk9fVE9fSU5PKQoteGZzX2lub190Ci14ZnNfYWdpbm9fdG9faW5vKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYSwgeGZzX2FnaW5vX3QgaSkKLXsKLQlyZXR1cm4gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYSwgaSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHSU5PX1RPX09GRlNFVCkKLWludAoteGZzX2FnaW5vX3RvX29mZnNldCh4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ2lub190IGkpCi17Ci0JcmV0dXJuIFhGU19BR0lOT19UT19PRkZTRVQobXAsIGkpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BTExPQ19CTE9DS19NQVhSRUNTKQotaW50Ci14ZnNfYWxsb2NfYmxvY2tfbWF4cmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKLXsKLQlyZXR1cm4gWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2LCBjdXIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BTExPQ19CTE9DS19NSU5SRUNTKQotaW50Ci14ZnNfYWxsb2NfYmxvY2tfbWlucmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKLXsKLQlyZXR1cm4gWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2LCBjdXIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BTExPQ19CTE9DS19TSVpFKQotLypBUkdTVVNFRDEqLwotaW50Ci14ZnNfYWxsb2NfYmxvY2tfc2l6ZShpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKLXsKLQlyZXR1cm4gWEZTX0FMTE9DX0JMT0NLX1NJWkUobGV2LCBjdXIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BTExPQ19LRVlfQUREUikKLS8qQVJHU1VTRUQzKi8KLXhmc19hbGxvY19rZXlfdCAqCi14ZnNfYWxsb2Nfa2V5X2FkZHIoeGZzX2FsbG9jX2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCi17Ci0JcmV0dXJuIFhGU19BTExPQ19LRVlfQUREUihiYiwgaSwgY3VyKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUxMT0NfUFRSX0FERFIpCi14ZnNfYWxsb2NfcHRyX3QgKgoteGZzX2FsbG9jX3B0cl9hZGRyKHhmc19hbGxvY19ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfQUxMT0NfUFRSX0FERFIoYmIsIGksIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FMTE9DX1JFQ19BRERSKQotLypBUkdTVVNFRDMqLwoteGZzX2FsbG9jX3JlY190ICoKLXhmc19hbGxvY19yZWNfYWRkcih4ZnNfYWxsb2NfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKLXsKLQlyZXR1cm4gWEZTX0FMTE9DX1JFQ19BRERSKGJiLCBpLCBjdXIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTCkKLWludAoteGZzX2F0dHJfbGVhZl9lbnRzaXplX2xvY2FsKGludCBubGVuLCBpbnQgdmxlbikKLXsKLQlyZXR1cm4gWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMKG5sZW4sIHZsZW4pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTF9NQVgpCi1pbnQKLXhmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbF9tYXgoaW50IGJzaXplKQotewotCXJldHVybiBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUxfTUFYKGJzaXplKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKQotaW50Ci14ZnNfYXR0cl9sZWFmX2VudHNpemVfcmVtb3RlKGludCBubGVuKQotewotCXJldHVybiBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKG5sZW4pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfTkFNRSkKLWNoYXIgKgoteGZzX2F0dHJfbGVhZl9uYW1lKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmcCwgaW50IGlkeCkKLXsKLQlyZXR1cm4gWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWZwLCBpZHgpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfTkFNRV9MT0NBTCkKLXhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICoKLXhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpCi17Ci0JcmV0dXJuIFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmcCwgaWR4KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKQoteGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICoKLXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgaWR4KQotewotCXJldHVybiBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWZwLCBpZHgpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX1NGX0VOVFNJWkUpCi1pbnQKLXhmc19hdHRyX3NmX2VudHNpemUoeGZzX2F0dHJfc2ZfZW50cnlfdCAqc2ZlcCkKLXsKLQlyZXR1cm4gWEZTX0FUVFJfU0ZfRU5UU0laRShzZmVwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9TRl9FTlRTSVpFX0JZTkFNRSkKLWludAoteGZzX2F0dHJfc2ZfZW50c2l6ZV9ieW5hbWUoaW50IG5sZW4sIGludCB2bGVuKQotewotCXJldHVybiBYRlNfQVRUUl9TRl9FTlRTSVpFX0JZTkFNRShubGVuLCB2bGVuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9TRl9ORVhURU5UUlkpCi14ZnNfYXR0cl9zZl9lbnRyeV90ICoKLXhmc19hdHRyX3NmX25leHRlbnRyeSh4ZnNfYXR0cl9zZl9lbnRyeV90ICpzZmVwKQotewotCXJldHVybiBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FUVFJfU0ZfVE9UU0laRSkKLWludAoteGZzX2F0dHJfc2ZfdG90c2l6ZSh4ZnNfaW5vZGVfdCAqZHApCi17Ci0JcmV0dXJuIFhGU19BVFRSX1NGX1RPVFNJWkUoZHApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CSFZUT0kpCi14ZnNfaW5vZGVfdCAqCi14ZnNfYmh2dG9pKGJodl9kZXNjX3QgKmJodnApCi17Ci0JcmV0dXJuIFhGU19CSFZUT0koYmh2cCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JIVlRPTSkKLXhmc19tb3VudF90ICoKLXhmc19iaHZ0b20oYmh2X2Rlc2NfdCAqYmRwKQotewotCXJldHVybiBYRlNfQkhWVE9NKGJkcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX1ZGU1RPTSkKLXhmc19tb3VudF90ICoKLXhmc192ZnN0b20odmZzX3QgKnZmcykKLXsKLQlyZXR1cm4gWEZTX1ZGU1RPTSh2ZnMpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTV9NQVhMRVZFTFMpCi1pbnQKLXhmc19ibV9tYXhsZXZlbHMoeGZzX21vdW50X3QgKm1wLCBpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0JNX01BWExFVkVMUyhtcCwgdyk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MpCi1pbnQKLXhmc19ibWFwX2Jsb2NrX2RtYXhyZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUyhsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRE1JTlJFQ1MpCi1pbnQKLXhmc19ibWFwX2Jsb2NrX2RtaW5yZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfQk1BUF9CTE9DS19ETUlOUkVDUyhsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRFNJWkUpCi1pbnQKLXhmc19ibWFwX2Jsb2NrX2RzaXplKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfQk1BUF9CTE9DS19EU0laRShsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MpCi1pbnQKLXhmc19ibWFwX2Jsb2NrX2ltYXhyZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MpCi1pbnQKLXhmc19ibWFwX2Jsb2NrX2ltaW5yZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfSVNJWkUpCi1pbnQKLXhmc19ibWFwX2Jsb2NrX2lzaXplKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfQk1BUF9CTE9DS19JU0laRShsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfS0VZX0FERFIpCi0vKkFSR1NVU0VEMyovCi14ZnNfYm1idF9rZXlfdCAqCi14ZnNfYm1hcF9icm9vdF9rZXlfYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIGludCBzeikKLXsKLQlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfS0VZX0FERFIoYmIsIGksIHN6KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9NQVhSRUNTKQotaW50Ci14ZnNfYm1hcF9icm9vdF9tYXhyZWNzKGludCBzeikKLXsKLQlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfTlVNUkVDUykKLWludAoteGZzX2JtYXBfYnJvb3RfbnVtcmVjcyh4ZnNfYm1kcl9ibG9ja190ICpiYikKLXsKLQlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfTlVNUkVDUyhiYik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIpCi14ZnNfYm1idF9wdHJfdCAqCi14ZnNfYm1hcF9icm9vdF9wdHJfYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIGludCBzeikKLXsKLQlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmIsIGksIHN6KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9SRUNfQUREUikKLS8qQVJHU1VTRUQzKi8KLXhmc19ibWJ0X3JlY190ICoKLXhmc19ibWFwX2Jyb290X3JlY19hZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgaW50IHN6KQotewotCXJldHVybiBYRlNfQk1BUF9CUk9PVF9SRUNfQUREUihiYiwgaSwgc3opOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JST09UX1NQQUNFKQotaW50Ci14ZnNfYm1hcF9icm9vdF9zcGFjZSh4ZnNfYm1kcl9ibG9ja190ICpiYikKLXsKLQlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfU1BBQ0UoYmIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JST09UX1NQQUNFX0NBTEMpCi1pbnQKLXhmc19ibWFwX2Jyb290X3NwYWNlX2NhbGMoaW50IG5yZWNzKQotewotCXJldHVybiBYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKG5yZWNzKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9JQkxPQ0tfU0laRSkKLS8qQVJHU1VTRUQxKi8KLWludAoteGZzX2JtYXBfaWJsb2NrX3NpemUoaW50IGxldiwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCi17Ci0JcmV0dXJuIFhGU19CTUFQX0lCTE9DS19TSVpFKGxldiwgY3VyKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9JTklUKQotdm9pZAoteGZzX2JtYXBfaW5pdCh4ZnNfYm1hcF9mcmVlX3QgKmZscCwgeGZzX2ZzYmxvY2tfdCAqZmJwKQotewotCVhGU19CTUFQX0lOSVQoZmxwLCBmYnApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0tFWV9EQUREUikKLS8qQVJHU1VTRUQzKi8KLXhmc19ibWJ0X2tleV90ICoKLXhmc19ibWFwX2tleV9kYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfQk1BUF9LRVlfREFERFIoYmIsIGksIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfS0VZX0lBRERSKQotLypBUkdTVVNFRDMqLwoteGZzX2JtYnRfa2V5X3QgKgoteGZzX2JtYXBfa2V5X2lhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCi17Ci0JcmV0dXJuIFhGU19CTUFQX0tFWV9JQUREUihiYiwgaSwgY3VyKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9QVFJfREFERFIpCi14ZnNfYm1idF9wdHJfdCAqCi14ZnNfYm1hcF9wdHJfZGFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKLXsKLQlyZXR1cm4gWEZTX0JNQVBfUFRSX0RBRERSKGJiLCBpLCBjdXIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX1BUUl9JQUREUikKLXhmc19ibWJ0X3B0cl90ICoKLXhmc19ibWFwX3B0cl9pYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfQk1BUF9QVFJfSUFERFIoYmIsIGksIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfUkJMT0NLX0RTSVpFKQotLypBUkdTVVNFRDEqLwotaW50Ci14ZnNfYm1hcF9yYmxvY2tfZHNpemUoaW50IGxldiwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCi17Ci0JcmV0dXJuIFhGU19CTUFQX1JCTE9DS19EU0laRShsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfUkJMT0NLX0lTSVpFKQotLypBUkdTVVNFRDEqLwotaW50Ci14ZnNfYm1hcF9yYmxvY2tfaXNpemUoaW50IGxldiwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCi17Ci0JcmV0dXJuIFhGU19CTUFQX1JCTE9DS19JU0laRShsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfUkVDX0RBRERSKQotLypBUkdTVVNFRDMqLwoteGZzX2JtYnRfcmVjX3QgKgoteGZzX2JtYXBfcmVjX2RhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCi17Ci0JcmV0dXJuIFhGU19CTUFQX1JFQ19EQUREUihiYiwgaSwgY3VyKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9SRUNfSUFERFIpCi0vKkFSR1NVU0VEMyovCi14ZnNfYm1idF9yZWNfdCAqCi14ZnNfYm1hcF9yZWNfaWFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKLXsKLQlyZXR1cm4gWEZTX0JNQVBfUkVDX0lBRERSKGJiLCBpLCBjdXIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX1NBTklUWV9DSEVDSykKLWludAoteGZzX2JtYXBfc2FuaXR5X2NoZWNrKHhmc19tb3VudF90ICptcCwgeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBsZXZlbCkKLXsKLQlyZXR1cm4gWEZTX0JNQVBfU0FOSVRZX0NIRUNLKG1wLCBiYiwgbGV2ZWwpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQSV9BRkxBRykKLWludAoteGZzX2JtYXBpX2FmbGFnKGludCB3KQotewotCXJldHVybiBYRlNfQk1BUElfQUZMQUcodyk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNRFJfU1BBQ0VfQ0FMQykKLWludAoteGZzX2JtZHJfc3BhY2VfY2FsYyhpbnQgbnJlY3MpCi17Ci0JcmV0dXJuIFhGU19CTURSX1NQQUNFX0NBTEMobnJlY3MpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTk9fQkxPQ0spCi14ZnNfYWdibG9ja190Ci14ZnNfYm5vX2Jsb2NrKHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX0JOT19CTE9DSyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JUUkVFX0xPTkdfUFRSUykKLWludAoteGZzX2J0cmVlX2xvbmdfcHRycyh4ZnNfYnRudW1fdCBidG51bSkKLXsKLQlyZXR1cm4gWEZTX0JUUkVFX0xPTkdfUFRSUyhidG51bSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JVRl9UT19BR0YpCi14ZnNfYWdmX3QgKgoteGZzX2J1Zl90b19hZ2YoeGZzX2J1Zl90ICpicCkKLXsKLQlyZXR1cm4gWEZTX0JVRl9UT19BR0YoYnApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQUdGTCkKLXhmc19hZ2ZsX3QgKgoteGZzX2J1Zl90b19hZ2ZsKHhmc19idWZfdCAqYnApCi17Ci0JcmV0dXJuIFhGU19CVUZfVE9fQUdGTChicCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JVRl9UT19BR0kpCi14ZnNfYWdpX3QgKgoteGZzX2J1Zl90b19hZ2koeGZzX2J1Zl90ICpicCkKLXsKLQlyZXR1cm4gWEZTX0JVRl9UT19BR0koYnApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQUxMT0NfQkxPQ0spCi14ZnNfYWxsb2NfYmxvY2tfdCAqCi14ZnNfYnVmX3RvX2FsbG9jX2Jsb2NrKHhmc19idWZfdCAqYnApCi17Ci0JcmV0dXJuIFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQkxPQ0spCi14ZnNfYnRyZWVfYmxvY2tfdCAqCi14ZnNfYnVmX3RvX2Jsb2NrKHhmc19idWZfdCAqYnApCi17Ci0JcmV0dXJuIFhGU19CVUZfVE9fQkxPQ0soYnApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQk1CVF9CTE9DSykKLXhmc19ibWJ0X2Jsb2NrX3QgKgoteGZzX2J1Zl90b19ibWJ0X2Jsb2NrKHhmc19idWZfdCAqYnApCi17Ci0JcmV0dXJuIFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JVRl9UT19ESU5PREUpCi14ZnNfZGlub2RlX3QgKgoteGZzX2J1Zl90b19kaW5vZGUoeGZzX2J1Zl90ICpicCkKLXsKLQlyZXR1cm4gWEZTX0JVRl9UT19ESU5PREUoYnApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fSU5PQlRfQkxPQ0spCi14ZnNfaW5vYnRfYmxvY2tfdCAqCi14ZnNfYnVmX3RvX2lub2J0X2Jsb2NrKHhmc19idWZfdCAqYnApCi17Ci0JcmV0dXJuIFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fTEJMT0NLKQoteGZzX2J0cmVlX2xibG9ja190ICoKLXhmc19idWZfdG9fbGJsb2NrKHhmc19idWZfdCAqYnApCi17Ci0JcmV0dXJuIFhGU19CVUZfVE9fTEJMT0NLKGJwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQlVGX1RPX1NCTE9DSykKLXhmc19idHJlZV9zYmxvY2tfdCAqCi14ZnNfYnVmX3RvX3NibG9jayh4ZnNfYnVmX3QgKmJwKQotewotCXJldHVybiBYRlNfQlVGX1RPX1NCTE9DSyhicCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JVRl9UT19TQlApCi14ZnNfc2JfdCAqCi14ZnNfYnVmX3RvX3NicCh4ZnNfYnVmX3QgKmJwKQotewotCXJldHVybiBYRlNfQlVGX1RPX1NCUChicCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX0FTSVpFKQotaW50Ci14ZnNfY2ZvcmtfYXNpemVfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCB4ZnNfbW91bnRfdCAqbXApCi17Ci0JcmV0dXJuIFhGU19DRk9SS19BU0laRV9ESVNLKGRjcCwgbXApOwotfQotaW50Ci14ZnNfY2ZvcmtfYXNpemUoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfQ0ZPUktfQVNJWkUoZGNwLCBtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX0JPRkYpCi1pbnQKLXhmc19jZm9ya19ib2ZmX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCkKLXsKLQlyZXR1cm4gWEZTX0NGT1JLX0JPRkZfRElTSyhkY3ApOwotfQotaW50Ci14ZnNfY2ZvcmtfYm9mZih4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKQotewotCXJldHVybiBYRlNfQ0ZPUktfQk9GRihkY3ApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19EU0laRSkKLWludAoteGZzX2Nmb3JrX2RzaXplX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfQ0ZPUktfRFNJWkVfRElTSyhkY3AsIG1wKTsKLX0KLWludAoteGZzX2Nmb3JrX2RzaXplKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX0NGT1JLX0RTSVpFKGRjcCwgbXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19GTVRfU0VUKQotdm9pZAoteGZzX2Nmb3JrX2ZtdF9zZXQoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcsIGludCBuKQotewotCVhGU19DRk9SS19GTVRfU0VUKGRjcCwgdywgbik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX0ZPUk1BVCkKLWludAoteGZzX2Nmb3JrX2Zvcm1hdCh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0NGT1JLX0ZPUk1BVChkY3AsIHcpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19ORVhUX1NFVCkKLXZvaWQKLXhmc19jZm9ya19uZXh0X3NldCh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdywgaW50IG4pCi17Ci0JWEZTX0NGT1JLX05FWFRfU0VUKGRjcCwgdywgbik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX05FWFRFTlRTKQotaW50Ci14ZnNfY2ZvcmtfbmV4dGVudHNfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0NGT1JLX05FWFRFTlRTX0RJU0soZGNwLCB3KTsKLX0KLWludAoteGZzX2Nmb3JrX25leHRlbnRzKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3KQotewotCXJldHVybiBYRlNfQ0ZPUktfTkVYVEVOVFMoZGNwLCB3KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQ0ZPUktfUSkKLWludAoteGZzX2Nmb3JrX3FfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKQotewotCXJldHVybiBYRlNfQ0ZPUktfUV9ESVNLKGRjcCk7Ci19Ci1pbnQKLXhmc19jZm9ya19xKHhmc19kaW5vZGVfY29yZV90ICpkY3ApCi17Ci0JcmV0dXJuIFhGU19DRk9SS19RKGRjcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX1NJWkUpCi1pbnQKLXhmc19jZm9ya19zaXplX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgeGZzX21vdW50X3QgKm1wLCBpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0NGT1JLX1NJWkVfRElTSyhkY3AsIG1wLCB3KTsKLX0KLWludAoteGZzX2Nmb3JrX3NpemUoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgeGZzX21vdW50X3QgKm1wLCBpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0NGT1JLX1NJWkUoZGNwLCBtcCwgdyk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NOVF9CTE9DSykKLXhmc19hZ2Jsb2NrX3QKLXhmc19jbnRfYmxvY2soeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfQ05UX0JMT0NLKG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREFfQ09PS0lFX0JOTykKLXhmc19kYWJsa190Ci14ZnNfZGFfY29va2llX2Jubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19vZmZfdCBjb29raWUpCi17Ci0JcmV0dXJuIFhGU19EQV9DT09LSUVfQk5PKG1wLCBjb29raWUpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQV9DT09LSUVfRU5UUlkpCi1pbnQKLXhmc19kYV9jb29raWVfZW50cnkoeGZzX21vdW50X3QgKm1wLCB4ZnNfb2ZmX3QgY29va2llKQotewotCXJldHVybiBYRlNfREFfQ09PS0lFX0VOVFJZKG1wLCBjb29raWUpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQV9DT09LSUVfSEFTSCkKLS8qQVJHU1VTRUQxKi8KLXhmc19kYWhhc2hfdAoteGZzX2RhX2Nvb2tpZV9oYXNoKHhmc19tb3VudF90ICptcCwgeGZzX29mZl90IGNvb2tpZSkKLXsKLQlyZXR1cm4gWEZTX0RBX0NPT0tJRV9IQVNIKG1wLCBjb29raWUpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQV9NQUtFX0JOT0VOVFJZKQotX191aW50MzJfdAoteGZzX2RhX21ha2VfYm5vZW50cnkoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFibGtfdCBibm8sIGludCBlbnRyeSkKLXsKLQlyZXR1cm4gWEZTX0RBX01BS0VfQk5PRU5UUlkobXAsIGJubywgZW50cnkpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQV9NQUtFX0NPT0tJRSkKLXhmc19vZmZfdAoteGZzX2RhX21ha2VfY29va2llKHhmc19tb3VudF90ICptcCwgeGZzX2RhYmxrX3QgYm5vLCBpbnQgZW50cnksCi0JCSAgIHhmc19kYWhhc2hfdCBoYXNoKQotewotCXJldHVybiBYRlNfREFfTUFLRV9DT09LSUUobXAsIGJubywgZW50cnksIGhhc2gpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQUREUl9UT19BR0JOTykKLXhmc19hZ2Jsb2NrX3QKLXhmc19kYWRkcl90b19hZ2Jubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWRkcl90IGQpCi17Ci0JcmV0dXJuIFhGU19EQUREUl9UT19BR0JOTyhtcCwgZCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RBRERSX1RPX0FHTk8pCi14ZnNfYWdudW1iZXJfdAoteGZzX2RhZGRyX3RvX2Fnbm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkKQotewotCXJldHVybiBYRlNfREFERFJfVE9fQUdOTyhtcCwgZCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RBRERSX1RPX0ZTQikKLXhmc19mc2Jsb2NrX3QKLXhmc19kYWRkcl90b19mc2IoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkKQotewotCXJldHVybiBYRlNfREFERFJfVE9fRlNCKG1wLCBkKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREZPUktfQVBUUikKLWNoYXIgKgoteGZzX2Rmb3JrX2FwdHIoeGZzX2Rpbm9kZV90ICpkaXApCi17Ci0JcmV0dXJuIFhGU19ERk9SS19BUFRSKGRpcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX0FTSVpFKQotaW50Ci14ZnNfZGZvcmtfYXNpemUoeGZzX2Rpbm9kZV90ICpkaXAsIHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX0RGT1JLX0FTSVpFKGRpcCwgbXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ERk9SS19CT0ZGKQotaW50Ci14ZnNfZGZvcmtfYm9mZih4ZnNfZGlub2RlX3QgKmRpcCkKLXsKLQlyZXR1cm4gWEZTX0RGT1JLX0JPRkYoZGlwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREZPUktfRFBUUikKLWNoYXIgKgoteGZzX2Rmb3JrX2RwdHIoeGZzX2Rpbm9kZV90ICpkaXApCi17Ci0JcmV0dXJuIFhGU19ERk9SS19EUFRSKGRpcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX0RTSVpFKQotaW50Ci14ZnNfZGZvcmtfZHNpemUoeGZzX2Rpbm9kZV90ICpkaXAsIHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX0RGT1JLX0RTSVpFKGRpcCwgbXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ERk9SS19ORVhURU5UUykKLWludAoteGZzX2Rmb3JrX25leHRlbnRzKHhmc19kaW5vZGVfdCAqZGlwLCBpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0RGT1JLX05FWFRFTlRTKGRpcCwgdyk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX1BUUikKLWNoYXIgKgoteGZzX2Rmb3JrX3B0cih4ZnNfZGlub2RlX3QgKmRpcCwgaW50IHcpCi17Ci0JcmV0dXJuIFhGU19ERk9SS19QVFIoZGlwLCB3KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREZPUktfUSkKLWludAoteGZzX2Rmb3JrX3EoeGZzX2Rpbm9kZV90ICpkaXApCi17Ci0JcmV0dXJuIFhGU19ERk9SS19RKGRpcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX1NJWkUpCi1pbnQKLXhmc19kZm9ya19zaXplKHhmc19kaW5vZGVfdCAqZGlwLCB4ZnNfbW91bnRfdCAqbXAsIGludCB3KQotewotCXJldHVybiBYRlNfREZPUktfU0laRShkaXAsIG1wLCB3KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElOT0RFX0dPT0RfVkVSU0lPTikKLWludAoteGZzX2Rpbm9kZV9nb29kX3ZlcnNpb24oaW50IHYpCi17Ci0JcmV0dXJuIFhGU19ESU5PREVfR09PRF9WRVJTSU9OKHYpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVJfTEVBRl9FTlRTSVpFX0JZRU5UUlkpCi1pbnQKLXhmc19kaXJfbGVhZl9lbnRzaXplX2J5ZW50cnkoeGZzX2Rpcl9sZWFmX2VudHJ5X3QgKmVudHJ5KQotewotCXJldHVybiBYRlNfRElSX0xFQUZfRU5UU0laRV9CWUVOVFJZKGVudHJ5KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUpCi1pbnQKLXhmc19kaXJfbGVhZl9lbnRzaXplX2J5bmFtZShpbnQgbGVuKQotewotCXJldHVybiBYRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUobGVuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX0xFQUZfTkFNRVNUUlVDVCkKLXhmc19kaXJfbGVhZl9uYW1lX3QgKgoteGZzX2Rpcl9sZWFmX25hbWVzdHJ1Y3QoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBvZmZzZXQpCi17Ci0JcmV0dXJuIFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWZwLCBvZmZzZXQpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVJfU0ZfQUxMRklUKQotaW50Ci14ZnNfZGlyX3NmX2FsbGZpdChpbnQgY291bnQsIGludCB0b3RhbGxlbikKLXsKLQlyZXR1cm4gWEZTX0RJUl9TRl9BTExGSVQoY291bnQsIHRvdGFsbGVuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWSkKLWludAoteGZzX2Rpcl9zZl9lbnRzaXplX2J5ZW50cnkoeGZzX2Rpcl9zZl9lbnRyeV90ICpzZmVwKQotewotCXJldHVybiBYRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWShzZmVwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKQotaW50Ci14ZnNfZGlyX3NmX2VudHNpemVfYnluYW1lKGludCBsZW4pCi17Ci0JcmV0dXJuIFhGU19ESVJfU0ZfRU5UU0laRV9CWU5BTUUobGVuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX1NGX0dFVF9ESVJJTk8pCi12b2lkCi14ZnNfZGlyX3NmX2dldF9kaXJpbm8oeGZzX2Rpcl9pbm9fdCAqZnJvbSwgeGZzX2lub190ICp0bykKLXsKLQlYRlNfRElSX1NGX0dFVF9ESVJJTk8oZnJvbSwgdG8pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVJfU0ZfTkVYVEVOVFJZKQoteGZzX2Rpcl9zZl9lbnRyeV90ICoKLXhmc19kaXJfc2ZfbmV4dGVudHJ5KHhmc19kaXJfc2ZfZW50cnlfdCAqc2ZlcCkKLXsKLQlyZXR1cm4gWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUl9TRl9QVVRfRElSSU5PKQotdm9pZAoteGZzX2Rpcl9zZl9wdXRfZGlyaW5vKHhmc19pbm9fdCAqZnJvbSwgeGZzX2Rpcl9pbm9fdCAqdG8pCi17Ci0JWEZTX0RJUl9TRl9QVVRfRElSSU5PKGZyb20sIHRvKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9CTE9DS19MRUFGX1ApCi14ZnNfZGlyMl9sZWFmX2VudHJ5X3QgKgoteGZzX2RpcjJfYmxvY2tfbGVhZl9wKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCAqYnRwKQotewotCXJldHVybiBYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9CTE9DS19UQUlMX1ApCi14ZnNfZGlyMl9ibG9ja190YWlsX3QgKgoteGZzX2RpcjJfYmxvY2tfdGFpbF9wKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfYmxvY2tfdCAqYmxvY2spCi17Ci0JcmV0dXJuIFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0JZVEVfVE9fREEpCi14ZnNfZGFibGtfdAoteGZzX2RpcjJfYnl0ZV90b19kYSh4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQotewotCXJldHVybiBYRlNfRElSMl9CWVRFX1RPX0RBKG1wLCBieSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfQllURV9UT19EQVRBUFRSKQotLyogQVJHU1VTRUQgKi8KLXhmc19kaXIyX2RhdGFwdHJfdAoteGZzX2RpcjJfYnl0ZV90b19kYXRhcHRyKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpCi17Ci0JcmV0dXJuIFhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgYnkpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0JZVEVfVE9fREIpCi14ZnNfZGlyMl9kYl90Ci14ZnNfZGlyMl9ieXRlX3RvX2RiKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpCi17Ci0JcmV0dXJuIFhGU19ESVIyX0JZVEVfVE9fREIobXAsIGJ5KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX09GRikKLXhmc19kaXIyX2RhdGFfYW9mZl90Ci14ZnNfZGlyMl9ieXRlX3RvX29mZih4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQotewotCXJldHVybiBYRlNfRElSMl9CWVRFX1RPX09GRihtcCwgYnkpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBX1RPX0JZVEUpCi14ZnNfZGlyMl9vZmZfdAoteGZzX2RpcjJfZGFfdG9fYnl0ZSh4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWJsa190IGRhKQotewotCXJldHVybiBYRlNfRElSMl9EQV9UT19CWVRFKG1wLCBkYSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREFfVE9fREIpCi14ZnNfZGlyMl9kYl90Ci14ZnNfZGlyMl9kYV90b19kYih4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWJsa190IGRhKQotewotCXJldHVybiBYRlNfRElSMl9EQV9UT19EQihtcCwgZGEpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBVEFfRU5UUllfVEFHX1ApCi14ZnNfZGlyMl9kYXRhX29mZl90ICoKLXhmc19kaXIyX2RhdGFfZW50cnlfdGFnX3AoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICpkZXApCi17Ci0JcmV0dXJuIFhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQVRBX0VOVFNJWkUpCi1pbnQKLXhmc19kaXIyX2RhdGFfZW50c2l6ZShpbnQgbikKLXsKLQlyZXR1cm4gWEZTX0RJUjJfREFUQV9FTlRTSVpFKG4pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKQoteGZzX2RpcjJfZGF0YV9vZmZfdCAqCi14ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcCh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXApCi17Ci0JcmV0dXJuIFhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKGR1cCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKQotLyogQVJHU1VTRUQgKi8KLXhmc19kaXIyX29mZl90Ci14ZnNfZGlyMl9kYXRhcHRyX3RvX2J5dGUoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYXRhcHRyX3QgZHApCi17Ci0JcmV0dXJuIFhGU19ESVIyX0RBVEFQVFJfVE9fQllURShtcCwgZHApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBVEFQVFJfVE9fREIpCi14ZnNfZGlyMl9kYl90Ci14ZnNfZGlyMl9kYXRhcHRyX3RvX2RiKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKQotewotCXJldHVybiBYRlNfRElSMl9EQVRBUFRSX1RPX0RCKG1wLCBkcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREFUQVBUUl9UT19PRkYpCi14ZnNfZGlyMl9kYXRhX2FvZmZfdAoteGZzX2RpcjJfZGF0YXB0cl90b19vZmYoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYXRhcHRyX3QgZHApCi17Ci0JcmV0dXJuIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCBkcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUpCi14ZnNfZGlyMl9vZmZfdAoteGZzX2RpcjJfZGJfb2ZmX3RvX2J5dGUoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYl90IGRiLAotCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbykKLXsKLQlyZXR1cm4gWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUobXAsIGRiLCBvKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUikKLXhmc19kaXIyX2RhdGFwdHJfdAoteGZzX2RpcjJfZGJfb2ZmX3RvX2RhdGFwdHIoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYl90IGRiLAotCQkJICAgeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbykKLXsKLQlyZXR1cm4gWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIGRiLCBvKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQl9UT19EQSkKLXhmc19kYWJsa190Ci14ZnNfZGlyMl9kYl90b19kYSh4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX2RiX3QgZGIpCi17Ci0JcmV0dXJuIFhGU19ESVIyX0RCX1RPX0RBKG1wLCBkYik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREJfVE9fRkRCKQoteGZzX2RpcjJfZGJfdAoteGZzX2RpcjJfZGJfdG9fZmRiKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfZGJfdCBkYikKLXsKLQlyZXR1cm4gWEZTX0RJUjJfREJfVE9fRkRCKG1wLCBkYik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREJfVE9fRkRJTkRFWCkKLWludAoteGZzX2RpcjJfZGJfdG9fZmRpbmRleCh4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX2RiX3QgZGIpCi17Ci0JcmV0dXJuIFhGU19ESVIyX0RCX1RPX0ZESU5ERVgobXAsIGRiKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9MRUFGX0JFU1RTX1ApCi14ZnNfZGlyMl9kYXRhX29mZl90ICoKLXhmc19kaXIyX2xlYWZfYmVzdHNfcCh4ZnNfZGlyMl9sZWFmX3RhaWxfdCAqbHRwKQotewotCXJldHVybiBYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9MRUFGX1RBSUxfUCkKLXhmc19kaXIyX2xlYWZfdGFpbF90ICoKLXhmc19kaXIyX2xlYWZfdGFpbF9wKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfbGVhZl90ICpscCkKLXsKLQlyZXR1cm4gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9NQVhfTEVBRl9FTlRTKQotaW50Ci14ZnNfZGlyMl9tYXhfbGVhZl9lbnRzKHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX0RJUjJfTUFYX0xFQUZfRU5UUyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfRU5UU0laRV9CWUVOVFJZKQotaW50Ci14ZnNfZGlyMl9zZl9lbnRzaXplX2J5ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKQotewotCXJldHVybiBYRlNfRElSMl9TRl9FTlRTSVpFX0JZRU5UUlkoc2ZwLCBzZmVwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9GSVJTVEVOVFJZKQoteGZzX2RpcjJfc2ZfZW50cnlfdCAqCi14ZnNfZGlyMl9zZl9maXJzdGVudHJ5KHhmc19kaXIyX3NmX3QgKnNmcCkKLXsKLQlyZXR1cm4gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKQotaW50Ci14ZnNfZGlyMl9zZl9lbnRzaXplX2J5bmFtZSh4ZnNfZGlyMl9zZl90ICpzZnAsIGludCBsZW4pCi17Ci0JcmV0dXJuIFhGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKHNmcCwgbGVuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9HRVRfSU5VTUJFUikKLXhmc19pbnRpbm9fdAoteGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9pbm91X3QgKmZyb20pCi17Ci0JcmV0dXJuIFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwgZnJvbSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfR0VUX09GRlNFVCkKLXhmc19kaXIyX2RhdGFfYW9mZl90Ci14ZnNfZGlyMl9zZl9nZXRfb2Zmc2V0KHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXApCi17Ci0JcmV0dXJuIFhGU19ESVIyX1NGX0dFVF9PRkZTRVQoc2ZlcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfSERSX1NJWkUpCi1pbnQKLXhmc19kaXIyX3NmX2hkcl9zaXplKGludCBpOGNvdW50KQotewotCXJldHVybiBYRlNfRElSMl9TRl9IRFJfU0laRShpOGNvdW50KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9JTlVNQkVSUCkKLXhmc19kaXIyX2lub3VfdCAqCi14ZnNfZGlyMl9zZl9pbnVtYmVycCh4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKQotewotCXJldHVybiBYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9ORVhURU5UUlkpCi14ZnNfZGlyMl9zZl9lbnRyeV90ICoKLXhmc19kaXIyX3NmX25leHRlbnRyeSh4ZnNfZGlyMl9zZl90ICpzZnAsIHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXApCi17Ci0JcmV0dXJuIFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX1NGX1BVVF9JTlVNQkVSKQotdm9pZAoteGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfaW5vX3QgKmZyb20sIHhmc19kaXIyX2lub3VfdCAqdG8pCi17Ci0JWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLCBmcm9tLCB0byk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfUFVUX09GRlNFVCkKLXZvaWQKLXhmc19kaXIyX3NmX3B1dF9vZmZzZXQoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCwgeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2ZmKQotewotCVhGU19ESVIyX1NGX1BVVF9PRkZTRVQoc2ZlcCwgb2ZmKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRVhURk1UX0lOT0RFICkKLXhmc19leG50Zm10X3QKLXhmc19leHRmbXRfaW5vZGUoc3RydWN0IHhmc19pbm9kZSAqaXApCi17Ci0JcmV0dXJuIFhGU19FWFRGTVRfSU5PREUoaXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19FWFRMRU5fTUFYKQoteGZzX2V4dGxlbl90Ci14ZnNfZXh0bGVuX21heCh4ZnNfZXh0bGVuX3QgYSwgeGZzX2V4dGxlbl90IGIpCi17Ci0JcmV0dXJuIFhGU19FWFRMRU5fTUFYKGEsIGIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19FWFRMRU5fTUlOKQoteGZzX2V4dGxlbl90Ci14ZnNfZXh0bGVuX21pbih4ZnNfZXh0bGVuX3QgYSwgeGZzX2V4dGxlbl90IGIpCi17Ci0JcmV0dXJuIFhGU19FWFRMRU5fTUlOKGEsIGIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GSUxCTEtTX01BWCkKLXhmc19maWxibGtzX3QKLXhmc19maWxibGtzX21heCh4ZnNfZmlsYmxrc190IGEsIHhmc19maWxibGtzX3QgYikKLXsKLQlyZXR1cm4gWEZTX0ZJTEJMS1NfTUFYKGEsIGIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GSUxCTEtTX01JTikKLXhmc19maWxibGtzX3QKLXhmc19maWxibGtzX21pbih4ZnNfZmlsYmxrc190IGEsIHhmc19maWxibGtzX3QgYikKLXsKLQlyZXR1cm4gWEZTX0ZJTEJMS1NfTUlOKGEsIGIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GSUxFT0ZGX01BWCkKLXhmc19maWxlb2ZmX3QKLXhmc19maWxlb2ZmX21heCh4ZnNfZmlsZW9mZl90IGEsIHhmc19maWxlb2ZmX3QgYikKLXsKLQlyZXR1cm4gWEZTX0ZJTEVPRkZfTUFYKGEsIGIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GSUxFT0ZGX01JTikKLXhmc19maWxlb2ZmX3QKLXhmc19maWxlb2ZmX21pbih4ZnNfZmlsZW9mZl90IGEsIHhmc19maWxlb2ZmX3QgYikKLXsKLQlyZXR1cm4gWEZTX0ZJTEVPRkZfTUlOKGEsIGIpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GU0JfU0FOSVRZX0NIRUNLKQotaW50Ci14ZnNfZnNiX3Nhbml0eV9jaGVjayh4ZnNfbW91bnRfdCAqbXAsIHhmc19mc2Jsb2NrX3QgZnNibm8pCi17Ci0JcmV0dXJuIFhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBmc2Jubyk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0ZTQl9UT19BR0JOTykKLXhmc19hZ2Jsb2NrX3QKLXhmc19mc2JfdG9fYWdibm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKQotewotCXJldHVybiBYRlNfRlNCX1RPX0FHQk5PKG1wLCBmc2Jubyk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0ZTQl9UT19BR05PKQoteGZzX2FnbnVtYmVyX3QKLXhmc19mc2JfdG9fYWdubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19mc2Jsb2NrX3QgZnNibm8pCi17Ci0JcmV0dXJuIFhGU19GU0JfVE9fQUdOTyhtcCwgZnNibm8pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GU0JfVE9fREFERFIpCi14ZnNfZGFkZHJfdAoteGZzX2ZzYl90b19kYWRkcih4ZnNfbW91bnRfdCAqbXAsIHhmc19mc2Jsb2NrX3QgZnNibm8pCi17Ci0JcmV0dXJuIFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRlNCX1RPX0RCKQoteGZzX2RhZGRyX3QKLXhmc19mc2JfdG9fZGIoeGZzX2lub2RlX3QgKmlwLCB4ZnNfZnNibG9ja190IGZzYikKLXsKLQlyZXR1cm4gWEZTX0ZTQl9UT19EQihpcCwgZnNiKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSERSX0JMT0NLKQoteGZzX2FnYmxvY2tfdAoteGZzX2hkcl9ibG9jayh4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWRkcl90IGQpCi17Ci0JcmV0dXJuIFhGU19IRFJfQkxPQ0sobXAsIGQpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JQUxMT0NfQkxPQ0tTKQoteGZzX2V4dGxlbl90Ci14ZnNfaWFsbG9jX2Jsb2Nrcyh4ZnNfbW91bnRfdCAqbXApCi17Ci0JcmV0dXJuIFhGU19JQUxMT0NfQkxPQ0tTKG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUFMTE9DX0ZJTkRfRlJFRSkKLWludAoteGZzX2lhbGxvY19maW5kX2ZyZWUoeGZzX2lub2ZyZWVfdCAqZnApCi17Ci0JcmV0dXJuIFhGU19JQUxMT0NfRklORF9GUkVFKGZwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUFMTE9DX0lOT0RFUykKLWludAoteGZzX2lhbGxvY19pbm9kZXMoeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfSUFMTE9DX0lOT0RFUyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lCVF9CTE9DSykKLXhmc19hZ2Jsb2NrX3QKLXhmc19pYnRfYmxvY2soeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfSUJUX0JMT0NLKG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUZPUktfQVNJWkUpCi1pbnQKLXhmc19pZm9ya19hc2l6ZSh4ZnNfaW5vZGVfdCAqaXApCi17Ci0JcmV0dXJuIFhGU19JRk9SS19BU0laRShpcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX0RTSVpFKQotaW50Ci14ZnNfaWZvcmtfZHNpemUoeGZzX2lub2RlX3QgKmlwKQotewotCXJldHVybiBYRlNfSUZPUktfRFNJWkUoaXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JRk9SS19GTVRfU0VUKQotdm9pZAoteGZzX2lmb3JrX2ZtdF9zZXQoeGZzX2lub2RlX3QgKmlwLCBpbnQgdywgaW50IG4pCi17Ci0JWEZTX0lGT1JLX0ZNVF9TRVQoaXAsIHcsIG4pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JRk9SS19GT1JNQVQpCi1pbnQKLXhmc19pZm9ya19mb3JtYXQoeGZzX2lub2RlX3QgKmlwLCBpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0lGT1JLX0ZPUk1BVChpcCwgdyk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX05FWFRfU0VUKQotdm9pZAoteGZzX2lmb3JrX25leHRfc2V0KHhmc19pbm9kZV90ICppcCwgaW50IHcsIGludCBuKQotewotCVhGU19JRk9SS19ORVhUX1NFVChpcCwgdywgbik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX05FWFRFTlRTKQotaW50Ci14ZnNfaWZvcmtfbmV4dGVudHMoeGZzX2lub2RlX3QgKmlwLCBpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUZPUktfUFRSKQoteGZzX2lmb3JrX3QgKgoteGZzX2lmb3JrX3B0cih4ZnNfaW5vZGVfdCAqaXAsIGludCB3KQotewotCXJldHVybiBYRlNfSUZPUktfUFRSKGlwLCB3KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUZPUktfUSkKLWludAoteGZzX2lmb3JrX3EoeGZzX2lub2RlX3QgKmlwKQotewotCXJldHVybiBYRlNfSUZPUktfUShpcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX1NJWkUpCi1pbnQKLXhmc19pZm9ya19zaXplKHhmc19pbm9kZV90ICppcCwgaW50IHcpCi17Ci0JcmV0dXJuIFhGU19JRk9SS19TSVpFKGlwLCB3KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUxPR19GQlJPT1QpCi1pbnQKLXhmc19pbG9nX2Zicm9vdChpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0lMT0dfRkJST09UKHcpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTE9HX0ZEQVRBKQotaW50Ci14ZnNfaWxvZ19mZGF0YShpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0lMT0dfRkRBVEEodyk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lMT0dfRkVYVCkKLWludAoteGZzX2lsb2dfZmV4dChpbnQgdykKLXsKLQlyZXR1cm4gWEZTX0lMT0dfRkVYVCh3KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5fTUFYTEVWRUxTKQotaW50Ci14ZnNfaW5fbWF4bGV2ZWxzKHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX0lOX01BWExFVkVMUyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT19BR0JOT19CSVRTKQotaW50Ci14ZnNfaW5vX2FnYm5vX2JpdHMoeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfSU5PX0FHQk5PX0JJVFMobXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fQUdJTk9fQklUUykKLWludAoteGZzX2lub19hZ2lub19iaXRzKHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX0lOT19BR0lOT19CSVRTKG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX0FHTk9fQklUUykKLWludAoteGZzX2lub19hZ25vX2JpdHMoeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfSU5PX0FHTk9fQklUUyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT19CSVRTKQotaW50Ci14ZnNfaW5vX2JpdHMoeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfSU5PX0JJVFMobXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fTUFTSykKLV9fdWludDMyX3QKLXhmc19pbm9fbWFzayhpbnQgaykKLXsKLQlyZXR1cm4gWEZTX0lOT19NQVNLKGspOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fT0ZGU0VUX0JJVFMpCi1pbnQKLXhmc19pbm9fb2Zmc2V0X2JpdHMoeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfSU5PX09GRlNFVF9CSVRTKG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX1RPX0FHQk5PKQoteGZzX2FnYmxvY2tfdAoteGZzX2lub190b19hZ2Jubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19pbm9fdCBpKQotewotCXJldHVybiBYRlNfSU5PX1RPX0FHQk5PKG1wLCBpKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX1RPX0FHSU5PKQoteGZzX2FnaW5vX3QKLXhmc19pbm9fdG9fYWdpbm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfaW5vX3QgaSkKLXsKLQlyZXR1cm4gWEZTX0lOT19UT19BR0lOTyhtcCwgaSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT19UT19BR05PKQoteGZzX2FnbnVtYmVyX3QKLXhmc19pbm9fdG9fYWdubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19pbm9fdCBpKQotewotCXJldHVybiBYRlNfSU5PX1RPX0FHTk8obXAsIGkpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fVE9fRlNCKQoteGZzX2ZzYmxvY2tfdAoteGZzX2lub190b19mc2IoeGZzX21vdW50X3QgKm1wLCB4ZnNfaW5vX3QgaSkKLXsKLQlyZXR1cm4gWEZTX0lOT19UT19GU0IobXAsIGkpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fVE9fT0ZGU0VUKQotaW50Ci14ZnNfaW5vX3RvX29mZnNldCh4ZnNfbW91bnRfdCAqbXAsIHhmc19pbm9fdCBpKQotewotCXJldHVybiBYRlNfSU5PX1RPX09GRlNFVChtcCwgaSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MpCi1pbnQKLXhmc19pbm9idF9ibG9ja19tYXhyZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MpCi1pbnQKLXhmc19pbm9idF9ibG9ja19taW5yZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0JMT0NLX1NJWkUpCi0vKkFSR1NVU0VEMSovCi1pbnQKLXhmc19pbm9idF9ibG9ja19zaXplKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfSU5PQlRfQkxPQ0tfU0laRShsZXYsIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0NMUl9GUkVFKQotdm9pZAoteGZzX2lub2J0X2Nscl9mcmVlKHhmc19pbm9idF9yZWNfdCAqcnAsIGludCBpKQotewotCVhGU19JTk9CVF9DTFJfRlJFRShycCwgaSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0lTX0ZSRUUpCi1pbnQKLXhmc19pbm9idF9pc19mcmVlKHhmc19pbm9idF9yZWNfdCAqcnAsIGludCBpKQotewotCXJldHVybiBYRlNfSU5PQlRfSVNfRlJFRShycCwgaSk7Ci19Ci1pbnQKLXhmc19pbm9idF9pc19mcmVlX2Rpc2soeGZzX2lub2J0X3JlY190ICpycCwgaW50IGkpCi17Ci0JcmV0dXJuIFhGU19JTk9CVF9JU19GUkVFX0RJU0socnAsIGkpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9JU19MQVNUX1JFQykKLWludAoteGZzX2lub2J0X2lzX2xhc3RfcmVjKHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfSU5PQlRfSVNfTEFTVF9SRUMoY3VyKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PQlRfS0VZX0FERFIpCi0vKkFSR1NVU0VEMyovCi14ZnNfaW5vYnRfa2V5X3QgKgoteGZzX2lub2J0X2tleV9hZGRyKHhmc19pbm9idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfSU5PQlRfS0VZX0FERFIoYmIsIGksIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX01BU0spCi14ZnNfaW5vZnJlZV90Ci14ZnNfaW5vYnRfbWFzayhpbnQgaSkKLXsKLQlyZXR1cm4gWEZTX0lOT0JUX01BU0soaSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX01BU0tOKQoteGZzX2lub2ZyZWVfdAoteGZzX2lub2J0X21hc2tuKGludCBpLCBpbnQgbikKLXsKLQlyZXR1cm4gWEZTX0lOT0JUX01BU0tOKGksIG4pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9QVFJfQUREUikKLXhmc19pbm9idF9wdHJfdCAqCi14ZnNfaW5vYnRfcHRyX2FkZHIoeGZzX2lub2J0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCi17Ci0JcmV0dXJuIFhGU19JTk9CVF9QVFJfQUREUihiYiwgaSwgY3VyKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PQlRfUkVDX0FERFIpCi0vKkFSR1NVU0VEMyovCi14ZnNfaW5vYnRfcmVjX3QgKgoteGZzX2lub2J0X3JlY19hZGRyKHhmc19pbm9idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQotewotCXJldHVybiBYRlNfSU5PQlRfUkVDX0FERFIoYmIsIGksIGN1cik7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX1NFVF9GUkVFKQotdm9pZAoteGZzX2lub2J0X3NldF9mcmVlKHhmc19pbm9idF9yZWNfdCAqcnAsIGludCBpKQotewotCVhGU19JTk9CVF9TRVRfRlJFRShycCwgaSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lUT0JIVikKLWJodl9kZXNjX3QgKgoteGZzX2l0b2Jodih4ZnNfaW5vZGVfdCAqaXApCi17Ci0JcmV0dXJuIFhGU19JVE9CSFYoaXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JVE9WKQotdm5vZGVfdCAqCi14ZnNfaXRvdih4ZnNfaW5vZGVfdCAqaXApCi17Ci0JcmV0dXJuIFhGU19JVE9WKGlwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTEJMT0cpCi1pbnQKLXhmc19sYmxvZyh4ZnNfbW91bnRfdCAqbXApCi17Ci0JcmV0dXJuIFhGU19MQkxPRyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xCU0laRSkKLWludAoteGZzX2xic2l6ZSh4ZnNfbW91bnRfdCAqbXApCi17Ci0JcmV0dXJuIFhGU19MQlNJWkUobXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSUNfQUxMX0ZSRUUpCi12b2lkCi14ZnNfbGljX2FsbF9mcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCkKLXsKLQlYRlNfTElDX0FMTF9GUkVFKGNwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX0FSRV9BTExfRlJFRSkKLWludAoteGZzX2xpY19hcmVfYWxsX2ZyZWUoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKQotewotCXJldHVybiBYRlNfTElDX0FSRV9BTExfRlJFRShjcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19DTEFJTSkKLXZvaWQKLXhmc19saWNfY2xhaW0oeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCkKLXsKLQlYRlNfTElDX0NMQUlNKGNwLCBzbG90KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX0RFU0NfVE9fQ0hVTkspCi14ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqCi14ZnNfbGljX2Rlc2NfdG9fY2h1bmsoeGZzX2xvZ19pdGVtX2Rlc2NfdCAqZHApCi17Ci0JcmV0dXJuIFhGU19MSUNfREVTQ19UT19DSFVOSyhkcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19ERVNDX1RPX1NMT1QpCi1pbnQKLXhmc19saWNfZGVzY190b19zbG90KHhmc19sb2dfaXRlbV9kZXNjX3QgKmRwKQotewotCXJldHVybiBYRlNfTElDX0RFU0NfVE9fU0xPVChkcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19JTklUKQotdm9pZAoteGZzX2xpY19pbml0KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCkKLXsKLQlYRlNfTElDX0lOSVQoY3ApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSUNfSU5JVF9TTE9UKQotdm9pZAoteGZzX2xpY19pbml0X3Nsb3QoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCkKLXsKLQlYRlNfTElDX0lOSVRfU0xPVChjcCwgc2xvdCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19JU0ZSRUUpCi1pbnQKLXhmc19saWNfaXNmcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCi17Ci0JcmV0dXJuIFhGU19MSUNfSVNGUkVFKGNwLCBzbG90KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX1JFTFNFKQotdm9pZAoteGZzX2xpY19yZWxzZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3AsIGludCBzbG90KQotewotCVhGU19MSUNfUkVMU0UoY3AsIHNsb3QpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSUNfU0xPVCkKLXhmc19sb2dfaXRlbV9kZXNjX3QgKgoteGZzX2xpY19zbG90KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCi17Ci0JcmV0dXJuIFhGU19MSUNfU0xPVChjcCwgc2xvdCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19WQUNBTkNZKQotaW50Ci14ZnNfbGljX3ZhY2FuY3koeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKQotewotCXJldHVybiBYRlNfTElDX1ZBQ0FOQ1koY3ApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSVRJTk8pCi1pbnQKLXhmc19saXRpbm8oeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfTElUSU5PKG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFLRV9JUFRSKQoteGZzX2Rpbm9kZV90ICoKLXhmc19tYWtlX2lwdHIoeGZzX21vdW50X3QgKm1wLCB4ZnNfYnVmX3QgKmIsIGludCBvKQotewotCXJldHVybiBYRlNfTUFLRV9JUFRSKG1wLCBiLCBvKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFTSzMySEkpCi1fX3VpbnQzMl90Ci14ZnNfbWFzazMyaGkoaW50IG4pCi17Ci0JcmV0dXJuIFhGU19NQVNLMzJISShuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFTSzMyTE8pCi1fX3VpbnQzMl90Ci14ZnNfbWFzazMybG8oaW50IG4pCi17Ci0JcmV0dXJuIFhGU19NQVNLMzJMTyhuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFTSzY0SEkpCi1fX3VpbnQ2NF90Ci14ZnNfbWFzazY0aGkoaW50IG4pCi17Ci0JcmV0dXJuIFhGU19NQVNLNjRISShuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFTSzY0TE8pCi1fX3VpbnQ2NF90Ci14ZnNfbWFzazY0bG8oaW50IG4pCi17Ci0JcmV0dXJuIFhGU19NQVNLNjRMTyhuKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUKQotaW50Ci14ZnNfbWluX2ZyZWVsaXN0KHhmc19hZ2ZfdCAqYSwgeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfTUlOX0ZSRUVMSVNUKGEsIG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUX1BBRykKLWludAoteGZzX21pbl9mcmVlbGlzdF9wYWcoeGZzX3BlcmFnX3QgKnBhZywgeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfTUlOX0ZSRUVMSVNUX1BBRyhwYWcsIG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUX1JBVykKLWludAoteGZzX21pbl9mcmVlbGlzdF9yYXcodWludCBibCwgdWludCBjbCwgeGZzX21vdW50X3QgKm1wKQotewotCXJldHVybiBYRlNfTUlOX0ZSRUVMSVNUX1JBVyhibCwgY2wsIG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTVRPVkZTKQotdmZzX3QgKgoteGZzX210b3Zmcyh4ZnNfbW91bnRfdCAqbXApCi17Ci0JcmV0dXJuIFhGU19NVE9WRlMobXApOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19PRkZCTk9fVE9fQUdJTk8pCi14ZnNfYWdpbm9fdAoteGZzX29mZmJub190b19hZ2lubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ2Jsb2NrX3QgYiwgaW50IG8pCi17Ci0JcmV0dXJuIFhGU19PRkZCTk9fVE9fQUdJTk8obXAsIGIsIG8pOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19QUkVBTExPQ19CTE9DS1MpCi14ZnNfYWdibG9ja190Ci14ZnNfcHJlYWxsb2NfYmxvY2tzKHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX1NCX0JMT0NLKQoteGZzX2FnYmxvY2tfdAoteGZzX3NiX2Jsb2NrKHhmc19tb3VudF90ICptcCkKLXsKLQlyZXR1cm4gWEZTX1NCX0JMT0NLKG1wKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfR09PRF9WRVJTSU9OKQotaW50Ci14ZnNfc2JfZ29vZF92ZXJzaW9uKHhmc19zYl90ICpzYnApCi17Ci0JcmV0dXJuIFhGU19TQl9HT09EX1ZFUlNJT04oc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BRERBVFRSKQotdm9pZAoteGZzX3NiX3ZlcnNpb25fYWRkYXR0cih4ZnNfc2JfdCAqc2JwKQotewotCVhGU19TQl9WRVJTSU9OX0FEREFUVFIoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BREREQUxJR04pCi12b2lkCi14ZnNfc2JfdmVyc2lvbl9hZGRkYWxpZ24oeGZzX3NiX3QgKnNicCkKLXsKLQlYRlNfU0JfVkVSU0lPTl9BREREQUxJR04oc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BREROTElOSykKLXZvaWQKLXhmc19zYl92ZXJzaW9uX2FkZG5saW5rKHhmc19zYl90ICpzYnApCi17Ci0JWEZTX1NCX1ZFUlNJT05fQURETkxJTksoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BRERRVU9UQSkKLXZvaWQKLXhmc19zYl92ZXJzaW9uX2FkZHF1b3RhKHhmc19zYl90ICpzYnApCi17Ci0JWEZTX1NCX1ZFUlNJT05fQUREUVVPVEEoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BRERTSEFSRUQpCi12b2lkCi14ZnNfc2JfdmVyc2lvbl9hZGRzaGFyZWQoeGZzX3NiX3QgKnNicCkKLXsKLQlYRlNfU0JfVkVSU0lPTl9BRERTSEFSRUQoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNBTElHTikKLWludAoteGZzX3NiX3ZlcnNpb25faGFzYWxpZ24oeGZzX3NiX3QgKnNicCkKLXsKLQlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTQUxJR04oc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNBVFRSKQotaW50Ci14ZnNfc2JfdmVyc2lvbl9oYXNhdHRyKHhmc19zYl90ICpzYnApCi17Ci0JcmV0dXJuIFhGU19TQl9WRVJTSU9OX0hBU0FUVFIoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04pCi1pbnQKLXhmc19zYl92ZXJzaW9uX2hhc2RhbGlnbih4ZnNfc2JfdCAqc2JwKQotewotCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04oc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNESVJWMikKLWludAoteGZzX3NiX3ZlcnNpb25faGFzZGlydjIoeGZzX3NiX3QgKnNicCkKLXsKLQlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTRElSVjIoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQpCi1pbnQKLXhmc19zYl92ZXJzaW9uX2hhc2V4dGZsZ2JpdCh4ZnNfc2JfdCAqc2JwKQotewotCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNOTElOSykKLWludAoteGZzX3NiX3ZlcnNpb25faGFzbmxpbmsoeGZzX3NiX3QgKnNicCkKLXsKLQlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSkKLWludAoteGZzX3NiX3ZlcnNpb25faGFzcXVvdGEoeGZzX3NiX3QgKnNicCkKLXsKLQlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNTSEFSRUQpCi1pbnQKLXhmc19zYl92ZXJzaW9uX2hhc3NoYXJlZCh4ZnNfc2JfdCAqc2JwKQotewotCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNTSEFSRUQoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9OVU0pCi1pbnQKLXhmc19zYl92ZXJzaW9uX251bSh4ZnNfc2JfdCAqc2JwKQotewotCXJldHVybiBYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9TVUJBTElHTikKLXZvaWQKLXhmc19zYl92ZXJzaW9uX3N1YmFsaWduKHhmc19zYl90ICpzYnApCi17Ci0JWEZTX1NCX1ZFUlNJT05fU1VCQUxJR04oc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9TVUJTSEFSRUQpCi12b2lkCi14ZnNfc2JfdmVyc2lvbl9zdWJzaGFyZWQoeGZzX3NiX3QgKnNicCkKLXsKLQlYRlNfU0JfVkVSU0lPTl9TVUJTSEFSRUQoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNMT0dWMikKLWludAoteGZzX3NiX3ZlcnNpb25faGFzbG9ndjIoeGZzX3NiX3QgKnNicCkKLXsKLQlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1IpCi1pbnQKLXhmc19zYl92ZXJzaW9uX2hhc3NlY3Rvcih4ZnNfc2JfdCAqc2JwKQotewotCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1Ioc2JwKTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9UT05FVykKLXVuc2lnbmVkCi14ZnNfc2JfdmVyc2lvbl90b25ldyh1bnNpZ25lZCB2KQotewotCXJldHVybiBYRlNfU0JfVkVSU0lPTl9UT05FVyh2KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9UT09MRCkKLXVuc2lnbmVkCi14ZnNfc2JfdmVyc2lvbl90b29sZCh1bnNpZ25lZCB2KQotewotCXJldHVybiBYRlNfU0JfVkVSU0lPTl9UT09MRCh2KTsKLX0KLSNlbmRpZgotCi0jaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YTE9HX0dSQU5UX0FERF9TUEFDRSkKLXZvaWQKLXhsb2dfZ3JhbnRfYWRkX3NwYWNlKHhsb2dfdCAqbG9nLCBpbnQgYnl0ZXMsIGludCB0eXBlKQotewotCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgYnl0ZXMsIHR5cGUpOwotfQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hMT0dfR1JBTlRfU1VCX1NQQUNFKQotdm9pZAoteGxvZ19ncmFudF9zdWJfc3BhY2UoeGxvZ190ICpsb2csIGludCBieXRlcywgaW50IHR5cGUpCi17Ci0JWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCBieXRlcywgdHlwZSk7Ci19Ci0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTTU9SRUJJVFMpCi1pbnQKLXhmc19zYl92ZXJzaW9uX2hhc21vcmViaXRzKHhmc19zYl90ICpzYnApCi17Ci0JcmV0dXJuIFhGU19TQl9WRVJTSU9OX0hBU01PUkVCSVRTKHNicCk7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tYWNyb3MuaCBiL2ZzL3hmcy94ZnNfbWFjcm9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTMwNzUuLjAwMDAwMDAKLS0tIGEvZnMveGZzL3hmc19tYWNyb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCi0gKi8KLSNpZm5kZWYgX19YRlNfTUFDUk9TX0hfXwotI2RlZmluZQlfX1hGU19NQUNST1NfSF9fCi0KLS8qCi0gKiBTZXQgZm9yIGRlYnVnIGtlcm5lbHMgYW5kIHNpbXVsYXRpb24KLSAqIFRoZXNlIHJlcGxhY2VtZW50cyBzYXZlIHNwYWNlLgotICogVXNlZCBpbiB4ZnNfbWFjcm9zLmMuCi0gKi8KLSNkZWZpbmUJWEZTX1dBTlRfU1BBQ0VfQwlcCi0JKCFkZWZpbmVkKF9TVEFOREFMT05FKSAmJiBkZWZpbmVkKERFQlVHKSkKLQotLyoKLSAqIFNldCBmb3IgZGVidWcgc2ltdWxhdGlvbiBhbmQga2VybmVsIGJ1aWxkcywgYnV0IG5vdCBmb3Igc3RhbmRhbG9uZS4KLSAqIFRoZXNlIHJlcGxhY2VtZW50cyBkbyBub3Qgc2F2ZSBzcGFjZS4KLSAqIFVzZWQgaW4geGZzX21hY3Jvcy5jLgotICovCi0jZGVmaW5lCVhGU19XQU5UX0ZVTkNTX0MJXAotCSghZGVmaW5lZChfU1RBTkRBTE9ORSkgJiYgZGVmaW5lZChERUJVRykpCi0KLS8qCi0gKiBDb3JyZXNwb25kaW5nIG5hbWVzIHVzZWQgaW4gLmggZmlsZXMuCi0gKi8KLSNkZWZpbmUJWEZTX1dBTlRfU1BBQ0UJKFhGU19XQU5UX1NQQUNFX0MgJiYgIWRlZmluZWQoWEZTX01BQ1JPX0MpKQotI2RlZmluZQlYRlNfV0FOVF9GVU5DUwkoWEZTX1dBTlRfRlVOQ1NfQyAmJiAhZGVmaW5lZChYRlNfTUFDUk9fQykpCi0KLS8qCi0gKiBUaGVzZSBhcmUgdGhlIG1hY3JvcyB0aGF0IGdldCB0dXJuZWQgaW50byBmdW5jdGlvbnMgdG8gc2F2ZSBzcGFjZS4KLSAqLwotI2RlZmluZQlYRlNTT19OVUxMU1RBUlRCTE9DSyAxCi0jZGVmaW5lCVhGU1NPX1hGU19BR0JfVE9fREFERFIgMQotI2RlZmluZSBYRlNTT19YRlNfQUdCX1RPX0ZTQiAxCi0jZGVmaW5lCVhGU1NPX1hGU19BR0lOT19UT19JTk8gMQotI2RlZmluZQlYRlNTT19YRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyAxCi0jZGVmaW5lCVhGU1NPX1hGU19BVFRSX1NGX05FWFRFTlRSWSAxCi0jZGVmaW5lCVhGU1NPX1hGU19CTUFQX0JMT0NLX0RNQVhSRUNTIDEKLSNkZWZpbmUJWEZTU09fWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MgMQotI2RlZmluZQlYRlNTT19YRlNfQk1BUF9CTE9DS19JTUlOUkVDUyAxCi0jZGVmaW5lCVhGU1NPX1hGU19CTUFQX0lOSVQgMQotI2RlZmluZQlYRlNTT19YRlNfQk1BUF9QVFJfSUFERFIgMQotI2RlZmluZQlYRlNTT19YRlNfQk1BUF9TQU5JVFlfQ0hFQ0sgMQotI2RlZmluZQlYRlNTT19YRlNfQk1BUElfQUZMQUcgMQotI2RlZmluZQlYRlNTT19YRlNfQ0ZPUktfU0laRSAxCi0jZGVmaW5lCVhGU1NPX1hGU19EQV9DT09LSUVfQk5PIDEKLSNkZWZpbmUJWEZTU09fWEZTX0RBX0NPT0tJRV9FTlRSWSAxCi0jZGVmaW5lCVhGU1NPX1hGU19EQUREUl9UT19BR0JOTyAxCi0jZGVmaW5lCVhGU1NPX1hGU19EQUREUl9UT19GU0IgMQotI2RlZmluZQlYRlNTT19YRlNfREZPUktfUFRSIDEKLSNkZWZpbmUJWEZTU09fWEZTX0RJUl9TRl9HRVRfRElSSU5PIDEKLSNkZWZpbmUJWEZTU09fWEZTX0RJUl9TRl9ORVhURU5UUlkgMQotI2RlZmluZQlYRlNTT19YRlNfRElSX1NGX1BVVF9ESVJJTk8gMQotI2RlZmluZQlYRlNTT19YRlNfRklMQkxLU19NSU4gMQotI2RlZmluZQlYRlNTT19YRlNfRlNCX1NBTklUWV9DSEVDSyAxCi0jZGVmaW5lCVhGU1NPX1hGU19GU0JfVE9fREFERFIgMQotI2RlZmluZQlYRlNTT19YRlNfRlNCX1RPX0RCIDEKLSNkZWZpbmUJWEZTU09fWEZTX0lBTExPQ19JTk9ERVMgMQotI2RlZmluZQlYRlNTT19YRlNfSUZPUktfQVNJWkUgMQotI2RlZmluZQlYRlNTT19YRlNfSUZPUktfRFNJWkUgMQotI2RlZmluZQlYRlNTT19YRlNfSUZPUktfRk9STUFUIDEKLSNkZWZpbmUJWEZTU09fWEZTX0lGT1JLX05FWFRfU0VUIDEKLSNkZWZpbmUJWEZTU09fWEZTX0lGT1JLX05FWFRFTlRTIDEKLSNkZWZpbmUJWEZTU09fWEZTX0lGT1JLX1BUUiAxCi0jZGVmaW5lCVhGU1NPX1hGU19JTE9HX0ZCUk9PVCAxCi0jZGVmaW5lCVhGU1NPX1hGU19JTE9HX0ZFWFQgMQotI2RlZmluZQlYRlNTT19YRlNfSU5PX01BU0sgMQotI2RlZmluZQlYRlNTT19YRlNfSU5PX1RPX0ZTQiAxCi0jZGVmaW5lCVhGU1NPX1hGU19JTk9ERV9DTEVBUl9SRUFEX0FIRUFEIDEKLSNkZWZpbmUJWEZTU09fWEZTX01JTl9GUkVFTElTVCAxCi0jZGVmaW5lIFhGU1NPX1hGU19TQl9HT09EX1ZFUlNJT04gMQotI2RlZmluZSBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNOTElOSyAxCi0jZGVmaW5lCVhGU1NPX1hMT0dfR1JBTlRfQUREX1NQQUNFIDEKLSNkZWZpbmUJWEZTU09fWExPR19HUkFOVF9TVUJfU1BBQ0UgMQotCi0jZW5kaWYJLyogX19YRlNfTUFDUk9TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tb3VudC5jIGIvZnMveGZzL3hmc19tb3VudC5jCmluZGV4IDgyZTE2NDYuLjU0MWQ1ZGQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbW91bnQuYworKysgYi9mcy94ZnMveGZzX21vdW50LmMKQEAgLTEsNDAgKzEsMjYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKQEAgLTQyLDIxICsyOCwyMCBAQAogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19hbGxvYy5oIgogI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX2Zzb3BzLmgiCkBAIC0xODAsNiArMTY1LDEwIEBACiAKIAlpZiAobXAtPm1fZnNuYW1lICE9IE5VTEwpCiAJCWttZW1fZnJlZShtcC0+bV9mc25hbWUsIG1wLT5tX2ZzbmFtZV9sZW4pOworCWlmIChtcC0+bV9ydG5hbWUgIT0gTlVMTCkKKwkJa21lbV9mcmVlKG1wLT5tX3J0bmFtZSwgc3RybGVuKG1wLT5tX3J0bmFtZSkgKyAxKTsKKwlpZiAobXAtPm1fbG9nbmFtZSAhPSBOVUxMKQorCQlrbWVtX2ZyZWUobXAtPm1fbG9nbmFtZSwgc3RybGVuKG1wLT5tX2xvZ25hbWUpICsgMSk7CiAKIAlpZiAocmVtb3ZlX2JodikgewogCQlzdHJ1Y3QgdmZzCSp2ZnNwID0gWEZTX01UT1ZGUyhtcCk7CkBAIC0zMTgsNyArMzA3LDcgQEAKIAkJIlhGUzogQXR0ZW1wdGVkIHRvIG1vdW50IGZpbGUgc3lzdGVtIHdpdGggYmxvY2tzaXplICVkIGJ5dGVzIiwKIAkJCXNicC0+c2JfYmxvY2tzaXplKTsKIAkJY21uX2VycihDRV9XQVJOLAotCQkiWEZTOiBPbmx5IHBhZ2Utc2l6ZWQgKCVkKSBvciBsZXNzIGJsb2Nrc2l6ZXMgY3VycmVudGx5IHdvcmsuIiwKKwkJIlhGUzogT25seSBwYWdlLXNpemVkICglbGQpIG9yIGxlc3MgYmxvY2tzaXplcyBjdXJyZW50bHkgd29yay4iLAogCQkJUEFHRV9TSVpFKTsKIAkJcmV0dXJuIFhGU19FUlJPUihFTk9TWVMpOwogCX0KQEAgLTMyNyw3ICszMTYsMTAgQEAKIH0KIAogeGZzX2FnbnVtYmVyX3QKLXhmc19pbml0aWFsaXplX3BlcmFnKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdjb3VudCkKK3hmc19pbml0aWFsaXplX3BlcmFnKAorCXN0cnVjdCB2ZnMJKnZmcywKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2FnbnVtYmVyX3QJYWdjb3VudCkKIHsKIAl4ZnNfYWdudW1iZXJfdAlpbmRleCwgbWF4X21ldGFkYXRhOwogCXhmc19wZXJhZ190CSpwYWc7CkBAIC0zNDMsNyArMzM1LDcgQEAKIAkvKiBDbGVhciB0aGUgbW91bnQgZmxhZyBpZiBubyBpbm9kZSBjYW4gb3ZlcmZsb3cgMzIgYml0cwogCSAqIG9uIHRoaXMgZmlsZXN5c3RlbSwgb3IgaWYgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZC4uCiAJICovCi0JaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF8zMkJJVElOT09QVCkgJiYgaW5vID4gbWF4X2ludW0pIHsKKwlpZiAoKHZmcy0+dmZzX2ZsYWcgJiBWRlNfMzJCSVRJTk9ERVMpICYmIGlubyA+IG1heF9pbnVtKSB7CiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF8zMkJJVElOT0RFUzsKIAl9IGVsc2UgewogCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UXzMyQklUSU5PREVTOwpAQCAtMzYwLDcgKzM1Miw3IEBACiAJCQlpY291bnQgPSBzYnAtPnNiX2RibG9ja3MgKiBzYnAtPnNiX2ltYXhfcGN0OwogCQkJZG9fZGl2KGljb3VudCwgMTAwKTsKIAkJCWljb3VudCArPSBzYnAtPnNiX2FnYmxvY2tzIC0gMTsKLQkJCWRvX2RpdihpY291bnQsIG1wLT5tX2lhbGxvY19ibGtzKTsKKwkJCWRvX2RpdihpY291bnQsIHNicC0+c2JfYWdibG9ja3MpOwogCQkJbWF4X21ldGFkYXRhID0gaWNvdW50OwogCQl9IGVsc2UgewogCQkJbWF4X21ldGFkYXRhID0gYWdjb3VudDsKQEAgLTU4NCwxMiArNTc2LDEzIEBACiAJQVNTRVJUKHNicC0+c2JfaW5vZGVzaXplID49IDI1NiAmJiBzYnAtPnNiX2lub2Rlc2l6ZSA8PSAyMDQ4KTsKIAlzd2l0Y2ggKHNicC0+c2JfaW5vZGVzaXplKSB7CiAJY2FzZSAyNTY6Ci0JCW1wLT5tX2F0dHJvZmZzZXQgPSBYRlNfTElUSU5PKG1wKSAtIFhGU19CTURSX1NQQUNFX0NBTEMoMik7CisJCW1wLT5tX2F0dHJvZmZzZXQgPSBYRlNfTElUSU5PKG1wKSAtCisJCQkJICAgWEZTX0JNRFJfU1BBQ0VfQ0FMQyhNSU5BQlRQVFJTKTsKIAkJYnJlYWs7CiAJY2FzZSA1MTI6CiAJY2FzZSAxMDI0OgogCWNhc2UgMjA0ODoKLQkJbXAtPm1fYXR0cm9mZnNldCA9IFhGU19CTURSX1NQQUNFX0NBTEMoMTIpOworCQltcC0+bV9hdHRyb2Zmc2V0ID0gWEZTX0JNRFJfU1BBQ0VfQ0FMQyg2ICogTUlOQUJUUFRSUyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKQEAgLTk1NCw3ICs5NDcsNyBAQAogCW1wLT5tX3BlcmFnID0KIAkJa21lbV96YWxsb2Moc2JwLT5zYl9hZ2NvdW50ICogc2l6ZW9mKHhmc19wZXJhZ190KSwgS01fU0xFRVApOwogCi0JbXAtPm1fbWF4YWdpID0geGZzX2luaXRpYWxpemVfcGVyYWcobXAsIHNicC0+c2JfYWdjb3VudCk7CisJbXAtPm1fbWF4YWdpID0geGZzX2luaXRpYWxpemVfcGVyYWcodmZzcCwgbXAsIHNicC0+c2JfYWdjb3VudCk7CiAKIAkvKgogCSAqIGxvZydzIG1vdW50LXRpbWUgaW5pdGlhbGl6YXRpb24uIFBlcmZvcm0gMXN0IHBhcnQgcmVjb3ZlcnkgaWYgbmVlZGVkCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmggYi9mcy94ZnMveGZzX21vdW50LmgKaW5kZXggNWFmZmJhMy4uMDhiMmUwYSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5oCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuaApAQCAtMSwzOCArMSwyMyBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19NT1VOVF9IX18KICNkZWZpbmUJX19YRlNfTU9VTlRfSF9fCiAKLQogdHlwZWRlZiBzdHJ1Y3QgeGZzX3RyYW5zX3Jlc2VydmF0aW9ucyB7CiAJdWludAl0cl93cml0ZTsJLyogZXh0ZW50IGFsbG9jIHRyYW5zICovCiAJdWludAl0cl9pdHJ1bmNhdGU7CS8qIHRydW5jYXRlIHRyYW5zICovCkBAIC01Nyw3ICs0Miw2IEBACiAJdWludAl0cl9ncm93cnRmcmVlOwkvKiBncm93IHJlYWx0aW1lIGZyZWVpbmcgKi8KIH0geGZzX3RyYW5zX3Jlc2VydmF0aW9uc190OwogCi0KICNpZm5kZWYgX19LRVJORUxfXwogLyoKICAqIE1vdmVkIGhlcmUgZnJvbSB4ZnNfYWcuaCB0byBhdm9pZCByZW9yZGVyaW5nIGhlYWRlciBmaWxlcwpAQCAtODAsNiArNjQsOSBAQAogc3RydWN0IHhmc19ibWJ0X2lyZWM7CiBzdHJ1Y3QgeGZzX2JtYXBfZnJlZTsKIAorZXh0ZXJuIHN0cnVjdCB2ZnNvcHMgeGZzX3Zmc29wczsKK2V4dGVybiBzdHJ1Y3Qgdm5vZGVvcHMgeGZzX3Zub2Rlb3BzOworCiAjZGVmaW5lCUFJTF9MT0NLX1QJCWxvY2tfdAogI2RlZmluZQlBSUxfTE9DS0lOSVQoeCx5KQlzcGlubG9ja19pbml0KHgseSkKICNkZWZpbmUJQUlMX0xPQ0tfREVTVFJPWSh4KQlzcGlubG9ja19kZXN0cm95KHgpCkBAIC0yOTIsNiArMjc5LDggQEAKIAlzdHJ1Y3QgeGZzX2J1ZgkJKm1fc2JfYnA7CS8qIGJ1ZmZlciBmb3Igc3VwZXJibG9jayAqLwogCWNoYXIJCQkqbV9mc25hbWU7CS8qIGZpbGVzeXN0ZW0gbmFtZSAqLwogCWludAkJCW1fZnNuYW1lX2xlbjsJLyogc3RybGVuIG9mIGZzIG5hbWUgKi8KKwljaGFyCQkJKm1fcnRuYW1lOwkvKiByZWFsdGltZSBkZXZpY2UgbmFtZSAqLworCWNoYXIJCQkqbV9sb2duYW1lOwkvKiBleHRlcm5hbCBsb2cgZGV2aWNlIG5hbWUgKi8KIAlpbnQJCQltX2JzaXplOwkvKiBmcyBsb2dpY2FsIGJsb2NrIHNpemUgKi8KIAl4ZnNfYWdudW1iZXJfdAkJbV9hZ2Zyb3RvcjsJLyogbGFzdCBhZyB3aGVyZSBzcGFjZSBmb3VuZCAqLwogCXhmc19hZ251bWJlcl90CQltX2FnaXJvdG9yOwkvKiBsYXN0IGFnIGRpciBpbm9kZSBhbGxvY2VkICovCkBAIC0zNDQsNyArMzMzLDcgQEAKIAlzZW1hX3QJCQltX2dyb3dsb2NrOwkvKiBncm93ZnMgbXV0ZXggKi8KIAlpbnQJCQltX2ZpeGVkZnNpZFsyXTsJLyogdW5jaGFuZ2VkIGZvciBsaWZlIG9mIEZTICovCiAJdWludAkJCW1fZG1ldm1hc2s7CS8qIERNSSBldmVudHMgZm9yIHRoaXMgRlMgKi8KLQl1aW50CQkJbV9mbGFnczsJLyogZ2xvYmFsIG1vdW50IGZsYWdzICovCisJX191aW50NjRfdAkJbV9mbGFnczsJLyogZ2xvYmFsIG1vdW50IGZsYWdzICovCiAJdWludAkJCW1fYXR0cm9mZnNldDsJLyogaW5vZGUgYXR0cmlidXRlIG9mZnNldCAqLwogCXVpbnQJCQltX2Rpcl9ub2RlX2VudHM7IC8qICNlbnRyaWVzIGluIGEgZGlyIGRhbm9kZSAqLwogCXVpbnQJCQltX2F0dHJfbm9kZV9lbnRzOyAvKiAjZW50cmllcyBpbiBhdHRyIGRhbm9kZSAqLwpAQCAtMzg5LDM4ICszNzgsNDEgQEAKIC8qCiAgKiBGbGFncyBmb3IgbV9mbGFncy4KICAqLwotI2RlZmluZQlYRlNfTU9VTlRfV1NZTkMJCTB4MDAwMDAwMDEJLyogZm9yIG5mcyAtIGFsbCBtZXRhZGF0YSBvcHMKKyNkZWZpbmUJWEZTX01PVU5UX1dTWU5DCQkoMVVMTCA8PCAwKQkvKiBmb3IgbmZzIC0gYWxsIG1ldGFkYXRhIG9wcwogCQkJCQkJICAgbXVzdCBiZSBzeW5jaHJvbm91cyBleGNlcHQKIAkJCQkJCSAgIGZvciBzcGFjZSBhbGxvY2F0aW9ucyAqLwotI2RlZmluZQlYRlNfTU9VTlRfSU5PNjQJCTB4MDAwMDAwMDIKLQkJCSAgICAgLyogMHgwMDAwMDAwNAktLSBjdXJyZW50bHkgdW51c2VkICovCi0JCQkgICAgIC8qIDB4MDAwMDAwMDgJLS0gY3VycmVudGx5IHVudXNlZCAqLwotI2RlZmluZSBYRlNfTU9VTlRfRlNfU0hVVERPV04JMHgwMDAwMDAxMAkvKiBhdG9taWMgc3RvcCBvZiBhbGwgZmlsZXN5c3RlbQorI2RlZmluZQlYRlNfTU9VTlRfSU5PNjQJCSgxVUxMIDw8IDEpCisJCQkgICAgIC8qICgxVUxMIDw8IDIpCS0tIGN1cnJlbnRseSB1bnVzZWQgKi8KKwkJCSAgICAgLyogKDFVTEwgPDwgMykJLS0gY3VycmVudGx5IHVudXNlZCAqLworI2RlZmluZSBYRlNfTU9VTlRfRlNfU0hVVERPV04JKDFVTEwgPDwgNCkJLyogYXRvbWljIHN0b3Agb2YgYWxsIGZpbGVzeXN0ZW0KIAkJCQkJCSAgIG9wZXJhdGlvbnMsIHR5cGljYWxseSBmb3IKIAkJCQkJCSAgIGRpc2sgZXJyb3JzIGluIG1ldGFkYXRhICovCi0jZGVmaW5lIFhGU19NT1VOVF9OT0FUSU1FCTB4MDAwMDAwMjAJLyogZG9uJ3QgbW9kaWZ5IGlub2RlIGFjY2VzcworI2RlZmluZSBYRlNfTU9VTlRfTk9BVElNRQkoMVVMTCA8PCA1KQkvKiBkb24ndCBtb2RpZnkgaW5vZGUgYWNjZXNzCiAJCQkJCQkgICB0aW1lcyBvbiByZWFkcyAqLwotI2RlZmluZSBYRlNfTU9VTlRfUkVURVJSCTB4MDAwMDAwNDAgICAgICAvKiByZXR1cm4gYWxpZ25tZW50IGVycm9ycyB0bworI2RlZmluZSBYRlNfTU9VTlRfUkVURVJSCSgxVUxMIDw8IDYpICAgICAvKiByZXR1cm4gYWxpZ25tZW50IGVycm9ycyB0bwogCQkJCQkJICAgdXNlciAqLwotI2RlZmluZSBYRlNfTU9VTlRfTk9BTElHTgkweDAwMDAwMDgwCS8qIHR1cm4gb2ZmIHN0cmlwZSBhbGlnbm1lbnQKKyNkZWZpbmUgWEZTX01PVU5UX05PQUxJR04JKDFVTEwgPDwgNykJLyogdHVybiBvZmYgc3RyaXBlIGFsaWdubWVudAogCQkJCQkJICAgYWxsb2NhdGlvbnMgKi8KLQkJCSAgICAgLyogMHgwMDAwMDEwMAktLSBjdXJyZW50bHkgdW51c2VkICovCi0JCQkgICAgIC8qCTB4MDAwMDAyMDAJLS0gY3VycmVudGx5IHVudXNlZCAqLwotI2RlZmluZSBYRlNfTU9VTlRfTk9SRUNPVkVSWQkweDAwMDAwNDAwCS8qIG5vIHJlY292ZXJ5IC0gZGlydHkgZnMgKi8KLSNkZWZpbmUgWEZTX01PVU5UX1NIQVJFRAkweDAwMDAwODAwCS8qIHNoYXJlZCBtb3VudCAqLwotI2RlZmluZSBYRlNfTU9VTlRfREZMVF9JT1NJWkUJMHgwMDAwMTAwMAkvKiBzZXQgZGVmYXVsdCBpL28gc2l6ZSAqLwotI2RlZmluZSBYRlNfTU9VTlRfT1NZTkNJU09TWU5DCTB4MDAwMDIwMDAJLyogb19zeW5jIGlzIFJFQUxMWSBvX3N5bmMgKi8KKyNkZWZpbmUgWEZTX01PVU5UX0NPTVBBVF9BVFRSCSgxVUxMIDw8IDgpCS8qIGRvIG5vdCB1c2UgYXR0cjIgZm9ybWF0ICovCisJCQkgICAgIC8qCSgxVUxMIDw8IDkpCS0tIGN1cnJlbnRseSB1bnVzZWQgKi8KKyNkZWZpbmUgWEZTX01PVU5UX05PUkVDT1ZFUlkJKDFVTEwgPDwgMTApCS8qIG5vIHJlY292ZXJ5IC0gZGlydHkgZnMgKi8KKyNkZWZpbmUgWEZTX01PVU5UX1NIQVJFRAkoMVVMTCA8PCAxMSkJLyogc2hhcmVkIG1vdW50ICovCisjZGVmaW5lIFhGU19NT1VOVF9ERkxUX0lPU0laRQkoMVVMTCA8PCAxMikJLyogc2V0IGRlZmF1bHQgaS9vIHNpemUgKi8KKyNkZWZpbmUgWEZTX01PVU5UX09TWU5DSVNPU1lOQwkoMVVMTCA8PCAxMykJLyogb19zeW5jIGlzIFJFQUxMWSBvX3N5bmMgKi8KIAkJCQkJCS8qIG9zeW5jaXNkc3luYyBpcyBub3cgZGVmYXVsdCovCi0jZGVmaW5lIFhGU19NT1VOVF8zMkJJVElOT0RFUwkweDAwMDA0MDAwCS8qIGRvIG5vdCBjcmVhdGUgaW5vZGVzIGFib3ZlCisjZGVmaW5lIFhGU19NT1VOVF8zMkJJVElOT0RFUwkoMVVMTCA8PCAxNCkJLyogZG8gbm90IGNyZWF0ZSBpbm9kZXMgYWJvdmUKIAkJCQkJCSAqIDMyIGJpdHMgaW4gc2l6ZSAqLwotI2RlZmluZSBYRlNfTU9VTlRfMzJCSVRJTk9PUFQJMHgwMDAwODAwMAkvKiBzYXZlZCBtb3VudCBvcHRpb24gc3RhdGUgKi8KLSNkZWZpbmUgWEZTX01PVU5UX05PVVVJRAkweDAwMDEwMDAwCS8qIGlnbm9yZSB1dWlkIGR1cmluZyBtb3VudCAqLwotI2RlZmluZSBYRlNfTU9VTlRfTk9MT0dGTFVTSAkweDAwMDIwMDAwCi0jZGVmaW5lIFhGU19NT1VOVF9JREVMRVRFCTB4MDAwNDAwMDAJLyogZGVsZXRlIGVtcHR5IGlub2RlIGNsdXN0ZXJzKi8KLSNkZWZpbmUgWEZTX01PVU5UX1NXQUxMT0MJMHgwMDA4MDAwMAkvKiB0dXJuIG9uIHN0cmlwZSB3aWR0aAorCQkJICAgICAvKiAoMVVMTCA8PCAxNSkJLS0gY3VycmVudGx5IHVudXNlZCAqLworI2RlZmluZSBYRlNfTU9VTlRfTk9VVUlECSgxVUxMIDw8IDE2KQkvKiBpZ25vcmUgdXVpZCBkdXJpbmcgbW91bnQgKi8KKyNkZWZpbmUgWEZTX01PVU5UX0JBUlJJRVIJKDFVTEwgPDwgMTcpCisjZGVmaW5lIFhGU19NT1VOVF9JREVMRVRFCSgxVUxMIDw8IDE4KQkvKiBkZWxldGUgZW1wdHkgaW5vZGUgY2x1c3RlcnMqLworI2RlZmluZSBYRlNfTU9VTlRfU1dBTExPQwkoMVVMTCA8PCAxOSkJLyogdHVybiBvbiBzdHJpcGUgd2lkdGgKIAkJCQkJCSAqIGFsbG9jYXRpb24gKi8KLSNkZWZpbmUgWEZTX01PVU5UX0lIQVNIU0laRQkweDAwMTAwMDAwCS8qIGlub2RlIGhhc2ggdGFibGUgc2l6ZSAqLwotI2RlZmluZSBYRlNfTU9VTlRfRElSU1lOQwkweDAwMjAwMDAwCS8qIHN5bmNocm9ub3VzIGRpcmVjdG9yeSBvcHMgKi8KKyNkZWZpbmUgWEZTX01PVU5UX0lIQVNIU0laRQkoMVVMTCA8PCAyMCkJLyogaW5vZGUgaGFzaCB0YWJsZSBzaXplICovCisjZGVmaW5lIFhGU19NT1VOVF9ESVJTWU5DCSgxVUxMIDw8IDIxKQkvKiBzeW5jaHJvbm91cyBkaXJlY3Rvcnkgb3BzICovCisjZGVmaW5lIFhGU19NT1VOVF9DT01QQVRfSU9TSVpFCSgxVUxMIDw8IDIyKQkvKiBkb24ndCByZXBvcnQgbGFyZ2UgcHJlZmVycmVkCisJCQkJCQkgKiBJL08gc2l6ZSBpbiBzdGF0KCkgKi8KKwogCiAvKgogICogRGVmYXVsdCBtaW5pbXVtIHJlYWQgYW5kIHdyaXRlIHNpemVzLgpAQCAtNDQyLDYgKzQzNCwzMCBAQAogI2RlZmluZQlYRlNfV1NZTkNfUkVBRElPX0xPRwkxNQkvKiAzMksgKi8KICNkZWZpbmUJWEZTX1dTWU5DX1dSSVRFSU9fTE9HCTE0CS8qIDE2SyAqLwogCisvKgorICogQWxsb3cgbGFyZ2UgYmxvY2sgc2l6ZXMgdG8gYmUgcmVwb3J0ZWQgdG8gdXNlcnNwYWNlIHByb2dyYW1zIGlmIHRoZQorICogImxhcmdlaW8iIG1vdW50IG9wdGlvbiBpcyB1c2VkLiAKKyAqCisgKiBJZiBjb21wYXRpYmlsaXR5IG1vZGUgaXMgc3BlY2lmaWVkLCBzaW1wbHkgcmV0dXJuIHRoZSBiYXNpYyB1bml0IG9mIGNhY2hpbmcKKyAqIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGluZWZmaWNpZW50IHJlYWQvbW9kaWZ5L3dyaXRlIEkvTyBmcm9tIHVzZXIgYXBwcy4KKyAqIE90aGVyd2lzZS4uLi4KKyAqCisgKiBJZiB0aGUgdW5kZXJseWluZyB2b2x1bWUgaXMgYSBzdHJpcGUsIHRoZW4gcmV0dXJuIHRoZSBzdHJpcGUgd2lkdGggaW4gYnl0ZXMKKyAqIGFzIHRoZSByZWNvbW1lbmRlZCBJL08gc2l6ZS4gSXQgaXMgbm90IGEgc3RyaXBlIGFuZCB3ZSd2ZSBzZXQgYSBkZWZhdWx0CisgKiBidWZmZXJlZCBJL08gc2l6ZSwgcmV0dXJuIHRoYXQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGNvbXBhdCBkZWZhdWx0LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3hmc19wcmVmZXJyZWRfaW9zaXplKHhmc19tb3VudF90ICptcCkKK3sKKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0lPU0laRSkKKwkJcmV0dXJuIFBBR0VfQ0FDSEVfU0laRTsKKwlyZXR1cm4gKG1wLT5tX3N3aWR0aCA/CisJCShtcC0+bV9zd2lkdGggPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpIDoKKwkJKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkgPworCQkJKDEgPDwgKGludClNQVgobXAtPm1fcmVhZGlvX2xvZywgbXAtPm1fd3JpdGVpb19sb2cpKSA6CisJCQlQQUdFX0NBQ0hFX1NJWkUpKTsKK30KKwogI2RlZmluZSBYRlNfTUFYSU9GRlNFVChtcCkJKChtcCktPm1fbWF4aW9mZnNldCkKIAogI2RlZmluZSBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKQkoKG1wKS0+bV9mbGFncyAmIFhGU19NT1VOVF9GU19TSFVURE9XTikKQEAgLTQ3NCw1NyArNDkwLDQxIEBACiAvKgogICogTWFjcm9zIGZvciBnZXR0aW5nIGZyb20gbW91bnQgdG8gdmZzIGFuZCBiYWNrLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NVE9WRlMpCi1zdHJ1Y3QgdmZzICp4ZnNfbXRvdmZzKHhmc19tb3VudF90ICptcCk7CiAjZGVmaW5lCVhGU19NVE9WRlMobXApCQl4ZnNfbXRvdmZzKG1wKQotI2Vsc2UKLSNkZWZpbmUJWEZTX01UT1ZGUyhtcCkJCShiaHZ0b3ZmcygmKG1wKS0+bV9iaHYpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CSFZUT00pCi14ZnNfbW91bnRfdCAqeGZzX2JodnRvbShiaHZfZGVzY190ICpiZHApOworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmZzICp4ZnNfbXRvdmZzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gYmh2dG92ZnMoJm1wLT5tX2Jodik7Cit9CisKICNkZWZpbmUJWEZTX0JIVlRPTShiZHApCXhmc19iaHZ0b20oYmRwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX0JIVlRPTShiZHApCQkoKHhmc19tb3VudF90ICopQkhWX1BEQVRBKGJkcCkpCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1ZGU1RPTSkKLXhmc19tb3VudF90ICp4ZnNfdmZzdG9tKHZmc190ICp2ZnMpOworc3RhdGljIGlubGluZSB4ZnNfbW91bnRfdCAqeGZzX2JodnRvbShiaHZfZGVzY190ICpiZHApCit7CisJcmV0dXJuICh4ZnNfbW91bnRfdCAqKUJIVl9QREFUQShiZHApOworfQorCiAjZGVmaW5lIFhGU19WRlNUT00odmZzKSB4ZnNfdmZzdG9tKHZmcykKLSNlbHNlCi0jZGVmaW5lIFhGU19WRlNUT00odmZzKQkJXAotCShYRlNfQkhWVE9NKGJodl9sb29rdXAoVkZTX0JIVkhFQUQodmZzKSwgJnhmc192ZnNvcHMpKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSB4ZnNfbW91bnRfdCAqeGZzX3Zmc3RvbSh2ZnNfdCAqdmZzKQoreworCXJldHVybiBYRlNfQkhWVE9NKGJodl9sb29rdXAoVkZTX0JIVkhFQUQodmZzKSwgJnhmc192ZnNvcHMpKTsKK30KIAotCi0vKgotICogTW92ZWQgaGVyZSBmcm9tIHhmc19hZy5oIHRvIGF2b2lkIHJlb3JkZXJpbmcgaGVhZGVyIGZpbGVzCi0gKi8KLQotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFERFJfVE9fQUdOTykKLXhmc19hZ251bWJlcl90IHhmc19kYWRkcl90b19hZ25vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFkZHJfdCBkKTsKICNkZWZpbmUgWEZTX0RBRERSX1RPX0FHTk8obXAsZCkgICAgICAgICB4ZnNfZGFkZHJfdG9fYWdubyhtcCxkKQotI2Vsc2UKLQotc3RhdGljIGlubGluZSB4ZnNfYWdudW1iZXJfdCBYRlNfREFERFJfVE9fQUdOTyh4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWRkcl90IGQpCitzdGF0aWMgaW5saW5lIHhmc19hZ251bWJlcl90Cit4ZnNfZGFkZHJfdG9fYWdubyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhZGRyX3QgZCkKIHsKLQlkID0gWEZTX0JCX1RPX0ZTQlQobXAsIGQpOwotCWRvX2RpdihkLCBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7Ci0JcmV0dXJuICh4ZnNfYWdudW1iZXJfdCkgZDsKKwl4ZnNfZGFkZHJfdCBsZCA9IFhGU19CQl9UT19GU0JUKG1wLCBkKTsKKwlkb19kaXYobGQsIG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKKwlyZXR1cm4gKHhmc19hZ251bWJlcl90KSBsZDsKIH0KIAotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQUREUl9UT19BR0JOTykKLXhmc19hZ2Jsb2NrX3QgeGZzX2RhZGRyX3RvX2FnYm5vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFkZHJfdCBkKTsKICNkZWZpbmUgWEZTX0RBRERSX1RPX0FHQk5PKG1wLGQpICAgICAgICB4ZnNfZGFkZHJfdG9fYWdibm8obXAsZCkKLSNlbHNlCi0KLXN0YXRpYyBpbmxpbmUgeGZzX2FnYmxvY2tfdCBYRlNfREFERFJfVE9fQUdCTk8oeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkKQorc3RhdGljIGlubGluZSB4ZnNfYWdibG9ja190Cit4ZnNfZGFkZHJfdG9fYWdibm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kYWRkcl90IGQpCiB7Ci0JZCA9IFhGU19CQl9UT19GU0JUKG1wLCBkKTsKLQlyZXR1cm4gKHhmc19hZ2Jsb2NrX3QpIGRvX2RpdihkLCBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJeGZzX2RhZGRyX3QgbGQgPSBYRlNfQkJfVE9fRlNCVChtcCwgZCk7CisJcmV0dXJuICh4ZnNfYWdibG9ja190KSBkb19kaXYobGQsIG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKIH0KIAotI2VuZGlmCi0KIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyBmb3IgdXNlIGJ5IHRoZSB4ZnNfbW9kX2luY29yZV9zYl9iYXRjaCgpIHJvdXRpbmUuCiAgKi8KQEAgLTU0Miw2ICs1NDIsNyBAQAogZXh0ZXJuIHZvaWQJeGZzX21vZF9zYih4ZnNfdHJhbnNfdCAqLCBfX2ludDY0X3QpOwogZXh0ZXJuIHZvaWQJeGZzX21vdW50X2ZyZWUoeGZzX21vdW50X3QgKm1wLCBpbnQgcmVtb3ZlX2Jodik7CiBleHRlcm4gaW50CXhmc19tb3VudGZzKHN0cnVjdCB2ZnMgKiwgeGZzX21vdW50X3QgKm1wLCBpbnQpOworZXh0ZXJuIHZvaWQJeGZzX21vdW50ZnNfY2hlY2tfYmFycmllcnMoeGZzX21vdW50X3QgKm1wKTsKIAogZXh0ZXJuIGludAl4ZnNfdW5tb3VudGZzKHhmc19tb3VudF90ICosIHN0cnVjdCBjcmVkICopOwogZXh0ZXJuIHZvaWQJeGZzX3VubW91bnRmc19jbG9zZSh4ZnNfbW91bnRfdCAqLCBzdHJ1Y3QgY3JlZCAqKTsKQEAgLTU1NSwxMiArNTU2LDExIEBACiBleHRlcm4gdm9pZAl4ZnNfZnJlZXNiKHhmc19tb3VudF90ICopOwogZXh0ZXJuIHZvaWQJeGZzX2RvX2ZvcmNlX3NodXRkb3duKGJodl9kZXNjX3QgKiwgaW50LCBjaGFyICosIGludCk7CiBleHRlcm4gaW50CXhmc19zeW5jc3ViKHhmc19tb3VudF90ICosIGludCwgaW50LCBpbnQgKik7Ci1leHRlcm4geGZzX2FnbnVtYmVyX3QJeGZzX2luaXRpYWxpemVfcGVyYWcoeGZzX21vdW50X3QgKiwgeGZzX2FnbnVtYmVyX3QpOworZXh0ZXJuIGludAl4ZnNfc3luY19pbm9kZXMoeGZzX21vdW50X3QgKiwgaW50LCBpbnQsIGludCAqKTsKK2V4dGVybiB4ZnNfYWdudW1iZXJfdAl4ZnNfaW5pdGlhbGl6ZV9wZXJhZyhzdHJ1Y3QgdmZzICosIHhmc19tb3VudF90ICosCisJCQkJCQl4ZnNfYWdudW1iZXJfdCk7CiBleHRlcm4gdm9pZAl4ZnNfeGxhdGVzYih2b2lkICosIHN0cnVjdCB4ZnNfc2IgKiwgaW50LCBfX2ludDY0X3QpOwogCi1leHRlcm4gc3RydWN0IHZmc29wcyB4ZnNfdmZzb3BzOwotZXh0ZXJuIHN0cnVjdCB2bm9kZW9wcyB4ZnNfdm5vZGVvcHM7Ci0KIGV4dGVybiBzdHJ1Y3QgeGZzX2Rtb3BzIHhmc19kbWNvcmVfc3R1YjsKIGV4dGVybiBzdHJ1Y3QgeGZzX3Ftb3BzIHhmc19xbWNvcmVfc3R1YjsKIGV4dGVybiBzdHJ1Y3QgeGZzX2lvb3BzIHhmc19pb2NvcmVfeGZzOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19xbW9wcy5jIGIvZnMveGZzL3hmc19xbW9wcy5jCmluZGV4IGE2Y2Q2MzI0Li4xNDA4YTMyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Ftb3BzLmMKKysrIGIvZnMveGZzL3hmc19xbW9wcy5jCkBAIC0xLDQwICsxLDI1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaW5jbHVkZSAieGZzLmgiCi0KLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcXVvdGEuaCBiL2ZzL3hmcy94ZnNfcXVvdGEuaAppbmRleCAzMmNiNzk3Li44MmEwOGJhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3F1b3RhLmgKKysrIGIvZnMveGZzL3hmc19xdW90YS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX1FVT1RBX0hfXwogI2RlZmluZSBfX1hGU19RVU9UQV9IX18KQEAgLTQyLDcgKzI4LDcgQEAKICAqIHVpZF90IGFuZCBnaWRfdCBhcmUgaGFyZC1jb2RlZCB0byAzMiBiaXRzIGluIHRoZSBpbm9kZS4KICAqIEhlbmNlLCBhbiAnaWQnIGluIGEgZHF1b3QgaXMgMzIgYml0cy4uCiAgKi8KLXR5cGVkZWYgX19pbnQzMl90CXhmc19kcWlkX3Q7Cit0eXBlZGVmIF9fdWludDMyX3QJeGZzX2RxaWRfdDsKIAogLyoKICAqIEV2ZW50aG91Z2ggdXNlcnMgbWF5IG5vdCBoYXZlIHF1b3RhIGxpbWl0cyBvY2N1cHlpbmcgYWxsIDY0LWJpdHMsCkBAIC01OSwyOCArNDUsMjggQEAKICAqIHRvIGNvbnN0cnVjdCB0aGUgb24gZGlzayBzdHJ1Y3R1cmUuCiAgKi8KIHR5cGVkZWYgc3RydWN0CXhmc19kaXNrX2RxdW90IHsKLS8qMTYqLwl1X2ludDE2X3QJZF9tYWdpYzsJLyogZHF1b3QgbWFnaWMgPSBYRlNfRFFVT1RfTUFHSUMgKi8KLS8qOCAqLwl1X2ludDhfdAlkX3ZlcnNpb247CS8qIGRxdW90IHZlcnNpb24gKi8KLS8qOCAqLwl1X2ludDhfdAlkX2ZsYWdzOwkvKiBYRlNfRFFfVVNFUi9QUk9KL0dST1VQICovCi0vKjMyKi8JeGZzX2RxaWRfdAlkX2lkOwkJLyogdXNlcixwcm9qZWN0LGdyb3VwIGlkICovCi0vKjY0Ki8JeGZzX3FjbnRfdAlkX2Jsa19oYXJkbGltaXQ7LyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBibGtzICovCi0vKjY0Ki8JeGZzX3FjbnRfdAlkX2Jsa19zb2Z0bGltaXQ7LyogcHJlZmVycmVkIGxpbWl0IG9uIGRpc2sgYmxrcyAqLwotLyo2NCovCXhmc19xY250X3QJZF9pbm9faGFyZGxpbWl0Oy8qIG1heGltdW0gIyBhbGxvY2F0ZWQgaW5vZGVzICovCi0vKjY0Ki8JeGZzX3FjbnRfdAlkX2lub19zb2Z0bGltaXQ7LyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCi0vKjY0Ki8JeGZzX3FjbnRfdAlkX2Jjb3VudDsJLyogZGlzayBibG9ja3Mgb3duZWQgYnkgdGhlIHVzZXIgKi8KLS8qNjQqLwl4ZnNfcWNudF90CWRfaWNvdW50OwkvKiBpbm9kZXMgb3duZWQgYnkgdGhlIHVzZXIgKi8KLS8qMzIqLwlfX2ludDMyX3QJZF9pdGltZXI7CS8qIHplcm8gaWYgd2l0aGluIGlub2RlIGxpbWl0cyBpZiBub3QsCisJX19iZTE2CQlkX21hZ2ljOwkvKiBkcXVvdCBtYWdpYyA9IFhGU19EUVVPVF9NQUdJQyAqLworCV9fdTgJCWRfdmVyc2lvbjsJLyogZHF1b3QgdmVyc2lvbiAqLworCV9fdTgJCWRfZmxhZ3M7CS8qIFhGU19EUV9VU0VSL1BST0ovR1JPVVAgKi8KKwlfX2JlMzIJCWRfaWQ7CQkvKiB1c2VyLHByb2plY3QsZ3JvdXAgaWQgKi8KKwlfX2JlNjQJCWRfYmxrX2hhcmRsaW1pdDsvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKwlfX2JlNjQJCWRfYmxrX3NvZnRsaW1pdDsvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBibGtzICovCisJX19iZTY0CQlkX2lub19oYXJkbGltaXQ7LyogbWF4aW11bSAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwlfX2JlNjQJCWRfaW5vX3NvZnRsaW1pdDsvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKwlfX2JlNjQJCWRfYmNvdW50OwkvKiBkaXNrIGJsb2NrcyBvd25lZCBieSB0aGUgdXNlciAqLworCV9fYmU2NAkJZF9pY291bnQ7CS8qIGlub2RlcyBvd25lZCBieSB0aGUgdXNlciAqLworCV9fYmUzMgkJZF9pdGltZXI7CS8qIHplcm8gaWYgd2l0aGluIGlub2RlIGxpbWl0cyBpZiBub3QsCiAJCQkJCSAgIHRoaXMgaXMgd2hlbiB3ZSByZWZ1c2Ugc2VydmljZSAqLwotLyozMiovCV9faW50MzJfdAlkX2J0aW1lcjsJLyogc2ltaWxhciB0byBhYm92ZTsgZm9yIGRpc2sgYmxvY2tzICovCi0vKjE2Ki8JeGZzX3F3YXJuY250X3QJZF9pd2FybnM7CS8qIHdhcm5pbmdzIGlzc3VlZCB3cnQgbnVtIGlub2RlcyAqLwotLyoxNiovCXhmc19xd2FybmNudF90CWRfYndhcm5zOwkvKiB3YXJuaW5ncyBpc3N1ZWQgd3J0IGRpc2sgYmxvY2tzICovCi0vKjMyKi8JX19pbnQzMl90CWRfcGFkMDsJCS8qIDY0IGJpdCBhbGlnbiAqLwotLyo2NCovCXhmc19xY250X3QJZF9ydGJfaGFyZGxpbWl0Oy8qIGFic29sdXRlIGxpbWl0IG9uIHJlYWx0aW1lIGJsa3MgKi8KLS8qNjQqLwl4ZnNfcWNudF90CWRfcnRiX3NvZnRsaW1pdDsvKiBwcmVmZXJyZWQgbGltaXQgb24gUlQgZGlzayBibGtzICovCi0vKjY0Ki8JeGZzX3FjbnRfdAlkX3J0YmNvdW50OwkvKiByZWFsdGltZSBibG9ja3Mgb3duZWQgKi8KLS8qMzIqLwlfX2ludDMyX3QJZF9ydGJ0aW1lcjsJLyogc2ltaWxhciB0byBhYm92ZTsgZm9yIFJUIGRpc2sgYmxvY2tzICovCi0vKjE2Ki8JeGZzX3F3YXJuY250X3QJZF9ydGJ3YXJuczsJLyogd2FybmluZ3MgaXNzdWVkIHdydCBSVCBkaXNrIGJsb2NrcyAqLwotLyoxNiovCV9fdWludDE2X3QJZF9wYWQ7CisJX19iZTMyCQlkX2J0aW1lcjsJLyogc2ltaWxhciB0byBhYm92ZTsgZm9yIGRpc2sgYmxvY2tzICovCisJX19iZTE2CQlkX2l3YXJuczsJLyogd2FybmluZ3MgaXNzdWVkIHdydCBudW0gaW5vZGVzICovCisJX19iZTE2CQlkX2J3YXJuczsJLyogd2FybmluZ3MgaXNzdWVkIHdydCBkaXNrIGJsb2NrcyAqLworCV9fYmUzMgkJZF9wYWQwOwkJLyogNjQgYml0IGFsaWduICovCisJX19iZTY0CQlkX3J0Yl9oYXJkbGltaXQ7LyogYWJzb2x1dGUgbGltaXQgb24gcmVhbHRpbWUgYmxrcyAqLworCV9fYmU2NAkJZF9ydGJfc29mdGxpbWl0Oy8qIHByZWZlcnJlZCBsaW1pdCBvbiBSVCBkaXNrIGJsa3MgKi8KKwlfX2JlNjQJCWRfcnRiY291bnQ7CS8qIHJlYWx0aW1lIGJsb2NrcyBvd25lZCAqLworCV9fYmUzMgkJZF9ydGJ0aW1lcjsJLyogc2ltaWxhciB0byBhYm92ZTsgZm9yIFJUIGRpc2sgYmxvY2tzICovCisJX19iZTE2CQlkX3J0Yndhcm5zOwkvKiB3YXJuaW5ncyBpc3N1ZWQgd3J0IFJUIGRpc2sgYmxvY2tzICovCisJX19iZTE2CQlkX3BhZDsKIH0geGZzX2Rpc2tfZHF1b3RfdDsKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcmVmY2FjaGUuaCBiL2ZzL3hmcy94ZnNfcmVmY2FjaGUuaAppbmRleCBjZDhkZGZkLi4yZGVjNzllIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3JlZmNhY2hlLmgKKysrIGIvZnMveGZzL3hmc19yZWZjYWNoZS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfUkVGQ0FDSEVfSF9fCiAjZGVmaW5lIF9fWEZTX1JFRkNBQ0hFX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19yZW5hbWUuYyBiL2ZzL3hmcy94ZnNfcmVuYW1lLmMKaW5kZXggMjNiNDhhYy4uNGQ0ZThmNCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19yZW5hbWUuYworKysgYi9mcy94ZnMveGZzX3JlbmFtZS5jCkBAIC0xLDYwICsxLDQ1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKICNpbmNsdWRlICJ4ZnNfcmVmY2FjaGUuaCIKICNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKLSNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKIAogCkBAIC02MjAsOCArNjA1LDYgQEAKIAkJSVJFTEUodGFyZ2V0X2lwKTsKIAl9CiAKLQlGU0NfTk9USUZZX05BTUVfQ0hBTkdFRChYRlNfSVRPVihzcmNfaXApKTsKLQogCUlSRUxFKHNyY19pcCk7CiAKIAkvKiBGYWxsIHRocm91Z2ggdG8gc3RkX3JldHVybiB3aXRoIGVycm9yID0gMCBvciBlcnJubyBmcm9tCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J0YWxsb2MuYyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCmluZGV4IDJjMzc4MjIuLjA2ZmMwNjEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCkBAIC0xLDQ0ICsxLDI2IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KLS8qCi0gKiBGcmVlIHJlYWx0aW1lIHNwYWNlIGFsbG9jYXRpb24gZm9yIFhGUy4KLSAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgpAQCAtNDYsMTkgKzI4LDE4IEBACiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZnNvcHMuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcnRhbGxvYy5oIGIvZnMveGZzL3hmc19ydGFsbG9jLmgKaW5kZXggZTI3MTAyNi4uMGUwYjRkMiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydGFsbG9jLmgKKysrIGIvZnMveGZzL3hmc19ydGFsbG9jLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19SVEFMTE9DX0hfXwogI2RlZmluZQlfX1hGU19SVEFMTE9DX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ydy5jIGIvZnMveGZzL3hmc19ydy5jCmluZGV4IGQzZmY3YWUuLmM0YjIwODcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcncuYworKysgYi9mcy94ZnMveGZzX3J3LmMKQEAgLTEsNDAgKzEsMjYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgpAQCAtNDIsMjAgKzI4LDIwIEBACiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgotI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgotI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCiAjaW5jbHVkZSAieGZzX2FjbC5oIgogI2luY2x1ZGUgInhmc19tYWMuaCIKQEAgLTI2NCw3ICsyNTAsNyBAQAogewogCWNtbl9lcnIoQ0VfQUxFUlQsCiAgIkkvTyBlcnJvciBpbiBmaWxlc3lzdGVtIChcIiVzXCIpIG1ldGEtZGF0YSBkZXYgJXMgYmxvY2sgMHglbGx4IgotICIgICAgICAgKFwiJXNcIikgZXJyb3IgJWQgYnVmIGNvdW50ICV1IiwKKyAiICAgICAgIChcIiVzXCIpIGVycm9yICVkIGJ1ZiBjb3VudCAlemQiLAogCQkoIW1wIHx8ICFtcC0+bV9mc25hbWUpID8gIihmcyBuYW1lIG5vdCBzZXQpIiA6IG1wLT5tX2ZzbmFtZSwKIAkJWEZTX0JVRlRBUkdfTkFNRShicC0+cGJfdGFyZ2V0KSwKIAkJKF9fdWludDY0X3QpYmxrbm8sCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmggYi9mcy94ZnMveGZzX3J3LmgKaW5kZXggYzhiMTBiZi4uZGU4NWVlZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydy5oCisrKyBiL2ZzL3hmcy94ZnNfcncuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmCV9fWEZTX1JXX0hfXwogI2RlZmluZQlfX1hGU19SV19IX18KQEAgLTY4LDg3ICs1NCw0NCBAQAogICogZmlsZSBpcyBhIHJlYWwgdGltZSBmaWxlIG9yIG5vdCwgYmVjYXVzZSB0aGUgYm1hcCBjb2RlCiAgKiBkb2VzLgogICovCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GU0JfVE9fREIpCi14ZnNfZGFkZHJfdCB4ZnNfZnNiX3RvX2RiKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZnNibG9ja190IGZzYik7CiAjZGVmaW5lCVhGU19GU0JfVE9fREIoaXAsZnNiKQl4ZnNfZnNiX3RvX2RiKGlwLGZzYikKLSNlbHNlCi0jZGVmaW5lCVhGU19GU0JfVE9fREIoaXAsZnNiKSBcCi0JCSgoKGlwKS0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgPyBcCitzdGF0aWMgaW5saW5lIHhmc19kYWRkcl90Cit4ZnNfZnNiX3RvX2RiKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZnNibG9ja190IGZzYikKK3sKKwlyZXR1cm4gKCgoaXApLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSA/IFwKIAkJICh4ZnNfZGFkZHJfdClYRlNfRlNCX1RPX0JCKChpcCktPmlfbW91bnQsIChmc2IpKSA6IFwKLQkJIFhGU19GU0JfVE9fREFERFIoKGlwKS0+aV9tb3VudCwgKGZzYikpKQotI2VuZGlmCi0KLSNkZWZpbmUgWEZTX0ZTQl9UT19EQl9JTyhpbyxmc2IpIFwKLQkJKCgoaW8pLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpID8gXAorCQkgWEZTX0ZTQl9UT19EQUREUigoaXApLT5pX21vdW50LCAoZnNiKSkpOworfQorI2RlZmluZSBYRlNfRlNCX1RPX0RCX0lPKGlvLGZzYikgeGZzX2ZzYl90b19kYl9pbyhpbyxmc2IpCitzdGF0aWMgaW5saW5lIHhmc19kYWRkcl90Cit4ZnNfZnNiX3RvX2RiX2lvKHN0cnVjdCB4ZnNfaW9jb3JlICppbywgeGZzX2ZzYmxvY2tfdCBmc2IpCit7CisJcmV0dXJuICgoKGlvKS0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSA/IFwKIAkJIFhGU19GU0JfVE9fQkIoKGlvKS0+aW9fbW91bnQsIChmc2IpKSA6IFwKLQkJIFhGU19GU0JfVE9fREFERFIoKGlvKS0+aW9fbW91bnQsIChmc2IpKSkKKwkJIFhGU19GU0JfVE9fREFERFIoKGlvKS0+aW9fbW91bnQsIChmc2IpKSk7Cit9CiAKIC8qCiAgKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgaW4geGZzX3J3LmMuCiAgKi8KLQotaW50Ci14ZnNfd3JpdGVfY2xlYXJfc2V0dWlkKAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwKTsKLQotaW50Ci14ZnNfYndyaXRlKAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAotCXN0cnVjdCB4ZnNfYnVmCQkqYnApOwotCi1pbnQKLXhmc19iaW9lcnJvcigKLQlzdHJ1Y3QgeGZzX2J1ZgkJKmIpOwotCi1pbnQKLXhmc19iaW9lcnJvcl9yZWxzZSgKLQlzdHJ1Y3QgeGZzX2J1ZgkJKmIpOwotCi1pbnQKLXhmc19yZWFkX2J1ZigKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCwKLQl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LAotCXhmc19kYWRkcl90CQlibGtubywKLQlpbnQJCQlsZW4sCi0JdWludAkJCWZsYWdzLAotCXN0cnVjdCB4ZnNfYnVmCQkqKmJwcCk7Ci0KLXZvaWQKLXhmc19pb2Vycm9yX2FsZXJ0KAotCWNoYXIJCQkqZnVuYywKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCwKLQl4ZnNfYnVmX3QJCSpicCwKLQl4ZnNfZGFkZHJfdAkJYmxrbm8pOwotCitleHRlcm4gaW50IHhmc193cml0ZV9jbGVhcl9zZXR1aWQoc3RydWN0IHhmc19pbm9kZSAqaXApOworZXh0ZXJuIGludCB4ZnNfYndyaXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX2J1ZiAqYnApOworZXh0ZXJuIGludCB4ZnNfYmlvZXJyb3Ioc3RydWN0IHhmc19idWYgKmJwKTsKK2V4dGVybiBpbnQgeGZzX2Jpb2Vycm9yX3JlbHNlKHN0cnVjdCB4ZnNfYnVmICpicCk7CitleHRlcm4gaW50IHhmc19yZWFkX2J1ZihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2J1ZnRhcmdfdCAqYnRwLAorCQkJeGZzX2RhZGRyX3QgYmxrbm8sIGludCBsZW4sIHVpbnQgZmxhZ3MsCisJCQlzdHJ1Y3QgeGZzX2J1ZiAqKmJwcCk7CitleHRlcm4gdm9pZCB4ZnNfaW9lcnJvcl9hbGVydChjaGFyICpmdW5jLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwkJCQl4ZnNfYnVmX3QgKmJwLCB4ZnNfZGFkZHJfdCBibGtubyk7CiAKIC8qCiAgKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgaW4geGZzX3Zub2Rlb3BzLmMuCiAgKi8KLQotaW50Ci14ZnNfcndsb2NrKAotCWJodl9kZXNjX3QJCSpiZHAsCi0JdnJ3bG9ja190CQl3cml0ZV9sb2NrKTsKLQotdm9pZAoteGZzX3J3dW5sb2NrKAotCWJodl9kZXNjX3QJCSpiZHAsCi0JdnJ3bG9ja190CQl3cml0ZV9sb2NrKTsKLQotaW50Ci14ZnNfY2hhbmdlX2ZpbGVfc3BhY2UoCi0JYmh2X2Rlc2NfdAkJKmJkcCwKLQlpbnQJCQljbWQsCi0JeGZzX2Zsb2NrNjRfdAkJKmJmLAotCXhmc19vZmZfdAkJb2Zmc2V0LAotCWNyZWRfdAkJCSpjcmVkcCwKLQlpbnQJCQlmbGFncyk7Ci0KLWludAoteGZzX3NldF9kbWF0dHJzKAotCWJodl9kZXNjX3QJCSpiZHAsCi0JdV9pbnQJCQlldm1hc2ssCi0JdV9pbnQxNl90CQlzdGF0ZSwKLQljcmVkX3QJCQkqY3JlZHApOworZXh0ZXJuIGludCB4ZnNfcndsb2NrKGJodl9kZXNjX3QgKmJkcCwgdnJ3bG9ja190IHdyaXRlX2xvY2spOworZXh0ZXJuIHZvaWQgeGZzX3J3dW5sb2NrKGJodl9kZXNjX3QgKmJkcCwgdnJ3bG9ja190IHdyaXRlX2xvY2spOworZXh0ZXJuIGludCB4ZnNfY2hhbmdlX2ZpbGVfc3BhY2UoYmh2X2Rlc2NfdCAqYmRwLCBpbnQgY21kLCB4ZnNfZmxvY2s2NF90ICpiZiwKKwkJCQkgeGZzX29mZl90IG9mZnNldCwgY3JlZF90ICpjcmVkcCwgaW50IGZsYWdzKTsKK2V4dGVybiBpbnQgeGZzX3NldF9kbWF0dHJzKGJodl9kZXNjX3QgKmJkcCwgdV9pbnQgZXZtYXNrLCB1X2ludDE2X3Qgc3RhdGUsCisJCQkgICBjcmVkX3QgKmNyZWRwKTsKIAogI2VuZGlmIC8qIF9fWEZTX1JXX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19zYi5oIGIvZnMveGZzL3hmc19zYi5oCmluZGV4IGFkMDkwYTguLjRhMTdkMzMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfc2IuaAorKysgYi9mcy94ZnMveGZzX3NiLmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfU0JfSF9fCiAjZGVmaW5lCV9fWEZTX1NCX0hfXwpAQCAtNzIsNyArNTgsOCBAQAogCSBYRlNfU0JfVkVSU0lPTl9EQUxJR05CSVQgfCBcCiAJIFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCB8IFwKIAkgWEZTX1NCX1ZFUlNJT05fTE9HVjJCSVQgfCBcCi0JIFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVCkKKwkgWEZTX1NCX1ZFUlNJT05fU0VDVE9SQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCkKICNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fT0tTQVNIQklUUwlcCiAJKFhGU19TQl9WRVJTSU9OX05VTUJJVFMgfCBcCiAJIFhGU19TQl9WRVJTSU9OX1JFQUxGQklUUyB8IFwKQEAgLTEwMywxMiArOTAsMTUgQEAKICAqLwogI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfUkVBTEZCSVRTCTB4MDBmZmZmZmYJLyogTWFzazogZmVhdHVyZXMgKi8KICNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX1JFU0VSVkVEMUJJVAkweDAwMDAwMDAxCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9SRVNFUlZFRDJCSVQJMHgwMDAwMDAwMgorI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfUkVTRVJWRUQ0QklUCTB4MDAwMDAwMDQKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX0FUVFIyQklUCTB4MDAwMDAwMDgJLyogSW5saW5lIGF0dHIgcmV3b3JrICovCiAjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9TQVNIRkJJVFMJMHhmZjAwMDAwMAkvKiBNYXNrOiBmZWF0dXJlcyB0aGF0CiAJCQkJCQkJICAgcmVxdWlyZSBjaGFuZ2luZwogCQkJCQkJCSAgIFBST00gYW5kIFNBU0ggKi8KIAogI2RlZmluZQlYRlNfU0JfVkVSU0lPTjJfT0tSRUFMRkJJVFMJXAotCSgwKQorCShYRlNfU0JfVkVSU0lPTjJfQVRUUjJCSVQpCiAjZGVmaW5lCVhGU19TQl9WRVJTSU9OMl9PS1NBU0hGQklUUwlcCiAJKDApCiAjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9PS1JFQUxCSVRTCVwKQEAgLTExOCw4ICsxMDgsNyBAQAogLyoKICAqIG1rZnMgbWFjcm8gdG8gc2V0IHVwIHNiX2ZlYXR1cmVzMiB3b3JkCiAgKi8KLSNkZWZpbmUJWEZTX1NCX1ZFUlNJT04yX01LRlMoeHl6KQlcCi0JKCh4eXopID8gMCA6IDApCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OMl9NS0ZTKHJlc3ZkMSwgc2JjbnRyKQkwCiAKIHR5cGVkZWYgc3RydWN0IHhmc19zYgogewpAQCAtMTc2LDcgKzE2NSw3IEBACiAJX191aW50OF90CXNiX2xvZ3NlY3Rsb2c7CS8qIGxvZzIgb2YgdGhlIGxvZyBzZWN0b3Igc2l6ZSAqLwogCV9fdWludDE2X3QJc2JfbG9nc2VjdHNpemU7CS8qIHNlY3RvciBzaXplIGZvciB0aGUgbG9nLCBieXRlcyAqLwogCV9fdWludDMyX3QJc2JfbG9nc3VuaXQ7CS8qIHN0cmlwZSB1bml0IHNpemUgZm9yIHRoZSBsb2cgKi8KLQlfX3VpbnQzMl90CXNiX2ZlYXR1cmVzMjsJLyogYWRkaXRvbmFsIGZlYXR1cmUgYml0cyAqLworCV9fdWludDMyX3QJc2JfZmVhdHVyZXMyOwkvKiBhZGRpdGlvbmFsIGZlYXR1cmUgYml0cyAqLwogfSB4ZnNfc2JfdDsKIAogLyoKQEAgLTIxNiwxMiArMjA1LDE1IEBACiAjZGVmaW5lIFhGU19TQl9TSEFSRURfVk4JWEZTX1NCX01WQUwoU0hBUkVEX1ZOKQogI2RlZmluZSBYRlNfU0JfVU5JVAkJWEZTX1NCX01WQUwoVU5JVCkKICNkZWZpbmUgWEZTX1NCX1dJRFRICQlYRlNfU0JfTVZBTChXSURUSCkKKyNkZWZpbmUgWEZTX1NCX0ZFQVRVUkVTMglYRlNfU0JfTVZBTChGRUFUVVJFUzIpCiAjZGVmaW5lCVhGU19TQl9OVU1fQklUUwkJKChpbnQpWEZTX1NCU19GSUVMRENPVU5UKQogI2RlZmluZQlYRlNfU0JfQUxMX0JJVFMJCSgoMUxMIDw8IFhGU19TQl9OVU1fQklUUykgLSAxKQogI2RlZmluZQlYRlNfU0JfTU9EX0JJVFMJCVwKIAkoWEZTX1NCX1VVSUQgfCBYRlNfU0JfUk9PVElOTyB8IFhGU19TQl9SQk1JTk8gfCBYRlNfU0JfUlNVTUlOTyB8IFwKIAkgWEZTX1NCX1ZFUlNJT05OVU0gfCBYRlNfU0JfVVFVT1RJTk8gfCBYRlNfU0JfR1FVT1RJTk8gfCBcCi0JIFhGU19TQl9RRkxBR1MgfCBYRlNfU0JfU0hBUkVEX1ZOIHwgWEZTX1NCX1VOSVQgfCBYRlNfU0JfV0lEVEgpCisJIFhGU19TQl9RRkxBR1MgfCBYRlNfU0JfU0hBUkVEX1ZOIHwgWEZTX1NCX1VOSVQgfCBYRlNfU0JfV0lEVEggfCBcCisJIFhGU19TQl9GRUFUVVJFUzIpCisKIAogLyoKICAqIE1pc2MuIEZsYWdzIC0gd2FybmluZyAtIHRoZXNlIHdpbGwgYmUgY2xlYXJlZCBieSB4ZnNfcmVwYWlyIHVubGVzcwpAQCAtMjM1LDQyICsyMjcsMzMgQEAKICAqLwogI2RlZmluZSBYRlNfU0JfTUFYX1NIQVJFRF9WTgkwCiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fTlVNKQotaW50IHhmc19zYl92ZXJzaW9uX251bSh4ZnNfc2JfdCAqc2JwKTsKLSNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkJeGZzX3NiX3ZlcnNpb25fbnVtKHNicCkKLSNlbHNlCiAjZGVmaW5lCVhGU19TQl9WRVJTSU9OX05VTShzYnApCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX05VTUJJVFMpCi0jZW5kaWYKIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfR09PRF9WRVJTSU9OKQotaW50IHhmc19zYl9nb29kX3ZlcnNpb24oeGZzX3NiX3QgKnNicCk7CiAjZGVmaW5lCVhGU19TQl9HT09EX1ZFUlNJT04oc2JwKQl4ZnNfc2JfZ29vZF92ZXJzaW9uKHNicCkKLSNlbHNlCi0jZGVmaW5lCVhGU19TQl9HT09EX1ZFUlNJT05fSU5UKHNicCkJXAotCSgoKChzYnApLT5zYl92ZXJzaW9ubnVtID49IFhGU19TQl9WRVJTSU9OXzEpICYmIFwKLQkgICgoc2JwKS0+c2JfdmVyc2lvbm51bSA8PSBYRlNfU0JfVkVSU0lPTl8zKSkgfHwgXAotCSAgICgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAotCSAgICAhKCgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIH5YRlNfU0JfVkVSU0lPTl9PS1JFQUxCSVRTKSB8fCBcCi0JICAgICAgKCgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKSAmJiBcCi0JICAgICAgICgoc2JwKS0+c2JfZmVhdHVyZXMyICYgflhGU19TQl9WRVJTSU9OMl9PS1JFQUxCSVRTKSkpCi0KICNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lCVhGU19TQl9HT09EX1ZFUlNJT04oc2JwKQlcCi0JKFhGU19TQl9HT09EX1ZFUlNJT05fSU5UKHNicCkgJiYgXAotCSAgKHNicCktPnNiX3NoYXJlZF92biA8PSBYRlNfU0JfTUFYX1NIQVJFRF9WTikgKSkKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl9nb29kX3ZlcnNpb24oeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gKCgoc2JwLT5zYl92ZXJzaW9ubnVtID49IFhGU19TQl9WRVJTSU9OXzEpICYmIFwKKwkJICAoc2JwLT5zYl92ZXJzaW9ubnVtIDw9IFhGU19TQl9WRVJTSU9OXzMpKSB8fCBcCisJCSAgICgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCQkgICAgISgoc2JwLT5zYl92ZXJzaW9ubnVtICYgflhGU19TQl9WRVJTSU9OX09LUkVBTEJJVFMpIHx8IFwKKwkJICAgICAgKChzYnAtPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCkgJiYgXAorCQkgICAgICAgKHNicC0+c2JfZmVhdHVyZXMyICYgflhGU19TQl9WRVJTSU9OMl9PS1JFQUxCSVRTKSkpICYmIFwKKwkgIAkgICAgKHNicC0+c2Jfc2hhcmVkX3ZuIDw9IFhGU19TQl9NQVhfU0hBUkVEX1ZOKSkpOworfQogI2Vsc2UKLS8qCi0gKiBleHRyYSAyIHBhcmVuJ3MgaGVyZSAoKCB0byB1bmNvbmZ1c2UgcGFyZW4tbWF0Y2hpbmcgZWRpdG9ycwotICogbGlrZSB2aSBiZWNhdXNlIFhGU19TQl9HT09EX1ZFUlNJT05fSU5UIGlzIGEgcGFydGlhbCBleHByZXNzaW9uCi0gKiBhbmQgdGhlIHR3byBYRlNfU0JfR09PRF9WRVJTSU9OJ3MgZWFjaCAyIG1vcmUgY2xvc2UgcGFyZW4ncyB0bwotICogY29tcGxldGUgdGhlIGV4cHJlc3Npb24uCi0gKi8KLSNkZWZpbmUgWEZTX1NCX0dPT0RfVkVSU0lPTihzYnApCVwKLQkoWEZTX1NCX0dPT0RfVkVSU0lPTl9JTlQoc2JwKSAmJiBcCi0JICAoISgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCkgfHwgXAotCSAgIChzYnApLT5zYl9zaGFyZWRfdm4gPD0gWEZTX1NCX01BWF9TSEFSRURfVk4pKSApKQorc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX2dvb2RfdmVyc2lvbih4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiAoKChzYnAtPnNiX3ZlcnNpb25udW0gPj0gWEZTX1NCX1ZFUlNJT05fMSkgJiYgXAorCQkgIChzYnAtPnNiX3ZlcnNpb25udW0gPD0gWEZTX1NCX1ZFUlNJT05fMykpIHx8IFwKKwkJICAgKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCisJCSAgICAhKChzYnAtPnNiX3ZlcnNpb25udW0gJiB+WEZTX1NCX1ZFUlNJT05fT0tSRUFMQklUUykgfHwgXAorCQkgICAgICAoKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKSAmJiBcCisJCSAgICAgICAoc2JwLT5zYl9mZWF0dXJlczIgJiB+WEZTX1NCX1ZFUlNJT04yX09LUkVBTEJJVFMpKSkgJiYgXAorCQkgICghKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCkgfHwgXAorCQkgICAoc2JwLT5zYl9zaGFyZWRfdm4gPD0gWEZTX1NCX01BWF9TSEFSRURfVk4pKSkpOworfQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZgogCiAjZGVmaW5lCVhGU19TQl9HT09EX1NBU0hfVkVSU0lPTihzYnApCVwKIAkoKCgoc2JwKS0+c2JfdmVyc2lvbm51bSA+PSBYRlNfU0JfVkVSU0lPTl8xKSAmJiBcCkBAIC0yNzgsMjc1ICsyNjEsMjE4IEBACiAJICgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAogCSAgISgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIH5YRlNfU0JfVkVSU0lPTl9PS1NBU0hCSVRTKSkpCiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fVE9ORVcpCi11bnNpZ25lZCB4ZnNfc2JfdmVyc2lvbl90b25ldyh1bnNpZ25lZCB2KTsKICNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fVE9ORVcodikJeGZzX3NiX3ZlcnNpb25fdG9uZXcodikKLSNlbHNlCi0jZGVmaW5lCVhGU19TQl9WRVJTSU9OX1RPTkVXKHYpCVwKLQkoKCgodikgPT0gWEZTX1NCX1ZFUlNJT05fMSkgPyBcCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHhmc19zYl92ZXJzaW9uX3RvbmV3KHVuc2lnbmVkIHYpCit7CisJcmV0dXJuICgoKCh2KSA9PSBYRlNfU0JfVkVSU0lPTl8xKSA/IFwKIAkJMCA6IFwKIAkJKCgodikgPT0gWEZTX1NCX1ZFUlNJT05fMikgPyBcCiAJCQlYRlNfU0JfVkVSU0lPTl9BVFRSQklUIDogXAogCQkJKFhGU19TQl9WRVJTSU9OX0FUVFJCSVQgfCBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVCkpKSB8IFwKLQkgWEZTX1NCX1ZFUlNJT05fNCkKLSNlbmRpZgorCQlYRlNfU0JfVkVSU0lPTl80KTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9UT09MRCkKLXVuc2lnbmVkIHhmc19zYl92ZXJzaW9uX3Rvb2xkKHVuc2lnbmVkIHYpOwogI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9UT09MRCh2KQl4ZnNfc2JfdmVyc2lvbl90b29sZCh2KQotI2Vsc2UKLSNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fVE9PTEQodikJXAotCSgoKHYpICYgKFhGU19TQl9WRVJTSU9OX1FVT1RBQklUIHwgWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQpKSA/IFwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgeGZzX3NiX3ZlcnNpb25fdG9vbGQodW5zaWduZWQgdikKK3sKKwlyZXR1cm4gKCgodikgJiAoWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQgfCBYRlNfU0JfVkVSU0lPTl9BTElHTkJJVCkpID8gXAogCQkwIDogXAogCQkoKCh2KSAmIFhGU19TQl9WRVJTSU9OX05MSU5LQklUKSA/IFwKIAkJCVhGU19TQl9WRVJTSU9OXzMgOiBcCiAJCQkoKCh2KSAmIFhGU19TQl9WRVJTSU9OX0FUVFJCSVQpID8gIFwKIAkJCQlYRlNfU0JfVkVSU0lPTl8yIDogXAotCQkJCVhGU19TQl9WRVJTSU9OXzEpKSkKLSNlbmRpZgorCQkJCVhGU19TQl9WRVJTSU9OXzEpKSk7Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTQVRUUikKLWludCB4ZnNfc2JfdmVyc2lvbl9oYXNhdHRyKHhmc19zYl90ICpzYnApOwogI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNBVFRSKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzYXR0cihzYnApCi0jZWxzZQotI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNBVFRSKHNicCkJXAotCSgoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMikgfHwgXAotCSAoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMykgfHwgXAotCSAoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKLQkgICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0FUVFJCSVQpKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzYXR0cih4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiAoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMikgfHwgXAorCQkgKChzYnApLT5zYl92ZXJzaW9ubnVtID09IFhGU19TQl9WRVJTSU9OXzMpIHx8IFwKKwkJICgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCQkgICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0FUVFJCSVQpKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BRERBVFRSKQotdm9pZCB4ZnNfc2JfdmVyc2lvbl9hZGRhdHRyKHhmc19zYl90ICpzYnApOwogI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BRERBVFRSKHNicCkJeGZzX3NiX3ZlcnNpb25fYWRkYXR0cihzYnApCi0jZWxzZQotI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BRERBVFRSKHNicCkJXAotCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKLQkgKCgoc2JwKS0+c2JfdmVyc2lvbm51bSA9PSBYRlNfU0JfVkVSU0lPTl8xKSA/IFwKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfc2JfdmVyc2lvbl9hZGRhdHRyKHhmc19zYl90ICpzYnApCit7CisJKHNicCktPnNiX3ZlcnNpb25udW0gPSAoKChzYnApLT5zYl92ZXJzaW9ubnVtID09IFhGU19TQl9WRVJTSU9OXzEpID8gXAogCQlYRlNfU0JfVkVSU0lPTl8yIDogXAogCQkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpID8gXAogCQkJKChzYnApLT5zYl92ZXJzaW9ubnVtIHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCkgOiBcCi0JCQkoWEZTX1NCX1ZFUlNJT05fNCB8IFhGU19TQl9WRVJTSU9OX0FUVFJCSVQpKSkpCi0jZW5kaWYKKwkJCShYRlNfU0JfVkVSU0lPTl80IHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCkpKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNOTElOSykKLWludCB4ZnNfc2JfdmVyc2lvbl9oYXNubGluayh4ZnNfc2JfdCAqc2JwKTsKICNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNubGluayhzYnApCi0jZWxzZQotI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNOTElOSyhzYnApCVwKLQkoKChzYnApLT5zYl92ZXJzaW9ubnVtID09IFhGU19TQl9WRVJTSU9OXzMpIHx8IFwKLQkgKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JICAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVCkpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNubGluayh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiAoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMykgfHwgXAorCQkgKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCisJCSAgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQpKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BREROTElOSykKLXZvaWQgeGZzX3NiX3ZlcnNpb25fYWRkbmxpbmsoeGZzX3NiX3QgKnNicCk7CiAjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FERE5MSU5LKHNicCkJeGZzX3NiX3ZlcnNpb25fYWRkbmxpbmsoc2JwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQURETkxJTksoc2JwKQlcCi0JKChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAotCSAoKHNicCktPnNiX3ZlcnNpb25udW0gPD0gWEZTX1NCX1ZFUlNJT05fMiA/IFwKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfc2JfdmVyc2lvbl9hZGRubGluayh4ZnNfc2JfdCAqc2JwKQoreworCShzYnApLT5zYl92ZXJzaW9ubnVtID0gKChzYnApLT5zYl92ZXJzaW9ubnVtIDw9IFhGU19TQl9WRVJTSU9OXzIgPyBcCiAJCVhGU19TQl9WRVJTSU9OXzMgOiBcCi0JCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX05MSU5LQklUKSkpCi0jZW5kaWYKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtIHwgWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQpKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSkKLWludCB4ZnNfc2JfdmVyc2lvbl9oYXNxdW90YSh4ZnNfc2JfdCAqc2JwKTsKICNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNxdW90YShzYnApCi0jZWxzZQotI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQShzYnApCVwKLQkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKLQkgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNxdW90YSh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiAoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCQkoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVCk7Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fQUREUVVPVEEpCi12b2lkIHhmc19zYl92ZXJzaW9uX2FkZHF1b3RhKHhmc19zYl90ICpzYnApOwogI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BRERRVU9UQShzYnApCXhmc19zYl92ZXJzaW9uX2FkZHF1b3RhKHNicCkKLSNlbHNlCi0jZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FERFFVT1RBKHNicCkJXAotCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKLQkgKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgPyBcCi0JCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX1FVT1RBQklUKSA6IFwKLQkJKFhGU19TQl9WRVJTSU9OX1RPTkVXKChzYnApLT5zYl92ZXJzaW9ubnVtKSB8IFwKLQkJIFhGU19TQl9WRVJTSU9OX1FVT1RBQklUKSkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfc2JfdmVyc2lvbl9hZGRxdW90YSh4ZnNfc2JfdCAqc2JwKQoreworCShzYnApLT5zYl92ZXJzaW9ubnVtID0gXAorCQkgKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgPyBcCisJCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVCkgOiBcCisJCQkoWEZTX1NCX1ZFUlNJT05fVE9ORVcoKHNicCktPnNiX3ZlcnNpb25udW0pIHwgXAorCQkJIFhGU19TQl9WRVJTSU9OX1FVT1RBQklUKSk7Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTQUxJR04pCi1pbnQgeGZzX3NiX3ZlcnNpb25faGFzYWxpZ24oeGZzX3NiX3QgKnNicCk7CiAjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0hBU0FMSUdOKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzYWxpZ24oc2JwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fSEFTQUxJR04oc2JwKQlcCi0JKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0FMSUdOQklUKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzYWxpZ24oeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQpOworfQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX1NVQkFMSUdOKQotdm9pZCB4ZnNfc2JfdmVyc2lvbl9zdWJhbGlnbih4ZnNfc2JfdCAqc2JwKTsKICNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fU1VCQUxJR04oc2JwKQl4ZnNfc2JfdmVyc2lvbl9zdWJhbGlnbihzYnApCi0jZWxzZQotI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9TVUJBTElHTihzYnApCVwKLQkoKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCi0JIFhGU19TQl9WRVJTSU9OX1RPT0xEKChzYnApLT5zYl92ZXJzaW9ubnVtICYgflhGU19TQl9WRVJTSU9OX0FMSUdOQklUKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSB2b2lkIHhmc19zYl92ZXJzaW9uX3N1YmFsaWduKHhmc19zYl90ICpzYnApCit7CisJKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCisJIFhGU19TQl9WRVJTSU9OX1RPT0xEKChzYnApLT5zYl92ZXJzaW9ubnVtICYgflhGU19TQl9WRVJTSU9OX0FMSUdOQklUKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04pCi1pbnQgeGZzX3NiX3ZlcnNpb25faGFzZGFsaWduKHhmc19zYl90ICpzYnApOwogI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04oc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNkYWxpZ24oc2JwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTREFMSUdOKHNicCkJXAotCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAotCSAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9EQUxJR05CSVQpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNkYWxpZ24oeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BREREQUxJR04pCi1pbnQgeGZzX3NiX3ZlcnNpb25fYWRkZGFsaWduKHhmc19zYl90ICpzYnApOwogI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9BREREQUxJR04oc2JwKQl4ZnNfc2JfdmVyc2lvbl9hZGRkYWxpZ24oc2JwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fQUREREFMSUdOKHNicCkJXAotCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKLQkJKChzYnApLT5zYl92ZXJzaW9ubnVtIHwgWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25fYWRkZGFsaWduKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAorCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9EQUxJR05CSVQpOworfQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU1NIQVJFRCkKLWludCB4ZnNfc2JfdmVyc2lvbl9oYXNzaGFyZWQoeGZzX3NiX3QgKnNicCk7CiAjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU1NIQVJFRChzYnApCXhmc19zYl92ZXJzaW9uX2hhc3NoYXJlZChzYnApCi0jZWxzZQotI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNTSEFSRUQoc2JwKQlcCi0JKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc3NoYXJlZCh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiAoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCQkoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQpOworfQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0FERFNIQVJFRCkKLWludCB4ZnNfc2JfdmVyc2lvbl9hZGRzaGFyZWQoeGZzX3NiX3QgKnNicCk7CiAjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0FERFNIQVJFRChzYnApCXhmc19zYl92ZXJzaW9uX2FkZHNoYXJlZChzYnApCi0jZWxzZQotI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9BRERTSEFSRUQoc2JwKQlcCi0JKChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAotCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9hZGRzaGFyZWQoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCk7Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fU1VCU0hBUkVEKQotaW50IHhmc19zYl92ZXJzaW9uX3N1YnNoYXJlZCh4ZnNfc2JfdCAqc2JwKTsKICNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fU1VCU0hBUkVEKHNicCkJeGZzX3NiX3ZlcnNpb25fc3Vic2hhcmVkKHNicCkKLSNlbHNlCi0jZGVmaW5lIFhGU19TQl9WRVJTSU9OX1NVQlNIQVJFRChzYnApCVwKLQkoKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCi0JCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIH5YRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9zdWJzaGFyZWQoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIH5YRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQpOworfQogCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0RJUlYyKQotaW50IHhmc19zYl92ZXJzaW9uX2hhc2RpcnYyKHhmc19zYl90ICpzYnApOwogI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNESVJWMihzYnApCXhmc19zYl92ZXJzaW9uX2hhc2RpcnYyKHNicCkKLSNlbHNlCi0jZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU0RJUlYyKHNicCkJXAotCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAotCSAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9ESVJWMkJJVCkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc2RpcnYyKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0RJUlYyQklUKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNMT0dWMikKLWludCB4ZnNfc2JfdmVyc2lvbl9oYXNsb2d2Mih4ZnNfc2JfdCAqc2JwKTsKICNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoc2JwKSAgIHhmc19zYl92ZXJzaW9uX2hhc2xvZ3YyKHNicCkKLSNlbHNlCi0jZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKHNicCkgICBcCi0JKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fTE9HVjJCSVQpKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNsb2d2Mih4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiAoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCQkoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9MT0dWMkJJVCk7Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTRVhURkxHQklUKQotaW50IHhmc19zYl92ZXJzaW9uX2hhc2V4dGZsZ2JpdCh4ZnNfc2JfdCAqc2JwKTsKICNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTRVhURkxHQklUKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzZXh0ZmxnYml0KHNicCkKLSNlbHNlCi0jZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVChzYnApCVwKLQkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKLQkgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzZXh0ZmxnYml0KHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCk7Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fQURERVhURkxHQklUKQotaW50IHhmc19zYl92ZXJzaW9uX2FkZGV4dGZsZ2JpdCh4ZnNfc2JfdCAqc2JwKTsKICNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fQURERVhURkxHQklUKHNicCkJeGZzX3NiX3ZlcnNpb25fYWRkZXh0ZmxnYml0KHNicCkKLSNlbHNlCi0jZGVmaW5lIFhGU19TQl9WRVJTSU9OX0FEREVYVEZMR0JJVChzYnApCVwKLQkoKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCi0JCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2FkZGV4dGZsZ2JpdCh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiAoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtIHwgWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUKTsKK30KIAotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9TVUJFWFRGTEdCSVQpCi1pbnQgeGZzX3NiX3ZlcnNpb25fc3ViZXh0ZmxnYml0KHhmc19zYl90ICpzYnApOwogI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9TVUJFWFRGTEdCSVQoc2JwKQl4ZnNfc2JfdmVyc2lvbl9zdWJleHRmbGdiaXQoc2JwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fU1VCRVhURkxHQklUKHNicCkJXAotCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKLQkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgflhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX3N1YmV4dGZsZ2JpdCh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiAoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgflhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCk7Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTU0VDVE9SKQotaW50IHhmc19zYl92ZXJzaW9uX2hhc3NlY3Rvcih4ZnNfc2JfdCAqc2JwKTsKICNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTU0VDVE9SKHNicCkgICB4ZnNfc2JfdmVyc2lvbl9oYXNzZWN0b3Ioc2JwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTU0VDVE9SKHNicCkgICBcCi0JKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fU0VDVE9SQklUKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzc2VjdG9yKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVCk7Cit9CiAKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTTU9SRUJJVFNCSVQpCi1pbnQgeGZzX3NiX3ZlcnNpb25faGFzbW9yZWJpdHMoeGZzX3NiX3QgKnNicCk7CiAjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU01PUkVCSVRTKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzbW9yZWJpdHMoc2JwKQotI2Vsc2UKLSNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTTU9SRUJJVFMoc2JwKQlcCi0JKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzbW9yZWJpdHMoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fTU9SRUJJVFNCSVQpOworfQogCiAvKgogICogc2JfZmVhdHVyZXMyIGJpdCB2ZXJzaW9uIG1hY3Jvcy4KICAqCi0gKiBGb3IgZXhhbXBsZSwgZm9yIGEgYml0IGRlZmluZWQgYXMgWEZTX1NCX1ZFUlNJT04yX1lCSVQsIGhhcyBhIG1hY3JvOgorICogRm9yIGV4YW1wbGUsIGZvciBhIGJpdCBkZWZpbmVkIGFzIFhGU19TQl9WRVJTSU9OMl9GVU5CSVQsIGhhcyBhIG1hY3JvOgogICoKLSAqIFNCX1ZFUlNJT05fSEFTWUJJVCh4ZnNfc2JfdCAqc2JwKQorICogU0JfVkVSU0lPTl9IQVNGVU5CSVQoeGZzX3NiX3QgKnNicCkKICAqCSgoWEZTX1NCX1ZFUlNJT05fSEFTTU9SRUJJVFMoc2JwKSAmJgotICoJICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OMl9ZQklUKQorICoJICgoc2JwKS0+c2JfZmVhdHVyZXMyICYgWEZTX1NCX1ZFUlNJT04yX0ZVTkJJVCkKICAqLwogCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU0FUVFIyKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzYXR0cjIoc2JwKQorc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzYXR0cjIoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX0hBU01PUkVCSVRTKHNicCkpICYmCVwKKwkJKChzYnApLT5zYl9mZWF0dXJlczIgJiBYRlNfU0JfVkVSU0lPTjJfQVRUUjJCSVQpOworfQorCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0FEREFUVFIyKHNicCkJeGZzX3NiX3ZlcnNpb25fYWRkYXR0cjIoc2JwKQorc3RhdGljIGlubGluZSB2b2lkIHhmc19zYl92ZXJzaW9uX2FkZGF0dHIyKHhmc19zYl90ICpzYnApCit7CisJKChzYnApLT5zYl92ZXJzaW9ubnVtID0JXAorCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCksCVwKKwkoKHNicCktPnNiX2ZlYXR1cmVzMiA9CVwKKwkJKChzYnApLT5zYl9mZWF0dXJlczIgfCBYRlNfU0JfVkVSU0lPTjJfQVRUUjJCSVQpKSk7Cit9CisKIC8qCiAgKiBlbmQgb2Ygc3VwZXJibG9jayB2ZXJzaW9uIG1hY3JvcwogICovCiAKLSNkZWZpbmUgWEZTX1NCX0RBRERSCSgoeGZzX2RhZGRyX3QpMCkJLyogZGFkZHIgaW4gZmlsZXN5c3RlbS9hZyAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfQkxPQ0spCi14ZnNfYWdibG9ja190IHhmc19zYl9ibG9jayhzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci0jZGVmaW5lCVhGU19TQl9CTE9DSyhtcCkJeGZzX3NiX2Jsb2NrKG1wKQotI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX0RBRERSCQkoKHhmc19kYWRkcl90KTApIC8qIGRhZGRyIGluIGZpbGVzeXN0ZW0vYWcgKi8KICNkZWZpbmUJWEZTX1NCX0JMT0NLKG1wKQlYRlNfSERSX0JMT0NLKG1wLCBYRlNfU0JfREFERFIpCi0jZW5kaWYKLQotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSERSX0JMT0NLKQoteGZzX2FnYmxvY2tfdCB4ZnNfaGRyX2Jsb2NrKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFkZHJfdCBkKTsKLSNkZWZpbmUJWEZTX0hEUl9CTE9DSyhtcCxkKQl4ZnNfaGRyX2Jsb2NrKG1wLGQpCi0jZWxzZQotI2RlZmluZQlYRlNfSERSX0JMT0NLKG1wLGQpCSgoeGZzX2FnYmxvY2tfdCkoWEZTX0JCX1RPX0ZTQlQobXAsZCkpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQUREUl9UT19GU0IpCi14ZnNfZnNibG9ja190IHhmc19kYWRkcl90b19mc2Ioc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kYWRkcl90IGQpOwotI2RlZmluZQlYRlNfREFERFJfVE9fRlNCKG1wLGQpCQl4ZnNfZGFkZHJfdG9fZnNiKG1wLGQpCi0jZWxzZQotI2RlZmluZQlYRlNfREFERFJfVE9fRlNCKG1wLGQpIFwKLQlYRlNfQUdCX1RPX0ZTQihtcCwgWEZTX0RBRERSX1RPX0FHTk8obXAsZCksIFhGU19EQUREUl9UT19BR0JOTyhtcCxkKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRlNCX1RPX0RBRERSKQoteGZzX2RhZGRyX3QgeGZzX2ZzYl90b19kYWRkcihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2ZzYmxvY2tfdCBmc2Jubyk7Ci0jZGVmaW5lCVhGU19GU0JfVE9fREFERFIobXAsZnNibm8pCXhmc19mc2JfdG9fZGFkZHIobXAsZnNibm8pCi0jZWxzZQotI2RlZmluZQlYRlNfRlNCX1RPX0RBRERSKG1wLGZzYm5vKSBcCi0JWEZTX0FHQl9UT19EQUREUihtcCwgWEZTX0ZTQl9UT19BR05PKG1wLGZzYm5vKSwgXAotCQkJIFhGU19GU0JfVE9fQUdCTk8obXAsZnNibm8pKQotI2VuZGlmCi0KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JVRl9UT19TQlApCi14ZnNfc2JfdCAqeGZzX2J1Zl90b19zYnAoc3RydWN0IHhmc19idWYgKmJwKTsKLSNkZWZpbmUgWEZTX0JVRl9UT19TQlAoYnApCXhmc19idWZfdG9fc2JwKGJwKQotI2Vsc2UKICNkZWZpbmUgWEZTX0JVRl9UT19TQlAoYnApCSgoeGZzX3NiX3QgKilYRlNfQlVGX1BUUihicCkpCi0jZW5kaWYKKworI2RlZmluZQlYRlNfSERSX0JMT0NLKG1wLGQpCSgoeGZzX2FnYmxvY2tfdClYRlNfQkJfVE9fRlNCVChtcCxkKSkKKyNkZWZpbmUJWEZTX0RBRERSX1RPX0ZTQihtcCxkKQlYRlNfQUdCX1RPX0ZTQihtcCwgXAorCQkJWEZTX0RBRERSX1RPX0FHTk8obXAsZCksIFhGU19EQUREUl9UT19BR0JOTyhtcCxkKSkKKyNkZWZpbmUJWEZTX0ZTQl9UT19EQUREUihtcCxmc2JubykJWEZTX0FHQl9UT19EQUREUihtcCwgXAorCQkJWEZTX0ZTQl9UT19BR05PKG1wLGZzYm5vKSwgWEZTX0ZTQl9UT19BR0JOTyhtcCxmc2JubykpCiAKIC8qCiAgKiBGaWxlIHN5c3RlbSBzZWN0b3IgdG8gYmFzaWMgYmxvY2sgY29udmVyc2lvbnMuCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmMgYi9mcy94ZnMveGZzX3RyYW5zLmMKaW5kZXggOTJlZmUyNy4uMjc5ZTA0MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwpAQCAtMSw0MCArMSwyNiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCkBAIC00MywyMSArMjksMjEgQEAKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgotI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCiAKIApAQCAtMTkwLDEyICsxNzYsOCBAQAogCVhGU19MQkNfSU5JVCgmKG50cC0+dF9idXN5KSk7CiAKIAlBU1NFUlQodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTKTsKLQotI2lmIGRlZmluZWQoWExPR19OT0xPRykgfHwgZGVmaW5lZChERUJVRykKLQlBU1NFUlQoIXhsb2dfZGVidWcgfHwgdHAtPnRfdGlja2V0ICE9IE5VTEwpOwotI2Vsc2UKIAlBU1NFUlQodHAtPnRfdGlja2V0ICE9IE5VTEwpOwotI2VuZGlmCisKIAludHAtPnRfZmxhZ3MgPSBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTIHwgKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX1JFU0VSVkUpOwogCW50cC0+dF90aWNrZXQgPSB0cC0+dF90aWNrZXQ7CiAJbnRwLT50X2Jsa19yZXMgPSB0cC0+dF9ibGtfcmVzIC0gdHAtPnRfYmxrX3Jlc191c2VkOwpAQCAtNjYxLDEwICs2NDMsMTEgQEAKICAqLwogIC8qQVJHU1VTRUQqLwogaW50Ci14ZnNfdHJhbnNfY29tbWl0KAorX3hmc190cmFuc19jb21taXQoCiAJeGZzX3RyYW5zX3QJKnRwLAogCXVpbnQJCWZsYWdzLAotCXhmc19sc25fdAkqY29tbWl0X2xzbl9wKQorCXhmc19sc25fdAkqY29tbWl0X2xzbl9wLAorCWludAkJKmxvZ19mbHVzaGVkKQogewogCXhmc19sb2dfaW92ZWNfdAkJKmxvZ192ZWN0b3I7CiAJaW50CQkJbnZlYzsKQEAgLTY3Niw5ICs2NTksNiBAQAogCWludAkJCXN5bmM7CiAjZGVmaW5lCVhGU19UUkFOU19MT0dWRUNfQ09VTlQJMTYKIAl4ZnNfbG9nX2lvdmVjX3QJCWxvZ192ZWN0b3JfZmFzdFtYRlNfVFJBTlNfTE9HVkVDX0NPVU5UXTsKLSNpZiBkZWZpbmVkKFhMT0dfTk9MT0cpIHx8IGRlZmluZWQoREVCVUcpCi0Jc3RhdGljIHhmc19sc25fdAl0cmFuc19sc24gPSAxOwotI2VuZGlmCiAJdm9pZAkJCSpjb21taXRfaWNsb2c7CiAJaW50CQkJc2h1dGRvd247CiAKQEAgLTcyOSwxMSArNzA5LDcgQEAKIAkJCSpjb21taXRfbHNuX3AgPSBjb21taXRfbHNuOwogCQlyZXR1cm4gKHNodXRkb3duKTsKIAl9Ci0jaWYgZGVmaW5lZChYTE9HX05PTE9HKSB8fCBkZWZpbmVkKERFQlVHKQotCUFTU0VSVCgheGxvZ19kZWJ1ZyB8fCB0cC0+dF90aWNrZXQgIT0gTlVMTCk7Ci0jZWxzZQogCUFTU0VSVCh0cC0+dF90aWNrZXQgIT0gTlVMTCk7Ci0jZW5kaWYKIAogCS8qCiAJICogSWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN1cGVyYmxvY2ssIHRoZW4gZG8gaXQgbm93LgpAQCAtNzUwLDE0ICs3MjYsMTAgQEAKIAkgKiBieSB1c2luZyBhIHZlY3RvciBmcm9tIHRoZSBzdGFjayB3aGVuIGl0IGZpdHMuCiAJICovCiAJbnZlYyA9IHhmc190cmFuc19jb3VudF92ZWNzKHRwKTsKLQogCWlmIChudmVjID09IDApIHsKIAkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfTE9HX0lPX0VSUk9SKTsKIAkJZ290byBzaHV0X3VzX2Rvd247Ci0JfQotCi0KLQlpZiAobnZlYyA8PSBYRlNfVFJBTlNfTE9HVkVDX0NPVU5UKSB7CisJfSBlbHNlIGlmIChudmVjIDw9IFhGU19UUkFOU19MT0dWRUNfQ09VTlQpIHsKIAkJbG9nX3ZlY3RvciA9IGxvZ192ZWN0b3JfZmFzdDsKIAl9IGVsc2UgewogCQlsb2dfdmVjdG9yID0gKHhmc19sb2dfaW92ZWNfdCAqKWttZW1fYWxsb2MobnZlYyAqCkBAIC03NzEsMzAgKzc0MywxNCBAQAogCSAqLwogCXhmc190cmFuc19maWxsX3ZlY3ModHAsIGxvZ192ZWN0b3IpOwogCi0JLyoKLQkgKiBJZ25vcmUgZXJyb3JzIGhlcmUuIHhmc19sb2dfZG9uZSB3b3VsZCBkbyB0aGUgcmlnaHQgdGhpbmcuCi0JICogV2UgbmVlZCB0byBwdXQgdGhlIHRpY2tldCwgZXRjLiBhd2F5LgotCSAqLwotCWVycm9yID0geGZzX2xvZ193cml0ZShtcCwgbG9nX3ZlY3RvciwgbnZlYywgdHAtPnRfdGlja2V0LAotCQkJICAgICAmKHRwLT50X2xzbikpOworCWVycm9yID0geGZzX2xvZ193cml0ZShtcCwgbG9nX3ZlY3RvciwgbnZlYywgdHAtPnRfdGlja2V0LCAmKHRwLT50X2xzbikpOwogCi0jaWYgZGVmaW5lZChYTE9HX05PTE9HKSB8fCBkZWZpbmVkKERFQlVHKQotCWlmICh4bG9nX2RlYnVnKSB7Ci0JCWNvbW1pdF9sc24gPSB4ZnNfbG9nX2RvbmUobXAsIHRwLT50X3RpY2tldCwKLQkJCQkJICAmY29tbWl0X2ljbG9nLCBsb2dfZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCWNvbW1pdF9sc24gPSAwOwotCQl0cC0+dF9sc24gPSB0cmFuc19sc24rKzsKLQl9Ci0jZWxzZQogCS8qCi0JICogVGhpcyBpcyB0aGUgcmVndWxhciBjYXNlLiAgQXQgdGhpcyBwb2ludCAoYWZ0ZXIgdGhlIGNhbGwgZmluaXNoZXMpLAotCSAqIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgaW5jb3JlIGFuZCBjb3VsZCBnbyBvdXQgdG8gZGlzayBhdAotCSAqIGFueSB0aW1lLiAgSG93ZXZlciwgYWxsIHRoZSBpdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uCi0JICogYXJlIHN0aWxsIGxvY2tlZCBhbmQgcGlubmVkIGluIG1lbW9yeS4KKwkgKiBUaGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIGluY29yZSBoZXJlLCBhbmQgY2FuIGdvIG91dCB0byBkaXNrCisJICogYXQgYW55IHRpbWUgYWZ0ZXIgdGhpcyBjYWxsLiAgSG93ZXZlciwgYWxsIHRoZSBpdGVtcyBhc3NvY2lhdGVkCisJICogd2l0aCB0aGUgdHJhbnNhY3Rpb24gYXJlIHN0aWxsIGxvY2tlZCBhbmQgcGlubmVkIGluIG1lbW9yeS4KIAkgKi8KIAljb21taXRfbHNuID0geGZzX2xvZ19kb25lKG1wLCB0cC0+dF90aWNrZXQsICZjb21taXRfaWNsb2csIGxvZ19mbGFncyk7Ci0jZW5kaWYKIAogCXRwLT50X2NvbW1pdF9sc24gPSBjb21taXRfbHNuOwogCWlmIChudmVjID4gWEZTX1RSQU5TX0xPR1ZFQ19DT1VOVCkgewpAQCAtODkzLDkgKzg0OSwxMSBAQAogCSAqIGxvZyBvdXQgbm93IGFuZCB3YWl0IGZvciBpdC4KIAkgKi8KIAlpZiAoc3luYykgewotCQlpZiAoIWVycm9yKQotCQkJZXJyb3IgPSB4ZnNfbG9nX2ZvcmNlKG1wLCBjb21taXRfbHNuLAotCQkJCSAgICAgIFhGU19MT0dfRk9SQ0UgfCBYRlNfTE9HX1NZTkMpOworCQlpZiAoIWVycm9yKSB7CisJCQllcnJvciA9IF94ZnNfbG9nX2ZvcmNlKG1wLCBjb21taXRfbHNuLAorCQkJCSAgICAgIFhGU19MT0dfRk9SQ0UgfCBYRlNfTE9HX1NZTkMsCisJCQkJICAgICAgbG9nX2ZsdXNoZWQpOworCQl9CiAJCVhGU19TVEFUU19JTkMoeHNfdHJhbnNfc3luYyk7CiAJfSBlbHNlIHsKIAkJWEZTX1NUQVRTX0lOQyh4c190cmFuc19hc3luYyk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmggYi9mcy94ZnMveGZzX3RyYW5zLmgKaW5kZXggYTI2M2FlYy4uYTg4OTk2MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmCV9fWEZTX1RSQU5TX0hfXwogI2RlZmluZQlfX1hGU19UUkFOU19IX18KQEAgLTEzNSwxOSArMTIxLDYgQEAKIAlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSphaWxfYmFjazsJLyogQUlMIGJhY2sgcG9pbnRlciAqLwogfSB4ZnNfYWlsX2VudHJ5X3Q7CiAKLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8geGZzX3RyYW5zX3B1c2hfYWlsKCkKLSAqIGFuZCBpcyB1c2VkIHRvIHRyYWNrIHRoZSB3aGF0IExTTiB0aGUgd2FpdGluZyBwcm9jZXNzZXMgYXJlCi0gKiB3YWl0aW5nIHRvIGJlY29tZSB1bnVzZWQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhmc19haWxfdGlja2V0IHsKLQl4ZnNfbHNuX3QJCWF0X2xzbjsJCS8qIGxzbiB3YWl0aW4gZm9yICovCi0Jc3RydWN0IHhmc19haWxfdGlja2V0CSphdF9mb3J3OwkvKiB3YWl0IGxpc3QgcHRyICovCi0Jc3RydWN0IHhmc19haWxfdGlja2V0CSphdF9iYWNrOwkvKiB3YWl0IGxpc3QgcHRyICovCi0Jc3ZfdAkJCWF0X3NlbWE7CS8qIHdhaXQgc2VtYSAqLwotfSB4ZnNfYWlsX3RpY2tldF90OwotCi0KIHR5cGVkZWYgc3RydWN0IHhmc19sb2dfaXRlbSB7CiAJeGZzX2FpbF9lbnRyeV90CQkJbGlfYWlsOwkJLyogQUlMIHBvaW50ZXJzICovCiAJeGZzX2xzbl90CQkJbGlfbHNuOwkJLyogbGFzdCBvbi1kaXNrIGxzbiAqLwpAQCAtMjQ3LDY4ICsyMjAsNjcgQEAKICAqIGxpY191bnVzZWQgdG8gdGhlIHJpZ2h0IHZhbHVlICgwIG1hdGNoZXMgYWxsIGZyZWUpLiAgVGhlCiAgKiBsaWNfZGVzY3MubGlkX2luZGV4IHZhbHVlcyBhcmUgc2V0IHVwIGFzIGVhY2ggZGVzYyBpcyBhbGxvY2F0ZWQuCiAgKi8KLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19JTklUKQotdm9pZCB4ZnNfbGljX2luaXQoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKTsKICNkZWZpbmUJWEZTX0xJQ19JTklUKGNwKQl4ZnNfbGljX2luaXQoY3ApCi0jZWxzZQotI2RlZmluZQlYRlNfTElDX0lOSVQoY3ApCSgoY3ApLT5saWNfZnJlZSA9IFhGU19MSUNfRlJFRU1BU0spCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19JTklUX1NMT1QpCi12b2lkIHhmc19saWNfaW5pdF9zbG90KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpOworc3RhdGljIGlubGluZSB2b2lkIHhmc19saWNfaW5pdCh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApCit7CisJY3AtPmxpY19mcmVlID0gWEZTX0xJQ19GUkVFTUFTSzsKK30KKwogI2RlZmluZQlYRlNfTElDX0lOSVRfU0xPVChjcCxzbG90KQl4ZnNfbGljX2luaXRfc2xvdChjcCwgc2xvdCkKLSNlbHNlCi0jZGVmaW5lCVhGU19MSUNfSU5JVF9TTE9UKGNwLHNsb3QpCVwKLQkoKGNwKS0+bGljX2Rlc2NzW3Nsb3RdLmxpZF9pbmRleCA9ICh1bnNpZ25lZCBjaGFyKShzbG90KSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX1ZBQ0FOQ1kpCi1pbnQgeGZzX2xpY192YWNhbmN5KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCk7CitzdGF0aWMgaW5saW5lIHZvaWQgeGZzX2xpY19pbml0X3Nsb3QoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCkKK3sKKwljcC0+bGljX2Rlc2NzW3Nsb3RdLmxpZF9pbmRleCA9ICh1bnNpZ25lZCBjaGFyKShzbG90KTsKK30KKwogI2RlZmluZQlYRlNfTElDX1ZBQ0FOQ1koY3ApCQl4ZnNfbGljX3ZhY2FuY3koY3ApCi0jZWxzZQotI2RlZmluZQlYRlNfTElDX1ZBQ0FOQ1koY3ApCQkoKChjcCktPmxpY19mcmVlKSAmIFhGU19MSUNfRlJFRU1BU0spCi0jZW5kaWYKLSNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19BTExfRlJFRSkKLXZvaWQgeGZzX2xpY19hbGxfZnJlZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApOworc3RhdGljIGlubGluZSBpbnQgeGZzX2xpY192YWNhbmN5KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCkKK3sKKwlyZXR1cm4gY3AtPmxpY19mcmVlICYgWEZTX0xJQ19GUkVFTUFTSzsKK30KKwogI2RlZmluZQlYRlNfTElDX0FMTF9GUkVFKGNwKQkJeGZzX2xpY19hbGxfZnJlZShjcCkKLSNlbHNlCi0jZGVmaW5lCVhGU19MSUNfQUxMX0ZSRUUoY3ApCQkoKGNwKS0+bGljX2ZyZWUgPSBYRlNfTElDX0ZSRUVNQVNLKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSUNfQVJFX0FMTF9GUkVFKQotaW50IHhmc19saWNfYXJlX2FsbF9mcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCk7CitzdGF0aWMgaW5saW5lIHZvaWQgeGZzX2xpY19hbGxfZnJlZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApCit7CisJY3AtPmxpY19mcmVlID0gWEZTX0xJQ19GUkVFTUFTSzsKK30KKwogI2RlZmluZQlYRlNfTElDX0FSRV9BTExfRlJFRShjcCkJeGZzX2xpY19hcmVfYWxsX2ZyZWUoY3ApCi0jZWxzZQotI2RlZmluZQlYRlNfTElDX0FSRV9BTExfRlJFRShjcCkJKCgoY3ApLT5saWNfZnJlZSAmIFhGU19MSUNfRlJFRU1BU0spID09XAotCQkJCQlYRlNfTElDX0ZSRUVNQVNLKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSUNfSVNGUkVFKQotaW50IHhmc19saWNfaXNmcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpOworc3RhdGljIGlubGluZSBpbnQgeGZzX2xpY19hcmVfYWxsX2ZyZWUoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKQoreworCXJldHVybiAoKGNwLT5saWNfZnJlZSAmIFhGU19MSUNfRlJFRU1BU0spID09IFhGU19MSUNfRlJFRU1BU0spOworfQorCiAjZGVmaW5lCVhGU19MSUNfSVNGUkVFKGNwLHNsb3QpCXhmc19saWNfaXNmcmVlKGNwLHNsb3QpCi0jZWxzZQotI2RlZmluZQlYRlNfTElDX0lTRlJFRShjcCxzbG90KQkoKGNwKS0+bGljX2ZyZWUgJiAoMSA8PCAoc2xvdCkpKQotI2VuZGlmCi0jaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSUNfQ0xBSU0pCi12b2lkIHhmc19saWNfY2xhaW0oeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCk7CitzdGF0aWMgaW5saW5lIGludCB4ZnNfbGljX2lzZnJlZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3AsIGludCBzbG90KQoreworCXJldHVybiAoY3AtPmxpY19mcmVlICYgKDEgPDwgc2xvdCkpOworfQorCiAjZGVmaW5lCVhGU19MSUNfQ0xBSU0oY3Asc2xvdCkJCXhmc19saWNfY2xhaW0oY3Asc2xvdCkKLSNlbHNlCi0jZGVmaW5lCVhGU19MSUNfQ0xBSU0oY3Asc2xvdCkJCSgoY3ApLT5saWNfZnJlZSAmPSB+KDEgPDwgKHNsb3QpKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX1JFTFNFKQotdm9pZCB4ZnNfbGljX3JlbHNlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpOworc3RhdGljIGlubGluZSB2b2lkIHhmc19saWNfY2xhaW0oeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCkKK3sKKwljcC0+bGljX2ZyZWUgJj0gfigxIDw8IHNsb3QpOworfQorCiAjZGVmaW5lCVhGU19MSUNfUkVMU0UoY3Asc2xvdCkJCXhmc19saWNfcmVsc2UoY3Asc2xvdCkKLSNlbHNlCi0jZGVmaW5lCVhGU19MSUNfUkVMU0UoY3Asc2xvdCkJCSgoY3ApLT5saWNfZnJlZSB8PSAxIDw8IChzbG90KSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX1NMT1QpCi14ZnNfbG9nX2l0ZW1fZGVzY190ICp4ZnNfbGljX3Nsb3QoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCk7CitzdGF0aWMgaW5saW5lIHZvaWQgeGZzX2xpY19yZWxzZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3AsIGludCBzbG90KQoreworCWNwLT5saWNfZnJlZSB8PSAxIDw8IHNsb3Q7Cit9CisKICNkZWZpbmUJWEZTX0xJQ19TTE9UKGNwLHNsb3QpCQl4ZnNfbGljX3Nsb3QoY3Asc2xvdCkKLSNlbHNlCi0jZGVmaW5lCVhGU19MSUNfU0xPVChjcCxzbG90KQkJKCYoKGNwKS0+bGljX2Rlc2NzW3Nsb3RdKSkKLSNlbmRpZgotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX0RFU0NfVE9fU0xPVCkKLWludCB4ZnNfbGljX2Rlc2NfdG9fc2xvdCh4ZnNfbG9nX2l0ZW1fZGVzY190ICpkcCk7CitzdGF0aWMgaW5saW5lIHhmc19sb2dfaXRlbV9kZXNjX3QgKgoreGZzX2xpY19zbG90KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCit7CisJcmV0dXJuICYoY3AtPmxpY19kZXNjc1tzbG90XSk7Cit9CisKICNkZWZpbmUJWEZTX0xJQ19ERVNDX1RPX1NMT1QoZHApCXhmc19saWNfZGVzY190b19zbG90KGRwKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0xJQ19ERVNDX1RPX1NMT1QoZHApCSgodWludCkoKGRwKS0+bGlkX2luZGV4KSkKLSNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgeGZzX2xpY19kZXNjX3RvX3Nsb3QoeGZzX2xvZ19pdGVtX2Rlc2NfdCAqZHApCit7CisJcmV0dXJuICh1aW50KWRwLT5saWRfaW5kZXg7Cit9CisKIC8qCiAgKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgYSBjaHVuayBnaXZlbiBhIGRlc2NyaXB0b3IgcG9pbnRlcjoKICAqIGRwIC0gZHAtPmxpZF9pbmRleCBnaXZlIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgbGljX2Rlc2NzIGFycmF5LgpAQCAtMzE2LDE1ICsyODgsMTQgQEAKICAqIEFsbCBvZiB0aGlzIHlpZWxkcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2h1bmssIHdoaWNoIGlzCiAgKiBjYXN0IHRvIGEgY2h1bmsgcG9pbnRlci4KICAqLwotI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX0RFU0NfVE9fQ0hVTkspCi14ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqeGZzX2xpY19kZXNjX3RvX2NodW5rKHhmc19sb2dfaXRlbV9kZXNjX3QgKmRwKTsKICNkZWZpbmUJWEZTX0xJQ19ERVNDX1RPX0NIVU5LKGRwKQl4ZnNfbGljX2Rlc2NfdG9fY2h1bmsoZHApCi0jZWxzZQotI2RlZmluZQlYRlNfTElDX0RFU0NfVE9fQ0hVTksoZHApCSgoeGZzX2xvZ19pdGVtX2NodW5rX3QqKSBcCi0JCQkJCSgoKHhmc19jYWRkcl90KSgoZHApIC0gKGRwKS0+bGlkX2luZGV4KSkgLVwKLQkJCQkJKHhmc19jYWRkcl90KSgoKHhmc19sb2dfaXRlbV9jaHVua190KikgXAotCQkJCQkwKS0+bGljX2Rlc2NzKSkpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgeGZzX2xvZ19pdGVtX2NodW5rX3QgKgoreGZzX2xpY19kZXNjX3RvX2NodW5rKHhmc19sb2dfaXRlbV9kZXNjX3QgKmRwKQoreworCXJldHVybiAoeGZzX2xvZ19pdGVtX2NodW5rX3QqKSBcCisJCSgoKHhmc19jYWRkcl90KSgoZHApIC0gKGRwKS0+bGlkX2luZGV4KSkgLSBcCisJCSh4ZnNfY2FkZHJfdCkoKCh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCopMCktPmxpY19kZXNjcykpOworfQogCiAjaWZkZWYgX19LRVJORUxfXwogLyoKQEAgLTM0MSw3ICszMTIsNyBAQAogI2RlZmluZSBYRlNfTEJDX05VTV9TTE9UUwkzMQogdHlwZWRlZiBzdHJ1Y3QgeGZzX2xvZ19idXN5X2NodW5rIHsKIAlzdHJ1Y3QgeGZzX2xvZ19idXN5X2NodW5rCSpsYmNfbmV4dDsKLQl1aW50CQkJCWxiY19mcmVlOwkvKiBiaXRtYXNrIG9mIGZyZWUgc2xvdHMgKi8KKwl1aW50CQkJCWxiY19mcmVlOwkvKiBmcmVlIHNsb3RzIGJpdG1hc2sgKi8KIAl1c2hvcnQJCQkJbGJjX3VudXNlZDsJLyogZmlyc3QgdW51c2VkICovCiAJeGZzX2xvZ19idXN5X3Nsb3RfdAkJbGJjX2J1c3lbWEZTX0xCQ19OVU1fU0xPVFNdOwogfSB4ZnNfbG9nX2J1c3lfY2h1bmtfdDsKQEAgLTEwMjUsNyArOTk2LDEyIEBACiAJCQkJCSBzdHJ1Y3QgeGZzX2VmZF9sb2dfaXRlbSAqLAogCQkJCQkgeGZzX2ZzYmxvY2tfdCwKIAkJCQkJIHhmc19leHRsZW5fdCk7Ci1pbnQJCXhmc190cmFuc19jb21taXQoeGZzX3RyYW5zX3QgKiwgdWludCBmbGFncywgeGZzX2xzbl90ICopOworaW50CQlfeGZzX3RyYW5zX2NvbW1pdCh4ZnNfdHJhbnNfdCAqLAorCQkJCSAgdWludCBmbGFncywKKwkJCQkgIHhmc19sc25fdCAqLAorCQkJCSAgaW50ICopOworI2RlZmluZSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBmbGFncywgbHNuKSBcCisJX3hmc190cmFuc19jb21taXQodHAsIGZsYWdzLCBsc24sIE5VTEwpCiB2b2lkCQl4ZnNfdHJhbnNfY2FuY2VsKHhmc190cmFuc190ICosIGludCk7CiB2b2lkCQl4ZnNfdHJhbnNfYWlsX2luaXQoc3RydWN0IHhmc19tb3VudCAqKTsKIHhmc19sc25fdAl4ZnNfdHJhbnNfcHVzaF9haWwoc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfbHNuX3QpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19haWwuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKaW5kZXggMmE3MWI0Zi4uMTlhYjI0YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19haWwuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCkBAIC0xLDQwICsxLDI1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMgYi9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCmluZGV4IGU3MzMyOTMuLmM3NGMzMWUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKKysrIGIvZnMveGZzL3hmc190cmFuc19idWYuYwpAQCAtMSw0NyArMSw0MiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCi0jaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfcncuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfZXh0ZnJlZS5jIGIvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMKaW5kZXggOTMyNTlhMS4uN2Q3ZDYyNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMKKysrIGIvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMKQEAgLTEsNDAgKzEsMjUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAotICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnNnaS5jb20KLSAqCi0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKLSAqCi0gKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCi0KICNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMgYi9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMKaW5kZXggN2U3NjMxYy4uZTM0MTQwOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19pbm9kZS5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfaW5vZGUuYwpAQCAtMSw0MCArMSwyNiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKQEAgLTQyLDE4ICsyOCwxOCBAQAogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAKICNpZmRlZiBYRlNfVFJBTlNfREVCVUcKIFNUQVRJQyB2b2lkCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCmluZGV4IDFiOGE3NTYuLjQ4NjE0N2UgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCkBAIC0xLDQwICsxLDI1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogCiBTVEFUSUMgaW50CXhmc190cmFuc191bmxvY2tfY2h1bmsoeGZzX2xvZ19pdGVtX2NodW5rX3QgKiwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKaW5kZXggZDRkYWU3ZC4uMTNlZGFiOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19wcml2LmgKKysrIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKQEAgLTEsMzMgKzEsMTkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAyLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfVFJBTlNfUFJJVl9IX18KICNkZWZpbmUJX19YRlNfVFJBTlNfUFJJVl9IX18KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfc3BhY2UuaCBiL2ZzL3hmcy94ZnNfdHJhbnNfc3BhY2UuaAppbmRleCBlOTFkMTczLi43ZmUzNzkyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX3NwYWNlLmgKKysrIGIvZnMveGZzL3hmc190cmFuc19zcGFjZS5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19UUkFOU19TUEFDRV9IX18KICNkZWZpbmUgX19YRlNfVFJBTlNfU1BBQ0VfSF9fCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3R5cGVzLmggYi9mcy94ZnMveGZzX3R5cGVzLmgKaW5kZXggMTZmNTM3MS4uMTA0ZjY0YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190eXBlcy5oCisrKyBiL2ZzL3hmcy94ZnNfdHlwZXMuaApAQCAtMSwzMyArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfX1hGU19UWVBFU19IX18KICNkZWZpbmUJX19YRlNfVFlQRVNfSF9fCkBAIC0xNTQsNiArMTQwLDEyIEBACiAjZGVmaW5lCU1BWEFFWFROVU0JKCh4ZnNfYWV4dG51bV90KTB4N2ZmZikJCS8qIHNpZ25lZCBzaG9ydCAqLwogCiAvKgorICogTWluIG51bWJlcnMgb2YgZGF0YS9hdHRyIGZvcmsgYnRyZWUgcm9vdCBwb2ludGVycy4KKyAqLworI2RlZmluZSBNSU5EQlRQVFJTCTMKKyNkZWZpbmUgTUlOQUJUUFRSUwkyCisKKy8qCiAgKiBNQVhOQU1FTEVOIGlzIHRoZSBsZW5ndGggKGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCkgb2YKICAqIHRoZSBsb25nZXN0IHBlcm1pc3NpYmxlIGZpbGUgKGNvbXBvbmVudCkgbmFtZS4KICAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc191dGlscy5jIGIvZnMveGZzL3hmc191dGlscy5jCmluZGV4IDExMzUxZjAuLmZlZmUxZDYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdXRpbHMuYworKysgYi9mcy94ZnMveGZzX3V0aWxzLmMKQEAgLTEsNTMgKzEsNDAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdXRpbHMuaCBiL2ZzL3hmcy94ZnNfdXRpbHMuaAppbmRleCAwMWQ5OGI0Li40NzI2NjFhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3V0aWxzLmgKKysrIGIvZnMveGZzL3hmc191dGlscy5oCkBAIC0xLDMzICsxLDE5IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpZm5kZWYgX19YRlNfVVRJTFNfSF9fCiAjZGVmaW5lIF9fWEZTX1VUSUxTX0hfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192ZnNvcHMuYyBiL2ZzL3hmcy94ZnNfdmZzb3BzLmMKaW5kZXggZjFhOTA0ZS4uN2JkYmQ5OSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192ZnNvcHMuYworKysgYi9mcy94ZnMveGZzX3Zmc29wcy5jCkBAIC0xLDc0ICsxLDU4IEBACiAvKgotICogWEZTIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucy4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCi0gKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cuc2dpLmNvbQotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotICoKLSAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KLQogI2luY2x1ZGUgInhmcy5oIgotI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19hbGxvYy5oIgogI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgotI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgotI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX3JlZmNhY2hlLmgiCiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCi0jaW5jbHVkZSAieGZzX2V4dGZyZWVfaXRlbS5oIgotI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19sb2dfcHJpdi5oIgogI2luY2x1ZGUgInhmc19kaXIyX3RyYWNlLmgiCisjaW5jbHVkZSAieGZzX2V4dGZyZWVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19hY2wuaCIKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgogI2luY2x1ZGUgInhmc19jbG50LmgiCi0jaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCiAKIFNUQVRJQyBpbnQgeGZzX3N5bmMoYmh2X2Rlc2NfdCAqLCBpbnQsIGNyZWRfdCAqKTsKIApAQCAtMjMwLDkgKzIxNCw3IEBACiAJfQogCiAJaWYgKGFwLT5sb2didWZzICE9IC0xICYmCi0jaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQogCSAgICBhcC0+bG9nYnVmcyAhPSAwICYmCi0jZW5kaWYKIAkgICAgKGFwLT5sb2didWZzIDwgWExPR19NSU5fSUNMT0dTIHx8CiAJICAgICBhcC0+bG9nYnVmcyA+IFhMT0dfTUFYX0lDTE9HUykpIHsKIAkJY21uX2VycihDRV9XQVJOLApAQCAtMjQyLDYgKzIyNCw3IEBACiAJfQogCW1wLT5tX2xvZ2J1ZnMgPSBhcC0+bG9nYnVmczsKIAlpZiAoYXAtPmxvZ2J1ZnNpemUgIT0gLTEgJiYKKwkgICAgYXAtPmxvZ2J1ZnNpemUgIT0gIDAgJiYKIAkgICAgYXAtPmxvZ2J1ZnNpemUgIT0gMTYgKiAxMDI0ICYmCiAJICAgIGFwLT5sb2didWZzaXplICE9IDMyICogMTAyNCAmJgogCSAgICBhcC0+bG9nYnVmc2l6ZSAhPSA2NCAqIDEwMjQgJiYKQEAgLTI1Nyw2ICsyNDAsMTQgQEAKIAltcC0+bV9mc25hbWVfbGVuID0gc3RybGVuKGFwLT5mc25hbWUpICsgMTsKIAltcC0+bV9mc25hbWUgPSBrbWVtX2FsbG9jKG1wLT5tX2ZzbmFtZV9sZW4sIEtNX1NMRUVQKTsKIAlzdHJjcHkobXAtPm1fZnNuYW1lLCBhcC0+ZnNuYW1lKTsKKwlpZiAoYXAtPnJ0bmFtZVswXSkgeworCQltcC0+bV9ydG5hbWUgPSBrbWVtX2FsbG9jKHN0cmxlbihhcC0+cnRuYW1lKSArIDEsIEtNX1NMRUVQKTsKKwkJc3RyY3B5KG1wLT5tX3J0bmFtZSwgYXAtPnJ0bmFtZSk7CisJfQorCWlmIChhcC0+bG9nbmFtZVswXSkgeworCQltcC0+bV9sb2duYW1lID0ga21lbV9hbGxvYyhzdHJsZW4oYXAtPmxvZ25hbWUpICsgMSwgS01fU0xFRVApOworCQlzdHJjcHkobXAtPm1fbG9nbmFtZSwgYXAtPmxvZ25hbWUpOworCX0KIAogCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfV1NZTkMpCiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9XU1lOQzsKQEAgLTI2OCwyMSArMjU5LDE2IEBACiAjZW5kaWYKIAlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX05PQVRJTUUpCiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT0FUSU1FOwotCiAJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9SRVRFUlIpCiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9SRVRFUlI7Ci0KIAlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX05PQUxJR04pCiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT0FMSUdOOwotCiAJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9TV0FMTE9DKQogCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfU1dBTExPQzsKLQogCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfT1NZTkNJU09TWU5DKQogCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfT1NZTkNJU09TWU5DOwotCiAJaWYgKGFwLT5mbGFncyAmIFhGU01OVF8zMkJJVElOT0RFUykKLQkJbXAtPm1fZmxhZ3MgfD0gKFhGU19NT1VOVF8zMkJJVElOT0RFUyB8IFhGU19NT1VOVF8zMkJJVElOT09QVCk7CisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF8zMkJJVElOT0RFUzsKIAogCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfSU9TSVpFKSB7CiAJCWlmIChhcC0+aW9zaXplbG9nID4gWEZTX01BWF9JT19MT0cgfHwKQEAgLTMwMCwxMiArMjg2LDE1IEBACiAKIAlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0lIQVNIU0laRSkKIAkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0lIQVNIU0laRTsKLQogCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfSURFTEVURSkKIAkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0lERUxFVEU7Ci0KIAlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0RJUlNZTkMpCiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9ESVJTWU5DOworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfQ09NUEFUX0FUVFIpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9DT01QQVRfQVRUUjsKKworCWlmIChhcC0+ZmxhZ3MyICYgWEZTTU5UMl9DT01QQVRfSU9TSVpFKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfQ09NUEFUX0lPU0laRTsKIAogCS8qCiAJICogbm8gcmVjb3ZlcnkgZmxhZyByZXF1aXJlcyBhIHJlYWQtb25seSBtb3VudApAQCAtMzIxLDggKzMxMCw4IEBACiAKIAlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX05PVVVJRCkKIAkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX05PVVVJRDsKLQlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX05PTE9HRkxVU0gpCi0JCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT0xPR0ZMVVNIOworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfQkFSUklFUikKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0JBUlJJRVI7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM5Myw2ICszODIsMTAgQEAKIAkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAl9CiAKKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTQVRUUjIoJm1wLT5tX3NiKSkgeworCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0NPTVBBVF9BVFRSOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC01MTIsOCArNTA1LDE0IEBACiAJCWdvdG8gZXJyb3IyOwogCiAJZXJyb3IgPSBYRlNfSU9JTklUKHZmc3AsIGFyZ3MsIGZsYWdzKTsKLQlpZiAoIWVycm9yKQotCQlyZXR1cm4gMDsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IyOworCisJaWYgKChhcmdzLT5mbGFncyAmIFhGU01OVF9CQVJSSUVSKSAmJgorCSAgICAhKFhGU19NVE9WRlMobXApLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpKQorCQl4ZnNfbW91bnRmc19jaGVja19iYXJyaWVycyhtcCk7CisJcmV0dXJuIDA7CisKIGVycm9yMjoKIAlpZiAobXAtPm1fc2JfYnApCiAJCXhmc19mcmVlc2IobXApOwpAQCAtNjU2LDE5ICs2NTUsMjQgQEAKIAllbHNlCiAJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfTk9BVElNRTsKIAotCWlmICghKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkpIHsKLQkJVkZTX1NZTkModmZzcCwgU1lOQ19GU0RBVEF8U1lOQ19CREZMVVNIfFNZTkNfQVRUUiwgTlVMTCwgZXJyb3IpOworCWlmICgodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSAmJgorCSAgICAhKCpmbGFncyAmIE1TX1JET05MWSkpIHsKKwkJdmZzcC0+dmZzX2ZsYWcgJj0gflZGU19SRE9OTFk7CisKKwkJaWYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UX0JBUlJJRVIpCisJCQl4ZnNfbW91bnRmc19jaGVja19iYXJyaWVycyhtcCk7CiAJfQogCi0JaWYgKCpmbGFncyAmIE1TX1JET05MWSkgeworCWlmICghKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkgJiYKKwkgICAgKCpmbGFncyAmIE1TX1JET05MWSkpIHsKKwkJVkZTX1NZTkModmZzcCwgU1lOQ19GU0RBVEF8U1lOQ19CREZMVVNIfFNZTkNfQVRUUiwgTlVMTCwgZXJyb3IpOworCiAJCXhmc19xdWllc2NlX2ZzKG1wKTsKIAogCQkvKiBPayBub3cgd3JpdGUgb3V0IGFuIHVubW91bnQgcmVjb3JkICovCiAJCXhmc19sb2dfdW5tb3VudF93cml0ZShtcCk7CiAJCXhmc191bm1vdW50ZnNfd3JpdGVzYihtcCk7CiAJCXZmc3AtPnZmc19mbGFnIHw9IFZGU19SRE9OTFk7Ci0JfSBlbHNlIHsKLQkJdmZzcC0+dmZzX2ZsYWcgJj0gflZGU19SRE9OTFk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC04OTIsNyArODk2LDcgQEAKICAqIG9ubHkgYXZhaWxhYmxlIGJ5IGNhbGxpbmcgdGhpcyByb3V0aW5lLgogICoKICAqLwotU1RBVElDIGludAoraW50CiB4ZnNfc3luY19pbm9kZXMoCiAJeGZzX21vdW50X3QJKm1wLAogCWludAkJZmxhZ3MsCkBAIC05NzYsNyArOTgwLDcgQEAKIAlpcG9pbnRlciA9ICh4ZnNfaXB0cl90ICopa21lbV96YWxsb2Moc2l6ZW9mKHhmc19pcHRyX3QpLCBLTV9TTEVFUCk7CiAKIAlmZmxhZyA9IFhGU19CX0FTWU5DOwkJLyogZGVmYXVsdCBpcyBkb24ndCB3YWl0ICovCi0JaWYgKGZsYWdzICYgU1lOQ19CREZMVVNIKQorCWlmIChmbGFncyAmIChTWU5DX0JERkxVU0ggfCBTWU5DX0RFTFdSSSkpCiAJCWZmbGFnID0gWEZTX0JfREVMV1JJOwogCWlmIChmbGFncyAmIFNZTkNfV0FJVCkKIAkJZmZsYWcgPSAwOwkJLyogc3luY2hyb25vdXMgb3ZlcnJpZGVzIGFsbCAqLwpAQCAtMTYyOCwxMSArMTYzMiwxNyBAQAogI2RlZmluZSBNTlRPUFRfQUxMT0NTSVpFICAgICJhbGxvY3NpemUiICAgIC8qIHByZWZlcnJlZCBhbGxvY2F0aW9uIHNpemUgKi8KICNkZWZpbmUgTU5UT1BUX0lIQVNIU0laRSAgICAiaWhhc2hzaXplIiAgICAvKiBzaXplIG9mIGlub2RlIGhhc2ggdGFibGUgKi8KICNkZWZpbmUgTU5UT1BUX05PUkVDT1ZFUlkgICAibm9yZWNvdmVyeSIgICAvKiBkb24ndCBydW4gWEZTIHJlY292ZXJ5ICovCi0jZGVmaW5lIE1OVE9QVF9OT0xPR0ZMVVNIICAgIm5vbG9nZmx1c2giICAgLyogZG9uJ3QgaGFyZCBmbHVzaCBvbiBsb2cgd3JpdGVzICovCisjZGVmaW5lIE1OVE9QVF9CQVJSSUVSCSJiYXJyaWVyIgkvKiB1c2Ugd3JpdGVyIGJhcnJpZXJzIGZvciBsb2cgd3JpdGUgYW5kCisJCQkJCSAqIHVud3JpdHRlbiBleHRlbnQgY29udmVyc2lvbiAqLwogI2RlZmluZSBNTlRPUFRfT1NZTkNJU09TWU5DICJvc3luY2lzb3N5bmMiIC8qIG9fc3luYyBpcyBSRUFMTFkgb19zeW5jICovCiAjZGVmaW5lIE1OVE9QVF82NEJJVElOT0RFICAgImlub2RlNjQiCS8qIGlub2RlcyBjYW4gYmUgYWxsb2NhdGVkIGFueXdoZXJlICovCiAjZGVmaW5lIE1OVE9QVF9JS0VFUAkiaWtlZXAiCQkvKiBkbyBub3QgZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLwogI2RlZmluZSBNTlRPUFRfTk9JS0VFUAkibm9pa2VlcCIJLyogZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLworI2RlZmluZSBNTlRPUFRfTEFSR0VJTwkgICAibGFyZ2VpbyIJLyogcmVwb3J0IGxhcmdlIEkvTyBzaXplcyBpbiBzdGF0KCkgKi8KKyNkZWZpbmUgTU5UT1BUX05PTEFSR0VJTyAgICJub2xhcmdlaW8iCS8qIGRvIG5vdCByZXBvcnQgbGFyZ2UgSS9PIHNpemVzCisJCQkJCSAqIGluIHN0YXQoKS4gKi8KKyNkZWZpbmUgTU5UT1BUX0FUVFIyCSJhdHRyMiIJCS8qIGRvIHVzZSBhdHRyMiBhdHRyaWJ1dGUgZm9ybWF0ICovCisjZGVmaW5lIE1OVE9QVF9OT0FUVFIyCSJub2F0dHIyIgkvKiBkbyBub3QgdXNlIGF0dHIyIGF0dHJpYnV0ZSBmb3JtYXQgKi8KIAogU1RBVElDIHVuc2lnbmVkIGxvbmcKIHN1ZmZpeF9zdHJ0b3VsKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCkBAIC0xNjY5LDEyICsxNjc5LDE1IEBACiAJaW50CQkJZHN1bml0LCBkc3dpZHRoLCB2b2xfZHN1bml0LCB2b2xfZHN3aWR0aDsKIAlpbnQJCQlpb3NpemU7CiAKKwlhcmdzLT5mbGFnczIgfD0gWEZTTU5UMl9DT01QQVRfSU9TSVpFOworCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9DT01QQVRfQVRUUjsKKwogI2lmIDAJLyogWFhYOiBvZmYgYnkgZGVmYXVsdCwgdW50aWwgc29tZSByZW1haW5pbmcgaXNzdWVzIGlyb25lZCBvdXQgKi8KIAlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSURFTEVURTsgLyogZGVmYXVsdCB0byBvbiAqLwogI2VuZGlmCiAKIAlpZiAoIW9wdGlvbnMpCi0JCXJldHVybiAwOworCQlnb3RvIGRvbmU7CiAKIAlpb3NpemUgPSBkc3VuaXQgPSBkc3dpZHRoID0gdm9sX2RzdW5pdCA9IHZvbF9kc3dpZHRoID0gMDsKIApAQCAtMTc5MSwxMiArMTgwNCwyMCBAQAogI2VuZGlmCiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT1VVSUQpKSB7CiAJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfTk9VVUlEOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9MT0dGTFVTSCkpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9OT0xPR0ZMVVNIOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfQkFSUklFUikpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9CQVJSSUVSOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfSUtFRVApKSB7CiAJCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0lERUxFVEU7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0lLRUVQKSkgewogCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lERUxFVEU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9MQVJHRUlPKSkgeworCQkJYXJncy0+ZmxhZ3MyICY9IH5YRlNNTlQyX0NPTVBBVF9JT1NJWkU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0xBUkdFSU8pKSB7CisJCQlhcmdzLT5mbGFnczIgfD0gWEZTTU5UMl9DT01QQVRfSU9TSVpFOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfQVRUUjIpKSB7CisJCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0NPTVBBVF9BVFRSOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9BVFRSMikpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9DT01QQVRfQVRUUjsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgIm9zeW5jaXNkc3luYyIpKSB7CiAJCQkvKiBuby1vcCwgdGhpcyBpcyBub3cgdGhlIGRlZmF1bHQgKi8KIHByaW50aygiWEZTOiBvc3luY2lzZHN5bmMgaXMgbm93IHRoZSBkZWZhdWx0LCBvcHRpb24gaXMgZGVwcmVjYXRlZC5cbiIpOwpAQCAtMTg0Niw2ICsxODY3LDExIEBACiAJCWFyZ3MtPnN1bml0ID0gYXJncy0+c3dpZHRoID0gMDsKIAl9CiAKK2RvbmU6CisJaWYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UXzMyQklUSU5PREVTKQorCQl2ZnNwLT52ZnNfZmxhZyB8PSBWRlNfMzJCSVRJTk9ERVM7CisJaWYgKGFyZ3MtPmZsYWdzMikKKwkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0ZMQUdTMjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg2Niw3ICsxODkyLDcgQEAKIAkJeyBYRlNfTU9VTlRfTk9VVUlELAkJIiwiIE1OVE9QVF9OT1VVSUQgfSwKIAkJeyBYRlNfTU9VTlRfTk9SRUNPVkVSWSwJCSIsIiBNTlRPUFRfTk9SRUNPVkVSWSB9LAogCQl7IFhGU19NT1VOVF9PU1lOQ0lTT1NZTkMsCSIsIiBNTlRPUFRfT1NZTkNJU09TWU5DIH0sCi0JCXsgWEZTX01PVU5UX05PTE9HRkxVU0gsCQkiLCIgTU5UT1BUX05PTE9HRkxVU0ggfSwKKwkJeyBYRlNfTU9VTlRfQkFSUklFUiwJCSIsIiBNTlRPUFRfQkFSUklFUiB9LAogCQl7IFhGU19NT1VOVF9JREVMRVRFLAkJIiwiIE1OVE9QVF9OT0lLRUVQIH0sCiAJCXsgMCwgTlVMTCB9CiAJfTsKQEAgLTE4ODMsMjEgKzE5MDksMjAgQEAKIAkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0lIQVNIU0laRSAiPSVkIiwgbXAtPm1faWhzaXplKTsKIAogCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkKLQkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0FMTE9DU0laRSAiPSVkIiwgMTw8bXAtPm1fd3JpdGVpb19sb2cpOworCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfQUxMT0NTSVpFICI9JWRrIiwKKwkJCQkoaW50KSgxIDw8IG1wLT5tX3dyaXRlaW9fbG9nKSA+PiAxMCk7CiAKIAlpZiAobXAtPm1fbG9nYnVmcyA+IDApCiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MT0dCVUZTICI9JWQiLCBtcC0+bV9sb2didWZzKTsKIAogCWlmIChtcC0+bV9sb2dic2l6ZSA+IDApCi0JCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MT0dCU0laRSAiPSVkIiwgbXAtPm1fbG9nYnNpemUpOworCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfTE9HQlNJWkUgIj0lZGsiLCBtcC0+bV9sb2dic2l6ZSA+PiAxMCk7CiAKLQlpZiAobXAtPm1fZGRldl90YXJncCAhPSBtcC0+bV9sb2dkZXZfdGFyZ3ApCi0JCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MT0dERVYgIj0lcyIsCi0JCQkJWEZTX0JVRlRBUkdfTkFNRShtcC0+bV9sb2dkZXZfdGFyZ3ApKTsKKwlpZiAobXAtPm1fbG9nbmFtZSkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0xPR0RFViAiPSVzIiwgbXAtPm1fbG9nbmFtZSk7CiAKLQlpZiAobXAtPm1fcnRkZXZfdGFyZ3AgJiYgbXAtPm1fZGRldl90YXJncCAhPSBtcC0+bV9ydGRldl90YXJncCkKLQkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX1JUREVWICI9JXMiLAotCQkJCVhGU19CVUZUQVJHX05BTUUobXAtPm1fcnRkZXZfdGFyZ3ApKTsKKwlpZiAobXAtPm1fcnRuYW1lKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfUlRERVYgIj0lcyIsIG1wLT5tX3J0bmFtZSk7CiAKIAlpZiAobXAtPm1fZGFsaWduID4gMCkKIAkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX1NVTklUICI9JWQiLApAQCAtMTkwNyw3ICsxOTMyLDEzIEBACiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9TV0lEVEggIj0lZCIsCiAJCQkJKGludClYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zd2lkdGgpKTsKIAotCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UXzMyQklUSU5PT1BUKSkKKwlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikpCisJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9BVFRSMik7CisKKwlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfSU9TSVpFKSkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0xBUkdFSU8pOworCisJaWYgKCEodmZzcC0+dmZzX2ZsYWcgJiBWRlNfMzJCSVRJTk9ERVMpKQogCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfNjRCSVRJTk9ERSk7CiAKIAlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfR1JQSUQpCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKaW5kZXggNThiZmU2Mi4uN2MxZjc0NSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpAQCAtMSw0MCArMSwyNiBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKLSAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAotICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgotICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAotICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6Ci0gKgotICogaHR0cDovL3d3dy5zZ2kuY29tCi0gKgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6Ci0gKgotICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwotCiAjaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgpAQCAtNDIsMzMgKzI4LDMyIEBACiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCi0jaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19hdHRyLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCi0jaW5jbHVkZSAieGZzX3JlZmNhY2hlLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgotI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfcmVmY2FjaGUuaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKLSNpbmNsdWRlICJ4ZnNfbWFjLmgiCiAjaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgogCiAKIC8qCkBAIC0xODEsNDAgKzE2Niw3IEBACiAJCXZhcC0+dmFfcmRldiA9IDA7CiAKIAkJaWYgKCEoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpKSB7Ci0KLSNpZiAwCi0JCQkvKiBMYXJnZSBibG9jayBzaXplcyBjb25mdXNlIHZhcmlvdXMKLQkJCSAqIHVzZXIgc3BhY2UgcHJvZ3JhbXMsIHNvIGxldHRpbmcgdGhlCi0JCQkgKiBzdHJpcGUgc2l6ZSB0aHJvdWdoIGlzIG5vdCBhIGdvb2QKLQkJCSAqIGlkZWEgZm9yIG5vdy4KLQkJCSAqLwotCQkJdmFwLT52YV9ibG9ja3NpemUgPSBtcC0+bV9zd2lkdGggPwotCQkJCS8qCi0JCQkJICogSWYgdGhlIHVuZGVybHlpbmcgdm9sdW1lIGlzIGEgc3RyaXBlLCB0aGVuCi0JCQkJICogcmV0dXJuIHRoZSBzdHJpcGUgd2lkdGggaW4gYnl0ZXMgYXMgdGhlCi0JCQkJICogcmVjb21tZW5kZWQgSS9PIHNpemUuCi0JCQkJICovCi0JCQkJKG1wLT5tX3N3aWR0aCA8PCBtcC0+bV9zYi5zYl9ibG9ja2xvZykgOgotCQkJCS8qCi0JCQkJICogUmV0dXJuIHRoZSBsYXJnZXN0IG9mIHRoZSBwcmVmZXJyZWQgYnVmZmVyCi0JCQkJICogc2l6ZXMgc2luY2UgZG9pbmcgc21hbGwgSS9PcyBpbnRvIGxhcmdlcgotCQkJCSAqIGJ1ZmZlcnMgY2F1c2VzIGJ1ZmZlcnMgdG8gYmUgZGVjb21taXNzaW9uZWQuCi0JCQkJICogVGhlIHZhbHVlIHJldHVybmVkIGlzIGluIGJ5dGVzLgotCQkJCSAqLwotCQkJCSgxIDw8IChpbnQpTUFYKG1wLT5tX3JlYWRpb19sb2csCi0JCQkJCSAgICAgICBtcC0+bV93cml0ZWlvX2xvZykpOwotCi0jZWxzZQotCQkJdmFwLT52YV9ibG9ja3NpemUgPQotCQkJCS8qCi0JCQkJICogUmV0dXJuIHRoZSBsYXJnZXN0IG9mIHRoZSBwcmVmZXJyZWQgYnVmZmVyCi0JCQkJICogc2l6ZXMgc2luY2UgZG9pbmcgc21hbGwgSS9PcyBpbnRvIGxhcmdlcgotCQkJCSAqIGJ1ZmZlcnMgY2F1c2VzIGJ1ZmZlcnMgdG8gYmUgZGVjb21taXNzaW9uZWQuCi0JCQkJICogVGhlIHZhbHVlIHJldHVybmVkIGlzIGluIGJ5dGVzLgotCQkJCSAqLwotCQkJCTEgPDwgKGludClNQVgobXAtPm1fcmVhZGlvX2xvZywKLQkJCQkJICAgICAgIG1wLT5tX3dyaXRlaW9fbG9nKTsKLSNlbmRpZgorCQkJdmFwLT52YV9ibG9ja3NpemUgPSB4ZnNfcHJlZmVycmVkX2lvc2l6ZShtcCk7CiAJCX0gZWxzZSB7CiAKIAkJCS8qCkBAIC01ODEsOCArNTMzLDcgQEAKIAkJLyoKIAkJICogQ2FuJ3QgY2hhbmdlIGV4dGVudCBzaXplIGlmIGFueSBleHRlbnRzIGFyZSBhbGxvY2F0ZWQuCiAJCSAqLwotCQlpZiAoKGlwLT5pX2QuZGlfbmV4dGVudHMgfHwgaXAtPmlfZGVsYXllZF9ibGtzKSAmJgotCQkgICAgKG1hc2sgJiBYRlNfQVRfRVhUU0laRSkgJiYKKwkJaWYgKGlwLT5pX2QuZGlfbmV4dGVudHMgJiYgKG1hc2sgJiBYRlNfQVRfRVhUU0laRSkgJiYKIAkJICAgICgoaXAtPmlfZC5kaV9leHRzaXplIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nKSAhPQogCQkgICAgIHZhcC0+dmFfZXh0c2l6ZSkgKSB7CiAJCQljb2RlID0gWEZTX0VSUk9SKEVJTlZBTCk7CS8qIEVGQklHPyAqLwpAQCAtNjEwLDcgKzU2MSw4IEBACiAJCS8qCiAJCSAqIENhbid0IGNoYW5nZSByZWFsdGltZSBmbGFnIGlmIGFueSBleHRlbnRzIGFyZSBhbGxvY2F0ZWQuCiAJCSAqLwotCQlpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyAmJiAobWFzayAmIFhGU19BVF9YRkxBR1MpICYmCisJCWlmICgoaXAtPmlfZC5kaV9uZXh0ZW50cyB8fCBpcC0+aV9kZWxheWVkX2Jsa3MpICYmCisJCSAgICAobWFzayAmIFhGU19BVF9YRkxBR1MpICYmCiAJCSAgICAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpICE9CiAJCSAgICAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfUkVBTFRJTUUpKSB7CiAJCQljb2RlID0gWEZTX0VSUk9SKEVJTlZBTCk7CS8qIEVGQklHPyAqLwpAQCAtNjc0LDggKzYyNiwxMCBAQAogCSAqLwogCWlmIChtYXNrICYgWEZTX0FUX1NJWkUpIHsKIAkJY29kZSA9IDA7Ci0JCWlmICh2YXAtPnZhX3NpemUgPiBpcC0+aV9kLmRpX3NpemUpCisJCWlmICgodmFwLT52YV9zaXplID4gaXAtPmlfZC5kaV9zaXplKSAmJiAKKwkJICAgIChmbGFncyAmIEFUVFJfTk9TSVpFVE9LKSA9PSAwKSB7CiAJCQljb2RlID0geGZzX2lncm93X3N0YXJ0KGlwLCB2YXAtPnZhX3NpemUsIGNyZWRwKTsKKwkJfQogCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCQlpZiAoIWNvZGUpCiAJCQljb2RlID0geGZzX2l0cnVuY2F0ZV9kYXRhKGlwLCB2YXAtPnZhX3NpemUpOwpAQCAtMTExOCw2ICsxMDcyLDcgQEAKIAl4ZnNfaW5vZGVfdAkqaXA7CiAJeGZzX3RyYW5zX3QJKnRwOwogCWludAkJZXJyb3I7CisJaW50CQlsb2dfZmx1c2hlZCA9IDAsIGNoYW5nZWQgPSAxOwogCiAJdm5fdHJhY2VfZW50cnkoQkhWX1RPX1ZOT0RFKGJkcCksCiAJCQlfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKQEAgLTExNzEsMTAgKzExMjYsMTggQEAKIAkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCiAJCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkgewotCQkJeGZzX2xvZ19mb3JjZShpcC0+aV9tb3VudCwgKHhmc19sc25fdCkwLAorCQkJX3hmc19sb2dfZm9yY2UoaXAtPmlfbW91bnQsICh4ZnNfbHNuX3QpMCwKIAkJCQkgICAgICBYRlNfTE9HX0ZPUkNFIHwKIAkJCQkgICAgICAoKGZsYWcgJiBGU1lOQ19XQUlUKQotCQkJCSAgICAgICA/IFhGU19MT0dfU1lOQyA6IDApKTsKKwkJCQkgICAgICAgPyBYRlNfTE9HX1NZTkMgOiAwKSwKKwkJCQkgICAgICAmbG9nX2ZsdXNoZWQpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIHRoZSBpbm9kZSBpcyBub3QgcGlubmVkIGFuZCBub3RoaW5nCisJCQkgKiBoYXMgY2hhbmdlZCB3ZSBkb24ndCBuZWVkIHRvIGZsdXNoIHRoZQorCQkJICogY2FjaGUuCisJCQkgKi8KKwkJCWNoYW5nZWQgPSAwOwogCQl9CiAJCWVycm9yID0gMDsKIAl9IGVsc2UJewpAQCAtMTIxMCwxMCArMTE3MywyNyBAQAogCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJCWlmIChmbGFnICYgRlNZTkNfV0FJVCkKIAkJCXhmc190cmFuc19zZXRfc3luYyh0cCk7Ci0JCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisJCWVycm9yID0gX3hmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwsICZsb2dfZmx1c2hlZCk7CiAKIAkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAl9CisKKwlpZiAoKGlwLT5pX21vdW50LT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpICYmIGNoYW5nZWQpIHsKKwkJLyoKKwkJICogSWYgdGhlIGxvZyB3cml0ZSBkaWRuJ3QgaXNzdWUgYW4gb3JkZXJlZCB0YWcgd2UgbmVlZAorCQkgKiB0byBmbHVzaCB0aGUgZGlzayBjYWNoZSBmb3IgdGhlIGRhdGEgZGV2aWNlIG5vdy4KKwkJICovCisJCWlmICghbG9nX2ZsdXNoZWQpCisJCQl4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKGlwLT5pX21vdW50LT5tX2RkZXZfdGFyZ3ApOworCisJCS8qCisJCSAqIElmIHRoaXMgaW5vZGUgaXMgb24gdGhlIFJUIGRldiB3ZSBuZWVkIHRvIGZsdXNoIHRoYXQKKwkJICogY2FjaGUgYXN3ZWxsLgorCQkgKi8KKwkJaWYgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKQorCQkJeGZzX2Jsa2Rldl9pc3N1ZV9mbHVzaChpcC0+aV9tb3VudC0+bV9ydGRldl90YXJncCk7CisJfQorCiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9oYXJkd2FyZS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2xwczcxMXgvaGFyZHdhcmUuaAppbmRleCBmODY0YzM2Li4xMzg2ODcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9oYXJkd2FyZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNscHM3MTF4L2hhcmR3YXJlLmgKQEAgLTIzNSwxMjEgKzIzNSw0IEBACiAjZGVmaW5lIENFSVZBX1BCMF9CTEtfQlROCSgxPDwwKQogI2VuZGlmIC8vICNpZiBkZWZpbmVkIChDT05GSUdfQVJDSF9DRUlWQSkKIAotI2lmIGRlZmluZWQgKENPTkZJR19NQUNIX01QMTAwMCkKLS8qIE5PUiBGTEFTSCAqLwotI2RlZmluZSBNUDEwMDBfTklPX0JBU0UJCTB4ZjkwMDAwMDAJLyogdmlydHVhbCAqLwotI2RlZmluZSBNUDEwMDBfTklPX1NUQVJUCUNTMF9QSFlTX0JBU0UJLyogcGh5c2ljYWwgKi8KLSNkZWZpbmUgTVAxMDAwX05JT19TSVpFCQkweDAwNDAwMDAwCi0KLS8qIERTUCBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgTVAxMDAwX0RTUF9CQVNFCQkweGZhMDAwMDAwCS8qIHZpcnR1YWwgKi8KLSNkZWZpbmUgTVAxMDAwX0RTUF9TVEFSVAlDUzFfUEhZU19CQVNFCS8qIHBoeXNpY2FsICovCi0jZGVmaW5lIE1QMTAwMF9EU1BfU0laRQkJMHgwMDEwMDAwMAotCi0vKiBMQ0QsIERBQS9EU1AsIFJUQywgREFBIFJXIFJlZyBhbGwgaW4gQ1MyICovCi0jZGVmaW5lIE1QMTAwMF9MSU9fQkFTRQkJMHhmYjAwMDAwMAkvKiB2aXJ0dWFsICovCi0jZGVmaW5lIE1QMTAwMF9MSU9fU1RBUlQJQ1MyX1BIWVNfQkFTRQkvKiBwaHlzaWNhbCAqLwotI2RlZmluZSBNUDEwMDBfTElPX1NJWkUJCTB4MDAxMDAwMDAKLQotLyogTkFORCBGTEFTSCAqLwotI2RlZmluZSBNUDEwMDBfRklPX0JBU0UJCTB4ZmMwMDAwMDAJLyogdmlydHVhbCAqLwotI2RlZmluZSBNUDEwMDBfRklPX1NUQVJUCUNTM19QSFlTX0JBU0UJLyogcGh5c2ljYWwgKi8KLSNkZWZpbmUgTVAxMDAwX0ZJT19TSVpFCQkweDAwODAwMDAwCi0KLS8qIEV0aGVybmV0ICovCi0jZGVmaW5lIE1QMTAwMF9FSU9fQkFTRQkJMHhmZDAwMDAwMAkvKiB2aXJ0dWFsIAkqLwotI2RlZmluZSBNUDEwMDBfRUlPX1NUQVJUCUNTNF9QSFlTX0JBU0UJLyogcGh5c2ljYWwgCSovCi0jZGVmaW5lIE1QMTAwMF9FSU9fU0laRQkJMHgwMDEwMDAwMAotCi0jZGVmaW5lCU1QMTAwMF9MQ0RfT0ZGU0VUCTB4MDAwMDAwMDAJLyogTENEIG9mZnNldCBpbiBDUzIgKi8KLSNkZWZpbmUJTVAxMDAwX0RERF9PRkZTRVQJMHgwMDAwMTAwMAkvKiBEQUEvREFJL0RTUCBzZnQgcmVzZXQgb2Zmc3QqLwotI2RlZmluZQlNUDEwMDBfUlRDX09GRlNFVAkweDAwMDAyMDAwCS8qIFJUQyBvZmZzZXQgaW4gQ1MyICovCi0jZGVmaW5lCU1QMTAwMF9EQUFfT0ZGU0VUCTB4MDAwMDMwMDAJLyogREFBIFJXIHJlZyBvZmZzZXQgaW4gQ1MyICovCi0KLS8qIElERSAqLwotI2RlZmluZSBNUDEwMDBfSURFX0JBU0UJCTB4ZmUwMDAwMDAgICAgICAvKiB2aXJ0dWFsICovCi0jZGVmaW5lIE1QMTAwMF9JREVfU1RBUlQJQ1M1X1BIWVNfQkFTRSAgICAgIC8qIHBoeXNpY2FsICovCi0jZGVmaW5lIE1QMTAwMF9JREVfU0laRQkJMHgwMDEwMDAwMCAgICAgIC8qIGFjdHVhbGx5IGl0J3Mgb25seSAweDEwMDAgKi8KLQotI2RlZmluZSBJUlFfSEFSRERJU0sgSVJRX0VJTlQyCi0KLS8qCi0gKiBJREUgcmVnaXN0ZXJzIGRlZmluaXRpb24KLSAqLwotCi0jZGVmaW5lIElERV9DT05UUk9MX0JBU0UJCShNUDEwMDBfSURFX0JBU0UgKyAweDEwMDApCi0jZGVmaW5lIElERV9CQVNFX09GRgkJCShNUDEwMDBfSURFX0JBU0UpCi0KLSNkZWZpbmUgSURFX1dSSVRFX0RFVklDRV9EQVRBCQkoSURFX0JBU0VfT0ZGICsgMHgwKQotI2RlZmluZSBJREVfRkVBVFVSRVNfUkVHSVNURVIJCShJREVfQkFTRV9PRkYgKyAweDIpCi0jZGVmaW5lIElERV9TRUNUT1JfQ09VTlRfUkVHSVNURVIJKElERV9CQVNFX09GRiArIDB4NCkKLSNkZWZpbmUgSURFX1NFQ1RPUl9OVU1CRVJfUkVHSVNURVIJKElERV9CQVNFX09GRiArIDB4NikKLSNkZWZpbmUgSURFX0NZTElOREVSX0xPV19SRUdJU1RFUgkoSURFX0JBU0VfT0ZGICsgMHg4KQotI2RlZmluZSBJREVfQ1lMSU5ERVJfSElHSF9SRUdJU1RFUgkoSURFX0JBU0VfT0ZGICsgMHhhKQotI2RlZmluZSBJREVfREVWSUNFX0hFQURfUkVHSVNURVIJKElERV9CQVNFX09GRiArIDB4YykKLSNkZWZpbmUgSURFX0NPTU1BTkRfREFUQV9SRUdJU1RFUgkoSURFX0JBU0VfT0ZGICsgMHhlKQotI2RlZmluZSBJREVfREVWSUNFX0NPTlRST0xfUkVHSVNURVIJKElERV9DT05UUk9MX0JBU0UgKyAweGMpCi0KLSNkZWZpbmUgSURFX0lSUSAgICAgICAgICAgICAgICAgICAgICBJUlFfRUlOVDIKLQotCi0jZGVmaW5lIFJUQ19QT1JUKHgpCShNUDEwMDBfTElPX0JBU0UrMHgyMDAwICsgKHgqMikpCi0jZGVmaW5lIFJUQ19BTFdBWVNfQkNECTAKLQotLyoKLS8vIERlZmluaXRpb25zIG9mIHRoZSBiaXQgZmllbGRzIGluIHRoZSBId1BvcnRBIHJlZ2lzdGVyIGZvciB0aGUKLS8vIE1QMTAwMCBib2FyZC4KLSovCi0jZGVmaW5lIEh3UG9ydEFLZXlib2FyZFJvdzEgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEh3UG9ydEFLZXlib2FyZFJvdzIgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEh3UG9ydEFLZXlib2FyZFJvdzMgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEh3UG9ydEFLZXlib2FyZFJvdzQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEh3UG9ydEFLZXlib2FyZFJvdzUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEh3UG9ydEFLZXlib2FyZFJvdzYgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEh3UG9ydEFMQ0RFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEh3UG9ydEFPZmZob29rCSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyoKLS8vIERlZmluaXRpb25zIG9mIHRoZSBiaXQgZmllbGRzIGluIHRoZSBId1BvcnRCIHJlZ2lzdGVyIGZvciB0aGUKLS8vIE1QMTAwMCBib2FyZC4KLSovCi0jZGVmaW5lIEh3UG9ydEJMM01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEh3UG9ydEJMM0NsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEh3UG9ydEJTQ2xrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEh3UG9ydEJTRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEh3UG9ydEJMM0RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEh3UG9ydEJNdXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEh3UG9ydEJRRDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEh3UG9ydEJRRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEh3UG9ydEJRRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEh3UG9ydEJRRDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0KLS8qCi0vLyBEZWZpbml0aW9ucyBvZiB0aGUgYml0IGZpZWxkcyBpbiB0aGUgSHdQb3J0RCByZWdpc3RlciBmb3IgdGhlCi0vLyBNUDEwMDAgYm9hcmQuCi0qLwotI2RlZmluZSBId1BvcnRETEVEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBId1BvcnRETEVEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBId1BvcnRETEVEMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBId1BvcnRETEVENCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBId1BvcnRETEVENSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBId1BvcnRERUVDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBId1BvcnRCUlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBId1BvcnRCUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0KLS8qCi0vLyBEZWZpbml0aW9ucyBvZiB0aGUgYml0IGZpZWxkcyBpbiB0aGUgSHdQb3J0RSByZWdpc3RlciBmb3IgdGhlCi0vLyBNUDEwMDAgYm9hcmQuCi0qLwotCi0jZGVmaW5lIEh3UG9ydEVDTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEh3UG9ydEVTZXByb21ET3V0ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEh3UG9ydEVBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEh3UG9ydEVTZXByb21ESW4gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEh3UG9ydEVOQU5EQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEh3UG9ydEVTZXByb21DTEsgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0KLSNlbmRpZiAvLyAjaWYgZGVmaW5lZCAoQ09ORklHX01BQ0hfTVAxMDAwKQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNscHM3MTF4L21wMTAwMC1zZXByb20uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNscHM3MTF4L21wMTAwMC1zZXByb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1NTY2Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9tcDEwMDAtc2Vwcm9tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jaWZuZGVmIE1QMTAwMF9TRVBST01fSAotI2RlZmluZSBNUDEwMDBfU0VQUk9NX0gKLQotLyoKLSAqIG1wMTAwMC1zZXByb20uaAotICoKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBTZXJpYWwgRUVQUk9NIGRlZmluaXRpb25zIGZvciB0aGUgTVAxMDAwIGJvYXJkCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNSBDb21kaWFsIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICoKLSAqLwotCi0jZGVmaW5lIENPTU1BTkRfRVJBU0UJCSgweDFDMCkKLSNkZWZpbmUgQ09NTUFORF9FUkFTRV9BTEwJKDB4MTIwKQotI2RlZmluZSBDT01NQU5EX1dSSVRFX0RJU0FCTEUJKDB4MTAwKQotI2RlZmluZSBDT01NQU5EX1dSSVRFX0VOQUJMRQkoMHgxMzApCi0jZGVmaW5lIENPTU1BTkRfUkVBRAkJKDB4MTgwKQotI2RlZmluZSBDT01NQU5EX1dSSVRFCQkoMHgxNDApCi0jZGVmaW5lIENPTU1BTkRfV1JJVEVfQUxMCSgweDExMCkKLQotLy8KLS8vIFNlcmlhbCBFRVBST00gZGF0YSBmb3JtYXQKLS8vCi0KLSNkZWZpbmUgUEFDS0VEIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQotCi10eXBlZGVmIHN0cnVjdCBfRUVQUk9NIHsKLQl1bmlvbiB7Ci0JCXVuc2lnbmVkIGNoYXIgZXByb21fYnl0ZV9kYXRhWzEyOF07Ci0JCXVuc2lnbmVkIHNob3J0IGVwcm9tX3Nob3J0X2RhdGFbNjRdOwotCQlzdHJ1Y3QgewotCQkJdW5zaWduZWQgY2hhciB2ZXJzaW9uIFBBQ0tFRDsJLy8gRUVQUk9NIFZlcnNpb24gIjEiIGZvciBub3cKLQkJCXVuc2lnbmVkIGNoYXIgYm94X2lkIFBBQ0tFRDsgCS8vIEJveCBJRCAoU3RhbmRhbG9uZSwgU09ITywgZW1iZWRkZWQsIGV0YykKLQkJCXVuc2lnbmVkIGNoYXIgbWFqb3JfaHdfdmVyc2lvbiBQQUNLRUQ7CS8vIE1ham9yIEhhcmR3YXJlIHZlcnNpb24gKEhleCkKLQkJCXVuc2lnbmVkIGNoYXIgbWlub3JfaHdfdmVyc2lvbiBQQUNLRUQ7CS8vIE1pbm9yIEhhcmR3YXJlIFZlcnNpb24gKEhleCkKLQkJCXVuc2lnbmVkIGNoYXIgbWZnX2lkWzNdIFBBQ0tFRDsJLy8gTWFudWZhY3R1cmVyIElEICgzIGNoYXJhY3RlciBBbHBoYWJldGljKQotCQkJdW5zaWduZWQgY2hhciBtZmdfc2VyaWFsX251bWJlclsxMF0gUEFDS0VEOwkvLyBNYW51ZmFjdHVyZXIgU2VyaWFsIG51bWJlcgotCQkJdW5zaWduZWQgY2hhciBtZmdfZGF0ZVszXSBQQUNLRUQ7CS8vIERhdGUgb2YgTWZnIChGb3JtYXR0ZWQgWVk6TU06REQpCi0JCQl1bnNpZ25lZCBjaGFyIGNvdW50cnkgUEFDS0VEOwkvLyBDb3VudHJ5IG9mIGRlcGxveW1lbnQKLQkJCXVuc2lnbmVkIGNoYXIgbWFjX0FkZHJlc3NbNl0gUEFDS0VEOwkvLyBNQUMgQWRkcmVzcwotCQkJdW5zaWduZWQgY2hhciBvZW1fc3RyaW5nWzIwXSBQQUNLRUQ7CS8vIE9FTSBJRCBzdHJpbmcKLQkJCXVuc2lnbmVkIHNob3J0IGZlYXR1cmVfYml0czEgUEFDS0VEOwkvLyBGZWF0dXJlIEJpdHMgMQotCQkJdW5zaWduZWQgc2hvcnQgZmVhdHVyZV9iaXRzMiBQQUNLRUQ7CS8vIEZlYXR1cmUgQml0cyAyCi0JCQl1bnNpZ25lZCBjaGFyIGZpbGxlcls3NV0gUEFDS0VEOwkJLy8gVW51c2VkL1VuZGVmaW5lZAmTMJQgaW5pdGlhbGl6ZWQKLQkJCXVuc2lnbmVkIHNob3J0IGNoZWNrc3VtIFBBQ0tFRDsJCS8vIGJ5dGUgYWNjdW11bGF0ZWQgc2hvcnQgY2hlY2tzdW0KLQkJfSBlcHJvbV9zdHJ1Y3Q7Ci0JfSB2YXJpYW50OwotfSAgZWVwcm9tX3N0cnVjdDsKLQotLyogVGhlc2Ugc2V0dGluZ3MgbXVzdCBiZSBtdXR1YWxseSBleGNsdXNpdmUgKi8KLSNkZWZpbmUJRkVBVFVSRV9CSVRTMV9EUkFNU0laRV8xNk1FRwkweDAwMDEgIC8qIDAgc2lnbmlmaWVzIDQgTUVHIHN5c3RlbSAqLwotI2RlZmluZQlGRUFUVVJFX0JJVFMxX0RSQU1TSVpFXzhNRUcJMHgwMDAyICAvKiAxIGluIGJpdCAxID0gOE1FRyBzeXN0ZW0gKi8KLSNkZWZpbmUJRkVBVFVSRV9CSVRTMV9EUkFNU0laRV82NE1FRwkweDAwMDQgIC8qIDEgaW4gYml0IDIgPSA2NE1FRyBzeXN0ZW0gKi8KLQotI2RlZmluZSBGRUFUVVJFX0JJVFMxX0NQVUlTOTBNRUcgICAgIDB4MDAxMAotCi1leHRlcm4gdm9pZCBzZXByb21faW5pdCh2b2lkKTsKLWV4dGVybiBlZXByb21fc3RydWN0KiBnZXRfc2Vwcm9tX3B0cih2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyKiBnZXRfZWVwcm9tX21hY19hZGRyZXNzKHZvaWQpOwotCi0jZW5kaWYgLyogTVAxMDAwX1NFUFJPTV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDN4eC9pb3AzMjEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDN4eC9pb3AzMjEuaAppbmRleCAyMDA2MjFmLi5mOGRmNzc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AzeHgvaW9wMzIxLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wM3h4L2lvcDMyMS5oCkBAIC00MCw3ICs0MCw3IEBACiAjZGVmaW5lIElPUDMyMV9QQ0lfVVBQRVJfSU9fQkEgICAgICAoSU9QMzIxX1BDSV9MT1dFUl9JT19CQSArIElPUDMyMV9QQ0lfSU9fV0lORE9XX1NJWkUgLSAxKQogI2RlZmluZSBJT1AzMjFfUENJX0lPX09GRlNFVCAgICAgICAgKElPUDMyMV9QQ0lfTE9XRVJfSU9fVkEgLSBJT1AzMjFfUENJX0xPV0VSX0lPX0JBKQogCi0vLyNkZWZpbmUgSU9QMzIxX1BDSV9NRU1fV0lORE9XX1NJWkUgICh+KklPUDMyMV9JQUxSMSArIDEpCisvKiAjZGVmaW5lIElPUDMyMV9QQ0lfTUVNX1dJTkRPV19TSVpFICAofipJT1AzMjFfSUFMUjEgKyAxKSAqLwogI2RlZmluZSBJT1AzMjFfUENJX01FTV9XSU5ET1dfU0laRSAgMHgwNDAwMDAwMCAvKiA2NE0gb3V0Ym91bmQgd2luZG93ICovCiAjZGVmaW5lIElPUDMyMV9QQ0lfTE9XRVJfTUVNX1BBICAgICAweDgwMDAwMDAwCiAjZGVmaW5lIElPUDMyMV9QQ0lfTE9XRVJfTUVNX0JBICAgICAoKklPUDMyMV9PTVdUVlIwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9pcnFzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2lycXMuaAppbmRleCAwZGViOTZjLi42MmYwOWM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2lycXMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2lycXMuaApAQCAtNjcsMTIgKzY3LDQ1IEBACiAjZGVmaW5lIElSUV9JWFAyMDAwX1BDSUEJCTQwCiAjZGVmaW5lIElSUV9JWFAyMDAwX1BDSUIJCTQxCiAKLSNkZWZpbmUgTlJfSVhQMjAwMF9JUlFTICAgICAgICAgICAgICAgICA0MgorLyogSW50IHNvdXJjZXMgZnJvbSBJUlFfRVJST1JfU1RBVFVTICovCisjZGVmaW5lIElSUV9JWFAyMDAwX0RSQU0wX01JTl9FUlIJNDIKKyNkZWZpbmUgSVJRX0lYUDIwMDBfRFJBTTBfTUFKX0VSUgk0MworI2RlZmluZSBJUlFfSVhQMjAwMF9EUkFNMV9NSU5fRVJSCTQ0CisjZGVmaW5lIElSUV9JWFAyMDAwX0RSQU0xX01BSl9FUlIJNDUKKyNkZWZpbmUgSVJRX0lYUDIwMDBfRFJBTTJfTUlOX0VSUgk0NgorI2RlZmluZSBJUlFfSVhQMjAwMF9EUkFNMl9NQUpfRVJSCTQ3CisvKiA0OC01NyByZXNlcnZlZCAqLworI2RlZmluZSBJUlFfSVhQMjAwMF9TUkFNMF9FUlIJCTU4CisjZGVmaW5lIElSUV9JWFAyMDAwX1NSQU0xX0VSUgkJNTkKKyNkZWZpbmUgSVJRX0lYUDIwMDBfU1JBTTJfRVJSCQk2MAorI2RlZmluZSBJUlFfSVhQMjAwMF9TUkFNM19FUlIJCTYxCisvKiA2Mi02NSByZXNlcnZlZCAqLworI2RlZmluZSBJUlFfSVhQMjAwMF9NRURJQV9FUlIJCTY2CisjZGVmaW5lIElSUV9JWFAyMDAwX1BDSV9FUlIJCQk2NworI2RlZmluZSBJUlFfSVhQMjAwMF9TUF9JTlQJCQk2OAorCisjZGVmaW5lIE5SX0lYUDIwMDBfSVJRUwkJCQk2OQogCiAjZGVmaW5lCUlYUDIwMDBfQk9BUkRfSVJRKHgpCQkoTlJfSVhQMjAwMF9JUlFTICsgKHgpKQogCiAjZGVmaW5lCUlYUDIwMDBfQk9BUkRfSVJRX01BU0soaXJxKQkoMSA8PCAoaXJxIC0gTlJfSVhQMjAwMF9JUlFTKSkJCiAKKyNkZWZpbmUgSVhQMjAwMF9FUlJfSVJRX01BU0soaXJxKSAoIDEgPDwgKGlycSAtIElSUV9JWFAyMDAwX0RSQU0wX01JTl9FUlIpKQorI2RlZmluZSBJWFAyMDAwX1ZBTElEX0VSUl9JUlFfTUFTSyAoXAorCQlJWFAyMDAwX0VSUl9JUlFfTUFTSyhJUlFfSVhQMjAwMF9EUkFNMF9NSU5fRVJSKSB8IFwKKwkJSVhQMjAwMF9FUlJfSVJRX01BU0soSVJRX0lYUDIwMDBfRFJBTTBfTUFKX0VSUikgfCBcCisJCUlYUDIwMDBfRVJSX0lSUV9NQVNLKElSUV9JWFAyMDAwX0RSQU0xX01JTl9FUlIpIHwgXAorCQlJWFAyMDAwX0VSUl9JUlFfTUFTSyhJUlFfSVhQMjAwMF9EUkFNMV9NQUpfRVJSKSB8IFwKKwkJSVhQMjAwMF9FUlJfSVJRX01BU0soSVJRX0lYUDIwMDBfRFJBTTJfTUlOX0VSUikgfCBcCisJCUlYUDIwMDBfRVJSX0lSUV9NQVNLKElSUV9JWFAyMDAwX0RSQU0yX01BSl9FUlIpIHwgXAorCQlJWFAyMDAwX0VSUl9JUlFfTUFTSyhJUlFfSVhQMjAwMF9TUkFNMF9FUlIpIHwgXAorCQlJWFAyMDAwX0VSUl9JUlFfTUFTSyhJUlFfSVhQMjAwMF9TUkFNMV9FUlIpIHwgXAorCQlJWFAyMDAwX0VSUl9JUlFfTUFTSyhJUlFfSVhQMjAwMF9TUkFNMl9FUlIpIHwgXAorCQlJWFAyMDAwX0VSUl9JUlFfTUFTSyhJUlFfSVhQMjAwMF9TUkFNM19FUlIpIHwgXAorCQlJWFAyMDAwX0VSUl9JUlFfTUFTSyhJUlFfSVhQMjAwMF9NRURJQV9FUlIpIHwgXAorCQlJWFAyMDAwX0VSUl9JUlFfTUFTSyhJUlFfSVhQMjAwMF9QQ0lfRVJSKSB8IFwKKwkJSVhQMjAwMF9FUlJfSVJRX01BU0soSVJRX0lYUDIwMDBfU1BfSU5UKQkpCisKIC8qCiAgKiBUaGlzIGFsbG93cyBmb3IgYWxsIHRoZSBvbi1jaGlwIHNvdXJjZXMgcGx1cyB1cCB0byAzMiBDUExEIGJhc2VkCiAgKiBJUlFzLiBTaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tYXJtL21tdV9jb250ZXh0LmgKaW5kZXggNGFmOWM0MS4uNTdiOGRlZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9tbXVfY29udGV4dC5oCkBAIC04Niw3ICs4Niw4IEBACiAJCWNwdV9zZXQoY3B1LCBuZXh0LT5jcHVfdm1fbWFzayk7CiAJCWNoZWNrX2NvbnRleHQobmV4dCk7CiAJCWNwdV9zd2l0Y2hfbW0obmV4dC0+cGdkLCBuZXh0KTsKLQkJY3B1X2NsZWFyKGNwdSwgcHJldi0+Y3B1X3ZtX21hc2spOworCQlpZiAoY2FjaGVfaXNfdml2dCgpKQorCQkJY3B1X2NsZWFyKGNwdSwgcHJldi0+Y3B1X3ZtX21hc2spOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcWJsa194ZnMuaCBiL2luY2x1ZGUvbGludXgvZHFibGtfeGZzLmgKaW5kZXggY2IzMTcxOS4uMmZkYTFiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kcWJsa194ZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RxYmxrX3hmcy5oCkBAIC0xLDIyICsxLDE4IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDEsMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyLjEgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNwotICogVVNBCi0gKgotICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTUwMCBDcml0dGVuZGVuIExhbmUsCi0gKiBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MywgVVNBLCBvcjogaHR0cDovL3d3dy5zZ2kuY29tCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2V0IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogI2lmbmRlZiBfTElOVVhfRFFCTEtfWEZTX0gKICNkZWZpbmUgX0xJTlVYX0RRQkxLX1hGU19ICkBAIC0zMiw3ICsyOCw4IEBACiAKICNkZWZpbmUgWFFNX1VTUlFVT1RBCTAJLyogc3lzdGVtIGNhbGwgdXNlciBxdW90YSB0eXBlICovCiAjZGVmaW5lIFhRTV9HUlBRVU9UQQkxCS8qIHN5c3RlbSBjYWxsIGdyb3VwIHF1b3RhIHR5cGUgKi8KLSNkZWZpbmUgWFFNX01BWFFVT1RBUwkyCisjZGVmaW5lIFhRTV9QUkpRVU9UQQkyCS8qIHN5c3RlbSBjYWxsIHByb2plY3QgcXVvdGEgdHlwZSAqLworI2RlZmluZSBYUU1fTUFYUVVPVEFTCTMKIAogI2RlZmluZSBRX1hRVU9UQU9OCVhRTV9DTUQoMSkJLyogZW5hYmxlIGFjY291bnRpbmcvZW5mb3JjZW1lbnQgKi8KICNkZWZpbmUgUV9YUVVPVEFPRkYJWFFNX0NNRCgyKQkvKiBkaXNhYmxlIGFjY291bnRpbmcvZW5mb3JjZW1lbnQgKi8KQEAgLTQwLDYgKzM3LDcgQEAKICNkZWZpbmUgUV9YU0VUUUxJTQlYUU1fQ01EKDQpCS8qIHNldCBkaXNrIGxpbWl0cyAqLwogI2RlZmluZSBRX1hHRVRRU1RBVAlYUU1fQ01EKDUpCS8qIGdldCBxdW90YSBzdWJzeXN0ZW0gc3RhdHVzICovCiAjZGVmaW5lIFFfWFFVT1RBUk0JWFFNX0NNRCg2KQkvKiBmcmVlIGRpc2sgc3BhY2UgdXNlZCBieSBkcXVvdHMgKi8KKyNkZWZpbmUgUV9YUVVPVEFTWU5DCVhRTV9DTUQoNykJLyogZGVsYWxsb2MgZmx1c2gsIHVwZGF0ZXMgZHF1b3RzICovCiAKIC8qCiAgKiBmc19kaXNrX3F1b3RhIHN0cnVjdHVyZToKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaAppbmRleCBjYzg0OTM0Li41ZjQ5YTMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oCkBAIC00OCw4ICs0OCwxMCBAQAogfQogCiAvKioKLSAqIGlzX3plcm9fZXRoZXJfYWRkciAtIERldGVybWluZSBpZiBnaXZlIEV0aGVybmV0IGFkZHJlc3MgaXMgYWxsCi0gKiB6ZXJvcy4KKyAqIGlzX3plcm9fZXRoZXJfYWRkciAtIERldGVybWluZSBpZiBnaXZlIEV0aGVybmV0IGFkZHJlc3MgaXMgYWxsIHplcm9zLgorICogQGFkZHI6IFBvaW50ZXIgdG8gYSBzaXgtYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBFdGhlcm5ldCBhZGRyZXNzCisgKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYWxsIHplcm9lcy4KICAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfemVyb19ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQogewpAQCAtNTcsOSArNTksNyBAQAogfQogCiAvKioKLSAqIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyIC0gRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBFdGhlcm5ldCBhZGRyZXNzIGlzIGEKLSAqIG11bHRpY2FzdCBhZGRyZXNzLgotICoKKyAqIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyIC0gRGV0ZXJtaW5lIGlmIHRoZSBFdGhlcm5ldCBhZGRyZXNzIGlzIGEgbXVsdGljYXN0LgogICogQGFkZHI6IFBvaW50ZXIgdG8gYSBzaXgtYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBFdGhlcm5ldCBhZGRyZXNzCiAgKgogICogUmV0dXJuIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcy4KQEAgLTY5LDEwICs2OSwxNSBAQAogCXJldHVybiAoKGFkZHJbMF0gIT0gMHhmZikgJiYgKDB4MDEgJiBhZGRyWzBdKSk7CiB9CiAKKy8qKgorICogaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIgLSBEZXRlcm1pbmUgaWYgdGhlIEV0aGVybmV0IGFkZHJlc3MgaXMgYnJvYWRjYXN0CisgKiBAYWRkcjogUG9pbnRlciB0byBhIHNpeC1ieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIEV0aGVybmV0IGFkZHJlc3MKKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB0aGUgYnJvYWRjYXN0IGFkZHJlc3MuCisgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQogewotICAgICAgICByZXR1cm4gKChhZGRyWzBdID09IDB4ZmYpICYmIChhZGRyWzFdID09IDB4ZmYpICYmIChhZGRyWzJdID09IDB4ZmYpICYmICAKLQkJKGFkZHJbM10gPT0gMHhmZikgJiYgKGFkZHJbNF0gPT0gMHhmZikgJiYgKGFkZHJbNV0gPT0gMHhmZikpOworCXJldHVybiAoYWRkclswXSAmIGFkZHJbMV0gJiBhZGRyWzJdICYgYWRkclszXSAmIGFkZHJbNF0gJiBhZGRyWzVdKSA9PSAweGZmOwogfQogCiAvKioKQEAgLTEwOCwxNCArMTEzLDE0IEBACiAvKioKICAqIGNvbXBhcmVfZXRoZXJfYWRkciAtIENvbXBhcmUgdHdvIEV0aGVybmV0IGFkZHJlc3NlcwogICogQGFkZHIxOiBQb2ludGVyIHRvIGEgc2l4LWJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgRXRoZXJuZXQgYWRkcmVzcwotICogQGFkZHIyIFBvaW50ZXIgb3RoZXIgc2l4LWJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgRXRoZXJuZXQgYWRkcmVzcworICogQGFkZHIyOiBQb2ludGVyIG90aGVyIHNpeC1ieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIEV0aGVybmV0IGFkZHJlc3MKICAqCiAgKiBDb21wYXJlIHR3byBldGhlcm5ldCBhZGRyZXNzZXMsIHJldHVybnMgMCBpZiBlcXVhbAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNvbXBhcmVfZXRoZXJfYWRkcihjb25zdCB1OCAqX2EsIGNvbnN0IHU4ICpfYikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29tcGFyZV9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyMSwgY29uc3QgdTggKmFkZHIyKQogewotCWNvbnN0IHUxNiAqYSA9IChjb25zdCB1MTYgKikgX2E7Ci0JY29uc3QgdTE2ICpiID0gKGNvbnN0IHUxNiAqKSBfYjsKKwljb25zdCB1MTYgKmEgPSAoY29uc3QgdTE2ICopIGFkZHIxOworCWNvbnN0IHUxNiAqYiA9IChjb25zdCB1MTYgKikgYWRkcjI7CiAKIAlCVUlMRF9CVUdfT04oRVRIX0FMRU4gIT0gNik7CiAJcmV0dXJuICgoYVswXSBeIGJbMF0pIHwgKGFbMV0gXiBiWzFdKSB8IChhWzJdIF4gYlsyXSkpICE9IDA7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kYXRhZ3JhbS5jIGIvbmV0L2NvcmUvZGF0YWdyYW0uYwppbmRleCA4MTk4N2RmLi5kMjE5NDM1IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kYXRhZ3JhbS5jCisrKyBiL25ldC9jb3JlL2RhdGFncmFtLmMKQEAgLTIxMyw2ICsyMTMsMTAgQEAKIHsKIAlpbnQgaSwgZXJyLCBmcmFnbGVuLCBlbmQgPSAwOwogCXN0cnVjdCBza19idWZmICpuZXh0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKIG5leHRfc2tiOgogCWZyYWdsZW4gPSBza2JfaGVhZGxlbihza2IpOwogCWkgPSAtMTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lnbXAuYyBiL25ldC9pcHY0L2lnbXAuYwppbmRleCA4YjZkMzkzLi5jNjI0N2ZjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pZ21wLmMKKysrIGIvbmV0L2lwdjQvaWdtcC5jCkBAIC0xOTA4LDggKzE5MDgsMTEgQEAKIAkJCXNvY2tfa2ZyZWVfcyhzaywgbmV3cHNsLCBJUF9TRkxTSVpFKG5ld3BzbC0+c2xfbWF4KSk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KLQl9IGVsc2UKKwl9IGVsc2UgewogCQluZXdwc2wgPSBOVUxMOworCQkodm9pZCkgaXBfbWNfYWRkX3NyYyhpbl9kZXYsICZtc2YtPmltc2ZfbXVsdGlhZGRyLAorCQkJCSAgICAgbXNmLT5pbXNmX2Ztb2RlLCAwLCBOVUxMLCAwKTsKKwl9CiAJcHNsID0gcG1jLT5zZmxpc3Q7CiAJaWYgKHBzbCkgewogCQkodm9pZCkgaXBfbWNfZGVsX3NyYyhpbl9kZXYsICZtc2YtPmltc2ZfbXVsdGlhZGRyLCBwbWMtPnNmbW9kZSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9iaWMuYyBiL25ldC9pcHY0L3RjcF9iaWMuYwppbmRleCA2ZDgwZTA2Li5hZTM1ZTA2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfYmljLmMKKysrIGIvbmV0L2lwdjQvdGNwX2JpYy5jCkBAIC0yNyw3ICsyNyw3IEBACiAJCQkJCSAgKi8KIAogc3RhdGljIGludCBmYXN0X2NvbnZlcmdlbmNlID0gMTsKLXN0YXRpYyBpbnQgbWF4X2luY3JlbWVudCA9IDMyOworc3RhdGljIGludCBtYXhfaW5jcmVtZW50ID0gMTY7CiBzdGF0aWMgaW50IGxvd193aW5kb3cgPSAxNDsKIHN0YXRpYyBpbnQgYmV0YSA9IDgxOTsJCS8qID0gODE5LzEwMjQgKEJJQ1RDUF9CRVRBX1NDQUxFKSAqLwogc3RhdGljIGludCBsb3dfdXRpbGl6YXRpb25fdGhyZXNob2xkID0gMTUzOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggNDFlZGMxNC4uMmM1ZjU3MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC0yMTYzLDcgKzIxNjMsNyBAQAogCiAJLyogU3RlcCA1OiBuZXRsaW5rIG5vdGlmaWNhdGlvbiBvZiB0aGlzIGludGVyZmFjZSAqLwogCWlkZXYtPnRzdGFtcCA9IGppZmZpZXM7Ci0JaW5ldDZfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgaWRldik7CisJaW5ldDZfaWZpbmZvX25vdGlmeShSVE1fREVMTElOSywgaWRldik7CiAJCiAJLyogU2hvdCB0aGUgZGV2aWNlIChpZiB1bnJlZ2lzdGVyZWQpICovCiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IDk2NmIyMzcuLmYxNWUwNGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtNTQ1LDggKzU0NSwxMCBAQAogCQkJc29ja19rZnJlZV9zKHNrLCBuZXdwc2wsIElQNl9TRkxTSVpFKG5ld3BzbC0+c2xfbWF4KSk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KLQl9IGVsc2UKKwl9IGVsc2UgewogCQluZXdwc2wgPSBOVUxMOworCQkodm9pZCkgaXA2X21jX2FkZF9zcmMoaWRldiwgZ3JvdXAsIGdzZi0+Z2ZfZm1vZGUsIDAsIE5VTEwsIDApOworCX0KIAlwc2wgPSBwbWMtPnNmbGlzdDsKIAlpZiAocHNsKSB7CiAJCSh2b2lkKSBpcDZfbWNfZGVsX3NyYyhpZGV2LCBncm91cCwgcG1jLT5zZm1vZGUsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvS2NvbmZpZyBiL25ldC9zY2hlZC9LY29uZmlnCmluZGV4IDgxNTEwZGEuLjdmMzRlN2YgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9LY29uZmlnCisrKyBiL25ldC9zY2hlZC9LY29uZmlnCkBAIC0yLDEzICsyLDE1IEBACiAjIFRyYWZmaWMgY29udHJvbCBjb25maWd1cmF0aW9uLgogIyAKIAotbWVudWNvbmZpZyBORVRfU0NIRUQKK21lbnUgIlFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZyIKKworY29uZmlnIE5FVF9TQ0hFRAogCWJvb2wgIlFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZyIKIAktLS1oZWxwLS0tCiAJICBXaGVuIHRoZSBrZXJuZWwgaGFzIHNldmVyYWwgcGFja2V0cyB0byBzZW5kIG91dCBvdmVyIGEgbmV0d29yawogCSAgZGV2aWNlLCBpdCBoYXMgdG8gZGVjaWRlIHdoaWNoIG9uZXMgdG8gc2VuZCBmaXJzdCwgd2hpY2ggb25lcyB0bwotCSAgZGVsYXksIGFuZCB3aGljaCBvbmVzIHRvIGRyb3AuIFRoaXMgaXMgdGhlIGpvYiBvZiB0aGUgcGFja2V0Ci0JICBzY2hlZHVsZXIsIGFuZCBzZXZlcmFsIGRpZmZlcmVudCBhbGdvcml0aG1zIGZvciBob3cgdG8gZG8gdGhpcworCSAgZGVsYXksIGFuZCB3aGljaCBvbmVzIHRvIGRyb3AuIFRoaXMgaXMgdGhlIGpvYiBvZiB0aGUgcXVldWVpbmcKKwkgIGRpc2NpcGxpbmVzLCBzZXZlcmFsIGRpZmZlcmVudCBhbGdvcml0aG1zIGZvciBob3cgdG8gZG8gdGhpcwogCSAgImZhaXJseSIgaGF2ZSBiZWVuIHByb3Bvc2VkLgogCiAJICBJZiB5b3Ugc2F5IE4gaGVyZSwgeW91IHdpbGwgZ2V0IHRoZSBzdGFuZGFyZCBwYWNrZXQgc2NoZWR1bGVyLCB3aGljaApAQCAtMjMsMTMgKzI1LDEzIEBACiAJICBUbyBhZG1pbmlzdGVyIHRoZXNlIHNjaGVkdWxlcnMsIHlvdSdsbCBuZWVkIHRoZSB1c2VyLWxldmVsIHV0aWxpdGllcwogCSAgZnJvbSB0aGUgcGFja2FnZSBpcHJvdXRlMit0YyBhdCA8ZnRwOi8vZnRwLnR1eC5vcmcvcHViL25ldC9pcC1yb3V0aW5nLz4uCiAJICBUaGF0IHBhY2thZ2UgYWxzbyBjb250YWlucyBzb21lIGRvY3VtZW50YXRpb247IGZvciBtb3JlLCBjaGVjayBvdXQKLQkgIDxodHRwOi8vc25hZnUuZnJlZWRvbS5vcmcvbGludXgyLjIvaXByb3V0ZS1ub3Rlcy5odG1sPi4KKwkgIDxodHRwOi8vbGludXgtbmV0Lm9zZGwub3JnL2luZGV4LnBocC9JcHJvdXRlMj4uCiAKIAkgIFRoaXMgUXVhbGl0eSBvZiBTZXJ2aWNlIChRb1MpIHN1cHBvcnQgd2lsbCBlbmFibGUgeW91IHRvIHVzZQogCSAgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgKGRpZmZzZXJ2KSBhbmQgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wKLQkgIChSU1ZQKSBvbiB5b3VyIExpbnV4IHJvdXRlciBpZiB5b3UgYWxzbyBzYXkgWSB0byAiUW9TIHN1cHBvcnQiLAotCSAgIlBhY2tldCBjbGFzc2lmaWVyIEFQSSIgYW5kIHRvIHNvbWUgY2xhc3NpZmllcnMgYmVsb3cuIERvY3VtZW50YXRpb24KLQkgIGFuZCBzb2Z0d2FyZSBpcyBhdCA8aHR0cDovL2RpZmZzZXJ2LnNvdXJjZWZvcmdlLm5ldC8+LgorCSAgKFJTVlApIG9uIHlvdXIgTGludXggcm91dGVyIGlmIHlvdSBhbHNvIHNheSBZIHRvIHRoZSBjb3JyZXNwb25kaW5nCisJICBjbGFzc2lmaWVycyBiZWxvdy4gIERvY3VtZW50YXRpb24gYW5kIHNvZnR3YXJlIGlzIGF0CisJICA8aHR0cDovL2RpZmZzZXJ2LnNvdXJjZWZvcmdlLm5ldC8+LgogCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIiBiZWxvdywgeW91IHdpbGwgYmUgYWJsZQogCSAgdG8gcmVhZCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgcGFja2V0IHNjaGVkdWxlcnMgZnJvbSB0aGUgZmlsZQpAQCAtNDIsNyArNDQsNyBAQAogCXByb21wdCAiUGFja2V0IHNjaGVkdWxlciBjbG9jayBzb3VyY2UiCiAJZGVwZW5kcyBvbiBORVRfU0NIRUQKIAlkZWZhdWx0IE5FVF9TQ0hfQ0xLX0pJRkZJRVMKLQloZWxwCisJLS0taGVscC0tLQogCSAgUGFja2V0IHNjaGVkdWxlcnMgbmVlZCBhIG1vbm90b25pYyBjbG9jayB0aGF0IGluY3JlbWVudHMgYXQgYSBzdGF0aWMKIAkgIHJhdGUuIFRoZSBrZXJuZWwgcHJvdmlkZXMgc2V2ZXJhbCBzdWl0YWJsZSBpbnRlcmZhY2VzLCBlYWNoIHdpdGgKIAkgIGRpZmZlcmVudCBwcm9wZXJ0aWVzOgpAQCAtNTYsNyArNTgsNyBAQAogCiBjb25maWcgTkVUX1NDSF9DTEtfSklGRklFUwogCWJvb2wgIlRpbWVyIGludGVycnVwdCIKLQloZWxwCisJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIHRpbWVyIGludGVycnVwdCAoamlmZmllcykgYXMgY2xvY2sKIAkgIHNvdXJjZS4gVGhpcyBjbG9jayBzb3VyY2UgaXMgZmFzdCwgc3luY2hyb25pemVkIG9uIGFsbCBwcm9jZXNzb3JzIGFuZAogCSAgaGFuZGxlcyBjcHUgY2xvY2sgZnJlcXVlbmN5IGNoYW5nZXMsIGJ1dCBpdHMgcmVzb2x1dGlvbiBpcyB0b28gbG93CkBAIC02NCw3ICs2Niw3IEBACiAKIGNvbmZpZyBORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkKIAlib29sICJnZXR0aW1lb2ZkYXkiCi0JaGVscAorCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGdldHRpbWVvZmRheSBhcyBjbG9jayBzb3VyY2UuIFRoaXMgY2xvY2sKIAkgIHNvdXJjZSBoYXMgaGlnaCByZXNvbHV0aW9uLCBpcyBzeW5jaHJvbml6ZWQgb24gYWxsIHByb2Nlc3NvcnMgYW5kCiAJICBoYW5kbGVzIGNwdSBjbG9jayBmcmVxdWVuY3kgY2hhbmdlcywgYnV0IGl0IGlzIHNsb3cuCkBAIC03Nyw3ICs3OSw3IEBACiBjb25maWcgTkVUX1NDSF9DTEtfQ1BVCiAJYm9vbCAiQ1BVIGN5Y2xlIGNvdW50ZXIiCiAJZGVwZW5kcyBvbiAoKFg4Nl9UU0MgfHwgWDg2XzY0KSAmJiAhU01QKSB8fCBBTFBIQSB8fCBTUEFSQzY0IHx8IFBQQzY0IHx8IElBNjQKLQloZWxwCisJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIENQVSdzIGN5Y2xlIGNvdW50ZXIgYXMgY2xvY2sgc291cmNlLgogCSAgVGhpcyBpcyBhIGNoZWFwIGFuZCBoaWdoIHJlc29sdXRpb24gY2xvY2sgc291cmNlLCBidXQgb24gc29tZQogCSAgYXJjaGl0ZWN0dXJlcyBpdCBpcyBub3Qgc3luY2hyb25pemVkIG9uIGFsbCBwcm9jZXNzb3JzIGFuZCBkb2Vzbid0CkBAIC05NSwxMzQgKzk3LDEyOSBAQAogCiBlbmRjaG9pY2UKIAorY29tbWVudCAiUXVldWVpbmcvU2NoZWR1bGluZyIKKwlkZXBlbmRzIG9uIE5FVF9TQ0hFRAorCiBjb25maWcgTkVUX1NDSF9DQlEKLQl0cmlzdGF0ZSAiQ0JRIHBhY2tldCBzY2hlZHVsZXIiCisJdHJpc3RhdGUgIkNsYXNzIEJhc2VkIFF1ZXVlaW5nIChDQlEpIgogCWRlcGVuZHMgb24gTkVUX1NDSEVECiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIENsYXNzLUJhc2VkIFF1ZXVlaW5nIChDQlEpIHBhY2tldAotCSAgc2NoZWR1bGluZyBhbGdvcml0aG0gZm9yIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMuICBUaGlzCi0JICBhbGdvcml0aG0gY2xhc3NpZmllcyB0aGUgd2FpdGluZyBwYWNrZXRzIGludG8gYSB0cmVlLWxpa2UgaGllcmFyY2h5Ci0JICBvZiBjbGFzc2VzOyB0aGUgbGVhdmVzIG9mIHRoaXMgdHJlZSBhcmUgaW4gdHVybiBzY2hlZHVsZWQgYnkKLQkgIHNlcGFyYXRlIGFsZ29yaXRobXMgKGNhbGxlZCAiZGlzY2lwbGluZXMiIGluIHRoaXMgY29udGV4dCkuCisJICBzY2hlZHVsaW5nIGFsZ29yaXRobS4gVGhpcyBhbGdvcml0aG0gY2xhc3NpZmllcyB0aGUgd2FpdGluZyBwYWNrZXRzCisJICBpbnRvIGEgdHJlZS1saWtlIGhpZXJhcmNoeSBvZiBjbGFzc2VzOyB0aGUgbGVhdmVzIG9mIHRoaXMgdHJlZSBhcmUKKwkgIGluIHR1cm4gc2NoZWR1bGVkIGJ5IHNlcGFyYXRlIGFsZ29yaXRobXMuCiAKLQkgIFNlZSB0aGUgdG9wIG9mIDxmaWxlOm5ldC9zY2hlZC9zY2hfY2JxLmM+IGZvciByZWZlcmVuY2VzIGFib3V0IHRoZQotCSAgQ0JRIGFsZ29yaXRobS4KKwkgIFNlZSB0aGUgdG9wIG9mIDxmaWxlOm5ldC9zY2hlZC9zY2hfY2JxLmM+IGZvciBtb3JlIGRldGFpbHMuCiAKIAkgIENCUSBpcyBhIGNvbW1vbmx5IHVzZWQgc2NoZWR1bGVyLCBzbyBpZiB5b3UncmUgdW5zdXJlLCB5b3Ugc2hvdWxkCiAJICBzYXkgWSBoZXJlLiBUaGVuIHNheSBZIHRvIGFsbCB0aGUgcXVldWVpbmcgYWxnb3JpdGhtcyBiZWxvdyB0aGF0IHlvdQotCSAgd2FudCB0byB1c2UgYXMgQ0JRIGRpc2NpcGxpbmVzLiAgVGhlbiBzYXkgWSB0byAiUGFja2V0IGNsYXNzaWZpZXIKLQkgIEFQSSIgYW5kIHNheSBZIHRvIGFsbCB0aGUgY2xhc3NpZmllcnMgeW91IHdhbnQgdG8gdXNlOyBhIGNsYXNzaWZpZXIKLQkgIGlzIGEgcm91dGluZSB0aGF0IGFsbG93cyB5b3UgdG8gc29ydCB5b3VyIG91dGdvaW5nIHRyYWZmaWMgaW50bwotCSAgY2xhc3NlcyBiYXNlZCBvbiBhIGNlcnRhaW4gY3JpdGVyaW9uLgorCSAgd2FudCB0byB1c2UgYXMgbGVhZiBkaXNjaXBsaW5lcy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9jYnEuCiAKIGNvbmZpZyBORVRfU0NIX0hUQgotCXRyaXN0YXRlICJIVEIgcGFja2V0IHNjaGVkdWxlciIKKwl0cmlzdGF0ZSAiSGllcmFyY2hpY2FsIFRva2VuIEJ1Y2tldCAoSFRCKSIKIAlkZXBlbmRzIG9uIE5FVF9TQ0hFRAogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBIaWVyYXJjaGljYWwgVG9rZW4gQnVja2V0cyAoSFRCKQotCSAgcGFja2V0IHNjaGVkdWxpbmcgYWxnb3JpdGhtIGZvciBzb21lIG9mIHlvdXIgbmV0d29yayBkZXZpY2VzLiBTZWUKKwkgIHBhY2tldCBzY2hlZHVsaW5nIGFsZ29yaXRobS4gU2VlCiAJICA8aHR0cDovL2x1eGlrLmNkaS5jei9+ZGV2aWsvcW9zL2h0Yi8+IGZvciBjb21wbGV0ZSBtYW51YWwgYW5kCiAJICBpbi1kZXB0aCBhcnRpY2xlcy4KIAotCSAgSFRCIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgQ0JRIHJlZ2FyZGluZyBpdHMgZ29hbHMgaG93ZXZlciBpcyBoYXMgCisJICBIVEIgaXMgdmVyeSBzaW1pbGFyIHRvIENCUSByZWdhcmRpbmcgaXRzIGdvYWxzIGhvd2V2ZXIgaXMgaGFzCiAJICBkaWZmZXJlbnQgcHJvcGVydGllcyBhbmQgZGlmZmVyZW50IGFsZ29yaXRobS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9odGIuCiAKIGNvbmZpZyBORVRfU0NIX0hGU0MKLQl0cmlzdGF0ZSAiSEZTQyBwYWNrZXQgc2NoZWR1bGVyIgorCXRyaXN0YXRlICJIaWVyYXJjaGljYWwgRmFpciBTZXJ2aWNlIEN1cnZlIChIRlNDKSIKIAlkZXBlbmRzIG9uIE5FVF9TQ0hFRAogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBIaWVyYXJjaGljYWwgRmFpciBTZXJ2aWNlIEN1cnZlCi0JICAoSEZTQykgcGFja2V0IHNjaGVkdWxpbmcgYWxnb3JpdGhtIGZvciBzb21lIG9mIHlvdXIgbmV0d29yayBkZXZpY2VzLgorCSAgKEhGU0MpIHBhY2tldCBzY2hlZHVsaW5nIGFsZ29yaXRobS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9oZnNjLgogCi0jdHJpc3RhdGUgJyAgSC1QRlEgcGFja2V0IHNjaGVkdWxlcicgQ09ORklHX05FVF9TQ0hfSFBGUQogY29uZmlnIE5FVF9TQ0hfQVRNCi0JdHJpc3RhdGUgIkFUTSBwc2V1ZG8tc2NoZWR1bGVyIgorCXRyaXN0YXRlICJBVE0gVmlydHVhbCBDaXJjdWl0cyAoQVRNKSIKIAlkZXBlbmRzIG9uIE5FVF9TQ0hFRCAmJiBBVE0KIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgQVRNIHBzZXVkby1zY2hlZHVsZXIuICBUaGlzCi0JICBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgaW52b2tpbmcgY2xhc3NpZmllcnMgKGFrYSAiZmlsdGVycyIpLCB3aGljaAotCSAgaW4gdHVybiBzZWxlY3QgY2xhc3NlcyBvZiB0aGlzIHF1ZXVpbmcgZGlzY2lwbGluZS4gIEVhY2ggY2xhc3MgbWFwcwotCSAgdGhlIGZsb3cocykgaXQgaXMgaGFuZGxpbmcgdG8gYSBnaXZlbiB2aXJ0dWFsIGNpcmN1aXQgKHNlZSB0aGUgdG9wIG9mCi0JICA8ZmlsZTpuZXQvc2NoZWQvc2NoX2F0bS5jPikuCisJICBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgaW52b2tpbmcgY2xhc3NpZmllcnMsIHdoaWNoIGluIHR1cm4KKwkgIHNlbGVjdCBjbGFzc2VzIG9mIHRoaXMgcXVldWluZyBkaXNjaXBsaW5lLiAgRWFjaCBjbGFzcyBtYXBzCisJICB0aGUgZmxvdyhzKSBpdCBpcyBoYW5kbGluZyB0byBhIGdpdmVuIHZpcnR1YWwgY2lyY3VpdC4KKworCSAgU2VlIHRoZSB0b3Agb2YgPGZpbGU6bmV0L3NjaGVkL3NjaF9hdG0uYz4pIGZvciBtb3JlIGRldGFpbHMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzY2hfYXRtLgogCiBjb25maWcgTkVUX1NDSF9QUklPCi0JdHJpc3RhdGUgIlRoZSBzaW1wbGVzdCBQUklPIHBzZXVkb3NjaGVkdWxlciIKKwl0cmlzdGF0ZSAiTXVsdGkgQmFuZCBQcmlvcml0eSBRdWV1ZWluZyAoUFJJTykiCiAJZGVwZW5kcyBvbiBORVRfU0NIRUQKLQloZWxwCisJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYW4gbi1iYW5kIHByaW9yaXR5IHF1ZXVlIHBhY2tldAotCSAgInNjaGVkdWxlciIgZm9yIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMgb3IgYXMgYSBsZWFmIGRpc2NpcGxpbmUKLQkgIGZvciB0aGUgQ0JRIHNjaGVkdWxpbmcgYWxnb3JpdGhtLiBJZiB1bnN1cmUsIHNheSBZLgorCSAgc2NoZWR1bGVyLgogCiAJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX3ByaW8uCiAKIGNvbmZpZyBORVRfU0NIX1JFRAotCXRyaXN0YXRlICJSRUQgcXVldWUiCisJdHJpc3RhdGUgIlJhbmRvbSBFYXJseSBEZXRlY3Rpb24gKFJFRCkiCiAJZGVwZW5kcyBvbiBORVRfU0NIRUQKLQloZWxwCisJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIFJhbmRvbSBFYXJseSBEZXRlY3Rpb24gKFJFRCkKLQkgIHBhY2tldCBzY2hlZHVsaW5nIGFsZ29yaXRobSBmb3Igc29tZSBvZiB5b3VyIG5ldHdvcmsgZGV2aWNlcyAoc2VlCi0JICB0aGUgdG9wIG9mIDxmaWxlOm5ldC9zY2hlZC9zY2hfcmVkLmM+IGZvciBkZXRhaWxzIGFuZCByZWZlcmVuY2VzCi0JICBhYm91dCB0aGUgYWxnb3JpdGhtKS4KKwkgIHBhY2tldCBzY2hlZHVsaW5nIGFsZ29yaXRobS4KKworCSAgU2VlIHRoZSB0b3Agb2YgPGZpbGU6bmV0L3NjaGVkL3NjaF9yZWQuYz4gZm9yIG1vcmUgZGV0YWlscy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9yZWQuCiAKIGNvbmZpZyBORVRfU0NIX1NGUQotCXRyaXN0YXRlICJTRlEgcXVldWUiCisJdHJpc3RhdGUgIlN0b2NoYXN0aWMgRmFpcm5lc3MgUXVldWVpbmcgKFNGUSkiCiAJZGVwZW5kcyBvbiBORVRfU0NIRUQKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU3RvY2hhc3RpYyBGYWlybmVzcyBRdWV1ZWluZyAoU0ZRKQotCSAgcGFja2V0IHNjaGVkdWxpbmcgYWxnb3JpdGhtIGZvciBzb21lIG9mIHlvdXIgbmV0d29yayBkZXZpY2VzIG9yIGFzIGEKLQkgIGxlYWYgZGlzY2lwbGluZSBmb3IgdGhlIENCUSBzY2hlZHVsaW5nIGFsZ29yaXRobSAoc2VlIHRoZSB0b3Agb2YKLQkgIDxmaWxlOm5ldC9zY2hlZC9zY2hfc2ZxLmM+IGZvciBkZXRhaWxzIGFuZCByZWZlcmVuY2VzIGFib3V0IHRoZSBTRlEKLQkgIGFsZ29yaXRobSkuCisJICBwYWNrZXQgc2NoZWR1bGluZyBhbGdvcml0aG0gLgorCisJICBTZWUgdGhlIHRvcCBvZiA8ZmlsZTpuZXQvc2NoZWQvc2NoX3NmcS5jPiBmb3IgbW9yZSBkZXRhaWxzLgogCiAJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX3NmcS4KIAogY29uZmlnIE5FVF9TQ0hfVEVRTAotCXRyaXN0YXRlICJURVFMIHF1ZXVlIgorCXRyaXN0YXRlICJUcnVlIExpbmsgRXF1YWxpemVyIChURVFMKSIKIAlkZXBlbmRzIG9uIE5FVF9TQ0hFRAogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBUcnVlIExpbmsgRXF1YWxpemVyIChUTEUpIHBhY2tldAotCSAgc2NoZWR1bGluZyBhbGdvcml0aG0gZm9yIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMgb3IgYXMgYSBsZWFmCi0JICBkaXNjaXBsaW5lIGZvciB0aGUgQ0JRIHNjaGVkdWxpbmcgYWxnb3JpdGhtLiBUaGlzIHF1ZXVlaW5nCi0JICBkaXNjaXBsaW5lIGFsbG93cyB0aGUgY29tYmluYXRpb24gb2Ygc2V2ZXJhbCBwaHlzaWNhbCBkZXZpY2VzIGludG8KLQkgIG9uZSB2aXJ0dWFsIGRldmljZS4gKHNlZSB0aGUgdG9wIG9mIDxmaWxlOm5ldC9zY2hlZC9zY2hfdGVxbC5jPiBmb3IKLQkgIGRldGFpbHMpLgorCSAgc2NoZWR1bGluZyBhbGdvcml0aG0uIFRoaXMgcXVldWVpbmcgZGlzY2lwbGluZSBhbGxvd3MgdGhlIGNvbWJpbmF0aW9uCisJICBvZiBzZXZlcmFsIHBoeXNpY2FsIGRldmljZXMgaW50byBvbmUgdmlydHVhbCBkZXZpY2UuCisKKwkgIFNlZSB0aGUgdG9wIG9mIDxmaWxlOm5ldC9zY2hlZC9zY2hfdGVxbC5jPiBmb3IgbW9yZSBkZXRhaWxzLgogCiAJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX3RlcWwuCiAKIGNvbmZpZyBORVRfU0NIX1RCRgotCXRyaXN0YXRlICJUQkYgcXVldWUiCisJdHJpc3RhdGUgIlRva2VuIEJ1Y2tldCBGaWx0ZXIgKFRCRikiCiAJZGVwZW5kcyBvbiBORVRfU0NIRUQKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU2ltcGxlIFRva2VuIEJ1Y2tldCBGaWx0ZXIgKFRCRikKLQkgIHBhY2tldCBzY2hlZHVsaW5nIGFsZ29yaXRobSBmb3Igc29tZSBvZiB5b3VyIG5ldHdvcmsgZGV2aWNlcyBvciBhcyBhCi0JICBsZWFmIGRpc2NpcGxpbmUgZm9yIHRoZSBDQlEgc2NoZWR1bGluZyBhbGdvcml0aG0gKHNlZSB0aGUgdG9wIG9mCi0JICA8ZmlsZTpuZXQvc2NoZWQvc2NoX3RiZi5jPiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgVEJGIGFsZ29yaXRobSkuCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIFRva2VuIEJ1Y2tldCBGaWx0ZXIgKFRCRikgcGFja2V0CisJICBzY2hlZHVsaW5nIGFsZ29yaXRobS4KKworCSAgU2VlIHRoZSB0b3Agb2YgPGZpbGU6bmV0L3NjaGVkL3NjaF90YmYuYz4gZm9yIG1vcmUgZGV0YWlscy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF90YmYuCiAKIGNvbmZpZyBORVRfU0NIX0dSRUQKLQl0cmlzdGF0ZSAiR1JFRCBxdWV1ZSIKKwl0cmlzdGF0ZSAiR2VuZXJpYyBSYW5kb20gRWFybHkgRGV0ZWN0aW9uIChHUkVEKSIKIAlkZXBlbmRzIG9uIE5FVF9TQ0hFRAotCWhlbHAKKwktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgR2VuZXJpYyBSYW5kb20gRWFybHkgRGV0ZWN0aW9uCiAJICAoR1JFRCkgcGFja2V0IHNjaGVkdWxpbmcgYWxnb3JpdGhtIGZvciBzb21lIG9mIHlvdXIgbmV0d29yayBkZXZpY2VzCiAJICAoc2VlIHRoZSB0b3Agb2YgPGZpbGU6bmV0L3NjaGVkL3NjaF9yZWQuYz4gZm9yIGRldGFpbHMgYW5kCkBAIC0yMzIsOSArMjI5LDkgQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzY2hfZ3JlZC4KIAogY29uZmlnIE5FVF9TQ0hfRFNNQVJLCi0JdHJpc3RhdGUgIkRpZmZzZXJ2IGZpZWxkIG1hcmtlciIKKwl0cmlzdGF0ZSAiRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgbWFya2VyIChEU01BUkspIgogCWRlcGVuZHMgb24gTkVUX1NDSEVECi0JaGVscAorCS0tLWhlbHAtLS0KIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHNjaGVkdWxlIHBhY2tldHMgYWNjb3JkaW5nIHRvIHRoZQogCSAgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgYXJjaGl0ZWN0dXJlIHByb3Bvc2VkIGluIFJGQyAyNDc1LgogCSAgVGVjaG5pY2FsIGluZm9ybWF0aW9uIG9uIHRoaXMgbWV0aG9kLCB3aXRoIHBvaW50ZXJzIHRvIGFzc29jaWF0ZWQKQEAgLTI0NCw5ICsyNDEsOSBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9kc21hcmsuCiAKIGNvbmZpZyBORVRfU0NIX05FVEVNCi0JdHJpc3RhdGUgIk5ldHdvcmsgZW11bGF0b3IiCisJdHJpc3RhdGUgIk5ldHdvcmsgZW11bGF0b3IgKE5FVEVNKSIKIAlkZXBlbmRzIG9uIE5FVF9TQ0hFRAotCWhlbHAKKwktLS1oZWxwLS0tCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbXVsYXRlIG5ldHdvcmsgZGVsYXksIGxvc3MsIGFuZCBwYWNrZXQKIAkgIHJlLW9yZGVyaW5nLiBUaGlzIGlzIG9mdGVuIHVzZWZ1bCB0byBzaW11bGF0ZSBuZXR3b3JrcyB3aGVuCiAJICB0ZXN0aW5nIGFwcGxpY2F0aW9ucyBvciBwcm90b2NvbHMuCkBAIC0yNTksNTggKzI1NiwyMyBAQAogY29uZmlnIE5FVF9TQ0hfSU5HUkVTUwogCXRyaXN0YXRlICJJbmdyZXNzIFFkaXNjIgogCWRlcGVuZHMgb24gTkVUX1NDSEVEIAotCWhlbHAKLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHBvbGljZSBpbmNvbWluZyBiYW5kd2lkdGgKLQkgIGFuZCBkcm9wIHBhY2tldHMgd2hlbiB0aGlzIGJhbmR3aWR0aCBleGNlZWRzIHlvdXIgZGVzaXJlZCByYXRlLgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGNsYXNzaWZpZXJzIGZvciBpbmNvbWluZyBwYWNrZXRzLgogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9pbmdyZXNzLgogCi1jb25maWcgTkVUX1FPUwotCWJvb2wgIlFvUyBzdXBwb3J0IgorY29tbWVudCAiQ2xhc3NpZmljYXRpb24iCiAJZGVwZW5kcyBvbiBORVRfU0NIRUQKLQktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgUXVhbGl0eSBPZiBTZXJ2aWNlIHNjaGVkdWxpbmcKLQkgIGZlYXR1cmVzLCB3aGljaCBtZWFucyB0aGF0IHlvdSB3aWxsIGJlIGFibGUgdG8gcmVxdWVzdCBjZXJ0YWluCi0JICByYXRlLW9mLWZsb3cgbGltaXRzIGZvciB5b3VyIG5ldHdvcmsgZGV2aWNlcy4KLQotCSAgVGhpcyBRdWFsaXR5IG9mIFNlcnZpY2UgKFFvUykgc3VwcG9ydCB3aWxsIGVuYWJsZSB5b3UgdG8gdXNlCi0JICBEaWZmZXJlbnRpYXRlZCBTZXJ2aWNlcyAoZGlmZnNlcnYpIGFuZCBSZXNvdXJjZSBSZXNlcnZhdGlvbiBQcm90b2NvbAotCSAgKFJTVlApIG9uIHlvdXIgTGludXggcm91dGVyIGlmIHlvdSBhbHNvIHNheSBZIHRvICJQYWNrZXQgY2xhc3NpZmllcgotCSAgQVBJIiBhbmQgdG8gc29tZSBjbGFzc2lmaWVycyBiZWxvdy4gRG9jdW1lbnRhdGlvbiBhbmQgc29mdHdhcmUgaXMgYXQKLQkgIDxodHRwOi8vZGlmZnNlcnYuc291cmNlZm9yZ2UubmV0Lz4uCi0KLQkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQotCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAotCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBRb1Mgc3VwcG9ydC4KLQotY29uZmlnIE5FVF9FU1RJTUFUT1IKLQlib29sICJSYXRlIGVzdGltYXRvciIKLQlkZXBlbmRzIG9uIE5FVF9RT1MKLQloZWxwCi0JICBJbiBvcmRlciBmb3IgUXVhbGl0eSBvZiBTZXJ2aWNlIHNjaGVkdWxpbmcgdG8gd29yaywgdGhlIGN1cnJlbnQKLQkgIHJhdGUtb2YtZmxvdyBmb3IgYSBuZXR3b3JrIGRldmljZSBoYXMgdG8gYmUgZXN0aW1hdGVkOyBpZiB5b3Ugc2F5IFkKLQkgIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBkbyBqdXN0IHRoYXQuCiAKIGNvbmZpZyBORVRfQ0xTCi0JYm9vbCAiUGFja2V0IGNsYXNzaWZpZXIgQVBJIgotCWRlcGVuZHMgb24gTkVUX1NDSEVECi0JLS0taGVscC0tLQotCSAgVGhlIENCUSBzY2hlZHVsaW5nIGFsZ29yaXRobSByZXF1aXJlcyB0aGF0IG5ldHdvcmsgcGFja2V0cyB3aGljaCBhcmUKLQkgIHNjaGVkdWxlZCB0byBiZSBzZW50IG91dCBvdmVyIGEgbmV0d29yayBkZXZpY2UgYmUgY2xhc3NpZmllZAotCSAgYWNjb3JkaW5nIHRvIHNvbWUgY3JpdGVyaW9uLiBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZ2V0IGEKLQkgIGNob2ljZSBvZiBzZXZlcmFsIGRpZmZlcmVudCBwYWNrZXQgY2xhc3NpZmllcnMgd2l0aCB0aGUgZm9sbG93aW5nCi0JICBxdWVzdGlvbnMuCi0KLQkgIFRoaXMgd2lsbCBlbmFibGUgeW91IHRvIHVzZSBEaWZmZXJlbnRpYXRlZCBTZXJ2aWNlcyAoZGlmZnNlcnYpIGFuZAotCSAgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wgKFJTVlApIG9uIHlvdXIgTGludXggcm91dGVyLgotCSAgRG9jdW1lbnRhdGlvbiBhbmQgc29mdHdhcmUgaXMgYXQKLQkgIDxodHRwOi8vZGlmZnNlcnYuc291cmNlZm9yZ2UubmV0Lz4uCisJYm9vbGVhbgogCiBjb25maWcgTkVUX0NMU19CQVNJQwotCXRyaXN0YXRlICJCYXNpYyBjbGFzc2lmaWVyIgotCWRlcGVuZHMgb24gTkVUX0NMUworCXRyaXN0YXRlICJFbGVtZW50YXJ5IGNsYXNzaWZpY2F0aW9uIChCQVNJQykiCisJZGVwZW5kcyBORVRfU0NIRUQKKwlzZWxlY3QgTkVUX0NMUwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBjbGFzc2lmeSBwYWNrZXRzIHVzaW5nCiAJICBvbmx5IGV4dGVuZGVkIG1hdGNoZXMgYW5kIGFjdGlvbnMuCkBAIC0zMTksMjQgKzI4MSwyNSBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNsc19iYXNpYy4KIAogY29uZmlnIE5FVF9DTFNfVENJTkRFWAotCXRyaXN0YXRlICJUQyBpbmRleCBjbGFzc2lmaWVyIgotCWRlcGVuZHMgb24gTkVUX0NMUwotCWhlbHAKLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNsYXNzaWZ5IG91dGdvaW5nIHBhY2tldHMKLQkgIGFjY29yZGluZyB0byB0aGUgdGNfaW5kZXggZmllbGQgb2YgdGhlIHNrYi4gWW91IHdpbGwgd2FudCB0aGlzCi0JICBmZWF0dXJlIGlmIHlvdSB3YW50IHRvIGltcGxlbWVudCBEaWZmZXJlbnRpYXRlZCBTZXJ2aWNlcyB1c2luZwotCSAgc2NoX2RzbWFyay4gSWYgdW5zdXJlLCBzYXkgWS4KKwl0cmlzdGF0ZSAiVHJhZmZpYy1Db250cm9sIEluZGV4IChUQ0lOREVYKSIKKwlkZXBlbmRzIE5FVF9TQ0hFRAorCXNlbGVjdCBORVRfQ0xTCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGNsYXNzaWZ5IHBhY2tldHMgYmFzZWQgb24KKwkgIHRyYWZmaWMgY29udHJvbCBpbmRpY2VzLiBZb3Ugd2lsbCB3YW50IHRoaXMgZmVhdHVyZSBpZiB5b3Ugd2FudAorCSAgdG8gaW1wbGVtZW50IERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIHRvZ2V0aGVyIHdpdGggRFNNQVJLLgogCiAJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY2xzX3RjaW5kZXguCiAKIGNvbmZpZyBORVRfQ0xTX1JPVVRFNAotCXRyaXN0YXRlICJSb3V0aW5nIHRhYmxlIGJhc2VkIGNsYXNzaWZpZXIiCi0JZGVwZW5kcyBvbiBORVRfQ0xTCisJdHJpc3RhdGUgIlJvdXRpbmcgZGVjaXNpb24gKFJPVVRFKSIKKwlkZXBlbmRzIE5FVF9TQ0hFRAogCXNlbGVjdCBORVRfQ0xTX1JPVVRFCi0JaGVscAotCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gY2xhc3NpZnkgb3V0Z29pbmcgcGFja2V0cwotCSAgYWNjb3JkaW5nIHRvIHRoZSByb3V0ZSB0YWJsZSBlbnRyeSB0aGV5IG1hdGNoZWQuIElmIHVuc3VyZSwgc2F5IFkuCisJc2VsZWN0IE5FVF9DTFMKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYWJsZSB0byBjbGFzc2lmeSBwYWNrZXRzCisJICBhY2NvcmRpbmcgdG8gdGhlIHJvdXRlIHRhYmxlIGVudHJ5IHRoZXkgbWF0Y2hlZC4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNsc19yb3V0ZS4KQEAgLTM0Niw1OCArMzA5LDQ1IEBACiAJZGVmYXVsdCBuCiAKIGNvbmZpZyBORVRfQ0xTX0ZXCi0JdHJpc3RhdGUgIkZpcmV3YWxsIGJhc2VkIGNsYXNzaWZpZXIiCi0JZGVwZW5kcyBvbiBORVRfQ0xTCi0JaGVscAotCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gY2xhc3NpZnkgb3V0Z29pbmcgcGFja2V0cwotCSAgYWNjb3JkaW5nIHRvIGZpcmV3YWxsIGNyaXRlcmlhIHlvdSBzcGVjaWZpZWQuCisJdHJpc3RhdGUgIk5ldGZpbHRlciBtYXJrIChGVykiCisJZGVwZW5kcyBORVRfU0NIRUQKKwlzZWxlY3QgTkVUX0NMUworCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNsYXNzaWZ5IHBhY2tldHMKKwkgIGFjY29yZGluZyB0byBuZXRmaWx0ZXIvZmlyZXdhbGwgbWFya3MuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjbHNfZncuCiAKIGNvbmZpZyBORVRfQ0xTX1UzMgotCXRyaXN0YXRlICJVMzIgY2xhc3NpZmllciIKLQlkZXBlbmRzIG9uIE5FVF9DTFMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYWJsZSB0byBjbGFzc2lmeSBvdXRnb2luZyBwYWNrZXRzCi0JICBhY2NvcmRpbmcgdG8gdGhlaXIgZGVzdGluYXRpb24gYWRkcmVzcy4gSWYgdW5zdXJlLCBzYXkgWS4KKwl0cmlzdGF0ZSAiVW5pdmVyc2FsIDMyYml0IGNvbXBhcmlzb25zIHcvIGhhc2hpbmcgKFUzMikiCisJZGVwZW5kcyBORVRfU0NIRUQKKwlzZWxlY3QgTkVUX0NMUworCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gYmUgYWJsZSB0byBjbGFzc2lmeSBwYWNrZXRlcyB1c2luZyBhIHVuaXZlcnNhbAorCSAgMzJiaXQgcGllY2VzIGJhc2VkIGNvbXBhcmlzb24gc2NoZW1lLgogCiAJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY2xzX3UzMi4KIAogY29uZmlnIENMU19VMzJfUEVSRgotCWJvb2wgIlUzMiBjbGFzc2lmaWVyIHBlcmZvcm1hbmNlIGNvdW50ZXJzIgorCWJvb2wgIlBlcmZvcm1hbmNlIGNvdW50ZXJzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVRfQ0xTX1UzMgotCWhlbHAKLQkgIGdhdGhlcnMgc3RhdHMgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHR1bmUgdTMyIGNsYXNzaWZpZXIgcGVyZm9ybWFuY2UuCi0JICBSZXF1aXJlcyBhIG5ldyBpcHJvdXRlMgotCSAgWW91IE1VU1QgTk9UIHR1cm4gdGhpcyBvbiBpZiB5b3UgZG9udCBoYXZlIGFuIHVwZGF0ZSBpcHJvdXRlMi4KLQotY29uZmlnIE5FVF9DTFNfSU5ECi0JYm9vbCAiY2xhc3NpZnkgaW5wdXQgZGV2aWNlIChzbG93cyB0aGluZ3MgdTMyL2Z3KSAiCi0JZGVwZW5kcyBvbiBORVRfQ0xTX1UzMiB8fCBORVRfQ0xTX0ZXCi0JaGVscAotCSAgVGhpcyBvcHRpb24gd2lsbCBiZSBraWxsZWQgZXZlbnR1YWxseSB3aGVuIGEgCi0gICAgICAgICAgbWV0YWRhdGEgYWN0aW9uIGFwcGVhcnMgYmVjYXVzZSBpdCBzbG93cyB0aGluZ3MgYSBsaXR0bGUKLSAgICAgICAgICBBdmFpbGFibGUgb25seSBmb3IgdTMyIGFuZCBmdyBjbGFzc2lmaWVycy4KLQkgIFJlcXVpcmVzIGEgbmV3IGlwcm91dGUyCi0JICBZb3UgTVVTVCBOT1QgdHVybiB0aGlzIG9uIGlmIHlvdSBkb250IGhhdmUgYW4gdXBkYXRlIGlwcm91dGUyLgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gbWFrZSB1MzIgZ2F0aGVyIGFkZGl0aW9uYWwgc3RhdGlzdGljcyB1c2VmdWwgZm9yCisJICBmaW5lIHR1bmluZyB1MzIgY2xhc3NpZmllcnMuCiAKIGNvbmZpZyBDTFNfVTMyX01BUksKLQlib29sICJVc2UgbmZtYXJrIGFzIGEga2V5IGluIFUzMiBjbGFzc2lmaWVyIgorCWJvb2wgIk5ldGZpbHRlciBtYXJrcyBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUX0NMU19VMzIgJiYgTkVURklMVEVSCi0JaGVscAotCSAgVGhpcyBhbGxvd3MgeW91IHRvIG1hdGNoIG1hcmsgaW4gYSB1MzIgZmlsdGVyLgotCSAgRXhhbXBsZToKLQkgIHRjIGZpbHRlciBhZGQgZGV2IGV0aDAgcHJvdG9jb2wgaXAgcGFyZW50IDE6MCBwcmlvIDUgdTMyIFwKLQkJbWF0Y2ggbWFyayAweDAwOTAgMHhmZmZmIFwKLQkJbWF0Y2ggaXAgZHN0IDQuNC40LjQgXAotCQlmbG93aWQgMTo5MAotCSAgWW91IG11c3QgdXNlIGEgbmV3IGlwcm91dGUyIHRvIHVzZSB0aGlzIGZlYXR1cmUuCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBiZSBhYmxlIHRvIHVzZSBuZXRmaWx0ZXIgbWFya3MgYXMgdTMyIGtleS4KIAogY29uZmlnIE5FVF9DTFNfUlNWUAotCXRyaXN0YXRlICJTcGVjaWFsIFJTVlAgY2xhc3NpZmllciIKLQlkZXBlbmRzIG9uIE5FVF9DTFMgJiYgTkVUX1FPUworCXRyaXN0YXRlICJJUHY0IFJlc291cmNlIFJlc2VydmF0aW9uIFByb3RvY29sIChSU1ZQKSIKKwlkZXBlbmRzIG9uIE5FVF9TQ0hFRAorCXNlbGVjdCBORVRfQ0xTCisJc2VsZWN0IE5FVF9FU1RJTUFUT1IKIAktLS1oZWxwLS0tCiAJICBUaGUgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wgKFJTVlApIHBlcm1pdHMgZW5kIHN5c3RlbXMgdG8KIAkgIHJlcXVlc3QgYSBtaW5pbXVtIGFuZCBtYXhpbXVtIGRhdGEgZmxvdyByYXRlIGZvciBhIGNvbm5lY3Rpb247IHRoaXMKQEAgLTQxMCwzMSArMzYwLDMzIEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY2xzX3JzdnAuCiAKIGNvbmZpZyBORVRfQ0xTX1JTVlA2Ci0JdHJpc3RhdGUgIlNwZWNpYWwgUlNWUCBjbGFzc2lmaWVyIGZvciBJUHY2IgotCWRlcGVuZHMgb24gTkVUX0NMUyAmJiBORVRfUU9TCisJdHJpc3RhdGUgIklQdjYgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wgKFJTVlA2KSIKKwlkZXBlbmRzIG9uIE5FVF9TQ0hFRAorCXNlbGVjdCBORVRfQ0xTCisJc2VsZWN0IE5FVF9FU1RJTUFUT1IKIAktLS1oZWxwLS0tCiAJICBUaGUgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wgKFJTVlApIHBlcm1pdHMgZW5kIHN5c3RlbXMgdG8KIAkgIHJlcXVlc3QgYSBtaW5pbXVtIGFuZCBtYXhpbXVtIGRhdGEgZmxvdyByYXRlIGZvciBhIGNvbm5lY3Rpb247IHRoaXMKIAkgIGlzIGltcG9ydGFudCBmb3IgcmVhbCB0aW1lIGRhdGEgc3VjaCBhcyBzdHJlYW1pbmcgc291bmQgb3IgdmlkZW8uCiAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBjbGFzc2lmeSBvdXRnb2luZyBwYWNrZXRzIGJhc2VkCi0JICBvbiB0aGVpciBSU1ZQIHJlcXVlc3RzIGFuZCB5b3UgYXJlIHVzaW5nIHRoZSBuZXcgSW50ZXJuZXQgUHJvdG9jb2wKLQkgIElQdjYgYXMgb3Bwb3NlZCB0byB0aGUgb2xkZXIgYW5kIG1vcmUgY29tbW9uIElQdjQuCisJICBvbiB0aGVpciBSU1ZQIHJlcXVlc3RzIGFuZCB5b3UgYXJlIHVzaW5nIHRoZSBJUHY2LgogCiAJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY2xzX3JzdnA2LgogCiBjb25maWcgTkVUX0VNQVRDSAogCWJvb2wgIkV4dGVuZGVkIE1hdGNoZXMiCi0JZGVwZW5kcyBvbiBORVRfQ0xTCisJZGVwZW5kcyBORVRfU0NIRUQKKwlzZWxlY3QgTkVUX0NMUwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGV4dGVuZGVkIG1hdGNoZXMgb24gdG9wIG9mIGNsYXNzaWZpZXJzCiAJICBhbmQgc2VsZWN0IHRoZSBleHRlbmRlZCBtYXRjaGVzIGJlbG93LgogCiAJICBFeHRlbmRlZCBtYXRjaGVzIGFyZSBzbWFsbCBjbGFzc2lmaWNhdGlvbiBoZWxwZXJzIG5vdCB3b3J0aCB3cml0aW5nCi0JICBhIHNlcGFyYXRlIGNsYXNzaWZpZXIuCisJICBhIHNlcGFyYXRlIGNsYXNzaWZpZXIgZm9yLgogCi0JICBZb3UgbXVzdCBoYXZlIGEgcmVjZW50IHZlcnNpb24gb2YgdGhlIGlwcm91dGUyIHRvb2xzIGluIG9yZGVyIHRvIHVzZQorCSAgQSByZWNlbnQgdmVyc2lvbiBvZiB0aGUgaXByb3V0ZTIgcGFja2FnZSBpcyByZXF1aXJlZCB0byB1c2UKIAkgIGV4dGVuZGVkIG1hdGNoZXMuCiAKIGNvbmZpZyBORVRfRU1BVENIX1NUQUNLCkBAIC00NjgsNyArNDIwLDcgQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlbV9uYnl0ZS4KIAogY29uZmlnIE5FVF9FTUFUQ0hfVTMyCi0JdHJpc3RhdGUgIlUzMiBoYXNoaW5nIGtleSIKKwl0cmlzdGF0ZSAiVTMyIGtleSIKIAlkZXBlbmRzIG9uIE5FVF9FTUFUQ0gKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gY2xhc3NpZnkgcGFja2V0cyB1c2luZwpAQCAtNDk2LDc2ICs0NDgsMTIwIEBACiAJc2VsZWN0IFRFWFRTRUFSQ0hfQk0KIAlzZWxlY3QgVEVYVFNFQVJDSF9GU00KIAktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibHQgdG8gY2xhc3NpZnkgcGFja2V0cyBiYXNlZCBvbgorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGNsYXNzaWZ5IHBhY2tldHMgYmFzZWQgb24KIAkgIHRleHRzZWFyY2ggY29tcGFyaXNvbnMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlbV90ZXh0LgogCiBjb25maWcgTkVUX0NMU19BQ1QKLQlib29sICJQYWNrZXQgQUNUSU9OIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5FVF9DTFMgJiYgTkVUX1FPUworCWJvb2wgIkFjdGlvbnMiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkVUX1NDSEVECisJc2VsZWN0IE5FVF9FU1RJTUFUT1IKIAktLS1oZWxwLS0tCi0JVGhpcyBvcHRpb24gcmVxdWlyZXMgeW91IGhhdmUgYSBuZXcgaXByb3V0ZTIuIEl0IGVuYWJsZXMKLQl0YyBleHRlbnNpb25zIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGMgY2xhc3NpZmllcnMuCi0JICBZb3UgTVVTVCBOT1QgdHVybiB0aGlzIG9uIGlmIHlvdSBkb250IGhhdmUgYW4gdXBkYXRlIGlwcm91dGUyLgorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdHJhZmZpYyBjb250cm9sIGFjdGlvbnMuIEFjdGlvbnMKKwkgIGdldCBhdHRhY2hlZCB0byBjbGFzc2lmaWVycyBhbmQgYXJlIGludm9rZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsCisJICBjbGFzc2lmaWNhdGlvbi4gVGhleSBhcmUgdXNlZCB0byBvdmVyd3JpdGUgdGhlIGNsYXNzaWZpY2F0aW9uCisJICByZXN1bHQsIGluc3RhbnRseSBkcm9wIG9yIHJlZGlyZWN0IHBhY2tldHMsIGV0Yy4KKworCSAgQSByZWNlbnQgdmVyc2lvbiBvZiB0aGUgaXByb3V0ZTIgcGFja2FnZSBpcyByZXF1aXJlZCB0byB1c2UKKwkgIGV4dGVuZGVkIG1hdGNoZXMuCiAKIGNvbmZpZyBORVRfQUNUX1BPTElDRQotCXRyaXN0YXRlICJQb2xpY2luZyBBY3Rpb25zIgorCXRyaXN0YXRlICJUcmFmZmljIFBvbGljaW5nIgogICAgICAgICBkZXBlbmRzIG9uIE5FVF9DTFNfQUNUIAogICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgIElmIHlvdSBhcmUgdXNpbmcgYSBuZXdlciBpcHJvdXRlMiBzZWxlY3QgdGhpcyBvbmUsIG90aGVyd2lzZSB1c2Ugb25lCi0JYmVsb3cgdG8gc2VsZWN0IGEgcG9saWNlci4KLQkgIFlvdSBNVVNUIE5PVCB0dXJuIHRoaXMgb24gaWYgeW91IGRvbnQgaGF2ZSBhbiB1cGRhdGUgaXByb3V0ZTIuCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGRvIHRyYWZmaWMgcG9saWNpbmcsIGkuZS4gc3RyaWN0CisJICBiYW5kd2lkdGggbGltaXRpbmcuIFRoaXMgYWN0aW9uIHJlcGxhY2VzIHRoZSBleGlzdGluZyBwb2xpY2luZworCSAgbW9kdWxlLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcG9saWNlLgogCiBjb25maWcgTkVUX0FDVF9HQUNUCi0gICAgICAgIHRyaXN0YXRlICJnZW5lcmljIEFjdGlvbnMiCisgICAgICAgIHRyaXN0YXRlICJHZW5lcmljIGFjdGlvbnMiCiAgICAgICAgIGRlcGVuZHMgb24gTkVUX0NMU19BQ1QKICAgICAgICAgLS0taGVscC0tLQotICAgICAgICBZb3UgbXVzdCBoYXZlIG5ldyBpcHJvdXRlMiB0byB1c2UgdGhpcyBmZWF0dXJlLgotICAgICAgICBUaGlzIGFkZHMgc2ltcGxlIGZpbHRlcmluZyBhY3Rpb25zIGxpa2UgZHJvcCwgYWNjZXB0IGV0Yy4KKwkgIFNheSBZIGhlcmUgdG8gdGFrZSBnZW5lcmljIGFjdGlvbnMgc3VjaCBhcyBkcm9wcGluZyBhbmQKKwkgIGFjY2VwdGluZyBwYWNrZXRzLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ2FjdC4KIAogY29uZmlnIEdBQ1RfUFJPQgotICAgICAgICBib29sICJnZW5lcmljIEFjdGlvbnMgcHJvYmFiaWxpdHkiCisgICAgICAgIGJvb2wgIlByb2JhYmlsaXR5IHN1cHBvcnQiCiAgICAgICAgIGRlcGVuZHMgb24gTkVUX0FDVF9HQUNUCiAgICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgQWxsb3dzIGdlbmVyaWMgYWN0aW9ucyB0byBiZSByYW5kb21seSBvciBkZXRlcm1pbmlzdGljYWxseSB1c2VkLgorCSAgU2F5IFkgaGVyZSB0byB1c2UgdGhlIGdlbmVyaWMgYWN0aW9uIHJhbmRvbWx5IG9yIGRldGVybWluaXN0aWNhbGx5LgogCiBjb25maWcgTkVUX0FDVF9NSVJSRUQKLSAgICAgICAgdHJpc3RhdGUgIlBhY2tldCBJbi9FZ3Jlc3MgcmVkaXJlY3Rvbi9taXJyb3IgQWN0aW9ucyIKKyAgICAgICAgdHJpc3RhdGUgIlJlZGlyZWN0aW5nIGFuZCBNaXJyb3JpbmciCiAgICAgICAgIGRlcGVuZHMgb24gTkVUX0NMU19BQ1QKICAgICAgICAgLS0taGVscC0tLQotICAgICAgICByZXF1aXJlcyBuZXcgaXByb3V0ZTIKLSAgICAgICAgVGhpcyBhbGxvd3MgcGFja2V0cyB0byBiZSBtaXJyb3JlZCBvciByZWRpcmVjdGVkIHRvIG5ldGRldmljZXMKKwkgIFNheSBZIGhlcmUgdG8gYWxsb3cgcGFja2V0cyB0byBiZSBtaXJyb3JlZCBvciByZWRpcmVjdGVkIHRvCisJICBvdGhlciBkZXZpY2VzLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWlycmVkLgogCiBjb25maWcgTkVUX0FDVF9JUFQKLSAgICAgICAgdHJpc3RhdGUgImlwdGFibGVzIEFjdGlvbnMiCisgICAgICAgIHRyaXN0YXRlICJJUHRhYmxlcyB0YXJnZXRzIgogICAgICAgICBkZXBlbmRzIG9uIE5FVF9DTFNfQUNUICYmIE5FVEZJTFRFUiAmJiBJUF9ORl9JUFRBQkxFUwogICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgIHJlcXVpcmVzIG5ldyBpcHJvdXRlMgotICAgICAgICBUaGlzIGFsbG93cyBpcHRhYmxlcyB0YXJnZXRzIHRvIGJlIHVzZWQgYnkgdGMgZmlsdGVycworCSAgU2F5IFkgaGVyZSB0byBiZSBhYmxlIHRvIGludm9rZSBpcHRhYmxlcyB0YXJnZXRzIGFmdGVyIHN1Y2Nlc2Z1bAorCSAgY2xhc3NpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHQuCiAKIGNvbmZpZyBORVRfQUNUX1BFRElUCi0gICAgICAgIHRyaXN0YXRlICJHZW5lcmljIFBhY2tldCBFZGl0b3IgQWN0aW9ucyIKKyAgICAgICAgdHJpc3RhdGUgIlBhY2tldCBFZGl0aW5nIgogICAgICAgICBkZXBlbmRzIG9uIE5FVF9DTFNfQUNUCiAgICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgcmVxdWlyZXMgbmV3IGlwcm91dGUyCi0gICAgICAgIFRoaXMgYWxsb3dzIGZvciBwYWNrZXRzIHRvIGJlIGdlbmVyaWNhbGx5IGVkaXRlZAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBtYW5nbGUgdGhlIGNvbnRlbnQgb2YgcGFja2V0cy4KIAotY29uZmlnIE5FVF9DTFNfUE9MSUNFCi0JYm9vbCAiVHJhZmZpYyBwb2xpY2luZyAobmVlZGVkIGZvciBpbi9lZ3Jlc3MpIgotCWRlcGVuZHMgb24gTkVUX0NMUyAmJiBORVRfUU9TICYmIE5FVF9DTFNfQUNUIT15Ci0JaGVscAotCSAgU2F5IFkgdG8gc3VwcG9ydCB0cmFmZmljIHBvbGljaW5nIChiYW5kd2lkdGggbGltaXRzKS4gIE5lZWRlZCBmb3IKLQkgIGluZ3Jlc3MgYW5kIGVncmVzcyByYXRlIGxpbWl0aW5nLgorCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBlZGl0LgogCiBjb25maWcgTkVUX0FDVF9TSU1QCi0gICAgICAgIHRyaXN0YXRlICJTaW1wbGUgYWN0aW9uIgorICAgICAgICB0cmlzdGF0ZSAiU2ltcGxlIEV4YW1wbGUgKERlYnVnKSIKICAgICAgICAgZGVwZW5kcyBvbiBORVRfQ0xTX0FDVAogICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgIFlvdSBtdXN0IGhhdmUgbmV3IGlwcm91dGUyIHRvIHVzZSB0aGlzIGZlYXR1cmUuCi0gICAgICAgIFRoaXMgYWRkcyBhIHZlcnkgc2ltcGxlIGFjdGlvbiBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcwotCVRoZSBpZGVhIGlzIHRvIGdpdmUgYWN0aW9uIGF1dGhvcnMgYSBiYXNpYyBleGFtcGxlIHRvIGxvb2sgYXQuCi0JQWxsIHRoaXMgYWN0aW9uIHdpbGwgZG8gaXMgcHJpbnQgb24gdGhlIGNvbnNvbGUgdGhlIGNvbmZpZ3VyZWQKLQlwb2xpY3kgc3RyaW5nIGZvbGxvd2VkIGJ5IF8gdGhlbiBwYWNrZXQgY291bnQuCisJICBTYXkgWSBoZXJlIHRvIGFkZCBhIHNpbXBsZSBhY3Rpb24gZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMuCisJICBJdCBpcyBtZWFudCBhcyBhbiBleGFtcGxlIGFuZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBJdCB3aWxsCisJICBwcmludCBhIGNvbmZpZ3VyZWQgcG9saWN5IHN0cmluZyBmb2xsb3dlZCBieSB0aGUgcGFja2V0IGNvdW50CisJICB0byB0aGUgY29uc29sZSBmb3IgZXZlcnkgcGFja2V0IHRoYXQgcGFzc2VzIGJ5LgogCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2ltcGxlLgorCitjb25maWcgTkVUX0NMU19QT0xJQ0UKKwlib29sICJUcmFmZmljIFBvbGljaW5nIChvYnNvbGV0ZSkiCisJZGVwZW5kcyBvbiBORVRfU0NIRUQgJiYgTkVUX0NMU19BQ1QhPXkKKwlzZWxlY3QgTkVUX0VTVElNQVRPUgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZG8gdHJhZmZpYyBwb2xpY2luZywgaS5lLiBzdHJpY3QKKwkgIGJhbmR3aWR0aCBsaW1pdGluZy4gVGhpcyBvcHRpb24gaXMgb2Jzb2xldGVkIGJ5IHRoZSB0cmFmZmljCisJICBwb2xpY2VyIGltcGxlbWVudGVkIGFzIGFjdGlvbiwgaXQgc3RheXMgaGVyZSBmb3IgY29tcGF0aWJpbGl0eQorCSAgcmVhc29ucy4KKworY29uZmlnIE5FVF9DTFNfSU5ECisJYm9vbCAiSW5jb21pbmcgZGV2aWNlIGNsYXNzaWZpY2F0aW9uIgorCWRlcGVuZHMgb24gTkVUX1NDSEVEICYmIChORVRfQ0xTX1UzMiB8fCBORVRfQ0xTX0ZXKQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gZXh0ZW5kIHRoZSB1MzIgYW5kIGZ3IGNsYXNzaWZpZXIgdG8gc3VwcG9ydAorCSAgY2xhc3NpZmljYXRpb24gYmFzZWQgb24gdGhlIGluY29taW5nIGRldmljZS4gVGhpcyBvcHRpb24gaXMKKwkgIGxpa2VseSB0byBkaXNhcHBlYXIgaW4gZmF2b3VyIG9mIHRoZSBtZXRhZGF0YSBlbWF0Y2guCisKK2NvbmZpZyBORVRfRVNUSU1BVE9SCisJYm9vbCAiUmF0ZSBlc3RpbWF0b3IiCisJZGVwZW5kcyBvbiBORVRfU0NIRUQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIHRvIGFsbG93IHVzaW5nIHJhdGUgZXN0aW1hdG9ycyB0byBlc3RpbWF0ZSB0aGUgY3VycmVudAorCSAgcmF0ZS1vZi1mbG93IGZvciBuZXR3b3JrIGRldmljZXMsIHF1ZXVlcywgZXRjLiBUaGlzIG1vZHVsZSBpcworCSAgYXV0b21hdGljYWx5IHNlbGVjdGVkIGlmIG5lZWRlZCBidXQgY2FuIGJlIHNlbGVjdGVkIG1hbnVhbGx5IGZvcgorCSAgc3RhdHN0aWNhbCBwdXJwb3Nlcy4KKworZW5kbWVudQo=