ZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlLy5naXRpZ25vcmUgYi9saWJvc21vY29yZS8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjFjZGM1Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYWtlZmlsZQotTWFrZWZpbGUuaW4KLS5kZXBzCi0ubGlicwotKi5vCi0qLmxvCi0qLmxhCi0qLnBjCi1hY2xvY2FsLm00Ci1hdXRvbTR0ZS5jYWNoZQotY29uZmlnLmgqCi1jb25maWcuc3ViCi1jb25maWcubG9nCi1jb25maWcuc3RhdHVzCi1jb25maWcuZ3Vlc3MKLWNvbmZpZ3VyZQotZGVwY29tcAotbWlzc2luZwotbHRtYWluLnNoCi1pbnN0YWxsLXNoCi1zdGFtcC1oMQotbGlidG9vbAotCi0udGFyYmFsbC12ZXJzaW9uCi0udmVyc2lvbgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvQ09QWUlORyBiL2xpYm9zbW9jb3JlL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTE5MDUuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZGY1MDIuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1BVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiBkaXN0LWJ6aXAyIDEuNgotQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQKLQotSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKLVNVQkRJUlMgPSBpbmNsdWRlIHNyYyB0ZXN0cwotCi1wa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCi1wa2djb25maWdfREFUQSA9IGxpYm9zbW9jb3JlLnBjCi0KLUJVSUxUX1NPVVJDRVMgPSAkKHRvcF9zcmNkaXIpLy52ZXJzaW9uCi0kKHRvcF9zcmNkaXIpLy52ZXJzaW9uOgotCWVjaG8gJChWRVJTSU9OKSA+ICRALXQgJiYgbXYgJEAtdCAkQAotZGlzdC1ob29rOgotCWVjaG8gJChWRVJTSU9OKSA+ICQoZGlzdGRpcikvLnRhcmJhbGwtdmVyc2lvbgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvY29uZmlndXJlLmluIGIvbGlib3Ntb2NvcmUvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc5ZWJjLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLUFDX0lOSVQoW2xpYm9zbW9jb3JlXSwKLQltNF9lc3lzY21kKFsuL2dpdC12ZXJzaW9uLWdlbiAudGFyYmFsbC12ZXJzaW9uXSksCi0JW29wZW5ic2MtZGV2ZWxAbGlzdHMub3BlbmJzYy5vcmddKQotCi1BTV9JTklUX0FVVE9NQUtFKFtkaXN0LWJ6aXAyXSkKLQotZG5sIGtlcm5lbCBzdHlsZSBjb21waWxlIG1lc3NhZ2VzCi1tNF9pZmRlZihbQU1fU0lMRU5UX1JVTEVTXSwgW0FNX1NJTEVOVF9SVUxFUyhbeWVzXSldKQotCi1kbmwgY2hlY2tzIGZvciBwcm9ncmFtcwotQUNfUFJPR19NQUtFX1NFVAotQUNfUFJPR19DQwotQUNfUFJPR19JTlNUQUxMCi1MVF9JTklUCi1BQ19QUk9HX0xJQlRPT0wKLQotQUNfQ09ORklHX01BQ1JPX0RJUihbbTRdKQotCi1kbmwgY2hlY2tzIGZvciBoZWFkZXIgZmlsZXMKLUFDX0hFQURFUl9TVERDCi1BQ19DSEVDS19IRUFERVJTKGV4ZWNpbmZvLmggc3lzL3NlbGVjdC5oKQotCi0jIFRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0YWtlbiBmcm9tIFdlYktpdCdzIHdlYmtpdC5tNAotc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4gIgotQUNfTVNHX0NIRUNLSU5HKFtpZiAke0NDfSBzdXBwb3J0cyAtZnZpc2liaWxpdHk9aGlkZGVuXSkKLUFDX0NPTVBJTEVfSUZFTFNFKFtjaGFyIGZvbztdLAotICAgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQotICAgICAgICBTWU1CT0xfVklTSUJJTElUWT0iLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAotICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pKQotQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgotQUNfU1VCU1QoU1lNQk9MX1ZJU0lCSUxJVFkpCi0KLWRubCBHZW5lcmF0ZSB0aGUgb3V0cHV0Ci1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oKQotCi1BQ19BUkdfRU5BQkxFKHRhbGxvYywKLQlbICAtLWRpc2FibGUtdGFsbG9jIERpc2FibGUgYnVpbGRpbmcgdGFsbG9jIG1lbW9yeSBhbGxvY2F0b3IgXSwKLQlbZW5hYmxlX3RhbGxvYz0wXSwgW2VuYWJsZV90YWxsb2M9MV0pCi1BTV9DT05ESVRJT05BTChFTkFCTEVfVEFMTE9DLCB0ZXN0ICJ4JGVuYWJsZV90YWxsb2MiID0gIngxIikKLQotQUNfQVJHX0VOQUJMRSh0ZXN0cywKLQlbICAtLWRpc2FibGUtdGVzdHMgRGlzYWJsZSBidWlsZGluZyB0ZXN0IHByb2dyYW1zIF0sCi0JW2VuYWJsZV90ZXN0cz0wXSwgW2VuYWJsZV90ZXN0cz0xXSkKLUFNX0NPTkRJVElPTkFMKEVOQUJMRV9URVNUUywgdGVzdCAieCRlbmFibGVfdGVzdHMiID0gIngxIikKLQotQUNfT1VUUFVUKAotCWxpYm9zbW9jb3JlLnBjCi0JaW5jbHVkZS9vc21vY29yZS9NYWtlZmlsZQotCWluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUKLQlpbmNsdWRlL01ha2VmaWxlCi0Jc3JjL01ha2VmaWxlCi0JdGVzdHMvTWFrZWZpbGUKLQl0ZXN0cy90aW1lci9NYWtlZmlsZQotCXRlc3RzL3Ntcy9NYWtlZmlsZQotCU1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvZ2l0LXZlcnNpb24tZ2VuIGIvbGlib3Ntb2NvcmUvZ2l0LXZlcnNpb24tZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MmNmM2QyLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2dpdC12ZXJzaW9uLWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIS9iaW4vc2gKLSMgUHJpbnQgYSB2ZXJzaW9uIHN0cmluZy4KLXNjcmlwdHZlcnNpb249MjAxMC0wMS0yOC4wMQotCi0jIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotIyBUaGlzIHNjcmlwdCBpcyBkZXJpdmVkIGZyb20gR0lULVZFUlNJT04tR0VOIGZyb20gR0lUOiBodHRwOi8vZ2l0Lm9yLmN6Ly4KLSMgSXQgbWF5IGJlIHJ1biB0d28gd2F5czoKLSMgLSBmcm9tIGEgZ2l0IHJlcG9zaXRvcnkgaW4gd2hpY2ggdGhlICJnaXQgZGVzY3JpYmUiIGNvbW1hbmQgYmVsb3cKLSMgICBwcm9kdWNlcyB1c2VmdWwgb3V0cHV0ICh0aHVzIHJlcXVpcmluZyBhdCBsZWFzdCBvbmUgc2lnbmVkIHRhZykKLSMgLSBmcm9tIGEgbm9uLWdpdC1yZXBvIGRpcmVjdG9yeSBjb250YWluaW5nIGEgLnRhcmJhbGwtdmVyc2lvbiBmaWxlLCB3aGljaAotIyAgIHByZXN1bWVzIHRoaXMgc2NyaXB0IGlzIGludm9rZWQgbGlrZSAiLi9naXQtdmVyc2lvbi1nZW4gLnRhcmJhbGwtdmVyc2lvbiIuCi0KLSMgSW4gb3JkZXIgdG8gdXNlIGludHJhLXZlcnNpb24gc3RyaW5ncyBpbiB5b3VyIHByb2plY3QsIHlvdSB3aWxsIG5lZWQgdHdvCi0jIHNlcGFyYXRlIGdlbmVyYXRlZCB2ZXJzaW9uIHN0cmluZyBmaWxlczoKLSMKLSMgLnRhcmJhbGwtdmVyc2lvbiAtIHByZXNlbnQgb25seSBpbiBhIGRpc3RyaWJ1dGlvbiB0YXJiYWxsLCBhbmQgbm90IGluCi0jICAgYSBjaGVja2VkLW91dCByZXBvc2l0b3J5LiAgQ3JlYXRlZCB3aXRoIGNvbnRlbnRzIHRoYXQgd2VyZSBsZWFybmVkIGF0Ci0jICAgdGhlIGxhc3QgdGltZSBhdXRvY29uZiB3YXMgcnVuLCBhbmQgdXNlZCBieSBnaXQtdmVyc2lvbi1nZW4uICBNdXN0IG5vdAotIyAgIGJlIHByZXNlbnQgaW4gZWl0aGVyICQoc3JjZGlyKSBvciAkKGJ1aWxkZGlyKSBmb3IgZ2l0LXZlcnNpb24tZ2VuIHRvCi0jICAgZ2l2ZSBhY2N1cmF0ZSBhbnN3ZXJzIGR1cmluZyBub3JtYWwgZGV2ZWxvcG1lbnQgd2l0aCBhIGNoZWNrZWQgb3V0IHRyZWUsCi0jICAgYnV0IG11c3QgYmUgcHJlc2VudCBpbiBhIHRhcmJhbGwgd2hlbiB0aGVyZSBpcyBubyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLgotIyAgIFRoZXJlZm9yZSwgaXQgY2Fubm90IGJlIHVzZWQgaW4gYW55IGRlcGVuZGVuY2llcy4gIEdOVW1ha2VmaWxlIGhhcwotIyAgIGhvb2tzIHRvIGZvcmNlIGEgcmVjb25maWd1cmUgYXQgZGlzdHJpYnV0aW9uIHRpbWUgdG8gZ2V0IHRoZSB2YWx1ZQotIyAgIGNvcnJlY3QsIHdpdGhvdXQgcGVuYWxpemluZyBub3JtYWwgZGV2ZWxvcG1lbnQgd2l0aCBleHRyYSByZWNvbmZpZ3VyZXMuCi0jCi0jIC52ZXJzaW9uIC0gcHJlc2VudCBpbiBhIGNoZWNrZWQtb3V0IHJlcG9zaXRvcnkgYW5kIGluIGEgZGlzdHJpYnV0aW9uCi0jICAgdGFyYmFsbC4gIFVzYWJsZSBpbiBkZXBlbmRlbmNpZXMsIHBhcnRpY3VsYXJseSBmb3IgZmlsZXMgdGhhdCBkb24ndAotIyAgIHdhbnQgdG8gZGVwZW5kIG9uIGNvbmZpZy5oIGJ1dCBkbyB3YW50IHRvIHRyYWNrIHZlcnNpb24gY2hhbmdlcy4KLSMgICBEZWxldGUgdGhpcyBmaWxlIHByaW9yIHRvIGFueSBhdXRvY29uZiBydW4gd2hlcmUgeW91IHdhbnQgdG8gcmVidWlsZAotIyAgIGZpbGVzIHRvIHBpY2sgdXAgYSB2ZXJzaW9uIHN0cmluZyBjaGFuZ2U7IGFuZCBsZWF2ZSBpdCBzdGFsZSB0bwotIyAgIG1pbmltaXplIHJlYnVpbGQgdGltZSBhZnRlciB1bnJlbGF0ZWQgY2hhbmdlcyB0byBjb25maWd1cmUgc291cmNlcy4KLSMKLSMgSXQgaXMgcHJvYmFibHkgd2lzZSB0byBhZGQgdGhlc2UgdHdvIGZpbGVzIHRvIC5naXRpZ25vcmUsIHNvIHRoYXQgeW91Ci0jIGRvbid0IGFjY2lkZW50YWxseSBjb21taXQgZWl0aGVyIGdlbmVyYXRlZCBmaWxlLgotIwotIyBVc2UgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgY29uZmlndXJlLmFjLCBzbyB0aGF0ICQoVkVSU0lPTikgd2lsbAotIyBhdXRvbWF0aWNhbGx5IGJlIHVwLXRvLWRhdGUgZWFjaCB0aW1lIGNvbmZpZ3VyZSBpcyBydW4gKGFuZCBub3RlIHRoYXQKLSMgc2luY2UgY29uZmlndXJlLmFjIG5vIGxvbmdlciBpbmNsdWRlcyBhIHZlcnNpb24gc3RyaW5nLCBNYWtlZmlsZSBydWxlcwotIyBzaG91bGQgbm90IGRlcGVuZCBvbiBjb25maWd1cmUuYWMgZm9yIHZlcnNpb24gdXBkYXRlcykuCi0jCi0jIEFDX0lOSVQoW0dOVSBwcm9qZWN0XSwKLSMgICAgICAgICBtNF9lc3lzY21kKFtidWlsZC1hdXgvZ2l0LXZlcnNpb24tZ2VuIC50YXJiYWxsLXZlcnNpb25dKSwKLSMgICAgICAgICBbYnVnLXByb2plY3RAZXhhbXBsZV0pCi0jCi0jIFRoZW4gdXNlIHRoZSBmb2xsb3dpbmcgbGluZXMgaW4geW91ciBNYWtlZmlsZS5hbSwgc28gdGhhdCAudmVyc2lvbgotIyB3aWxsIGJlIHByZXNlbnQgZm9yIGRlcGVuZGVuY2llcywgYW5kIHNvIHRoYXQgLnRhcmJhbGwtdmVyc2lvbiB3aWxsCi0jIGV4aXN0IGluIGRpc3RyaWJ1dGlvbiB0YXJiYWxscy4KLSMKLSMgQlVJTFRfU09VUkNFUyA9ICQodG9wX3NyY2RpcikvLnZlcnNpb24KLSMgJCh0b3Bfc3JjZGlyKS8udmVyc2lvbjoKLSMJZWNobyAkKFZFUlNJT04pID4gJEAtdCAmJiBtdiAkQC10ICRACi0jIGRpc3QtaG9vazoKLSMJZWNobyAkKFZFUlNJT04pID4gJChkaXN0ZGlyKS8udGFyYmFsbC12ZXJzaW9uCi0KLWNhc2UgJCMgaW4KLSAgICAxKSA7OwotICAgICopIGVjaG8gMT4mMiAiVXNhZ2U6ICQwIFwkc3JjZGlyLy50YXJiYWxsLXZlcnNpb24iOyBleGl0IDE7OwotZXNhYwotCi10YXJiYWxsX3ZlcnNpb25fZmlsZT0kMQotbmw9JwotJwotCi0jIEZpcnN0IHNlZSBpZiB0aGVyZSBpcyBhIHRhcmJhbGwtb25seSB2ZXJzaW9uIGZpbGUuCi0jIHRoZW4gdHJ5ICJnaXQgZGVzY3JpYmUiLCB0aGVuIGRlZmF1bHQuCi1pZiB0ZXN0IC1mICR0YXJiYWxsX3ZlcnNpb25fZmlsZQotdGhlbgotICAgIHY9YGNhdCAkdGFyYmFsbF92ZXJzaW9uX2ZpbGVgIHx8IGV4aXQgMQotICAgIGNhc2UgJHYgaW4KLQkqJG5sKikgdj0gOzsgIyByZWplY3QgbXVsdGktbGluZSBvdXRwdXQKLQlbMC05XSopIDs7Ci0JKikgdj0gOzsKLSAgICBlc2FjCi0gICAgdGVzdCAteiAiJHYiIFwKLQkmJiBlY2hvICIkMDogV0FSTklORzogJHRhcmJhbGxfdmVyc2lvbl9maWxlIHNlZW1zIHRvIGJlIGRhbWFnZWQiIDE+JjIKLWZpCi0KLWlmIHRlc3QgLW4gIiR2IgotdGhlbgotICAgIDogIyB1c2UgJHYKLWVsaWYKLSAgICAgICB2PWBnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCAtLW1hdGNoPSd2KicgSEVBRCAyPi9kZXYvbnVsbCBcCi0JICB8fCBnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsYCBcCi0gICAgJiYgY2FzZSAkdiBpbgotCSBbMC05XSopIDs7Ci0JIHZbMC05XSopIDs7Ci0JICopIChleGl0IDEpIDs7Ci0gICAgICAgZXNhYwotdGhlbgotICAgICMgSXMgdGhpcyBhIG5ldyBnaXQgdGhhdCBsaXN0cyBudW1iZXIgb2YgY29tbWl0cyBzaW5jZSB0aGUgbGFzdAotICAgICMgdGFnIG9yIHRoZSBwcmV2aW91cyBvbGRlciB2ZXJzaW9uIHRoYXQgZGlkIG5vdD8KLSAgICAjICAgTmV3ZXI6IHY2LjEwLTc3LWcwZjhmYWViCi0gICAgIyAgIE9sZGVyOiB2Ni4xMC1nMGY4ZmFlYgotICAgIGNhc2UgJHYgaW4KLQkqLSotKikgOiBnaXQgZGVzY3JpYmUgaXMgb2theSB0aHJlZSBwYXJ0IGZsYXZvciA7OwotCSotKikKLQkgICAgOiBnaXQgZGVzY3JpYmUgaXMgb2xkZXIgdHdvIHBhcnQgZmxhdm9yCi0JICAgICMgUmVjcmVhdGUgdGhlIG51bWJlciBvZiBjb21taXRzIGFuZCByZXdyaXRlIHN1Y2ggdGhhdCB0aGUKLQkgICAgIyByZXN1bHQgaXMgdGhlIHNhbWUgYXMgaWYgd2Ugd2VyZSB1c2luZyB0aGUgbmV3ZXIgdmVyc2lvbgotCSAgICAjIG9mIGdpdCBkZXNjcmliZS4KLQkgICAgdnRhZz1gZWNobyAiJHYiIHwgc2VkICdzLy0uKi8vJ2AKLQkgICAgbnVtY29tbWl0cz1gZ2l0IHJldi1saXN0ICIkdnRhZyIuLkhFQUQgfCB3YyAtbGAKLQkgICAgdj1gZWNobyAiJHYiIHwgc2VkICJzL1woLipcKS1cKC4qXCkvXDEtJG51bWNvbW1pdHMtXDIvImA7Ci0JICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBDaGFuZ2UgdGhlIGZpcnN0ICctJyB0byBhICcuJywgc28gdmVyc2lvbi1jb21wYXJpbmcgdG9vbHMgd29yayBwcm9wZXJseS4KLSAgICAjIFJlbW92ZSB0aGUgImciIGluIGdpdCBkZXNjcmliZSdzIG91dHB1dCBzdHJpbmcsIHRvIHNhdmUgYSBieXRlLgotICAgIHY9YGVjaG8gIiR2IiB8IHNlZCAncy8tLy4vO3MvXCguKlwpLWcvXDEtLydgOwotZWxzZQotICAgIHY9VU5LTk9XTgotZmkKLQotdj1gZWNobyAiJHYiIHxzZWQgJ3MvXnYvLydgCi0KLSMgRG9uJ3QgZGVjbGFyZSBhIHZlcnNpb24gImRpcnR5IiBtZXJlbHkgYmVjYXVzZSBhIHRpbWUgc3RhbXAgaGFzIGNoYW5nZWQuCi1naXQgc3RhdHVzID4gL2Rldi9udWxsIDI+JjEKLQotZGlydHk9YHNoIC1jICdnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEJyAyPi9kZXYvbnVsbGAgfHwgZGlydHk9Ci1jYXNlICIkZGlydHkiIGluCi0gICAgJycpIDs7Ci0gICAgKikgIyBBcHBlbmQgdGhlIHN1ZmZpeCBvbmx5IGlmIHRoZXJlIGlzbid0IG9uZSBhbHJlYWR5LgotCWNhc2UgJHYgaW4KLQkgICotZGlydHkpIDs7Ci0JICAqKSB2PSIkdi1kaXJ0eSIgOzsKLQllc2FjIDs7Ci1lc2FjCi0KLSMgT21pdCB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28gdGhhdCBtNF9lc3lzY21kIGNhbiB1c2UgdGhlIHJlc3VsdCBkaXJlY3RseS4KLWVjaG8gIiR2IiB8IHRyIC1kICdcMDEyJwotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9pbmNsdWRlL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDAxNWQ1Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1TVUJESVJTID0gb3Ntb2NvcmUKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRmMDg5Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1vc21vY29yZV9IRUFERVJTID0gc2lnbmFsLmggbGludXhsaXN0LmggdGltZXIuaCBzZWxlY3QuaCBtc2diLmggXAotCQkgICB0bHYuaCBiaXR2ZWMuaCBjb21wMTI4Lmggc3RhdGlzdGljcy5oIGdzbV91dGlscy5oIHV0aWxzLmggXAotCQkgICBnc210YXAuaCB3cml0ZV9xdWV1ZS5oIHJzbC5oIGdzbTQ4LmggcnhsZXZfc3RhdC5oIG1uY2MuaCBcCi0JCSAgIGdzbTQ4X2llLmgKLQotaWYgRU5BQkxFX1RBTExPQwotb3Ntb2NvcmVfSEVBREVSUyArPSB0YWxsb2MuaAotZW5kaWYKLQotb3Ntb2NvcmVkaXIgPSAkKGluY2x1ZGVkaXIpL29zbW9jb3JlCi0KLVNVQkRJUlMgPSBwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9iaXR2ZWMuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjZiY2UuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9iaXR2ZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSNpZm5kZWYgX0JJVFZFQ19ICi0jZGVmaW5lIF9CSVRWRUNfSAotCi0vKiBiaXQgdmVjdG9yIHV0aWxpdHkgcm91dGluZXMgKi8KLQotLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotCi0vKiBJbiBHU00gbWFjIGJsb2NrcywgZXZlcnkgYml0IGNhbiBiZSAwIG9yIDEsIG9yIEwgb3IgSC4gIEwvSCBhcmUKLSAqIGRlZmluZWQgcmVsYXRpdmUgdG8gdGhlIDB4MmIgcGFkZGluZyBwYXR0ZXJuICovCi1lbnVtIGJpdF92YWx1ZSB7Ci0JWkVSTwk9IDAsCi0JT05FCT0gMSwKLQlMCT0gMiwKLQlICT0gMywKLX07Ci0KLXN0cnVjdCBiaXR2ZWMgewotCXVuc2lnbmVkIGludCBjdXJfYml0OwkvKiBjdXJzZXIgdG8gdGhlIG5leHQgdW51c2VkIGJpdCAqLwotCXVuc2lnbmVkIGludCBkYXRhX2xlbjsJLyogbGVuZ3RoIG9mIGRhdGEgYXJyYXkgaW4gYnl0ZXMgKi8KLQl1aW50OF90ICpkYXRhOwkJLyogcG9pbnRlciB0byBkYXRhIGFycmF5ICovCi19OwotCi0vKiBjaGVjayBpZiB0aGUgYml0IGlzIDAgb3IgMSBmb3IgYSBnaXZlbiBwb3NpdGlvbiBpbnNpZGUgYSBiaXR2ZWMgKi8KLWVudW0gYml0X3ZhbHVlIGJpdHZlY19nZXRfYml0X3Bvcyhjb25zdCBzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IGJpdG5yKTsKLQotLyogZ2V0IHRoZSBOdGggc2V0IGJpdCBpbnNpZGUgdGhlIGJpdCB2ZWN0b3IgKi8KLXVuc2lnbmVkIGludCBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KGNvbnN0IHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgbik7Ci0KLS8qIFNldCBhIGJpdCBhdCBnaXZlbiBwb3NpdGlvbiAqLwotaW50IGJpdHZlY19zZXRfYml0X3BvcyhzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IGJpdG51bSwKLQkJCWVudW0gYml0X3ZhbHVlIGJpdCk7Ci0KLS8qIFNldCB0aGUgbmV4dCBiaXQgaW4gdGhlIHZlY3RvciAqLwotaW50IGJpdHZlY19zZXRfYml0KHN0cnVjdCBiaXR2ZWMgKmJ2LCBlbnVtIGJpdF92YWx1ZSBiaXQpOwotCi0vKiBTZXQgbXVsdGlwbGUgYml0cyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiAqLwotaW50IGJpdHZlY19zZXRfYml0cyhzdHJ1Y3QgYml0dmVjICpidiwgZW51bSBiaXRfdmFsdWUgKmJpdHMsIGludCBjb3VudCk7Ci0KLS8qIEFkZCBhbiB1bnNpZ25lZCBpbnRlZ2VyIChvZiBsZW5ndGggY291bnQgYml0cykgdG8gY3VycmVudCBwb3NpdGlvbiAqLwotaW50IGJpdHZlY19zZXRfdWludChzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IGluLCBpbnQgY291bnQpOwotCi0KLS8qIFBhZCB0aGUgYml0IHZlY3RvciB1cCB0byBhIGNlcnRhaW4gYml0IHBvc2l0aW9uICovCi1pbnQgYml0dmVjX3NwYXJlX3BhZGRpbmcoc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCB1cF90b19iaXQpOwotCi0jZW5kaWYgLyogX0JJVFZFQ19IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzc4MDhmLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENPTVAxMjggaGVhZGVyCi0gKgotICogU2VlIGNvbXAxMjguYyBmb3IgZGV0YWlscwotICovCi0KLSNpZm5kZWYgX19DT01QMTI4X0hfXwotI2RlZmluZSBfX0NPTVAxMjhfSF9fCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotLyoKLSAqIFBlcmZvcm1zIHRoZSBDT01QMTI4IGFsZ29yaXRobSAodXNlZCBhcyBBMy9BOCkKLSAqIGtpICAgIDogdWludDhfdCBbMTZdCi0gKiBzcmFuZCA6IHVpbnQ4X3QgWzE2XQotICogc3JlcyAgOiB1aW50OF90IFs0XQotICoga2MgICAgOiB1aW50OF90IFs4XQotICovCi12b2lkIGNvbXAxMjgodWludDhfdCAqa2ksIHVpbnQ4X3QgKnNyYW5kLCB1aW50OF90ICpzcmVzLCB1aW50OF90ICprYyk7Ci0KLSNlbmRpZiAvKiBfX0NPTVAxMjhfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5NjM1Ny4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaWZuZGVmIF9PU01PQ09SRV9HU000OF9ICi0KLSNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KLSNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaD4KLSNpbmNsdWRlIDxvc21vY29yZS9nc200OF9pZS5oPgotCi1leHRlcm4gY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIGdzbTQ4X2F0dF90bHZkZWY7Ci1jb25zdCBjaGFyICpnc200OF9jY19zdGF0ZV9uYW1lKHVpbnQ4X3Qgc3RhdGUpOwotY29uc3QgY2hhciAqZ3NtNDhfY2NfbXNnX25hbWUodWludDhfdCBtc2d0eXBlKTsKLWNvbnN0IGNoYXIgKnJyX2NhdXNlX25hbWUodWludDhfdCBjYXVzZSk7Ci0KLXZvaWQgZ3NtNDhfZ2VuZXJhdGVfbGFpKHN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqbGFpNDgsIHVpbnQxNl90IG1jYywKLQkJCXVpbnQxNl90IG1uYywgdWludDE2X3QgbGFjKTsKLWludCBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgdG1zaSk7Ci1pbnQgZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaSh1aW50OF90ICpidWYsIGNvbnN0IGNoYXIgKmltc2kpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwNjE5YS4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4X2llLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotI2lmbmRlZiBfT1NNT0NPUkVfR1NNNDhfSUVfSAotI2RlZmluZSBfT1NNT0NPUkVfR1NNNDhfSUVfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KLSNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KLSNpbmNsdWRlIDxvc21vY29yZS9tbmNjLmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+Ci0KLS8qIGRlY29kZSBhICdjYWxsZWQvY2FsbGluZy9jb25uZWN0IHBhcnR5IEJDRCBudW1iZXInIGFzIGluIDEwLjUuNC43ICovCi1pbnQgZ3NtNDhfZGVjb2RlX2JjZF9udW1iZXIoY2hhciAqb3V0cHV0LCBpbnQgb3V0cHV0X2xlbiwKLQkJCSAgICBjb25zdCB1aW50OF90ICpiY2RfbHYsIGludCBoX2xlbik7Ci0KLS8qIGNvbnZlcnQgYSBBU0NJSSBwaG9uZSBudW1iZXIgdG8gJ2NhbGxlZC9jYWxsaW5nL2Nvbm5lY3QgcGFydHkgQkNEIG51bWJlcicgKi8KLWludCBnc200OF9lbmNvZGVfYmNkX251bWJlcih1aW50OF90ICpiY2RfbHYsIHVpbnQ4X3QgbWF4X2xlbiwKLQkJCSAgICBpbnQgaF9sZW4sIGNvbnN0IGNoYXIgKmlucHV0KTsKLS8qIGRlY29kZSAnYmVhcmVyIGNhcGFiaWxpdHknICovCi1pbnQgZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoc3RydWN0IGdzbV9tbmNjX2JlYXJlcl9jYXAgKmJjYXAsCi0JCQkgICAgIGNvbnN0IHVpbnQ4X3QgKmx2KTsKLS8qIGVuY29kZSAnYmVhcmVyIGNhcGFiaWxpdHknICovCi1pbnQgZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAoc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY19iZWFyZXJfY2FwICpiY2FwKTsKLS8qIGRlY29kZSAnY2FsbCBjb250cm9sIGNhcCcgKi8KLWludCBnc200OF9kZWNvZGVfY2NjYXAoc3RydWN0IGdzbV9tbmNjX2NjY2FwICpjY2FwLCBjb25zdCB1aW50OF90ICpsdik7Ci0vKiBlbmNvZGUgJ2NhbGwgY29udHJvbCBjYXAnICovCi1pbnQgZ3NtNDhfZW5jb2RlX2NjY2FwKHN0cnVjdCBtc2diICptc2csCi0JCQljb25zdCBzdHJ1Y3QgZ3NtX21uY2NfY2NjYXAgKmNjYXApOwotLyogZGVjb2RlICdjYWxsZWQgcGFydHkgQkNEIG51bWJlcicgKi8KLWludCBnc200OF9kZWNvZGVfY2FsbGVkKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlZCwKLQkJCSBjb25zdCB1aW50OF90ICpsdik7Ci0vKiBlbmNvZGUgJ2NhbGxlZCBwYXJ0eSBCQ0QgbnVtYmVyJyAqLwotaW50IGdzbTQ4X2VuY29kZV9jYWxsZWQoc3RydWN0IG1zZ2IgKm1zZywKLQkJCSBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsZWQpOwotLyogZGVjb2RlIGNhbGxlcmlkIG9mIHZhcmlvdXMgSUVzICovCi1pbnQgZ3NtNDhfZGVjb2RlX2NhbGxlcmlkKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlcmlkLAotCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KTsKLS8qIGVuY29kZSBjYWxsZXJpZCBvZiB2YXJpb3VzIElFcyAqLwotaW50IGdzbTQ4X2VuY29kZV9jYWxsZXJpZChzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgaWUsIGludCBtYXhfbGVuLAotCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGVyaWQpOwotLyogZGVjb2RlICdjYXVzZScgKi8KLWludCBnc200OF9kZWNvZGVfY2F1c2Uoc3RydWN0IGdzbV9tbmNjX2NhdXNlICpjYXVzZSwKLQkJCWNvbnN0IHVpbnQ4X3QgKmx2KTsKLS8qIGVuY29kZSAnY2F1c2UnICovCi1pbnQgZ3NtNDhfZW5jb2RlX2NhdXNlKHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAotCQkJY29uc3Qgc3RydWN0IGdzbV9tbmNjX2NhdXNlICpjYXVzZSk7Ci0vKiBkZWNvZGUgJ2NhbGxpbmcgbnVtYmVyJyAqLwotaW50IGdzbTQ4X2RlY29kZV9jYWxsaW5nKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxpbmcsCi0JCQkgY29uc3QgdWludDhfdCAqbHYpOwotLyogZW5jb2RlICdjYWxsaW5nIG51bWJlcicgKi8KLWludCBnc200OF9lbmNvZGVfY2FsbGluZyhzdHJ1Y3QgbXNnYiAqbXNnLCAKLQkJCSAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGluZyk7Ci0vKiBkZWNvZGUgJ2Nvbm5lY3RlZCBudW1iZXInICovCi1pbnQgZ3NtNDhfZGVjb2RlX2Nvbm5lY3RlZChzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjb25uZWN0ZWQsCi0JCQkgY29uc3QgdWludDhfdCAqbHYpOwotLyogZW5jb2RlICdjb25uZWN0ZWQgbnVtYmVyJyAqLwotaW50IGdzbTQ4X2VuY29kZV9jb25uZWN0ZWQoc3RydWN0IG1zZ2IgKm1zZywKLQkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjb25uZWN0ZWQpOwotLyogZGVjb2RlICdyZWRpcmVjdGluZyBudW1iZXInICovCi1pbnQgZ3NtNDhfZGVjb2RlX3JlZGlyZWN0aW5nKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKnJlZGlyZWN0aW5nLAotCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KTsKLS8qIGVuY29kZSAncmVkaXJlY3RpbmcgbnVtYmVyJyAqLwotaW50IGdzbTQ4X2VuY29kZV9yZWRpcmVjdGluZyhzdHJ1Y3QgbXNnYiAqbXNnLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX251bWJlciAqcmVkaXJlY3RpbmcpOwotLyogZGVjb2RlICdmYWNpbGl0eScgKi8KLWludCBnc200OF9kZWNvZGVfZmFjaWxpdHkoc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5ICpmYWNpbGl0eSwKLQkJCSAgIGNvbnN0IHVpbnQ4X3QgKmx2KTsKLS8qIGVuY29kZSAnZmFjaWxpdHknICovCi1pbnQgZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAotCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5ICpmYWNpbGl0eSk7Ci0vKiBkZWNvZGUgJ25vdGlmeScgKi8KLWludCBnc200OF9kZWNvZGVfbm90aWZ5KGludCAqbm90aWZ5LCBjb25zdCB1aW50OF90ICp2KTsKLS8qIGVuY29kZSAnbm90aWZ5JyAqLwotaW50IGdzbTQ4X2VuY29kZV9ub3RpZnkoc3RydWN0IG1zZ2IgKm1zZywgaW50IG5vdGlmeSk7Ci0vKiBkZWNvZGUgJ3NpZ25hbCcgKi8KLWludCBnc200OF9kZWNvZGVfc2lnbmFsKGludCAqc2lnbmFsLCBjb25zdCB1aW50OF90ICp2KTsKLS8qIGVuY29kZSAnc2lnbmFsJyAqLwotaW50IGdzbTQ4X2VuY29kZV9zaWduYWwoc3RydWN0IG1zZ2IgKm1zZywgaW50IHNpZ25hbCk7Ci0vKiBkZWNvZGUgJ2tleXBhZCcgKi8KLWludCBnc200OF9kZWNvZGVfa2V5cGFkKGludCAqa2V5cGFkLCBjb25zdCB1aW50OF90ICpsdik7Ci0vKiBlbmNvZGUgJ2tleXBhZCcgKi8KLWludCBnc200OF9lbmNvZGVfa2V5cGFkKHN0cnVjdCBtc2diICptc2csIGludCBrZXlwYWQpOwotLyogZGVjb2RlICdwcm9ncmVzcycgKi8KLWludCBnc200OF9kZWNvZGVfcHJvZ3Jlc3Moc3RydWN0IGdzbV9tbmNjX3Byb2dyZXNzICpwcm9ncmVzcywKLQkJCSAgIGNvbnN0IHVpbnQ4X3QgKmx2KTsKLS8qIGVuY29kZSAncHJvZ3Jlc3MnICovCi1pbnQgZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAotCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX3Byb2dyZXNzICpwKTsKLS8qIGRlY29kZSAndXNlci11c2VyJyAqLwotaW50IGdzbTQ4X2RlY29kZV91c2VydXNlcihzdHJ1Y3QgZ3NtX21uY2NfdXNlcnVzZXIgKnV1LAotCQkJICAgY29uc3QgdWludDhfdCAqbHYpOwotLyogZW5jb2RlICd1c2VydXNlcicgKi8KLWludCBnc200OF9lbmNvZGVfdXNlcnVzZXIoc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCi0JCQkgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfdXNlcnVzZXIgKnV1KTsKLS8qIGRlY29kZSAnc3MgdmVyc2lvbicgKi8KLWludCBnc200OF9kZWNvZGVfc3N2ZXJzaW9uKHN0cnVjdCBnc21fbW5jY19zc3ZlcnNpb24gKnNzdiwKLQkJCSAgICBjb25zdCB1aW50OF90ICpsdik7Ci0vKiBlbmNvZGUgJ3NzIHZlcnNpb24nICovCi1pbnQgZ3NtNDhfZW5jb2RlX3NzdmVyc2lvbihzdHJ1Y3QgbXNnYiAqbXNnLAotCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX3NzdmVyc2lvbiAqc3N2KTsKLS8qIGRlY29kZSAnbW9yZSBkYXRhJyBkb2VzIG5vdCByZXF1aXJlIGEgZnVuY3Rpb24sIGJlY2F1c2UgaXQgaGFzIG5vIHZhbHVlICovCi0vKiBlbmNvZGUgJ21vcmUgZGF0YScgKi8KLWludCBnc200OF9lbmNvZGVfbW9yZShzdHJ1Y3QgbXNnYiAqbXNnKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc21fdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3ZTk2Ny4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyogR1NNIHV0aWxpdHkgZnVuY3Rpb25zLCBlLmcuIGNvZGluZyBhbmQgZGVjb2RpbmcgKi8KLS8qCi0gKiAoQykgMjAwOCBieSBEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KLSAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KLSAqIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHU01fVVRJTFNfSAotI2RlZmluZSBHU01fVVRJTFNfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLXN0cnVjdCBnc21fdGltZSB7Ci0JdWludDMyX3QJZm47CS8qIEZOIGNvdW50ICovCi0JdWludDE2X3QJdDE7CS8qIEZOIGRpdiAoMjYqNTEpICovCi0JdWludDhfdAkJdDI7CS8qIEZOIG1vZHVsbyAyNiAqLwotCXVpbnQ4X3QJCXQzOwkvKiBGTiBtb2R1bG8gNTEgKi8KLQl1aW50OF90CQl0YzsKLX07Ci0KLWVudW0gZ3NtX2JhbmQgewotCUdTTV9CQU5EXzg1MAk9IDEsCi0JR1NNX0JBTkRfOTAwCT0gMiwKLQlHU01fQkFORF8xODAwCT0gNCwKLQlHU01fQkFORF8xOTAwCT0gOCwKLQlHU01fQkFORF80NTAJPSAweDEwLAotCUdTTV9CQU5EXzQ4MAk9IDB4MjAsCi0JR1NNX0JBTkRfNzUwCT0gMHg0MCwKLQlHU01fQkFORF84MTAJPSAweDgwLAotfTsKLQotY29uc3QgY2hhciAqZ3NtX2JhbmRfbmFtZShlbnVtIGdzbV9iYW5kIGJhbmQpOwotZW51bSBnc21fYmFuZCBnc21fYmFuZF9wYXJzZShjb25zdCBjaGFyICptaHopOwotCi1pbnQgZ3NtXzdiaXRfZGVjb2RlKGNoYXIgKmRlY29kZWQsIGNvbnN0IHVpbnQ4X3QgKnVzZXJfZGF0YSwgdWludDhfdCBsZW5ndGgpOwotaW50IGdzbV83Yml0X2VuY29kZSh1aW50OF90ICpyZXN1bHQsIGNvbnN0IGNoYXIgKmRhdGEpOwotCi1pbnQgbXNfcHdyX2N0bF9sdmwoZW51bSBnc21fYmFuZCBiYW5kLCB1bnNpZ25lZCBpbnQgZGJtKTsKLWludCBtc19wd3JfZGJtKGVudW0gZ3NtX2JhbmQgYmFuZCwgdWludDhfdCBsdmwpOwotCi0vKiBBY2NvcmRpbmcgdG8gVFMgMDguMDUgQ2hhcHRlciA4LjEuNCAqLwotaW50IHJ4bGV2MmRibSh1aW50OF90IHJ4bGV2KTsKLXVpbnQ4X3QgZGJtMnJ4bGV2KGludCBkYm0pOwotCi0vKiBBY2NvcmRpbmcgdG8gR1NNIDA0LjA4IENoYXB0ZXIgMTAuNS4yLjI5ICovCi1zdGF0aWMgaW5saW5lIGludCByYWNoX21heF90cmFuc192YWwycmF3KGludCB2YWwpIHsgcmV0dXJuICh2YWwgPj4gMSkgJiAzOyB9Ci1zdGF0aWMgaW5saW5lIGludCByYWNoX21heF90cmFuc19yYXcydmFsKGludCByYXcpIHsKLQljb25zdCBpbnQgdGJsWzRdID0geyAxLCAyLCA0LCA3IH07Ci0JcmV0dXJuIHRibFtyYXcgJiAzXTsKLX0KLQotI2RlZmluZQlBUkZDTl9QQ1MJMHg4MDAwCi0jZGVmaW5lCUFSRkNOX1VQTElOSwkweDQwMDAKLQotZW51bSBnc21fYmFuZCBnc21fYXJmY24yYmFuZCh1aW50MTZfdCBhcmZjbik7Ci0KLS8qIENvbnZlcnQgYW4gQVJGQ04gdG8gdGhlIGZyZXF1ZW5jeSBpbiBNSHogKiAxMCAqLwotdWludDE2X3QgZ3NtX2FyZmNuMmZyZXExMCh1aW50MTZfdCBhcmZjbiwgaW50IHVwbGluayk7Ci0KLS8qIENvbnZlcnQgZnJvbSBmcmFtZSBudW1iZXIgdG8gR1NNIHRpbWUgKi8KLXZvaWQgZ3NtX2ZuMmdzbXRpbWUoc3RydWN0IGdzbV90aW1lICp0aW1lLCB1aW50MzJfdCBmbik7Ci0KLS8qIENvbnZlcnQgZnJvbSBHU00gdGltZSB0byBmcmFtZSBudW1iZXIgKi8KLXVpbnQzMl90IGdzbV9nc210aW1lMmZuKHN0cnVjdCBnc21fdGltZSAqdGltZSk7Ci0KLXZvaWQgZ2VuZXJhdGVfYmFja3RyYWNlKCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtdGFwLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Q2NGJkLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtdGFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jaWZuZGVmIF9HU01UQVBfSAotI2RlZmluZSBfR1NNVEFQX0gKLQotLyogZ3NtdGFwIGhlYWRlciwgcHNldWRvLWhlYWRlciBpbiBmcm9udCBvZiB0aGUgYWN0dWEgR1NNIHBheWxvYWQgKi8KLQotLyogR1NNVEFQIGlzIGEgZ2VuZXJpYyBoZWFkZXIgZm9ybWF0IGZvciBHU00gcHJvdG9jb2wgY2FwdHVyZXMsCi0gKiBpdCB1c2VzIHRoZSBJQU5BLWFzc2lnbmVkIFVEUCBwb3J0IG51bWJlciA0NzI5IGFuZCBjYXJyaWVzCi0gKiBwYXlsb2FkIGluIHZhcmlvdXMgZm9ybWF0cyBvZiBHU00gaW50ZXJmYWNlcyBzdWNoIGFzIFVtIE1BQwotICogYmxvY2tzIG9yIFVtIGJ1cnN0cy4KLSAqCi0gKiBFeGFtcGxlIHByb2dyYW1zIGdlbmVyYXRpbmcgR1NNVEFQIGRhdGEgYXJlIGFpcnByb2JlCi0gKiAoaHR0cDovL2FpcnByb2JlLm9yZy8pIG9yIE9zbW9jb21CQiAoaHR0cDovL2JiLm9zbW9jb20ub3JnLykKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNkZWZpbmUgR1NNVEFQX1ZFUlNJT04JCTB4MDIKLQotI2RlZmluZSBHU01UQVBfVFlQRV9VTQkJMHgwMQotI2RlZmluZSBHU01UQVBfVFlQRV9BQklTCTB4MDIKLSNkZWZpbmUgR1NNVEFQX1RZUEVfVU1fQlVSU1QJMHgwMwkvKiByYXcgYnVyc3QgYml0cyAqLwotCi0jZGVmaW5lIEdTTVRBUF9CVVJTVF9VTktOT1dOCQkweDAwCi0jZGVmaW5lIEdTTVRBUF9CVVJTVF9GQ0NICQkweDAxCi0jZGVmaW5lIEdTTVRBUF9CVVJTVF9QQVJUSUFMX1NDSAkweDAyCi0jZGVmaW5lIEdTTVRBUF9CVVJTVF9TQ0gJCTB4MDMKLSNkZWZpbmUgR1NNVEFQX0JVUlNUX0NUU19TQ0gJCTB4MDQKLSNkZWZpbmUgR1NNVEFQX0JVUlNUX0NPTVBBQ1RfU0NICTB4MDUKLSNkZWZpbmUgR1NNVEFQX0JVUlNUX05PUk1BTAkJMHgwNgotI2RlZmluZSBHU01UQVBfQlVSU1RfRFVNTVkJCTB4MDcKLSNkZWZpbmUgR1NNVEFQX0JVUlNUX0FDQ0VTUwkJMHgwOAotI2RlZmluZSBHU01UQVBfQlVSU1RfTk9ORQkJMHgwOQotCi0jZGVmaW5lIEdTTVRBUF9DSEFOTkVMX1VOS05PV04JMHgwMAotI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9CQ0NICTB4MDEKLSNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfQ0NDSAkweDAyCi0jZGVmaW5lIEdTTVRBUF9DSEFOTkVMX1JBQ0gJMHgwMwotI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9BR0NICTB4MDQKLSNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfUENICTB4MDUKLSNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfU0RDQ0gJMHgwNgotI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9TRENDSDQJMHgwNwotI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9TRENDSDgJMHgwOAotI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9UQ0hfRgkweDA5Ci0jZGVmaW5lIEdTTVRBUF9DSEFOTkVMX1RDSF9ICTB4MGEKLSNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfQUNDSAkweDgwCi0KLSNkZWZpbmUgR1NNVEFQX0FSRkNOX0ZfUENTCTB4ODAwMAotI2RlZmluZSBHU01UQVBfQVJGQ05fRl9VUExJTksJMHg0MDAwCi0jZGVmaW5lIEdTTVRBUF9BUkZDTl9NQVNLCTB4M2ZmZgotCi0jZGVmaW5lIEdTTVRBUF9VRFBfUE9SVAkJCTQ3MjkKLQotc3RydWN0IGdzbXRhcF9oZHIgewotCXVpbnQ4X3QgdmVyc2lvbjsJLyogdmVyc2lvbiwgc2V0IHRvIDB4MDEgY3VycmVudGx5ICovCi0JdWludDhfdCBoZHJfbGVuOwkvKiBsZW5ndGggaW4gbnVtYmVyIG9mIDMyYml0IHdvcmRzICovCi0JdWludDhfdCB0eXBlOwkJLyogc2VlIEdTTVRBUF9UWVBFXyogKi8KLQl1aW50OF90IHRpbWVzbG90OwkvKiB0aW1lc2xvdCAoMC4uNyBvbiBVbSkgKi8KLQotCXVpbnQxNl90IGFyZmNuOwkJLyogQVJGQ04gKGZyZXF1ZW5jeSkgKi8KLQlpbnQ4X3Qgc2lnbmFsX2RibTsJLyogc2lnbmFsIGxldmVsIGluIGRCbSAqLwotCWludDhfdCBzbnJfZGI7CQkvKiBzaWduYWwvbm9pc2UgcmF0aW8gaW4gZEIgKi8KLQotCXVpbnQzMl90IGZyYW1lX251bWJlcjsJLyogR1NNIEZyYW1lIE51bWJlciAoRk4pICovCi0KLQl1aW50OF90IHN1Yl90eXBlOwkvKiBUeXBlIG9mIGJ1cnN0L2NoYW5uZWwsIHNlZSBhYm92ZSAqLwotCXVpbnQ4X3QgYW50ZW5uYV9ucjsJLyogQW50ZW5uYSBOdW1iZXIgKi8KLQl1aW50OF90IHN1Yl9zbG90OwkvKiBzdWItc2xvdCB3aXRoaW4gdGltZXNsb3QgKi8KLQl1aW50OF90IHJlczsJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIChSRlUpICovCi0KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNlbmRpZiAvKiBfR1NNVEFQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2xpbnV4bGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjk5YzVlLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfTExJU1RfSAotI2RlZmluZSBfTElOVVhfTExJU1RfSAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpZm5kZWYgaW5saW5lCi0jZGVmaW5lIGlubGluZSBfX2lubGluZV9fCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNoKGNvbnN0IHZvaWQgKngpIHs7fQotCi0vKioKLSAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQotICoKLSAqIEBwdHI6CXRoZSBwb2ludGVyIHRvIHRoZSBtZW1iZXIuCi0gKiBAdHlwZToJdGhlIHR5cGUgb2YgdGhlIGNvbnRhaW5lciBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KLSAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3QuCi0gKgotICovCi0jZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsJCQlcCi0gICAgICAgIGNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAodHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKikocHRyKTsJXAotICAgICAgICAodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpICk7fSkKLQotCi0vKgotICogVGhlc2UgYXJlIG5vbi1OVUxMIHBvaW50ZXJzIHRoYXQgd2lsbCByZXN1bHQgaW4gcGFnZSBmYXVsdHMKLSAqIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB1c2VkIHRvIHZlcmlmeSB0aGF0IG5vYm9keSB1c2VzCi0gKiBub24taW5pdGlhbGl6ZWQgbGxpc3QgZW50cmllcy4KLSAqLwotI2RlZmluZSBMTElTVF9QT0lTT04xICAoKHZvaWQgKikgMHgwMDEwMDEwMCkKLSNkZWZpbmUgTExJU1RfUE9JU09OMiAgKCh2b2lkICopIDB4MDAyMDAyMDApCi0KLS8qCi0gKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsbGlzdCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBTb21lIG9mIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKCJfX3h4eCIpIGFyZSB1c2VmdWwgd2hlbgotICogbWFuaXB1bGF0aW5nIHdob2xlIGxsaXN0cyByYXRoZXIgdGhhbiBzaW5nbGUgZW50cmllcywgYXMKLSAqIHNvbWV0aW1lcyB3ZSBhbHJlYWR5IGtub3cgdGhlIG5leHQvcHJldiBlbnRyaWVzIGFuZCB3ZSBjYW4KLSAqIGdlbmVyYXRlIGJldHRlciBjb2RlIGJ5IHVzaW5nIHRoZW0gZGlyZWN0bHkgcmF0aGVyIHRoYW4KLSAqIHVzaW5nIHRoZSBnZW5lcmljIHNpbmdsZS1lbnRyeSByb3V0aW5lcy4KLSAqLwotCi1zdHJ1Y3QgbGxpc3RfaGVhZCB7Ci0Jc3RydWN0IGxsaXN0X2hlYWQgKm5leHQsICpwcmV2OwotfTsKLQotI2RlZmluZSBMTElTVF9IRUFEX0lOSVQobmFtZSkgeyAmKG5hbWUpLCAmKG5hbWUpIH0KLQotI2RlZmluZSBMTElTVF9IRUFEKG5hbWUpIFwKLQlzdHJ1Y3QgbGxpc3RfaGVhZCBuYW1lID0gTExJU1RfSEVBRF9JTklUKG5hbWUpCi0KLSNkZWZpbmUgSU5JVF9MTElTVF9IRUFEKHB0cikgZG8geyBcCi0JKHB0ciktPm5leHQgPSAocHRyKTsgKHB0ciktPnByZXYgPSAocHRyKTsgXAotfSB3aGlsZSAoMCkKLQotLyoKLSAqIEluc2VydCBhIG5ldyBlbnRyeSBiZXR3ZWVuIHR3byBrbm93biBjb25zZWN1dGl2ZSBlbnRyaWVzLiAKLSAqCi0gKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93Ci0gKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fbGxpc3RfYWRkKHN0cnVjdCBsbGlzdF9oZWFkICpfbmV3LAotCQkJICAgICAgc3RydWN0IGxsaXN0X2hlYWQgKnByZXYsCi0JCQkgICAgICBzdHJ1Y3QgbGxpc3RfaGVhZCAqbmV4dCkKLXsKLQluZXh0LT5wcmV2ID0gX25ldzsKLQlfbmV3LT5uZXh0ID0gbmV4dDsKLQlfbmV3LT5wcmV2ID0gcHJldjsKLQlwcmV2LT5uZXh0ID0gX25ldzsKLX0KLQotLyoqCi0gKiBsbGlzdF9hZGQgLSBhZGQgYSBuZXcgZW50cnkKLSAqIEBuZXc6IG5ldyBlbnRyeSB0byBiZSBhZGRlZAotICogQGhlYWQ6IGxsaXN0IGhlYWQgdG8gYWRkIGl0IGFmdGVyCi0gKgotICogSW5zZXJ0IGEgbmV3IGVudHJ5IGFmdGVyIHRoZSBzcGVjaWZpZWQgaGVhZC4KLSAqIFRoaXMgaXMgZ29vZCBmb3IgaW1wbGVtZW50aW5nIHN0YWNrcy4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2FkZChzdHJ1Y3QgbGxpc3RfaGVhZCAqX25ldywgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCi17Ci0JX19sbGlzdF9hZGQoX25ldywgaGVhZCwgaGVhZC0+bmV4dCk7Ci19Ci0KLS8qKgotICogbGxpc3RfYWRkX3RhaWwgLSBhZGQgYSBuZXcgZW50cnkKLSAqIEBuZXc6IG5ldyBlbnRyeSB0byBiZSBhZGRlZAotICogQGhlYWQ6IGxsaXN0IGhlYWQgdG8gYWRkIGl0IGJlZm9yZQotICoKLSAqIEluc2VydCBhIG5ldyBlbnRyeSBiZWZvcmUgdGhlIHNwZWNpZmllZCBoZWFkLgotICogVGhpcyBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBxdWV1ZXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBsbGlzdF9hZGRfdGFpbChzdHJ1Y3QgbGxpc3RfaGVhZCAqX25ldywgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCi17Ci0JX19sbGlzdF9hZGQoX25ldywgaGVhZC0+cHJldiwgaGVhZCk7Ci19Ci0KLS8qCi0gKiBEZWxldGUgYSBsbGlzdCBlbnRyeSBieSBtYWtpbmcgdGhlIHByZXYvbmV4dCBlbnRyaWVzCi0gKiBwb2ludCB0byBlYWNoIG90aGVyLgotICoKLSAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKLSAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19sbGlzdF9kZWwoc3RydWN0IGxsaXN0X2hlYWQgKiBwcmV2LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqIG5leHQpCi17Ci0JbmV4dC0+cHJldiA9IHByZXY7Ci0JcHJldi0+bmV4dCA9IG5leHQ7Ci19Ci0KLS8qKgotICogbGxpc3RfZGVsIC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxsaXN0LgotICogQGVudHJ5OiB0aGUgZWxlbWVudCB0byBkZWxldGUgZnJvbSB0aGUgbGxpc3QuCi0gKiBOb3RlOiBsbGlzdF9lbXB0eSBvbiBlbnRyeSBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBhZnRlciB0aGlzLCB0aGUgZW50cnkgaXMKLSAqIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2RlbChzdHJ1Y3QgbGxpc3RfaGVhZCAqZW50cnkpCi17Ci0JX19sbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKLQllbnRyeS0+bmV4dCA9IChzdHJ1Y3QgbGxpc3RfaGVhZCAqKUxMSVNUX1BPSVNPTjE7Ci0JZW50cnktPnByZXYgPSAoc3RydWN0IGxsaXN0X2hlYWQgKilMTElTVF9QT0lTT04yOwotfQotCi0vKioKLSAqIGxsaXN0X2RlbF9pbml0IC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxsaXN0IGFuZCByZWluaXRpYWxpemUgaXQuCi0gKiBAZW50cnk6IHRoZSBlbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsbGlzdC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2RlbF9pbml0KHN0cnVjdCBsbGlzdF9oZWFkICplbnRyeSkKLXsKLQlfX2xsaXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOwotCUlOSVRfTExJU1RfSEVBRChlbnRyeSk7IAotfQotCi0vKioKLSAqIGxsaXN0X21vdmUgLSBkZWxldGUgZnJvbSBvbmUgbGxpc3QgYW5kIGFkZCBhcyBhbm90aGVyJ3MgaGVhZAotICogQGxsaXN0OiB0aGUgZW50cnkgdG8gbW92ZQotICogQGhlYWQ6IHRoZSBoZWFkIHRoYXQgd2lsbCBwcmVjZWRlIG91ciBlbnRyeQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbGxpc3RfbW92ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQotewotICAgICAgICBfX2xsaXN0X2RlbChsbGlzdC0+cHJldiwgbGxpc3QtPm5leHQpOwotICAgICAgICBsbGlzdF9hZGQobGxpc3QsIGhlYWQpOwotfQotCi0vKioKLSAqIGxsaXN0X21vdmVfdGFpbCAtIGRlbGV0ZSBmcm9tIG9uZSBsbGlzdCBhbmQgYWRkIGFzIGFub3RoZXIncyB0YWlsCi0gKiBAbGxpc3Q6IHRoZSBlbnRyeSB0byBtb3ZlCi0gKiBAaGVhZDogdGhlIGhlYWQgdGhhdCB3aWxsIGZvbGxvdyBvdXIgZW50cnkKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X21vdmVfdGFpbChzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsCi0JCQkJICBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKLXsKLSAgICAgICAgX19sbGlzdF9kZWwobGxpc3QtPnByZXYsIGxsaXN0LT5uZXh0KTsKLSAgICAgICAgbGxpc3RfYWRkX3RhaWwobGxpc3QsIGhlYWQpOwotfQotCi0vKioKLSAqIGxsaXN0X2VtcHR5IC0gdGVzdHMgd2hldGhlciBhIGxsaXN0IGlzIGVtcHR5Ci0gKiBAaGVhZDogdGhlIGxsaXN0IHRvIHRlc3QuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGxsaXN0X2VtcHR5KGNvbnN0IHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQotewotCXJldHVybiBoZWFkLT5uZXh0ID09IGhlYWQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2xsaXN0X3NwbGljZShzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsCi0JCQkJIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQotewotCXN0cnVjdCBsbGlzdF9oZWFkICpmaXJzdCA9IGxsaXN0LT5uZXh0OwotCXN0cnVjdCBsbGlzdF9oZWFkICpsYXN0ID0gbGxpc3QtPnByZXY7Ci0Jc3RydWN0IGxsaXN0X2hlYWQgKmF0ID0gaGVhZC0+bmV4dDsKLQotCWZpcnN0LT5wcmV2ID0gaGVhZDsKLQloZWFkLT5uZXh0ID0gZmlyc3Q7Ci0KLQlsYXN0LT5uZXh0ID0gYXQ7Ci0JYXQtPnByZXYgPSBsYXN0OwotfQotCi0vKioKLSAqIGxsaXN0X3NwbGljZSAtIGpvaW4gdHdvIGxsaXN0cwotICogQGxsaXN0OiB0aGUgbmV3IGxsaXN0IHRvIGFkZC4KLSAqIEBoZWFkOiB0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsbGlzdC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X3NwbGljZShzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQotewotCWlmICghbGxpc3RfZW1wdHkobGxpc3QpKQotCQlfX2xsaXN0X3NwbGljZShsbGlzdCwgaGVhZCk7Ci19Ci0KLS8qKgotICogbGxpc3Rfc3BsaWNlX2luaXQgLSBqb2luIHR3byBsbGlzdHMgYW5kIHJlaW5pdGlhbGlzZSB0aGUgZW1wdGllZCBsbGlzdC4KLSAqIEBsbGlzdDogdGhlIG5ldyBsbGlzdCB0byBhZGQuCi0gKiBAaGVhZDogdGhlIHBsYWNlIHRvIGFkZCBpdCBpbiB0aGUgZmlyc3QgbGxpc3QuCi0gKgotICogVGhlIGxsaXN0IGF0IEBsbGlzdCBpcyByZWluaXRpYWxpc2VkCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBsbGlzdF9zcGxpY2VfaW5pdChzdHJ1Y3QgbGxpc3RfaGVhZCAqbGxpc3QsCi0JCQkJICAgIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQotewotCWlmICghbGxpc3RfZW1wdHkobGxpc3QpKSB7Ci0JCV9fbGxpc3Rfc3BsaWNlKGxsaXN0LCBoZWFkKTsKLQkJSU5JVF9MTElTVF9IRUFEKGxsaXN0KTsKLQl9Ci19Ci0KLS8qKgotICogbGxpc3RfZW50cnkgLSBnZXQgdGhlIHN0cnVjdCBmb3IgdGhpcyBlbnRyeQotICogQHB0cjoJdGhlICZzdHJ1Y3QgbGxpc3RfaGVhZCBwb2ludGVyLgotICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KLSAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCi0gKi8KLSNkZWZpbmUgbGxpc3RfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpIFwKLQljb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpCi0KLS8qKgotICogbGxpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsbGlzdAotICogQHBvczoJdGhlICZzdHJ1Y3QgbGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCi0gKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCi0gKi8KLSNkZWZpbmUgbGxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCi0JZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIHByZWZldGNoKHBvcy0+bmV4dCk7IHBvcyAhPSAoaGVhZCk7IFwKLSAgICAgICAgCXBvcyA9IHBvcy0+bmV4dCwgcHJlZmV0Y2gocG9zLT5uZXh0KSkKLQotLyoqCi0gKiBfX2xsaXN0X2Zvcl9lYWNoCS0JaXRlcmF0ZSBvdmVyIGEgbGxpc3QKLSAqIEBwb3M6CXRoZSAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgotICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgotICoKLSAqIFRoaXMgdmFyaWFudCBkaWZmZXJzIGZyb20gbGxpc3RfZm9yX2VhY2goKSBpbiB0aGF0IGl0J3MgdGhlCi0gKiBzaW1wbGVzdCBwb3NzaWJsZSBsbGlzdCBpdGVyYXRpb24gY29kZSwgbm8gcHJlZmV0Y2hpbmcgaXMgZG9uZS4KLSAqIFVzZSB0aGlzIGZvciBjb2RlIHRoYXQga25vd3MgdGhlIGxsaXN0IHRvIGJlIHZlcnkgc2hvcnQgKGVtcHR5Ci0gKiBvciAxIGVudHJ5KSBtb3N0IG9mIHRoZSB0aW1lLgotICovCi0jZGVmaW5lIF9fbGxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCi0JZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IHBvcyA9IHBvcy0+bmV4dCkKLQotLyoqCi0gKiBsbGlzdF9mb3JfZWFjaF9wcmV2CS0JaXRlcmF0ZSBvdmVyIGEgbGxpc3QgYmFja3dhcmRzCi0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KLSAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KLSAqLwotI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgaGVhZCkgXAotCWZvciAocG9zID0gKGhlYWQpLT5wcmV2LCBwcmVmZXRjaChwb3MtPnByZXYpOyBwb3MgIT0gKGhlYWQpOyBcCi0gICAgICAgIAlwb3MgPSBwb3MtPnByZXYsIHByZWZldGNoKHBvcy0+cHJldikpCi0gICAgICAgIAkKLS8qKgotICogbGxpc3RfZm9yX2VhY2hfc2FmZQktCWl0ZXJhdGUgb3ZlciBhIGxsaXN0IHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxsaXN0IGVudHJ5Ci0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KLSAqIEBuOgkJYW5vdGhlciAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCi0gKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCi0gKi8KLSNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sIGhlYWQpIFwKLQlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dCwgbiA9IHBvcy0+bmV4dDsgcG9zICE9IChoZWFkKTsgXAotCQlwb3MgPSBuLCBuID0gcG9zLT5uZXh0KQotCi0vKioKLSAqIGxsaXN0X2Zvcl9lYWNoX2VudHJ5CS0JaXRlcmF0ZSBvdmVyIGxsaXN0IG9mIGdpdmVuIHR5cGUKLSAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgotICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgotICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KLSAqLwotI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIGhlYWQsIG1lbWJlcikJCQkJXAotCWZvciAocG9zID0gbGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKLQkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KTsJCQlcCi0JICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAJCQkJCVwKLQkgICAgIHBvcyA9IGxsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAotCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpKQotCi0vKioKLSAqIGxsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UgLSBpdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxsaXN0IG9mIGdpdmVuIHR5cGUuCi0gKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KLSAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KLSAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCi0gKi8KLSNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShwb3MsIGhlYWQsIG1lbWJlcikJCQlcCi0JZm9yIChwb3MgPSBsbGlzdF9lbnRyeSgoaGVhZCktPnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAotCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLnByZXYpOwkJCVwKLQkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAkJCQkJXAotCSAgICAgcG9zID0gbGxpc3RfZW50cnkocG9zLT5tZW1iZXIucHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCi0JCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIucHJldikpCi0KLS8qKgotICogbGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUgLQlpdGVyYXRlIG92ZXIgbGxpc3Qgb2YgZ2l2ZW4gdHlwZQotICoJCQljb250aW51aW5nIGFmdGVyIGV4aXN0aW5nIHBvaW50Ci0gKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KLSAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KLSAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCi0gKi8KLSNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocG9zLCBoZWFkLCBtZW1iZXIpIAkJXAotCWZvciAocG9zID0gbGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCi0JCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCk7CQkJXAotCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJCQkJCVwKLQkgICAgIHBvcyA9IGxsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAotCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpKQotCi0vKioKLSAqIGxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgLSBpdGVyYXRlIG92ZXIgbGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsbGlzdCBlbnRyeQotICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCi0gKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQotICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgotICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KLSAqLwotI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgaGVhZCwgbWVtYmVyKQkJCVwKLQlmb3IgKHBvcyA9IGxsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCi0JCW4gPSBsbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKLQkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAkJCQkJXAotCSAgICAgcG9zID0gbiwgbiA9IGxsaXN0X2VudHJ5KG4tPm1lbWJlci5uZXh0LCB0eXBlb2YoKm4pLCBtZW1iZXIpKQotCi0vKioKLSAqIGxsaXN0X2Zvcl9lYWNoX3JjdQktCWl0ZXJhdGUgb3ZlciBhbiByY3UtcHJvdGVjdGVkIGxsaXN0Ci0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KLSAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KLSAqLwotI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9yY3UocG9zLCBoZWFkKSBcCi0JZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIHByZWZldGNoKHBvcy0+bmV4dCk7IHBvcyAhPSAoaGVhZCk7IFwKLSAgICAgICAgCXBvcyA9IHBvcy0+bmV4dCwgKHsgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IDA7fSksIHByZWZldGNoKHBvcy0+bmV4dCkpCi0gICAgICAgIAkKLSNkZWZpbmUgX19sbGlzdF9mb3JfZWFjaF9yY3UocG9zLCBoZWFkKSBcCi0JZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKLSAgICAgICAgCXBvcyA9IHBvcy0+bmV4dCwgKHsgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IDA7fSkpCi0gICAgICAgIAkKLS8qKgotICogbGxpc3RfZm9yX2VhY2hfc2FmZV9yY3UJLQlpdGVyYXRlIG92ZXIgYW4gcmN1LXByb3RlY3RlZCBsbGlzdCBzYWZlCi0gKgkJCQkJYWdhaW5zdCByZW1vdmFsIG9mIGxsaXN0IGVudHJ5Ci0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KLSAqIEBuOgkJYW5vdGhlciAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCi0gKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCi0gKi8KLSNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfc2FmZV9yY3UocG9zLCBuLCBoZWFkKSBcCi0JZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIG4gPSBwb3MtPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKLQkJcG9zID0gbiwgKHsgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IDA7fSksIG4gPSBwb3MtPm5leHQpCi0KLS8qKgotICogbGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1CS0JaXRlcmF0ZSBvdmVyIHJjdSBsbGlzdCBvZiBnaXZlbiB0eXBlCi0gKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KLSAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KLSAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCi0gKi8KLSNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvcywgaGVhZCwgbWVtYmVyKQkJCVwKLQlmb3IgKHBvcyA9IGxsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCi0JCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCk7CQkJXAotCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCi0JICAgICBwb3MgPSBsbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKLQkJICAgICAoeyBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsgMDt9KSwJCVwKLQkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KSkKLQotCi0vKioKLSAqIGxsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdQktCWl0ZXJhdGUgb3ZlciBhbiByY3UtcHJvdGVjdGVkIGxsaXN0IAotICoJCQljb250aW51aW5nIGFmdGVyIGV4aXN0aW5nIHBvaW50LgotICogQHBvczoJdGhlICZzdHJ1Y3QgbGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCi0gKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCi0gKi8KLSNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfY29udGludWVfcmN1KHBvcywgaGVhZCkgXAotCWZvciAoKHBvcykgPSAocG9zKS0+bmV4dCwgcHJlZmV0Y2goKHBvcyktPm5leHQpOyAocG9zKSAhPSAoaGVhZCk7IFwKLSAgICAgICAgCShwb3MpID0gKHBvcyktPm5leHQsICh7IHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyAwO30pLCBwcmVmZXRjaCgocG9zKS0+bmV4dCkpCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDk0YmI5Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotI2lmbmRlZiBfT1NNT0NPUkVfTU5DQ19ICi0jZGVmaW5lIF9PU01PQ09SRV9NTkNDX0gKLQotI2RlZmluZSBHU01fTUFYX0ZBQ0lMSVRZICAgICAgIDEyOAotI2RlZmluZSBHU01fTUFYX1NTVkVSU0lPTiAgICAgIDEyOAotI2RlZmluZSBHU01fTUFYX1VTRVJVU0VSICAgICAgIDEyOAotCi0vKiBFeHBhbmRlZCBmaWVsZHMgZnJvbSBHU00gVFMgMDQuMDgsIFRhYmxlIDEwLjUuMTAyICovCi1zdHJ1Y3QgZ3NtX21uY2NfYmVhcmVyX2NhcCB7Ci0JaW50CQl0cmFuc2ZlcjsJLyogSW5mb3JtYXRpb24gVHJhbnNmZXIgQ2FwYWJpbGl0eSAqLwotCWludCAJCW1vZGU7CQkvKiBUcmFuc2ZlciBNb2RlICovCi0JaW50CQljb2Rpbmc7CQkvKiBDb2RpbmcgU3RhbmRhcmQgKi8KLQlpbnQJCXJhZGlvOwkJLyogUmFkaW8gQ2hhbm5lbCBSZXF1aXJlbWVudCAqLwotCWludAkJc3BlZWNoX2N0bTsJLyogQ1RNIHRleHQgdGVsZXBob255IGluZGljYXRpb24gKi8KLQlpbnQJCXNwZWVjaF92ZXJbOF07CS8qIFNwZWVjaCB2ZXJzaW9uIGluZGljYXRpb24gKi8KLX07Ci0KLXN0cnVjdCBnc21fbW5jY19udW1iZXIgewotCWludCAJCXR5cGU7Ci0JaW50IAkJcGxhbjsKLQlpbnQJCXByZXNlbnQ7Ci0JaW50CQlzY3JlZW47Ci0JY2hhcgkJbnVtYmVyWzMzXTsKLX07Ci0KLXN0cnVjdCBnc21fbW5jY19jYXVzZSB7Ci0JaW50CQlsb2NhdGlvbjsKLQlpbnQJCWNvZGluZzsKLQlpbnQJCXJlYzsKLQlpbnQJCXJlY192YWw7Ci0JaW50CQl2YWx1ZTsKLQlpbnQJCWRpYWdfbGVuOwotCWNoYXIJCWRpYWdbMzJdOwotfTsKLQotc3RydWN0IGdzbV9tbmNjX3VzZXJ1c2VyIHsKLQlpbnQJCXByb3RvOwotCWNoYXIJCWluZm9bR1NNX01BWF9VU0VSVVNFUiArIDFdOyAvKiArIHRlcm1pbmF0aW9uIGNoYXIgKi8KLX07Ci0KLXN0cnVjdCBnc21fbW5jY19wcm9ncmVzcyB7Ci0JaW50CQljb2Rpbmc7Ci0JaW50CQlsb2NhdGlvbjsKLQlpbnQgCQlkZXNjcjsKLX07Ci0KLXN0cnVjdCBnc21fbW5jY19mYWNpbGl0eSB7Ci0JaW50CQlsZW47Ci0JY2hhcgkJaW5mb1tHU01fTUFYX0ZBQ0lMSVRZXTsKLX07Ci0KLXN0cnVjdCBnc21fbW5jY19zc3ZlcnNpb24gewotCWludAkJbGVuOwotCWNoYXIJCWluZm9bR1NNX01BWF9TU1ZFUlNJT05dOwotfTsKLQotc3RydWN0IGdzbV9tbmNjX2NjY2FwIHsKLQlpbnQJCWR0bWY7Ci0JaW50CQlwY3A7Ci19OwotCi1lbnVtIHsKLQlHU01fTU5DQ19CQ0FQX1NQRUVDSAk9IDAsCi0JR1NNX01OQ0NfQkNBUF9VTlJfRElHCT0gMSwKLQlHU01fTU5DQ19CQ0FQX0FVRElPCT0gMiwKLQlHU01fTU5DQ19CQ0FQX0ZBWF9HMwk9IDMsCi0JR1NNX01OQ0NfQkNBUF9PVEhFUl9JVEMgPSA1LAotCUdTTV9NTkNDX0JDQVBfUkVTRVJWRUQJPSA3LAotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21zZ2IuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWRiNzE5Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLSNpZm5kZWYgX01TR0JfSAotI2RlZmluZSBfTVNHQl9ICi0KLS8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgImxpbnV4bGlzdC5oIgotCi1zdHJ1Y3QgYnRzX2xpbms7Ci0KLXN0cnVjdCBtc2diIHsKLQlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OwotCi0JLyogcHRyIHRvIHRoZSBwaHlzaWNhbCBFMSBsaW5rIHRvIHRoZSBCVFMocykgKi8KLQlzdHJ1Y3QgZ3NtX2J0c19saW5rICpidHNfbGluazsKLQotCS8qIFBhcnQgb2Ygd2hpY2ggVFJYIGxvZ2ljYWwgY2hhbm5lbCB3ZSB3ZXJlIHJlY2VpdmVkIC8gdHJhbnNtaXR0ZWQgKi8KLQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKLQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKLQotCS8qIHRoZSBMYXllcjEgaGVhZGVyIChpZiBhbnkpICovCi0JdW5zaWduZWQgY2hhciAqbDFoOwotCS8qIHRoZSBBLWJpcyBsYXllciAyIGhlYWRlcjogT01MLCBSU0woUkxMKSwgTlMgKi8KLQl1bnNpZ25lZCBjaGFyICpsMmg7Ci0JLyogdGhlIGxheWVyIDMgaGVhZGVyLiBGb3IgT01MOiBGT007IFJTTDogMDQuMDg7IEdQUlM6IEJTU0dQICovCi0JdW5zaWduZWQgY2hhciAqbDNoOwotCi0JLyogdGhlIGxheWVyIDQgaGVhZGVyICovCi0JdW5pb24gewotCQl1bnNpZ25lZCBjaGFyICpzbXNoOwotCQl1bnNpZ25lZCBjaGFyICpsbGNoOwotCQl1bnNpZ25lZCBjaGFyICpsNGg7Ci0JfTsKLQotCS8qIHRoZSBsYXllciA1IGhlYWRlciwgR1BSUzogR01NIGhlYWRlciAqLwotCXVuc2lnbmVkIGNoYXIgKmdtbWg7Ci0JdWludDMyX3QgdGxsaTsKLQotCXVpbnQxNl90IGRhdGFfbGVuOwotCXVpbnQxNl90IGxlbjsKLQotCXVuc2lnbmVkIGNoYXIgKmhlYWQ7Ci0JdW5zaWduZWQgY2hhciAqdGFpbDsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCXVuc2lnbmVkIGNoYXIgX2RhdGFbMF07Ci19OwotCi1leHRlcm4gc3RydWN0IG1zZ2IgKm1zZ2JfYWxsb2ModWludDE2X3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gdm9pZCBtc2diX2ZyZWUoc3RydWN0IG1zZ2IgKm0pOwotZXh0ZXJuIHZvaWQgbXNnYl9lbnF1ZXVlKHN0cnVjdCBsbGlzdF9oZWFkICpxdWV1ZSwgc3RydWN0IG1zZ2IgKm1zZyk7Ci1leHRlcm4gc3RydWN0IG1zZ2IgKm1zZ2JfZGVxdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUpOwotZXh0ZXJuIHZvaWQgbXNnYl9yZXNldChzdHJ1Y3QgbXNnYiAqbSk7Ci0KLSNkZWZpbmUgbXNnYl9sMShtKQkoKHZvaWQgKikobS0+bDFoKSkKLSNkZWZpbmUgbXNnYl9sMihtKQkoKHZvaWQgKikobS0+bDJoKSkKLSNkZWZpbmUgbXNnYl9sMyhtKQkoKHZvaWQgKikobS0+bDNoKSkKLSNkZWZpbmUgbXNnYl9zbXMobSkJKCh2b2lkICopKG0tPnNtc2gpKQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtc2diX2wxbGVuKGNvbnN0IHN0cnVjdCBtc2diICptc2diKQotewotCXJldHVybiBtc2diLT50YWlsIC0gKHVpbnQ4X3QgKiltc2diX2wxKG1zZ2IpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtc2diX2wybGVuKGNvbnN0IHN0cnVjdCBtc2diICptc2diKQotewotCXJldHVybiBtc2diLT50YWlsIC0gKHVpbnQ4X3QgKiltc2diX2wyKG1zZ2IpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtc2diX2wzbGVuKGNvbnN0IHN0cnVjdCBtc2diICptc2diKQotewotCXJldHVybiBtc2diLT50YWlsIC0gKHVpbnQ4X3QgKiltc2diX2wzKG1zZ2IpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtc2diX2hlYWRsZW4oY29uc3Qgc3RydWN0IG1zZ2IgKm1zZ2IpCi17Ci0JcmV0dXJuIG1zZ2ItPmxlbiAtIG1zZ2ItPmRhdGFfbGVuOwotfQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICptc2diX3B1dChzdHJ1Y3QgbXNnYiAqbXNnYiwgdW5zaWduZWQgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBjaGFyICp0bXAgPSBtc2diLT50YWlsOwotCW1zZ2ItPnRhaWwgKz0gbGVuOwotCW1zZ2ItPmxlbiArPSBsZW47Ci0JcmV0dXJuIHRtcDsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc2diX3B1dF91OChzdHJ1Y3QgbXNnYiAqbXNnYiwgdWludDhfdCB3b3JkKQotewotCXVpbnQ4X3QgKnNwYWNlID0gbXNnYl9wdXQobXNnYiwgMSk7Ci0Jc3BhY2VbMF0gPSB3b3JkICYgMHhGRjsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc2diX3B1dF91MTYoc3RydWN0IG1zZ2IgKm1zZ2IsIHVpbnQxNl90IHdvcmQpCi17Ci0JdWludDhfdCAqc3BhY2UgPSBtc2diX3B1dChtc2diLCAyKTsKLQlzcGFjZVswXSA9IHdvcmQgPj4gOCAmIDB4RkY7Ci0Jc3BhY2VbMV0gPSB3b3JkICYgMHhGRjsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc2diX3B1dF91MzIoc3RydWN0IG1zZ2IgKm1zZ2IsIHVpbnQzMl90IHdvcmQpCi17Ci0JdWludDhfdCAqc3BhY2UgPSBtc2diX3B1dChtc2diLCA0KTsKLQlzcGFjZVswXSA9IHdvcmQgPj4gMjQgJiAweEZGOwotCXNwYWNlWzFdID0gd29yZCA+PiAxNiAmIDB4RkY7Ci0Jc3BhY2VbMl0gPSB3b3JkID4+IDggJiAweEZGOwotCXNwYWNlWzNdID0gd29yZCAmIDB4RkY7Ci19Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKm1zZ2JfZ2V0KHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCXVuc2lnbmVkIGNoYXIgKnRtcCA9IG1zZ2ItPmRhdGE7Ci0JbXNnYi0+ZGF0YSArPSBsZW47Ci0JbXNnYi0+bGVuIC09IGxlbjsKLQlyZXR1cm4gdG1wOwotfQotc3RhdGljIGlubGluZSB1aW50OF90IG1zZ2JfZ2V0X3U4KHN0cnVjdCBtc2diICptc2diKQotewotCXVpbnQ4X3QgKnNwYWNlID0gbXNnYl9nZXQobXNnYiwgMSk7Ci0JcmV0dXJuIHNwYWNlWzBdOwotfQotc3RhdGljIGlubGluZSB1aW50MTZfdCBtc2diX2dldF91MTYoc3RydWN0IG1zZ2IgKm1zZ2IpCi17Ci0JdWludDhfdCAqc3BhY2UgPSBtc2diX2dldChtc2diLCAyKTsKLQlyZXR1cm4gc3BhY2VbMF0gPDwgOCB8IHNwYWNlWzFdOwotfQotc3RhdGljIGlubGluZSB1aW50MzJfdCBtc2diX2dldF91MzIoc3RydWN0IG1zZ2IgKm1zZ2IpCi17Ci0JdWludDhfdCAqc3BhY2UgPSBtc2diX2dldChtc2diLCA0KTsKLQlyZXR1cm4gc3BhY2VbMF0gPDwgMjQgfCBzcGFjZVsxXSA8PCAxNiB8IHNwYWNlWzJdIDw8IDggfCBzcGFjZVszXTsKLX0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqbXNnYl9wdXNoKHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCW1zZ2ItPmRhdGEgLT0gbGVuOwotCW1zZ2ItPmxlbiArPSBsZW47Ci0JcmV0dXJuIG1zZ2ItPmRhdGE7Ci19Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKm1zZ2JfcHVsbChzdHJ1Y3QgbXNnYiAqbXNnYiwgdW5zaWduZWQgaW50IGxlbikKLXsKLQltc2diLT5sZW4gLT0gbGVuOwotCXJldHVybiBtc2diLT5kYXRhICs9IGxlbjsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IG1zZ2JfdGFpbHJvb20oY29uc3Qgc3RydWN0IG1zZ2IgKm1zZ2IpCi17Ci0JcmV0dXJuIChtc2diLT5oZWFkICsgbXNnYi0+ZGF0YV9sZW4pIC0gbXNnYi0+dGFpbDsKLX0KLQotLyogaW5jcmVhc2UgdGhlIGhlYWRyb29tIG9mIGFuIGVtcHR5IG1zZ2IsIHJlZHVjaW5nIHRoZSB0YWlscm9vbSAqLwotc3RhdGljIGlubGluZSB2b2lkIG1zZ2JfcmVzZXJ2ZShzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbGVuKQotewotCW1zZy0+ZGF0YSArPSBsZW47Ci0JbXNnLT50YWlsICs9IGxlbjsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbXNnYiAqbXNnYl9hbGxvY19oZWFkcm9vbShpbnQgc2l6ZSwgaW50IGhlYWRyb29tLAotCQkJCQkJY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhzaXplLCBuYW1lKTsKLQlpZiAobXNnKQotCQltc2diX3Jlc2VydmUobXNnLCBoZWFkcm9vbSk7Ci0JcmV0dXJuIG1zZzsKLX0KLQotI2VuZGlmIC8qIF9NU0dCX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDg4ODNlLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW9zbW9jb3JlX3Byb3RvX0hFQURFUlMgPSBnc21fMDRfMDguaCBnc21fMDRfMTEuaCBnc21fMDRfODAuaCBnc21fMDhfNTguaCBnc21fMTJfMjEuaAotCi1vc21vY29yZV9wcm90b2RpciA9ICQoaW5jbHVkZWRpcikvb3Ntb2NvcmUvcHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFiOWI1Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NDMgKzAsMCBAQAotI2lmbmRlZiBQUk9UT19HU01fMDRfMDhfSAotI2RlZmluZSBQUk9UT19HU01fMDRfMDhfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8qIEdTTSBUUyAwNC4wOCAgZGVmaW5pdGlvbnMgKi8KLXN0cnVjdCBnc21fbGNoYW47Ci0KLXN0cnVjdCBnc200OF9jbGFzc21hcmsxIHsKLQl1aW50OF90IHNwYXJlOjEsCi0JCSByZXZfbGV2ZWw6MiwKLQkJIGVzX2luZDoxLAotCQkgYTVfMToxLAotCQkgcHdyX2xldjozOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIENoYXB0ZXIgMTAuNS4yLjUgKi8KLXN0cnVjdCBnc200OF9jaGFuX2Rlc2MgewotCXVpbnQ4X3QgY2hhbl9ucjsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQl1aW50OF90IG1haW9faGlnaDo0LAotCQkJCSBoOjEsCi0JCQkJIHRzYzozOwotCQkJdWludDhfdCBoc246NiwKLQkJCQkgbWFpb19sb3c6MjsKLQkJfSBoMTsKLQkJc3RydWN0IHsKLQkJCXVpbnQ4X3QgYXJmY25faGlnaDoyLAotCQkJCSBzcGFyZToyLAotCQkJCSBoOjEsCi0JCQkJIHRzYzozOwotCQkJdWludDhfdCBhcmZjbl9sb3c7Ci0JCX0gaDA7Ci0JfTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBDaGFwdGVyIDEwLjUuMi4yMWFhICovCi1zdHJ1Y3QgZ3NtNDhfbXVsdGlfcmF0ZV9jb25mIHsKLQl1aW50OF90IHNtb2QgOiAyLAotCQkgc3BhcmU6IDEsCi0JCSBpY21pIDogMSwKLQkJIG5zY2IgOiAxLAotCQkgdmVyIDogMzsKLQl1aW50OF90IG00Xzc1IDogMSwKLQkJIG01XzE1IDogMSwKLQkJIG01XzkwIDogMSwKLQkJIG02XzcwIDogMSwKLQkJIG03XzQwIDogMSwKLQkJIG03Xzk1IDogMSwKLQkJIG0xMF8yIDogMSwKLQkJIG0xMl8yIDogMTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIENoYXB0ZXIgMTAuNS4yLjMwICovCi1zdHJ1Y3QgZ3NtNDhfcmVxX3JlZiB7Ci0JdWludDhfdCByYTsKLQl1aW50OF90IHQzX2hpZ2g6MywKLQkJIHQxXzo1OwotCXVpbnQ4X3QgdDI6NSwKLQkJIHQzX2xvdzozOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qCi0gKiBDaGFwdGVyIDkuMS41LzkuMS42Ci0gKgotICogRm9yIDkuMS42IHRoZSBjaGFuX2Rlc2MgaGFzIHRoZSBtZWFuaW5nIG9mIDEwLjUuMi41YQotICovCi1zdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSB7Ci0Jc3RydWN0IGdzbTQ4X2NoYW5fZGVzYyBjaGFuX2Rlc2M7Ci0JdWludDhfdCBtb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLWVudW0gZ3NtNDhfY2hhbl9tb2RlIHsKLQlHU000OF9DTU9ERV9TSUdOCT0gMHgwMCwKLQlHU000OF9DTU9ERV9TUEVFQ0hfVjEJPSAweDAxLAotCUdTTTQ4X0NNT0RFX1NQRUVDSF9FRlIJPSAweDIxLAotCUdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIJPSAweDQxLAotCUdTTTQ4X0NNT0RFX0RBVEFfMTRrNQk9IDB4MGYsCi0JR1NNNDhfQ01PREVfREFUQV8xMmswCT0gMHgwMywKLQlHU000OF9DTU9ERV9EQVRBXzZrMAk9IDB4MGIsCi0JR1NNNDhfQ01PREVfREFUQV8zazYJPSAweDIzLAotfTsKLQotLyogQ2hhcHRlciA5LjEuMiAqLwotc3RydWN0IGdzbTQ4X2Fzc19jbWQgewotCS8qIFNlbWFudGljIGlzIGZyb20gMTAuNS4yLjVhICovCi0Jc3RydWN0IGdzbTQ4X2NoYW5fZGVzYyBjaGFuX2Rlc2M7Ci0JdWludDhfdCBwb3dlcl9jb21tYW5kOwotCXVpbnQ4X3QgZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIENoYXB0ZXIgMTAuNS4yLjIgKi8KLXN0cnVjdCBnc200OF9jZWxsX2Rlc2MgewotCXVpbnQ4X3QgYmNjOjMsCi0JCSBuY2M6MywKLQkJIGFyZmNuX2hpOjI7Ci0JdWludDhfdCBhcmZjbl9sbzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIENoYXB0ZXIgOS4xLjE1ICovCi1zdHJ1Y3QgZ3NtNDhfaG9fY21kIHsKLQlzdHJ1Y3QgZ3NtNDhfY2VsbF9kZXNjIGNlbGxfZGVzYzsKLQlzdHJ1Y3QgZ3NtNDhfY2hhbl9kZXNjIGNoYW5fZGVzYzsKLQl1aW50OF90IGhvX3JlZjsKLQl1aW50OF90IHBvd2VyX2NvbW1hbmQ7Ci0JdWludDhfdCBkYXRhWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogQ2hhcHRlciA5LjEuMTggKi8KLXN0cnVjdCBnc200OF9pbW1fYXNzIHsKLQl1aW50OF90IGwyX3BsZW47Ci0JdWludDhfdCBwcm90b19kaXNjcjsKLQl1aW50OF90IG1zZ190eXBlOwotCXVpbnQ4X3QgcGFnZV9tb2RlOwotCXN0cnVjdCBnc200OF9jaGFuX2Rlc2MgY2hhbl9kZXNjOwotCXN0cnVjdCBnc200OF9yZXFfcmVmIHJlcV9yZWY7Ci0JdWludDhfdCB0aW1pbmdfYWR2YW5jZTsKLQl1aW50OF90IG1vYl9hbGxvY19sZW47Ci0JdWludDhfdCBtb2JfYWxsb2NbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogQ2hhcHRlciAxMC41LjEuMyAqLwotc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkIHsKLQl1aW50OF90IGRpZ2l0c1szXTsJLyogQkNEISAqLwotCXVpbnQxNl90IGxhYzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTZWN0aW9uIDkuMi4yICovCi1zdHJ1Y3QgZ3NtNDhfYXV0aF9yZXEgewotCXVpbnQ4X3Qga2V5X3NlcTo0LAotCSAgICAgICAgIHNwYXJlOjQ7Ci0JdWludDhfdCByYW5kWzE2XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTZWN0aW9uIDkuMi4xNSAqLwotc3RydWN0IGdzbTQ4X2xvY191cGRfcmVxIHsKLQl1aW50OF90IHR5cGU6NCwKLQkJIGtleV9zZXE6NDsKLQlzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgbGFpOwotCXN0cnVjdCBnc200OF9jbGFzc21hcmsxIGNsYXNzbWFyazE7Ci0JdWludDhfdCBtaV9sZW47Ci0JdWludDhfdCBtaVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTZWN0aW9uIDEwLjEgKi8KLXN0cnVjdCBnc200OF9oZHIgewotCXVpbnQ4X3QgcHJvdG9fZGlzY3I7Ci0JdWludDhfdCBtc2dfdHlwZTsKLQl1aW50OF90IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2VjdGlvbiA5LjEuM3ggU3lzdGVtIGluZm9ybWF0aW9uIFR5cGUgaGVhZGVyICovCi1zdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfaGVhZGVyIHsKLQl1aW50OF90IGwyX3BsZW47Ci0JdWludDhfdCBycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yIDo0LAotCQlza2lwX2luZGljYXRvcjo0OyAKLQl1aW50OF90IHN5c3RlbV9pbmZvcm1hdGlvbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHsKLQl1aW50OF90IHJlIDoxLAotCQkgY2VsbF9iYXIgOjEsCi0JCSB0eF9pbnRlZ2VyIDo0LAotCQkgbWF4X3RyYW5zIDoyOwotCXVpbnQ4X3QgdDI7Ci0JdWludDhfdCB0MzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTZWN0aW9uIDEwLjUuMi40IENlbGwgU2VsZWN0aW9uIFBhcmFtZXRlcnMgKi8KLXN0cnVjdCBnc200OF9jZWxsX3NlbF9wYXIgewotCXVpbnQ4X3QgbXNfdHhwd3JfbWF4X2NjY2g6NSwJLyogR1NNIDA1LjA4IE1TLVRYUFdSLU1BWC1DQ0NIICovCi0JCSBjZWxsX3Jlc2VsX2h5c3Q6MzsJLyogR1NNIDA1LjA4IENFTEwtUkVTRUxFQ1QtSFlTVEVSRVNJUyAqLwotCXVpbnQ4X3QgcnhsZXZfYWNjX21pbjo2LAkvKiBHU00gMDUuMDggUlhMRVYtQUNDRVNTLU1JTiAqLwotCQkgbmVjaToxLAotCQkgYWNzOjE7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2VjdGlvbiAxMC41LjIuMTEgQ29udHJvbCBDaGFubmVsIERlc2NyaXB0aW9uICwgRmlndXJlIDEwLjUuMzMgKi8KLXN0cnVjdCBnc200OF9jb250cm9sX2NoYW5uZWxfZGVzY3IgewotCXVpbnQ4X3QgY2NjaF9jb25mIDozLAotCQlic19hZ19ibGtzX3JlcyA6MywKLQkJYXR0IDoxLAotCQlzcGFyZTEgOjE7Ci0JdWludDhfdCBic19wYV9tZnJtcyA6IDMsCi0JCXNwYXJlMiA6NTsKLQl1aW50OF90IHQzMjEyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBnc200OF9jZWxsX29wdGlvbnMgewotCXVpbnQ4X3QgcmFkaW9fbGlua190aW1lb3V0OjQsCi0JCSBkdHg6MiwKLQkJIHB3cmM6MSwKLQkJIHNwYXJlOjE7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2VjdGlvbiA5LjIuOSBDTSBzZXJ2aWNlIHJlcXVlc3QgKi8KLXN0cnVjdCBnc200OF9zZXJ2aWNlX3JlcXVlc3QgewotCXVpbnQ4X3QgY21fc2VydmljZV90eXBlIDogNCwKLQkJIGNpcGhlcl9rZXlfc2VxICA6IDQ7Ci0JLyogbGVuZ3RoICsgMyBieXRlcyAqLwotCXVpbnQzMl90IGNsYXNzbWFyazsKLQl1aW50OF90IG1pX2xlbjsKLQl1aW50OF90IG1pWzBdOwotCS8qIG9wdGlvbmFsIHByaW9yaXR5IGxldmVsICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2VjdGlvbiA5LjEuMzEgU3lzdGVtIGluZm9ybWF0aW9uIFR5cGUgMSAqLwotc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEgewotCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV9oZWFkZXIgaGVhZGVyOwotCXVpbnQ4X3QgY2VsbF9jaGFubmVsX2Rlc2NyaXB0aW9uWzE2XTsKLQlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKLQl1aW50OF90IHJlc3Rfb2N0ZXRzWzBdOyAvKiBOQ0ggcG9zaXRpb24gb24gdGhlIENDQ0ggKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTZWN0aW9uIDkuMS4zMiBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSAyICovCi1zdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMiB7Ci0Jc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlciBoZWFkZXI7Ci0JdWludDhfdCBiY2NoX2ZyZXF1ZW5jeV9saXN0WzE2XTsKLQl1aW50OF90IG5jY19wZXJtaXR0ZWQ7Ci0Jc3RydWN0IGdzbTQ4X3JhY2hfY29udHJvbCByYWNoX2NvbnRyb2w7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2VjdGlvbiA5LjEuMzUgU3lzdGVtIGluZm9ybWF0aW9uIFR5cGUgMyAqLwotc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzMgewotCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV9oZWFkZXIgaGVhZGVyOwotCXVpbnQxNl90IGNlbGxfaWRlbnRpdHk7Ci0Jc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkIGxhaTsKLQlzdHJ1Y3QgZ3NtNDhfY29udHJvbF9jaGFubmVsX2Rlc2NyIGNvbnRyb2xfY2hhbm5lbF9kZXNjOwotCXN0cnVjdCBnc200OF9jZWxsX29wdGlvbnMgY2VsbF9vcHRpb25zOwotCXN0cnVjdCBnc200OF9jZWxsX3NlbF9wYXIgY2VsbF9zZWxfcGFyOwotCXN0cnVjdCBnc200OF9yYWNoX2NvbnRyb2wgcmFjaF9jb250cm9sOwotCXVpbnQ4X3QgcmVzdF9vY3RldHNbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2VjdGlvbiA5LjEuMzYgU3lzdGVtIGluZm9ybWF0aW9uIFR5cGUgNCAqLwotc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzQgewotCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV9oZWFkZXIgaGVhZGVyOwotCXN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCBsYWk7Ci0Jc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciBjZWxsX3NlbF9wYXI7Ci0Jc3RydWN0IGdzbTQ4X3JhY2hfY29udHJvbCByYWNoX2NvbnRyb2w7Ci0JLyoJb3B0aW9uYWwgQ0JDSCBjb25kaXRpb25hbCBDQkNILi4uIGZvbGxvd2VkIGJ5Ci0JCW1hbmRhbnRvcnkgU0kgNCBSZXNldCBPY3RldHMKLQkgKi8KLQl1aW50OF90IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2VjdGlvbiA5LjEuMzcgU3lzdGVtIGluZm9ybWF0aW9uIFR5cGUgNSAqLwotc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzUgewotCXVpbnQ4X3QgcnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA6NCwKLQkJc2tpcF9pbmRpY2F0b3I6NDsgCi0JdWludDhfdCBzeXN0ZW1faW5mb3JtYXRpb247Ci0JdWludDhfdCBiY2NoX2ZyZXF1ZW5jeV9saXN0WzE2XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTZWN0aW9uIDkuMS40MCBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSA2ICovCi1zdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNiB7Ci0JdWludDhfdCBycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yIDo0LAotCQlza2lwX2luZGljYXRvcjo0OyAKLQl1aW50OF90IHN5c3RlbV9pbmZvcm1hdGlvbjsKLQl1aW50MTZfdCBjZWxsX2lkZW50aXR5OwotCXN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCBsYWk7Ci0Jc3RydWN0IGdzbTQ4X2NlbGxfb3B0aW9ucyBjZWxsX29wdGlvbnM7Ci0JdWludDhfdCBuY2NfcGVybWl0dGVkOwotCXVpbnQ4X3QgcmVzdF9vY3RldHNbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2VjdGlvbiA5LjEuNDNhIFN5c3RlbSBJbmZvcm1hdGlvbiB0eXBlIDEzICovCi1zdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMTMgewotCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV9oZWFkZXIgaGVhZGVyOwotCXVpbnQ4X3QgcmVzdF9vY3RldHNbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2VjdGlvbiA5LjIuMTIgSU1TSSBEZXRhY2ggSW5kaWNhdGlvbiAqLwotc3RydWN0IGdzbTQ4X2ltc2lfZGV0YWNoX2luZCB7Ci0Jc3RydWN0IGdzbTQ4X2NsYXNzbWFyazEgY2xhc3NtYXJrMTsKLQl1aW50OF90IG1pX2xlbjsKLQl1aW50OF90IG1pWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIFNlY3Rpb24gMTAuMiArIEdTTSAwNC4wNyAxMi4yLjMuMS4xICovCi0jZGVmaW5lIEdTTTQ4X1BESVNDX0dST1VQX0NDCTB4MDAKLSNkZWZpbmUgR1NNNDhfUERJU0NfQkNBU1RfQ0MJMHgwMQotI2RlZmluZSBHU000OF9QRElTQ19QRFNTMQkweDAyCi0jZGVmaW5lIEdTTTQ4X1BESVNDX0NDCQkweDAzCi0jZGVmaW5lIEdTTTQ4X1BESVNDX1BEU1MyCTB4MDQKLSNkZWZpbmUgR1NNNDhfUERJU0NfTU0JCTB4MDUKLSNkZWZpbmUgR1NNNDhfUERJU0NfUlIJCTB4MDYKLSNkZWZpbmUgR1NNNDhfUERJU0NfTU1fR1BSUwkweDA4Ci0jZGVmaW5lIEdTTTQ4X1BESVNDX1NNUwkJMHgwOQotI2RlZmluZSBHU000OF9QRElTQ19TTV9HUFJTCTB4MGEKLSNkZWZpbmUgR1NNNDhfUERJU0NfTkNfU1MJMHgwYgotI2RlZmluZSBHU000OF9QRElTQ19MT0MJCTB4MGMKLSNkZWZpbmUgR1NNNDhfUERJU0NfTUFTSwkweDBmCi0jZGVmaW5lIEdTTTQ4X1BESVNDX1VTU0QJMHgxMQotCi0vKiBTZWN0aW9uIDEwLjQgKi8KLSNkZWZpbmUgR1NNNDhfTVRfUlJfSU5JVF9SRVEJCTB4M2MKLSNkZWZpbmUgR1NNNDhfTVRfUlJfQUREX0FTUwkJMHgzYgotI2RlZmluZSBHU000OF9NVF9SUl9JTU1fQVNTCQkweDNmCi0jZGVmaW5lIEdTTTQ4X01UX1JSX0lNTV9BU1NfRVhUCQkweDM5Ci0jZGVmaW5lIEdTTTQ4X01UX1JSX0lNTV9BU1NfUkVKCQkweDNhCi0KLSNkZWZpbmUgR1NNNDhfTVRfUlJfQ0lQSF9NX0NNRAkJMHgzNQotI2RlZmluZSBHU000OF9NVF9SUl9DSVBIX01fQ09NUEwJMHgzMgotCi0jZGVmaW5lIEdTTTQ4X01UX1JSX0NGR19DSEdfQ01ECQkweDMwCi0jZGVmaW5lIEdTTTQ4X01UX1JSX0NGR19DSEdfQUNLCQkweDMxCi0jZGVmaW5lIEdTTTQ4X01UX1JSX0NGR19DSEdfUkVKCQkweDMzCi0KLSNkZWZpbmUgR1NNNDhfTVRfUlJfQVNTX0NNRAkJMHgyZQotI2RlZmluZSBHU000OF9NVF9SUl9BU1NfQ09NUEwJCTB4MjkKLSNkZWZpbmUgR1NNNDhfTVRfUlJfQVNTX0ZBSUwJCTB4MmYKLSNkZWZpbmUgR1NNNDhfTVRfUlJfSEFORE9fQ01ECQkweDJiCi0jZGVmaW5lIEdTTTQ4X01UX1JSX0hBTkRPX0NPTVBMCQkweDJjCi0jZGVmaW5lIEdTTTQ4X01UX1JSX0hBTkRPX0ZBSUwJCTB4MjgKLSNkZWZpbmUgR1NNNDhfTVRfUlJfSEFORE9fSU5GTwkJMHgyZAotCi0jZGVmaW5lIEdTTTQ4X01UX1JSX0NFTExfQ0hHX09SREVSCTB4MDgKLSNkZWZpbmUgR1NNNDhfTVRfUlJfUERDSF9BU1NfQ01ECTB4MjMKLQotI2RlZmluZSBHU000OF9NVF9SUl9DSEFOX1JFTAkJMHgwZAotI2RlZmluZSBHU000OF9NVF9SUl9QQVJUX1JFTAkJMHgwYQotI2RlZmluZSBHU000OF9NVF9SUl9QQVJUX1JFTF9DT01QCTB4MGYKLQotI2RlZmluZSBHU000OF9NVF9SUl9QQUdfUkVRXzEJCTB4MjEKLSNkZWZpbmUgR1NNNDhfTVRfUlJfUEFHX1JFUV8yCQkweDIyCi0jZGVmaW5lIEdTTTQ4X01UX1JSX1BBR19SRVFfMwkJMHgyNAotI2RlZmluZSBHU000OF9NVF9SUl9QQUdfUkVTUAkJMHgyNwotI2RlZmluZSBHU000OF9NVF9SUl9OT1RJRl9OQ0gJCTB4MjAKLSNkZWZpbmUgR1NNNDhfTVRfUlJfTk9USUZfRkFDQ0gJCTB4MjUKLSNkZWZpbmUgR1NNNDhfTVRfUlJfTk9USUZfUkVTUAkJMHgyNgotCi0jZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fOAkJMHgxOAotI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzEJCTB4MTkKLSNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT18yCQkweDFhCi0jZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fMwkJMHgxYgotI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzQJCTB4MWMKLSNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT181CQkweDFkCi0jZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fNgkJMHgxZQotI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzcJCTB4MWYKLQotI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzJiaXMJMHgwMgotI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzJ0ZXIJMHgwMwotI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzViaXMJMHgwNQotI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzV0ZXIJMHgwNgotI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzkJCTB4MDQKLSNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT18xMwkJMHgwMAotCi0jZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fMTYJCTB4M2QKLSNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT18xNwkJMHgzZQotCi0jZGVmaW5lIEdTTTQ4X01UX1JSX0NIQU5fTU9ERV9NT0RJRgkweDEwCi0jZGVmaW5lIEdTTTQ4X01UX1JSX1NUQVRVUwkJMHgxMgotI2RlZmluZSBHU000OF9NVF9SUl9DSEFOX01PREVfTU9ESUZfQUNLCTB4MTcKLSNkZWZpbmUgR1NNNDhfTVRfUlJfRlJFUV9SRURFRgkJMHgxNAotI2RlZmluZSBHU000OF9NVF9SUl9NRUFTX1JFUAkJMHgxNQotI2RlZmluZSBHU000OF9NVF9SUl9DTFNNX0NIRwkJMHgxNgotI2RlZmluZSBHU000OF9NVF9SUl9DTFNNX0VOUQkJMHgxMwotI2RlZmluZSBHU000OF9NVF9SUl9FWFRfTUVBU19SRVAJMHgzNgotI2RlZmluZSBHU000OF9NVF9SUl9FWFRfTUVBU19SRVBfT1JECTB4MzcKLSNkZWZpbmUgR1NNNDhfTVRfUlJfR1BSU19TVVNQX1JFUQkweDM0Ci0KLSNkZWZpbmUgR1NNNDhfTVRfUlJfVkdDU19VUExfR1JBTlQJMHgwOAotI2RlZmluZSBHU000OF9NVF9SUl9VUExJTktfUkVMRUFTRQkweDBlCi0jZGVmaW5lIEdTTTQ4X01UX1JSX1VQTElOS19GUkVFCQkweDBjCi0jZGVmaW5lIEdTTTQ4X01UX1JSX1VQTElOS19CVVNZCQkweDJhCi0jZGVmaW5lIEdTTTQ4X01UX1JSX1RBTEtFUl9JTkQJCTB4MTEKLQotI2RlZmluZSBHU000OF9NVF9SUl9BUFBfSU5GTwkJMHgzOAotCi0vKiBUYWJsZSAxMC4yLzNHUFAgVFMgMDQuMDggKi8KLSNkZWZpbmUgR1NNNDhfTVRfTU1fSU1TSV9ERVRBQ0hfSU5ECTB4MDEKLSNkZWZpbmUgR1NNNDhfTVRfTU1fTE9DX1VQRF9BQ0NFUFQJMHgwMgotI2RlZmluZSBHU000OF9NVF9NTV9MT0NfVVBEX1JFSkVDVAkweDA0Ci0jZGVmaW5lIEdTTTQ4X01UX01NX0xPQ19VUERfUkVRVUVTVAkweDA4Ci0KLSNkZWZpbmUgR1NNNDhfTVRfTU1fQVVUSF9SRUoJCTB4MTEKLSNkZWZpbmUgR1NNNDhfTVRfTU1fQVVUSF9SRVEJCTB4MTIKLSNkZWZpbmUgR1NNNDhfTVRfTU1fQVVUSF9SRVNQCQkweDE0Ci0jZGVmaW5lIEdTTTQ4X01UX01NX0lEX1JFUQkJMHgxOAotI2RlZmluZSBHU000OF9NVF9NTV9JRF9SRVNQCQkweDE5Ci0jZGVmaW5lIEdTTTQ4X01UX01NX1RNU0lfUkVBTExfQ01ECTB4MWEKLSNkZWZpbmUgR1NNNDhfTVRfTU1fVE1TSV9SRUFMTF9DT01QTAkweDFiCi0KLSNkZWZpbmUgR1NNNDhfTVRfTU1fQ01fU0VSVl9BQ0MJCTB4MjEKLSNkZWZpbmUgR1NNNDhfTVRfTU1fQ01fU0VSVl9SRUoJCTB4MjIKLSNkZWZpbmUgR1NNNDhfTVRfTU1fQ01fU0VSVl9BQk9SVAkweDIzCi0jZGVmaW5lIEdTTTQ4X01UX01NX0NNX1NFUlZfUkVRCQkweDI0Ci0jZGVmaW5lIEdTTTQ4X01UX01NX0NNX1NFUlZfUFJPTVBUCTB4MjUKLSNkZWZpbmUgR1NNNDhfTVRfTU1fQ01fUkVFU1RfUkVRCTB4MjgKLSNkZWZpbmUgR1NNNDhfTVRfTU1fQUJPUlQJCTB4MjkKLQotI2RlZmluZSBHU000OF9NVF9NTV9OVUxMCQkweDMwCi0jZGVmaW5lIEdTTTQ4X01UX01NX1NUQVRVUwkJMHgzMQotI2RlZmluZSBHU000OF9NVF9NTV9JTkZPCQkweDMyCi0KLS8qIFRhYmxlIDEwLjMvM0dQUCBUUyAwNC4wOCAqLwotI2RlZmluZSBHU000OF9NVF9DQ19BTEVSVElORwkJMHgwMQotI2RlZmluZSBHU000OF9NVF9DQ19DQUxMX0NPTkYJCTB4MDgKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfQ0FMTF9QUk9DCQkweDAyCi0jZGVmaW5lIEdTTTQ4X01UX0NDX0NPTk5FQ1QJCTB4MDcKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfQ09OTkVDVF9BQ0sJCTB4MGYKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfRU1FUkdfU0VUVVAJCTB4MGUKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfUFJPR1JFU1MJCTB4MDMKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfRVNUQUIJCTB4MDQKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfRVNUQUJfQ09ORgkJMHgwNgotI2RlZmluZSBHU000OF9NVF9DQ19SRUNBTEwJCTB4MGIKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfU1RBUlRfQ0MJCTB4MDkKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfU0VUVVAJCTB4MDUKLQotI2RlZmluZSBHU000OF9NVF9DQ19NT0RJRlkJCTB4MTcKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfTU9ESUZZX0NPTVBMCTB4MWYKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfTU9ESUZZX1JFSkVDVAkweDEzCi0jZGVmaW5lIEdTTTQ4X01UX0NDX1VTRVJfSU5GTwkJMHgxMAotI2RlZmluZSBHU000OF9NVF9DQ19IT0xECQkweDE4Ci0jZGVmaW5lIEdTTTQ4X01UX0NDX0hPTERfQUNLCQkweDE5Ci0jZGVmaW5lIEdTTTQ4X01UX0NDX0hPTERfUkVKCQkweDFhCi0jZGVmaW5lIEdTTTQ4X01UX0NDX1JFVFIJCTB4MWMKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfUkVUUl9BQ0sJCTB4MWQKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfUkVUUl9SRUoJCTB4MWUKLQotI2RlZmluZSBHU000OF9NVF9DQ19ESVNDT05ORUNUCQkweDI1Ci0jZGVmaW5lIEdTTTQ4X01UX0NDX1JFTEVBU0UJCTB4MmQKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTAkweDJhCi0KLSNkZWZpbmUgR1NNNDhfTVRfQ0NfQ09OR19DVFJMCQkweDM5Ci0jZGVmaW5lIEdTTTQ4X01UX0NDX05PVElGWQkJMHgzZQotI2RlZmluZSBHU000OF9NVF9DQ19TVEFUVVMJCTB4M2QKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfU1RBVFVTX0VOUQkJMHgzNAotI2RlZmluZSBHU000OF9NVF9DQ19TVEFSVF9EVE1GCQkweDM1Ci0jZGVmaW5lIEdTTTQ4X01UX0NDX1NUT1BfRFRNRgkJMHgzMQotI2RlZmluZSBHU000OF9NVF9DQ19TVE9QX0RUTUZfQUNLCTB4MzIKLSNkZWZpbmUgR1NNNDhfTVRfQ0NfU1RBUlRfRFRNRl9BQ0sJMHgzNgotI2RlZmluZSBHU000OF9NVF9DQ19TVEFSVF9EVE1GX1JFSgkweDM3Ci0jZGVmaW5lIEdTTTQ4X01UX0NDX0ZBQ0lMSVRZCQkweDNhCi0KLS8qIEZJWE1FOiBUYWJsZSAxMC40IC8gMTAuNGEgKEdQUlMpICovCi0KLS8qIFNlY3Rpb24gMTAuNS4yLjI2LCBUYWJsZSAxMC41LjY0ICovCi0jZGVmaW5lIEdTTTQ4X1BNX01BU0sJCTB4MDMKLSNkZWZpbmUgR1NNNDhfUE1fTk9STUFMCQkweDAwCi0jZGVmaW5lIEdTTTQ4X1BNX0VYVEVOREVECTB4MDEKLSNkZWZpbmUgR1NNNDhfUE1fUkVPUkcJCTB4MDIKLSNkZWZpbmUgR1NNNDhfUE1fU0FNRQkJMHgwMwotCi0vKiBDaGFwdGVyIDEwLjUuMy41IC8gVGFibGUgMTAuNS45MyAqLwotI2RlZmluZSBHU000OF9MVVBEX05PUk1BTAkweDAKLSNkZWZpbmUgR1NNNDhfTFVQRF9QRVJJT0RJQwkweDEKLSNkZWZpbmUgR1NNNDhfTFVQRF9JTVNJX0FUVAkweDIKLSNkZWZpbmUgR1NNNDhfTFVQRF9SRVNFUlZFRAkweDMKLQotLyogVGFibGUgMTAuNS40ICovCi0jZGVmaW5lIEdTTV9NSV9UWVBFX01BU0sJMHgwNwotI2RlZmluZSBHU01fTUlfVFlQRV9OT05FCTB4MDAKLSNkZWZpbmUgR1NNX01JX1RZUEVfSU1TSQkweDAxCi0jZGVmaW5lIEdTTV9NSV9UWVBFX0lNRUkJMHgwMgotI2RlZmluZSBHU01fTUlfVFlQRV9JTUVJU1YJMHgwMwotI2RlZmluZSBHU01fTUlfVFlQRV9UTVNJCTB4MDQKLSNkZWZpbmUgR1NNX01JX09ERAkJMHgwOAotCi0jZGVmaW5lIEdTTTQ4X0lFX01VTF9SQVRFX0NGRwkweDAzCS8qIDEwLjUuMi4yMWFhICovCi0jZGVmaW5lIEdTTTQ4X0lFX01PQklMRV9JRAkweDE3Ci0jZGVmaW5lIEdTTTQ4X0lFX05BTUVfTE9ORwkweDQzCS8qIDEwLjUuMy41YSAqLwotI2RlZmluZSBHU000OF9JRV9OQU1FX1NIT1JUCTB4NDUJLyogMTAuNS4zLjVhICovCi0jZGVmaW5lIEdTTTQ4X0lFX1VUQwkJMHg0NgkvKiAxMC41LjMuOCAqLwotI2RlZmluZSBHU000OF9JRV9ORVRfVElNRV9UWgkweDQ3CS8qIDEwLjUuMy45ICovCi0jZGVmaW5lIEdTTTQ4X0lFX0xTQV9JREVOVAkweDQ4CS8qIDEwLjUuMy4xMSAqLwotCi0jZGVmaW5lIEdTTTQ4X0lFX0JFQVJFUl9DQVAJMHgwNAkvKiAxMC41LjQuNSAqLwotI2RlZmluZSBHU000OF9JRV9DQVVTRQkJMHgwOAkvKiAxMC41LjQuMTEgKi8KLSNkZWZpbmUgR1NNNDhfSUVfQ0NfQ0FQCQkweDE1CS8qIDEwLjUuNC41YSAqLwotI2RlZmluZSBHU000OF9JRV9BTEVSVAkJMHgxOQkvKiAxMC41LjQuMjYgKi8KLSNkZWZpbmUgR1NNNDhfSUVfRkFDSUxJVFkJMHgxYwkvKiAxMC41LjQuMTUgKi8KLSNkZWZpbmUgR1NNNDhfSUVfUFJPR1JfSU5ECTB4MWUJLyogMTAuNS40LjIxICovCi0jZGVmaW5lIEdTTTQ4X0lFX0FVWF9TVEFUVVMJMHgyNAkvKiAxMC41LjQuNCAqLwotI2RlZmluZSBHU000OF9JRV9OT1RJRlkJCTB4MjcJLyogMTAuNS40LjIwICovCi0jZGVmaW5lIEdTTTQ4X0lFX0tQRF9GQUNJTElUWQkweDJjCS8qIDEwLjUuNC4xNyAqLwotI2RlZmluZSBHU000OF9JRV9TSUdOQUwJCTB4MzQJLyogMTAuNS40LjIzICovCi0jZGVmaW5lIEdTTTQ4X0lFX0NPTk5fQkNECTB4NGMJLyogMTAuNS40LjEzICovCi0jZGVmaW5lIEdTTTQ4X0lFX0NPTk5fU1VCCTB4NGQJLyogMTAuNS40LjE0ICovCi0jZGVmaW5lIEdTTTQ4X0lFX0NBTExJTkdfQkNECTB4NWMJLyogMTAuNS40LjkgKi8KLSNkZWZpbmUgR1NNNDhfSUVfQ0FMTElOR19TVUIJMHg1ZAkvKiAxMC41LjQuMTAgKi8KLSNkZWZpbmUgR1NNNDhfSUVfQ0FMTEVEX0JDRAkweDVlCS8qIDEwLjUuNC43ICovCi0jZGVmaW5lIEdTTTQ4X0lFX0NBTExFRF9TVUIJMHg2ZAkvKiAxMC41LjQuOCAqLwotI2RlZmluZSBHU000OF9JRV9SRURJUl9CQ0QJMHg3NAkvKiAxMC41LjQuMjFhICovCi0jZGVmaW5lIEdTTTQ4X0lFX1JFRElSX1NVQgkweDc1CS8qIDEwLjUuNC4yMWIgKi8KLSNkZWZpbmUgR1NNNDhfSUVfTE9XTF9DT01QQVQJMHg3YwkvKiAxMC41LjQuMTggKi8KLSNkZWZpbmUgR1NNNDhfSUVfSElHSExfQ09NUEFUCTB4N2QJLyogMTAuNS40LjE2ICovCi0jZGVmaW5lIEdTTTQ4X0lFX1VTRVJfVVNFUgkweDdlCS8qIDEwLjUuNC4yNSAqLwotI2RlZmluZSBHU000OF9JRV9TU19WRVJTCTB4N2YJLyogMTAuNS40LjI0ICovCi0jZGVmaW5lIEdTTTQ4X0lFX01PUkVfREFUQQkweGEwCS8qIDEwLjUuNC4xOSAqLwotI2RlZmluZSBHU000OF9JRV9DTElSX1NVUFAJMHhhMQkvKiAxMC41LjQuMTFhICovCi0jZGVmaW5lIEdTTTQ4X0lFX0NMSVJfSU5WT0MJMHhhMgkvKiAxMC41LjQuMTFiICovCi0jZGVmaW5lIEdTTTQ4X0lFX1JFVl9DX1NFVFVQCTB4YTMJLyogMTAuNS40LjIyYSAqLwotI2RlZmluZSBHU000OF9JRV9SRVBFQVRfQ0lSCTB4ZDEJLyogMTAuNS40LjIyICovCi0jZGVmaW5lIEdTTTQ4X0lFX1JFUEVBVF9TRVEJMHhkMwkvKiAxMC41LjQuMjIgKi8KLQotLyogU2VjdGlvbiAxMC41LjQuMTEgLyBUYWJsZSAxMC41LjEyMiAqLwotI2RlZmluZSBHU000OF9DQVVTRV9DU19HU00JMHg2MAotCi0vKiBTZWN0aW9uIDkuMS4yIC8gVGFibGUgOS4zICovCi0jZGVmaW5lIEdTTTQ4X0lFX0ZSUUxJU1RfQUZURVIJMHgwNQotI2RlZmluZSBHU000OF9JRV9DRUxMX0NIX0RFU0MJMHg2MgotI2RlZmluZSBHU000OF9JRV9NU0xPVF9ERVNDCTB4MTAKLSNkZWZpbmUgR1NNNDhfSUVfQ0hBTk1PREVfMQkweDYzCi0jZGVmaW5lIEdTTTQ4X0lFX0NIQU5NT0RFXzIJMHgxMQotI2RlZmluZSBHU000OF9JRV9DSEFOTU9ERV8zCTB4MTMKLSNkZWZpbmUgR1NNNDhfSUVfQ0hBTk1PREVfNAkweDE0Ci0jZGVmaW5lIEdTTTQ4X0lFX0NIQU5NT0RFXzUJMHgxNQotI2RlZmluZSBHU000OF9JRV9DSEFOTU9ERV82CTB4MTYKLSNkZWZpbmUgR1NNNDhfSUVfQ0hBTk1PREVfNwkweDE3Ci0jZGVmaW5lIEdTTTQ4X0lFX0NIQU5NT0RFXzgJMHgxOAotI2RlZmluZSBHU000OF9JRV9DSEFOREVTQ18yCTB4NjQKLS8qIEZJWE1FICovCi0KLS8qIFNlY3Rpb24gMTAuNS40LjIzIC8gVGFibGUgMTAuNS4xMzAgKi8KLWVudW0gZ3NtNDhfc2lnbmFsX3ZhbCB7Ci0JR1NNNDhfU0lHTkFMX0RJQUxUT05FCT0gMHgwMCwKLQlHU000OF9TSUdOQUxfUklOR0JBQ0sJPSAweDAxLAotCUdTTTQ4X1NJR05BTF9JTlRFUkNFUFQJPSAweDAyLAotCUdTTTQ4X1NJR05BTF9ORVRfQ09ORwk9IDB4MDMsCi0JR1NNNDhfU0lHTkFMX0JVU1kJPSAweDA0LAotCUdTTTQ4X1NJR05BTF9DT05GSVJNCT0gMHgwNSwKLQlHU000OF9TSUdOQUxfQU5TV0VSCT0gMHgwNiwKLQlHU000OF9TSUdOQUxfQ0FMTF9XQUlUCT0gMHgwNywKLQlHU000OF9TSUdOQUxfT0ZGX0hPT0sJPSAweDA4LAotCUdTTTQ4X1NJR05BTF9PRkYJPSAweDNmLAotCUdTTTQ4X1NJR05BTF9BTEVSVF9PRkYJPSAweDRmLAotfTsKLQotZW51bSBnc200OF9jYXVzZV9sb2MgewotCUdTTTQ4X0NBVVNFX0xPQ19VU0VSCQk9IDB4MDAsCi0JR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVCT0gMHgwMSwKLQlHU000OF9DQVVTRV9MT0NfUFVOX1NfTFUJPSAweDAyLAotCUdTTTQ4X0NBVVNFX0xPQ19UUkFOU19ORVQJPSAweDAzLAotCUdTTTQ4X0NBVVNFX0xPQ19QVU5fU19SVQk9IDB4MDQsCi0JR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX1JVCT0gMHgwNSwKLQkvKiBub3QgZGVmaW5lZCAqLwotCUdTTTQ4X0NBVVNFX0xPQ19JTk5fTkVUCQk9IDB4MDcsCi0JR1NNNDhfQ0FVU0VfTE9DX05FVF9CRVlPTkQJPSAweDBhLAotfTsKLQotLyogU2VjdGlvbiAxMC41LjIuMzEgUlIgQ2F1c2UgLyBUYWJsZSAxMC41LjcwICovCi1lbnVtIGdzbTQ4X3JyX2NhdXNlIHsKLQlHU000OF9SUl9DQVVTRV9OT1JNQUwJCT0gMHgwMCwKLQlHU000OF9SUl9DQVVTRV9BQk5PUk1BTF9VTlNQRUMJPSAweDAxLAotCUdTTTQ4X1JSX0NBVVNFX0FCTk9STUFMX1VOQUNDVAk9IDB4MDIsCi0JR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfVElNRVIJPSAweDAzLAotCUdTTTQ4X1JSX0NBVVNFX0FCTk9STUFMX05PQUNUCT0gMHgwNCwKLQlHU000OF9SUl9DQVVTRV9QUkVNUFRJVkVfUkVMCT0gMHgwNSwKLQlHU000OF9SUl9DQVVTRV9ITkRPVkVSX0lNUAk9IDB4MDYsCi0JR1NNNDhfUlJfQ0FVU0VfQ0hBTl9NT0RFX1VOQUNDVAk9IDB4MDcsCi0JR1NNNDhfUlJfQ0FVU0VfRlJFUV9OT1RfSU1QTAk9IDB4MDgsCi0JR1NNNDhfUlJfQ0FVU0VfQ0FMTF9DTEVBUkVECT0gMHg0MSwKLQlHU000OF9SUl9DQVVTRV9TRU1BTlRfSU5DT1JSCT0gMHg1ZiwKLQlHU000OF9SUl9DQVVTRV9JTlZBTElEX01BTkRfSU5GID0gMHg2MCwKLQlHU000OF9SUl9DQVVTRV9NU0dfVFlQRV9OCT0gMHg2MSwKLQlHU000OF9SUl9DQVVTRV9NU0dfVFlQRV9OX0NPTVBBVD0gMHg2MiwKLQlHU000OF9SUl9DQVVTRV9DT05EX0lFX0VSUk9SCT0gMHg2NCwKLQlHU000OF9SUl9DQVVTRV9OT19DRUxMX0FMTE9DX0EJPSAweDY1LAotCUdTTTQ4X1JSX0NBVVNFX1BST1RfRVJST1JfVU5TUEMgPSAweDZmLAotfTsKLQotLyogU2VjdGlvbiAxMC41LjQuMTEgQ0MgQ2F1c2UgLyBUYWJsZSAxMC41LjEyMyAqLwotZW51bSBnc200OF9jY19jYXVzZSB7Ci0JR1NNNDhfQ0NfQ0FVU0VfVU5BU1NJR05FRF9OUgk9IDEsCi0JR1NNNDhfQ0NfQ0FVU0VfTk9fUk9VVEUJCT0gMywKLQlHU000OF9DQ19DQVVTRV9DSEFOX1VOQUNDRVBUCT0gNiwKLQlHU000OF9DQ19DQVVTRV9PUF9ERVRfQkFSUklORwk9IDgsCi0JR1NNNDhfQ0NfQ0FVU0VfTk9STV9DQUxMX0NMRUFSCT0gMTYsCi0JR1NNNDhfQ0NfQ0FVU0VfVVNFUl9CVVNZCT0gMTcsCi0JR1NNNDhfQ0NfQ0FVU0VfVVNFUl9OT1RSRVNQT05ECT0gMTgsCi0JR1NNNDhfQ0NfQ0FVU0VfVVNFUl9BTEVSVElOR19OQQk9IDE5LAotCUdTTTQ4X0NDX0NBVVNFX0NBTExfUkVKRUNURUQJPSAyMSwKLQlHU000OF9DQ19DQVVTRV9OVU1CRVJfQ0hBTkdFRAk9IDIyLAotCUdTTTQ4X0NDX0NBVVNFX1BSRV9FTVBUSU9OCT0gMjUsCi0JR1NNNDhfQ0NfQ0FVU0VfTk9OU0VfVVNFUl9DTFIJPSAyNiwKLQlHU000OF9DQ19DQVVTRV9ERVNUX09PTwkJPSAyNywKLQlHU000OF9DQ19DQVVTRV9JTlZfTlJfRk9STUFUCT0gMjgsCi0JR1NNNDhfQ0NfQ0FVU0VfRkFDSUxJVFlfUkVKCT0gMjksCi0JR1NNNDhfQ0NfQ0FVU0VfUkVTUF9TVEFUVVNfSU5RCT0gMzAsCi0JR1NNNDhfQ0NfQ0FVU0VfTk9STUFMX1VOU1BFQwk9IDMxLAotCUdTTTQ4X0NDX0NBVVNFX05PX0NJUkNVSVRfQ0hBTgk9IDM0LAotCUdTTTQ4X0NDX0NBVVNFX05FVFdPUktfT09PCT0gMzgsCi0JR1NNNDhfQ0NfQ0FVU0VfVEVNUF9GQUlMVVJFCT0gNDEsCi0JR1NNNDhfQ0NfQ0FVU0VfU1dJVENIX0NPTkcJPSA0MiwKLQlHU000OF9DQ19DQVVTRV9BQ0NfSU5GX0RJU0NBUkQJPSA0MywKLQlHU000OF9DQ19DQVVTRV9SRVFfQ0hBTl9VTkFWQUlMCT0gNDQsCi0JR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTAk9IDQ3LAotCUdTTTQ4X0NDX0NBVVNFX1FPU19VTkFWQUlMCT0gNDksCi0JR1NNNDhfQ0NfQ0FVU0VfUkVRX0ZBQ19OT1RfU1VCU0M9IDUwLAotCUdTTTQ4X0NDX0NBVVNFX0lOQ19CQVJSRURfQ1VHCT0gNTUsCi0JR1NNNDhfQ0NfQ0FVU0VfQkVBUkVSX0NBUF9VTkFVVEg9IDU3LAotCUdTTTQ4X0NDX0NBVVNFX0JFQVJFUl9DQV9VTkFWQUlMPSA1OCwKLQlHU000OF9DQ19DQVVTRV9TRVJWX09QVF9VTkFWQUlMCT0gNjMsCi0JR1NNNDhfQ0NfQ0FVU0VfQkVBUkVSU0VSVl9VTklNUEw9IDY1LAotCUdTTTQ4X0NDX0NBVVNFX0FDTV9HRV9BQ01fTUFYCT0gNjgsCi0JR1NNNDhfQ0NfQ0FVU0VfUkVRX0ZBQ19OT1RJTVBMCT0gNjksCi0JR1NNNDhfQ0NfQ0FVU0VfUkVTVFJfQkNBUF9BVkFJTAk9IDcwLAotCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOSU1QTAk9IDc5LAotCUdTTTQ4X0NDX0NBVVNFX0lOVkFMX1RSQU5TX0lECT0gODEsCi0JR1NNNDhfQ0NfQ0FVU0VfVVNFUl9OT1RfSU5fQ1VHCT0gODcsCi0JR1NNNDhfQ0NfQ0FVU0VfSU5DT01QQVRfREVTVAk9IDg4LAotCUdTTTQ4X0NDX0NBVVNFX0lOVkFMX1RSQU5TX05FVAk9IDkxLAotCUdTTTQ4X0NDX0NBVVNFX1NFTUFOVElDX0lOQ09SUgk9IDk1LAotCUdTTTQ4X0NDX0NBVVNFX0lOVkFMX01BTkRfSU5GCT0gOTYsCi0JR1NNNDhfQ0NfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVAk9IDk3LAotCUdTTTQ4X0NDX0NBVVNFX01TR1RZUEVfSU5DT01QQVQJPSA5OCwKLQlHU000OF9DQ19DQVVTRV9JRV9OT1RFWElTVAk9IDk5LAotCUdTTTQ4X0NDX0NBVVNFX0NPTkRfSUVfRVJSCT0gMTAwLAotCUdTTTQ4X0NDX0NBVVNFX01TR19JTkNPTVBfU1RBVEUJPSAxMDEsCi0JR1NNNDhfQ0NfQ0FVU0VfUkVDT1ZFUllfVElNRVIJPSAxMDIsCi0JR1NNNDhfQ0NfQ0FVU0VfUFJPVE9fRVJSCT0gMTExLAotCUdTTTQ4X0NDX0NBVVNFX0lOVEVSV09SS0lORwk9IDEyNywKLX07Ci0KLS8qIEFubmV4IEcsIEdTTSBzcGVjaWZpYyBjYXVzZSB2YWx1ZXMgZm9yIG1vYmlsaXR5IG1hbmFnZW1lbnQgKi8KLWVudW0gZ3NtNDhfcmVqZWN0X3ZhbHVlIHsKLQlHU000OF9SRUpFQ1RfSU1TSV9VTktOT1dOX0lOX0hMUgk9IDIsCi0JR1NNNDhfUkVKRUNUX0lMTEVHQUxfTVMJCQk9IDMsCi0JR1NNNDhfUkVKRUNUX0lNU0lfVU5LTk9XTl9JTl9WTFIJPSA0LAotCUdTTTQ4X1JFSkVDVF9JTUVJX05PVF9BQ0NFUFRFRAkJPSA1LAotCUdTTTQ4X1JFSkVDVF9JTExFR0FMX01FCQkJPSA2LAotCUdTTTQ4X1JFSkVDVF9QTE1OX05PVF9BTExPV0VECQk9IDExLAotCUdTTTQ4X1JFSkVDVF9MT0NfTk9UX0FMTE9XRUQJCT0gMTIsCi0JR1NNNDhfUkVKRUNUX1JPQU1JTkdfTk9UX0FMTE9XRUQJPSAxMywKLQlHU000OF9SRUpFQ1RfTkVUV09SS19GQUlMVVJFCQk9IDE3LAotCUdTTTQ4X1JFSkVDVF9DT05HRVNUSU9OCQkJPSAyMiwKLQlHU000OF9SRUpFQ1RfU1JWX09QVF9OT1RfU1VQUE9SVEVECT0gMzIsCi0JR1NNNDhfUkVKRUNUX1JRRF9TUlZfT1BUX05PVF9TVVBQT1JURUQJPSAzMywKLQlHU000OF9SRUpFQ1RfU1JWX09QVF9UTVBfT1VUX09GX09SREVSCT0gMzQsCi0JR1NNNDhfUkVKRUNUX0NBTExfQ0FOX05PVF9CRV9JREVOVElGSUVECT0gMzgsCi0JR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFCQk9IDk1LAotCUdTTTQ4X1JFSkVDVF9JTlZBTElEX01BTkRBTlRPUllfSU5GCT0gOTYsCi0JR1NNNDhfUkVKRUNUX01TR19UWVBFX05PVF9JTVBMRU1FTlRFRAk9IDk3LAotCUdTTTQ4X1JFSkVDVF9NU0dfVFlQRV9OT1RfQ09NUEFUSUJMRQk9IDk4LAotCUdTTTQ4X1JFSkVDVF9JTkZfRUxFTUVfTk9UX0lNUExFTUVOVEVECT0gOTksCi0JR1NNNDhfUkVKRUNUX0NPTkRUSU9OQUxfSUVfRVJST1IJPSAxMDAsCi0JR1NNNDhfUkVKRUNUX01TR19OT1RfQ09NUEFUSUJMRQkJPSAxMDEsCi0JR1NNNDhfUkVKRUNUX1BST1RPQ09MX0VSUk9SCQk9IDExMSwKLQotCS8qIGFjY29yZGluZyB0byBHLjYgQWRkaXRpb25hbCBjYXVzZSBjb2RlcyBmb3IgR01NICovCi0JR1NNNDhfUkVKRUNUX0dQUlNfTk9UX0FMTE9XRUQJCT0gNywKLQlHU000OF9SRUpFQ1RfU0VSVklDRVNfTk9UX0FMTE9XRUQJPSA4LAotCUdTTTQ4X1JFSkVDVF9NU19JREVOVElUWV9OT1RfREVSVklWQUJMRSA9IDksCi0JR1NNNDhfUkVKRUNUX0lNUExJQ0lUTFlfREVUQUNIRUQJPSAxMCwKLQlHU000OF9SRUpFQ1RfR1BSU19OT1RfQUxMT1dFRF9JTl9QTE1OCT0gMTQsCi0JR1NNNDhfUkVKRUNUX01TQ19UTVBfTk9UX1JFQUNIQUJMRQk9IDE2LAotfTsKLQotZW51bSBjaHJlcV90eXBlIHsKLQlDSFJFUV9UX0VNRVJHX0NBTEwsCi0JQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9GLAotCUNIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSCwKLQlDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hfREJMLAotCUNIUkVRX1RfU0RDQ0gsCi0JQ0hSRVFfVF9UQ0hfRiwKLQlDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0gsCi0JQ0hSRVFfVF9EQVRBX0NBTExfVENIX0gsCi0JQ0hSRVFfVF9MT0NBVElPTl9VUEQsCi0JQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTAsCi0JQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTEsCi0JQ0hSRVFfVF9QQUdfUl9UQ0hfRiwKLQlDSFJFUV9UX1BBR19SX1RDSF9GSCwKLQlDSFJFUV9UX0xNVSwKLQlDSFJFUV9UX1JFU0VSVkVEX1NEQ0NILAotCUNIUkVRX1RfUkVTRVJWRURfSUdOT1JFLAotfTsKLQotLyogQ2hhcHRlciAxMS4zICovCi0jZGVmaW5lIEdTTTQ4X1QzMDEJMTgwLCAwCi0jZGVmaW5lIEdTTTQ4X1QzMDMJMzAsIDAKLSNkZWZpbmUgR1NNNDhfVDMwNQkzMCwgMAotI2RlZmluZSBHU000OF9UMzA2CTMwLCAwCi0jZGVmaW5lIEdTTTQ4X1QzMDgJMTAsIDAKLSNkZWZpbmUgR1NNNDhfVDMxMAkxODAsIDAKLSNkZWZpbmUgR1NNNDhfVDMxMwkzMCwgMAotI2RlZmluZSBHU000OF9UMzIzCTMwLCAwCi0jZGVmaW5lIEdTTTQ4X1QzMzEJMzAsIDAKLSNkZWZpbmUgR1NNNDhfVDMzMwkzMCwgMAotI2RlZmluZSBHU000OF9UMzM0CTI1LCAwIC8qIG1pbiAxNSAqLwotI2RlZmluZSBHU000OF9UMzM4CTMwLCAwCi0KLS8qIENoYXB0ZXIgNS4xLjIuMiAqLwotI2RlZmluZQlHU01fQ1NUQVRFX05VTEwJCQkwCi0jZGVmaW5lCUdTTV9DU1RBVEVfSU5JVElBVEVECQkxCi0jZGVmaW5lCUdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DCQkzCi0jZGVmaW5lCUdTTV9DU1RBVEVfQ0FMTF9ERUxJVkVSRUQJNAotI2RlZmluZQlHU01fQ1NUQVRFX0NBTExfUFJFU0VOVAkJNgotI2RlZmluZQlHU01fQ1NUQVRFX0NBTExfUkVDRUlWRUQJNwotI2RlZmluZQlHU01fQ1NUQVRFX0NPTk5FQ1RfUkVRVUVTVAk4Ci0jZGVmaW5lCUdTTV9DU1RBVEVfTU9fVEVSTV9DQUxMX0NPTkYJOQotI2RlZmluZQlHU01fQ1NUQVRFX0FDVElWRQkJMTAKLSNkZWZpbmUJR1NNX0NTVEFURV9ESVNDT05ORUNUX1JFUQkxMgotI2RlZmluZQlHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfSU5ECTEyCi0jZGVmaW5lCUdTTV9DU1RBVEVfUkVMRUFTRV9SRVEJCTE5Ci0jZGVmaW5lCUdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkJMjYKLSNkZWZpbmUJR1NNX0NTVEFURV9NT19URVJNX01PRElGWQkyNwotI2RlZmluZQlHU01fQ1NUQVRFX0NPTk5FQ1RfSU5ECQkyOAotCi0jZGVmaW5lIFNCSVQoYSkgKDEgPDwgYSkKLSNkZWZpbmUgQUxMX1NUQVRFUyAweGZmZmZmZmZmCi0KLS8qIFRhYmxlIDEwLjUuMy8zR1BQIFRTIDA0LjA4OiBMb2NhdGlvbiBBcmVhIElkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KLSNkZWZpbmUgR1NNX0xBQ19SRVNFUlZFRF9ERVRBQ0hFRCAgICAgICAweDAKLSNkZWZpbmUgR1NNX0xBQ19SRVNFUlZFRF9BTExfQlRTICAgICAgICAweGZmZmUKLQotLyogR1NNIDA0LjA4IEJlYXJlciBDYXBhYmlsaXR5OiBJbmZvcm1hdGlvbiBUcmFuc2ZlciBDYXBhYmlsaXR5ICovCi1lbnVtIGdzbTQ4X2JjYXBfaXRjYXAgewotCUdTTTQ4X0JDQVBfSVRDQVBfU1BFRUNICQk9IDAsCi0JR1NNNDhfQkNBUF9JVENBUF9VTlJfRElHX0lORgk9IDEsCi0JR1NNNDhfQkNBUF9JVENBUF8zazFfQVVESU8JPSAyLAotCUdTTTQ4X0JDQVBfSVRDQVBfRkFYX0czCQk9IDMsCi0JR1NNNDhfQkNBUF9JVENBUF9PVEhFUgkJPSA1LAotCUdTTTQ4X0JDQVBfSVRDQVBfUkVTRVJWRUQJPSA3LAotfTsKLQotLyogR1NNIDA0LjA4IEJlYXJlciBDYXBhYmlsaXR5OiBUcmFuc2ZlciBNb2RlICovCi1lbnVtIGdzbTQ4X2JjYXBfdG1vZCB7Ci0JR1NNNDhfQkNBUF9UTU9EX0NJUkNVSVQJCT0gMCwKLQlHU000OF9CQ0FQX1RNT0RfUEFDS0VUCQk9IDEsCi19OwotCi0vKiBHU00gMDQuMDggQmVhcmVyIENhcGFiaWxpdHk6IENvZGluZyBTdGFuZGFyZCAqLwotZW51bSBnc200OF9iY2FwX2NvZGluZyB7Ci0JR1NNNDhfQkNBUF9DT0RJTkdfR1NNX1NURAk9IDAsCi19OwotCi0vKiBHU00gMDQuMDggQmVhcmVyIENhcGFiaWxpdHk6IFJhZGlvIENoYW5uZWwgUmVxdWlyZW1lbnRzICovCi1lbnVtIGdzbTQ4X2JjYXBfcnJxIHsKLQlHU000OF9CQ0FQX1JSUV9GUl9PTkxZCT0gMSwKLQlHU000OF9CQ0FQX1JSUV9EVUFMX0hSCT0gMiwKLQlHU000OF9CQ0FQX1JSUV9EVUFMX0ZSCT0gMywKLX07Ci0KLQotI2RlZmluZSBHU000OF9UTVNJX0xFTgk1Ci0jZGVmaW5lIEdTTTQ4X01JRF9UTVNJX0xFTgkoR1NNNDhfVE1TSV9MRU4gKyAyKQotI2RlZmluZSBHU000OF9NSV9TSVpFIDMyCi0KLQotI2VuZGlmIC8qIFBST1RPX0dTTV8wNF8wOF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhMmIxOS4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLSNpZm5kZWYgUFJPVE9fR1NNXzA0XzExX0gKLSNkZWZpbmUgUFJPVE9fR1NNXzA0XzExX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vKiBHU00gVFMgMDQuMTEgIGRlZmluaXRpb25zICovCi0KLS8qIENoYXB0ZXIgNS4yLjM6IFNNQy1DUyBzdGF0ZXMgYXQgdGhlIG5ldHdvcmsgc2lkZSAqLwotZW51bSBnc200MTFfY3Bfc3RhdGUgewotCUdTTTQxMV9DUFNfSURMRSAJCT0gMCwKLQlHU000MTFfQ1BTX01NX0NPTk5fUEVORElORwk9IDEsCS8qIG9ubHkgTVQgISAqLwotCUdTTTQxMV9DUFNfV0FJVF9DUF9BQ0sJCT0gMiwKLQlHU000MTFfQ1BTX01NX0VTVEFCTElTSEVECT0gMywKLX07Ci0KLS8qIENoYXB0ZXIgNi4yLjI6IFNNUiBzdGF0ZXMgYXQgdGhlIG5ldHdvcmsgc2lkZSAqLwotZW51bSBnc200MTFfcnBfc3RhdGUgewotCUdTTTQxMV9SUFNfSURMRQkJCT0gMCwKLQlHU000MTFfUlBTX1dBSVRfRk9SX1JQX0FDSwk9IDEsCi0JR1NNNDExX1JQU19XQUlUX1RPX1RYX1JQX0FDSwk9IDMsCi19OwotCi0vKiBDaGFwdGVyIDguMS4yIChyZWZlcnMgdG8gR1NNIDA0LjA3IENoYXB0ZXIgMTEuMi4zLjEuMSAqLwotI2RlZmluZSBHU000MTFfUERJU0NfU01TCTB4MDkKLQotLyogQ2hhcHRlciA4LjEuMyAqLwotI2RlZmluZSBHU000MTFfTVRfQ1BfREFUQQkweDAxCi0jZGVmaW5lIEdTTTQxMV9NVF9DUF9BQ0sJMHgwNAotI2RlZmluZSBHU000MTFfTVRfQ1BfRVJST1IJMHgxMAotCi1lbnVtIGdzbTQxMV9jcF9pZSB7Ci0JR1NNNDExX0NQX0lFX1VTRVJfREFUQQkJPSAweDAxLAkvKiA4LjEuNC4xICovCi0JR1NNNDExX0NQX0lFX0NBVVNFCQk9IDB4MDIsCS8qIDguMS40LjIuICovCi19OwotCi0vKiBTZWN0aW9uIDguMS40LjIgLyBUYWJsZSA4LjIgKi8KLWVudW0gZ3NtNDExX2NwX2NhdXNlIHsKLQlHU000MTFfQ1BfQ0FVU0VfTkVUX0ZBSUwJPSAxNywKLQlHU000MTFfQ1BfQ0FVU0VfQ09OR0VTVElPTgk9IDIyLAotCUdTTTQxMV9DUF9DQVVTRV9JTlZfVFJBTlNfSUQJPSA4MSwKLQlHU000MTFfQ1BfQ0FVU0VfU0VNQU5UX0lOQ19NU0cJPSA5NSwKLQlHU000MTFfQ1BfQ0FVU0VfSU5WX01BTkRfSU5GCT0gOTYsCi0JR1NNNDExX0NQX0NBVVNFX01TR1RZUEVfTk9URVhJU1Q9IDk3LAotCUdTTTQxMV9DUF9DQVVTRV9NU0dfSU5DT01QX1NUQVRFPSA5OCwKLQlHU000MTFfQ1BfQ0FVU0VfSUVfTk9URVhJU1QJPSA5OSwKLQlHU000MTFfQ1BfQ0FVU0VfUFJPVE9DT0xfRVJSCT0gMTExLAotfTsKLQotLyogQ2hhcHRlciA4LjIuMiAqLwotI2RlZmluZSBHU000MTFfTVRfUlBfREFUQV9NTwkweDAwCi0jZGVmaW5lIEdTTTQxMV9NVF9SUF9EQVRBX01UCTB4MDEKLSNkZWZpbmUgR1NNNDExX01UX1JQX0FDS19NTwkweDAyCi0jZGVmaW5lIEdTTTQxMV9NVF9SUF9BQ0tfTVQJMHgwMwotI2RlZmluZSBHU000MTFfTVRfUlBfRVJST1JfTU8JMHgwNAotI2RlZmluZSBHU000MTFfTVRfUlBfRVJST1JfTVQJMHgwNQotI2RlZmluZSBHU000MTFfTVRfUlBfU01NQV9NTwkweDA2Ci0KLWVudW0gZ3NtNDExX3JwX2llIHsKLQlHU000MTFfSUVfUlBfVVNFUl9EQVRBCQk9IDB4NDEsCS8qIDguMi41LjMgKi8KLQlHU000MTFfSUVfUlBfQ0FVU0UJCT0gMHg0MiwJLyogOC4yLjUuNCAqLwotfTsKLQotLyogQ2hhcHRlciA4LjIuNS40IFRhYmxlIDguNCAqLwotZW51bSBnc200MTFfcnBfY2F1c2UgewotCS8qIHZhbGlkIG9ubHkgZm9yIE1PICovCi0JR1NNNDExX1JQX0NBVVNFX01PX05VTV9VTkFTU0lHTkVECT0gMSwKLQlHU000MTFfUlBfQ0FVU0VfTU9fT1BfREVUX0JBUlIJCT0gOCwKLQlHU000MTFfUlBfQ0FVU0VfTU9fQ0FMTF9CQVJSRUQJCT0gMTAsCi0JR1NNNDExX1JQX0NBVVNFX01PX1NNU19SRUpFQ1RFRAkJPSAyMSwKLQlHU000MTFfUlBfQ0FVU0VfTU9fREVTVF9PVVRfT0ZfT1JERVIJPSAyNywKLQlHU000MTFfUlBfQ0FVU0VfTU9fVU5JREVOVElGSUVEX1NVQlNDUgk9IDI4LAotCUdTTTQxMV9SUF9DQVVTRV9NT19GQUNJTElUWV9SRUoJCT0gMjksCi0JR1NNNDExX1JQX0NBVVNFX01PX1VOS05PV05fU1VCU0NSCT0gMzAsCi0JR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVIJPSAzOCwKLQlHU000MTFfUlBfQ0FVU0VfTU9fVEVNUF9GQUlMCQk9IDQxLAotCUdTTTQxMV9SUF9DQVVTRV9NT19DT05HRVNUSU9OCQk9IDQyLAotCUdTTTQxMV9SUF9DQVVTRV9NT19SRVNfVU5BVkFJTAkJPSA0NywKLQlHU000MTFfUlBfQ0FVU0VfTU9fUkVRX0ZBQ19OT1RTVUJTQ1IJPSA1MCwKLQlHU000MTFfUlBfQ0FVU0VfTU9fUkVRX0ZBQ19OT1RJTVBMCT0gNjksCi0JR1NNNDExX1JQX0NBVVNFX01PX0lOVEVSV09SS0lORwkJPSAxMjcsCi0JLyogdmFsaWQgb25seSBmb3IgTVQgKi8KLQlHU000MTFfUlBfQ0FVU0VfTVRfTUVNX0VYQ0VFREVECQk9IDIyLAotCS8qIHZhbGlkIGZvciBib3RoIGRpcmVjdGlvbnMgKi8KLQlHU000MTFfUlBfQ0FVU0VfSU5WX1RSQU5TX1JFRgkJPSA4MSwKLQlHU000MTFfUlBfQ0FVU0VfU0VNQU5UX0lOQ19NU0cJCT0gOTUsCi0JR1NNNDExX1JQX0NBVVNFX0lOVl9NQU5EX0lORgkJPSA5NiwKLQlHU000MTFfUlBfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVAk9IDk3LAotCUdTTTQxMV9SUF9DQVVTRV9NU0dfSU5DT01QX1NUQVRFCT0gOTgsCi0JR1NNNDExX1JQX0NBVVNFX0lFX05PVEVYSVNUCQk9IDk5LAotCUdTTTQxMV9SUF9DQVVTRV9QUk9UT0NPTF9FUlIJCT0gMTExLAotfTsKLQotLyogQ2hhcHRlciAxMDogVGltZXJzICovCi0jZGVmaW5lIEdTTTQxMV9UTVJfVFIxTQkJNDAsIDAJLyogMzUgPCB4IDwgNDUgc2Vjb25kcyAqLwotI2RlZmluZSBHU000MTFfVE1SX1RSQU0JCTMwLCAwCS8qIDI1IDwgeCA8IDM1IHNlY29uZHMgKi8KLSNkZWZpbmUgR1NNNDExX1RNUl9UUjJNCQkxNSwgMAkvKiAxMiA8IHggPCAyMCBzZWNvbmRzICovCi0KLSNkZWZpbmUgR1NNNDExX1RNUl9UQzFBCQkzMCwgMAotCi0vKiBDaGFwdGVyIDguMi4xICovCi1zdHJ1Y3QgZ3NtNDExX3JwX2hkciB7Ci0JdWludDhfdCBsZW47Ci0JdWludDhfdCBtc2dfdHlwZTsKLQl1aW50OF90IG1zZ19yZWY7Ci0JdWludDhfdCBkYXRhWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIG91ciBvd24gZW51bSwgbm90IHJlbGF0ZWQgdG8gb24tYWlyIHByb3RvY29sICovCi1lbnVtIHNtc19hbHBoYWJldCB7Ci0JRENTX05PTkUsCi0JRENTXzdCSVRfREVGQVVMVCwKLQlEQ1NfVUNTMiwKLQlEQ1NfOEJJVF9EQVRBLAotfTsKLQotLyogR1NNIDAzLjQwIC8gQ2hhcHRlciA5LjIuMy4xOiBUUC1NZXNzYWdlLVR5cGUtSW5kaWNhdG9yICovCi0jZGVmaW5lIEdTTTM0MF9TTVNfREVMSVZFUl9TQzJNUwkweDAwCi0jZGVmaW5lIEdTTTM0MF9TTVNfREVMSVZFUl9SRVBfTVMyU0MJMHgwMAotI2RlZmluZSBHU00zNDBfU01TX1NUQVRVU19SRVBfU0MyTVMJMHgwMgotI2RlZmluZSBHU00zNDBfU01TX0NPTU1BTkRfTVMyU0MJMHgwMgotI2RlZmluZSBHU00zNDBfU01TX1NVQk1JVF9NUzJTQwkJMHgwMQotI2RlZmluZSBHU00zNDBfU01TX1NVQk1JVF9SRVBfU0MyTVMJMHgwMQotI2RlZmluZSBHU00zNDBfU01TX1JFU1NFUlZFRAkJMHgwMwotCi0vKiBHU00gMDMuNDAgLyBDaGFwdGVyIDkuMi4zLjI6IFRQLU1vcmUtTWVzc2FnZXMtdG8tU2VuZCAqLwotI2RlZmluZSBHU00zNDBfVFBfTU1TX01PUkUJCTAKLSNkZWZpbmUgR1NNMzQwX1RQX01NU19OT19NT1JFCQkxCi0KLS8qIEdTTSAwMy40MCAvIENoYXB0ZXIgOS4yLjMuMzogVFAtVmFsaWRpdHktUGVyaW9kLUZvcm1hdCAqLwotI2RlZmluZSBHU00zNDBfVFBfVlBGX05PTkUJCTAKLSNkZWZpbmUgR1NNMzQwX1RQX1ZQRl9SRUxBVElWRQkJMgotI2RlZmluZSBHU00zNDBfVFBfVlBGX0VOSEFOQ0VECQkxCi0jZGVmaW5lIEdTTTM0MF9UUF9WUEZfQUJTT0xVVEUJCTMKLQotLyogR1NNIDAzLjQwIC8gQ2hhcHRlciA5LjIuMy40OiBUUC1TdGF0dXMtUmVwb3J0LUluZGljYXRpb24gKi8KLSNkZWZpbmUgR1NNMzQwX1RQX1NSSV9OT05FCQkwCi0jZGVmaW5lIEdTTTM0MF9UUF9TUklfUFJFU0VOVAkJMQotCi0vKiBHU00gMDMuNDAgLyBDaGFwdGVyIDkuMi4zLjU6IFRQLVN0YXR1cy1SZXBvcnQtUmVxdWVzdCAqLwotI2RlZmluZSBHU00zNDBfVFBfU1JSX05PTkUJCTAKLSNkZWZpbmUgR1NNMzQwX1RQX1NSUl9SRVFVRVNURUQJCTEKLQotLyogR1NNIDAzLjQwIC8gQ2hhcHRlciA5LjIuMy45OiBUUC1Qcm90b2NvbC1JZGVudGlmaWVyICovCi0vKiB0ZWxlbWF0aWMgaW50ZXJ3b3JraW5nICgwMDEgb3IgMTExIGluIGJpdHMgNy01KSAqLwotI2RlZmluZSBHU00zNDBfVFBfUElEX0lNUExJQ0lUCQkweDAwCi0jZGVmaW5lIEdTTTM0MF9UUF9QSURfVEVMRVgJCTB4MDEKLSNkZWZpbmUgR1NNMzQwX1RQX1BJRF9GQVhfRzMJCTB4MDIKLSNkZWZpbmUgR1NNMzQwX1RQX1BJRF9GQVhfRzQJCTB4MDMKLSNkZWZpbmUgR1NNMzQwX1RQX1BJRF9WT0lDRQkJMHgwNAotI2RlZmluZSBHU000MzBfVFBfUElEX0VSTUVTCQkweDA1Ci0jZGVmaW5lIEdTTTQzMF9UUF9QSURfTkFUSU9OQUxfUEFHSU5HCTB4MDYKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9WSURFT1RFWAkJMHgwNwotI2RlZmluZSBHU000MzBfVFBfUElEX1RFTEVURVhfVU5TUEVDCTB4MDgKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9URUxFVEVYX1BTUEROCTB4MDkKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9URUxFVEVYX0NTUEROCTB4MGEKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9URUxFVEVYX1BTVE4JMHgwYgotI2RlZmluZSBHU000MzBfVFBfUElEX1RFTEVURVhfSVNETgkweDBjCi0jZGVmaW5lIEdTTTQzMF9UUF9QSURfVEVMRVRFWF9VQ0kJMHgwZAotI2RlZmluZSBHU000MzBfVFBfUElEX01TR19IQU5ETElORwkweDEwCi0jZGVmaW5lIEdTTTQzMF9UUF9QSURfTVNHX1g0MDAJCTB4MTEKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9FTUFJTAkJMHgxMgotI2RlZmluZSBHU000MzBfVFBfUElEX0dTTV9NUwkJMHgxZgotLyogaWYgYml0IDcgPSAwIGFuZCBiaXQgNiA9IDEgKi8KLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9TTVNfVFlQRV8wCTAKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9TTVNfVFlQRV8xCTEKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9TTVNfVFlQRV8yCTIKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9TTVNfVFlQRV8zCTMKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9TTVNfVFlQRV80CTQKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9TTVNfVFlQRV81CTUKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9TTVNfVFlQRV82CTYKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9TTVNfVFlQRV83CTcKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9SRVRVUk5fQ0FMTF9NU0cJMHgxZgotI2RlZmluZSBHU000MzBfVFBfUElEX01FX0RBVEFfRE5MT0FECTB4M2QKLSNkZWZpbmUgR1NNNDMwX1RQX1BJRF9NRV9ERV9QRVJTT05BTAkweDNlCi0jZGVmaW5lIEdTTTQzMF9UUF9QSURfTUVfU0lNX0ROTE9BRAkweDNmCi0KLS8qIEdTTSAwMy4zOCBDaGFwdGVyIDQ6IFNNUyBEYXRhIENvZGluZyBTY2hlbWUgKi8KLSNkZWZpbmUgR1NNMzM4X0RDU18wMF8KLQotI2RlZmluZSBHU00zMzhfRENTXzExMTBfN0JJVAkJKDAgPDwgMikKLSNkZWZpbmUgR1NNMzM4X0RDU18xMTExXzdCSVQJCSgwIDw8IDIpCi0jZGVmaW5lIEdTTTMzOF9EQ1NfMTExMV84QklUX0RBVEEJKDEgPDwgMikKLSNkZWZpbmUgR1NNMzM4X0RDU18xMTExX0NMQVNTMAkJMAotI2RlZmluZSBHU00zMzhfRENTXzExMTFfQ0xBU1MxX01FCTEKLSNkZWZpbmUgR1NNMzM4X0RDU18xMTExX0NMQVNTMl9TSU0JMgotI2RlZmluZSBHU00zMzhfRENTXzExMTFfQ0xBU1MzX1RFCTMJLyogU2VlIFRTIDA3LjA1ICovCi0KLSNlbmRpZiAvKiBQUk9UT19HU01fMDRfMTFfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNWM5NDUuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0jaWZuZGVmIFBST1RPX0dTTV8wNF84MF9ICi0jZGVmaW5lIFBST1RPX0dTTV8wNF84MF9ICi0KLS8qIEdTTSBUUyAwNC44MCAgZGVmaW5pdGlvbnMgKFN1cHBsZW1lbnRhcnkgU2VydmljZXMgU3BlY2lmaWNhdGlvbiwgRm9ybWF0cyBhbmQgQ29kaW5nKSAqLwotCi0vKiBTZWN0aW9uIDMuNCAqLwotI2RlZmluZSBHU00wNDgwX01UWVBFX1JFTEVBU0VfQ09NUExFVEUJMHgyQQotI2RlZmluZSBHU00wNDgwX01UWVBFX0ZBQ0lMSVRZCQkJMHgzQQotI2RlZmluZSBHU00wNDgwX01UWVBFX1JFR0lTVEVSCQkJMHgzQgotCi0vKiBTZWN0aW9uIDMuNSAqLwotI2RlZmluZSBHU00wNDgwX0lFX0ZBQ0lMSVRZCQkJMHgxQwotI2RlZmluZSBHU00wNDgwX0lFX1NTX1ZFUlNJT04JCQkweDdGCi0KLS8qIFNlY3Rpb24gMy42LjIgKi8KLSNkZWZpbmUgR1NNMDQ4MF9DVFlQRV9JTlZPS0UJCQkweEExCi0jZGVmaW5lIEdTTTA0ODBfQ1RZUEVfUkVUVVJOX1JFU1VMVAkJMHhBMgotI2RlZmluZSBHU00wNDgwX0NUWVBFX1JFVFVSTl9FUlJPUgkJMHhBMwotI2RlZmluZSBHU00wNDgwX0NUWVBFX1JFSkVDVAkJCTB4QTQKLQotLyogU2VjdGlvbiAzLjYuMyAqLwotI2RlZmluZSBHU00wNDgwX0NPTVBJRFRBR19JTlZPS0VfSUQJCTB4MDIKLSNkZWZpbmUgR1NNMDQ4MF9DT01QSURUQUdfTElOS0VEX0lECQkweDgwCi0KLS8qIFNlY3Rpb24gMy42LjQgKi8KLSNkZWZpbmUgR1NNMDQ4MF9PUEVSQVRJT05fQ09ERQkJCTB4MDIKLQotLyogU2VjdGlvbiAzLjYuNSAqLwotI2RlZmluZSBHU01fMDQ4MF9TRVFVRU5DRV9UQUcJCQkweDMwCi0jZGVmaW5lIEdTTV8wNDgwX1NFVF9UQUcJCQkweDMxCi0KLS8qIFNlY3Rpb24gMy42LjYgKi8KLSNkZWZpbmUgR1NNXzA0ODBfRVJST1JfQ09ERV9UQUcJCQkweDAyCi0KLS8qIFNlY3Rpb24gMy42LjcgKi8KLS8qIFRhYmxlIDMuMTMgKi8KLSNkZWZpbmUgR1NNXzA0ODBfUFJPQkxFTV9DT0RFX1RBR19HRU5FUkFMCTB4ODAKLSNkZWZpbmUgR1NNXzA0ODBfUFJPQkxFTV9DT0RFX1RBR19JTlZPS0UJMHg4MQotI2RlZmluZSBHU01fMDQ4MF9QUk9CTEVNX0NPREVfVEFHX1JFVFVSTl9SRVNVTFQJMHg4MgotI2RlZmluZSBHU01fMDQ4MF9QUk9CTEVNX0NPREVfVEFHX1JFVFVSTl9FUlJPUgkweDgzCi0KLS8qIFRhYmxlIDMuMTQgKi8KLSNkZWZpbmUgR1NNXzA0ODBfR0VOX1BST0JfQ09ERV9VTlJFQ09HTklTRUQJMHgwMAotI2RlZmluZSBHU01fMDQ4MF9HRU5fUFJPQl9DT0RFX01JU1RZUEVECQkweDAxCi0jZGVmaW5lIEdTTV8wNDgwX0dFTl9QUk9CX0NPREVfQkFEX1NUUlVDVFVSRQkweDAyCi0KLS8qIFRhYmxlIDMuMTUgKi8KLSNkZWZpbmUgR1NNXzA0ODBfSU5WT0tFX1BST0JfQ09ERV9EVVBMSUNBVEVfSU5WT0tFX0lECQkweDAwCi0jZGVmaW5lIEdTTV8wNDgwX0lOVk9LRV9QUk9CX0NPREVfVU5SRUNPR05JU0VEX09QRVJBVElPTgkweDAxCi0jZGVmaW5lIEdTTV8wNDgwX0lOVk9LRV9QUk9CX0NPREVfTUlTVFlQRURfUEFSQU1FVEVSCQkweDAyCi0jZGVmaW5lIEdTTV8wNDgwX0lOVk9LRV9QUk9CX0NPREVfUkVTT1VSQ0VfTElNSVRBVElPTgkJMHgwMwotI2RlZmluZSBHU01fMDQ4MF9JTlZPS0VfUFJPQl9DT0RFX0lOSVRJQVRJTkdfUkVMRUFTRQkJMHgwNAotI2RlZmluZSBHU01fMDQ4MF9JTlZPS0VfUFJPQl9DT0RFX1VOUkVDT0dOSVNFRF9MSU5LRURfSUQJMHgwNQotI2RlZmluZSBHU01fMDQ4MF9JTlZPS0VfUFJPQl9DT0RFX1VORVhQRUNURURfTElOS0VEX1JFU1BPTlNFCTB4MDYKLSNkZWZpbmUgR1NNXzA0ODBfSU5WT0tFX1BST0JfQ09ERV9VTkVYUEVDVEVEX0xJTktFRF9PUEVSQVRJT04JMHgwNwotCi0vKiBUYWJsZSAzLjE2ICovCi0jZGVmaW5lIEdTTV8wNDgwX1JFU1VMVF9QUk9CX0NPREVfVU5SRUNPR05JU0VEX0lOVk9LRV9JRAkweDAwCi0jZGVmaW5lIEdTTV8wNDgwX1JFU1VMVF9QUk9CX0NPREVfUkVUVVJOX1JFU1VMVF9VTkVYUEVDVEVECTB4MDEKLSNkZWZpbmUgR1NNXzA0ODBfUkVTVUxUX1BST0JfQ09ERV9NSVNUWVBFRF9QQVJBTUVURVIJCTB4MDIKLQotLyogVGFibGUgMy4xNyAqLwotI2RlZmluZSBHU01fMDQ4MF9FUlJPUl9QUk9CX0NPREVfVU5SRUNPR05JU0VEX0lOVk9LRV9JRAkJMHgwMAotI2RlZmluZSBHU01fMDQ4MF9FUlJPUl9QUk9CX0NPREVfUkVUVVJOX0VSUk9SX1VORVhQRUNURUQJMHgwMQotI2RlZmluZSBHU01fMDQ4MF9FUlJPUl9QUk9CX0NPREVfVU5SRUNPR05JU0VEX0VSUk9SCQkweDAyCi0jZGVmaW5lIEdTTV8wNDgwX0VSUk9SX1BST0JfQ09ERV9VTkVYUEVDVEVEX0VSUk9SCQkweDAzCi0jZGVmaW5lIEdTTV8wNDgwX0VSUk9SX1BST0JfQ09ERV9NSVNUWVBFRF9QQVJBTUVURVIJCTB4MDQKLQotLyogU2VjdGlvbiA0LjUgKi8KLSNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX1JFR0lTVEVSX1NTCQkweDBBCi0jZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9FUkFTRV9TUwkJMHgwQgotI2RlZmluZSBHU00wNDgwX09QX0NPREVfQUNUSVZBVEVfU1MJCTB4MEMKLSNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0RFQUNUSVZBVEVfU1MJCTB4MEQKLSNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0lOVEVSUk9HQVRFX1NTCQkweDBFCi0jZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9OT1RJRllfU1MJCTB4MTAKLSNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX1JFR0lTVEVSX1BBU1NXT1JECTB4MTEKLSNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0dFVF9QQVNTV09SRAkJMHgxMgotI2RlZmluZSBHU00wNDgwX09QX0NPREVfUFJPQ0VTU19VU1NfREFUQQkweDEzCi0jZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9GT1JXQVJEX0NIRUNLX1NTX0lORAkweDI2Ci0jZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9QUk9DRVNTX1VTU19SRVEJCTB4M0IKLSNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX1VTU19SRVFVRVNUCQkweDNDCi0jZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9VU1NfTk9USUZZCQkweDNECi0jZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9GT1JXQVJEX0NVR19JTkZPCTB4NzgKLSNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX1NQTElUX01QVFkJCTB4NzkKLSNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX1JFVFJJRVZFX01QVFkJCTB4N0EKLSNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0hPTERfTVBUWQkJMHg3QgotI2RlZmluZSBHU00wNDgwX09QX0NPREVfQlVJTERfTVBUWQkJMHg3QwotI2RlZmluZSBHU00wNDgwX09QX0NPREVfRk9SV0FSRF9DSEFSR0VfQURWSUNFCTB4N0QKLQotI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX1VOS05PV05fU1VCU0NSSUJFUgkJCTB4MDEKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9JTExFR0FMX1NVQlNDUklCRVIJCQkweDA5Ci0jZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfQkVBUkVSX1NFUlZJQ0VfTk9UX1BST1ZJU0lPTkVECQkweDBBCi0jZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfVEVMRVNFUlZJQ0VfTk9UX1BST1ZJU0lPTkVECQkweDBCCi0jZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfSUxMRUdBTF9FUVVJUE1FTlQJCQkweDBDCi0jZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfQ0FMTF9CQVJSRUQJCQkJMHgwRAotI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0lMTEVHQUxfU1NfT1BFUkFUSU9OCQkJMHgxMAotI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX1NTX0VSUk9SX1NUQVRVUwkJCTB4MTEKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9TU19OT1RfQVZBSUxBQkxFCQkJMHgxMgotI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX1NTX1NVQlNDUklQVElPTl9WSU9MQVRJT04JCTB4MTMKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9TU19JTkNPTVBBVElCSUxJVFkJCQkweDE0Ci0jZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfRkFDSUxJVFlfTk9UX1NVUFBPUlRFRAkJCTB4MTUKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9BQlNFTlRfU1VCU0NSSUJFUgkJCTB4MUIKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9TWVNURU1fRkFJTFVSRQkJCQkweDIyCi0jZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfREFUQV9NSVNTSU5HCQkJCTB4MjMKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9VTkVYUEVDVEVEX0RBVEFfVkFMVUUJCQkweDI0Ci0jZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfUFdfUkVHSVNUUkFUSU9OX0ZBSUxVUkUJCTB4MjUKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9ORUdBVElWRV9QV19DSEVDSwkJCTB4MjYKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9OVU1fUFdfQVRURU1QVFNfVklPTEFUSU9OCQkweDJCCi0jZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfVU5LTk9XTl9BTFBIQUJFVAkJCTB4NDcKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9VU1NEX0JVU1kJCQkJMHg0OAotI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX01BWF9NUFRZX1BBUlRJQ0lQQU5UUwkJCTB4N0UKLSNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9SRVNPVVJDRVNfTk9UX0FWQUlMQUJMRQkJMHg3RgotCi0vKiBBU04uMSB0eXBlLXRhZ3MgKi8KLSNkZWZpbmUgQVNOMV9CT09MRUFOX1RBRwkJMHgwMQotI2RlZmluZSBBU04xX0lOVEVHRVJfVEFHCQkweDAyCi0jZGVmaW5lIEFTTjFfQklUX1NUUklOR19UQUcJCTB4MDMKLSNkZWZpbmUgQVNOMV9PQ1RFVF9TVFJJTkdfVEFHCQkweDA0Ci0jZGVmaW5lIEFTTjFfTlVMTF9UWVBFX1RBRwkJMHgwNQotI2RlZmluZSBBU04xX09CSkVDVF9JRF9UQUcJCTB4MDYKLSNkZWZpbmUgQVNOMV9VVEY4X1NUUklOR19UQUcJCTB4MEMKLSNkZWZpbmUgQVNOMV9QUklOVEFCTEVfU1RSSU5HX1RBRwkweDEzCi0jZGVmaW5lIEFTTjFfSUE1X1NUUklOR19UQUcJCTB4MTYKLSNkZWZpbmUgQVNOMV9VTklDT0RFX1NUUklOR19UQUcJCTB4MUUKLQotI2VuZGlmIC8qIFBST1RPX0dTTV8wNF84MF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5Mzk4Zi4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLSNpZm5kZWYgUFJPVE9fR1NNXzA4XzU4X0gKLSNkZWZpbmUgUFJPVE9fR1NNXzA4XzU4X0gKLQotLyogR1NNIFJhZGlvIFNpZ25hbGxpbmcgTGluayBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAotICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KLQotLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyIHsKLQl1aW50OF90CW1zZ19kaXNjcjsKLQl1aW50OF90CW1zZ190eXBlOwotCXVpbnQ4X3QJZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBDaGFwdGVyIDguMyAqLwotc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgewotCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyIGM7Ci0JdWludDhfdAlpZV9jaGFuOwotCXVpbnQ4X3QJY2hhbl9ucjsKLQl1aW50OF90CWllX2xpbmtfaWQ7Ci0JdWludDhfdAlsaW5rX2lkOwotCXVpbnQ4X3QJZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBDaGFwdGVyIDguMyBhbmQgOC40ICovCi1zdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyIHsKLQlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciBjOwotCXVpbnQ4X3QJaWVfY2hhbjsKLQl1aW50OF90CWNoYW5fbnI7Ci0JdWludDhfdAlkYXRhWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotLyogQ2hhcHRlciA5LjEgKi8KLSNkZWZpbmUgQUJJU19SU0xfTURJU0NfUkxMCQkweDAyCi0jZGVmaW5lIEFCSVNfUlNMX01ESVNDX0RFRF9DSEFOCQkweDA4Ci0jZGVmaW5lIEFCSVNfUlNMX01ESVNDX0NPTV9DSEFOCQkweDBjCi0jZGVmaW5lIEFCSVNfUlNMX01ESVNDX1RSWAkJMHgxMAotI2RlZmluZSBBQklTX1JTTF9NRElTQ19MT0MJCTB4MjAKLSNkZWZpbmUgQUJJU19SU0xfTURJU0NfSVBBQ0NFU1MJCTB4N2UKLSNkZWZpbmUgQUJJU19SU0xfTURJU0NfVFJBTlNQCQkweDAxCi0KLSNkZWZpbmUgQUJJU19SU0xfTURJU0NfSVNfVFJBTlNQKHgpCSh4ICYgMHgwMSkKLQotLyogQ2hhcHRlciA5LjEgKi8KLWVudW0gYWJpc19yc2xfbXNndHlwZSB7Ci0JLyogUmFkaW8gTGluayBMYXllciBNYW5hZ2VtZW50ICovCi0JUlNMX01UX0RBVEFfUkVRCQkJPSAweDAxLAotCVJTTF9NVF9EQVRBX0lORCwKLQlSU0xfTVRfRVJST1JfSU5ELAotCVJTTF9NVF9FU1RfUkVRLAotCVJTTF9NVF9FU1RfQ09ORiwKLQlSU0xfTVRfRVNUX0lORCwKLQlSU0xfTVRfUkVMX1JFUSwKLQlSU0xfTVRfUkVMX0NPTkYsCi0JUlNMX01UX1JFTF9JTkQsCi0JUlNMX01UX1VOSVRfREFUQV9SRVEsCi0JUlNMX01UX1VOSVRfREFUQV9JTkQsCQkvKiAweDBiICovCi0KLQkvKiBDb21tb24gQ2hhbm5lbCBNYW5hZ2VtZW50IC8gVFJYIE1hbmFnZW1lbnQgKi8KLQlSU0xfTVRfQkNDSF9JTkZPCQkJPSAweDExLAotCVJTTF9NVF9DQ0NIX0xPQURfSU5ELAotCVJTTF9NVF9DSEFOX1JRRCwKLQlSU0xfTVRfREVMRVRFX0lORCwKLQlSU0xfTVRfUEFHSU5HX0NNRCwKLQlSU0xfTVRfSU1NRURJQVRFX0FTU0lHTl9DTUQsCi0JUlNMX01UX1NNU19CQ19SRVEsCi0JLyogZW1wdHkgKi8KLQlSU0xfTVRfUkZfUkVTX0lORAkJCT0gMHgxOSwKLQlSU0xfTVRfU0FDQ0hfRklMTCwKLQlSU0xfTVRfT1ZFUkxPQUQsCi0JUlNMX01UX0VSUk9SX1JFUE9SVCwKLQlSU0xfTVRfU01TX0JDX0NNRCwKLQlSU0xfTVRfQ0JDSF9MT0FEX0lORCwKLQlSU0xfTVRfTk9UX0NNRCwJCQkvKiAweDFmICovCi0KLQkvKiBEZWRpY2F0ZSBDaGFubmVsIE1hbmFnZW1lbnQgKi8KLQlSU0xfTVRfQ0hBTl9BQ1RJVgkJCT0gMHgyMSwKLQlSU0xfTVRfQ0hBTl9BQ1RJVl9BQ0ssCi0JUlNMX01UX0NIQU5fQUNUSVZfTkFDSywKLQlSU0xfTVRfQ09OTl9GQUlMLAotCVJTTF9NVF9ERUFDVElWQVRFX1NBQ0NILAotCVJTTF9NVF9FTkNSX0NNRCwKLQlSU0xfTVRfSEFORE9fREVULAotCVJTTF9NVF9NRUFTX1JFUywKLQlSU0xfTVRfTU9ERV9NT0RJRllfUkVRLAotCVJTTF9NVF9NT0RFX01PRElGWV9BQ0ssCi0JUlNMX01UX01PREVfTU9ESUZZX05BQ0ssCi0JUlNMX01UX1BIWV9DT05URVhUX1JFUSwKLQlSU0xfTVRfUEhZX0NPTlRFWFRfQ09ORiwKLQlSU0xfTVRfUkZfQ0hBTl9SRUwsCi0JUlNMX01UX01TX1BPV0VSX0NPTlRST0wsCi0JUlNMX01UX0JTX1BPV0VSX0NPTlRST0wsCQkvKiAweDMwICovCi0JUlNMX01UX1BSRVBST0NfQ09ORklHLAotCVJTTF9NVF9QUkVQUk9DX01FQVNfUkVTLAotCVJTTF9NVF9SRl9DSEFOX1JFTF9BQ0ssCi0JUlNMX01UX1NBQ0NIX0lORk9fTU9ESUZZLAotCVJTTF9NVF9UQUxLRVJfREVULAotCVJTTF9NVF9MSVNURU5FUl9ERVQsCi0JUlNMX01UX1JFTU9URV9DT0RFQ19DT05GX1JFUCwKLQlSU0xfTVRfUlREX1JFUCwKLQlSU0xfTVRfUFJFX0hBTkRPX05PVElGLAotCVJTTF9NVF9NUl9DT0RFQ19NT0RfUkVRLAotCVJTTF9NVF9NUl9DT0RFQ19NT0RfQUNLLAotCVJTTF9NVF9NUl9DT0RFQ19NT0RfTkFDSywKLQlSU0xfTVRfTVJfQ09ERUNfTU9EX1BFUiwKLQlSU0xfTVRfVEZPX1JFUCwKLQlSU0xfTVRfVEZPX01PRF9SRVEsCQkvKiAweDNmICovCi0JUlNMX01UX0xPQ0FUSU9OX0lORk8JCT0gMHg0MSwKLQotCS8qIGlwLmFjY2VzcyBzcGVjaWZpYyBSU0wgbWVzc2FnZSB0eXBlcyAqLwotCVJTTF9NVF9JUEFDX0RJUl9SRVRSX0VOUQk9IDB4NDAsCi0JUlNMX01UX0lQQUNfUERDSF9BQ1QJCT0gMHg0OCwKLQlSU0xfTVRfSVBBQ19QRENIX0FDVF9BQ0ssCi0JUlNMX01UX0lQQUNfUERDSF9BQ1RfTkFDSywKLQlSU0xfTVRfSVBBQ19QRENIX0RFQUNUCQk9IDB4NGIsCi0JUlNMX01UX0lQQUNfUERDSF9ERUFDVF9BQ0ssCi0JUlNMX01UX0lQQUNfUERDSF9ERUFDVF9OQUNLLAotCVJTTF9NVF9JUEFDX0NPTk5FQ1RfTVVYCQk9IDB4NTAsCi0JUlNMX01UX0lQQUNfQ09OTkVDVF9NVVhfQUNLLAotCVJTTF9NVF9JUEFDX0NPTk5FQ1RfTVVYX05BQ0ssCi0JUlNMX01UX0lQQUNfQklORF9NVVgJCT0gMHg1MywKLQlSU0xfTVRfSVBBQ19CSU5EX01VWF9BQ0ssCi0JUlNMX01UX0lQQUNfQklORF9NVVhfTkFDSywKLQlSU0xfTVRfSVBBQ19ESVNDX01VWAkJPSAweDU2LAotCVJTTF9NVF9JUEFDX0RJU0NfTVVYX0FDSywKLQlSU0xfTVRfSVBBQ19ESVNDX01VWF9OQUNLLAotCVJTTF9NVF9JUEFDX0NSQ1gJCT0gMHg3MCwJCS8qIEJpbmQgdG8gbG9jYWwgQlRTIFJUUCBwb3J0ICovCi0JUlNMX01UX0lQQUNfQ1JDWF9BQ0ssCi0JUlNMX01UX0lQQUNfQ1JDWF9OQUNLLAotCVJTTF9NVF9JUEFDX01EQ1gJCT0gMHg3MywKLQlSU0xfTVRfSVBBQ19NRENYX0FDSywKLQlSU0xfTVRfSVBBQ19NRENYX05BQ0ssCi0JUlNMX01UX0lQQUNfRExDWF9JTkQJCT0gMHg3NiwKLQlSU0xfTVRfSVBBQ19ETENYCQk9IDB4NzcsCi0JUlNMX01UX0lQQUNfRExDWF9BQ0ssCi0JUlNMX01UX0lQQUNfRExDWF9OQUNLLAotfTsKLQotLyogU2llbWVucyB2ZW5kb3Itc3BlY2lmaWMgKi8KLWVudW0gYWJpc19yc2xfbXNndHlwZV9zaWVtZW5zIHsKLQlSU0xfTVRfU0lFTUVOU19NUlBDSQkJPSAweDQxLAotCVJTTF9NVF9TSUVNRU5TX0lOVFJBQ19IT19DT05EX0lORCA9IDB4NDIsCi0JUlNMX01UX1NJRU1FTlNfSU5URVJDX0hPX0NPTkRfSU5EID0gMHg0MywKLQlSU0xfTVRfU0lFTUVOU19GT1JDRURfSE9fUkVRCT0gMHg0NCwKLQlSU0xfTVRfU0lFTUVOU19QUkVGX0FSRUFfUkVRCT0gMHg0NSwKLQlSU0xfTVRfU0lFTUVOU19QUkVGX0FSRUEJPSAweDQ2LAotCVJTTF9NVF9TSUVNRU5TX1NUQVJUX1RSQUNFCT0gMHg0NywKLQlSU0xfTVRfU0lFTUVOU19TVEFSVF9UUkFDRV9BQ0sJPSAweDQ4LAotCVJTTF9NVF9TSUVNRU5TX1NUT1BfVFJBQ0UJPSAweDQ5LAotCVJTTF9NVF9TSUVNRU5TX1RSTVIJCT0gMHg0YSwKLQlSU0xfTVRfU0lFTUVOU19IT19GQUlMX0lORAk9IDB4NGIsCi0JUlNMX01UX1NJRU1FTlNfU1RPUF9UUkFDRV9BQ0sJPSAweDRjLAotCVJTTF9NVF9TSUVNRU5TX1VQTEYJCT0gMHg0ZCwKLQlSU0xfTVRfU0lFTUVOU19VUExCCQk9IDB4NGUsCi0JUlNMX01UX1NJRU1FTlNfU0VUX1NZU19JTkZPXzEwCT0gMHg0ZiwKLQlSU0xfTVRfU0lFTUVOU19NT0RJRl9DT05EX0lORAk9IDB4NTAsCi19OwotCi0vKiBDaGFwdGVyIDkuMyAqLwotZW51bSBhYmlzX3JzbF9pZSB7Ci0JUlNMX0lFX0NIQU5fTlIJCQk9IDB4MDEsCi0JUlNMX0lFX0xJTktfSURFTlQsCi0JUlNMX0lFX0FDVF9UWVBFLAotCVJTTF9JRV9CU19QT1dFUiwKLQlSU0xfSUVfQ0hBTl9JREVOVCwKLQlSU0xfSUVfQ0hBTl9NT0RFLAotCVJTTF9JRV9FTkNSX0lORk8sCi0JUlNMX0lFX0ZSQU1FX05VTUJFUiwKLQlSU0xfSUVfSEFORE9fUkVGLAotCVJTTF9JRV9MMV9JTkZPLAotCVJTTF9JRV9MM19JTkZPLAotCVJTTF9JRV9NU19JREVOVElUWSwKLQlSU0xfSUVfTVNfUE9XRVIsCi0JUlNMX0lFX1BBR0lOR19HUk9VUCwKLQlSU0xfSUVfUEFHSU5HX0xPQUQsCi0JUlNMX0lFX1BZSFNfQ09OVEVYVAkJPSAweDEwLAotCVJTTF9JRV9BQ0NFU1NfREVMQVksCi0JUlNMX0lFX1JBQ0hfTE9BRCwKLQlSU0xfSUVfUkVRX1JFRkVSRU5DRSwKLQlSU0xfSUVfUkVMRUFTRV9NT0RFLAotCVJTTF9JRV9SRVNPVVJDRV9JTkZPLAotCVJTTF9JRV9STE1fQ0FVU0UsCi0JUlNMX0lFX1NUQVJUTkdfVElNRSwKLQlSU0xfSUVfVElNSU5HX0FEVkFOQ0UsCi0JUlNMX0lFX1VQTElOS19NRUFTLAotCVJTTF9JRV9DQVVTRSwKLQlSU0xfSUVfTUVBU19SRVNfTlIsCi0JUlNMX0lFX01TR19JRCwKLQkvKiByZXNlcnZlZCAqLwotCVJTTF9JRV9TWVNJTkZPX1RZUEUJCT0gMHgxZSwKLQlSU0xfSUVfTVNfUE9XRVJfUEFSQU0sCi0JUlNMX0lFX0JTX1BPV0VSX1BBUkFNLAotCVJTTF9JRV9QUkVQUk9DX1BBUkFNLAotCVJTTF9JRV9QUkVQUk9DX01FQVMsCi0JUlNMX0lFX0lNTV9BU1NfSU5GTywJCS8qIFBoYXNlIDEgKDMuNi4wKSwgbGF0ZXIgRnVsbCBiZWxvdyAqLwotCVJTTF9JRV9TTVNDQl9JTkZPCQk9IDB4MjQsCi0JUlNMX0lFX01TX1RJTUlOR19PRkZTRVQsCi0JUlNMX0lFX0VSUl9NU0csCi0JUlNMX0lFX0ZVTExfQkNDSF9JTkZPLAotCVJTTF9JRV9DSEFOX05FRURFRCwKLQlSU0xfSUVfQ0JfQ01EX1RZUEUsCi0JUlNMX0lFX1NNU0NCX01TRywKLQlSU0xfSUVfRlVMTF9JTU1fQVNTX0lORk8sCi0JUlNMX0lFX1NBQ0NIX0lORk8sCi0JUlNMX0lFX0NCQ0hfTE9BRF9JTkZPLAotCVJTTF9JRV9TTVNDQl9DSEFOX0lORElDQVRPUiwKLQlSU0xfSUVfR1JPVVBfQ0FMTF9SRUYsCi0JUlNMX0lFX0NIQU5fREVTQwkJPSAweDMwLAotCVJTTF9JRV9OQ0hfRFJYX0lORk8sCi0JUlNMX0lFX0NNRF9JTkRJQ0FUT1IsCi0JUlNMX0lFX0VNTFBQX1BSSU8sCi0JUlNMX0lFX1VJQywKLQlSU0xfSUVfTUFJTl9DSEFOX1JFRiwKLQlSU0xfSUVfTVJfQ09ORklHLAotCVJTTF9JRV9NUl9DT05UUk9MLAotCVJTTF9JRV9TVVBfQ09ERUNfVFlQRVMsCi0JUlNMX0lFX0NPREVDX0NPTkZJRywKLQlSU0xfSUVfUlRELAotCVJTTF9JRV9URk9fU1RBVFVTLAotCVJTTF9JRV9MTFBfQVBEVSwKLQkvKiBTaWVtZW5zIHZlbmRvci1zcGVjaWZpYyAqLwotCVJTTF9JRV9TSUVNRU5TX01SUENJCQk9IDB4NDAsCi0JUlNMX0lFX1NJRU1FTlNfUFJFRl9BUkVBX1RZUEUJPSAweDQzLAotCVJTTF9JRV9TSUVNRU5TX0lOSU5fQ0VMTF9IT19QQVIJPSAweDQ1LAotCVJTTF9JRV9TSUVNRU5TX1RSQUNFX1JFRl9OUgk9IDB4NDYsCi0JUlNMX0lFX1NJRU1FTlNfSU5UX1RSQUNFX0lEWAk9IDB4NDcsCi0JUlNMX0lFX1NJRU1FTlNfTDJfSERSX0lORk8JPSAweDQ4LAotCVJTTF9JRV9TSUVNRU5TX0hJR0hFU1RfUkFURQk9IDB4NGUsCi0JUlNMX0lFX1NJRU1FTlNfU1VHR0VTVEVEX1JBVEUJPSAweDRmLAotCi0JLyogaXAuYWNjZXNzICovCi0JUlNMX0lFX0lQQUNfU1JUUF9DT05GSUcJPSAweGUwLAotCVJTTF9JRV9JUEFDX1BST1hZX1VEUAk9IDB4ZTEsCi0JUlNMX0lFX0lQQUNfQlNDTVBMX1RPVVQJPSAweGUyLAotCVJTTF9JRV9JUEFDX1JFTU9URV9JUAk9IDB4ZjAsCi0JUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQJPSAweGYxLAotCVJTTF9JRV9JUEFDX1JUUF9QQVlMT0FECT0gMHhmMiwKLQlSU0xfSUVfSVBBQ19MT0NBTF9QT1JUCT0gMHhmMywKLQlSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERQk9IDB4ZjQsCi0JUlNMX0lFX0lQQUNfTE9DQUxfSVAJPSAweGY1LAotCVJTTF9JRV9JUEFDX0NPTk5fU1RBVAk9IDB4ZjYsCi0JUlNMX0lFX0lQQUNfSE9fQ19QQVJNUwk9IDB4ZjcsCi0JUlNMX0lFX0lQQUNfQ09OTl9JRAk9IDB4ZjgsCi0JUlNMX0lFX0lQQUNfUlRQX0NTRF9GTVQJPSAweGY5LAotCVJTTF9JRV9JUEFDX1JUUF9KSVRfQlVGCT0gMHhmYSwKLQlSU0xfSUVfSVBBQ19SVFBfQ09NUFIJPSAweGZiLAotCVJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMj0gMHhmYywKLQlSU0xfSUVfSVBBQ19SVFBfTVBMRVgJPSAweGZkLAotCVJTTF9JRV9JUEFDX1JUUF9NUExFWF9JRD0gMHhmZSwKLX07Ci0KLS8qIENoYXB0ZXIgOS4zLjEgKi8KLSNkZWZpbmUgUlNMX0NIQU5fTlJfTUFTSwkweGY4Ci0jZGVmaW5lIFJTTF9DSEFOX0JtX0FDQ0hzCTB4MDgKLSNkZWZpbmUgUlNMX0NIQU5fTG1fQUNDSHMJMHgxMAkvKiAuLiAweDE4ICovCi0jZGVmaW5lIFJTTF9DSEFOX1NEQ0NINF9BQ0NICTB4MjAJLyogLi4gMHgzOCAqLwotI2RlZmluZSBSU0xfQ0hBTl9TRENDSDhfQUNDSAkweDQwCS8qIC4uLjB4NzggKi8KLSNkZWZpbmUgUlNMX0NIQU5fQkNDSAkJMHg4MAotI2RlZmluZSBSU0xfQ0hBTl9SQUNICQkweDg4Ci0jZGVmaW5lIFJTTF9DSEFOX1BDSF9BR0NICTB4OTAKLQotLyogQ2hhcHRlciA5LjMuMyAqLwotI2RlZmluZSBSU0xfQUNUX1RZUEVfSU5JVElBTAkweDAwCi0jZGVmaW5lIFJTTF9BQ1RfVFlQRV9SRUFDVAkweDgwCi0jZGVmaW5lIFJTTF9BQ1RfSU5UUkFfSU1NX0FTUwkweDAwCi0jZGVmaW5lIFJTTF9BQ1RfSU5UUkFfTk9STV9BU1MJMHgwMQotI2RlZmluZSBSU0xfQUNUX0lOVEVSX0FTWU5DCTB4MDIKLSNkZWZpbmUgUlNMX0FDVF9JTlRFUl9TWU5DCTB4MDMKLSNkZWZpbmUgUlNMX0FDVF9TRUNPTkRfQURECTB4MDQKLSNkZWZpbmUgUlNMX0FDVF9TRUNPTkRfTVVMVEkJMHgwNQotCi0vKiBDaGFwdGVyIDkuMy42ICovCi1zdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSB7Ci0JdWludDhfdCBkdHhfZHR1OwotCXVpbnQ4X3Qgc3BkX2luZDsKLQl1aW50OF90IGNoYW5fcnQ7Ci0JdWludDhfdCBjaGFuX3JhdGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSNkZWZpbmUgUlNMX0NNT0RfRFRYdQkJMHgwMQkvKiB1cGxpbmsgKi8KLSNkZWZpbmUgUlNMX0NNT0RfRFRYZAkJMHgwMgkvKiBkb3dubGluayAqLwotZW51bSByc2xfY21vZF9zcGQgewotCVJTTF9DTU9EX1NQRF9TUEVFQ0gJPSAweDAxLAotCVJTTF9DTU9EX1NQRF9EQVRBCT0gMHgwMiwKLQlSU0xfQ01PRF9TUERfU0lHTgk9IDB4MDMsCi19OwotI2RlZmluZSBSU0xfQ01PRF9DUlRfU0RDQ0gJMHgwMQotI2RlZmluZSBSU0xfQ01PRF9DUlRfVENIX0JtCTB4MDgJLyogZnVsbC1yYXRlICovCi0jZGVmaW5lIFJTTF9DTU9EX0NSVF9UQ0hfTG0JMHgwOQkvKiBoYWxmLXJhdGUgKi8KLS8qIEZJWE1FOiBNb3JlIENSVCB0eXBlcyAqLwotLyogU3BlZWNoICovCi0jZGVmaW5lIFJTTF9DTU9EX1NQX0dTTTEJMHgwMQotI2RlZmluZSBSU0xfQ01PRF9TUF9HU00yCTB4MTEKLSNkZWZpbmUgUlNMX0NNT0RfU1BfR1NNMwkweDIxCi0vKiBEYXRhICovCi0jZGVmaW5lIFJTTF9DTU9EX1NQX05UXzE0azUJMHg1OAotI2RlZmluZSBSU0xfQ01PRF9TUF9OVF8xMmswCTB4NTAKLSNkZWZpbmUgUlNMX0NNT0RfU1BfTlRfNmswCTB4NTEKLQotLyogQ2hhcHRlciA5LjMuNSAqLwotc3RydWN0IHJzbF9pZV9jaGFuX2lkZW50IHsKLQkvKiBHU00gMDQuMDggMTAuNS4yLjUgKi8KLQlzdHJ1Y3QgewotCQl1aW50OF90IGllaTsKLQkJdWludDhfdCBjaGFuX25yOwkvKiBlbmNfY2hhbl9uciAqLwotCQl1aW50OF90IG9jdDM7Ci0JCXVpbnQ4X3Qgb2N0NDsKLQl9IGNoYW5fZGVzYzsKLSNpZiAwCS8qIHNwZWMgc2F5cyB3ZSBuZWVkIHRoaXMgYnV0IEFiaXNzaW0gZG9lc24ndCB1c2UgaXQgKi8KLQlzdHJ1Y3QgewotCQl1aW50OF90IHRhZzsKLQkJdWludDhfdCBsZW47Ci0JfSBtb2JpbGVfYWxsb2M7Ci0jZW5kaWYKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBDaGFwdGVyIDkuMy4yMiAqLwotI2RlZmluZSBSTExfQ0FVU0VfVDIwMF9FWFBJUkVECQkweDAxCi0jZGVmaW5lIFJMTF9DQVVTRV9SRUVTVF9SRVEJCTB4MDIKLSNkZWZpbmUgUkxMX0NBVVNFX1VOU09MX1VBX1JFU1AJCTB4MDMKLSNkZWZpbmUgUkxMX0NBVVNFX1VOU09MX0RNX1JFU1AJCTB4MDQKLSNkZWZpbmUgUkxMX0NBVVNFX1VOU09MX0RNX1JFU1BfTUYJMHgwNQotI2RlZmluZSBSTExfQ0FVU0VfVU5TT0xfU1BSVl9SRVNQCTB4MDYKLSNkZWZpbmUgUkxMX0NBVVNFX1NFUV9FUlIJCTB4MDcKLSNkZWZpbmUgUkxMX0NBVVNFX1VGUk1fSU5DX1BBUkFNCTB4MDgKLSNkZWZpbmUgUkxMX0NBVVNFX1NGUk1fSU5DX1BBUkFNCTB4MDkKLSNkZWZpbmUgUkxMX0NBVVNFX0lGUk1fSU5DX01CSVRTCTB4MGEKLSNkZWZpbmUgUkxMX0NBVVNFX0lGUk1fSU5DX0xFTgkJMHgwYgotI2RlZmluZSBSTExfQ0FVU0VfRlJNX1VOSU1QTAkJMHgwYwotI2RlZmluZSBSTExfQ0FVU0VfU0FCTV9NRgkJMHgwZAotI2RlZmluZSBSTExfQ0FVU0VfU0FCTV9JTkZPX05PVEFMTAkweDBlCi0KLS8qIENoYXB0ZXIgOS4zLjI2ICovCi0jZGVmaW5lIFJTTF9FUlJDTFNfTk9STUFMCQkweDAwCi0jZGVmaW5lIFJTTF9FUlJDTFNfUkVTT1VSQ0VfVU5BVkFJTAkweDIwCi0jZGVmaW5lIFJTTF9FUlJDTFNfU0VSVklDRV9VTkFWQUlMCTB4MzAKLSNkZWZpbmUgUlNMX0VSUkNMU19TRVJWSUNFX1VOSU1QTAkweDQwCi0jZGVmaW5lIFJTTF9FUlJDTFNfSU5WQUxfTVNHCQkweDUwCi0jZGVmaW5lIFJTTF9FUlJDTFNfUFJPVE9fRVJST1IJCTB4NjAKLSNkZWZpbmUgUlNMX0VSUkNMU19JTlRFUldPUktJTkcJCTB4NzAKLQotLyogbm9ybWFsIGV2ZW50ICovCi0jZGVmaW5lIFJTTF9FUlJfUkFESU9fSUZfRkFJTAkJMHgwMAotI2RlZmluZSBSU0xfRVJSX1JBRElPX0xJTktfRkFJTAkJMHgwMQotI2RlZmluZSBSU0xfRVJSX0hBTkRPVkVSX0FDQ19GQUlMCTB4MDIKLSNkZWZpbmUgUlNMX0VSUl9UQUxLRVJfQUNDX0ZBSUwJCTB4MDMKLSNkZWZpbmUgUlNMX0VSUl9PTV9JTlRFUlZFTlRJT04JCTB4MDcKLSNkZWZpbmUgUlNMX0VSUl9OT1JNQUxfVU5TUEVDCQkweDBmCi0jZGVmaW5lIFJTTF9FUlJfVF9NU1JGUENJX0VYUAkJMHgxOAotLyogcmVzb3VyY2UgdW5hdmFpbGFibGUgKi8KLSNkZWZpbmUgUlNMX0VSUl9FUVVJUE1FTlRfRkFJTAkJMHgyMAotI2RlZmluZSBSU0xfRVJSX1JSX1VOQVZBSUwJCTB4MjEKLSNkZWZpbmUgUlNMX0VSUl9URVJSX0NIX0ZBSUwJCTB4MjIKLSNkZWZpbmUgUlNMX0VSUl9DQ0NIX09WRVJMT0FECQkweDIzCi0jZGVmaW5lIFJTTF9FUlJfQUNDSF9PVkVSTE9BRAkJMHgyNAotI2RlZmluZSBSU0xfRVJSX1BST0NFU1NPUl9PVkVSTE9BRAkweDI1Ci0jZGVmaW5lIFJTTF9FUlJfUkVTX1VOQVZBSUwJCTB4MmYKLS8qIHNlcnZpY2Ugb3Igb3B0aW9uIG5vdCBhdmFpbGFibGUgKi8KLSNkZWZpbmUgUlNMX0VSUl9UUkFOU0NfVU5BVkFJTAkJMHgzMAotI2RlZmluZSBSU0xfRVJSX1NFUlZfT1BUX1VOQVZBSUwJMHgzZgotLyogc2VydmljZSBvciBvcHRpb24gbm90IGltcGxlbWVudGVkICovCi0jZGVmaW5lIFJTTF9FUlJfRU5DUl9VTklNUEwJCTB4NDAKLSNkZWZpbmUgUlNMX0VSUl9TRVJWX09QVF9VTklNUEwJCTB4NGYKLS8qIGludmFsaWQgbWVzc2FnZSAqLwotI2RlZmluZSBSU0xfRVJSX1JDSF9BTFJfQUNUVl9BTExPQwkweDUwCi0jZGVmaW5lIFJTTF9FUlJfSU5WQUxJRF9NRVNTQUdFCQkweDVmCi0vKiBwcm90b2NvbCBlcnJvciAqLwotI2RlZmluZSBSU0xfRVJSX01TR19ESVNDUgkJMHg2MAotI2RlZmluZSBSU0xfRVJSX01TR19UWVBFCQkweDYxCi0jZGVmaW5lIFJTTF9FUlJfTVNHX1NFUQkJCTB4NjIKLSNkZWZpbmUgUlNMX0VSUl9JRV9FUlJPUgkJMHg2MwotI2RlZmluZSBSU0xfRVJSX01BTkRfSUVfRVJST1IJCTB4NjQKLSNkZWZpbmUgUlNMX0VSUl9PUFRfSUVfRVJST1IJCTB4NjUKLSNkZWZpbmUgUlNMX0VSUl9JRV9OT05FWElTVAkJMHg2NgotI2RlZmluZSBSU0xfRVJSX0lFX0xFTkdUSAkJMHg2NwotI2RlZmluZSBSU0xfRVJSX0lFX0NPTlRFTlQJCTB4NjgKLSNkZWZpbmUgUlNMX0VSUl9QUk9UTwkJCTB4NmYKLS8qIGludGVyd29ya2luZyAqLwotI2RlZmluZSBSU0xfRVJSX0lOVEVSV09SS0lORwkJMHg3ZgotCi0vKiBDaGFwdGVyIDkuMy4zMCAqLwotI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fOAkweDAwCi0jZGVmaW5lIFJTTF9TWVNURU1fSU5GT18xCTB4MDEKLSNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzIJMHgwMgotI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMwkweDAzCi0jZGVmaW5lIFJTTF9TWVNURU1fSU5GT180CTB4MDQKLSNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzUJMHgwNQotI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fNgkweDA2Ci0jZGVmaW5lIFJTTF9TWVNURU1fSU5GT183CTB4MDcKLSNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzE2CTB4MDgKLSNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzE3CTB4MDkKLSNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzJiaXMJMHgwYQotI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMnRlcgkweDBiCi0jZGVmaW5lIFJTTF9TWVNURU1fSU5GT181YmlzCTB4MGQKLSNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzV0ZXIJMHgwZQotI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMTAJMHgwZgotI2RlZmluZSBSRUxfRVhUX01FQVNfT1JERVIJMHg0NwotI2RlZmluZSBSU0xfTUVBU19JTkZPCQkweDQ4Ci0jZGVmaW5lIFJTTF9TWVNURU1fSU5GT18xMwkweDI4Ci0jZGVmaW5lIFJTTF9TWVNURU1fSU5GT18ycXVhdGVyCTB4MjkKLSNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzkJMHgyYQotI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMTgJMHgyYgotI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMTkJMHgyYwotI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMjAJMHgyZAotCi0vKiBDaGFwdGVyIDkuMy40MCAqLwotI2RlZmluZSBSU0xfQ0hBTk5FRURfQU5ZCTB4MDAKLSNkZWZpbmUgUlNMX0NIQU5ORUVEX1NEQ0NICTB4MDEKLSNkZWZpbmUgUlNMX0NIQU5ORUVEX1RDSF9GCTB4MDIKLSNkZWZpbmUgUlNMX0NIQU5ORUVEX1RDSF9Gb3JICTB4MDMKLQotLyogQ2hhcHRlciAzLjMuMi4zIEJyb2Nhc3QgY29udHJvbCBjaGFubmVsICovCi0vKiBDQ0NILUNPTkYsIE5DIGlzIG5vdCBjb21iaW5lZCAqLwotI2RlZmluZSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9OQwkweDAwCi0jZGVmaW5lIFJTTF9CQ0NIX0NDQ0hfQ09ORl8xX0MJMHgwMQotI2RlZmluZSBSU0xfQkNDSF9DQ0NIX0NPTkZfMl9OQwkweDAyCi0jZGVmaW5lIFJTTF9CQ0NIX0NDQ0hfQ09ORl8zX05DCTB4MDQKLSNkZWZpbmUgUlNMX0JDQ0hfQ0NDSF9DT05GXzRfTkMJMHgwNgotCi0vKiBCUy1QQS1NRlJNUyAqLwotI2RlZmluZSBSU0xfQlNfUEFfTUZSTVNfMgkweDAwCi0jZGVmaW5lIFJTTF9CU19QQV9NRlJNU18zCTB4MDEKLSNkZWZpbmUgUlNMX0JTX1BBX01GUk1TXzQJMHgwMgotI2RlZmluZSBSU0xfQlNfUEFfTUZSTVNfNQkweDAzCi0jZGVmaW5lIFJTTF9CU19QQV9NRlJNU182CTB4MDQKLSNkZWZpbmUgUlNMX0JTX1BBX01GUk1TXzcJMHgwNQotI2RlZmluZSBSU0xfQlNfUEFfTUZSTVNfOAkweDA2Ci0jZGVmaW5lIFJTTF9CU19QQV9NRlJNU185CTB4MDcKLQotLyogUlNMX0lFX0lQQUNfUlRQX1BBWUxPQURbMl0gKi8KLWVudW0gcnNsX2lwYWNfcnRwX3BheWxvYWQgewotCVJTTF9JUEFDX1JUUF9HU00JPSAxLAotCVJTTF9JUEFDX1JUUF9FRlIsCi0JUlNMX0lQQUNfUlRQX0FNUiwKLQlSU0xfSVBBQ19SVFBfQ1NELAotCVJTTF9JUEFDX1JUUF9NVVgsCi19OwotCi0vKiBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSwgbG93ZXIgZm91ciBiaXRzICovCi1lbnVtIHJzbF9pcGFjX3NwZWVjaF9tb2RlX3MgewotCVJTTF9JUEFDX1NQRUVDSF9HU01fRlIgPSAwLAkvKiBHU00gRlIgKFR5cGUgMSwgRlMpICovCi0JUlNMX0lQQUNfU1BFRUNIX0dTTV9FRlIgPSAxLAkvKiBHU00gRUZSIChUeXBlIDIsIEZTKSAqLwotCVJTTF9JUEFDX1NQRUVDSF9HU01fQU1SX0ZSID0gMiwJLyogR1NNIEFNUi9GUiAoVHlwZSAzLCBGUykgKi8KLQlSU0xfSVBBQ19TUEVFQ0hfR1NNX0hSID0gMywJLyogR1NNIEhSIChUeXBlIDEsIEhTKSAqLwotCVJTTF9JUEFDX1NQRUVDSF9HU01fQU1SX0hSID0gNSwJLyogR1NNIEFNUi9ociAoVHlwZSAzLCBIUykgKi8KLQlSU0xfSVBBQ19TUEVFQ0hfQVNfUlRQID0gMHhmLAkvKiBBcyBzcGVjaWZpZWQgYnkgUlRQIFBheWxvYWQgSUUgKi8KLX07Ci0vKiBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSwgdXBwZXIgZm91ciBiaXRzICovCi1lbnVtIHJzbF9pcGFjX3NwZWVjaF9tb2RlX20gewotCVJTTF9JUEFDX1NQRUVDSF9NX1JYVFggPSAwLAkvKiBTZW5kIGFuZCBSZWNlaXZlICovCi0JUlNMX0lQQUNfU1BFRUNIX01fUlggPSAxLAkvKiBSZWNlaXZlIG9ubHkgKi8KLQlSU0xfSVBBQ19TUEVFQ0hfTV9UWCA9IDIsCS8qIFNlbmQgb25seSAqLwotfTsKLQotLyogUlNMX0lFX0lQQUNfUlRQX0NTRF9GTVQsIGxvd2VyIGZvdXIgYml0cyAqLwotZW51bSByc2xfaXBhY19ydHBfY3NkX2Zvcm1hdF9kIHsKLQlSU0xfSVBBQ19SVFBfQ1NEX0VYVF9UUkFVID0gMCwKLQlSU0xfSVBBQ19SVFBfQ1NEX05PTl9UUkFVID0gMSwKLQlSU0xfSVBBQ19SVFBfQ1NEX1RSQVVfQlRTID0gMiwKLQlSU0xfSVBBQ19SVFBfQ1NEX0lXRl9GUkVFID0gMywKLX07Ci0vKiBSU0xfSUVfSVBBQ19SVFBfQ1NEX0ZNVCwgdXBwZXIgZm91ciBiaXRzICovCi1lbnVtIHJzbF9pcGFjX3J0cF9jc2RfZm9ybWF0X2lyIHsKLQlSU0xfSVBBQ19SVFBfQ1NEX0lSXzhrID0gMCwKLQlSU0xfSVBBQ19SVFBfQ1NEX0lSXzE2ayA9IDEsCi0JUlNMX0lQQUNfUlRQX0NTRF9JUl8zMmsgPSAyLAotCVJTTF9JUEFDX1JUUF9DU0RfSVJfNjRrID0gMywKLX07Ci0KLS8qIFNpZW1lbnMgdmVuZG9yLXNwZWNpZmljIFJTTCBleHRlbnNpb25zICovCi1zdHJ1Y3QgcnNsX21ycGNpIHsKLQl1aW50OF90IHBvd2VyX2NsYXNzOjMsCi0JCSB2Z2NzX2NhcGFibGU6MSwKLQkJIHZic19jYXBhYmxlOjEsCi0JCSBnc21fcGhhc2U6MjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1lbnVtIHJzbF9tcnBjaV9wd3JjbGFzcyB7Ci0JUlNMX01SUENJX1BXUkNfMQk9IDAsCi0JUlNMX01SUENJX1BXUkNfMgk9IDEsCi0JUlNMX01SUENJX1BXUkNfMwk9IDIsCi0JUlNMX01SUENJX1BXUkNfNAk9IDMsCi0JUlNMX01SUENJX1BXUkNfNQk9IDQsCi19OwotZW51bSByc2xfbXJwY2lfcGhhc2UgewotCVJTTF9NUlBDSV9QSEFTRV8xCT0gMCwKLQkvKiByZXNlcnZlZCAqLwotCVJTTF9NUlBDSV9QSEFTRV8yCT0gMiwKLQlSU0xfTVJQQ0lfUEhBU0VfMlBMVVMJPSAzLAotfTsKLQotCi0jZW5kaWYgLyogUFJPVE9fR1NNXzA4XzU4X0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FlNDVkLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MTMgKzAsMCBAQAotI2lmbmRlZiBQUk9UT19HU01fMTJfMjFfSAotI2RlZmluZSBQUk9UT19HU01fMTJfMjFfSAotCi0vKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCi0gKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLwotCi0vKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgotCi0vKiBnZW5lcmljIGhlYWRlciBpbiBmcm9udCBvZiBldmVyeSBPTUwgbWVzc2FnZSBhY2NvcmRpbmcgdG8gVFMgMDguNTkgKi8KLXN0cnVjdCBhYmlzX29tX2hkciB7Ci0JdWludDhfdAltZGlzYzsKLQl1aW50OF90CXBsYWNlbWVudDsKLQl1aW50OF90CXNlcXVlbmNlOwotCXVpbnQ4X3QJbGVuZ3RoOwotCXVpbnQ4X3QJZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFCSVNfT01fTURJU0NfRk9NCQkweDgwCi0jZGVmaW5lIEFCSVNfT01fTURJU0NfTU1JCQkweDQwCi0jZGVmaW5lIEFCSVNfT01fTURJU0NfVFJBVQkJMHgyMAotI2RlZmluZSBBQklTX09NX01ESVNDX01BTlVGCQkweDEwCi0jZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX09OTFkJCTB4ODAKLSNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfRklSU1QgCTB4NDAKLSNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTUlERExFCTB4MjAKLSNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTEFTVAkJMHgxMAotCi1zdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCB7Ci0JdWludDhfdAlidHNfbnI7Ci0JdWludDhfdAl0cnhfbnI7Ci0JdWludDhfdAl0c19ucjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYWJpc19vbV9mb21faGRyIHsKLQl1aW50OF90CW1zZ190eXBlOwotCXVpbnQ4X3QJb2JqX2NsYXNzOwotCXN0cnVjdCBhYmlzX29tX29ial9pbnN0CW9ial9pbnN0OwotCXVpbnQ4X3QJZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFCSVNfT01fRk9NX0hEUl9TSVpFCShzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSArIHNpemVvZihzdHJ1Y3QgYWJpc19vbV9mb21faGRyKSkKLQotLyogU2VjdGlvbiA5LjE6IE1lc3NhZ2UgVHlwZXMgKi8KLWVudW0gYWJpc19ubV9tc2d0eXBlIHsKLQkvKiBTVyBEb3dubG9hZCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCi0JTk1fTVRfTE9BRF9JTklUCQkJPSAweDAxLAotCU5NX01UX0xPQURfSU5JVF9BQ0ssCi0JTk1fTVRfTE9BRF9JTklUX05BQ0ssCi0JTk1fTVRfTE9BRF9TRUcsCi0JTk1fTVRfTE9BRF9TRUdfQUNLLAotCU5NX01UX0xPQURfQUJPUlQsCi0JTk1fTVRfTE9BRF9FTkQsCi0JTk1fTVRfTE9BRF9FTkRfQUNLLAotCU5NX01UX0xPQURfRU5EX05BQ0ssCi0JTk1fTVRfU1dfQUNUX1JFUSwJCS8qIEJUUy0+QlNDICovCi0JTk1fTVRfU1dfQUNUX1JFUV9BQ0ssCi0JTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAotCU5NX01UX0FDVElWQVRFX1NXLAkJLyogQlNDLT5CVFMgKi8KLQlOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCi0JTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKLQlOTV9NVF9TV19BQ1RJVkFURURfUkVQLAkJLyogMHgxMCAqLwotCS8qIEEtYmlzIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCi0JTk1fTVRfRVNUQUJMSVNIX1RFSQkJPSAweDIxLAotCU5NX01UX0VTVEFCTElTSF9URUlfQUNLLAotCU5NX01UX0VTVEFCTElTSF9URUlfTkFDSywKLQlOTV9NVF9DT05OX1RFUlJfU0lHTiwKLQlOTV9NVF9DT05OX1RFUlJfU0lHTl9BQ0ssCi0JTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywKLQlOTV9NVF9ESVNDX1RFUlJfU0lHTiwKLQlOTV9NVF9ESVNDX1RFUlJfU0lHTl9BQ0ssCi0JTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywKLQlOTV9NVF9DT05OX1RFUlJfVFJBRiwKLQlOTV9NVF9DT05OX1RFUlJfVFJBRl9BQ0ssCi0JTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywKLQlOTV9NVF9ESVNDX1RFUlJfVFJBRiwKLQlOTV9NVF9ESVNDX1RFUlJfVFJBRl9BQ0ssCi0JTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywKLQkvKiBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBNZXNzYWdlcyAqLwotCU5NX01UX0NPTk5fTURST1BfTElOSwkJPSAweDMxLAotCU5NX01UX0NPTk5fTURST1BfTElOS19BQ0ssCi0JTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCi0JTk1fTVRfRElTQ19NRFJPUF9MSU5LLAotCU5NX01UX0RJU0NfTURST1BfTElOS19BQ0ssCi0JTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCi0JLyogQWlyIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCi0JTk1fTVRfU0VUX0JUU19BVFRSCQk9IDB4NDEsCi0JTk1fTVRfU0VUX0JUU19BVFRSX0FDSywKLQlOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywKLQlOTV9NVF9TRVRfUkFESU9fQVRUUiwKLQlOTV9NVF9TRVRfUkFESU9fQVRUUl9BQ0ssCi0JTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywKLQlOTV9NVF9TRVRfQ0hBTl9BVFRSLAotCU5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAotCU5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywKLQkvKiBUZXN0IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KLQlOTV9NVF9QRVJGX1RFU1QJCQk9IDB4NTEsCi0JTk1fTVRfUEVSRl9URVNUX0FDSywKLQlOTV9NVF9QRVJGX1RFU1RfTkFDSywKLQlOTV9NVF9URVNUX1JFUCwKLQlOTV9NVF9TRU5EX1RFU1RfUkVQLAotCU5NX01UX1NFTkRfVEVTVF9SRVBfQUNLLAotCU5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywKLQlOTV9NVF9TVE9QX1RFU1QsCi0JTk1fTVRfU1RPUF9URVNUX0FDSywKLQlOTV9NVF9TVE9QX1RFU1RfTkFDSywKLQkvKiBTdGF0ZSBNYW5hZ2VtZW50IGFuZCBFdmVudCBSZXBvcnQgTWVzc2FnZXMgKi8KLQlOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAJPSAweDYxLAotCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAotCU5NX01UX1NUT1BfRVZFTlRfUkVQLAotCU5NX01UX1NUT1BfRVZFTlRfUkVQX0FDSywKLQlOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAotCU5NX01UX1JFU1RfRVZFTlRfUkVQLAotCU5NX01UX1JFU1RfRVZFTlRfUkVQX0FDSywKLQlOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAotCU5NX01UX0NIR19BRE1fU1RBVEUsCi0JTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0ssCi0JTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAotCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRLAotCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRX0FDSywKLQlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAotCU5NX01UX1JFUF9PVVRTVF9BTEFSTVMJCT0gMHg5MywKLQlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX0FDSywKLQlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCi0JLyogRXF1aXBtZW50IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KLQlOTV9NVF9DSEFOR0VPVkVSCQk9IDB4NzEsCi0JTk1fTVRfQ0hBTkdFT1ZFUl9BQ0ssCi0JTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAotCU5NX01UX09QU1RBUlQsCi0JTk1fTVRfT1BTVEFSVF9BQ0ssCi0JTk1fTVRfT1BTVEFSVF9OQUNLLAotCU5NX01UX1JFSU5JVCwKLQlOTV9NVF9SRUlOSVRfQUNLLAotCU5NX01UX1JFSU5JVF9OQUNLLAotCU5NX01UX1NFVF9TSVRFX09VVCwJCS8qIEJTMTE6IGdldCBhbGFybSA/IT8gKi8KLQlOTV9NVF9TRVRfU0lURV9PVVRfQUNLLAotCU5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAotCU5NX01UX0NIR19IV19DT05GCQk9IDB4OTAsCi0JTk1fTVRfQ0hHX0hXX0NPTkZfQUNLLAotCU5NX01UX0NIR19IV19DT05GX05BQ0ssCi0JLyogTWVhc3VyZW1lbnQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLwotCU5NX01UX01FQVNfUkVTX1JFUQkJPSAweDhhLAotCU5NX01UX01FQVNfUkVTX1JFU1AsCi0JTk1fTVRfU1RPUF9NRUFTLAotCU5NX01UX1NUQVJUX01FQVMsCi0JLyogT3RoZXIgTWVzc2FnZXMgKi8KLQlOTV9NVF9HRVRfQVRUUgkJCT0gMHg4MSwKLQlOTV9NVF9HRVRfQVRUUl9SRVNQLAotCU5NX01UX0dFVF9BVFRSX05BQ0ssCi0JTk1fTVRfU0VUX0FMQVJNX1RIUkVTLAotCU5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCi0JTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCi19OwotCi1lbnVtIGFiaXNfbm1fbXNndHlwZV9iczExIHsKLQlOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFCT0gMHg3NCwKLQotCU5NX01UX0JTMTFfQkVHSU5fREJfVFgJCT0gMHhhMywKLQlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX0FDSywKLQlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCi0JTk1fTVRfQlMxMV9FTkRfREJfVFgJCT0gMHhhNiwKLQlOTV9NVF9CUzExX0VORF9EQl9UWF9BQ0ssCi0JTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywKLQlOTV9NVF9CUzExX0NSRUFURV9PQkoJCT0gMHhhOSwKLQlOTV9NVF9CUzExX0NSRUFURV9PQkpfQUNLLAotCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAotCU5NX01UX0JTMTFfREVMRVRFX09CSgkJPSAweGFjLAotCU5NX01UX0JTMTFfREVMRVRFX09CSl9BQ0ssCi0JTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCi0KLQlOTV9NVF9CUzExX1NFVF9BVFRSCQk9IDB4ZDAsCi0JTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0ssCi0JTk1fTVRfQlMxMV9TRVRfQVRUUl9OQUNLLAotCU5NX01UX0JTMTFfTE1UX1NFU1NJT04JCT0gMHhkYywKLQotCU5NX01UX0JTMTFfR0VUX1NUQVRFCQk9IDB4ZTMsCi0JTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLLAotCU5NX01UX0JTMTFfTE1UX0xPR09OCQk9IDB4ZTUsCi0JTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLLAotCU5NX01UX0JTMTFfUkVTVEFSVAkJPSAweGU3LAotCU5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCi0JTk1fTVRfQlMxMV9ESVNDT05ORUNUCQk9IDB4ZTksCi0JTk1fTVRfQlMxMV9ESVNDT05ORUNUX0FDSywKLQlOTV9NVF9CUzExX0xNVF9MT0dPRkYJCT0gMHhlYywKLQlOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLLAotCU5NX01UX0JTMTFfUkVDT05ORUNUCQk9IDB4ZjEsCi0JTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAotfTsKLQotZW51bSBhYmlzX25tX21zZ3R5cGVfaXBhY2MgewotCU5NX01UX0lQQUNDX1JFU1RBUlQJCT0gMHg4NywKLQlOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSywKLQlOTV9NVF9JUEFDQ19SRVNUQVJUX05BQ0ssCi0JTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QJCT0gMHhlMCwKLQlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCi0JTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfTkFDSywKLQlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVAk9IDB4ZTMsCi0JTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfQUNLLAotCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX05BQ0ssCi0JTk1fTVRfSVBBQ0NfQ09OTl9UUkFGCQk9IDB4ZTYsCi0JTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywKLQlOTV9NVF9JUEFDQ19DT05OX1RSQUZfTkFDSywKLQlOTV9NVF9JUEFDQ19ERUZfQk9PVF9TVwkJPSAweGVjLAotCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXX0FDSywKLQlNTl9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAotCU5NX01UX0lQQUNDX1NFVF9OVkFUVFIJCT0gMHhlZiwKLQlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSywKLQlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCi0JTk1fTVRfSVBBQ0NfR0VUX05WQVRUUgkJPSAweGYyLAotCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLLAotCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywKLQlOTV9NVF9JUEFDQ19TRVRfQVRUUgkJPSAweGY1LAotCU5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSywKLQlOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAotfTsKLQotZW51bSBhYmlzX25tX2JzMTFfY2VsbF9hbGxvYyB7Ci0JTk1fQlMxMV9DQU5SX0dTTQk9IDB4MDAsCi0JTk1fQlMxMV9DQU5SX0RDUzE4MDAJPSAweDAxLAotfTsKLQotLyogU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLwotZW51bSBhYmlzX25tX29ial9jbGFzcyB7Ci0JTk1fT0NfU0lURV9NQU5BR0VSCQk9IDB4MDAsCi0JTk1fT0NfQlRTLAotCU5NX09DX1JBRElPX0NBUlJJRVIsCi0JTk1fT0NfQ0hBTk5FTCwKLQlOTV9PQ19CQVNFQl9UUkFOU0MsCi0JLyogUkZVOiAwNS1GRSAqLwotCi0JTk1fT0NfSVBBQ19FMV9UUlVOSwkJPSAweDBlLAotCU5NX09DX0lQQUNfRTFfUE9SVAkJPSAweDBmLAotCU5NX09DX0lQQUNfRTFfQ0hBTgkJPSAweDEwLAotCU5NX09DX0lQQUNfQ0xLX01PRFVMRQkJPSAweDIyLAotCi0JTk1fT0NfQlMxMV9BREpDCQkJPSAweGEwLAotCU5NX09DX0JTMTFfSEFORE9WRVIJCT0gMHhhMSwKLQlOTV9PQ19CUzExX1BXUl9DVFJMCQk9IDB4YTIsCi0JTk1fT0NfQlMxMV9CVFNFCQkJPSAweGEzLAkJLyogTE1UPyAqLwotCU5NX09DX0JTMTFfUkFDSwkJCT0gMHhhNCwKLQlOTV9PQ19CUzExCQkJPSAweGE1LAkJLyogMDE6IEFMQ08gKi8KLQlOTV9PQ19CUzExX1RFU1QJCQk9IDB4YTYsCi0JTk1fT0NfQlMxMV9FTlZBQlRTRQkJPSAweGE4LAotCU5NX09DX0JTMTFfQlBPUlQJCT0gMHhhOSwKLQotCU5NX09DX0dQUlNfTlNFCQkJPSAweGYwLAotCU5NX09DX0dQUlNfQ0VMTAkJCT0gMHhmMSwKLQlOTV9PQ19HUFJTX05TVkMJCQk9IDB4ZjIsCi0KLQlOTV9PQ19OVUxMCQkJPSAweGZmLAotfTsKLQotLyogU2VjdGlvbiA5LjQ6IEF0dHJpYnV0ZXMgKi8KLWVudW0gYWJpc19ubV9hdHRyIHsKLQlOTV9BVFRfQUJJU19DSEFOTkVMCT0gMHgwMSwKLQlOTV9BVFRfQUREX0lORk8sCi0JTk1fQVRUX0FERF9URVhULAotCU5NX0FUVF9BRE1fU1RBVEUsCi0JTk1fQVRUX0FSRkNOX0xJU1QsCi0JTk1fQVRUX0FVVE9OX1JFUE9SVCwKLQlOTV9BVFRfQVZBSUxfU1RBVFVTLAotCU5NX0FUVF9CQ0NIX0FSRkNOLAotCU5NX0FUVF9CU0lDLAotCU5NX0FUVF9CVFNfQUlSX1RJTUVSLAotCU5NX0FUVF9DQ0NIX0xfSV9QLAotCU5NX0FUVF9DQ0NIX0xfVCwKLQlOTV9BVFRfQ0hBTl9DT01CLAotCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwKLQlOTV9BVFRfREVTVCwKLQkvKiByZXMgKi8KLQlOTV9BVFRfRVZFTlRfVFlQRQk9IDB4MTEsIC8qIEJTMTE6IGZpbGUgZGF0YSA/IT8gKi8KLQlOTV9BVFRfRklMRV9JRCwKLQlOTV9BVFRfRklMRV9WRVJTSU9OLAotCU5NX0FUVF9HU01fVElNRSwKLQlOTV9BVFRfSFNOLAotCU5NX0FUVF9IV19DT05GSUcsCi0JTk1fQVRUX0hXX0RFU0MsCi0JTk1fQVRUX0lOVEFWRV9QQVJBTSwKLQlOTV9BVFRfSU5URVJGX0JPVU5ELAotCU5NX0FUVF9MSVNUX1JFUV9BVFRSLAotCU5NX0FUVF9NQUlPLAotCU5NX0FUVF9NQU5VRl9TVEFURSwKLQlOTV9BVFRfTUFOVUZfVEhSRVNILAotCU5NX0FUVF9NQU5VRl9JRCwKLQlOTV9BVFRfTUFYX1RBLAotCU5NX0FUVF9NRFJPUF9MSU5LLAkvKiAweDIwICovCi0JTk1fQVRUX01EUk9QX05FWFQsCi0JTk1fQVRUX05BQ0tfQ0FVU0VTLAotCU5NX0FUVF9OWTEsCi0JTk1fQVRUX09QRVJfU1RBVEUsCi0JTk1fQVRUX09WRVJMX1BFUklPRCwKLQlOTV9BVFRfUEhZU19DT05GLAotCU5NX0FUVF9QT1dFUl9DTEFTUywKLQlOTV9BVFRfUE9XRVJfVEhSRVNILAotCU5NX0FUVF9QUk9CX0NBVVNFLAotCU5NX0FUVF9SQUNIX0JfVEhSRVNILAotCU5NX0FUVF9MREFWR19TTE9UUywKLQlOTV9BVFRfUkFEX1NVQkMsCi0JTk1fQVRUX1JGX01BWFBPV1JfUiwKLQlOTV9BVFRfU0lURV9JTlBVVFMsCi0JTk1fQVRUX1NJVEVfT1VUUFVUUywKLQlOTV9BVFRfU09VUkNFLAkJLyogMHgzMCAqLwotCU5NX0FUVF9TUEVDX1BST0IsCi0JTk1fQVRUX1NUQVJUX1RJTUUsCi0JTk1fQVRUX1QyMDAsCi0JTk1fQVRUX1RFSSwKLQlOTV9BVFRfVEVTVF9EVVIsCi0JTk1fQVRUX1RFU1RfTk8sCi0JTk1fQVRUX1RFU1RfUkVQT1JULAotCU5NX0FUVF9WU1dSX1RIUkVTSCwKLQlOTV9BVFRfV0lORE9XX1NJWkUsCi0JLyogUmVzICAqLwotCU5NX0FUVF9CUzExX1JTU0lfT0ZGUwk9IDB4M2QsCi0JTk1fQVRUX0JTMTFfVFhQV1IJPSAweDNlLAotCU5NX0FUVF9CUzExX0RJVkVSU0lUWQk9IDB4M2YsCi0JLyogUmVzICAqLwotCU5NX0FUVF9UU0MJCT0gMHg0MCwKLQlOTV9BVFRfU1dfQ09ORklHLAotCU5NX0FUVF9TV19ERVNDUiwKLQlOTV9BVFRfU0VWRVJJVFksCi0JTk1fQVRUX0dFVF9BUkksCi0JTk1fQVRUX0hXX0NPTkZfQ0hHLAotCU5NX0FUVF9PVVRTVF9BTEFSTSwKLQlOTV9BVFRfRklMRV9EQVRBLAotCU5NX0FUVF9NRUFTX1JFUywKLQlOTV9BVFRfTUVBU19UWVBFLAotCi0JTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8JPSAweDRjLAotCU5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PCT0gMHg0ZiwKLQotCU5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMCT0gMHg1NSwKLQlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UJPSAweDU4LAotCi0JTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURwk9IDB4NjAsCi0JTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywKLQlOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLAotCU5NX0FUVF9CUzExX0NFTExfR0xPQkFMX0lELAotCU5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MJPSAweDY2LAotCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5URUNfSEFORE8JPSAweDY3LAotCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5UUkNfSEFORE8JPSAweDY4LAotCU5NX0FUVF9CUzExX0VOQV9NU19QV1JfQ1RSTAk9IDB4NjksCi0JTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPCT0gMHg2YSwKLQlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVwk9IDB4NmIsCi0JTk1fQVRUX0JTMTFfRU5BX1JYTEVWX0hPCT0gMHg2YywKLQlOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPCT0gMHg2ZCwKLQlOTV9BVFRfQlMxMV9GQUNDSF9RVUFMCQk9IDB4NmUsCi0KLQlOTV9BVFRfSVBBQ0NfRFNUX0lQCQk9IDB4ODAsCi0JTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUCT0gMHg4MSwKLQlOTV9BVFRfSVBBQ0NfU1NSQwkJPSAweDgyLAotCU5NX0FUVF9JUEFDQ19SVFBfUEFZTERfVFlQRQk9IDB4ODMsCi0JTk1fQVRUX0lQQUNDX0JBU0VCX0lECQk9IDB4ODQsCi0JTk1fQVRUX0lQQUNDX1NUUkVBTV9JRAkJPSAweDg1LAotCU5NX0FUVF9JUEFDQ19OVl9GTEFHUwkJPSAweDg2LAotCU5NX0FUVF9JUEFDQ19GUkVRX0NUUkwJCT0gMHg4NywKLQlOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHCT0gMHg4OCwKLQlOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkcJPSAweDg5LAotCU5NX0FUVF9JUEFDQ19JUF9JRl9DRkcJCT0gMHg4YSwJCS8qIElQIGludGVyZmFjZSAqLwotCU5NX0FUVF9JUEFDQ19JUF9HV19DRkcJCT0gMHg4YiwJCS8qIElQIGdhdGV3YXkgKi8KLQlOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FCT0gMHg4YywKLQlOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MJPSAweDhkLAotCU5NX0FUVF9JUEFDQ19MT0NBVElPTgkJPSAweDhlLAkJLyogc3RyaW5nIGRlc2NyaWJpbmcgbG9jYXRpb24gKi8KLQlOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGRwkJPSAweDhmLAotCU5NX0FUVF9JUEFDQ19GSUxFX0RBVEEJCT0gMHg5MCwKLQlOTV9BVFRfSVBBQ0NfVU5JVF9JRAkJPSAweDkxLAkJLyogU2l0ZS9CVFMvVFJYICovCi0JTk1fQVRUX0lQQUNDX1BBUkVOVF9VTklUX0lECT0gMHg5MiwKLQlOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FCQk9IDB4OTMsCQkvKiBkZWZhdWx0OiBuYnRzLTxtYWMtYXMtc3RyaW5nPiAqLwotCU5NX0FUVF9JUEFDQ19TTk1QX0NGRwkJPSAweDk0LAotCU5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVAk9IDB4OTUsCi0JTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVQJPSAweDk2LAotCU5NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHCQk9IDB4OTcsCi0JTk1fQVRUX0lQQUNDX1RJTUlOR19CVVMJCT0gMHg5OCwKLQlOTV9BVFRfSVBBQ0NfQ0dJCQk9IDB4OTksCi0JTk1fQVRUX0lQQUNDX1JBQwkJPSAweDlhLAotCU5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTgk9IDB4OWIsCi0JTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGRwk9IDB4OWMsCi0JTk1fQVRUX0lQQUNDX05TRUkJCT0gMHg5ZCwKLQlOTV9BVFRfSVBBQ0NfQlZDSQkJPSAweDllLAotCU5NX0FUVF9JUEFDQ19OU1ZDSQkJPSAweDlmLAotCU5NX0FUVF9JUEFDQ19OU19DRkcJCT0gMHhhMCwKLQlOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHCQk9IDB4YTEsCi0JTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHCT0gMHhhMiwKLQlOTV9BVFRfSVBBQ0NfUkxDX0NGRwkJPSAweGEzLAkKLQlOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUCT0gMHhhNCwKLQlOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1QJPSAweGE1LAotCU5NX0FUVF9JUEFDQ19USUJfQ09OVFJPTAk9IDB4YTYsCi0JTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVMJPSAweGE3LAotCU5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUwk9IDB4YTgsCi0JTk1fQVRUX0lQQUNDX1JMQ19DRkdfMgkJPSAweGE5LAotCU5NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVAk9IDB4YWEsCi0JTk1fQVRUX0lQQUNDX1VQVElNRQkJPSAweGFiLAotCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzMJCT0gMHhhYywKLQlOTV9BVFRfSVBBQ0NfU1NMX0NGRwkJPSAweGFkLAotCU5NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEUJPSAweGFlLAotCU5NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFCT0gMHhhZiwKLQlOTV9BVFRfSVBBQ0NfUkVWT0NfREFURQkJPSAweGIwLAotCi0KLQlOTV9BVFRfQlMxMV9SRl9SRVNfSU5EX1BFUgk9IDB4OGYsCi0JCi0JTk1fQVRUX0JTMTFfUlhfTEVWX01JTl9DRUxMCT0gMHg5MCwKLQlOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FCT0gMHg5MSwKLQlOTV9BVFRfQlMxMV9USU1FUl9IT19SRVFVRVNUCT0gMHg5MiwKLQlOTV9BVFRfQlMxMV9USU1FUl9OQ0VMTAkJPSAweDkzLAotCU5NX0FUVF9CUzExX1RTWU5DCQk9IDB4OTQsCi0JTk1fQVRUX0JTMTFfVFRSQVUJCT0gMHg5NSwKLQlOTV9BVFRfQlMxMV9FTVJHX0NGR19NRU1CRVIJPSAweDliLAotCU5NX0FUVF9CUzExX1RSWF9BUkVBCQk9IDB4OWYsCi0KLQlOTV9BVFRfQlMxMV9CQ0NIX1JFQ09ORgkJPSAweGQ3LAotCU5NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0gJPSAweGEwLAotCU5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUwk9IDB4YTEsCi0JTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWQk9IDB4YTMsCi0JTk1fQVRUX0JTMTFfQ0NMS19UWVBFCQk9IDB4YTQsCi0JTk1fQVRUX0JTMTFfSU5QX0lNUEVEQU5DRQk9IDB4YWEsCi0JTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFCT0gMHhhYiwKLQlOTV9BVFRfQlMxMV9MSU5FX0NGRwkJPSAweGFjLAotCU5NX0FUVF9CUzExX0xJX1BPUlRfMQkJPSAweGFkLAotCU5NX0FUVF9CUzExX0xJX1BPUlRfMgkJPSAweGFlLAotCi0JTk1fQVRUX0JTMTFfTDFfUkVNX0FMTV9UWVBFCT0gMHhiMCwKLQlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVECT0gMHhiYiwKLQlOTV9BVFRfQlMxMV9TV19MT0FEX1NBRkVUWQk9IDB4YmMsCi0JTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQJPSAweGJkLAotCi0JTk1fQVRUX0JTMTFfVkVORE9SX05BTUUJCT0gMHhjMSwKLQlOTV9BVFRfQlMxMV9IT1BQSU5HX01PREUJPSAweGM1LAotCU5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OCT0gMHhjNiwKLQlOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRQk9IDB4YzcsCi0JTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVgk9IDB4YzgsCi0JTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRQk9IDB4YzksCi0KLQlOTV9BVFRfQlMxMV9MMV9DT05UUk9MX1RTCT0gMHhkOCwKLQlOTV9BVFRfQlMxMV9SQURJT19NRUFTX0dSQU4JPSAweGRjLAkvKiBpbiBTQUNDSCBtdWx0aWZyYW1lcyAqLwotCU5NX0FUVF9CUzExX1JBRElPX01FQVNfUkVQCT0gMHhkZCwKLQotCU5NX0FUVF9CUzExX1NIX0xBUERfSU5UX1RJTUVSCT0gMHhlOCwKLQotCU5NX0FUVF9CUzExX0JUU19TVEFURQkJPSAweGYwLAotCU5NX0FUVF9CUzExX0UxX1NUQVRFCQk9IDB4ZjEsCi0JTk1fQVRUX0JTMTFfUExMCQkJPSAweGYyLAotCU5NX0FUVF9CUzExX1JYX09GRlNFVAkJPSAweGYzLAotCU5NX0FUVF9CUzExX0FOVF9UWVBFCQk9IDB4ZjQsCi0JTk1fQVRUX0JTMTFfUExMX01PREUJCT0gMHhmYywKLQlOTV9BVFRfQlMxMV9QQVNTV09SRAkJPSAweGZkLAotfTsKLSNkZWZpbmUgTk1fQVRUX0JTMTFfRklMRV9EQVRBCU5NX0FUVF9FVkVOVF9UWVBFCi0KLS8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCi1lbnVtIGFiaXNfbm1fYWRtX3N0YXRlIHsKLQlOTV9TVEFURV9MT0NLRUQJCT0gMHgwMSwKLQlOTV9TVEFURV9VTkxPQ0tFRAk9IDB4MDIsCi0JTk1fU1RBVEVfU0hVVERPV04JPSAweDAzLAotCU5NX1NUQVRFX05VTEwJCT0gMHhmZiwKLX07Ci0KLS8qIFNlY3Rpb24gOS40Ljc6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCi1lbnVtIGFiaXNfbm1fYXZhaWxfc3RhdGUgewotCU5NX0FWU1RBVEVfSU5fVEVTVAk9IDEsCi0JTk1fQVZTVEFURV9QT1dFUl9PRkYJPSAyLAotCU5NX0FWU1RBVEVfT0ZGX0xJTkUJPSAzLAotCU5NX0FWU1RBVEVfREVQRU5ERU5DWQk9IDUsCi0JTk1fQVZTVEFURV9ERUdSQURFRAk9IDYsCi0JTk1fQVZTVEFURV9OT1RfSU5TVEFMTEVEPSA3LAotCU5NX0FWU1RBVEVfT0sJCT0gMHhmZiwKLX07Ci0KLWVudW0gYWJpc19ubV9vcF9zdGF0ZSB7Ci0JTk1fT1BTVEFURV9ESVNBQkxFRAk9IDEsCi0JTk1fT1BTVEFURV9FTkFCTEVECT0gMiwKLQlOTV9PUFNUQVRFX05VTEwJCT0gMHhmZiwKLX07Ci0KLS8qIFNlY3Rpb24gOS40LjEzOiBDaGFubmVsIENvbWJpbmF0aW9uICovCi1lbnVtIGFiaXNfbm1fY2hhbl9jb21iIHsKLQlOTV9DSEFOQ19UQ0hGdWxsCT0gMHgwMCwJLyogVENIL0YgKyBUQ0gvSCArIFNBQ0NIL1RGICovCi0JTk1fQ0hBTkNfVENISGFsZgk9IDB4MDEsIC8qIFRDSC9IKDAsMSkgKyBGQUNDSC9IKDAsMSkgKwotCQkJCQkgICBTQUNDSC9USCgwLDEpICovCi0JTk1fQ0hBTkNfVENISGFsZjIJPSAweDAyLCAvKiBUQ0gvSCgwKSArIEZBQ0NIL0goMCkgKyBTQUNDSC9USCgwKSArCi0JCQkJCSAgIFRDSC9IKDEpICovCi0JTk1fQ0hBTkNfU0RDQ0gJCT0gMHgwMywJLyogU0RDQ0gvOCArIFNBQ0NILzggKi8KLQlOTV9DSEFOQ19tYWluQkNDSAk9IDB4MDQsCS8qIEZDQ0ggKyBTQ0ggKyBCQ0NIICsgQ0NDSCAqLwotCU5NX0NIQU5DX0JDQ0hDb21iCT0gMHgwNSwJLyogRkNDSCArIFNDSCArIEJDQ0ggKyBDQ0NIICsgU0RDQ0gvNCArCi0JCQkJCSAgIFNBQ0NIL0M0ICovCi0JTk1fQ0hBTkNfQkNDSAkJPSAweDA2LAkvKiBCQ0NIICsgQ0NDSCAqLwotCU5NX0NIQU5DX0JDQ0hfQ0JDSAk9IDB4MDcsCS8qIENIQU5DX0JDQ0hDb21iICsgQ0JDSCAqLwotCU5NX0NIQU5DX1NEQ0NIX0NCQ0gJPSAweDA4LAkvKiBDSEFOQ19TRENDSDggKyBDQkNIICovCi0JLyogaXAuYWNjZXNzICovCi0JTk1fQ0hBTkNfSVBBQ19iUERDSAk9IDB4MGIsCS8qIFBCQ0NIICsgUENDQ0ggKyBQRFRDSC9GICsgUEFDQ0gvRiArCi0JCQkJCSAgIFBUQ0NIL0YgKi8KLQlOTV9DSEFOQ19JUEFDX2NQRENICT0gMHgwYywgLyogUEJDQ0ggKyBQRFRDSC9GICsgUEFDQ0gvRiArIFBUQ0NIL0YgKi8KLQlOTV9DSEFOQ19JUEFDX1BEQ0gJPSAweDBkLAkvKiBQRFRDSC9GICsgUEFDQ0gvRiArIFBUQ0NIL0YgKi8KLQlOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSCA9IDB4ODAsCi0JTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGYgPSAweDgxLAotfTsKLQotLyogU2VjdGlvbiA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KLWVudW0gYWJpc19ubV9ldmVudF90eXBlIHsKLQlOTV9FVlRfQ09NTV9GQUlMCT0gMHgwMCwKLQlOTV9FVlRfUU9TX0ZBSUwJCT0gMHgwMSwKLQlOTV9FVlRfUFJPQ19GQUlMCT0gMHgwMiwKLQlOTV9FVlRfRVFVSVBfRkFJTAk9IDB4MDMsCi0JTk1fRVZUX0VOVl9GQUlMCQk9IDB4MDQsCi19OwotCi0vKiBTZWN0aW9uOiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLwotZW51bSBhYmlzX25tX3NldmVyaXR5IHsKLQlOTV9TRVZFUl9DRUFTRUQJCT0gMHgwMCwKLQlOTV9TRVZFUl9DUklUSUNBTAk9IDB4MDEsCi0JTk1fU0VWRVJfTUFKT1IJCT0gMHgwMiwKLQlOTV9TRVZFUl9NSU5PUgkJPSAweDAzLAotCU5NX1NFVkVSX1dBUk5JTkcJPSAweDA0LAotCU5NX1NFVkVSX0lOREVURVJNSU5BVEUJPSAweDA1LAotfTsKLQotLyogU2VjdGlvbiA5LjQuNDM6IFByb2JhYmxlIENhdXNlIFR5cGUgKi8KLWVudW0gYWJpc19ubV9wY2F1c2VfdHlwZSB7Ci0JTk1fUENBVVNFX1RfWDcyMQk9IDB4MDEsCi0JTk1fUENBVVNFX1RfR1NNCQk9IDB4MDIsCi0JTk1fUENBVVNFX1RfTUFOVUYJPSAweDAzLAotfTsKLQotLyogU2VjdGlvbiA5LjQuMzY6IE5BQ0sgQ2F1c2VzICovCi1lbnVtIGFiaXNfbm1fbmFja19jYXVzZSB7Ci0JLyogR2VuZXJhbCBOYWNrIENhdXNlcyAqLwotCU5NX05BQ0tfSU5DT1JSX1NUUlVDVAkJPSAweDAxLAotCU5NX05BQ0tfTVNHVFlQRV9JTlZBTAkJPSAweDAyLAotCU5NX05BQ0tfT0JKQ0xBU1NfSU5WQUwJCT0gMHgwNSwKLQlOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAJPSAweDA2LAotCU5NX05BQ0tfQlRTTlJfVU5LTgkJPSAweDA3LAotCU5NX05BQ0tfVFJYTlJfVU5LTgkJPSAweDA4LAotCU5NX05BQ0tfT0JKSU5TVF9VTktOCQk9IDB4MDksCi0JTk1fTkFDS19BVFRSSURfSU5WQUwJCT0gMHgwYywKLQlOTV9OQUNLX0FUVFJJRF9OT1RTVVBQCQk9IDB4MGQsCi0JTk1fTkFDS19QQVJBTV9SQU5HRQkJPSAweDBlLAotCU5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5UCT0gMHgwZiwKLQlOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQCT0gMHgxMCwKLQlOTV9OQUNLX0NBTlRfUEVSRk9STQkJPSAweDExLAotCS8qIFNwZWNpZmljIE5hY2sgQ2F1c2VzICovCi0JTk1fTkFDS19SRVNfTk9USU1QTAkJPSAweDE5LAotCU5NX05BQ0tfUkVTX05PVEFWQUlMCQk9IDB4MWEsCi0JTk1fTkFDS19GUkVRX05PVEFWQUlMCQk9IDB4MWIsCi0JTk1fTkFDS19URVNUX05PVFNVUFAJCT0gMHgxYywKLQlOTV9OQUNLX0NBUEFDSVRZX1JFU1RSCQk9IDB4MWQsCi0JTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0JPSAweDFlLAotCU5NX05BQ0tfVEVTVF9OT1RJTklUCQk9IDB4MWYsCi0JTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUJPSAweDIwLAotCU5NX05BQ0tfVEVTVF9OT1NVQ0gJCT0gMHgyMSwKLQlOTV9OQUNLX1RFU1RfTk9TVE9QCQk9IDB4MjIsCi0JTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRwk9IDB4MjMsCi0JTk1fTkFDS19GSUxFX0lOQ09NUExFVEUJCT0gMHgyNSwKLQlOTV9OQUNLX0ZJTEVfTk9UQVZBSUwJCT0gMHgyNiwKLQlOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUJPSAweDI3LAotCU5NX05BQ0tfUkVRX05PVF9HUkFOVAkJPSAweDI4LAotCU5NX05BQ0tfV0FJVAkJCT0gMHgyOSwKLQlOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNUCT0gMHgyYSwKLQlOTV9OQUNLX01FQVNfTk9UU1VQUAkJPSAweDJiLAotCU5NX05BQ0tfTUVBU19OT1RTVEFSVAkJPSAweDJjLAotfTsKLQotLyogU2VjdGlvbiA5LjQuMSAqLwotc3RydWN0IGFiaXNfbm1fY2hhbm5lbCB7Ci0JdWludDhfdAlhdHRyaWI7Ci0JdWludDhfdAlidHNfcG9ydDsKLQl1aW50OF90CXRpbWVzbG90OwotCXVpbnQ4X3QJc3Vic2xvdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTaWVtZW5zIEJTLTExIHNwZWNpZmljIG9iamVjdHMgaW4gdGhlIFNpZW5lbXNIVyAoMHhBNSkgb2JqZWN0IGNsYXNzICovCi1lbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHsKLQlCUzExX09CSl9BTENPCQk9IDB4MDEsCi0JQlMxMV9PQkpfQkJTSUcJCT0gMHgwMiwJLyogb2JqX2NsYXNzOiAwLDEgKi8KLQlCUzExX09CSl9UUlgxCQk9IDB4MDMsCS8qIG9ubHkgREVBQ1RJVkFURSBUUlgxICovCi0JQlMxMV9PQkpfQ0NMSwkJPSAweDA0LAotCUJTMTFfT0JKX0dQU1UJCT0gMHgwNiwKLQlCUzExX09CSl9MSQkJPSAweDA3LAotCUJTMTFfT0JKX1BBCQk9IDB4MDksCS8qIG9ial9jbGFzczogMCwgMSovCi19OwotCi1lbnVtIGFiaXNfYnMxMV90cnhfcG93ZXIgewotCUJTMTFfVFJYX1BPV0VSX0dTTV8yVwk9IDB4MDYsCi0JQlMxMV9UUlhfUE9XRVJfR1NNXzI1MG1XPSAweDA3LAotCUJTMTFfVFJYX1BPV0VSX0dTTV84MG1XCT0gMHgwOCwKLQlCUzExX1RSWF9QT1dFUl9HU01fMzBtVwk9IDB4MDksCi0JQlMxMV9UUlhfUE9XRVJfRENTXzNXCT0gMHgwYSwKLQlCUzExX1RSWF9QT1dFUl9EQ1NfMVc2CT0gMHgwYiwKLQlCUzExX1RSWF9QT1dFUl9EQ1NfNTAwbVc9IDB4MGMsCi0JQlMxMV9UUlhfUE9XRVJfRENTXzE2MG1XPSAweDBkLAotfTsKLQotZW51bSBhYmlzX2JzMTFfbGlfcGxsX21vZGUgewotCUJTMTFfTElfUExMX0xPQ0tFRAk9IDIsCi0JQlMxMV9MSV9QTExfU1RBTkRBTE9ORQk9IDMsCi19OwotCi1lbnVtIGFiaXNfYnMxMV9saW5lX2NmZyB7Ci0JQlMxMV9MSU5FX0NGR19TVEFSCT0gMHgwMCwKLQlCUzExX0xJTkVfQ0ZHX01VTFRJRFJPUAk9IDB4MDEsCi0JQlMxMV9MSU5FX0NGR19MT09QCT0gMHgwMiwKLX07Ci0KLWVudW0gYWJpc19iczExX3BoYXNlIHsKLQlCUzExX1NUQVRFX1NPRlRXQVJFX1JRRAkJPSAweDAxLAotCUJTMTFfU1RBVEVfTE9BRF9TTVVfSU5URU5ERUQJPSAweDExLAotCUJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZCT0gMHgyMSwKLQlCUzExX1NUQVRFX0xPQURfRkFJTEVECQk9IDB4MzEsCi0JQlMxMV9TVEFURV9MT0FEX0RJQUdOT1NUSUMJPSAweDQxLAotCUJTMTFfU1RBVEVfV0FSTV9VUAkJPSAweDUxLAotCUJTMTFfU1RBVEVfV0FSTV9VUF8yCQk9IDB4NTIsCi0JQlMxMV9TVEFURV9XQUlUX01JTl9DRkcJCT0gMHg2MiwKLQlCUzExX1NUQVRFX01BSU5URU5BTkNFCQk9IDB4NzIsCi0JQlMxMV9TVEFURV9MT0FEX01CQ0NVCQk9IDB4OTIsCi0JQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMgk9IDB4QTIsCi0JQlMxMV9TVEFURV9OT1JNQUwJCT0gMHgwMywKLQlCUzExX1NUQVRFX0FCSVNfTE9BRAkJPSAweDEzLAotfTsKLQotZW51bSBhYmlzX25tX2lwYWNjX3Rlc3Rfbm8gewotCU5NX0lQQUNDX1RFU1ROT19STE9PUF9BTlQJPSAweDAxLAotCU5NX0lQQUNDX1RFU1ROT19STE9PUF9YQ1ZSCT0gMHgwMiwKLQlOTV9JUEFDQ19URVNUTk9fRlVOQ19PQkoJPSAweDAzLAotCU5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFCT0gMHg0MCwKLQlOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFCT0gMHg0MSwKLQlOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DCT0gMHg0MiwKLQlOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPCT0gMHg0MywKLQlOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OCT0gMHg0NCwKLQlOTV9JUEFDQ19URVNUTk9fU1lTSU5GT19NT05JVE9SCT0gMHg0NSwKLQlOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUgk9IDB4NDYsCi19OwotCi0vKiBmaXJzdCBieXRlIGFmdGVyIGxlbmd0aCBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCi1lbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9yZXMgewotCU5NX0lQQUNDX1RFU1RSRVNfU1VDQ0VTUwk9IDAsCi0JTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VUCT0gMSwKLQlOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TCT0gMiwKLQlOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUwJPSAzLAotCU5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRAk9IDQsCi19OwotCi0vKiBpbnRlcm5hbCBJRSBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCi1lbnVtIGFiaXNfbm1faXBhY2NfdGVzdHJlc19pZSB7Ci0JTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlJfTElTVAk9IDMsCi0JTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRQk9IDQsCi0JTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPCT0gNiwKLQlOTV9JUEFDQ19UUl9JRV9SRVNVTFRfREVUQUlMUwk9IDgsCi0JTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlIJCT0gMTgsCi19OwotCi1lbnVtIGlwYWNfZWllIHsKLQlOTV9JUEFDX0VJRV9BUkZDTl9XSElURQkJPSAweDAxLAotCU5NX0lQQUNfRUlFX0FSRkNIX0JMQUNLCQk9IDB4MDIsCi0JTk1fSVBBQ19FSUVfRlJFUV9FUlJfTElTVAk9IDB4MDMsCi0JTk1fSVBBQ19FSUVfQ0hBTl9VU0VfTElTVAk9IDB4MDQsCi0JTk1fSVBBQ19FSUVfQkNDSF9JTkZPX1RZUEUJPSAweDA1LAotCU5NX0lQQUNfRUlFX0JDQ0hfSU5GTwkJPSAweDA2LAotCU5NX0lQQUNfRUlFX0NPTkZJRwkJPSAweDA3LAotCU5NX0lQQUNfRUlFX1JFU19ERVRBSUxTCQk9IDB4MDgsCi0JTk1fSVBBQ19FSUVfUlhMRVZfVEhSRVNICT0gMHgwOSwKLQlOTV9JUEFDX0VJRV9GUkVRX1NZTkNfT1BUUwk9IDB4MGEsCi0JTk1fSVBBQ19FSUVfTUFDX0FERFIJCT0gMHgwYiwKLQlOTV9JUEFDX0VJRV9IV19TV19DT01QQVRfTlIJPSAweDBjLAotCU5NX0lQQUNfRUlFX01BTlVGX1NFUl9OUgk9IDB4MGQsCi0JTk1fSVBBQ19FSUVfT0VNX0lECQk9IDB4MGUsCi0JTk1fSVBBQ19FSUVfREFURV9USU1FX01BTlVGCT0gMHgwZiwKLQlOTV9JUEFDX0VJRV9EQVRFX1RJTUVfQ0FMSUIJPSAweDEwLAotCU5NX0lQQUNfRUlFX0JFQUNPTl9JTkZPCQk9IDB4MTEsCi0JTk1fSVBBQ19FSUVfRlJFUV9FUlIJCT0gMHgxMiwKLQkvKiBGSVhNRSAqLwotCU5NX0lQQUNfRUlFX0ZSRVFfQkFORFMJCT0gMHgxYywKLQlOTV9JUEFDX0VJRV9NQVhfVEEJCT0gMHgxZCwKLQlOTV9JUEFDX0VJRV9DSVBIX0FMR09TCQk9IDB4MWUsCi0JTk1fSVBBQ19FSUVfQ0hBTl9UWVBFUwkJPSAweDFmLAotCU5NX0lQQUNfRUlFX0NIQU5fTU9ERVMJCT0gMHgyMCwKLQlOTV9JUEFDX0VJRV9HUFJTX0NPRElORwkJPSAweDIxLAotCU5NX0lQQUNfRUlFX1JUUF9GRUFUVVJFUwk9IDB4MjIsCi0JTk1fSVBBQ19FSUVfUlNMX0ZFQVRVUkVTCT0gMHgyMywKLQlOTV9JUEFDX0VJRV9CVFNfSFdfQ0xBU1MJPSAweDI0LAotCU5NX0lQQUNfRUlFX0JUU19JRAkJPSAweDI1LAotfTsKLQotZW51bSBpcGFjX2JjY2hfaW5mb190eXBlIHsKLQlJUEFDX0JJTkZfUlhMRVYJCQk9ICgxIDw8IDgpLAotCUlQQUNfQklORl9SWFFVQUwJCT0gKDEgPDwgOSksCi0JSVBBQ19CSU5GX0ZSRVFfRVJSX1FVQUwJCT0gKDEgPDwgMTApLAotCUlQQUNfQklORl9GUkFNRV9PRkZTRVQJCT0gKDEgPDwgMTEpLAotCUlQQUNfQklORl9GUkFNRV9OUl9PRkZTRVQJPSAoMSA8PCAxMiksCi0JSVBBQ19CSU5GX0JTSUMJCQk9ICgxIDw8IDEzKSwKLQlJUEFDX0JJTkZfQ0dJCQkJPSAoMSA8PCAxNCksCi0JSVBBQ19CSU5GX05FSUdIX0JBX1NJMgkJPSAoMSA8PCAxNSksCi0JSVBBQ19CSU5GX05FSUdIX0JBX1NJMmJpcwk9ICgxIDw8IDApLAotCUlQQUNfQklORl9ORUlHSF9CQV9TSTJ0ZXIJPSAoMSA8PCAxKSwKLQlJUEFDX0JJTkZfQ0VMTF9BTExPQwkJPSAoMSA8PCAyKSwKLX07Ci0KLSNlbmRpZiAvKiBQUk9UT19HU01fMTJfMjFfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnNsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjkwZDYuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSNpZm5kZWYgX09TTU9DT1JFX1JTTF9ICi0jZGVmaW5lIF9PU01PQ09SRV9SU0xfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KLSNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaD4KLQotdm9pZCByc2xfaW5pdF9ybGxfaGRyKHN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpkaCwgdWludDhfdCBtc2dfdHlwZSk7Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gcnNsX2F0dF90bHZkZWY7Ci0jZGVmaW5lIHJzbF90bHZfcGFyc2UoZGVjLCBidWYsIGxlbikgICAgIFwKLQkJCXRsdl9wYXJzZShkZWMsICZyc2xfYXR0X3RsdmRlZiwgYnVmLCBsZW4sIDAsIDApCi0KLS8qIGVuY29kZSBjaGFubmVsIG51bWJlciBhcyBwZXIgU2VjdGlvbiA5LjMuMSAqLwotdWludDhfdCByc2xfZW5jX2NoYW5fbnIodWludDhfdCB0eXBlLCB1aW50OF90IHN1YmNoLCB1aW50OF90IHRpbWVzbG90KTsKLS8qIGRlY29kZSBjaGFubmVsIG51bWJlciBhcyBwZXIgU2VjdGlvbiA5LjMuMSAqLwotaW50IHJzbF9kZWNfY2hhbl9ucih1aW50OF90IGNoYW5fbnIsIHVpbnQ4X3QgKnR5cGUsIHVpbnQ4X3QgKnN1YmNoLCB1aW50OF90ICp0aW1lc2xvdCk7Ci0KLWNvbnN0IGNoYXIgKnJzbF9lcnJfbmFtZSh1aW50OF90IGVycik7Ci1jb25zdCBjaGFyICpyc2xfcmxtX2NhdXNlX25hbWUodWludDhfdCBlcnIpOwotCi0vKiBTZWN0aW9uIDMuMy4yLjMgVFMgMDUuMDIuIEkgdGhpbmsgdGhpcyBsb29rcyBsaWtlIGEgdGFibGUgKi8KLWludCByc2xfY2NjaF9jb25mX3RvX2JzX2NjX2NoYW5zKGludCBjY2NoX2NvbmYpOwotCi0vKiBQdXNoIGEgUlNMIFJMTCBoZWFkZXIgd2l0aCBMM19JTkZPIElFICovCi12b2lkIHJzbF9ybGxfcHVzaF9sMyhzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IG1zZ190eXBlLCB1aW50OF90IGNoYW5fbnIsCi0JCSAgICAgdWludDhfdCBsaW5rX2lkLCBpbnQgdHJhbnNwYXJlbnQpOwotCi0vKiBBbGxvY2F0ZSBtc2diIGFuZCBmaWxsIHdpdGggc2ltcGxlIFJTTCBSTEwgaGVhZGVyICovCi1zdHJ1Y3QgbXNnYiAqcnNsX3JsbF9zaW1wbGUodWludDhfdCBtc2dfdHlwZSwgdWludDhfdCBjaGFuX25yLAotCQkJICAgIHVpbnQ4X3QgbGlua19pZCwgaW50IHRyYW5zcGFyZW50KTsKLSNlbmRpZiAvKiBfT1NNT0NPUkVfUlNMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnhsZXZfc3RhdC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTUwOWQuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jaWZuZGVmIF9PU01PQ09SRV9SWExFVl9TVEFUU19ICi0jZGVmaW5lIF9PU01PQ09SRV9SWExFVl9TVEFUU19ICi0KLSNkZWZpbmUgTlVNX1JYTEVWUyAzMgotI2RlZmluZSBOVU1fQVJGQ05TIDEwMjQKLQotc3RydWN0IHJ4bGV2X3N0YXRzIHsKLQkvKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgQVJGQ04ncyBpcyAxMDI0LCBhbmQgdGhlcmUgYXJlIDMyIFJ4TGV2ZWxzLAotCSAqIHNvIGluIHdlIGtlZXAgb25lIDEwMjRiaXQtYml0dmVjIGZvciBlYWNoIFJ4TGV2ICovCi0JdWludDhfdCByeGxldl9idWNrZXRzW05VTV9SWExFVlNdW05VTV9BUkZDTlMvOF07Ci19OwotCi12b2lkIHJ4bGV2X3N0YXRfaW5wdXQoc3RydWN0IHJ4bGV2X3N0YXRzICpzdCwgdWludDE2X3QgYXJmY24sIHVpbnQ4X3QgcnhsZXYpOwotCi0vKiBnZXQgdGhlIG5leHQgQVJGQ04gdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBSeGxldiAqLwotaW50MTZfdCByeGxldl9zdGF0X2dldF9uZXh0KGNvbnN0IHN0cnVjdCByeGxldl9zdGF0cyAqc3QsIHVpbnQ4X3QgcnhsZXYsIGludDE2X3QgYXJmY24pOwotCi12b2lkIHJ4bGV2X3N0YXRfcmVzZXQoc3RydWN0IHJ4bGV2X3N0YXRzICpzdCk7Ci0KLXZvaWQgcnhsZXZfc3RhdF9kdW1wKGNvbnN0IHN0cnVjdCByeGxldl9zdGF0cyAqc3QpOwotCi0jZW5kaWYgLyogX09TTU9DT1JFX1JYTEVWX1NUQVRTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2VsZWN0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDhiM2VjLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2VsZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jaWZuZGVmIF9CU0NfU0VMRUNUX0gKLSNkZWZpbmUgX0JTQ19TRUxFQ1RfSAotCi0jaW5jbHVkZSAibGludXhsaXN0LmgiCi0KLSNkZWZpbmUgQlNDX0ZEX1JFQUQJMHgwMDAxCi0jZGVmaW5lIEJTQ19GRF9XUklURQkweDAwMDIKLSNkZWZpbmUgQlNDX0ZEX0VYQ0VQVAkweDAwMDQKLQotc3RydWN0IGJzY19mZCB7Ci0Jc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKLQlpbnQgZmQ7Ci0JdW5zaWduZWQgaW50IHdoZW47Ci0JaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCk7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBpbnQgcHJpdl9ucjsKLX07Ci0KLWludCBic2NfcmVnaXN0ZXJfZmQoc3RydWN0IGJzY19mZCAqZmQpOwotdm9pZCBic2NfdW5yZWdpc3Rlcl9mZChzdHJ1Y3QgYnNjX2ZkICpmZCk7Ci1pbnQgYnNjX3NlbGVjdF9tYWluKGludCBwb2xsaW5nKTsKLSNlbmRpZiAvKiBfQlNDX1NFTEVDVF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NpZ25hbC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkODNkMi4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NpZ25hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2lmbmRlZiBPU01PQ09SRV9TSUdOQUxfSAotI2RlZmluZSBPU01PQ09SRV9TSUdOQUxfSAotCi10eXBlZGVmIGludCBzaWduYWxfY2Jmbih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAotCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSk7Ci0KLQotLyogTWFuYWdlbWVudCAqLwotaW50IHJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKHVuc2lnbmVkIGludCBzdWJzeXMsIHNpZ25hbF9jYmZuICpjYmZuLCB2b2lkICpkYXRhKTsKLXZvaWQgdW5yZWdpc3Rlcl9zaWduYWxfaGFuZGxlcih1bnNpZ25lZCBpbnQgc3Vic3lzLCBzaWduYWxfY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSk7Ci0KLS8qIERpc3BhdGNoICovCi12b2lkIGRpc3BhdGNoX3NpZ25hbCh1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLCB2b2lkICpzaWduYWxfZGF0YSk7Ci0KLSNlbmRpZiAvKiBPU01PQ09SRV9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3N0YXRpc3RpY3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1NjA1NC4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3N0YXRpc3RpY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpZm5kZWYgX1NUQVRJU1RJQ1NfSAotI2RlZmluZSBfU1RBVElTVElDU19ICi0KLXN0cnVjdCBjb3VudGVyIHsKLQlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqZGVzY3JpcHRpb247Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3VudGVyX2luYyhzdHJ1Y3QgY291bnRlciAqY3RyKQotewotCWN0ci0+dmFsdWUrKzsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvdW50ZXJfZ2V0KHN0cnVjdCBjb3VudGVyICpjdHIpCi17Ci0JcmV0dXJuIGN0ci0+dmFsdWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3VudGVyX3Jlc2V0KHN0cnVjdCBjb3VudGVyICpjdHIpCi17Ci0JY3RyLT52YWx1ZSA9IDA7Ci19Ci0KLXN0cnVjdCBjb3VudGVyICpjb3VudGVyX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpOwotdm9pZCBjb3VudGVyX2ZyZWUoc3RydWN0IGNvdW50ZXIgKmN0cik7Ci0KLWludCBjb3VudGVyc19mb3JfZWFjaChpbnQgKCpoYW5kbGVfY291bnRlcikoc3RydWN0IGNvdW50ZXIgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSk7Ci0KLSNlbmRpZiAvKiBfU1RBVElTVElDU19IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3RhbGxvYy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmNzY0My4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3RhbGxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLSNpZm5kZWYgX1RBTExPQ19IXwotI2RlZmluZSBfVEFMTE9DX0hfCi0vKiAKLSAgIFVuaXggU01CL0NJRlMgaW1wbGVtZW50YXRpb24uCi0gICBTYW1iYSB0ZW1wb3JhcnkgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zCi0KLSAgIENvcHlyaWdodCAoQykgQW5kcmV3IFRyaWRnZWxsIDIwMDQtMjAwNQotICAgQ29weXJpZ2h0IChDKSBTdGVmYW4gTWV0em1hY2hlciAyMDA2Ci0gICAKLSAgICAgKiogTk9URSEgVGhlIGZvbGxvd2luZyBMR1BMIGxpY2Vuc2UgYXBwbGllcyB0byB0aGUgdGFsbG9jCi0gICAgICoqIGxpYnJhcnkuIFRoaXMgZG9lcyBOT1QgaW1wbHkgdGhhdCBhbGwgb2YgU2FtYmEgaXMgcmVsZWFzZWQKLSAgICAgKiogdW5kZXIgdGhlIExHUEwKLSAgIAotICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2RlZmluZSBIQVZFX1ZBX0NPUFkKLQotLyogdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgdGFsbG9jICovCi10eXBlZGVmIHZvaWQgVEFMTE9DX0NUWDsKLQotLyoKLSAgdGhpcyB1c2VzIGEgbGl0dGxlIHRyaWNrIHRvIGFsbG93IF9fTElORV9fIHRvIGJlIHN0cmluZ2lmaWVkCi0qLwotI2lmbmRlZiBfX2xvY2F0aW9uX18KLSNkZWZpbmUgX19UQUxMT0NfU1RSSU5HX0xJTkUxX18ocykgICAgI3MKLSNkZWZpbmUgX19UQUxMT0NfU1RSSU5HX0xJTkUyX18ocykgICBfX1RBTExPQ19TVFJJTkdfTElORTFfXyhzKQotI2RlZmluZSBfX1RBTExPQ19TVFJJTkdfTElORTNfXyAgX19UQUxMT0NfU1RSSU5HX0xJTkUyX18oX19MSU5FX18pCi0jZGVmaW5lIF9fbG9jYXRpb25fXyBfX0ZJTEVfXyAiOiIgX19UQUxMT0NfU1RSSU5HX0xJTkUzX18KLSNlbmRpZgotCi0jaWZuZGVmIFRBTExPQ19ERVBSRUNBVEVECi0jZGVmaW5lIFRBTExPQ19ERVBSRUNBVEVEIDAKLSNlbmRpZgotCi0jaWZuZGVmIFBSSU5URl9BVFRSSUJVVEUKLSNpZiAoX19HTlVDX18gPj0gMykKLS8qKiBVc2UgZ2NjIGF0dHJpYnV0ZSB0byBjaGVjayBwcmludGYgZm5zLiAgYTEgaXMgdGhlIDEtYmFzZWQgaW5kZXggb2YKLSAqIHRoZSBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgZm9ybWF0LCBhbmQgYTIgdGhlIGluZGV4IG9mIHRoZSBmaXJzdAotICogYXJndW1lbnQuIE5vdGUgdGhhdCBzb21lIGdjYyAyLnggdmVyc2lvbnMgZG9uJ3QgaGFuZGxlIHRoaXMKLSAqIHByb3Blcmx5ICoqLwotI2RlZmluZSBQUklOVEZfQVRUUklCVVRFKGExLCBhMikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAoX19wcmludGZfXywgYTEsIGEyKSkpCi0jZWxzZQotI2RlZmluZSBQUklOVEZfQVRUUklCVVRFKGExLCBhMikKLSNlbmRpZgotI2VuZGlmCi0KLS8qIHRyeSB0byBtYWtlIHRhbGxvY19zZXRfZGVzdHJ1Y3RvcigpIGFuZCB0YWxsb2Nfc3RlYWwoKSB0eXBlIHNhZmUsCi0gICBpZiB3ZSBoYXZlIGEgcmVjZW50IGdjYyAqLwotI2lmIChfX0dOVUNfXyA+PSAzKQotI2RlZmluZSBfVEFMTE9DX1RZUEVPRihwdHIpIF9fdHlwZW9mX18ocHRyKQotI2RlZmluZSB0YWxsb2Nfc2V0X2Rlc3RydWN0b3IocHRyLCBmdW5jdGlvbikJCQkJICAgICAgXAotCWRvIHsJCQkJCQkJCSAgICAgIFwKLQkJaW50ICgqX3RhbGxvY19kZXN0cnVjdG9yX2ZuKShfVEFMTE9DX1RZUEVPRihwdHIpKSA9IChmdW5jdGlvbik7CSAgICAgIFwKLQkJX3RhbGxvY19zZXRfZGVzdHJ1Y3RvcigocHRyKSwgKGludCAoKikodm9pZCAqKSlfdGFsbG9jX2Rlc3RydWN0b3JfZm4pOyBcCi0JfSB3aGlsZSgwKQotLyogdGhpcyBleHRyZW1lbHkgc3RyYW5nZSBtYWNybyBpcyB0byBhdm9pZCBzb21lIGJyYWluZGFtYWdlZCB3YXJuaW5nCi0gICBzdHVwaWRpdHkgaW4gZ2NjIDQuMS54ICovCi0jZGVmaW5lIHRhbGxvY19zdGVhbChjdHgsIHB0cikgKHsgX1RBTExPQ19UWVBFT0YocHRyKSBfX3RhbGxvY19zdGVhbF9yZXQgPSAoX1RBTExPQ19UWVBFT0YocHRyKSlfdGFsbG9jX3N0ZWFsKChjdHgpLChwdHIpKTsgX190YWxsb2Nfc3RlYWxfcmV0OyB9KQotI2Vsc2UKLSNkZWZpbmUgdGFsbG9jX3NldF9kZXN0cnVjdG9yKHB0ciwgZnVuY3Rpb24pIFwKLQlfdGFsbG9jX3NldF9kZXN0cnVjdG9yKChwdHIpLCAoaW50ICgqKSh2b2lkICopKShmdW5jdGlvbikpCi0jZGVmaW5lIF9UQUxMT0NfVFlQRU9GKHB0cikgdm9pZCAqCi0jZGVmaW5lIHRhbGxvY19zdGVhbChjdHgsIHB0cikgKF9UQUxMT0NfVFlQRU9GKHB0cikpX3RhbGxvY19zdGVhbCgoY3R4KSwocHRyKSkKLSNlbmRpZgotCi0jZGVmaW5lIHRhbGxvY19yZWZlcmVuY2UoY3R4LCBwdHIpIChfVEFMTE9DX1RZUEVPRihwdHIpKV90YWxsb2NfcmVmZXJlbmNlKChjdHgpLChwdHIpKQotI2RlZmluZSB0YWxsb2NfbW92ZShjdHgsIHB0cikgKF9UQUxMT0NfVFlQRU9GKCoocHRyKSkpX3RhbGxvY19tb3ZlKChjdHgpLCh2b2lkICopKHB0cikpCi0KLS8qIHVzZWZ1bCBtYWNyb3MgZm9yIGNyZWF0aW5nIHR5cGUgY2hlY2tlZCBwb2ludGVycyAqLwotI2RlZmluZSB0YWxsb2MoY3R4LCB0eXBlKSAodHlwZSAqKXRhbGxvY19uYW1lZF9jb25zdChjdHgsIHNpemVvZih0eXBlKSwgI3R5cGUpCi0jZGVmaW5lIHRhbGxvY19zaXplKGN0eCwgc2l6ZSkgdGFsbG9jX25hbWVkX2NvbnN0KGN0eCwgc2l6ZSwgX19sb2NhdGlvbl9fKQotI2RlZmluZSB0YWxsb2NfcHRydHlwZShjdHgsIHB0cikgKF9UQUxMT0NfVFlQRU9GKHB0cikpdGFsbG9jX3NpemUoY3R4LCBzaXplb2YoKihwdHIpKSkKLQotI2RlZmluZSB0YWxsb2NfbmV3KGN0eCkgdGFsbG9jX25hbWVkX2NvbnN0KGN0eCwgMCwgInRhbGxvY19uZXc6ICIgX19sb2NhdGlvbl9fKQotCi0jZGVmaW5lIHRhbGxvY196ZXJvKGN0eCwgdHlwZSkgKHR5cGUgKilfdGFsbG9jX3plcm8oY3R4LCBzaXplb2YodHlwZSksICN0eXBlKQotI2RlZmluZSB0YWxsb2NfemVyb19zaXplKGN0eCwgc2l6ZSkgX3RhbGxvY196ZXJvKGN0eCwgc2l6ZSwgX19sb2NhdGlvbl9fKQotCi0jZGVmaW5lIHRhbGxvY196ZXJvX2FycmF5KGN0eCwgdHlwZSwgY291bnQpICh0eXBlICopX3RhbGxvY196ZXJvX2FycmF5KGN0eCwgc2l6ZW9mKHR5cGUpLCBjb3VudCwgI3R5cGUpCi0jZGVmaW5lIHRhbGxvY19hcnJheShjdHgsIHR5cGUsIGNvdW50KSAodHlwZSAqKV90YWxsb2NfYXJyYXkoY3R4LCBzaXplb2YodHlwZSksIGNvdW50LCAjdHlwZSkKLSNkZWZpbmUgdGFsbG9jX2FycmF5X3NpemUoY3R4LCBzaXplLCBjb3VudCkgX3RhbGxvY19hcnJheShjdHgsIHNpemUsIGNvdW50LCBfX2xvY2F0aW9uX18pCi0jZGVmaW5lIHRhbGxvY19hcnJheV9wdHJ0eXBlKGN0eCwgcHRyLCBjb3VudCkgKF9UQUxMT0NfVFlQRU9GKHB0cikpdGFsbG9jX2FycmF5X3NpemUoY3R4LCBzaXplb2YoKihwdHIpKSwgY291bnQpCi0jZGVmaW5lIHRhbGxvY19hcnJheV9sZW5ndGgoY3R4KSAodGFsbG9jX2dldF9zaXplKGN0eCkvc2l6ZW9mKCpjdHgpKQotCi0jZGVmaW5lIHRhbGxvY19yZWFsbG9jKGN0eCwgcCwgdHlwZSwgY291bnQpICh0eXBlICopX3RhbGxvY19yZWFsbG9jX2FycmF5KGN0eCwgcCwgc2l6ZW9mKHR5cGUpLCBjb3VudCwgI3R5cGUpCi0jZGVmaW5lIHRhbGxvY19yZWFsbG9jX3NpemUoY3R4LCBwdHIsIHNpemUpIF90YWxsb2NfcmVhbGxvYyhjdHgsIHB0ciwgc2l6ZSwgX19sb2NhdGlvbl9fKQotCi0jZGVmaW5lIHRhbGxvY19tZW1kdXAodCwgcCwgc2l6ZSkgX3RhbGxvY19tZW1kdXAodCwgcCwgc2l6ZSwgX19sb2NhdGlvbl9fKQotCi0jZGVmaW5lIHRhbGxvY19zZXRfdHlwZShwdHIsIHR5cGUpIHRhbGxvY19zZXRfbmFtZV9jb25zdChwdHIsICN0eXBlKQotI2RlZmluZSB0YWxsb2NfZ2V0X3R5cGUocHRyLCB0eXBlKSAodHlwZSAqKXRhbGxvY19jaGVja19uYW1lKHB0ciwgI3R5cGUpCi0jZGVmaW5lIHRhbGxvY19nZXRfdHlwZV9hYm9ydChwdHIsIHR5cGUpICh0eXBlICopX3RhbGxvY19nZXRfdHlwZV9hYm9ydChwdHIsICN0eXBlLCBfX2xvY2F0aW9uX18pCi0KLSNkZWZpbmUgdGFsbG9jX2ZpbmRfcGFyZW50X2J5dHlwZShwdHIsIHR5cGUpICh0eXBlICopdGFsbG9jX2ZpbmRfcGFyZW50X2J5bmFtZShwdHIsICN0eXBlKQotCi0jaWYgVEFMTE9DX0RFUFJFQ0FURUQKLSNkZWZpbmUgdGFsbG9jX3plcm9fcChjdHgsIHR5cGUpIHRhbGxvY196ZXJvKGN0eCwgdHlwZSkKLSNkZWZpbmUgdGFsbG9jX3AoY3R4LCB0eXBlKSB0YWxsb2MoY3R4LCB0eXBlKQotI2RlZmluZSB0YWxsb2NfYXJyYXlfcChjdHgsIHR5cGUsIGNvdW50KSB0YWxsb2NfYXJyYXkoY3R4LCB0eXBlLCBjb3VudCkKLSNkZWZpbmUgdGFsbG9jX3JlYWxsb2NfcChjdHgsIHAsIHR5cGUsIGNvdW50KSB0YWxsb2NfcmVhbGxvYyhjdHgsIHAsIHR5cGUsIGNvdW50KQotI2RlZmluZSB0YWxsb2NfZGVzdHJveShjdHgpIHRhbGxvY19mcmVlKGN0eCkKLSNkZWZpbmUgdGFsbG9jX2FwcGVuZF9zdHJpbmcoYywgcywgYSkgKHM/dGFsbG9jX3N0cmR1cF9hcHBlbmQocyxhKTp0YWxsb2Nfc3RyZHVwKGMsIGEpKQotI2VuZGlmCi0KLSNkZWZpbmUgVEFMTE9DX0ZSRUUoY3R4KSBkbyB7IHRhbGxvY19mcmVlKGN0eCk7IGN0eD1OVUxMOyB9IHdoaWxlKDApCi0KLS8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgY29tZSBmcm9tIHRhbGxvYy5jICAqLwotdm9pZCAqX3RhbGxvYyhjb25zdCB2b2lkICpjb250ZXh0LCBzaXplX3Qgc2l6ZSk7Ci12b2lkICp0YWxsb2NfcG9vbChjb25zdCB2b2lkICpjb250ZXh0LCBzaXplX3Qgc2l6ZSk7Ci12b2lkIF90YWxsb2Nfc2V0X2Rlc3RydWN0b3IoY29uc3Qgdm9pZCAqcHRyLCBpbnQgKCpfZGVzdHJ1Y3Rvcikodm9pZCAqKSk7Ci1pbnQgdGFsbG9jX2luY3JlYXNlX3JlZl9jb3VudChjb25zdCB2b2lkICpwdHIpOwotc2l6ZV90IHRhbGxvY19yZWZlcmVuY2VfY291bnQoY29uc3Qgdm9pZCAqcHRyKTsKLXZvaWQgKl90YWxsb2NfcmVmZXJlbmNlKGNvbnN0IHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnB0cik7Ci1pbnQgdGFsbG9jX3VubGluayhjb25zdCB2b2lkICpjb250ZXh0LCB2b2lkICpwdHIpOwotY29uc3QgY2hhciAqdGFsbG9jX3NldF9uYW1lKGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqZm10LCAuLi4pIFBSSU5URl9BVFRSSUJVVEUoMiwzKTsKLXZvaWQgdGFsbG9jX3NldF9uYW1lX2NvbnN0KGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqbmFtZSk7Ci12b2lkICp0YWxsb2NfbmFtZWQoY29uc3Qgdm9pZCAqY29udGV4dCwgc2l6ZV90IHNpemUsIAotCQkgICBjb25zdCBjaGFyICpmbXQsIC4uLikgUFJJTlRGX0FUVFJJQlVURSgzLDQpOwotdm9pZCAqdGFsbG9jX25hbWVkX2NvbnN0KGNvbnN0IHZvaWQgKmNvbnRleHQsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKLWNvbnN0IGNoYXIgKnRhbGxvY19nZXRfbmFtZShjb25zdCB2b2lkICpwdHIpOwotdm9pZCAqdGFsbG9jX2NoZWNrX25hbWUoY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgKl90YWxsb2NfZ2V0X3R5cGVfYWJvcnQoY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpsb2NhdGlvbik7Ci12b2lkICp0YWxsb2NfcGFyZW50KGNvbnN0IHZvaWQgKnB0cik7Ci1jb25zdCBjaGFyICp0YWxsb2NfcGFyZW50X25hbWUoY29uc3Qgdm9pZCAqcHRyKTsKLXZvaWQgKnRhbGxvY19pbml0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBQUklOVEZfQVRUUklCVVRFKDEsMik7Ci1pbnQgdGFsbG9jX2ZyZWUodm9pZCAqcHRyKTsKLXZvaWQgdGFsbG9jX2ZyZWVfY2hpbGRyZW4odm9pZCAqcHRyKTsKLXZvaWQgKl90YWxsb2NfcmVhbGxvYyhjb25zdCB2b2lkICpjb250ZXh0LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgKl90YWxsb2Nfc3RlYWwoY29uc3Qgdm9pZCAqbmV3X2N0eCwgY29uc3Qgdm9pZCAqcHRyKTsKLXZvaWQgKl90YWxsb2NfbW92ZShjb25zdCB2b2lkICpuZXdfY3R4LCBjb25zdCB2b2lkICpwcHRyKTsKLXNpemVfdCB0YWxsb2NfdG90YWxfc2l6ZShjb25zdCB2b2lkICpwdHIpOwotc2l6ZV90IHRhbGxvY190b3RhbF9ibG9ja3MoY29uc3Qgdm9pZCAqcHRyKTsKLXZvaWQgdGFsbG9jX3JlcG9ydF9kZXB0aF9jYihjb25zdCB2b2lkICpwdHIsIGludCBkZXB0aCwgaW50IG1heF9kZXB0aCwKLQkJCSAgICB2b2lkICgqY2FsbGJhY2spKGNvbnN0IHZvaWQgKnB0ciwKLQkJCSAgCQkgICAgIGludCBkZXB0aCwgaW50IG1heF9kZXB0aCwKLQkJCQkJICAgICBpbnQgaXNfcmVmLAotCQkJCQkgICAgIHZvaWQgKnByaXZhdGVfZGF0YSksCi0JCQkgICAgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKLXZvaWQgdGFsbG9jX3JlcG9ydF9kZXB0aF9maWxlKGNvbnN0IHZvaWQgKnB0ciwgaW50IGRlcHRoLCBpbnQgbWF4X2RlcHRoLCBGSUxFICpmKTsKLXZvaWQgdGFsbG9jX3JlcG9ydF9mdWxsKGNvbnN0IHZvaWQgKnB0ciwgRklMRSAqZik7Ci12b2lkIHRhbGxvY19yZXBvcnQoY29uc3Qgdm9pZCAqcHRyLCBGSUxFICpmKTsKLXZvaWQgdGFsbG9jX2VuYWJsZV9udWxsX3RyYWNraW5nKHZvaWQpOwotdm9pZCB0YWxsb2NfZGlzYWJsZV9udWxsX3RyYWNraW5nKHZvaWQpOwotdm9pZCB0YWxsb2NfZW5hYmxlX2xlYWtfcmVwb3J0KHZvaWQpOwotdm9pZCB0YWxsb2NfZW5hYmxlX2xlYWtfcmVwb3J0X2Z1bGwodm9pZCk7Ci12b2lkICpfdGFsbG9jX3plcm8oY29uc3Qgdm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSk7Ci12b2lkICpfdGFsbG9jX21lbWR1cChjb25zdCB2b2lkICp0LCBjb25zdCB2b2lkICpwLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSk7Ci12b2lkICpfdGFsbG9jX2FycmF5KGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGVsX3NpemUsIHVuc2lnbmVkIGNvdW50LCBjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgKl90YWxsb2NfemVyb19hcnJheShjb25zdCB2b2lkICpjdHgsIHNpemVfdCBlbF9zaXplLCB1bnNpZ25lZCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSk7Ci12b2lkICpfdGFsbG9jX3JlYWxsb2NfYXJyYXkoY29uc3Qgdm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBlbF9zaXplLCB1bnNpZ25lZCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSk7Ci12b2lkICp0YWxsb2NfcmVhbGxvY19mbihjb25zdCB2b2lkICpjb250ZXh0LCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKLXZvaWQgKnRhbGxvY19hdXRvZnJlZV9jb250ZXh0KHZvaWQpOwotc2l6ZV90IHRhbGxvY19nZXRfc2l6ZShjb25zdCB2b2lkICpjdHgpOwotdm9pZCAqdGFsbG9jX2ZpbmRfcGFyZW50X2J5bmFtZShjb25zdCB2b2lkICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUpOwotdm9pZCB0YWxsb2Nfc2hvd19wYXJlbnRzKGNvbnN0IHZvaWQgKmNvbnRleHQsIEZJTEUgKmZpbGUpOwotaW50IHRhbGxvY19pc19wYXJlbnQoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcHRyKTsKLQotY2hhciAqdGFsbG9jX3N0cmR1cChjb25zdCB2b2lkICp0LCBjb25zdCBjaGFyICpwKTsKLWNoYXIgKnRhbGxvY19zdHJkdXBfYXBwZW5kKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmEpOwotY2hhciAqdGFsbG9jX3N0cmR1cF9hcHBlbmRfYnVmZmVyKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmEpOwotCi1jaGFyICp0YWxsb2Nfc3RybmR1cChjb25zdCB2b2lkICp0LCBjb25zdCBjaGFyICpwLCBzaXplX3Qgbik7Ci1jaGFyICp0YWxsb2Nfc3RybmR1cF9hcHBlbmQoY2hhciAqcywgY29uc3QgY2hhciAqYSwgc2l6ZV90IG4pOwotY2hhciAqdGFsbG9jX3N0cm5kdXBfYXBwZW5kX2J1ZmZlcihjaGFyICpzLCBjb25zdCBjaGFyICphLCBzaXplX3Qgbik7Ci0KLWNoYXIgKnRhbGxvY192YXNwcmludGYoY29uc3Qgdm9pZCAqdCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKSBQUklOVEZfQVRUUklCVVRFKDIsMCk7Ci1jaGFyICp0YWxsb2NfdmFzcHJpbnRmX2FwcGVuZChjaGFyICpzLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApIFBSSU5URl9BVFRSSUJVVEUoMiwwKTsKLWNoYXIgKnRhbGxvY192YXNwcmludGZfYXBwZW5kX2J1ZmZlcihjaGFyICpzLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApIFBSSU5URl9BVFRSSUJVVEUoMiwwKTsKLQotY2hhciAqdGFsbG9jX2FzcHJpbnRmKGNvbnN0IHZvaWQgKnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBQUklOVEZfQVRUUklCVVRFKDIsMyk7Ci1jaGFyICp0YWxsb2NfYXNwcmludGZfYXBwZW5kKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBQUklOVEZfQVRUUklCVVRFKDIsMyk7Ci1jaGFyICp0YWxsb2NfYXNwcmludGZfYXBwZW5kX2J1ZmZlcihjaGFyICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLikgUFJJTlRGX0FUVFJJQlVURSgyLDMpOwotCi12b2lkIHRhbGxvY19zZXRfYWJvcnRfZm4odm9pZCAoKmFib3J0X2ZuKShjb25zdCBjaGFyICpyZWFzb24pKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3RpbWVyLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3RpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTg4OGIuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90aW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqLwotCi0jaWZuZGVmIFRJTUVSX0gKLSNkZWZpbmUgVElNRVJfSAotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2luY2x1ZGUgImxpbnV4bGlzdC5oIgotCi0vKioKLSAqIFRpbWVyIG1hbmFnZW1lbnQ6Ci0gKiAgICAgIC0gQ3JlYXRlIGEgc3RydWN0IHRpbWVyX2xpc3QKLSAqICAgICAgLSBGaWxsIG91dCB0aW1lb3V0IGFuZCB1c2UgYWRkX3RpbWVyIG9yCi0gKiAgICAgICAgdXNlIHNjaGVkdWxlX3RpbWVyIHRvIHNjaGVkdWxlIGEgdGltZXIgaW4KLSAqICAgICAgICB4IHNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcyBmcm9tIG5vdy4uLgotICogICAgICAtIFVzZSBkZWxfdGltZXIgdG8gcmVtb3ZlIHRoZSB0aW1lcgotICoKLSAqICBJbnRlcm5hbGx5OgotICogICAgICAtIFdlIGhvb2sgaW50byBzZWxlY3QuYyB0byBnaXZlIGEgdGltZXZhbCBvZiB0aGUKLSAqICAgICAgICBuZWFyZXN0IHRpbWVyLiBPbiBhbHJlYWR5IHBhc3NlZCB0aW1lcnMgd2UgZ2l2ZQotICogICAgICAgIGl0IGEgMCB0byBpbW1lZGlhdGVseSBmaXJlIGFmdGVyIHRoZSBzZWxlY3QKLSAqICAgICAgLSB1cGRhdGVfdGltZXJzIHdpbGwgY2FsbCB0aGUgY2FsbGJhY2tzIGFuZCByZW1vdmUKLSAqICAgICAgICB0aGUgdGltZXJzLgotICoKLSAqLwotc3RydWN0IHRpbWVyX2xpc3QgewotCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OwotCXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7Ci0JdW5zaWduZWQgaW50IGFjdGl2ZSAgOiAxOwotCXVuc2lnbmVkIGludCBoYW5kbGVkIDogMTsKLQl1bnNpZ25lZCBpbnQgaW5fbGlzdCA6IDE7Ci0KLQl2b2lkICgqY2IpKHZvaWQqKTsKLQl2b2lkICpkYXRhOwotfTsKLQotLyoqCi0gKiB0aW1lciBtYW5hZ2VtZW50Ci0gKi8KLXZvaWQgYnNjX2FkZF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpOwotdm9pZCBic2Nfc2NoZWR1bGVfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCBpbnQgc2Vjb25kcywgaW50IG1pY3Jvc2Vjb25kcyk7Ci12b2lkIGJzY19kZWxfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKLWludCBic2NfdGltZXJfcGVuZGluZyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpOwotCi0KLS8qKgotICogaW50ZXJuYWwgdGltZXIgbGlzdCBtYW5hZ2VtZW50Ci0gKi8KLXN0cnVjdCB0aW1ldmFsICpic2NfbmVhcmVzdF90aW1lcigpOwotdm9pZCBic2NfcHJlcGFyZV90aW1lcnMoKTsKLWludCBic2NfdXBkYXRlX3RpbWVycygpOwotaW50IGJzY190aW1lcl9jaGVjayh2b2lkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Rsdi5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90bHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczM2RiYy4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Rsdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLSNpZm5kZWYgX1RMVl9ICi0jZGVmaW5lIF9UTFZfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+Ci0KLS8qIFRlcm1pbm9sb2d5IC8gd29yZGluZwotCQl0YWcJbGVuZ3RoCQl2YWx1ZQkoaW4gYml0cykKLQotCSAgICBWCS0JLQkJOAotCSAgIExWCS0JOAkJTiAqIDgKLQkgIFRMVgk4CTgJCU4gKiA4Ci0JVEwxNlYJOAkxNgkJTiAqIDgKLQlUTFYxNgk4CTgJCU4gKiAxNgotCSBUdkxWCTgJOC8xNgkJTiAqIDgKLQotKi8KLQotI2RlZmluZSBMVl9HUk9TU19MRU4oeCkJCSh4KzEpCi0jZGVmaW5lIFRMVl9HUk9TU19MRU4oeCkJKHgrMikKLSNkZWZpbmUgVExWMTZfR1JPU1NfTEVOKHgpCSgoMip4KSsyKQotI2RlZmluZSBUTDE2Vl9HUk9TU19MRU4oeCkJKHgrMykKLSNkZWZpbmUgTDE2VFZfR1JPU1NfTEVOKHgpCSh4KzMpCi0KLSNkZWZpbmUgVFZMVl9NQVhfT05FQllURQkweDdmCi0KLXN0YXRpYyBpbmxpbmUgdWludDE2X3QgVFZMVl9HUk9TU19MRU4odWludDE2X3QgbGVuKQotewotCWlmIChsZW4gPD0gVFZMVl9NQVhfT05FQllURSkKLQkJcmV0dXJuIFRMVl9HUk9TU19MRU4obGVuKTsKLQllbHNlCi0JCXJldHVybiBUTDE2Vl9HUk9TU19MRU4obGVuKTsKLX0KLQotLyogVExWIGdlbmVyYXRpb24gKi8KLQotc3RhdGljIGlubGluZSB1aW50OF90ICpsdl9wdXQodWludDhfdCAqYnVmLCB1aW50OF90IGxlbiwKLQkJCQljb25zdCB1aW50OF90ICp2YWwpCi17Ci0JKmJ1ZisrID0gbGVuOwotCW1lbWNweShidWYsIHZhbCwgbGVuKTsKLQlyZXR1cm4gYnVmICsgbGVuOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQ4X3QgKnRsdl9wdXQodWludDhfdCAqYnVmLCB1aW50OF90IHRhZywgdWludDhfdCBsZW4sCi0JCQkJY29uc3QgdWludDhfdCAqdmFsKQotewotCSpidWYrKyA9IHRhZzsKLQkqYnVmKysgPSBsZW47Ci0JbWVtY3B5KGJ1ZiwgdmFsLCBsZW4pOwotCXJldHVybiBidWYgKyBsZW47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCAqdGx2MTZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB0YWcsIHVpbnQ4X3QgbGVuLAotCQkJCWNvbnN0IHVpbnQxNl90ICp2YWwpCi17Ci0JKmJ1ZisrID0gdGFnOwotCSpidWYrKyA9IGxlbjsKLQltZW1jcHkoYnVmLCB2YWwsIGxlbioyKTsKLQlyZXR1cm4gYnVmICsgbGVuKjI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCAqdGwxNnZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB0YWcsIHVpbnQxNl90IGxlbiwKLQkJCQljb25zdCB1aW50OF90ICp2YWwpCi17Ci0JKmJ1ZisrID0gdGFnOwotCSpidWYrKyA9IGxlbiA+PiA4OwotCSpidWYrKyA9IGxlbiAmIDB4ZmY7Ci0JbWVtY3B5KGJ1ZiwgdmFsLCBsZW4pOwotCXJldHVybiBidWYgKyBsZW4qMjsKLX0KLQotc3RhdGljIGlubGluZSB1aW50OF90ICp0dmx2X3B1dCh1aW50OF90ICpidWYsIHVpbnQ4X3QgdGFnLCB1aW50MTZfdCBsZW4sCi0JCQkJIGNvbnN0IHVpbnQ4X3QgKnZhbCkKLXsKLQl1aW50OF90ICpyZXQ7Ci0KLQlpZiAobGVuIDw9IFRWTFZfTUFYX09ORUJZVEUpIHsKLQkJcmV0ID0gdGx2X3B1dChidWYsIHRhZywgbGVuLCB2YWwpOwotCQlidWZbMV0gfD0gMHg4MDsKLQl9IGVsc2UKLQkJcmV0ID0gdGwxNnZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2JfdGx2MTZfcHV0KHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgdGFnLCB1aW50OF90IGxlbiwgY29uc3QgdWludDE2X3QgKnZhbCkKLXsKLQl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIFRMVjE2X0dST1NTX0xFTihsZW4pKTsKLQlyZXR1cm4gdGx2MTZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl90bDE2dl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IGxlbiwKLQkJCQkJY29uc3QgdWludDhfdCAqdmFsKQotewotCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHV0KG1zZywgVEwxNlZfR1JPU1NfTEVOKGxlbikpOwotCXJldHVybiB0bDE2dl9wdXQoYnVmLCB0YWcsIGxlbiwgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3R2bHZfcHV0KHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgdGFnLCB1aW50MTZfdCBsZW4sCi0JCQkJICAgICAgY29uc3QgdWludDhfdCAqdmFsKQotewotCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHV0KG1zZywgVFZMVl9HUk9TU19MRU4obGVuKSk7Ci0JcmV0dXJuIHR2bHZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl9sMTZ0dl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDE2X3QgbGVuLCB1aW50OF90IHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZhbCkKLXsKLQl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIEwxNlRWX0dST1NTX0xFTihsZW4pKTsKLQotCSpidWYrKyA9IGxlbiA+PiA4OwotCSpidWYrKyA9IGxlbiAmIDB4ZmY7Ci0JKmJ1ZisrID0gdGFnOwotCW1lbWNweShidWYsIHZhbCwgbGVuKTsKLQlyZXR1cm4gYnVmICsgbGVuOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQ4X3QgKnZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB2YWwpCi17Ci0JKmJ1ZisrID0gdmFsOwotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCAqdHZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB0YWcsIAotCQkJCXVpbnQ4X3QgdmFsKQotewotCSpidWYrKyA9IHRhZzsKLQkqYnVmKysgPSB2YWw7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotLyogJ3ZhbCcgaXMgc3RpbGwgaW4gaG9zdCBieXRlIG9yZGVyISAqLwotc3RhdGljIGlubGluZSB1aW50OF90ICp0djE2X3B1dCh1aW50OF90ICpidWYsIHVpbnQ4X3QgdGFnLCAKLQkJCQkgdWludDE2X3QgdmFsKQotewotCSpidWYrKyA9IHRhZzsKLQkqYnVmKysgPSB2YWwgPj4gODsKLQkqYnVmKysgPSB2YWwgJiAweGZmOwotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl9sdl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBsZW4sIGNvbnN0IHVpbnQ4X3QgKnZhbCkKLXsKLQl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIExWX0dST1NTX0xFTihsZW4pKTsKLQlyZXR1cm4gbHZfcHV0KGJ1ZiwgbGVuLCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2JfdGx2X3B1dChzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHRhZywgdWludDhfdCBsZW4sIGNvbnN0IHVpbnQ4X3QgKnZhbCkKLXsKLQl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIFRMVl9HUk9TU19MRU4obGVuKSk7Ci0JcmV0dXJuIHRsdl9wdXQoYnVmLCB0YWcsIGxlbiwgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3R2X3B1dChzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHRhZywgdWludDhfdCB2YWwpCi17Ci0JdWludDhfdCAqYnVmID0gbXNnYl9wdXQobXNnLCAyKTsKLQlyZXR1cm4gdHZfcHV0KGJ1ZiwgdGFnLCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2Jfdl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB2YWwpCi17Ci0JdWludDhfdCAqYnVmID0gbXNnYl9wdXQobXNnLCAxKTsKLQlyZXR1cm4gdl9wdXQoYnVmLCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2JfdHYxNl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IHZhbCkKLXsKLQl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIDMpOwotCXJldHVybiB0djE2X3B1dChidWYsIHRhZywgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3Rsdl9wdXNoKHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgdGFnLCB1aW50OF90IGxlbiwgY29uc3QgdWludDhfdCAqdmFsKQotewotCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHVzaChtc2csIFRMVl9HUk9TU19MRU4obGVuKSk7Ci0JcmV0dXJuIHRsdl9wdXQoYnVmLCB0YWcsIGxlbiwgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3R2X3B1c2goc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQ4X3QgdmFsKQotewotCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHVzaChtc2csIDIpOwotCXJldHVybiB0dl9wdXQoYnVmLCB0YWcsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl90djE2X3B1c2goc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IHZhbCkKLXsKLQl1aW50OF90ICpidWYgPSBtc2diX3B1c2gobXNnLCAzKTsKLQlyZXR1cm4gdHYxNl9wdXQoYnVmLCB0YWcsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl90dmx2X3B1c2goc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IGxlbiwKLQkJCQkgICAgICBjb25zdCB1aW50OF90ICp2YWwpCi17Ci0JdWludDhfdCAqYnVmID0gbXNnYl9wdXNoKG1zZywgVFZMVl9HUk9TU19MRU4obGVuKSk7Ci0JcmV0dXJuIHR2bHZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Ci19Ci0KLS8qIFRMViBwYXJzaW5nICovCi0KLXN0cnVjdCB0bHZfcF9lbnRyeSB7Ci0JdWludDE2X3QgbGVuOwotCWNvbnN0IHVpbnQ4X3QgKnZhbDsKLX07Ci0KLWVudW0gdGx2X3R5cGUgewotCVRMVl9UWVBFX05PTkUsCi0JVExWX1RZUEVfRklYRUQsCi0JVExWX1RZUEVfVCwKLQlUTFZfVFlQRV9UViwKLQlUTFZfVFlQRV9UTFYsCi0JVExWX1RZUEVfVEwxNlYsCi0JVExWX1RZUEVfVHZMViwKLX07Ci0KLXN0cnVjdCB0bHZfZGVmIHsKLQllbnVtIHRsdl90eXBlIHR5cGU7Ci0JdWludDhfdCBmaXhlZF9sZW47Ci19OwotCi1zdHJ1Y3QgdGx2X2RlZmluaXRpb24gewotCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKLX07Ci0KLXN0cnVjdCB0bHZfcGFyc2VkIHsKLQlzdHJ1Y3QgdGx2X3BfZW50cnkgbHZbMHhmZl07Ci19OwotCi1leHRlcm4gc3RydWN0IHRsdl9kZWZpbml0aW9uIHR2bHZfYXR0X2RlZjsKLQotaW50IHRsdl9wYXJzZV9vbmUodWludDhfdCAqb190YWcsIHVpbnQxNl90ICpvX2xlbiwgY29uc3QgdWludDhfdCAqKm9fdmFsLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpkZWYsCi0gICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfbGVuKTsKLWludCB0bHZfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKmRlYywgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpkZWYsCi0JICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX2xlbiwgdWludDhfdCBsdl90YWcsIHVpbnQ4X3QgbHZfdGFnMik7Ci0vKiB0YWtlIGEgbWFzdGVyIChzcmMpIHRsdmRldiBhbmQgZmlsbCB1cCBhbGwgZW1wdHkgc2xvdHMgaW4gJ2RzdCcgKi8KLXZvaWQgdGx2X2RlZl9wYXRjaChzdHJ1Y3QgdGx2X2RlZmluaXRpb24gKmRzdCwgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpzcmMpOwotCi0jZGVmaW5lIFRMVlBfUFJFU0VOVCh4LCB5KQkoKHgpLT5sdlt5XS52YWwpCi0jZGVmaW5lIFRMVlBfTEVOKHgsIHkpCQkoeCktPmx2W3ldLmxlbgotI2RlZmluZSBUTFZQX1ZBTCh4LCB5KQkJKHgpLT5sdlt5XS52YWwKLQotI2VuZGlmIC8qIF9UTFZfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS91dGlscy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS91dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2ZjAzLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgT1NNT0NPUkVfVVRJTF9ICi0jZGVmaW5lIE9TTU9DT1JFX1VUSUxfSAotCi0jZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLXN0cnVjdCB2YWx1ZV9zdHJpbmcgewotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQljb25zdCBjaGFyICpzdHI7Ci19OwotCi1jb25zdCBjaGFyICpnZXRfdmFsdWVfc3RyaW5nKGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgKnZzLCB1aW50MzJfdCB2YWwpOwotaW50IGdldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyAqdnMsIGNvbnN0IGNoYXIgKnN0cik7Ci0KLWNoYXIgYmNkMmNoYXIodWludDhfdCBiY2QpOwotLyogb25seSB3b3JrcyBmb3IgbnVtYmVycyBpbiBhc2NjaSAqLwotdWludDhfdCBjaGFyMmJjZChjaGFyIGMpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MDAwYy4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBHZW5lcmljIHdyaXRlIHF1ZXVlIGltcGxlbWVudGF0aW9uICovCi0vKgotICogKEMpIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKLSAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCi0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0jaWZuZGVmIHdyaXRlX3F1ZXVlX2gKLSNkZWZpbmUgd3JpdGVfcXVldWVfaAotCi0jaW5jbHVkZSAic2VsZWN0LmgiCi0jaW5jbHVkZSAibXNnYi5oIgotCi1zdHJ1Y3Qgd3JpdGVfcXVldWUgewotCXN0cnVjdCBic2NfZmQgYmZkOwotCXVuc2lnbmVkIGludCBtYXhfbGVuZ3RoOwotCXVuc2lnbmVkIGludCBjdXJyZW50X2xlbmd0aDsKLQotCXN0cnVjdCBsbGlzdF9oZWFkIG1zZ19xdWV1ZTsKLQotCWludCAoKnJlYWRfY2IpKHN0cnVjdCBic2NfZmQgKmZkKTsKLQlpbnQgKCp3cml0ZV9jYikoc3RydWN0IGJzY19mZCAqZmQsIHN0cnVjdCBtc2diICptc2cpOwotfTsKLQotdm9pZCB3cml0ZV9xdWV1ZV9pbml0KHN0cnVjdCB3cml0ZV9xdWV1ZSAqcXVldWUsIGludCBtYXhfbGVuZ3RoKTsKLWludCB3cml0ZV9xdWV1ZV9lbnF1ZXVlKHN0cnVjdCB3cml0ZV9xdWV1ZSAqcXVldWUsIHN0cnVjdCBtc2diICpkYXRhKTsKLWludCB3cml0ZV9xdWV1ZV9iZmRfY2Ioc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9saWJvc21vY29yZS5wYy5pbiBiL2xpYm9zbW9jb3JlL2xpYm9zbW9jb3JlLnBjLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzI5ODY5Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL2xpYm9zbW9jb3JlLnBjLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcHJlZml4PUBwcmVmaXhACi1leGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACi1saWJkaXI9QGxpYmRpckAKLWluY2x1ZGVkaXI9QGluY2x1ZGVkaXJACi0KLU5hbWU6IE9zbW9jb20gQ29yZSBMaWJyYXJ5Ci1EZXNjcmlwdGlvbjogQyBVdGlsaXR5IExpYnJhcnkKLVZlcnNpb246IEBWRVJTSU9OQAotTGliczogLUwke2xpYmRpcn0gLWxvc21vY29yZQotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vCi0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL200L0RVTU1ZIGIvbGlib3Ntb2NvcmUvbTQvRFVNTVkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTU1N2EuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvbTQvRFVNTVkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1EdW1tcGx5IHBsYWNlaG9sZGVyLgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvc3JjL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGVmZmEyLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL3NyYy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgVGhpcyBpcyBfTk9UXyB0aGUgbGlicmFyeSByZWxlYXNlIHZlcnNpb24sIGl0J3MgYW4gQVBJIHZlcnNpb24uCi0jIFBsZWFzZSByZWFkIENoYXB0ZXIgNiAiTGlicmFyeSBpbnRlcmZhY2UgdmVyc2lvbnMiIG9mIHRoZSBsaWJ0b29sIGRvY3VtZW50YXRpb24gYmVmb3JlIG1ha2luZyBhbnkgbW9kaWZpY2F0aW9uCi1MSUJWRVJTSU9OPTA6MDowCi0KLUlOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCi1BTV9DRkxBR1MgPSAtZlBJQyAtV2FsbAotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJvc21vY29yZS5sYQotCi1saWJvc21vY29yZV9sYV9TT1VSQ0VTID0gdGltZXIuYyBzZWxlY3QuYyBzaWduYWwuYyBtc2diLmMgcnhsZXZfc3RhdC5jIFwKLQkJCSB0bHZfcGFyc2VyLmMgYml0dmVjLmMgY29tcDEyOC5jIGdzbV91dGlscy5jIHN0YXRpc3RpY3MuYyBcCi0JCQkgd3JpdGVfcXVldWUuYyB1dGlscy5jIHJzbC5jIGdzbTQ4LmMgZ3NtNDhfaWUuYwotCi1pZiBFTkFCTEVfVEFMTE9DCi1saWJvc21vY29yZV9sYV9TT1VSQ0VTICs9IHRhbGxvYy5jCi1lbmRpZgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL2JpdHZlYy5jIGIvbGlib3Ntb2NvcmUvc3JjL2JpdHZlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjgzYWM2Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL3NyYy9iaXR2ZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKiBiaXQgdmVjdG9yIHV0aWxpdHkgcm91dGluZXMgKi8KLQotLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgotCi0jZGVmaW5lIEJJVE5VTV9GUk9NX0NPTVAoYnl0ZSwgYml0KQkoKGJ5dGUqOCkrYml0KQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBieXRlbnVtX2Zyb21fYml0bnVtKHVuc2lnbmVkIGludCBiaXRudW0pCi17Ci0JdW5zaWduZWQgaW50IGJ5dGVudW0gPSBiaXRudW0gLyA4OwotCi0JcmV0dXJuIGJ5dGVudW07Ci19Ci0KLS8qIGNvbnZlcnQgWkVSTy9PTkUvTC9IIHRvIGEgYml0bWFzayBhdCBnaXZlbiBwb3MgaW4gYSBieXRlICovCi1zdGF0aWMgdWludDhfdCBiaXR2YWwybWFzayhlbnVtIGJpdF92YWx1ZSBiaXQsIHVpbnQ4X3QgYml0bnVtKQotewotCWludCBiaXR2YWw7Ci0KLQlzd2l0Y2ggKGJpdCkgewotCWNhc2UgWkVSTzoKLQkJYml0dmFsID0gKDAgPDwgYml0bnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBPTkU6Ci0JCWJpdHZhbCA9ICgxIDw8IGJpdG51bSk7Ci0JCWJyZWFrOwotCWNhc2UgTDoKLQkJYml0dmFsID0gKCgweDJiIF4gKDAgPDwgYml0bnVtKSkgJiAoMSA8PCBiaXRudW0pKTsKLQkJYnJlYWs7Ci0JY2FzZSBIOgotCQliaXR2YWwgPSAoKDB4MmIgXiAoMSA8PCBiaXRudW0pKSAmICgxIDw8IGJpdG51bSkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIGJpdHZhbDsKLX0KLQotLyogY2hlY2sgaWYgdGhlIGJpdCBpcyAwIG9yIDEgZm9yIGEgZ2l2ZW4gcG9zaXRpb24gaW5zaWRlIGEgYml0dmVjICovCi1lbnVtIGJpdF92YWx1ZSBiaXR2ZWNfZ2V0X2JpdF9wb3MoY29uc3Qgc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCBiaXRucikKLXsKLQl1bnNpZ25lZCBpbnQgYnl0ZW51bSA9IGJ5dGVudW1fZnJvbV9iaXRudW0oYml0bnIpOwotCXVuc2lnbmVkIGludCBiaXRudW0gPSA3IC0gKGJpdG5yICUgOCk7Ci0JdWludDhfdCBiaXR2YWw7Ci0KLQlpZiAoYnl0ZW51bSA+PSBidi0+ZGF0YV9sZW4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYml0dmFsID0gYml0dmFsMm1hc2soT05FLCBiaXRudW0pOwotCi0JaWYgKGJ2LT5kYXRhW2J5dGVudW1dICYgYml0dmFsKQotCQlyZXR1cm4gT05FOwotCi0JcmV0dXJuIFpFUk87Ci19Ci0KLS8qIGdldCB0aGUgTnRoIHNldCBiaXQgaW5zaWRlIHRoZSBiaXQgdmVjdG9yICovCi11bnNpZ25lZCBpbnQgYml0dmVjX2dldF9udGhfc2V0X2JpdChjb25zdCBzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IG4pCi17Ci0JdW5zaWduZWQgaW50IGksIGsgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGJ2LT5kYXRhX2xlbio4OyBpKyspIHsKLQkJaWYgKGJpdHZlY19nZXRfYml0X3BvcyhidiwgaSkgPT0gT05FKSB7Ci0JCQlrKys7Ci0JCQlpZiAoayA9PSBuKQotCQkJCXJldHVybiBpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHNldCB0aGUgYml0IGF0IGEgZ2l2ZW4gcG9zaXRpb24gaW5zaWRlIGEgYml0dmVjICovCi1pbnQgYml0dmVjX3NldF9iaXRfcG9zKHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgYml0bnIsCi0JCQllbnVtIGJpdF92YWx1ZSBiaXQpCi17Ci0JdW5zaWduZWQgaW50IGJ5dGVudW0gPSBieXRlbnVtX2Zyb21fYml0bnVtKGJpdG5yKTsKLQl1bnNpZ25lZCBpbnQgYml0bnVtID0gNyAtIChiaXRuciAlIDgpOwotCXVpbnQ4X3QgYml0dmFsOwotCi0JaWYgKGJ5dGVudW0gPj0gYnYtPmRhdGFfbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIGZpcnN0IGNsZWFyIHRoZSBiaXQgKi8KLQliaXR2YWwgPSBiaXR2YWwybWFzayhPTkUsIGJpdG51bSk7Ci0JYnYtPmRhdGFbYnl0ZW51bV0gJj0gfmJpdHZhbDsKLQotCS8qIHRoZW4gc2V0IGl0IHRvIGRlc2lyZWQgdmFsdWUgKi8KLQliaXR2YWwgPSBiaXR2YWwybWFzayhiaXQsIGJpdG51bSk7Ci0JYnYtPmRhdGFbYnl0ZW51bV0gfD0gYml0dmFsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHNldCB0aGUgbmV4dCBiaXQgaW5zaWRlIGEgYml0dmVjICovCi1pbnQgYml0dmVjX3NldF9iaXQoc3RydWN0IGJpdHZlYyAqYnYsIGVudW0gYml0X3ZhbHVlIGJpdCkKLXsKLQlpbnQgcmM7Ci0KLQlyYyA9IGJpdHZlY19zZXRfYml0X3BvcyhidiwgYnYtPmN1cl9iaXQsIGJpdCk7Ci0JaWYgKCFyYykKLQkJYnYtPmN1cl9iaXQrKzsKLQotCXJldHVybiByYzsKLX0KLQotLyogc2V0IG11bHRpcGxlIGJpdHMgKGJhc2VkIG9uIGFycmF5IG9mIGJpdHZhbHMpIGF0IGN1cnJlbnQgcG9zICovCi1pbnQgYml0dmVjX3NldF9iaXRzKHN0cnVjdCBiaXR2ZWMgKmJ2LCBlbnVtIGJpdF92YWx1ZSAqYml0cywgaW50IGNvdW50KQotewotCWludCBpLCByYzsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXJjID0gYml0dmVjX3NldF9iaXQoYnYsIGJpdHNbaV0pOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHNldCBtdWx0aXBsZSBiaXRzIChiYXNlZCBvbiBudW1lcmljIHZhbHVlKSBhdCBjdXJyZW50IHBvcyAqLwotaW50IGJpdHZlY19zZXRfdWludChzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IHVpLCBpbnQgbnVtX2JpdHMpCi17Ci0JaW50IGksIHJjOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9iaXRzOyBpKyspIHsKLQkJaW50IGJpdCA9IDA7Ci0JCWlmICh1aSAmICgxIDw8IChudW1fYml0cyAtIGkgLSAxKSkpCi0JCQliaXQgPSAxOwotCQlyYyA9IGJpdHZlY19zZXRfYml0KGJ2LCBiaXQpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHBhZCBhbGwgcmVtYWluaW5nIGJpdHMgdXAgdG8gbnVtX2JpdHMgKi8KLWludCBiaXR2ZWNfc3BhcmVfcGFkZGluZyhzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IHVwX3RvX2JpdCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IGJ2LT5jdXJfYml0OyBpIDw9IHVwX3RvX2JpdDsgaSsrKQotCQliaXR2ZWNfc2V0X2JpdChidiwgTCk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9jb21wMTI4LmMgYi9saWJvc21vY29yZS9zcmMvY29tcDEyOC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDU2ODBjLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL3NyYy9jb21wMTI4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIENPTVAxMjggaW1wbGVtZW50YXRpb24KLSAqCi0gKgotICogVGhpcyBjb2RlIGlzIGluc3BpcmVkIGJ5IG9yaWdpbmFsIGNvZGUgZnJvbSA6Ci0gKiAgTWFyYyBCcmljZW5vIDxtYXJjQHNjYXJkLm9yZz4sIElhbiBHb2xkYmVyZyA8aWFuZ0Bjcy5iZXJrZWxleS5lZHU+LAotICogIGFuZCBEYXZpZCBXYWduZXIgPGRhd0Bjcy5iZXJrZWxleS5lZHU+Ci0gKgotICogQnV0IGl0IGhhcyBiZWVuIGZ1bGx5IHJld3JpdHRlbiBmcm9tIHZhcmlvdXMgUERGcyBmb3VuZCBvbmxpbmUgZGVzY3JpYmluZwotICogdGhlIGFsZ29yaXRobSBiZWNhdXNlIHRoZSBsaWNlbmNlIG9mIHRoZSBjb2RlIHJlZmVyZW5jZWQgYWJvdmUgd2FzIHVuY2xlYXIuCi0gKiBBIGNvbW1lbnQgc25pcHBldCBmcm9tIHRoZSBvcmlnaW5hbCBjb2RlIGlzIGluY2x1ZGVkIGJlbG93LCBpdCBkZXNjcmliZXMKLSAqIHdoZXJlIHRoZSBkb2MgY2FtZSBmcm9tIGFuZCBob3cgdGhlIGFsZ29yaXRobSB3YXMgcmV2ZXJzZSBlbmdpbmVlcmVkLgotICoKLSAqCi0gKiAoQykgMjAwOSBieSBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+Ci0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLS8qCi0gKiAtLS0gU05JUCAtLS0KLSAqCi0gKiBUaGlzIGNvZGUgZGVyaXZlZCBmcm9tIGEgbGVha2VkIGRvY3VtZW50IGZyb20gdGhlIEdTTSBzdGFuZGFyZHMuCi0gKiBTb21lIG1pc3NpbmcgcGllY2VzIHdlcmUgZmlsbGVkIGluIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgYSB3b3JraW5nIFNJTS4KLSAqIFdlIGhhdmUgdmVyaWZpZWQgdGhhdCB0aGlzIGlzIHRoZSBjb3JyZWN0IENPTVAxMjggYWxnb3JpdGhtLgotICoKLSAqIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBkb2N1bWVudCBpZGVudGlmaWVzIGl0IGFzCi0gKiAJX1RlY2huaWNhbCBJbmZvcm1hdGlvbjogR1NNIFN5c3RlbSBTZWN1cml0eSBTdHVkeV8uCi0gKiAJMTAtMTYxNy0wMSwgMTB0aCBKdW5lIDE5ODguCi0gKiBUaGUgYm90dG9tIG9mIHRoZSB0aXRsZSBwYWdlIGlzIG1hcmtlZAotICogCVJhY2FsIFJlc2VhcmNoIEx0ZC4KLSAqIAlXb3J0b24gRHJpdmUsIFdvcnRvbiBHcmFuZ2UgSW5kdXN0cmlhbCBFc3RhdGUsCi0gKiAJUmVhZGluZywgQmVya3MuIFJHMiAwU0IsIEVuZ2xhbmQuCi0gKiAJVGVsZXBob25lOiBSZWFkaW5nICgwNzM0KSA4Njg2MDEgICBUZWxleDogODQ3MTUyCi0gKiBUaGUgcmVsZXZhbnQgYml0cyBhcmUgaW4gUGFydCBJLCBTZWN0aW9uIDIwIChwYWdlcyA2Ni0tNjcpLiAgRW5qb3khCi0gKgotICogTm90ZTogVGhlcmUgYXJlIHRocmVlIHR5cG9zIGluIHRoZSBzcGVjIChkaXNjb3ZlcmVkIGJ5Ci0gKiByZXZlcnNlLWVuZ2luZWVyaW5nKS4KLSAqIEZpcnN0LCAieiA9ICgyICogeFtuXSArIHhbbl0pIG1vZCAyXig5LWopIiBzaG91bGQgY2xlYXJseSByZWFkCi0gKiAieiA9ICgyICogeFttXSArIHhbbl0pIG1vZCAyXig5LWopIi4KLSAqIFNlY29uZCwgdGhlICJrIiBsb29wIGluIHRoZSAiRm9ybSBiaXRzIGZyb20gYnl0ZXMiIHNlY3Rpb24gaXMgc2V2ZXJlbHkKLSAqIGJvdGNoZWQ6IHRoZSBrIGluZGV4IHNob3VsZCBydW4gb25seSBmcm9tIDAgdG8gMywgYW5kIGNsZWFybHkgdGhlIHJhbmdlCi0gKiBvbiAidGhlICg4LWspdGggYml0IG9mIGJ5dGUgaiIgaXMgYWxzbyBvZmYgKHNob3VsZCBiZSAwLi43LCBub3QgMS4uOCwKLSAqIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3Vic2VxdWVudCBzZWN0aW9uKS4KLSAqIFRoaXJkLCBTUkVTIGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IDggbmliYmxlcyBvZiB4W10sIG5vdCB0aGUgbGFzdCA4IGFzCi0gKiBjbGFpbWVkIGluIHRoZSBkb2N1bWVudC4gIChBbmQgdGhlIGRvY3VtZW50IGRvZXNuJ3Qgc3BlY2lmeSBob3cgS2MgaXMKLSAqIGRlcml2ZWQsIGJ1dCB0aGF0IHdhcyBhbHNvIGVhc2lseSBkaXNjb3ZlcmVkIHdpdGggcmV2ZXJzZSBlbmdpbmVlcmluZy4pCi0gKiBBbGwgb2YgdGhlc2UgdHlwb3MgaGF2ZSBiZWVuIGNvcnJlY3RlZCBpbiB0aGUgZm9sbG93aW5nIGNvZGUuCi0gKgotICogLS0tIC9TTklQIC0tLQotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotLyogVGhlIGNvbXByZXNzaW9uIHRhYmxlcyAoanVzdCBjb3BpZWQgLi4uKSAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFibGVfMFs1MTJdID0gewotIDEwMiwgMTc3LCAxODYsIDE2MiwgICAyLCAxNTYsIDExMiwgIDc1LCAgNTUsICAyNSwgICA4LCAgMTIsIDI1MSwgMTkzLCAyNDYsIDE4OCwKLSAxMDksIDIxMywgMTUxLCAgNTMsICA0MiwgIDc5LCAxOTEsIDExNSwgMjMzLCAyNDIsIDE2NCwgMjIzLCAyMDksIDE0OCwgMTA4LCAxNjEsCi0gMjUyLCAgMzcsIDI0NCwgIDQ3LCAgNjQsIDIxMSwgICA2LCAyMzcsIDE4NSwgMTYwLCAxMzksIDExMywgIDc2LCAxMzgsICA1OSwgIDcwLAotICA2NywgIDI2LCAgMTMsIDE1NywgIDYzLCAxNzksIDIyMSwgIDMwLCAyMTQsICAzNiwgMTY2LCAgNjksIDE1MiwgMTI0LCAyMDcsIDExNiwKLSAyNDcsIDE5NCwgIDQxLCAgODQsICA3MSwgICAxLCAgNDksICAxNCwgIDk1LCAgMzUsIDE2OSwgIDIxLCAgOTYsICA3OCwgMjE1LCAyMjUsCi0gMTgyLCAyNDMsICAyOCwgIDkyLCAyMDEsIDExOCwgICA0LCAgNzQsIDI0OCwgMTI4LCAgMTcsICAxMSwgMTQ2LCAxMzIsIDI0NSwgIDQ4LAotIDE0OSwgIDkwLCAxMjAsICAzOSwgIDg3LCAyMzAsIDEwNiwgMjMyLCAxNzUsICAxOSwgMTI2LCAxOTAsIDIwMiwgMTQxLCAxMzcsIDE3NiwKLSAyNTAsICAyNywgMTAxLCAgNDAsIDIxOSwgMjI3LCAgNTgsICAyMCwgIDUxLCAxNzgsICA5OCwgMjE2LCAxNDAsICAyMiwgIDMyLCAxMjEsCi0gIDYxLCAxMDMsIDIwMywgIDcyLCAgMjksIDExMCwgIDg1LCAyMTIsIDE4MCwgMjA0LCAxNTAsIDE4MywgIDE1LCAgNjYsIDE3MiwgMTk2LAotICA1NiwgMTk3LCAxNTgsICAgMCwgMTAwLCAgNDUsIDE1MywgICA3LCAxNDQsIDIyMiwgMTYzLCAxNjcsICA2MCwgMTM1LCAyMTAsIDIzMSwKLSAxNzQsIDE2NSwgIDM4LCAyNDksIDIyNCwgIDM0LCAyMjAsIDIyOSwgMjE3LCAyMDgsIDI0MSwgIDY4LCAyMDYsIDE4OSwgMTI1LCAyNTUsCi0gMjM5LCAgNTQsIDE2OCwgIDg5LCAxMjMsIDEyMiwgIDczLCAxNDUsIDExNywgMjM0LCAxNDMsICA5OSwgMTI5LCAyMDAsIDE5MiwgIDgyLAotIDEwNCwgMTcwLCAxMzYsIDIzNSwgIDkzLCAgODEsIDIwNSwgMTczLCAyMzYsICA5NCwgMTA1LCAgNTIsICA0NiwgMjI4LCAxOTgsICAgNSwKLSAgNTcsIDI1NCwgIDk3LCAxNTUsIDE0MiwgMTMzLCAxOTksIDE3MSwgMTg3LCAgNTAsICA2NSwgMTgxLCAxMjcsIDEwNywgMTQ3LCAyMjYsCi0gMTg0LCAyMTgsIDEzMSwgIDMzLCAgNzcsICA4NiwgIDMxLCAgNDQsICA4OCwgIDYyLCAyMzgsICAxOCwgIDI0LCAgNDMsIDE1NCwgIDIzLAotICA4MCwgMTU5LCAxMzQsIDExMSwgICA5LCAxMTQsICAgMywgIDkxLCAgMTYsIDEzMCwgIDgzLCAgMTAsIDE5NSwgMjQwLCAyNTMsIDExOSwKLSAxNzcsIDEwMiwgMTYyLCAxODYsIDE1NiwgICAyLCAgNzUsIDExMiwgIDI1LCAgNTUsICAxMiwgICA4LCAxOTMsIDI1MSwgMTg4LCAyNDYsCi0gMjEzLCAxMDksICA1MywgMTUxLCAgNzksICA0MiwgMTE1LCAxOTEsIDI0MiwgMjMzLCAyMjMsIDE2NCwgMTQ4LCAyMDksIDE2MSwgMTA4LAotICAzNywgMjUyLCAgNDcsIDI0NCwgMjExLCAgNjQsIDIzNywgICA2LCAxNjAsIDE4NSwgMTEzLCAxMzksIDEzOCwgIDc2LCAgNzAsICA1OSwKLSAgMjYsICA2NywgMTU3LCAgMTMsIDE3OSwgIDYzLCAgMzAsIDIyMSwgIDM2LCAyMTQsICA2OSwgMTY2LCAxMjQsIDE1MiwgMTE2LCAyMDcsCi0gMTk0LCAyNDcsICA4NCwgIDQxLCAgIDEsICA3MSwgIDE0LCAgNDksICAzNSwgIDk1LCAgMjEsIDE2OSwgIDc4LCAgOTYsIDIyNSwgMjE1LAotIDI0MywgMTgyLCAgOTIsICAyOCwgMTE4LCAyMDEsICA3NCwgICA0LCAxMjgsIDI0OCwgIDExLCAgMTcsIDEzMiwgMTQ2LCAgNDgsIDI0NSwKLSAgOTAsIDE0OSwgIDM5LCAxMjAsIDIzMCwgIDg3LCAyMzIsIDEwNiwgIDE5LCAxNzUsIDE5MCwgMTI2LCAxNDEsIDIwMiwgMTc2LCAxMzcsCi0gIDI3LCAyNTAsICA0MCwgMTAxLCAyMjcsIDIxOSwgIDIwLCAgNTgsIDE3OCwgIDUxLCAyMTYsICA5OCwgIDIyLCAxNDAsIDEyMSwgIDMyLAotIDEwMywgIDYxLCAgNzIsIDIwMywgMTEwLCAgMjksIDIxMiwgIDg1LCAyMDQsIDE4MCwgMTgzLCAxNTAsICA2NiwgIDE1LCAxOTYsIDE3MiwKLSAxOTcsICA1NiwgICAwLCAxNTgsICA0NSwgMTAwLCAgIDcsIDE1MywgMjIyLCAxNDQsIDE2NywgMTYzLCAxMzUsICA2MCwgMjMxLCAyMTAsCi0gMTY1LCAxNzQsIDI0OSwgIDM4LCAgMzQsIDIyNCwgMjI5LCAyMjAsIDIwOCwgMjE3LCAgNjgsIDI0MSwgMTg5LCAyMDYsIDI1NSwgMTI1LAotICA1NCwgMjM5LCAgODksIDE2OCwgMTIyLCAxMjMsIDE0NSwgIDczLCAyMzQsIDExNywgIDk5LCAxNDMsIDIwMCwgMTI5LCAgODIsIDE5MiwKLSAxNzAsIDEwNCwgMjM1LCAxMzYsICA4MSwgIDkzLCAxNzMsIDIwNSwgIDk0LCAyMzYsICA1MiwgMTA1LCAyMjgsICA0NiwgICA1LCAxOTgsCi0gMjU0LCAgNTcsIDE1NSwgIDk3LCAxMzMsIDE0MiwgMTcxLCAxOTksICA1MCwgMTg3LCAxODEsICA2NSwgMTA3LCAxMjcsIDIyNiwgMTQ3LAotIDIxOCwgMTg0LCAgMzMsIDEzMSwgIDg2LCAgNzcsICA0NCwgIDMxLCAgNjIsICA4OCwgIDE4LCAyMzgsICA0MywgIDI0LCAgMjMsIDE1NCwKLSAxNTksICA4MCwgMTExLCAxMzQsIDExNCwgICA5LCAgOTEsICAgMywgMTMwLCAgMTYsICAxMCwgIDgzLCAyNDAsIDE5NSwgMTE5LCAyNTMsCi19LCB0YWJsZV8xWzI1Nl0gPSB7Ci0gIDE5LCAgMTEsICA4MCwgMTE0LCAgNDMsICAgMSwgIDY5LCAgOTQsICAzOSwgIDE4LCAxMjcsIDExNywgIDk3LCAgIDMsICA4NSwgIDQzLAotICAyNywgMTI0LCAgNzAsICA4MywgIDQ3LCAgNzEsICA2MywgIDEwLCAgNDcsICA4OSwgIDc5LCAgIDQsICAxNCwgIDU5LCAgMTEsICAgNSwKLSAgMzUsIDEwNywgMTAzLCAgNjgsICAyMSwgIDg2LCAgMzYsICA5MSwgIDg1LCAxMjYsICAzMiwgIDUwLCAxMDksICA5NCwgMTIwLCAgIDYsCi0gIDUzLCAgNzksICAyOCwgIDQ1LCAgOTksICA5NSwgIDQxLCAgMzQsICA4OCwgIDY4LCAgOTMsICA1NSwgMTEwLCAxMjUsIDEwNSwgIDIwLAotICA5MCwgIDgwLCAgNzYsICA5NiwgIDIzLCAgNjAsICA4OSwgIDY0LCAxMjEsICA1NiwgIDE0LCAgNzQsIDEwMSwgICA4LCAgMTksICA3OCwKLSAgNzYsICA2NiwgMTA0LCAgNDYsIDExMSwgIDUwLCAgMzIsICAgMywgIDM5LCAgIDAsICA1OCwgIDI1LCAgOTIsICAyMiwgIDE4LCAgNTEsCi0gIDU3LCAgNjUsIDExOSwgMTE2LCAgMjIsIDEwOSwgICA3LCAgODYsICA1OSwgIDkzLCAgNjIsIDExMCwgIDc4LCAgOTksICA3NywgIDY3LAotICAxMiwgMTEzLCAgODcsICA5OCwgMTAyLCAgIDUsICA4OCwgIDMzLCAgMzgsICA1NiwgIDIzLCAgIDgsICA3NSwgIDQ1LCAgMTMsICA3NSwKLSAgOTUsICA2MywgIDI4LCAgNDksIDEyMywgMTIwLCAgMjAsIDExMiwgIDQ0LCAgMzAsICAxNSwgIDk4LCAxMDYsICAgMiwgMTAzLCAgMjksCi0gIDgyLCAxMDcsICA0MiwgMTI0LCAgMjQsICAzMCwgIDQxLCAgMTYsIDEwOCwgMTAwLCAxMTcsICA0MCwgIDczLCAgNDAsICAgNywgMTE0LAotICA4MiwgMTE1LCAgMzYsIDExMiwgIDEyLCAxMDIsIDEwMCwgIDg0LCAgOTIsICA0OCwgIDcyLCAgOTcsICAgOSwgIDU0LCAgNTUsICA3NCwKLSAxMTMsIDEyMywgIDE3LCAgMjYsICA1MywgIDU4LCAgIDQsICAgOSwgIDY5LCAxMjIsICAyMSwgMTE4LCAgNDIsICA2MCwgIDI3LCAgNzMsCi0gMTE4LCAxMjUsICAzNCwgIDE1LCAgNjUsIDExNSwgIDg0LCAgNjQsICA2MiwgIDgxLCAgNzAsICAgMSwgIDI0LCAxMTEsIDEyMSwgIDgzLAotIDEwNCwgIDgxLCAgNDksIDEyNywgIDQ4LCAxMDUsICAzMSwgIDEwLCAgIDYsICA5MSwgIDg3LCAgMzcsICAxNiwgIDU0LCAxMTYsIDEyNiwKLSAgMzEsICAzOCwgIDEzLCAgIDAsICA3MiwgMTA2LCAgNzcsICA2MSwgIDI2LCAgNjcsICA0NiwgIDI5LCAgOTYsICAzNywgIDYxLCAgNTIsCi0gMTAxLCAgMTcsICA0NCwgMTA4LCAgNzEsICA1MiwgIDY2LCAgNTcsICAzMywgIDUxLCAgMjUsICA5MCwgICAyLCAxMTksIDEyMiwgIDM1LAotfSwgdGFibGVfMlsxMjhdID0gewotIDUyLCAgNTAsICA0NCwgICA2LCAgMjEsICA0OSwgIDQxLCAgNTksICAzOSwgIDUxLCAgMjUsICAzMiwgIDUxLCAgNDcsICA1MiwgIDQzLAotIDM3LCAgIDQsICA0MCwgIDM0LCAgNjEsICAxMiwgIDI4LCAgIDQsICA1OCwgIDIzLCAgIDgsICAxNSwgIDEyLCAgMjIsICAgOSwgIDE4LAotIDU1LCAgMTAsICAzMywgIDM1LCAgNTAsICAgMSwgIDQzLCAgIDMsICA1NywgIDEzLCAgNjIsICAxNCwgICA3LCAgNDIsICA0NCwgIDU5LAotIDYyLCAgNTcsICAyNywgICA2LCAgIDgsICAzMSwgIDI2LCAgNTQsICA0MSwgIDIyLCAgNDUsICAyMCwgIDM5LCAgIDMsICAxNiwgIDU2LAotIDQ4LCAgIDIsICAyMSwgIDI4LCAgMzYsICA0MiwgIDYwLCAgMzMsICAzNCwgIDE4LCAgIDAsICAxMSwgIDI0LCAgMTAsICAxNywgIDYxLAotIDI5LCAgMTQsICA0NSwgIDI2LCAgNTUsICA0NiwgIDExLCAgMTcsICA1NCwgIDQ2LCAgIDksICAyNCwgIDMwLCAgNjAsICAzMiwgICAwLAotIDIwLCAgMzgsICAgMiwgIDMwLCAgNTgsICAzNSwgICAxLCAgMTYsICA1NiwgIDQwLCAgMjMsICA0OCwgIDEzLCAgMTksICAxOSwgIDI3LAotIDMxLCAgNTMsICA0NywgIDM4LCAgNjMsICAxNSwgIDQ5LCAgIDUsICAzNywgIDUzLCAgMjUsICAzNiwgIDYzLCAgMjksICAgNSwgICA3LAotfSwgdGFibGVfM1s2NF0gPSB7Ci0gIDEsICAgNSwgIDI5LCAgIDYsICAyNSwgICAxLCAgMTgsICAyMywgIDE3LCAgMTksICAgMCwgICA5LCAgMjQsICAyNSwgICA2LCAgMzEsCi0gMjgsICAyMCwgIDI0LCAgMzAsICAgNCwgIDI3LCAgIDMsICAxMywgIDE1LCAgMTYsICAxNCwgIDE4LCAgIDQsICAgMywgICA4LCAgIDksCi0gMjAsICAgMCwgIDEyLCAgMjYsICAyMSwgICA4LCAgMjgsICAgMiwgIDI5LCAgIDIsICAxNSwgICA3LCAgMTEsICAyMiwgIDE0LCAgMTAsCi0gMTcsICAyMSwgIDEyLCAgMzAsICAyNiwgIDI3LCAgMTYsICAzMSwgIDExLCAgIDcsICAxMywgIDIzLCAgMTAsICAgNSwgIDIyLCAgMTksCi19LCB0YWJsZV80WzMyXSA9IHsKLSAxNSwgIDEyLCAgMTAsICAgNCwgICAxLCAgMTQsICAxMSwgICA3LCAgIDUsICAgMCwgIDE0LCAgIDcsICAgMSwgICAyLCAgMTMsICAgOCwKLSAxMCwgICAzLCAgIDQsICAgOSwgICA2LCAgIDAsICAgMywgICAyLCAgIDUsICAgNiwgICA4LCAgIDksICAxMSwgIDEzLCAgMTUsICAxMiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90ICpfY29tcDEyOF90YWJsZVs1XSA9IHsgdGFibGVfMCwgdGFibGVfMSwgdGFibGVfMiwgdGFibGVfMywgdGFibGVfNCB9OwotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX2NvbXAxMjhfY29tcHJlc3Npb25fcm91bmQodWludDhfdCAqeCwgaW50IG4sIGNvbnN0IHVpbnQ4X3QgKnRibCkKLXsKLQlpbnQgaSwgaiwgbSwgYSwgYiwgeSwgejsKLQltID0gNCAtIG47Ci0JZm9yIChpPTA7IGk8KDE8PG4pOyBpKyspCi0JCWZvciAoaj0wOyBqPCgxPDxtKTsgaisrKSB7Ci0JCQlhID0gaiArIGkgKiAoMjw8bSk7Ci0JCQliID0gYSArICgxPDxtKTsKLQkJCXkgPSAoeFthXSArICh4W2JdPDwxKSkgJiAoKDMyPDxtKS0xKTsKLQkJCXogPSAoKHhbYV08PDEpICsgeFtiXSkgJiAoKDMyPDxtKS0xKTsKLQkJCXhbYV0gPSB0YmxbeV07Ci0JCQl4W2JdID0gdGJsW3pdOwotCQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX2NvbXAxMjhfY29tcHJlc3Npb24odWludDhfdCAqeCkKLXsKLQlpbnQgbjsKLQlmb3IgKG49MDsgbjw1OyBuKyspCi0JCV9jb21wMTI4X2NvbXByZXNzaW9uX3JvdW5kKHgsIG4sIF9jb21wMTI4X3RhYmxlW25dKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1fY29tcDEyOF9iaXRzZnJvbWJ5dGVzKHVpbnQ4X3QgKngsIHVpbnQ4X3QgKmJpdHMpCi17Ci0JaW50IGk7Ci0JbWVtc2V0KGJpdHMsIDB4MDAsIDEyOCk7Ci0JZm9yIChpPTA7IGk8MTI4OyBpKyspCi0JCWlmICh4W2k+PjJdICYgKDE8PCgzLShpJjMpKSkpCi0JCQliaXRzW2ldID0gMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1fY29tcDEyOF9wZXJtdXRhdGlvbih1aW50OF90ICp4LCB1aW50OF90ICpiaXRzKQotewotCWludCBpOwotCW1lbXNldCgmeFsxNl0sIDB4MDAsIDE2KTsKLQlmb3IgKGk9MDsgaTwxMjg7IGkrKykKLQkJeFsoaT4+MykrMTZdIHw9IGJpdHNbKGkqMTcpICYgMTI3XSA8PCAoNy0oaSY3KSk7Ci19Ci0KLXZvaWQKLWNvbXAxMjgodWludDhfdCAqa2ksIHVpbnQ4X3QgKnJhbmQsIHVpbnQ4X3QgKnNyZXMsIHVpbnQ4X3QgKmtjKQotewotCWludCBpOwotCXVpbnQ4X3QgeFszMl0sIGJpdHNbMTI4XTsKLQotCS8qIHhbMTYtMzFdID0gUkFORCAqLwotCW1lbWNweSgmeFsxNl0sIHJhbmQsIDE2KTsKLQotCS8qIFJvdW5kIDEtNyAqLwotCWZvciAoaT0wOyBpPDc7IGkrKykgewotCQkvKiB4WzAtMTVdID0gS2kgKi8KLQkJbWVtY3B5KHgsIGtpLCAxNik7Ci0KLQkJLyogQ29tcHJlc3Npb24gKi8KLQkJX2NvbXAxMjhfY29tcHJlc3Npb24oeCk7Ci0KLQkJLyogRm9ybUJpdEZyb21CeXRlcyAqLwotCQlfY29tcDEyOF9iaXRzZnJvbWJ5dGVzKHgsIGJpdHMpOwotCi0JCS8qIFBlcm11dGF0aW9uICovCi0JCV9jb21wMTI4X3Blcm11dGF0aW9uKHgsIGJpdHMpOwotCX0KLQotCS8qIFJvdW5kIDggKGZpbmFsKSAqLwotCQkvKiB4WzAtMTVdID0gS2kgKi8KLQltZW1jcHkoeCwga2ksIDE2KTsKLQotCQkvKiBDb21wcmVzc2lvbiAqLwotCV9jb21wMTI4X2NvbXByZXNzaW9uKHgpOwotCi0JLyogT3V0cHV0IHN0YWdlICovCi0JZm9yIChpPTA7IGk8ODsgaSs9MikKLQkJc3Jlc1tpPj4xXSA9IHhbaV08PDQgfCB4W2krMV07Ci0KLQlmb3IgKGk9MDsgaTwxMjsgaSs9MikKLQkJa2NbaT4+MV0gPSAoeFtpICsgMThdIDw8IDYpIHwKLQkJICAgICAgICAgICAoeFtpICsgMTldIDw8IDIpIHwKLQkJICAgICAgICAgICAoeFtpICsgMjBdID4+IDIpOwotCi0Ja2NbNl0gPSAoeFszMF08PDYpIHwgKHhbMzFdPDwyKTsKLQlrY1s3XSA9IDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9nc200OC5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjFjNjcuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcwotICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLwotCi0vKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+Ci0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLSNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgotI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgotI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4Lmg+Ci0KLSNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaD4KLQotY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIGdzbTQ4X2F0dF90bHZkZWYgPSB7Ci0JLmRlZiA9IHsKLQkJW0dTTTQ4X0lFX01PQklMRV9JRF0JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbR1NNNDhfSUVfTkFNRV9MT05HXQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtHU000OF9JRV9OQU1FX1NIT1JUXQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtHU000OF9JRV9VVENdCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW0dTTTQ4X0lFX05FVF9USU1FX1RaXQk9IHsgVExWX1RZUEVfRklYRUQsIDcgfSwKLQkJW0dTTTQ4X0lFX0xTQV9JREVOVF0JPSB7IFRMVl9UWVBFX1RMViB9LAotCi0JCVtHU000OF9JRV9CRUFSRVJfQ0FQXQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtHU000OF9JRV9DQVVTRV0JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbR1NNNDhfSUVfQ0NfQ0FQXQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtHU000OF9JRV9BTEVSVF0JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbR1NNNDhfSUVfRkFDSUxJVFldCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW0dTTTQ4X0lFX1BST0dSX0lORF0JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbR1NNNDhfSUVfQVVYX1NUQVRVU10JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbR1NNNDhfSUVfTk9USUZZXQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW0dTTTQ4X0lFX0tQRF9GQUNJTElUWV0JPSB7IFRMVl9UWVBFX1RWIH0sCi0JCVtHU000OF9JRV9TSUdOQUxdCT0geyBUTFZfVFlQRV9UViB9LAotCQlbR1NNNDhfSUVfQ09OTl9CQ0RdCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW0dTTTQ4X0lFX0NPTk5fU1VCXQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtHU000OF9JRV9DQUxMSU5HX0JDRF0JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbR1NNNDhfSUVfQ0FMTElOR19TVUJdCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW0dTTTQ4X0lFX0NBTExFRF9CQ0RdCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW0dTTTQ4X0lFX0NBTExFRF9TVUJdCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW0dTTTQ4X0lFX1JFRElSX0JDRF0JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbR1NNNDhfSUVfUkVESVJfU1VCXQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtHU000OF9JRV9MT1dMX0NPTVBBVF0JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbR1NNNDhfSUVfSElHSExfQ09NUEFUXQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtHU000OF9JRV9VU0VSX1VTRVJdCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW0dTTTQ4X0lFX1NTX1ZFUlNdCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW0dTTTQ4X0lFX01PUkVfREFUQV0JPSB7IFRMVl9UWVBFX1QgfSwKLQkJW0dTTTQ4X0lFX0NMSVJfU1VQUF0JPSB7IFRMVl9UWVBFX1QgfSwKLQkJW0dTTTQ4X0lFX0NMSVJfSU5WT0NdCT0geyBUTFZfVFlQRV9UIH0sCi0JCVtHU000OF9JRV9SRVZfQ19TRVRVUF0JPSB7IFRMVl9UWVBFX1QgfSwKLQkJW0dTTTQ4X0lFX1JFUEVBVF9DSVJdICAgPSB7IFRMVl9UWVBFX1QgfSwKLQkJW0dTTTQ4X0lFX1JFUEVBVF9TRVFdICAgPSB7IFRMVl9UWVBFX1QgfSwKLQkJLyogRklYTUU6IG1vcmUgZWxlbWVudHMgKi8KLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcnJfY2F1c2VfbmFtZXNbXSA9IHsKLQl7IEdTTTQ4X1JSX0NBVVNFX05PUk1BTCwJCSJOb3JtYWwgZXZlbnQiIH0sCi0JeyBHU000OF9SUl9DQVVTRV9BQk5PUk1BTF9VTlNQRUMsCSJBYm5vcm1hbCByZWxlYXNlLCB1bnNwZWNpZmllZCIgfSwKLQl7IEdTTTQ4X1JSX0NBVVNFX0FCTk9STUFMX1VOQUNDVCwJIkFibm9ybWFsIHJlbGVhc2UsIGNoYW5uZWwgdW5hY2NlcHRhYmxlIiB9LAotCXsgR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfVElNRVIsCSJBYm5vcm1hbCByZWxlYXNlLCB0aW1lciBleHBpcmVkIiB9LAotCXsgR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfTk9BQ1QsCSJBYm5vcm1hbCByZWxlYXNlLCBubyBhY3Rpdml0eSBvbiByYWRpbyBwYXRoIiB9LAotCXsgR1NNNDhfUlJfQ0FVU0VfUFJFTVBUSVZFX1JFTCwJCSJQcmVlbXB0aXZlIHJlbGVhc2UiIH0sCi0JeyBHU000OF9SUl9DQVVTRV9ITkRPVkVSX0lNUCwJCSJIYW5kb3ZlciBpbXBvc3NpYmxlLCB0aW1pbmcgYWR2YW5jZSBvdXQgb2YgcmFuZ2UiIH0sCi0JeyBHU000OF9SUl9DQVVTRV9DSEFOX01PREVfVU5BQ0NULAkiQ2hhbm5lbCBtb2RlIHVuYWNjZXB0YWJsZSIgfSwKLQl7IEdTTTQ4X1JSX0NBVVNFX0ZSRVFfTk9UX0lNUEwsCQkiRnJlcXVlbmN5IG5vdCBpbXBsZW1lbnRlZCIgfSwKLQl7IEdTTTQ4X1JSX0NBVVNFX0NBTExfQ0xFQVJFRCwJCSJDYWxsIGFscmVhZHkgY2xlYXJlZCIgfSwKLQl7IEdTTTQ4X1JSX0NBVVNFX1NFTUFOVF9JTkNPUlIsCQkiU2VtYW50aWNhbGx5IGluY29ycmVjdCBtZXNzYWdlIiB9LAotCXsgR1NNNDhfUlJfQ0FVU0VfSU5WQUxJRF9NQU5EX0lORiwJIkludmFsaWQgbWFuZGF0b3J5IGluZm9ybWF0aW9uIiB9LAotCXsgR1NNNDhfUlJfQ0FVU0VfTVNHX1RZUEVfTiwJCSJNZXNzYWdlIHR5cGUgbm9uLWV4aXN0YW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKLQl7IEdTTTQ4X1JSX0NBVVNFX01TR19UWVBFX05fQ09NUEFULAkiTWVzc2FnZSB0eXBlIG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUiIH0sCi0JeyBHU000OF9SUl9DQVVTRV9DT05EX0lFX0VSUk9SLAkJIkNvbmRpdGlvbmFsIElFIGVycm9yIiB9LAotCXsgR1NNNDhfUlJfQ0FVU0VfTk9fQ0VMTF9BTExPQ19BLAkiTm8gY2VsbCBhbGxvY2F0aW9uIGF2YWlsYWJsZSIgfSwKLQl7IEdTTTQ4X1JSX0NBVVNFX1BST1RfRVJST1JfVU5TUEMsCSJQcm90b2NvbCBlcnJvciB1bnNwZWNpZmllZCIgfSwKLQl7IDAsCQkJCQlOVUxMIH0sCi19OwotCi0vKiBGSVhNRTogY29udmVydCB0byB2YWx1ZV9zdHJpbmcgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjY19zdGF0ZV9uYW1lc1szMl0gPSB7Ci0JIk5VTEwiLAotCSJJTklUSUFURUQiLAotCSJpbGxlZ2FsIHN0YXRlIDIiLAotCSJNT19DQUxMX1BST0MiLAotCSJDQUxMX0RFTElWRVJFRCIsCi0JImlsbGVnYWwgc3RhdGUgNSIsCi0JIkNBTExfUFJFU0VOVCIsCi0JIkNBTExfUkVDRUlWRUQiLAotCSJDT05ORUNUX1JFUVVFU1QiLAotCSJNT19URVJNX0NBTExfQ09ORiIsCi0JIkFDVElWRSIsCi0JIkRJU0NPTk5FQ1RfUkVRIiwKLQkiRElTQ09OTkVDVF9JTkQiLAotCSJpbGxlZ2FsIHN0YXRlIDEzIiwKLQkiaWxsZWdhbCBzdGF0ZSAxNCIsCi0JImlsbGVnYWwgc3RhdGUgMTUiLAotCSJpbGxlZ2FsIHN0YXRlIDE2IiwKLQkiaWxsZWdhbCBzdGF0ZSAxNyIsCi0JImlsbGVnYWwgc3RhdGUgMTgiLAotCSJSRUxFQVNFX1JFUSIsCi0JImlsbGVnYWwgc3RhdGUgMjAiLAotCSJpbGxlZ2FsIHN0YXRlIDIxIiwKLQkiaWxsZWdhbCBzdGF0ZSAyMiIsCi0JImlsbGVnYWwgc3RhdGUgMjMiLAotCSJpbGxlZ2FsIHN0YXRlIDI0IiwKLQkiaWxsZWdhbCBzdGF0ZSAyNSIsCi0JIk1PX09SSUdfTU9ESUZZIiwKLQkiTU9fVEVSTV9NT0RJRlkiLAotCSJDT05ORUNUX0lORCIsCi0JImlsbGVnYWwgc3RhdGUgMjkiLAotCSJpbGxlZ2FsIHN0YXRlIDMwIiwKLQkiaWxsZWdhbCBzdGF0ZSAzMSIsCi19OwotCi1jb25zdCBjaGFyICpnc200OF9jY19zdGF0ZV9uYW1lKHVpbnQ4X3Qgc3RhdGUpCi17Ci0JaWYgKHN0YXRlIDwgQVJSQVlfU0laRShjY19zdGF0ZV9uYW1lcykpCi0JCXJldHVybiBjY19zdGF0ZV9uYW1lc1tzdGF0ZV07Ci0KLQlyZXR1cm4gImludmFsaWQiOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBjY19tc2dfbmFtZXNbXSA9IHsKLQl7IEdTTTQ4X01UX0NDX0FMRVJUSU5HLAkJIkFMRVJUSU5HIiB9LAotCXsgR1NNNDhfTVRfQ0NfQ0FMTF9QUk9DLAkiQ0FMTF9QUk9DIiB9LAotCXsgR1NNNDhfTVRfQ0NfUFJPR1JFU1MsCQkiUFJPR1JFU1MiIH0sCi0JeyBHU000OF9NVF9DQ19FU1RBQiwJCSJFU1RBQiIgfSwKLQl7IEdTTTQ4X01UX0NDX1NFVFVQLAkJIlNFVFVQIiB9LAotCXsgR1NNNDhfTVRfQ0NfRVNUQUJfQ09ORiwJIkVTVEFCX0NPTkYiIH0sCi0JeyBHU000OF9NVF9DQ19DT05ORUNULAkJIkNPTk5FQ1QiIH0sCi0JeyBHU000OF9NVF9DQ19DQUxMX0NPTkYsCSJDQUxMX0NPTkYiIH0sCi0JeyBHU000OF9NVF9DQ19TVEFSVF9DQywJCSJTVEFSVF9DQyIgfSwKLQl7IEdTTTQ4X01UX0NDX1JFQ0FMTCwJCSJSRUNBTEwiIH0sCi0JeyBHU000OF9NVF9DQ19FTUVSR19TRVRVUCwJIkVNRVJHX1NFVFVQIiB9LAotCXsgR1NNNDhfTVRfQ0NfQ09OTkVDVF9BQ0ssCSJDT05ORUNUX0FDSyIgfSwKLQl7IEdTTTQ4X01UX0NDX1VTRVJfSU5GTywJIlVTRVJfSU5GTyIgfSwKLQl7IEdTTTQ4X01UX0NDX01PRElGWV9SRUpFQ1QsCSJNT0RJRllfUkVKRUNUIiB9LAotCXsgR1NNNDhfTVRfQ0NfTU9ESUZZLAkJIk1PRElGWSIgfSwKLQl7IEdTTTQ4X01UX0NDX0hPTEQsCQkiSE9MRCIgfSwKLQl7IEdTTTQ4X01UX0NDX0hPTERfQUNLLAkJIkhPTERfQUNLIiB9LAotCXsgR1NNNDhfTVRfQ0NfSE9MRF9SRUosCQkiSE9MRF9SRUoiIH0sCi0JeyBHU000OF9NVF9DQ19SRVRSLAkJIlJFVFIiIH0sCi0JeyBHU000OF9NVF9DQ19SRVRSX0FDSywJCSJSRVRSX0FDSyIgfSwKLQl7IEdTTTQ4X01UX0NDX1JFVFJfUkVKLAkJIlJFVFJfUkVKIiB9LAotCXsgR1NNNDhfTVRfQ0NfTU9ESUZZX0NPTVBMLAkiTU9ESUZZX0NPTVBMIiB9LAotCXsgR1NNNDhfTVRfQ0NfRElTQ09OTkVDVCwJIkRJU0NPTk5FQ1QiIH0sCi0JeyBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMLAkiUkVMRUFTRV9DT01QTCIgfSwKLQl7IEdTTTQ4X01UX0NDX1JFTEVBU0UsCQkiUkVMRUFTRSIgfSwKLQl7IEdTTTQ4X01UX0NDX1NUT1BfRFRNRiwJIlNUT1BfRFRNRiIgfSwKLQl7IEdTTTQ4X01UX0NDX1NUT1BfRFRNRl9BQ0ssCSJTVE9QX0RUTUZfQUNLIiB9LAotCXsgR1NNNDhfTVRfQ0NfU1RBVFVTX0VOUSwJIlNUQVRVU19FTlEiIH0sCi0JeyBHU000OF9NVF9DQ19TVEFSVF9EVE1GLAkiU1RBUlRfRFRNRiIgfSwKLQl7IEdTTTQ4X01UX0NDX1NUQVJUX0RUTUZfQUNLLAkiU1RBUlRfRFRNRl9BQ0siIH0sCi0JeyBHU000OF9NVF9DQ19TVEFSVF9EVE1GX1JFSiwJIlNUQVJUX0RUTUZfUkVKIiB9LAotCXsgR1NNNDhfTVRfQ0NfQ09OR19DVFJMLAkiQ09OR19DVFJMIiB9LAotCXsgR1NNNDhfTVRfQ0NfRkFDSUxJVFksCQkiRkFDSUxJVFkiIH0sCi0JeyBHU000OF9NVF9DQ19TVEFUVVMsCQkiU1RBVFVTIiB9LAotCXsgR1NNNDhfTVRfQ0NfTk9USUZZLAkJIk5PVEZJWSIgfSwKLQl7IDAsCQkJCU5VTEwgfQotfTsKLQotY29uc3QgY2hhciAqZ3NtNDhfY2NfbXNnX25hbWUodWludDhfdCBtc2d0eXBlKQotewotCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGNjX21zZ19uYW1lcywgbXNndHlwZSk7Ci19Ci0KLWNvbnN0IGNoYXIgKnJyX2NhdXNlX25hbWUodWludDhfdCBjYXVzZSkKLXsKLQlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhycl9jYXVzZV9uYW1lcywgY2F1c2UpOwotfQotCi1zdGF0aWMgdm9pZCB0b19iY2QodWludDhfdCAqYmNkLCB1aW50MTZfdCB2YWwpCi17Ci0JYmNkWzJdID0gdmFsICUgMTA7Ci0JdmFsID0gdmFsIC8gMTA7Ci0JYmNkWzFdID0gdmFsICUgMTA7Ci0JdmFsID0gdmFsIC8gMTA7Ci0JYmNkWzBdID0gdmFsICUgMTA7Ci0JdmFsID0gdmFsIC8gMTA7Ci19Ci0KLXZvaWQgZ3NtNDhfZ2VuZXJhdGVfbGFpKHN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqbGFpNDgsIHVpbnQxNl90IG1jYywKLQkJCXVpbnQxNl90IG1uYywgdWludDE2X3QgbGFjKQotewotCXVpbnQ4X3QgYmNkWzNdOwotCi0JdG9fYmNkKGJjZCwgbWNjKTsKLQlsYWk0OC0+ZGlnaXRzWzBdID0gYmNkWzBdIHwgKGJjZFsxXSA8PCA0KTsKLQlsYWk0OC0+ZGlnaXRzWzFdID0gYmNkWzJdOwotCi0JdG9fYmNkKGJjZCwgbW5jKTsKLQkvKiBGSVhNRTogZG8gd2UgbmVlZCB0aHJlZS1kaWdpdCBNTkM/IFNlZSBUYWJsZSAxMC41LjMgKi8KLSNpZiAwCi0JbGFpNDgtPmRpZ2l0c1sxXSB8PSBiY2RbMl0gPDwgNDsKLQlsYWk0OC0+ZGlnaXRzWzJdID0gYmNkWzBdIHwgKGJjZFsxXSA8PCA0KTsKLSNlbHNlCi0JbGFpNDgtPmRpZ2l0c1sxXSB8PSAweGYgPDwgNDsKLQlsYWk0OC0+ZGlnaXRzWzJdID0gYmNkWzFdIHwgKGJjZFsyXSA8PCA0KTsKLSNlbmRpZgotCi0JbGFpNDgtPmxhYyA9IGh0b25zKGxhYyk7Ci19Ci0KLWludCBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgdG1zaSkKLXsKLQl1aW50MzJfdCAqdHB0ciA9ICh1aW50MzJfdCAqKSAmYnVmWzNdOwotCi0JYnVmWzBdID0gR1NNNDhfSUVfTU9CSUxFX0lEOwotCWJ1ZlsxXSA9IEdTTTQ4X1RNU0lfTEVOOwotCWJ1ZlsyXSA9IDB4ZjAgfCBHU01fTUlfVFlQRV9UTVNJOwotCSp0cHRyID0gaHRvbmwodG1zaSk7Ci0KLQlyZXR1cm4gNzsKLX0KLQotaW50IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kodWludDhfdCAqYnVmLCBjb25zdCBjaGFyICppbXNpKQotewotCXVuc2lnbmVkIGludCBsZW5ndGggPSBzdHJsZW4oaW1zaSksIGksIG9mZiA9IDA7Ci0JdWludDhfdCBvZGQgPSAobGVuZ3RoICYgMHgxKSA9PSAxOwotCi0JYnVmWzBdID0gR1NNNDhfSUVfTU9CSUxFX0lEOwotCWJ1ZlsyXSA9IGNoYXIyYmNkKGltc2lbMF0pIDw8IDQgfCBHU01fTUlfVFlQRV9JTVNJIHwgKG9kZCA8PCAzKTsKLQotCS8qIGlmIHRoZSBsZW5ndGggaXMgZXZlbiB3ZSB3aWxsIGZpbGwgaGFsZiBvZiB0aGUgbGFzdCBvY3RldCAqLwotCWlmIChvZGQpCi0JCWJ1ZlsxXSA9IChsZW5ndGggKyAxKSA+PiAxOwotCWVsc2UKLQkJYnVmWzFdID0gKGxlbmd0aCArIDIpID4+IDE7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgYnVmWzFdOyArK2kpIHsKLQkJdWludDhfdCBsb3dlciwgdXBwZXI7Ci0KLQkJbG93ZXIgPSBjaGFyMmJjZChpbXNpWysrb2ZmXSk7Ci0JCWlmICghb2RkICYmIG9mZiArIDEgPT0gbGVuZ3RoKQotCQkJdXBwZXIgPSAweDBmOwotCQllbHNlCi0JCQl1cHBlciA9IGNoYXIyYmNkKGltc2lbKytvZmZdKSAmIDB4MGY7Ci0KLQkJYnVmWzIgKyBpXSA9ICh1cHBlciA8PCA0KSB8IGxvd2VyOwotCX0KLQotCXJldHVybiAyICsgYnVmWzFdOwotfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4X2llLmMgYi9saWJvc21vY29yZS9zcmMvZ3NtNDhfaWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhNWZiOC4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9zcmMvZ3NtNDhfaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzCi0gKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCi0KLS8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAoQykgMjAwOC0yMDEwIGJ5IEFuZHJlYXMgRXZlcnNiZXJnCi0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgotI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KLSNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KLSNpbmNsdWRlIDxvc21vY29yZS9tbmNjLmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGJjZF9udW1fZGlnaXRzW10gPSB7Ci0JJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCi0JJzgnLCAnOScsICcqJywgJyMnLCAnYScsICdiJywgJ2MnLCAnXDAnCi19OwotCi0vKiBkZWNvZGUgYSAnY2FsbGVkL2NhbGxpbmcvY29ubmVjdCBwYXJ0eSBCQ0QgbnVtYmVyJyBhcyBpbiAxMC41LjQuNyAqLwotaW50IGdzbTQ4X2RlY29kZV9iY2RfbnVtYmVyKGNoYXIgKm91dHB1dCwgaW50IG91dHB1dF9sZW4sCi0JCQkgICAgY29uc3QgdWludDhfdCAqYmNkX2x2LCBpbnQgaF9sZW4pCi17Ci0JdWludDhfdCBpbl9sZW4gPSBiY2RfbHZbMF07Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAxICsgaF9sZW47IGkgPD0gaW5fbGVuOyBpKyspIHsKLQkJLyogbG93ZXIgbmliYmxlICovCi0JCW91dHB1dF9sZW4tLTsKLQkJaWYgKG91dHB1dF9sZW4gPD0gMSkKLQkJCWJyZWFrOwotCQkqb3V0cHV0KysgPSBiY2RfbnVtX2RpZ2l0c1tiY2RfbHZbaV0gJiAweGZdOwotCi0JCS8qIGhpZ2hlciBuaWJibGUgKi8KLQkJb3V0cHV0X2xlbi0tOwotCQlpZiAob3V0cHV0X2xlbiA8PSAxKQotCQkJYnJlYWs7Ci0JCSpvdXRwdXQrKyA9IGJjZF9udW1fZGlnaXRzW2JjZF9sdltpXSA+PiA0XTsKLQl9Ci0JaWYgKG91dHB1dF9sZW4gPj0gMSkKLQkJKm91dHB1dCsrID0gJ1wwJzsKLQotCXJldHVybiAwOwotfQotCi0vKiBjb252ZXJ0IGEgc2luZ2xlIEFTQ0lJIGNoYXJhY3RlciB0byBjYWxsLWNvbnRyb2wgQkNEICovCi1zdGF0aWMgaW50IGFzY190b19iY2QoY29uc3QgY2hhciBhc2MpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShiY2RfbnVtX2RpZ2l0cyk7IGkrKykgewotCQlpZiAoYmNkX251bV9kaWdpdHNbaV0gPT0gYXNjKQotCQkJcmV0dXJuIGk7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKiBjb252ZXJ0IGEgQVNDSUkgcGhvbmUgbnVtYmVyIHRvICdjYWxsZWQvY2FsbGluZy9jb25uZWN0IHBhcnR5IEJDRCBudW1iZXInICovCi1pbnQgZ3NtNDhfZW5jb2RlX2JjZF9udW1iZXIodWludDhfdCAqYmNkX2x2LCB1aW50OF90IG1heF9sZW4sCi0JCSAgICAgIGludCBoX2xlbiwgY29uc3QgY2hhciAqaW5wdXQpCi17Ci0JaW50IGluX2xlbiA9IHN0cmxlbihpbnB1dCk7Ci0JaW50IGk7Ci0JdWludDhfdCAqYmNkX2N1ciA9IGJjZF9sdiArIDEgKyBoX2xlbjsKLQotCS8qIHR3byBkaWdpdHMgcGVyIGJ5dGUsIHBsdXMgdHlwZSBieXRlICovCi0JYmNkX2x2WzBdID0gaW5fbGVuLzIgKyBoX2xlbjsKLQlpZiAoaW5fbGVuICUgMikKLQkJYmNkX2x2WzBdKys7Ci0KLQlpZiAoYmNkX2x2WzBdID4gbWF4X2xlbikKLQkJcmV0dXJuIC1FSU87Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW5fbGVuOyBpKyspIHsKLQkJaW50IHJjID0gYXNjX3RvX2JjZChpbnB1dFtpXSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCWlmIChpICUgMiA9PSAwKQotCQkJKmJjZF9jdXIgPSByYzsKLQkJZWxzZQotCQkJKmJjZF9jdXIrKyB8PSAocmMgPDwgNCk7Ci0JfQotCS8qIGFwcGVuZCBwYWRkaW5nIG5pYmJsZSBpbiBjYXNlIG9mIG9kZCBsZW5ndGggKi8KLQlpZiAoaSAlIDIpCi0JCSpiY2RfY3VyKysgfD0gMHhmMDsKLQotCS8qIHJldHVybiBob3cgbWFueSBieXRlcyB3ZSB1c2VkICovCi0JcmV0dXJuIChiY2RfY3VyIC0gYmNkX2x2KTsKLX0KLQotLyogZGVjb2RlICdiZWFyZXIgY2FwYWJpbGl0eScgKi8KLWludCBnc200OF9kZWNvZGVfYmVhcmVyX2NhcChzdHJ1Y3QgZ3NtX21uY2NfYmVhcmVyX2NhcCAqYmNhcCwKLQkJCSAgICAgY29uc3QgdWludDhfdCAqbHYpCi17Ci0JdWludDhfdCBpbl9sZW4gPSBsdlswXTsKLQlpbnQgaSwgczsKLQotCWlmIChpbl9sZW4gPCAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJjYXAtPnNwZWVjaF92ZXJbMF0gPSAtMTsgLyogZW5kIG9mIGxpc3QsIG9mIG1heGltdW0gNyB2YWx1ZXMgKi8KLQotCS8qIG9jdGV0IDMgKi8KLQliY2FwLT50cmFuc2ZlciA9IGx2WzFdICYgMHgwNzsKLQliY2FwLT5tb2RlID0gKGx2WzFdICYgMHgwOCkgPj4gMzsKLQliY2FwLT5jb2RpbmcgPSAobHZbMV0gJiAweDEwKSA+PiA0OwotCWJjYXAtPnJhZGlvID0gKGx2WzFdICYgMHg2MCkgPj4gNTsKLQotCWlmIChiY2FwLT50cmFuc2ZlciA9PSBHU01fTU5DQ19CQ0FQX1NQRUVDSCkgewotCQlpID0gMTsKLQkJcyA9IDA7Ci0JCXdoaWxlKCEobHZbaV0gJiAweDgwKSkgewotCQkJaSsrOyAvKiBvY3RldCAzYSBldGMgKi8KLQkJCWlmIChpbl9sZW4gPCBpKQotCQkJCXJldHVybiAwOwotCQkJYmNhcC0+c3BlZWNoX3ZlcltzKytdID0gbHZbaV0gJiAweDBmOwotCQkJYmNhcC0+c3BlZWNoX3ZlcltzXSA9IC0xOyAvKiBlbmQgb2YgbGlzdCAqLwotCQkJaWYgKGkgPT0gMikgLyogb2N0ZXQgM2EgKi8KLQkJCQliY2FwLT5zcGVlY2hfY3RtID0gKGx2W2ldICYgMHgyMCkgPj4gNTsKLQkJCWlmIChzID09IDcpIC8qIG1heGltdW0gc3BlZWNoIHZlcnNpb25zICsgZW5kIG9mIGxpc3QgKi8KLQkJCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCWkgPSAxOwotCQl3aGlsZSAoIShsdltpXSAmIDB4ODApKSB7Ci0JCQlpKys7IC8qIG9jdGV0IDNhIGV0YyAqLwotCQkJaWYgKGluX2xlbiA8IGkpCi0JCQkJcmV0dXJuIDA7Ci0JCQkvKiBpZ25vcmUgdGhlbSAqLwotCQl9Ci0JCS8qIEZJWE1FOiBpbXBsZW1lbnQgT0NURVQgNCsgcGFyc2luZyAqLwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBlbmNvZGUgJ2JlYXJlciBjYXBhYmlsaXR5JyAqLwotaW50IGdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAotCQkJICAgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfYmVhcmVyX2NhcCAqYmNhcCkKLXsKLQl1aW50OF90IGx2WzMyICsgMV07Ci0JaW50IGkgPSAxLCBzOwotCi0JbHZbMV0gPSBiY2FwLT50cmFuc2ZlcjsKLQlsdlsxXSB8PSBiY2FwLT5tb2RlIDw8IDM7Ci0JbHZbMV0gfD0gYmNhcC0+Y29kaW5nIDw8IDQ7Ci0JbHZbMV0gfD0gYmNhcC0+cmFkaW8gPDwgNTsKLQotCWlmIChiY2FwLT50cmFuc2ZlciA9PSBHU01fTU5DQ19CQ0FQX1NQRUVDSCkgewotCQlmb3IgKHMgPSAwOyBiY2FwLT5zcGVlY2hfdmVyW3NdID49IDA7IHMrKykgewotCQkJaSsrOyAvKiBvY3RldCAzYSBldGMgKi8KLQkJCWx2W2ldID0gYmNhcC0+c3BlZWNoX3ZlcltzXTsKLQkJCWlmIChpID09IDIpIC8qIG9jdGV0IDNhICovCi0JCQkJbHZbaV0gfD0gYmNhcC0+c3BlZWNoX2N0bSA8PCA1OwotCQl9Ci0JCWx2W2ldIHw9IDB4ODA7IC8qIGxhc3QgSUUgb2Ygb2N0ZXQgMyBldGMgKi8KLQl9IGVsc2UgewotCQkvKiBGSVhNRTogaW1wbGVtZW50IE9DVEVUIDQrIGVuY29kaW5nICovCi0JfQotCi0JbHZbMF0gPSBpOwotCWlmIChsdl9vbmx5KQotCQltc2diX2x2X3B1dChtc2csIGx2WzBdLCBsdisxKTsKLQllbHNlCi0JCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0JFQVJFUl9DQVAsIGx2WzBdLCBsdisxKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBkZWNvZGUgJ2NhbGwgY29udHJvbCBjYXAnICovCi1pbnQgZ3NtNDhfZGVjb2RlX2NjY2FwKHN0cnVjdCBnc21fbW5jY19jY2NhcCAqY2NhcCwgY29uc3QgdWludDhfdCAqbHYpCi17Ci0JdWludDhfdCBpbl9sZW4gPSBsdlswXTsKLQotCWlmIChpbl9sZW4gPCAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIG9jdGV0IDMgKi8KLQljY2FwLT5kdG1mID0gbHZbMV0gJiAweDAxOwotCWNjYXAtPnBjcCA9IChsdlsxXSAmIDB4MDIpID4+IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZW5jb2RlICdjYWxsIGNvbnRyb2wgY2FwJyAqLwotaW50IGdzbTQ4X2VuY29kZV9jY2NhcChzdHJ1Y3QgbXNnYiAqbXNnLAotCQkJY29uc3Qgc3RydWN0IGdzbV9tbmNjX2NjY2FwICpjY2FwKQotewotCXVpbnQ4X3QgbHZbMl07Ci0KLQlsdlswXSA9IDE7Ci0JbHZbMV0gPSAwOwotCWlmIChjY2FwLT5kdG1mKQotCQlsdiBbMV0gfD0gMHgwMTsKLQlpZiAoY2NhcC0+cGNwKQotCQlsdiBbMV0gfD0gMHgwMjsKLQotCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0NDX0NBUCwgbHZbMF0sIGx2KzEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGRlY29kZSAnY2FsbGVkIHBhcnR5IEJDRCBudW1iZXInICovCi1pbnQgZ3NtNDhfZGVjb2RlX2NhbGxlZChzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsZWQsCi0JCQkgY29uc3QgdWludDhfdCAqbHYpCi17Ci0JdWludDhfdCBpbl9sZW4gPSBsdlswXTsKLQotCWlmIChpbl9sZW4gPCAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIG9jdGV0IDMgKi8KLQljYWxsZWQtPnBsYW4gPSBsdlsxXSAmIDB4MGY7Ci0JY2FsbGVkLT50eXBlID0gKGx2WzFdICYgMHg3MCkgPj4gNDsKLQotCS8qIG9jdGV0IDQuLk4gKi8KLQlnc200OF9kZWNvZGVfYmNkX251bWJlcihjYWxsZWQtPm51bWJlciwgc2l6ZW9mKGNhbGxlZC0+bnVtYmVyKSwgbHYsIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGVuY29kZSAnY2FsbGVkIHBhcnR5IEJDRCBudW1iZXInICovCi1pbnQgZ3NtNDhfZW5jb2RlX2NhbGxlZChzdHJ1Y3QgbXNnYiAqbXNnLAotCQkJIGNvbnN0IHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlZCkKLXsKLQl1aW50OF90IGx2WzE4XTsKLQlpbnQgcmV0OwotCi0JLyogb2N0ZXQgMyAqLwotCWx2WzFdID0gY2FsbGVkLT5wbGFuOwotCWx2WzFdIHw9IGNhbGxlZC0+dHlwZSA8PCA0OwotCi0JLyogb2N0ZXQgNC4uTiwgb2N0ZXQgMiAqLwotCXJldCA9IGdzbTQ4X2VuY29kZV9iY2RfbnVtYmVyKGx2LCBzaXplb2YobHYpLCAxLCBjYWxsZWQtPm51bWJlcik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9DQUxMRURfQkNELCBsdlswXSwgbHYrMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGVjb2RlIGNhbGxlcmlkIG9mIHZhcmlvdXMgSUVzICovCi1pbnQgZ3NtNDhfZGVjb2RlX2NhbGxlcmlkKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlcmlkLAotCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KQotewotCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07Ci0JaW50IGkgPSAxOwotCi0JaWYgKGluX2xlbiA8IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogb2N0ZXQgMyAqLwotCWNhbGxlcmlkLT5wbGFuID0gbHZbMV0gJiAweDBmOwotCWNhbGxlcmlkLT50eXBlID0gKGx2WzFdICYgMHg3MCkgPj4gNDsKLQotCS8qIG9jdGV0IDNhICovCi0JaWYgKCEobHZbMV0gJiAweDgwKSkgewotCQljYWxsZXJpZC0+c2NyZWVuID0gbHZbMl0gJiAweDAzOwotCQljYWxsZXJpZC0+cHJlc2VudCA9IChsdlsyXSAmIDB4NjApID4+IDU7Ci0JCWkgPSAyOwotCX0KLQotCS8qIG9jdGV0IDQuLk4gKi8KLQlnc200OF9kZWNvZGVfYmNkX251bWJlcihjYWxsZXJpZC0+bnVtYmVyLCBzaXplb2YoY2FsbGVyaWQtPm51bWJlciksIGx2LCBpKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBlbmNvZGUgY2FsbGVyaWQgb2YgdmFyaW91cyBJRXMgKi8KLWludCBnc200OF9lbmNvZGVfY2FsbGVyaWQoc3RydWN0IG1zZ2IgKm1zZywgaW50IGllLCBpbnQgbWF4X2xlbiwKLQkJCSAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlcmlkKQotewotCXVpbnQ4X3QgbHZbbWF4X2xlbiAtIDFdOwotCWludCBoX2xlbiA9IDE7Ci0JaW50IHJldDsKLQotCS8qIG9jdGV0IDMgKi8KLQlsdlsxXSA9IGNhbGxlcmlkLT5wbGFuOwotCWx2WzFdIHw9IGNhbGxlcmlkLT50eXBlIDw8IDQ7Ci0KLQlpZiAoY2FsbGVyaWQtPnByZXNlbnQgfHwgY2FsbGVyaWQtPnNjcmVlbikgewotCQkvKiBvY3RldCAzYSAqLwotCQlsdlsyXSA9IGNhbGxlcmlkLT5zY3JlZW47Ci0JCWx2WzJdIHw9IGNhbGxlcmlkLT5wcmVzZW50IDw8IDU7Ci0JCWx2WzJdIHw9IDB4ODA7Ci0JCWhfbGVuKys7Ci0JfSBlbHNlCi0JCWx2WzFdIHw9IDB4ODA7Ci0KLQkvKiBvY3RldCA0Li5OLCBvY3RldCAyICovCi0JcmV0ID0gZ3NtNDhfZW5jb2RlX2JjZF9udW1iZXIobHYsIHNpemVvZihsdiksIGhfbGVuLCBjYWxsZXJpZC0+bnVtYmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCW1zZ2JfdGx2X3B1dChtc2csIGllLCBsdlswXSwgbHYrMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGVjb2RlICdjYXVzZScgKi8KLWludCBnc200OF9kZWNvZGVfY2F1c2Uoc3RydWN0IGdzbV9tbmNjX2NhdXNlICpjYXVzZSwKLQkJCWNvbnN0IHVpbnQ4X3QgKmx2KQotewotCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07Ci0JaW50IGk7Ci0KLQlpZiAoaW5fbGVuIDwgMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljYXVzZS0+ZGlhZ19sZW4gPSAwOwotCi0JLyogb2N0ZXQgMyAqLwotCWNhdXNlLT5sb2NhdGlvbiA9IGx2WzFdICYgMHgwZjsKLQljYXVzZS0+Y29kaW5nID0gKGx2WzFdICYgMHg2MCkgPj4gNTsKLQotCWkgPSAxOwotCWlmICghKGx2W2ldICYgMHg4MCkpIHsKLQkJaSsrOyAvKiBvY3RldCAzYSAqLwotCQlpZiAoaW5fbGVuIDwgaSsxKQotCQkJcmV0dXJuIDA7Ci0JCWNhdXNlLT5yZWMgPSAxOwotCQljYXVzZS0+cmVjX3ZhbCA9IGx2W2ldICYgMHg3ZjsKLQl9Ci0JaSsrOwotCi0JLyogb2N0ZXQgNCAqLwotCWNhdXNlLT52YWx1ZSA9IGx2W2ldICYgMHg3ZjsKLQlpKys7Ci0KLQlpZiAoaW5fbGVuIDwgaSkgLyogbm8gZGlhZyAqLwotCQlyZXR1cm4gMDsKLQotCWlmIChpbl9sZW4gLSAoaS0xKSA+IDMyKSAvKiBtYXhpbXVtIDMyIG9jdGV0cyAqLwotCQlyZXR1cm4gMDsKLQotCS8qIG9jdGV0IDUtTiAqLwotCW1lbWNweShjYXVzZS0+ZGlhZywgbHYgKyBpLCBpbl9sZW4gLSAoaS0xKSk7Ci0JY2F1c2UtPmRpYWdfbGVuID0gaW5fbGVuIC0gKGktMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZW5jb2RlICdjYXVzZScgKi8KLWludCBnc200OF9lbmNvZGVfY2F1c2Uoc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCi0JCQljb25zdCBzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UgKmNhdXNlKQotewotCXVpbnQ4X3QgbHZbMzIrNF07Ci0JaW50IGk7Ci0KLQlpZiAoY2F1c2UtPmRpYWdfbGVuID4gMzIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogb2N0ZXQgMyAqLwotCWx2WzFdID0gY2F1c2UtPmxvY2F0aW9uOwotCWx2WzFdIHw9IGNhdXNlLT5jb2RpbmcgPDwgNTsKLQotCWkgPSAxOwotCWlmIChjYXVzZS0+cmVjKSB7Ci0JCWkrKzsgLyogb2N0ZXQgM2EgKi8KLQkJbHZbaV0gPSBjYXVzZS0+cmVjX3ZhbDsKLQl9Ci0JbHZbaV0gfD0gMHg4MDsgLyogZW5kIG9mIG9jdGV0IDMgKi8KLQotCS8qIG9jdGV0IDQgKi8KLQlpKys7Ci0JbHZbaV0gPSAweDgwIHwgY2F1c2UtPnZhbHVlOwotCi0JLyogb2N0ZXQgNS1OICovCi0JaWYgKGNhdXNlLT5kaWFnX2xlbikgewotCQltZW1jcHkobHYgKyBpLCBjYXVzZS0+ZGlhZywgY2F1c2UtPmRpYWdfbGVuKTsKLQkJaSArPSBjYXVzZS0+ZGlhZ19sZW47Ci0JfQotCi0JbHZbMF0gPSBpOwotCWlmIChsdl9vbmx5KQotCQltc2diX2x2X3B1dChtc2csIGx2WzBdLCBsdisxKTsKLQllbHNlCi0JCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0NBVVNFLCBsdlswXSwgbHYrMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGVjb2RlICdjYWxsaW5nIG51bWJlcicgKi8KLWludCBnc200OF9kZWNvZGVfY2FsbGluZyhzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsaW5nLAotCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KQotewotCXJldHVybiBnc200OF9kZWNvZGVfY2FsbGVyaWQoY2FsbGluZywgbHYpOwotfQotCi0vKiBlbmNvZGUgJ2NhbGxpbmcgbnVtYmVyJyAqLwotaW50IGdzbTQ4X2VuY29kZV9jYWxsaW5nKHN0cnVjdCBtc2diICptc2csIAotCQkJICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsaW5nKQotewotCXJldHVybiBnc200OF9lbmNvZGVfY2FsbGVyaWQobXNnLCBHU000OF9JRV9DQUxMSU5HX0JDRCwgMTQsIGNhbGxpbmcpOwotfQotCi0vKiBkZWNvZGUgJ2Nvbm5lY3RlZCBudW1iZXInICovCi1pbnQgZ3NtNDhfZGVjb2RlX2Nvbm5lY3RlZChzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjb25uZWN0ZWQsCi0JCQkgY29uc3QgdWludDhfdCAqbHYpCi17Ci0JcmV0dXJuIGdzbTQ4X2RlY29kZV9jYWxsZXJpZChjb25uZWN0ZWQsIGx2KTsKLX0KLQotLyogZW5jb2RlICdjb25uZWN0ZWQgbnVtYmVyJyAqLwotaW50IGdzbTQ4X2VuY29kZV9jb25uZWN0ZWQoc3RydWN0IG1zZ2IgKm1zZywKLQkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjb25uZWN0ZWQpCi17Ci0JcmV0dXJuIGdzbTQ4X2VuY29kZV9jYWxsZXJpZChtc2csIEdTTTQ4X0lFX0NPTk5fQkNELCAxNCwgY29ubmVjdGVkKTsKLX0KLQotLyogZGVjb2RlICdyZWRpcmVjdGluZyBudW1iZXInICovCi1pbnQgZ3NtNDhfZGVjb2RlX3JlZGlyZWN0aW5nKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKnJlZGlyZWN0aW5nLAotCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KQotewotCXJldHVybiBnc200OF9kZWNvZGVfY2FsbGVyaWQocmVkaXJlY3RpbmcsIGx2KTsKLX0KLQotLyogZW5jb2RlICdyZWRpcmVjdGluZyBudW1iZXInICovCi1pbnQgZ3NtNDhfZW5jb2RlX3JlZGlyZWN0aW5nKHN0cnVjdCBtc2diICptc2csCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpyZWRpcmVjdGluZykKLXsKLQlyZXR1cm4gZ3NtNDhfZW5jb2RlX2NhbGxlcmlkKG1zZywgR1NNNDhfSUVfUkVESVJfQkNELCAxOSwgcmVkaXJlY3RpbmcpOwotfQotCi0vKiBkZWNvZGUgJ2ZhY2lsaXR5JyAqLwotaW50IGdzbTQ4X2RlY29kZV9mYWNpbGl0eShzdHJ1Y3QgZ3NtX21uY2NfZmFjaWxpdHkgKmZhY2lsaXR5LAotCQkJICAgY29uc3QgdWludDhfdCAqbHYpCi17Ci0JdWludDhfdCBpbl9sZW4gPSBsdlswXTsKLQotCWlmIChpbl9sZW4gPCAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpbl9sZW4gPiBzaXplb2YoZmFjaWxpdHktPmluZm8pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbWNweShmYWNpbGl0eS0+aW5mbywgbHYrMSwgaW5fbGVuKTsKLQlmYWNpbGl0eS0+bGVuID0gaW5fbGVuOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGVuY29kZSAnZmFjaWxpdHknICovCi1pbnQgZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAotCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5ICpmYWNpbGl0eSkKLXsKLQl1aW50OF90IGx2W0dTTV9NQVhfRkFDSUxJVFkgKyAxXTsKLQotCWlmIChmYWNpbGl0eS0+bGVuIDwgMSB8fCBmYWNpbGl0eS0+bGVuID4gR1NNX01BWF9GQUNJTElUWSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1jcHkobHYrMSwgZmFjaWxpdHktPmluZm8sIGZhY2lsaXR5LT5sZW4pOwotCWx2WzBdID0gZmFjaWxpdHktPmxlbjsKLQlpZiAobHZfb25seSkKLQkJbXNnYl9sdl9wdXQobXNnLCBsdlswXSwgbHYrMSk7Ci0JZWxzZQotCQltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9GQUNJTElUWSwgbHZbMF0sIGx2KzEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGRlY29kZSAnbm90aWZ5JyAqLwotaW50IGdzbTQ4X2RlY29kZV9ub3RpZnkoaW50ICpub3RpZnksIGNvbnN0IHVpbnQ4X3QgKnYpCi17Ci0JKm5vdGlmeSA9IHZbMF0gJiAweDdmOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGVuY29kZSAnbm90aWZ5JyAqLwotaW50IGdzbTQ4X2VuY29kZV9ub3RpZnkoc3RydWN0IG1zZ2IgKm1zZywgaW50IG5vdGlmeSkKLXsKLQltc2diX3ZfcHV0KG1zZywgbm90aWZ5IHwgMHg4MCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGVjb2RlICdzaWduYWwnICovCi1pbnQgZ3NtNDhfZGVjb2RlX3NpZ25hbChpbnQgKnNpZ25hbCwgY29uc3QgdWludDhfdCAqdikKLXsKLQkqc2lnbmFsID0gdlswXTsKLQotCXJldHVybiAwOwotfQotCi0vKiBlbmNvZGUgJ3NpZ25hbCcgKi8KLWludCBnc200OF9lbmNvZGVfc2lnbmFsKHN0cnVjdCBtc2diICptc2csIGludCBzaWduYWwpCi17Ci0JbXNnYl90dl9wdXQobXNnLCBHU000OF9JRV9TSUdOQUwsIHNpZ25hbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGVjb2RlICdrZXlwYWQnICovCi1pbnQgZ3NtNDhfZGVjb2RlX2tleXBhZChpbnQgKmtleXBhZCwgY29uc3QgdWludDhfdCAqbHYpCi17Ci0JdWludDhfdCBpbl9sZW4gPSBsdlswXTsKLQotCWlmIChpbl9sZW4gPCAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCSprZXlwYWQgPSBsdlsxXSAmIDB4N2Y7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZW5jb2RlICdrZXlwYWQnICovCi1pbnQgZ3NtNDhfZW5jb2RlX2tleXBhZChzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQga2V5cGFkKQotewotCW1zZ2JfdHZfcHV0KG1zZywgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZLCBrZXlwYWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGRlY29kZSAncHJvZ3Jlc3MnICovCi1pbnQgZ3NtNDhfZGVjb2RlX3Byb2dyZXNzKHN0cnVjdCBnc21fbW5jY19wcm9ncmVzcyAqcHJvZ3Jlc3MsCi0JCQkgICBjb25zdCB1aW50OF90ICpsdikKLXsKLQl1aW50OF90IGluX2xlbiA9IGx2WzBdOwotCi0JaWYgKGluX2xlbiA8IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHJvZ3Jlc3MtPmNvZGluZyA9IChsdlsxXSAmIDB4NjApID4+IDU7Ci0JcHJvZ3Jlc3MtPmxvY2F0aW9uID0gbHZbMV0gJiAweDBmOwotCXByb2dyZXNzLT5kZXNjciA9IGx2WzJdICYgMHg3ZjsKLQotCXJldHVybiAwOwotfQotCi0vKiBlbmNvZGUgJ3Byb2dyZXNzJyAqLwotaW50IGdzbTQ4X2VuY29kZV9wcm9ncmVzcyhzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbHZfb25seSwKLQkJCSAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY19wcm9ncmVzcyAqcCkKLXsKLQl1aW50OF90IGx2WzNdOwotCi0JbHZbMF0gPSAyOwotCWx2WzFdID0gMHg4MCB8ICgocC0+Y29kaW5nICYgMHgzKSA8PCA1KSB8IChwLT5sb2NhdGlvbiAmIDB4Zik7Ci0JbHZbMl0gPSAweDgwIHwgKHAtPmRlc2NyICYgMHg3Zik7Ci0JaWYgKGx2X29ubHkpCi0JCW1zZ2JfbHZfcHV0KG1zZywgbHZbMF0sIGx2KzEpOwotCWVsc2UKLQkJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfUFJPR1JfSU5ELCBsdlswXSwgbHYrMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGVjb2RlICd1c2VyLXVzZXInICovCi1pbnQgZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKHN0cnVjdCBnc21fbW5jY191c2VydXNlciAqdXUsCi0JCQkgICBjb25zdCB1aW50OF90ICpsdikKLXsKLQl1aW50OF90IGluX2xlbiA9IGx2WzBdOwotCWNoYXIgKmluZm8gPSB1dS0+aW5mbzsKLQlpbnQgaW5mb19sZW4gPSBzaXplb2YodXUtPmluZm8pOwotCWludCBpOwotCi0JaWYgKGluX2xlbiA8IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdXUtPnByb3RvID0gbHZbMV07Ci0KLQlmb3IgKGkgPSAyOyBpIDw9IGluX2xlbjsgaSsrKSB7Ci0JCWluZm9fbGVuLS07Ci0JCWlmIChpbmZvX2xlbiA8PSAxKQotCQkJYnJlYWs7Ci0JCSppbmZvKysgPSBsdltpXTsKLQl9Ci0JaWYgKGluZm9fbGVuID49IDEpCi0JCSppbmZvKysgPSAnXDAnOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGVuY29kZSAndXNlcnVzZXInICovCi1pbnQgZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAotCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX3VzZXJ1c2VyICp1dSkKLXsKLQl1aW50OF90IGx2W0dTTV9NQVhfVVNFUlVTRVIgKyAyXTsKLQotCWlmIChzdHJsZW4odXUtPmluZm8pID4gR1NNX01BWF9VU0VSVVNFUikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlsdlswXSA9IDEgKyBzdHJsZW4odXUtPmluZm8pOwotCWx2WzFdID0gdXUtPnByb3RvOwotCW1lbWNweShsdiArIDIsIHV1LT5pbmZvLCBzdHJsZW4odXUtPmluZm8pKTsKLQlpZiAobHZfb25seSkKLQkJbXNnYl9sdl9wdXQobXNnLCBsdlswXSwgbHYrMSk7Ci0JZWxzZQotCQltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9VU0VSX1VTRVIsIGx2WzBdLCBsdisxKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBkZWNvZGUgJ3NzIHZlcnNpb24nICovCi1pbnQgZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbihzdHJ1Y3QgZ3NtX21uY2Nfc3N2ZXJzaW9uICpzc3YsCi0JCQkgICAgY29uc3QgdWludDhfdCAqbHYpCi17Ci0JdWludDhfdCBpbl9sZW4gPSBsdlswXTsKLQotCWlmIChpbl9sZW4gPCAxIHx8IGluX2xlbiA8IHNpemVvZihzc3YtPmluZm8pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbWNweShzc3YtPmluZm8sIGx2ICsgMSwgaW5fbGVuKTsKLQlzc3YtPmxlbiA9IGluX2xlbjsKLQotCXJldHVybiAwOwotfQotCi0vKiBlbmNvZGUgJ3NzIHZlcnNpb24nICovCi1pbnQgZ3NtNDhfZW5jb2RlX3NzdmVyc2lvbihzdHJ1Y3QgbXNnYiAqbXNnLAotCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX3NzdmVyc2lvbiAqc3N2KQotewotCXVpbnQ4X3QgbHZbR1NNX01BWF9TU1ZFUlNJT04gKyAxXTsKLQotCWlmIChzc3YtPmxlbiA+IEdTTV9NQVhfU1NWRVJTSU9OKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWx2WzBdID0gc3N2LT5sZW47Ci0JbWVtY3B5KGx2ICsgMSwgc3N2LT5pbmZvLCBzc3YtPmxlbik7Ci0JbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfU1NfVkVSUywgbHZbMF0sIGx2KzEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGRlY29kZSAnbW9yZSBkYXRhJyBkb2VzIG5vdCByZXF1aXJlIGEgZnVuY3Rpb24sIGJlY2F1c2UgaXQgaGFzIG5vIHZhbHVlICovCi0KLS8qIGVuY29kZSAnbW9yZSBkYXRhJyAqLwotaW50IGdzbTQ4X2VuY29kZV9tb3JlKHN0cnVjdCBtc2diICptc2cpCi17Ci0JdWludDhfdCAqaWU7Ci0KLQlpZSA9IG1zZ2JfcHV0KG1zZywgMSk7Ci0JaWVbMF0gPSBHU000OF9JRV9NT1JFX0RBVEE7Ci0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTNkZDVjLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL3NyYy9nc21fdXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKgotICogKEMpIDIwMDggYnkgRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+Ci0gKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+Ci0gKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLS8vI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KLSNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgotI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICIuLi9jb25maWcuaCIKLQotLyogR1NNIDAzLjM4IDYuMi4xIENoYXJhY2h0ZXIgcGFja2luZyAqLwotaW50IGdzbV83Yml0X2RlY29kZShjaGFyICp0ZXh0LCBjb25zdCB1aW50OF90ICp1c2VyX2RhdGEsIHVpbnQ4X3QgbGVuZ3RoKQotewotCWludCBpID0gMDsKLQlpbnQgbCA9IDA7Ci0KLSAgICAgICAgLyogRklYTUU6IFdlIG5lZWQgdG8gYWNjb3VudCBmb3IgdXNlciBkYXRhIGhlYWRlcnMgaGVyZSAqLwotCWkgKz0gbDsKLQlmb3IgKDsgaSA8IGxlbmd0aDsgaSArKykKLQkJKih0ZXh0ICsrKSA9Ci0JCQkoKHVzZXJfZGF0YVsoaSAqIDcgKyA3KSA+PiAzXSA8PAotCQkJICAoNyAtICgoaSAqIDcgKyA3KSAmIDcpKSkgfAotCQkJICh1c2VyX2RhdGFbKGkgKiA3KSA+PiAzXSA+PgotCQkJICAoKGkgKiA3KSAmIDcpKSkgJiAweDdmOwotCSp0ZXh0ID0gJ1wwJzsKLQotCXJldHVybiBpIC0gbDsKLX0KLQotCi0vKiBHU00gMDMuMzggNi4yLjEgQ2hhcmFjaHRlciBwYWNraW5nICovCi1pbnQgZ3NtXzdiaXRfZW5jb2RlKHVpbnQ4X3QgKnJlc3VsdCwgY29uc3QgY2hhciAqZGF0YSkKLXsKLQlpbnQgaSxqID0gMDsKLQl1bnNpZ25lZCBjaGFyIGNoMSwgY2gyOwotCWludCBzaGlmdCA9IDA7Ci0KLQlmb3IgKCBpPTA7IGk8c3RybGVuKGRhdGEpOyBpKysgKSB7Ci0KLQkJY2gxID0gZGF0YVtpXSAmIDB4N0Y7Ci0JCWNoMSA9IGNoMSA+PiBzaGlmdDsKLQkJY2gyID0gZGF0YVsoaSsxKV0gJiAweDdGOwotCQljaDIgPSBjaDIgPDwgKDctc2hpZnQpOwotCi0JCWNoMSA9IGNoMSB8IGNoMjsKLQotCQlyZXN1bHRbaisrXSA9IGNoMTsKLQotCQlzaGlmdCsrOwotCi0JCWlmICgoc2hpZnQgPT0gNykgJiYgKGkrMTxzdHJsZW4oZGF0YSkpKSB7Ci0JCQlzaGlmdCA9IDA7Ci0JCQlpKys7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gaTsKLX0KLQotLyogZGV0ZXJtaW5lIHBvd2VyIGNvbnRyb2wgbGV2ZWwgZm9yIGdpdmVuIGRCbSB2YWx1ZSwgYXMgaW5kaWNhdGVkCi0gKiBieSB0aGUgdGFibGVzIGluIGNoYXB0ZXIgNC4xLjEgb2YgR1NNIFRTIDA1LjA1ICovCi1pbnQgbXNfcHdyX2N0bF9sdmwoZW51bSBnc21fYmFuZCBiYW5kLCB1bnNpZ25lZCBpbnQgZGJtKQotewotCXN3aXRjaCAoYmFuZCkgewotCWNhc2UgR1NNX0JBTkRfNDUwOgotCWNhc2UgR1NNX0JBTkRfNDgwOgotCWNhc2UgR1NNX0JBTkRfNzUwOgotCWNhc2UgR1NNX0JBTkRfOTAwOgotCWNhc2UgR1NNX0JBTkRfODEwOgotCWNhc2UgR1NNX0JBTkRfODUwOgotCQlpZiAoZGJtID49IDM5KQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGRibSA8IDUpCi0JCQlyZXR1cm4gMTk7Ci0JCWVsc2UgewotCQkJLyogd2UgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSAoNSA8PSBkYm0gPCAzOSkgKi8KLQkJCXJldHVybiAyICsgKCgzOSAtIGRibSkgLyAyKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEdTTV9CQU5EXzE4MDA6Ci0JCWlmIChkYm0gPj0gMzYpCi0JCQlyZXR1cm4gMjk7Ci0JCWVsc2UgaWYgKGRibSA+PSAzNCkJCi0JCQlyZXR1cm4gMzA7Ci0JCWVsc2UgaWYgKGRibSA+PSAzMikKLQkJCXJldHVybiAzMTsKLQkJZWxzZSBpZiAoZGJtID09IDMxKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgewotCQkJLyogd2UgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSAoMCA8PSBkYm0gPCAzMSkgKi8KLQkJCXJldHVybiAoMzAgLSBkYm0pIC8gMjsKLQkJfQotCQlicmVhazsKLQljYXNlIEdTTV9CQU5EXzE5MDA6Ci0JCWlmIChkYm0gPj0gMzMpCi0JCQlyZXR1cm4gMzA7Ci0JCWVsc2UgaWYgKGRibSA+PSAzMikKLQkJCXJldHVybiAzMTsKLQkJZWxzZSBpZiAoZGJtID09IDMxKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgewotCQkJLyogd2UgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSAoMCA8PSBkYm0gPCAzMSkgKi8KLQkJCXJldHVybiAoMzAgLSBkYm0pIC8gMjsKLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBtc19wd3JfZGJtKGVudW0gZ3NtX2JhbmQgYmFuZCwgdWludDhfdCBsdmwpCi17Ci0JbHZsICY9IDB4MWY7Ci0KLQlzd2l0Y2ggKGJhbmQpIHsKLQljYXNlIEdTTV9CQU5EXzQ1MDoKLQljYXNlIEdTTV9CQU5EXzQ4MDoKLQljYXNlIEdTTV9CQU5EXzc1MDoKLQljYXNlIEdTTV9CQU5EXzkwMDoKLQljYXNlIEdTTV9CQU5EXzgxMDoKLQljYXNlIEdTTV9CQU5EXzg1MDoKLQkJaWYgKGx2bCA8IDIpCi0JCQlyZXR1cm4gMzk7Ci0JCWVsc2UgaWYgKGx2bCA8IDIwKQotCQkJcmV0dXJuIDM5IC0gKChsdmwgLSAyKSAqIDIpIDsKLQkJZWxzZQotCQkJcmV0dXJuIDU7Ci0JCWJyZWFrOwotCWNhc2UgR1NNX0JBTkRfMTgwMDoKLQkJaWYgKGx2bCA8IDE2KQotCQkJcmV0dXJuIDMwIC0gKGx2bCAqIDIpOwotCQllbHNlIGlmIChsdmwgPCAyOSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gMzYgLSAoKGx2bCAtIDI5KSAqIDIpOwotCQlicmVhazsKLQljYXNlIEdTTV9CQU5EXzE5MDA6Ci0JCWlmIChsdmwgPCAxNikKLQkJCXJldHVybiAzMCAtIChsdmwgKiAyKTsKLQkJZWxzZSBpZiAobHZsIDwgMzApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZWxzZQotCQkJcmV0dXJuIDMzIC0gKGx2bCAtIDMwKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKiBBY2NvcmRpbmcgdG8gVFMgMDguMDUgQ2hhcHRlciA4LjEuNCAqLwotaW50IHJ4bGV2MmRibSh1aW50OF90IHJ4bGV2KQotewotCWlmIChyeGxldiA+IDYzKQotCQlyeGxldiA9IDYzOwotCi0JcmV0dXJuIC0xMTAgKyByeGxldjsKLX0KLQotLyogQWNjb3JkaW5nIHRvIFRTIDA4LjA1IENoYXB0ZXIgOC4xLjQgKi8KLXVpbnQ4X3QgZGJtMnJ4bGV2KGludCBkYm0pCi17Ci0JaW50IHJ4bGV2ID0gZGJtICsgMTEwOwotCi0JaWYgKHJ4bGV2ID4gNjMpCi0JCXJ4bGV2ID0gNjM7Ci0JZWxzZSBpZiAocnhsZXYgPCAwKQotCQlyeGxldiA9IDA7Ci0KLQlyZXR1cm4gcnhsZXY7Ci19Ci0KLWNvbnN0IGNoYXIgKmdzbV9iYW5kX25hbWUoZW51bSBnc21fYmFuZCBiYW5kKQotewotCXN3aXRjaCAoYmFuZCkgewotCWNhc2UgR1NNX0JBTkRfNDUwOgotCQlyZXR1cm4gIkdTTTQ1MCI7Ci0JY2FzZSBHU01fQkFORF80ODA6Ci0JCXJldHVybiAiR1NNNDUwIjsKLQljYXNlIEdTTV9CQU5EXzc1MDoKLQkJcmV0dXJuICJHU003NTAiOwotCWNhc2UgR1NNX0JBTkRfODEwOgotCQlyZXR1cm4gIkdTTTgxMCI7Ci0JY2FzZSBHU01fQkFORF84NTA6Ci0JCXJldHVybiAiR1NNODUwIjsKLQljYXNlIEdTTV9CQU5EXzkwMDoKLQkJcmV0dXJuICJHU005MDAiOwotCWNhc2UgR1NNX0JBTkRfMTgwMDoKLQkJcmV0dXJuICJEQ1MxODAwIjsKLQljYXNlIEdTTV9CQU5EXzE5MDA6Ci0JCXJldHVybiAiUENTMTkwMCI7Ci0JfQotCXJldHVybiAiaW52YWxpZCI7Ci19Ci0KLWVudW0gZ3NtX2JhbmQgZ3NtX2JhbmRfcGFyc2UoY29uc3QgY2hhciogbWh6KQotewotCXdoaWxlICgqbWh6ICYmICFpc2RpZ2l0KCptaHopKQotCQltaHorKzsKLQotCWlmICgqbWh6ID09ICdcMCcpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChzdHJ0b2wobWh6LCBOVUxMLCAxMCkpIHsKLQljYXNlIDQ1MDoKLQkJcmV0dXJuIEdTTV9CQU5EXzQ1MDsKLQljYXNlIDQ4MDoKLQkJcmV0dXJuIEdTTV9CQU5EXzQ4MDsKLQljYXNlIDc1MDoKLQkJcmV0dXJuIEdTTV9CQU5EXzc1MDsKLQljYXNlIDgxMDoKLQkJcmV0dXJuIEdTTV9CQU5EXzgxMDsKLQljYXNlIDg1MDoKLQkJcmV0dXJuIEdTTV9CQU5EXzg1MDsKLQljYXNlIDkwMDoKLQkJcmV0dXJuIEdTTV9CQU5EXzkwMDsKLQljYXNlIDE4MDA6Ci0JCXJldHVybiBHU01fQkFORF8xODAwOwotCWNhc2UgMTkwMDoKLQkJcmV0dXJuIEdTTV9CQU5EXzE5MDA7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotfQotCi0KLSNpZmRlZiBIQVZFX0VYRUNJTkZPX0gKLSNpbmNsdWRlIDxleGVjaW5mby5oPgotdm9pZCBnZW5lcmF0ZV9iYWNrdHJhY2UoKQotewotCWludCBpLCBucHRyczsKLQl2b2lkICpidWZmZXJbMTAwXTsKLQljaGFyICoqc3RyaW5nczsKLQotCW5wdHJzID0gYmFja3RyYWNlKGJ1ZmZlciwgQVJSQVlfU0laRShidWZmZXIpKTsKLQlwcmludGYoImJhY2t0cmFjZSgpIHJldHVybmVkICVkIGFkZHJlc3Nlc1xuIiwgbnB0cnMpOwotCi0Jc3RyaW5ncyA9IGJhY2t0cmFjZV9zeW1ib2xzKGJ1ZmZlciwgbnB0cnMpOwotCWlmICghc3RyaW5ncykKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMTsgaSA8IG5wdHJzOyBpKyspCi0JCXByaW50ZigiJXNcbiIsIHN0cmluZ3NbaV0pOwotCi0JZnJlZShzdHJpbmdzKTsKLX0KLSNlbmRpZgotCi1lbnVtIGdzbV9iYW5kIGdzbV9hcmZjbjJiYW5kKHVpbnQxNl90IGFyZmNuKQotewotCWlmIChhcmZjbiAmIEFSRkNOX1BDUykKLQkJcmV0dXJuIEdTTV9CQU5EXzE5MDA7Ci0JZWxzZSBpZiAoYXJmY24gPD0gMTI0KQotCQlyZXR1cm4gR1NNX0JBTkRfOTAwOwotCWVsc2UgaWYgKGFyZmNuID49IDk1NSAmJiBhcmZjbiA8PSAxMDIzKQotCQlyZXR1cm4gR1NNX0JBTkRfOTAwOwotCWVsc2UgaWYgKGFyZmNuID49IDEyOCAmJiBhcmZjbiA8PSAyNTEpCi0JCXJldHVybiBHU01fQkFORF84NTA7Ci0JZWxzZSBpZiAoYXJmY24gPj0gNTEyICYmIGFyZmNuIDw9IDg4NSkKLQkJcmV0dXJuIEdTTV9CQU5EXzE4MDA7Ci0JZWxzZSBpZiAoYXJmY24gPj0gMjU5ICYmIGFyZmNuIDw9IDI5MykKLQkJcmV0dXJuIEdTTV9CQU5EXzQ1MDsKLQllbHNlIGlmIChhcmZjbiA+PSAzMDYgJiYgYXJmY24gPD0gMzQwKQotCQlyZXR1cm4gR1NNX0JBTkRfNDgwOwotCWVsc2UgaWYgKGFyZmNuID49IDM1MCAmJiBhcmZjbiA8PSA0MjUpCi0JCXJldHVybiBHU01fQkFORF84MTA7Ci0JZWxzZSBpZiAoYXJmY24gPj0gNDM4ICYmIGFyZmNuIDw9IDUxMSkKLQkJcmV0dXJuIEdTTV9CQU5EXzc1MDsKLQllbHNlCi0JCXJldHVybiBHU01fQkFORF8xODAwOwotfQotCi0vKiBDb252ZXJ0IGFuIEFSRkNOIHRvIHRoZSBmcmVxdWVuY3kgaW4gTUh6ICogMTAgKi8KLXVpbnQxNl90IGdzbV9hcmZjbjJmcmVxMTAodWludDE2X3QgYXJmY24sIGludCB1cGxpbmspCi17Ci0JdWludDE2X3QgZnJlcTEwX3VsOwotCXVpbnQxNl90IGZyZXExMF9kbDsKLQotCWlmIChhcmZjbiAmIEFSRkNOX1BDUykgewotCQkvKiBEQ1MgMTkwMCAqLwotCQlhcmZjbiAmPSB+QVJGQ05fUENTOwotCQlmcmVxMTBfdWwgPSAxODUwMiArIDIgKiAoYXJmY24tNTEyKTsKLQkJZnJlcTEwX2RsID0gZnJlcTEwX3VsICsgODAwOwotCX0gZWxzZSBpZiAoYXJmY24gPD0gMTI0KSB7Ci0JCS8qIFByaW1hcnkgR1NNICsgQVJGQ04gMCBvZiBFLUdTTSAqLwotCQlmcmVxMTBfdWwgPSA4OTAwICsgMiAqIGFyZmNuOwotCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyA0NTA7Ci0JfSBlbHNlIGlmIChhcmZjbiA+PSA5NTUgJiYgYXJmY24gPD0gMTAyMykgewotCQkvKiBFLUdTTSBhbmQgUi1HU00gKi8KLQkJZnJlcTEwX3VsID0gODkwMCArIDIgKiAoYXJmY24gLSAxMDI0KTsKLQkJZnJlcTEwX2RsID0gZnJlcTEwX3VsICsgNDUwOwotCX0gZWxzZSBpZiAoYXJmY24gPj0gMTI4ICYmIGFyZmNuIDw9IDI1MSkgewotCQkvKiBHU00gODUwICovCi0JCWZyZXExMF91bCA9IDgyNDIgKyAyICogKGFyZmNuIC0gMTI4KTsKLQkJZnJlcTEwX2RsID0gZnJlcTEwX3VsICsgNDUwOwotCX0gZWxzZSBpZiAoYXJmY24gPj0gNTEyICYmIGFyZmNuIDw9IDg4NSkgewotCQkvKiBEQ1MgMTgwMCAqLwotCQlmcmVxMTBfdWwgPSAxNzEwMiArIDIgKiAoYXJmY24gLSA1MTIpOwotCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyA5NTA7Ci0JfSBlbHNlIGlmIChhcmZjbiA+PSAyNTkgJiYgYXJmY24gPD0gMjkzKSB7Ci0JCS8qIEdTTSA0NTAgKi8KLQkJZnJlcTEwX3VsID0gNDUwNiArIDIgKiAoYXJmY24gLSAyNTkpOwotCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyAxMDA7Ci0JfSBlbHNlIGlmIChhcmZjbiA+PSAzMDYgJiYgYXJmY24gPD0gMzQwKSB7Ci0JCS8qIEdTTSA0ODAgKi8KLQkJZnJlcTEwX3VsID0gNDc5MCArIDIgKiAoYXJmY24gLSAzMDYpOwotCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyAxMDA7Ci0JfSBlbHNlIGlmIChhcmZjbiA+PSAzNTAgJiYgYXJmY24gPD0gNDI1KSB7Ci0JCS8qIEdTTSA4MTAgKi8KLQkJZnJlcTEwX3VsID0gODA2MCArIDIgKiAoYXJmY24gLSAzNTApOwotCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyA0NTA7Ci0JfSBlbHNlIGlmIChhcmZjbiA+PSA0MzggJiYgYXJmY24gPD0gNTExKSB7Ci0JCS8qIEdTTSA3NTAgKi8KLQkJZnJlcTEwX3VsID0gNzQ3MiArIDIgKiAoYXJmY24gLSA0MzgpOwotCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyAzMDA7Ci0JfSBlbHNlCi0JCXJldHVybiAweGZmZmY7Ci0KLQlpZiAodXBsaW5rKQotCQlyZXR1cm4gZnJlcTEwX3VsOwotCWVsc2UKLQkJcmV0dXJuIGZyZXExMF9kbDsKLX0KLQotdm9pZCBnc21fZm4yZ3NtdGltZShzdHJ1Y3QgZ3NtX3RpbWUgKnRpbWUsIHVpbnQzMl90IGZuKQotewotCXRpbWUtPmZuID0gZm47Ci0JdGltZS0+dDEgPSB0aW1lLT5mbiAvICgyNio1MSk7Ci0JdGltZS0+dDIgPSB0aW1lLT5mbiAlIDI2OwotCXRpbWUtPnQzID0gdGltZS0+Zm4gJSA1MTsKLQl0aW1lLT50YyA9ICh0aW1lLT5mbiAvIDUxKSAlIDg7Ci19Ci0KLXVpbnQzMl90IGdzbV9nc210aW1lMmZuKHN0cnVjdCBnc21fdGltZSAqdGltZSkKLXsKLQkvKiBUUyAwNS4wMiBDaGFwdGVyIDQuMy4zIFRETUEgZnJhbWUgbnVtYmVyICovCi0JcmV0dXJuICg1MSAqICgodGltZS0+dDMgLSB0aW1lLT50MiArIDI2KSAlIDI2KSArIHRpbWUtPnQzICsgKDI2ICogNTEgKiB0aW1lLT50MSkpOwotfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL21zZ2IuYyBiL2xpYm9zbW9jb3JlL3NyYy9tc2diLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWYzNzMuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvc3JjL21zZ2IuYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+Ci0vLyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+Ci0vLyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+Ci0KLXZvaWQgKnRhbGxfbXNnYl9jdHg7Ci0KLXN0cnVjdCBtc2diICptc2diX2FsbG9jKHVpbnQxNl90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IG1zZ2IgKm1zZzsKLQotCW1zZyA9IF90YWxsb2NfemVybyh0YWxsX21zZ2JfY3R4LCBzaXplb2YoKm1zZykgKyBzaXplLCBuYW1lKTsKLQotCWlmICghbXNnKSB7Ci0JCS8vTE9HUChEUlNMLCBMT0dMX0ZBVEFMLCAidW5hYmxlIHRvIGFsbG9jYXRlIG1zZ2JcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQltc2ctPmRhdGFfbGVuID0gc2l6ZTsKLQltc2ctPmxlbiA9IDA7Ci0JbXNnLT5kYXRhID0gbXNnLT5fZGF0YTsKLQltc2ctPmhlYWQgPSBtc2ctPl9kYXRhOwotCW1zZy0+dGFpbCA9IG1zZy0+X2RhdGE7Ci0KLQlyZXR1cm4gbXNnOwotfQotCi12b2lkIG1zZ2JfZnJlZShzdHJ1Y3QgbXNnYiAqbSkKLXsKLQl0YWxsb2NfZnJlZShtKTsKLX0KLQotdm9pZCBtc2diX2VucXVldWUoc3RydWN0IGxsaXN0X2hlYWQgKnF1ZXVlLCBzdHJ1Y3QgbXNnYiAqbXNnKQotewotCWxsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsIHF1ZXVlKTsKLX0KLQotc3RydWN0IG1zZ2IgKm1zZ2JfZGVxdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUpCi17Ci0Jc3RydWN0IGxsaXN0X2hlYWQgKmxoOwotCi0JaWYgKGxsaXN0X2VtcHR5KHF1ZXVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlsaCA9IHF1ZXVlLT5uZXh0OwotCWxsaXN0X2RlbChsaCk7Ci0JCi0JcmV0dXJuIGxsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgbXNnYiwgbGlzdCk7Ci19Ci0KLXZvaWQgbXNnYl9yZXNldChzdHJ1Y3QgbXNnYiAqbXNnKQotewotCW1zZy0+bGVuID0gMDsKLQltc2ctPmRhdGEgPSBtc2ctPl9kYXRhOwotCW1zZy0+aGVhZCA9IG1zZy0+X2RhdGE7Ci0JbXNnLT50YWlsID0gbXNnLT5fZGF0YTsKLQotCW1zZy0+YnRzX2xpbmsgPSBOVUxMOwotCW1zZy0+dHJ4ID0gTlVMTDsKLQltc2ctPmxjaGFuID0gTlVMTDsKLQltc2ctPmwyaCA9IE5VTEw7Ci0JbXNnLT5sM2ggPSBOVUxMOwotCW1zZy0+c21zaCA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvcnNsLmMgYi9saWJvc21vY29yZS9zcmMvcnNsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMDJkMzMuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvc3JjL3JzbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKLSAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCi0KLS8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KLSNpbmNsdWRlIDxvc21vY29yZS9yc2wuaD4KLQotI2RlZmluZSBSU0xfQUxMT0NfU0laRQkJMjAwCi0jZGVmaW5lIFJTTF9BTExPQ19IRUFEUk9PTQk1NgotCi12b2lkIHJzbF9pbml0X3JsbF9oZHIoc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKmRoLCB1aW50OF90IG1zZ190eXBlKQotewotCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX1JMTDsKLQlkaC0+Yy5tc2dfdHlwZSA9IG1zZ190eXBlOwotCWRoLT5pZV9jaGFuID0gUlNMX0lFX0NIQU5fTlI7Ci0JZGgtPmllX2xpbmtfaWQgPSBSU0xfSUVfTElOS19JREVOVDsKLX0KLQotY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIHJzbF9hdHRfdGx2ZGVmID0gewotCS5kZWYgPSB7Ci0JCVtSU0xfSUVfQ0hBTl9OUl0JCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX0xJTktfSURFTlRdCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9BQ1RfVFlQRV0JCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX0JTX1BPV0VSXQkJPSB7IFRMVl9UWVBFX1RWIH0sCi0JCVtSU0xfSUVfQ0hBTl9JREVOVF0JCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW1JTTF9JRV9DSEFOX01PREVdCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfRU5DUl9JTkZPXQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX0ZSQU1FX05VTUJFUl0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAotCQlbUlNMX0lFX0hBTkRPX1JFRl0JCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX0wxX0lORk9dCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKLQkJW1JTTF9JRV9MM19JTkZPXQkJPSB7IFRMVl9UWVBFX1RMMTZWIH0sCi0JCVtSU0xfSUVfTVNfSURFTlRJVFldCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfTVNfUE9XRVJdCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9QQUdJTkdfR1JPVVBdCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9QQUdJTkdfTE9BRF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAotCQlbUlNMX0lFX1BZSFNfQ09OVEVYVF0JCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW1JTTF9JRV9BQ0NFU1NfREVMQVldCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9SQUNIX0xPQURdCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfUkVRX1JFRkVSRU5DRV0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMyB9LAotCQlbUlNMX0lFX1JFTEVBU0VfTU9ERV0JCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX1JFU09VUkNFX0lORk9dCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfUkxNX0NBVVNFXQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX1NUQVJUTkdfVElNRV0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAotCQlbUlNMX0lFX1RJTUlOR19BRFZBTkNFXQkJPSB7IFRMVl9UWVBFX1RWIH0sCi0JCVtSU0xfSUVfVVBMSU5LX01FQVNdCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfQ0FVU0VdCQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX01FQVNfUkVTX05SXQkJPSB7IFRMVl9UWVBFX1RWIH0sCi0JCVtSU0xfSUVfTVNHX0lEXQkJCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX1NZU0lORk9fVFlQRV0JCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX01TX1BPV0VSX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX0JTX1BPV0VSX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX1BSRVBST0NfUEFSQU1dCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfUFJFUFJPQ19NRUFTXQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX0lNTV9BU1NfSU5GT10JCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW1JTTF9JRV9TTVNDQl9JTkZPXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyMyB9LAotCQlbUlNMX0lFX01TX1RJTUlOR19PRkZTRVRdCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX0VSUl9NU0ddCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfRlVMTF9CQ0NIX0lORk9dCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfQ0hBTl9ORUVERURdCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9DQl9DTURfVFlQRV0JCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX1NNU0NCX01TR10JCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW1JTTF9JRV9GVUxMX0lNTV9BU1NfSU5GT10JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX1NBQ0NIX0lORk9dCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfQ0JDSF9MT0FEX0lORk9dCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9TTVNDQl9DSEFOX0lORElDQVRPUl0JPSB7IFRMVl9UWVBFX1RWIH0sCi0JCVtSU0xfSUVfR1JPVVBfQ0FMTF9SRUZdCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfQ0hBTl9ERVNDXQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX05DSF9EUlhfSU5GT10JCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW1JTTF9JRV9DTURfSU5ESUNBVE9SXQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX0VNTFBQX1BSSU9dCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9VSUNdCQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX01BSU5fQ0hBTl9SRUZdCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9NUl9DT05GSUddCQk9IHsgVExWX1RZUEVfVExWIH0sCi0JCVtSU0xfSUVfTVJfQ09OVFJPTF0JCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX1NVUF9DT0RFQ19UWVBFU10JPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX0NPREVDX0NPTkZJR10JCT0geyBUTFZfVFlQRV9UTFYgfSwKLQkJW1JTTF9JRV9SVERdCQkJPSB7IFRMVl9UWVBFX1RWIH0sCi0JCVtSU0xfSUVfVEZPX1NUQVRVU10JCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX0xMUF9BUERVXQkJPSB7IFRMVl9UWVBFX1RMViB9LAotCQlbUlNMX0lFX1NJRU1FTlNfTVJQQ0ldCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9JUEFDX1BST1hZX1VEUF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAotCQlbUlNMX0lFX0lQQUNfQlNDTVBMX1RPVVRdCT0geyBUTFZfVFlQRV9UViB9LAotCQlbUlNMX0lFX0lQQUNfUkVNT1RFX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCi0JCVtSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVF0JPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCi0JCVtSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRF0JPSB7IFRMVl9UWVBFX1RWIH0sCi0JCVtSU0xfSUVfSVBBQ19MT0NBTF9QT1JUXQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKLQkJW1JTTF9JRV9JUEFDX1NQRUVDSF9NT0RFXQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9JUEFDX0xPQ0FMX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCi0JCVtSU0xfSUVfSVBBQ19DT05OX0lEXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCi0JCVtSU0xfSUVfSVBBQ19SVFBfQ1NEX0ZNVF0JPSB7IFRMVl9UWVBFX1RWIH0sCi0JCVtSU0xfSUVfSVBBQ19SVFBfSklUX0JVRl0JPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCi0JCVtSU0xfSUVfSVBBQ19SVFBfQ09NUFJdCQk9IHsgVExWX1RZUEVfVFYgfSwKLQkJW1JTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMl0JPSB7IFRMVl9UWVBFX1RWIH0sCi0JCVtSU0xfSUVfSVBBQ19SVFBfTVBMRVhdCQk9IHsgVExWX1RZUEVfRklYRUQsIDggfSwKLQkJW1JTTF9JRV9JUEFDX1JUUF9NUExFWF9JRF0JPSB7IFRMVl9UWVBFX1RWIH0sCi0JfSwKLX07Ci0KLS8qIGVuY29kZSBjaGFubmVsIG51bWJlciBhcyBwZXIgU2VjdGlvbiA5LjMuMSAqLwotdWludDhfdCByc2xfZW5jX2NoYW5fbnIodWludDhfdCB0eXBlLCB1aW50OF90IHN1YmNoLCB1aW50OF90IHRpbWVzbG90KQotewotCXVpbnQ4X3QgcmV0OwotCi0JcmV0ID0gKHRpbWVzbG90ICYgMHgwNykgfCB0eXBlOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBSU0xfQ0hBTl9MbV9BQ0NIczoKLQkJc3ViY2ggJj0gMHgwMTsKLQkJYnJlYWs7Ci0JY2FzZSBSU0xfQ0hBTl9TRENDSDRfQUNDSDoKLQkJc3ViY2ggJj0gMHgwMzsKLQkJYnJlYWs7Ci0JY2FzZSBSU0xfQ0hBTl9TRENDSDhfQUNDSDoKLQkJc3ViY2ggJj0gMHgwNzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogbm8gc3ViY2hhbm5lbHMgYWxsb3dlZCAqLwotCQlzdWJjaCA9IDB4MDA7Ci0JCWJyZWFrOwotCX0KLQlyZXQgfD0gKHN1YmNoIDw8IDMpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJzbF9kZWNfY2hhbl9ucih1aW50OF90IGNoYW5fbnIsIHVpbnQ4X3QgKnR5cGUsIHVpbnQ4X3QgKnN1YmNoLCB1aW50OF90ICp0aW1lc2xvdCkKLXsKLQkqdGltZXNsb3QgPSBjaGFuX25yICYgMHg3OwotCi0JaWYgKChjaGFuX25yICYgMHhmOCkgPT0gUlNMX0NIQU5fQm1fQUNDSHMpIHsKLQkJKnR5cGUgPSBSU0xfQ0hBTl9CbV9BQ0NIczsKLQkJKnN1YmNoID0gMDsKLQl9IGVsc2UgaWYgKChjaGFuX25yICYgMHhmMCkgPT0gUlNMX0NIQU5fTG1fQUNDSHMpIHsKLQkJKnR5cGUgPSBSU0xfQ0hBTl9MbV9BQ0NIczsKLQkJKnN1YmNoID0gKGNoYW5fbnIgPj4gMykgJiAweDE7Ci0JfSBlbHNlIGlmICgoY2hhbl9uciAmIDB4ZTApID09IFJTTF9DSEFOX1NEQ0NINF9BQ0NIKSB7Ci0JCSp0eXBlID0gUlNMX0NIQU5fU0RDQ0g0X0FDQ0g7Ci0JCSpzdWJjaCA9IChjaGFuX25yID4+IDMpICYgMHgzOwotCX0gZWxzZSBpZiAoKGNoYW5fbnIgJiAweGMwKSA9PSBSU0xfQ0hBTl9TRENDSDhfQUNDSCkgewotCQkqdHlwZSA9IFJTTF9DSEFOX1NEQ0NIOF9BQ0NIOwotCQkqc3ViY2ggPSAoY2hhbl9uciA+PiAzKSAmIDB4NzsKLQl9IGVsc2UgaWYgKChjaGFuX25yICYgMHhmOCkgPT0gUlNMX0NIQU5fQkNDSCkgewotCQkqdHlwZSA9IFJTTF9DSEFOX0JDQ0g7Ci0JCSpzdWJjaCA9IDA7Ci0JfSBlbHNlIGlmICgoY2hhbl9uciAmIDB4ZjgpID09IFJTTF9DSEFOX1JBQ0gpIHsKLQkJKnR5cGUgPSBSU0xfQ0hBTl9SQUNIOwotCQkqc3ViY2ggPSAwOwotCX0gZWxzZSBpZiAoKGNoYW5fbnIgJiAweGY4KSA9PSBSU0xfQ0hBTl9QQ0hfQUdDSCkgewotCQkqdHlwZSA9IFJTTF9DSEFOX1BDSF9BR0NIOwotCQkqc3ViY2ggPSAwOwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyByc2xfZXJyX3ZhbHNbXSA9IHsKLQl7IFJTTF9FUlJfUkFESU9fSUZfRkFJTCwJIlJhZGlvIEludGVyZmFjZSBGYWlsdXJlIiB9LAotCXsgUlNMX0VSUl9SQURJT19MSU5LX0ZBSUwsCSJSYWRpbyBMaW5rIEZhaWx1cmUiIH0sCi0JeyBSU0xfRVJSX0hBTkRPVkVSX0FDQ19GQUlMLAkiSGFuZG92ZXIgQWNjZXNzIEZhaWx1cmUiIH0sCi0JeyBSU0xfRVJSX1RBTEtFUl9BQ0NfRkFJTCwJIlRhbGtlciBBY2Nlc3MgRmFpbHVyZSIgfSwKLQl7IFJTTF9FUlJfT01fSU5URVJWRU5USU9OLAkiTyZNIEludGVydmVudGlvbiIgfSwKLQl7IFJTTF9FUlJfTk9STUFMX1VOU1BFQywJIk5vcm1hbCBldmVudCwgdW5zcGVjaWZpZWQiIH0sCi0JeyBSU0xfRVJSX1RfTVNSRlBDSV9FWFAsCSJTaWVtZW5zOiBUX01TUkZQQ0kgRXhwaXJlZCIgfSwKLQl7IFJTTF9FUlJfRVFVSVBNRU5UX0ZBSUwsCSJFcXVpcG1lbnQgRmFpbHVyZSIgfSwKLQl7IFJTTF9FUlJfUlJfVU5BVkFJTCwJCSJSYWRpbyBSZXNvdXJjZSBub3QgYXZhaWxhYmxlIiB9LAotCXsgUlNMX0VSUl9URVJSX0NIX0ZBSUwsCQkiVGVycmVzdHJpYWwgQ2hhbm5lbCBGYWlsdXJlIiB9LAotCXsgUlNMX0VSUl9DQ0NIX09WRVJMT0FELAkiQ0NDSCBPdmVybG9hZCIgfSwKLQl7IFJTTF9FUlJfQUNDSF9PVkVSTE9BRCwJIkFDQ0ggT3ZlcmxvYWQiIH0sCi0JeyBSU0xfRVJSX1BST0NFU1NPUl9PVkVSTE9BRCwJIlByb2Nlc3NvciBPdmVybG9hZCIgfSwKLQl7IFJTTF9FUlJfUkVTX1VOQVZBSUwsCQkiUmVzb3VyY2Ugbm90IGF2YWlsYWJsZSwgdW5zcGVjaWZpZWQiIH0sCi0JeyBSU0xfRVJSX1RSQU5TQ19VTkFWQUlMLAkiVHJhbnNjb2Rpbmcgbm90IGF2YWlsYWJsZSIgfSwKLQl7IFJTTF9FUlJfU0VSVl9PUFRfVU5BVkFJTCwJIlNlcnZpY2Ugb3IgT3B0aW9uIG5vdCBhdmFpbGFibGUiIH0sCi0JeyBSU0xfRVJSX0VOQ1JfVU5JTVBMLAkJIkVuY3J5cHRpb24gYWxnb3JpdGhtIG5vdCBpbXBsZW1lbnRlZCIgfSwKLQl7IFJTTF9FUlJfU0VSVl9PUFRfVU5JTVBMLAkiU2VydmljZSBvciBPcHRpb24gbm90IGltcGxlbWVudGVkIiB9LAotCXsgUlNMX0VSUl9SQ0hfQUxSX0FDVFZfQUxMT0MsCSJSYWRpbyBjaGFubmVsIGFscmVhZHkgYWN0aXZhdGVkIiB9LAotCXsgUlNMX0VSUl9JTlZBTElEX01FU1NBR0UsCSJJbnZhbGlkIE1lc3NhZ2UsIHVuc3BlY2lmaWVkIiB9LAotCXsgUlNMX0VSUl9NU0dfRElTQ1IsCQkiTWVzc2FnZSBEaXNjcmltaW5hdG9yIEVycm9yIiB9LAotCXsgUlNMX0VSUl9NU0dfVFlQRSwJCSJNZXNzYWdlIFR5cGUgRXJyb3IiIH0sCi0JeyBSU0xfRVJSX01TR19TRVEsCQkiTWVzc2FnZSBTZXF1ZW5jZSBFcnJvciIgfSwKLQl7IFJTTF9FUlJfSUVfRVJST1IsCQkiR2VuZXJhbCBJRSBlcnJvciIgfSwKLQl7IFJTTF9FUlJfTUFORF9JRV9FUlJPUiwJIk1hbmRhdG9yeSBJRSBlcnJvciIgfSwKLQl7IFJTTF9FUlJfT1BUX0lFX0VSUk9SLAkJIk9wdGlvbmFsIElFIGVycm9yIiB9LAotCXsgUlNMX0VSUl9JRV9OT05FWElTVCwJCSJJRSBub24tZXhpc3RlbnQiIH0sCi0JeyBSU0xfRVJSX0lFX0xFTkdUSCwJCSJJRSBsZW5ndGggZXJyb3IiIH0sCi0JeyBSU0xfRVJSX0lFX0NPTlRFTlQsCQkiSUUgY29udGVudCBlcnJvciIgfSwKLQl7IFJTTF9FUlJfUFJPVE8sCQkiUHJvdG9jb2wgZXJyb3IsIHVuc3BlY2lmaWVkIiB9LAotCXsgUlNMX0VSUl9JTlRFUldPUktJTkcsCQkiSW50ZXJ3b3JraW5nIGVycm9yLCB1bnNwZWNpZmllZCIgfSwKLQl7IDAsCQkJCU5VTEwgfQotfTsKLQotY29uc3QgY2hhciAqcnNsX2Vycl9uYW1lKHVpbnQ4X3QgZXJyKQotewotCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKHJzbF9lcnJfdmFscywgZXJyKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcnNsX3JsbV9jYXVzZV9zdHJzW10gPSB7Ci0JeyBSTExfQ0FVU0VfVDIwMF9FWFBJUkVELAkiVGltZXIgVDIwMCBleHBpcmVkIChOMjAwKzEpIHRpbWVzIiB9LAotCXsgUkxMX0NBVVNFX1JFRVNUX1JFUSwJCSJSZS1lc3RhYmxpc2htZW50IHJlcXVlc3QiIH0sCi0JeyBSTExfQ0FVU0VfVU5TT0xfVUFfUkVTUCwJIlVuc29saWNpdGVkIFVBIHJlc3BvbnNlIiB9LAotCXsgUkxMX0NBVVNFX1VOU09MX0RNX1JFU1AsCSJVbnNvbGljaXRlZCBETSByZXNwb25zZSIgfSwKLQl7IFJMTF9DQVVTRV9VTlNPTF9ETV9SRVNQX01GLAkiVW5zb2xpY2l0ZWQgRE0gcmVzcG9uc2UsIG11bHRpcGxlIGZyYW1lIiB9LAotCXsgUkxMX0NBVVNFX1VOU09MX1NQUlZfUkVTUCwJIlVuc29saWNpdGVkIHN1cGVydmlzb3J5IHJlc3BvbnNlIiB9LAotCXsgUkxMX0NBVVNFX1NFUV9FUlIsCQkiU2VxdWVuY2UgRXJyb3IiIH0sCi0JeyBSTExfQ0FVU0VfVUZSTV9JTkNfUEFSQU0sCSJVLUZyYW1lIHdpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMiIH0sCi0JeyBSTExfQ0FVU0VfU0ZSTV9JTkNfUEFSQU0sCSJTLUZyYW1lIHdpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMiIH0sCi0JeyBSTExfQ0FVU0VfSUZSTV9JTkNfTUJJVFMsCSJJLUZyYW1lIHdpdGggaW5jb3JyZWN0IHVzZSBvZiBNIGJpdCIgfSwKLQl7IFJMTF9DQVVTRV9JRlJNX0lOQ19MRU4sCSJJLUZyYW1lIHdpdGggaW5jb3JyZWN0IGxlbmd0aCIgfSwKLQl7IFJMTF9DQVVTRV9GUk1fVU5JTVBMLAkJIkZyYWVtZSBub3QgaW1wbGVtZW50ZWQiIH0sCi0JeyBSTExfQ0FVU0VfU0FCTV9NRiwJCSJTQUJNIGNvbW1hbmQsIG11bHRpcGxlIGZyYW1lIGVzdGFibGlzaGVkIHN0YXRlIiB9LAotCXsgUkxMX0NBVVNFX1NBQk1fSU5GT19OT1RBTEwsCSJTQUJNIGZyYW1lIHdpdGggaW5mb3JtYXRpb24gbm90IGFsbG93ZWQgaW4gdGhpcyBzdGF0ZSIgfSwKLQl7IDAsCQkJCU5VTEwgfSwKLX07Ci0KLWNvbnN0IGNoYXIgKnJzbF9ybG1fY2F1c2VfbmFtZSh1aW50OF90IGVycikKLXsKLQlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhyc2xfcmxtX2NhdXNlX3N0cnMsIGVycik7Ci19Ci0KLS8qIFNlY3Rpb24gMy4zLjIuMyBUUyAwNS4wMi4gSSB0aGluayB0aGlzIGxvb2tzIGxpa2UgYSB0YWJsZSAqLwotaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NfY2hhbnMoaW50IGNjY2hfY29uZikKLXsKLQlzd2l0Y2ggKGNjY2hfY29uZikgewotCWNhc2UgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfTkM6Ci0JCXJldHVybiAxOwotCWNhc2UgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQzoKLQkJcmV0dXJuIDE7Ci0JY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfMl9OQzoKLQkJcmV0dXJuIDI7Ci0JY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfM19OQzoKLQkJcmV0dXJuIDM7Ci0JY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfNF9OQzoKLQkJcmV0dXJuIDQ7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotLyogU2VjdGlvbiAzLjMuMi4zIFRTIDA1LjAyICovCi1pbnQgcnNsX2NjY2hfY29uZl90b19ic19jY2NoX3NkY2NoX2NvbWIoaW50IGNjY2hfY29uZikKLXsKLQlzd2l0Y2ggKGNjY2hfY29uZikgewotCWNhc2UgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfTkM6Ci0JCXJldHVybiAwOwotCWNhc2UgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQzoKLQkJcmV0dXJuIDE7Ci0JY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfMl9OQzoKLQkJcmV0dXJuIDA7Ci0JY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfM19OQzoKLQkJcmV0dXJuIDA7Ci0JY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfNF9OQzoKLQkJcmV0dXJuIDA7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotLyogUHVzaCBhIFJTTCBSTEwgaGVhZGVyIHdpdGggTDNfSU5GTyBJRSAqLwotdm9pZCByc2xfcmxsX3B1c2hfbDMoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBtc2dfdHlwZSwgdWludDhfdCBjaGFuX25yLAotCQkgICAgIHVpbnQ4X3QgbGlua19pZCwgaW50IHRyYW5zcGFyZW50KQotewotCXVpbnQ4X3QgbDNfbGVuID0gbXNnLT50YWlsIC0gKHVpbnQ4X3QgKiltc2diX2wzKG1zZyk7Ci0Jc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJoOwotCi0JLyogY29uc3RydWN0IGEgUlNMbXMgUkxMIG1lc3NhZ2UgKERBVEEgSU5ESUNBVElPTiwgVU5JVCBEQVRBCi0JICogSU5ESUNBVElPTikgYW5kIHNlbmQgaXQgb2ZmIHZpYSBSU0xtcyAqLwotCi0JLyogUHVzaCB0aGUgTDMgSUUgdGFnIGFuZCBsZW5naCAqLwotCW1zZ2JfdHYxNl9wdXNoKG1zZywgUlNMX0lFX0wzX0lORk8sIGwzX2xlbik7Ci0KLQkvKiBUaGVuIHB1c2ggdGhlIFJTTCBoZWFkZXIgKi8KLQlyaCA9IChzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKnJoKSk7Ci0JcnNsX2luaXRfcmxsX2hkcihyaCwgbXNnX3R5cGUpOwotCWlmICh0cmFuc3BhcmVudCkKLQkJcmgtPmMubXNnX2Rpc2NyIHw9IEFCSVNfUlNMX01ESVNDX1RSQU5TUDsKLQlyaC0+Y2hhbl9uciA9IGNoYW5fbnI7Ci0JcmgtPmxpbmtfaWQgPSBsaW5rX2lkOwotCi0JLyogc2V0IHRoZSBsMiBoZWFkZXIgcG9pbnRlciAqLwotCW1zZy0+bDJoID0gKHVpbnQ4X3QgKilyaDsKLX0KLQotc3RydWN0IG1zZ2IgKnJzbF9ybGxfc2ltcGxlKHVpbnQ4X3QgbXNnX3R5cGUsIHVpbnQ4X3QgY2hhbl9uciwKLQkJCSAgICB1aW50OF90IGxpbmtfaWQsIGludCB0cmFuc3BhcmVudCkKLXsKLQlzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqcmg7Ci0Jc3RydWN0IG1zZ2IgKm1zZzsKLQotCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oUlNMX0FMTE9DX1NJWkUrUlNMX0FMTE9DX0hFQURST09NLAotCQkJCSAgUlNMX0FMTE9DX0hFQURST09NLCAicnNsX3JsbF9zaW1wbGUiKTsKLQotCWlmICghbXNnKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHB1dCB0aGUgUlNMIGhlYWRlciAqLwotCXJoID0gKHN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpyaCkpOwotCXJzbF9pbml0X3JsbF9oZHIocmgsIG1zZ190eXBlKTsKLQlpZiAodHJhbnNwYXJlbnQpCi0JCXJoLT5jLm1zZ19kaXNjciB8PSBBQklTX1JTTF9NRElTQ19UUkFOU1A7Ci0JcmgtPmNoYW5fbnIgPSBjaGFuX25yOwotCXJoLT5saW5rX2lkID0gbGlua19pZDsKLQotCS8qIHNldCB0aGUgbDIgaGVhZGVyIHBvaW50ZXIgKi8KLQltc2ctPmwyaCA9ICh1aW50OF90ICopcmg7Ci0KLQlyZXR1cm4gbXNnOwotfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3J4bGV2X3N0YXQuYyBiL2xpYm9zbW9jb3JlL3NyYy9yeGxldl9zdGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZmQ2NzkuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvc3JjL3J4bGV2X3N0YXQuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qIFJ4IExldmVsIHN0YXRpc3RpY3MgKi8KLQotLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgotI2luY2x1ZGUgPG9zbW9jb3JlL3J4bGV2X3N0YXQuaD4KLQotaW50IGJpdHZlY19maW5kX2JpdF9wb3MoY29uc3Qgc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCBuLCBlbnVtIGJpdF92YWx1ZSB2YWwpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSBuOyBpIDwgYnYtPmRhdGFfbGVuKjg7IGkrKykgewotCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSA9PSB2YWwpCi0JCQlyZXR1cm4gaTsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXZvaWQgcnhsZXZfc3RhdF9pbnB1dChzdHJ1Y3QgcnhsZXZfc3RhdHMgKnN0LCB1aW50MTZfdCBhcmZjbiwgdWludDhfdCByeGxldikKLXsKLQlzdHJ1Y3QgYml0dmVjIGJ2OwotCi0JaWYgKHJ4bGV2ID49IE5VTV9SWExFVlMpCi0JCXJ4bGV2ID0gTlVNX1JYTEVWUy0xOwotCi0JYnYuZGF0YV9sZW4gPSBOVU1fQVJGQ05TLzg7Ci0JYnYuZGF0YSA9IHN0LT5yeGxldl9idWNrZXRzW3J4bGV2XTsKLQotCWJpdHZlY19zZXRfYml0X3BvcygmYnYsIGFyZmNuLCBPTkUpOwotfQotCi0vKiBnZXQgdGhlIG5leHQgQVJGQ04gdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBSeGxldiAqLwotaW50MTZfdCByeGxldl9zdGF0X2dldF9uZXh0KGNvbnN0IHN0cnVjdCByeGxldl9zdGF0cyAqc3QsIHVpbnQ4X3QgcnhsZXYsIGludDE2X3QgYXJmY24pCi17Ci0Jc3RydWN0IGJpdHZlYyBidjsKLQotCWlmIChyeGxldiA+PSBOVU1fUlhMRVZTKQotCQlyeGxldiA9IE5VTV9SWExFVlMtMTsKLQotCWJ2LmRhdGFfbGVuID0gTlVNX0FSRkNOUy84OwotCi0JaWYgKGFyZmNuIDwgMCkKLQkJYXJmY24gPSAtMTsKLQotCWJ2LmRhdGEgPSBzdC0+cnhsZXZfYnVja2V0c1tyeGxldl07Ci0KLQlyZXR1cm4gYml0dmVjX2ZpbmRfYml0X3BvcygmYnYsIGFyZmNuKzEsIE9ORSk7Ci19Ci0KLXZvaWQgcnhsZXZfc3RhdF9yZXNldChzdHJ1Y3QgcnhsZXZfc3RhdHMgKnN0KQotewotCW1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpOwotfQotCi12b2lkIHJ4bGV2X3N0YXRfZHVtcChjb25zdCBzdHJ1Y3QgcnhsZXZfc3RhdHMgKnN0KQotewotCWludCBpOwotCi0JZm9yIChpID0gTlVNX1JYTEVWUy0xOyBpID49IDA7IGktLSkgewotCQlpbnQxNl90IGFyZmNuID0gLTE7Ci0KLQkJcHJpbnRmKCJBUkZDTiB3aXRoIFJ4TGV2ICV1OiAiLCBpKTsKLQkJd2hpbGUgKChhcmZjbiA9IHJ4bGV2X3N0YXRfZ2V0X25leHQoc3QsIGksIGFyZmNuKSkgPj0gMCkgewotCQkJcHJpbnRmKCIldSAiLCBhcmZjbik7Ci0JCX0KLQkJcHJpbnRmKCJcbiIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9zZWxlY3QuYyBiL2xpYm9zbW9jb3JlL3NyYy9zZWxlY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxNzc3OC4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS9zcmMvc2VsZWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyogc2VsZWN0IGZpbGVkZXNjcmlwdG9yIGhhbmRsaW5nLCB0YWtlbiBmcm9tOgotICogdXNlcnNwYWNlIGxvZ2dpbmcgZGFlbW9uIGZvciB0aGUgaXB0YWJsZXMgVUxPRyB0YXJnZXQKLSAqIG9mIHRoZSBsaW51eCAyLjQgbmV0ZmlsdGVyIHN1YnN5c3RlbS4KLSAqCi0gKiAoQykgMjAwMC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KLSNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KLSNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgotCi0jaW5jbHVkZSAiLi4vY29uZmlnLmgiCi0KLSNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAotCi1zdGF0aWMgaW50IG1heGZkID0gMDsKLXN0YXRpYyBMTElTVF9IRUFEKGJzY19mZHMpOwotc3RhdGljIGludCB1bnJlZ2lzdGVyZWRfY291bnQ7Ci0KLWludCBic2NfcmVnaXN0ZXJfZmQoc3RydWN0IGJzY19mZCAqZmQpCi17Ci0JaW50IGZsYWdzOwotCi0JLyogbWFrZSBGRCBub25ibG9ja2luZyAqLwotCWZsYWdzID0gZmNudGwoZmQtPmZkLCBGX0dFVEZMKTsKLQlpZiAoZmxhZ3MgPCAwKQotCQlyZXR1cm4gZmxhZ3M7Ci0JZmxhZ3MgfD0gT19OT05CTE9DSzsKLQlmbGFncyA9IGZjbnRsKGZkLT5mZCwgRl9TRVRGTCwgZmxhZ3MpOwotCWlmIChmbGFncyA8IDApCi0JCXJldHVybiBmbGFnczsKLQotCS8qIFJlZ2lzdGVyIEZEICovCi0JaWYgKGZkLT5mZCA+IG1heGZkKQotCQltYXhmZCA9IGZkLT5mZDsKLQotCWxsaXN0X2FkZF90YWlsKCZmZC0+bGlzdCwgJmJzY19mZHMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYnNjX3VucmVnaXN0ZXJfZmQoc3RydWN0IGJzY19mZCAqZmQpCi17Ci0JdW5yZWdpc3RlcmVkX2NvdW50Kys7Ci0JbGxpc3RfZGVsKCZmZC0+bGlzdCk7Ci19Ci0KLWludCBic2Nfc2VsZWN0X21haW4oaW50IHBvbGxpbmcpCi17Ci0Jc3RydWN0IGJzY19mZCAqdWZkLCAqdG1wOwotCWZkX3NldCByZWFkc2V0LCB3cml0ZXNldCwgZXhjZXB0c2V0OwotCWludCB3b3JrID0gMCwgcmM7Ci0Jc3RydWN0IHRpbWV2YWwgbm9fdGltZSA9IHswLCAwfTsKLQotCUZEX1pFUk8oJnJlYWRzZXQpOwotCUZEX1pFUk8oJndyaXRlc2V0KTsKLQlGRF9aRVJPKCZleGNlcHRzZXQpOwotCi0JLyogcHJlcGFyZSByZWFkIGFuZCB3cml0ZSBmZHNldHMgKi8KLQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh1ZmQsICZic2NfZmRzLCBsaXN0KSB7Ci0JCWlmICh1ZmQtPndoZW4gJiBCU0NfRkRfUkVBRCkKLQkJCUZEX1NFVCh1ZmQtPmZkLCAmcmVhZHNldCk7Ci0KLQkJaWYgKHVmZC0+d2hlbiAmIEJTQ19GRF9XUklURSkKLQkJCUZEX1NFVCh1ZmQtPmZkLCAmd3JpdGVzZXQpOwotCi0JCWlmICh1ZmQtPndoZW4gJiBCU0NfRkRfRVhDRVBUKQotCQkJRkRfU0VUKHVmZC0+ZmQsICZleGNlcHRzZXQpOwotCX0KLQotCWJzY190aW1lcl9jaGVjaygpOwotCi0JaWYgKCFwb2xsaW5nKQotCQlic2NfcHJlcGFyZV90aW1lcnMoKTsKLQlyYyA9IHNlbGVjdChtYXhmZCsxLCAmcmVhZHNldCwgJndyaXRlc2V0LCAmZXhjZXB0c2V0LCBwb2xsaW5nID8gJm5vX3RpbWUgOiBic2NfbmVhcmVzdF90aW1lcigpKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gMDsKLQotCS8qIGZpcmUgdGltZXJzICovCi0JYnNjX3VwZGF0ZV90aW1lcnMoKTsKLQotCS8qIGNhbGwgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLXJlc3RhcnQ6Ci0JdW5yZWdpc3RlcmVkX2NvdW50ID0gMDsKLQlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVmZCwgdG1wLCAmYnNjX2ZkcywgbGlzdCkgewotCQlpbnQgZmxhZ3MgPSAwOwotCi0JCWlmIChGRF9JU1NFVCh1ZmQtPmZkLCAmcmVhZHNldCkpIHsKLQkJCWZsYWdzIHw9IEJTQ19GRF9SRUFEOwotCQkJRkRfQ0xSKHVmZC0+ZmQsICZyZWFkc2V0KTsKLQkJfQotCi0JCWlmIChGRF9JU1NFVCh1ZmQtPmZkLCAmd3JpdGVzZXQpKSB7Ci0JCQlmbGFncyB8PSBCU0NfRkRfV1JJVEU7Ci0JCQlGRF9DTFIodWZkLT5mZCwgJndyaXRlc2V0KTsKLQkJfQotCi0JCWlmIChGRF9JU1NFVCh1ZmQtPmZkLCAmZXhjZXB0c2V0KSkgewotCQkJZmxhZ3MgfD0gQlNDX0ZEX0VYQ0VQVDsKLQkJCUZEX0NMUih1ZmQtPmZkLCAmZXhjZXB0c2V0KTsKLQkJfQotCi0JCWlmIChmbGFncykgewotCQkJd29yayA9IDE7Ci0JCQl1ZmQtPmNiKHVmZCwgZmxhZ3MpOwotCQl9Ci0JCS8qIHVnbHksIHVnbHkgaGFjay4gSWYgbW9yZSB0aGFuIG9uZSBmaWxlZGVzY3JpcHRvcnMgd2VyZQotCQkgKiB1bnJlZ2lzdGVyZWQsIHRoZXkgbWlnaHQgaGF2ZSBiZWVuIGNvbnNlY3V0aXZlIGFuZAotCQkgKiBsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKCkgaXMgbm8gbG9uZ2VyIHNhZmUgKi8KLQkJaWYgKHVucmVnaXN0ZXJlZF9jb3VudCA+IDEpCi0JCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCXJldHVybiB3b3JrOwotfQotCi0jZW5kaWYgLyogX0hBVkVfU1lTX1NFTEVDVF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvc2lnbmFsLmMgYi9saWJvc21vY29yZS9zcmMvc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2E4NmMuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvc3JjL3NpZ25hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyogR2VuZXJpYyBzaWduYWxsaW5nL25vdGlmaWNhdGlvbiBpbmZyYXN0cnVjdHVyZSAqLwotLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlIDxvc21vY29yZS9zaWduYWwuaD4KLSNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KLSNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi12b2lkICp0YWxsX3NpZ2hfY3R4Owotc3RhdGljIExMSVNUX0hFQUQoc2lnbmFsX2hhbmRsZXJfbGlzdCk7Ci0KLXN0cnVjdCBzaWduYWxfaGFuZGxlciB7Ci0Jc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7Ci0JdW5zaWduZWQgaW50IHN1YnN5czsKLQlzaWduYWxfY2JmbiAqY2JmbjsKLQl2b2lkICpkYXRhOwotfTsKLQotCi1pbnQgcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIodW5zaWduZWQgaW50IHN1YnN5cywgc2lnbmFsX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHNpZ25hbF9oYW5kbGVyICpzaWdfZGF0YTsKLQotCXNpZ19kYXRhID0gdGFsbG9jKHRhbGxfc2lnaF9jdHgsIHN0cnVjdCBzaWduYWxfaGFuZGxlcik7Ci0JaWYgKCFzaWdfZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1zZXQoc2lnX2RhdGEsIDAsIHNpemVvZigqc2lnX2RhdGEpKTsKLQotCXNpZ19kYXRhLT5zdWJzeXMgPSBzdWJzeXM7Ci0Jc2lnX2RhdGEtPmRhdGEgPSBkYXRhOwotCXNpZ19kYXRhLT5jYmZuID0gY2JmbjsKLQotCS8qIEZJWE1FOiBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBoYW5kbGVyIGZvciB0aGlzIHN1YnN5cy9jYmZuL2RhdGEgKi8KLQotCWxsaXN0X2FkZF90YWlsKCZzaWdfZGF0YS0+ZW50cnksICZzaWduYWxfaGFuZGxlcl9saXN0KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHVucmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIodW5zaWduZWQgaW50IHN1YnN5cywgc2lnbmFsX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHNpZ25hbF9oYW5kbGVyICpoYW5kbGVyOwotCi0JbGxpc3RfZm9yX2VhY2hfZW50cnkoaGFuZGxlciwgJnNpZ25hbF9oYW5kbGVyX2xpc3QsIGVudHJ5KSB7Ci0JCWlmIChoYW5kbGVyLT5jYmZuID09IGNiZm4gJiYgaGFuZGxlci0+ZGF0YSA9PSBkYXRhIAotCQkgICAgJiYgc3Vic3lzID09IGhhbmRsZXItPnN1YnN5cykgewotCQkJbGxpc3RfZGVsKCZoYW5kbGVyLT5lbnRyeSk7Ci0JCQl0YWxsb2NfZnJlZShoYW5kbGVyKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi0KLXZvaWQgZGlzcGF0Y2hfc2lnbmFsKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsIHZvaWQgKnNpZ25hbF9kYXRhKQotewotCXN0cnVjdCBzaWduYWxfaGFuZGxlciAqaGFuZGxlcjsKLQotCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhbmRsZXIsICZzaWduYWxfaGFuZGxlcl9saXN0LCBlbnRyeSkgewotCQlpZiAoaGFuZGxlci0+c3Vic3lzICE9IHN1YnN5cykKLQkJCWNvbnRpbnVlOwotCQkoKmhhbmRsZXItPmNiZm4pKHN1YnN5cywgc2lnbmFsLCBoYW5kbGVyLT5kYXRhLCBzaWduYWxfZGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYyBiL2xpYm9zbW9jb3JlL3NyYy9zdGF0aXN0aWNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTZhNDAuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIHV0aWxpdHkgcm91dGluZXMgZm9yIGtlZXBpbmcgc29tZSBzdGF0aXN0aWNzICovCi0KLS8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgotCi1zdGF0aWMgTExJU1RfSEVBRChjb3VudGVycyk7Ci0KLXZvaWQgKnRhbGxfY3RyX2N0eDsKLQotc3RydWN0IGNvdW50ZXIgKmNvdW50ZXJfYWxsb2MoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgY291bnRlciAqY3RyID0gdGFsbG9jX3plcm8odGFsbF9jdHJfY3R4LCBzdHJ1Y3QgY291bnRlcik7Ci0KLQlpZiAoIWN0cikKLQkJcmV0dXJuIE5VTEw7Ci0KLQljdHItPm5hbWUgPSBuYW1lOwotCWxsaXN0X2FkZF90YWlsKCZjdHItPmxpc3QsICZjb3VudGVycyk7Ci0KLQlyZXR1cm4gY3RyOwotfQotCi12b2lkIGNvdW50ZXJfZnJlZShzdHJ1Y3QgY291bnRlciAqY3RyKQotewotCWxsaXN0X2RlbCgmY3RyLT5saXN0KTsKLQl0YWxsb2NfZnJlZShjdHIpOwotfQotCi1pbnQgY291bnRlcnNfZm9yX2VhY2goaW50ICgqaGFuZGxlX2NvdW50ZXIpKHN0cnVjdCBjb3VudGVyICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGNvdW50ZXIgKmN0cjsKLQlpbnQgcmMgPSAwOwotCi0JbGxpc3RfZm9yX2VhY2hfZW50cnkoY3RyLCAmY291bnRlcnMsIGxpc3QpIHsKLQkJcmMgPSBoYW5kbGVfY291bnRlcihjdHIsIGRhdGEpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCXJldHVybiByYzsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jIGIvbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGMyZWUwLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL3NyYy90YWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MDUgKzAsMCBAQAotLyogCi0gICBTYW1iYSBVbml4IFNNQi9DSUZTIGltcGxlbWVudGF0aW9uLgotCi0gICBTYW1iYSB0cml2aWFsIGFsbG9jYXRpb24gbGlicmFyeSAtIG5ldyBpbnRlcmZhY2UKLQotICAgTk9URTogUGxlYXNlIHJlYWQgdGFsbG9jX2d1aWRlLnR4dCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uCi0KLSAgIENvcHlyaWdodCAoQykgQW5kcmV3IFRyaWRnZWxsIDIwMDQKLSAgIENvcHlyaWdodCAoQykgU3RlZmFuIE1ldHptYWNoZXIgMjAwNgotICAgCi0gICAgICoqIE5PVEUhIFRoZSBmb2xsb3dpbmcgTEdQTCBsaWNlbnNlIGFwcGxpZXMgdG8gdGhlIHRhbGxvYwotICAgICAqKiBsaWJyYXJ5LiBUaGlzIGRvZXMgTk9UIGltcGx5IHRoYXQgYWxsIG9mIFNhbWJhIGlzIHJlbGVhc2VkCi0gICAgICoqIHVuZGVyIHRoZSBMR1BMCi0gICAKLSAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotKi8KLQotLyoKLSAgaW5zcGlyZWQgYnkgaHR0cDovL3N3YXBwZWQuY2MvaGFsbG9jLwotKi8KLQotI2lmZGVmIF9TQU1CQV9CVUlMRF8KLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0jaWYgKFNBTUJBX1ZFUlNJT05fTUFKT1I8NCkKLSNpbmNsdWRlICJpbmNsdWRlcy5oIgotLyogVGhpcyBpcyB0byBjaXJjdW12ZW50IFNBTUJBMydzIHBhcmFub2lkIG1hbGxvYyBjaGVja2VyLiBIZXJlIGluIHRoaXMgZmlsZQotICogd2UgdHJ1c3Qgb3Vyc2VsdmVzLi4uICovCi0jaWZkZWYgbWFsbG9jCi0jdW5kZWYgbWFsbG9jCi0jZW5kaWYKLSNpZmRlZiByZWFsbG9jCi0jdW5kZWYgcmVhbGxvYwotI2VuZGlmCi0jZGVmaW5lIF9UQUxMT0NfU0FNQkEzCi0jZW5kaWYgLyogKFNBTUJBX1ZFUlNJT05fTUFKT1I8NCkgKi8KLSNlbmRpZiAvKiBfU0FNQkFfQlVJTERfICovCi0KLSNpZm5kZWYgX1RBTExPQ19TQU1CQTMKLS8vI2luY2x1ZGUgInJlcGxhY2UuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNkZWZpbmUgX19VU0VfR05VCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jdW5kZWYgX19VU0VfR05VCi0jaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+Ci0jZGVmaW5lIE1JTih4LHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCi0jZW5kaWYgLyogbm90IF9UQUxMT0NfU0FNQkEzICovCi0KLS8qIHVzZSB0aGlzIHRvIGZvcmNlIGV2ZXJ5IHJlYWxsb2MgdG8gY2hhbmdlIHRoZSBwb2ludGVyLCB0byBzdHJlc3MgdGVzdAotICAgY29kZSB0aGF0IG1pZ2h0IG5vdCBjb3BlICovCi0jZGVmaW5lIEFMV0FZU19SRUFMTE9DIDAKLQotCi0jZGVmaW5lIE1BWF9UQUxMT0NfU0laRSAweDEwMDAwMDAwCi0jZGVmaW5lIFRBTExPQ19NQUdJQyAweGU4MTRlYzcwCi0jZGVmaW5lIFRBTExPQ19GTEFHX0ZSRUUgMHgwMQotI2RlZmluZSBUQUxMT0NfRkxBR19MT09QIDB4MDIKLSNkZWZpbmUgVEFMTE9DX0ZMQUdfUE9PTCAweDA0CQkvKiBUaGlzIGlzIGEgdGFsbG9jIHBvb2wgKi8KLSNkZWZpbmUgVEFMTE9DX0ZMQUdfUE9PTE1FTSAweDA4CS8qIFRoaXMgaXMgYWxsb2NhdGVkIGluIGEgcG9vbCAqLwotI2RlZmluZSBUQUxMT0NfTUFHSUNfUkVGRVJFTkNFICgoY29uc3QgY2hhciAqKTEpCi0KLS8qIGJ5IGRlZmF1bHQgd2UgYWJvcnQgd2hlbiBnaXZlbiBhIGJhZCBwb2ludGVyIChzdWNoIGFzIHdoZW4gdGFsbG9jX2ZyZWUoKSBpcyBjYWxsZWQgCi0gICBvbiBhIHBvaW50ZXIgdGhhdCBjYW1lIGZyb20gbWFsbG9jKCkgKi8KLSNpZm5kZWYgVEFMTE9DX0FCT1JUCi0jZGVmaW5lIFRBTExPQ19BQk9SVChyZWFzb24pIGFib3J0KCkKLSNlbmRpZgotCi0jaWZuZGVmIGRpc2NhcmRfY29uc3RfcAotI2lmIGRlZmluZWQoX19pbnRwdHJfdF9kZWZpbmVkKSB8fCBkZWZpbmVkKEhBVkVfSU5UUFRSX1QpCi0jIGRlZmluZSBkaXNjYXJkX2NvbnN0X3AodHlwZSwgcHRyKSAoKHR5cGUgKikoKGludHB0cl90KShwdHIpKSkKLSNlbHNlCi0jIGRlZmluZSBkaXNjYXJkX2NvbnN0X3AodHlwZSwgcHRyKSAoKHR5cGUgKikocHRyKSkKLSNlbmRpZgotI2VuZGlmCi0KLS8qIHRoZXNlIG1hY3JvcyBnYWluIHVzIGEgZmV3IHBlcmNlbnQgb2Ygc3BlZWQgb24gZ2NjICovCi0jaWYgKF9fR05VQ19fID49IDMpCi0vKiB0aGUgc3RyYW5nZSAhISBpcyB0byBlbnN1cmUgdGhhdCBfX2J1aWx0aW5fZXhwZWN0KCkgdGFrZXMgZWl0aGVyIDAgb3IgMQotICAgYXMgaXRzIGZpcnN0IGFyZ3VtZW50ICovCi0jaWZuZGVmIGxpa2VseQotI2RlZmluZSBsaWtlbHkoeCkgICBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAxKQotI2VuZGlmCi0jaWZuZGVmIHVubGlrZWx5Ci0jZGVmaW5lIHVubGlrZWx5KHgpIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDApCi0jZW5kaWYKLSNlbHNlCi0jaWZuZGVmIGxpa2VseQotI2RlZmluZSBsaWtlbHkoeCkgKHgpCi0jZW5kaWYKLSNpZm5kZWYgdW5saWtlbHkKLSNkZWZpbmUgdW5saWtlbHkoeCkgKHgpCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19BUFBMRV9fCi0vKiB0YWtlbiBmcm9tIGh0dHA6Ly9pbnNhbmVjb2RpbmcuYmxvZ3Nwb3QuY29tLzIwMDcvMDMvbWV0aG9kcy1mb3Itc2FmZS1zdHJpbmctaGFuZGxpbmcuaHRtbCAqLwotc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCi17Ci0gIGNvbnN0IGNoYXIgKnAgPSAoY29uc3QgY2hhciAqKW1lbWNocihzLCAwLCBuKTsKLSAgcmV0dXJuKHAgPyBwLXMgOiBuKTsKLX0KLSNlbmRpZgotCi0vKiB0aGlzIG51bGxfY29udGV4dCBpcyBvbmx5IHVzZWQgaWYgdGFsbG9jX2VuYWJsZV9sZWFrX3JlcG9ydCgpIG9yCi0gICB0YWxsb2NfZW5hYmxlX2xlYWtfcmVwb3J0X2Z1bGwoKSBpcyBjYWxsZWQsIG90aGVyd2lzZSBpdCByZW1haW5zCi0gICBOVUxMCi0qLwotc3RhdGljIHZvaWQgKm51bGxfY29udGV4dDsKLXN0YXRpYyB2b2lkICphdXRvZnJlZV9jb250ZXh0OwotCi1zdHJ1Y3QgdGFsbG9jX3JlZmVyZW5jZV9oYW5kbGUgewotCXN0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSAqbmV4dCwgKnByZXY7Ci0Jdm9pZCAqcHRyOwotfTsKLQotdHlwZWRlZiBpbnQgKCp0YWxsb2NfZGVzdHJ1Y3Rvcl90KSh2b2lkICopOwotCi1zdHJ1Y3QgdGFsbG9jX2NodW5rIHsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpuZXh0LCAqcHJldjsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpwYXJlbnQsICpjaGlsZDsKLQlzdHJ1Y3QgdGFsbG9jX3JlZmVyZW5jZV9oYW5kbGUgKnJlZnM7Ci0JdGFsbG9jX2Rlc3RydWN0b3JfdCBkZXN0cnVjdG9yOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc2l6ZV90IHNpemU7Ci0JdW5zaWduZWQgZmxhZ3M7Ci0KLQkvKgotCSAqICJwb29sIiBoYXMgZHVhbCB1c2U6Ci0JICoKLQkgKiBGb3IgdGhlIHRhbGxvYyBwb29sIGl0c2VsZiAoaS5lLiBUQUxMT0NfRkxBR19QT09MIGlzIHNldCksICJwb29sIgotCSAqIG1hcmtzIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnRseSBhbGxvY2F0ZWQgYXJlYS4KLQkgKgotCSAqIEZvciBtZW1iZXJzIG9mIHRoZSBwb29sIChpLmUuIFRBTExPQ19GTEFHX1BPT0xNRU0gaXMgc2V0KSwgInBvb2wiCi0JICogaXMgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgdGFsbG9jX2NodW5rIG9mIHRoZSBwb29sIHRoYXQgaXQgd2FzCi0JICogYWxsb2NhdGVkIGZyb20uIFRoaXMgd2F5IGNoaWxkcmVuIGNhbiBxdWlja2x5IGZpbmQgdGhlIHBvb2wgdG8gY2hldwotCSAqIGZyb20uCi0JICovCi0Jdm9pZCAqcG9vbDsKLX07Ci0KLS8qIDE2IGJ5dGUgYWxpZ25tZW50IHNlZW1zIHRvIGtlZXAgZXZlcnlvbmUgaGFwcHkgKi8KLSNkZWZpbmUgVENfSERSX1NJWkUgKChzaXplb2Yoc3RydWN0IHRhbGxvY19jaHVuaykrMTUpJn4xNSkKLSNkZWZpbmUgVENfUFRSX0ZST01fQ0hVTksodGMpICgodm9pZCAqKShUQ19IRFJfU0laRSArIChjaGFyKil0YykpCi0KLXN0YXRpYyB2b2lkICgqdGFsbG9jX2Fib3J0X2ZuKShjb25zdCBjaGFyICpyZWFzb24pOwotCi12b2lkIHRhbGxvY19zZXRfYWJvcnRfZm4odm9pZCAoKmFib3J0X2ZuKShjb25zdCBjaGFyICpyZWFzb24pKQotewotCXRhbGxvY19hYm9ydF9mbiA9IGFib3J0X2ZuOwotfQotCi1zdGF0aWMgdm9pZCB0YWxsb2NfYWJvcnQoY29uc3QgY2hhciAqcmVhc29uKQotewotCWlmICghdGFsbG9jX2Fib3J0X2ZuKSB7Ci0JCVRBTExPQ19BQk9SVChyZWFzb24pOwotCX0KLQotCXRhbGxvY19hYm9ydF9mbihyZWFzb24pOwotfQotCi1zdGF0aWMgdm9pZCB0YWxsb2NfYWJvcnRfZG91YmxlX2ZyZWUodm9pZCkKLXsKLQl0YWxsb2NfYWJvcnQoIkJhZCB0YWxsb2MgbWFnaWMgdmFsdWUgLSBkb3VibGUgZnJlZSIpOwotfQotCi1zdGF0aWMgdm9pZCB0YWxsb2NfYWJvcnRfdW5rbm93bl92YWx1ZSh2b2lkKQotewotCXRhbGxvY19hYm9ydCgiQmFkIHRhbGxvYyBtYWdpYyB2YWx1ZSAtIHVua25vd24gdmFsdWUiKTsKLX0KLQotLyogcGFuaWMgaWYgd2UgZ2V0IGEgYmFkIG1hZ2ljIHZhbHVlICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0YWxsb2NfY2h1bmsgKnRhbGxvY19jaHVua19mcm9tX3B0cihjb25zdCB2b2lkICpwdHIpCi17Ci0JY29uc3QgY2hhciAqcHAgPSAoY29uc3QgY2hhciAqKXB0cjsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YyA9IGRpc2NhcmRfY29uc3RfcChzdHJ1Y3QgdGFsbG9jX2NodW5rLCBwcCAtIFRDX0hEUl9TSVpFKTsKLQlpZiAodW5saWtlbHkoKHRjLT5mbGFncyAmIChUQUxMT0NfRkxBR19GUkVFIHwgfjB4RikpICE9IFRBTExPQ19NQUdJQykpIHsgCi0JCWlmICh0Yy0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19GUkVFKSB7Ci0JCQl0YWxsb2NfYWJvcnRfZG91YmxlX2ZyZWUoKTsKLQkJfSBlbHNlIHsKLQkJCXRhbGxvY19hYm9ydF91bmtub3duX3ZhbHVlKCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRjOwotfQotCi0vKiBob29rIGludG8gdGhlIGZyb250IG9mIHRoZSBsaXN0ICovCi0jZGVmaW5lIF9UTElTVF9BREQobGlzdCwgcCkgXAotZG8geyBcCi0gICAgICAgIGlmICghKGxpc3QpKSB7IFwKLQkJKGxpc3QpID0gKHApOyBcCi0JCShwKS0+bmV4dCA9IChwKS0+cHJldiA9IE5VTEw7IFwKLQl9IGVsc2UgeyBcCi0JCShsaXN0KS0+cHJldiA9IChwKTsgXAotCQkocCktPm5leHQgPSAobGlzdCk7IFwKLQkJKHApLT5wcmV2ID0gTlVMTDsgXAotCQkobGlzdCkgPSAocCk7IFwKLQl9XAotfSB3aGlsZSAoMCkKLQotLyogcmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIGxpc3QgLSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSB0byBiZSBpbiBsaXN0LiAqLwotI2RlZmluZSBfVExJU1RfUkVNT1ZFKGxpc3QsIHApIFwKLWRvIHsgXAotCWlmICgocCkgPT0gKGxpc3QpKSB7IFwKLQkJKGxpc3QpID0gKHApLT5uZXh0OyBcCi0JCWlmIChsaXN0KSAobGlzdCktPnByZXYgPSBOVUxMOyBcCi0JfSBlbHNlIHsgXAotCQlpZiAoKHApLT5wcmV2KSAocCktPnByZXYtPm5leHQgPSAocCktPm5leHQ7IFwKLQkJaWYgKChwKS0+bmV4dCkgKHApLT5uZXh0LT5wcmV2ID0gKHApLT5wcmV2OyBcCi0JfSBcCi0JaWYgKChwKSAmJiAoKHApICE9IChsaXN0KSkpIChwKS0+bmV4dCA9IChwKS0+cHJldiA9IE5VTEw7IFwKLX0gd2hpbGUgKDApCi0KLQotLyoKLSAgcmV0dXJuIHRoZSBwYXJlbnQgY2h1bmsgb2YgYSBwb2ludGVyCi0qLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YWxsb2NfcGFyZW50X2NodW5rKGNvbnN0IHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKLQotCWlmICh1bmxpa2VseShwdHIgPT0gTlVMTCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKLQl3aGlsZSAodGMtPnByZXYpIHRjPXRjLT5wcmV2OwotCi0JcmV0dXJuIHRjLT5wYXJlbnQ7Ci19Ci0KLXZvaWQgKnRhbGxvY19wYXJlbnQoY29uc3Qgdm9pZCAqcHRyKQotewotCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjID0gdGFsbG9jX3BhcmVudF9jaHVuayhwdHIpOwotCXJldHVybiB0Yz8gVENfUFRSX0ZST01fQ0hVTksodGMpIDogTlVMTDsKLX0KLQotLyoKLSAgZmluZCBwYXJlbnRzIG5hbWUKLSovCi1jb25zdCBjaGFyICp0YWxsb2NfcGFyZW50X25hbWUoY29uc3Qgdm9pZCAqcHRyKQotewotCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjID0gdGFsbG9jX3BhcmVudF9jaHVuayhwdHIpOwotCXJldHVybiB0Yz8gdGMtPm5hbWUgOiBOVUxMOwotfQotCi0vKgotICBBIHBvb2wgY2FycmllcyBhbiBpbi1wb29sIG9iamVjdCBjb3VudCBjb3VudCBpbiB0aGUgZmlyc3QgMTYgYnl0ZXMuCi0gIGJ5dGVzLiBUaGlzIGlzIGRvbmUgdG8gc3VwcG9ydCB0YWxsb2Nfc3RlYWwoKSB0byBhIHBhcmVudCBvdXRzaWRlIG9mIHRoZQotICBwb29sLiBUaGUgY291bnQgaW5jbHVkZXMgdGhlIHBvb2wgaXRzZWxmLCBzbyBhIHRhbGxvY19mcmVlKCkgb24gYSBwb29sIHdpbGwKLSAgb25seSBkZXN0cm95IHRoZSBwb29sIGlmIHRoZSBjb3VudCBoYXMgZHJvcHBlZCB0byB6ZXJvLiBBIHRhbGxvY19mcmVlKCkgb2YgYQotICBwb29sIG1lbWJlciB3aWxsIHJlZHVjZSB0aGUgY291bnQsIGFuZCBldmVudHVhbGx5IGFsc28gY2FsbCBmcmVlKDMpIG9uIHRoZQotICBwb29sIG1lbW9yeS4KLQotICBUaGUgb2JqZWN0IGNvdW50IGlzIG5vdCBwdXQgaW50byAic3RydWN0IHRhbGxvY19jaHVuayIgYmVjYXVzZSBpdCBpcyBvbmx5Ci0gIHJlbGV2YW50IGZvciB0YWxsb2MgcG9vbHMgYW5kIHRoZSBhbGlnbm1lbnQgdG8gMTYgYnl0ZXMgd291bGQgaW5jcmVhc2UgdGhlCi0gIG1lbW9yeSBmb290cHJpbnQgb2YgZWFjaCB0YWxsb2MgY2h1bmsgYnkgdGhvc2UgMTYgYnl0ZXMuCi0qLwotCi0jZGVmaW5lIFRBTExPQ19QT09MX0hEUl9TSVpFIDE2Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgKnRhbGxvY19wb29sX29iamVjdGNvdW50KHN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjKQotewotCXJldHVybiAodW5zaWduZWQgaW50ICopKChjaGFyICopdGMgKyBzaXplb2Yoc3RydWN0IHRhbGxvY19jaHVuaykpOwotfQotCi0vKgotICBBbGxvY2F0ZSBmcm9tIGEgcG9vbAotKi8KLQotc3RhdGljIHN0cnVjdCB0YWxsb2NfY2h1bmsgKnRhbGxvY19hbGxvY19wb29sKHN0cnVjdCB0YWxsb2NfY2h1bmsgKnBhcmVudCwKLQkJCQkJICAgICAgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IHRhbGxvY19jaHVuayAqcG9vbF9jdHggPSBOVUxMOwotCXNpemVfdCBzcGFjZV9sZWZ0OwotCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnJlc3VsdDsKLQlzaXplX3QgY2h1bmtfc2l6ZTsKLQotCWlmIChwYXJlbnQgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAocGFyZW50LT5mbGFncyAmIFRBTExPQ19GTEFHX1BPT0wpIHsKLQkJcG9vbF9jdHggPSBwYXJlbnQ7Ci0JfQotCWVsc2UgaWYgKHBhcmVudC0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19QT09MTUVNKSB7Ci0JCXBvb2xfY3R4ID0gKHN0cnVjdCB0YWxsb2NfY2h1bmsgKilwYXJlbnQtPnBvb2w7Ci0JfQotCi0JaWYgKHBvb2xfY3R4ID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc3BhY2VfbGVmdCA9ICgoY2hhciAqKXBvb2xfY3R4ICsgVENfSERSX1NJWkUgKyBwb29sX2N0eC0+c2l6ZSkKLQkJLSAoKGNoYXIgKilwb29sX2N0eC0+cG9vbCk7Ci0KLQkvKgotCSAqIEFsaWduIHNpemUgdG8gMTYgYnl0ZXMKLQkgKi8KLQljaHVua19zaXplID0gKChzaXplICsgMTUpICYgfjE1KTsKLQotCWlmIChzcGFjZV9sZWZ0IDwgY2h1bmtfc2l6ZSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXN1bHQgPSAoc3RydWN0IHRhbGxvY19jaHVuayAqKXBvb2xfY3R4LT5wb29sOwotCi0jaWYgZGVmaW5lZChERVZFTE9QRVIpICYmIGRlZmluZWQoVkFMR1JJTkRfTUFLRV9NRU1fVU5ERUZJTkVEKQotCVZBTEdSSU5EX01BS0VfTUVNX1VOREVGSU5FRChyZXN1bHQsIHNpemUpOwotI2VuZGlmCi0KLQlwb29sX2N0eC0+cG9vbCA9ICh2b2lkICopKChjaGFyICopcmVzdWx0ICsgY2h1bmtfc2l6ZSk7Ci0KLQlyZXN1bHQtPmZsYWdzID0gVEFMTE9DX01BR0lDIHwgVEFMTE9DX0ZMQUdfUE9PTE1FTTsKLQlyZXN1bHQtPnBvb2wgPSBwb29sX2N0eDsKLQotCSp0YWxsb2NfcG9vbF9vYmplY3Rjb3VudChwb29sX2N0eCkgKz0gMTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIAotICAgQWxsb2NhdGUgYSBiaXQgb2YgbWVtb3J5IGFzIGEgY2hpbGQgb2YgYW4gZXhpc3RpbmcgcG9pbnRlcgotKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqX190YWxsb2MoY29uc3Qgdm9pZCAqY29udGV4dCwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IHRhbGxvY19jaHVuayAqdGMgPSBOVUxMOwotCi0JaWYgKHVubGlrZWx5KGNvbnRleHQgPT0gTlVMTCkpIHsKLQkJY29udGV4dCA9IG51bGxfY29udGV4dDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoc2l6ZSA+PSBNQVhfVEFMTE9DX1NJWkUpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmIChjb250ZXh0ICE9IE5VTEwpIHsKLQkJdGMgPSB0YWxsb2NfYWxsb2NfcG9vbCh0YWxsb2NfY2h1bmtfZnJvbV9wdHIoY29udGV4dCksCi0JCQkJICAgICAgIFRDX0hEUl9TSVpFK3NpemUpOwotCX0KLQotCWlmICh0YyA9PSBOVUxMKSB7Ci0JCXRjID0gKHN0cnVjdCB0YWxsb2NfY2h1bmsgKiltYWxsb2MoVENfSERSX1NJWkUrc2l6ZSk7Ci0JCWlmICh1bmxpa2VseSh0YyA9PSBOVUxMKSkgcmV0dXJuIE5VTEw7Ci0JCXRjLT5mbGFncyA9IFRBTExPQ19NQUdJQzsKLQkJdGMtPnBvb2wgID0gTlVMTDsKLQl9Ci0KLQl0Yy0+c2l6ZSA9IHNpemU7Ci0JdGMtPmRlc3RydWN0b3IgPSBOVUxMOwotCXRjLT5jaGlsZCA9IE5VTEw7Ci0JdGMtPm5hbWUgPSBOVUxMOwotCXRjLT5yZWZzID0gTlVMTDsKLQotCWlmIChsaWtlbHkoY29udGV4dCkpIHsKLQkJc3RydWN0IHRhbGxvY19jaHVuayAqcGFyZW50ID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKGNvbnRleHQpOwotCi0JCWlmIChwYXJlbnQtPmNoaWxkKSB7Ci0JCQlwYXJlbnQtPmNoaWxkLT5wYXJlbnQgPSBOVUxMOwotCQkJdGMtPm5leHQgPSBwYXJlbnQtPmNoaWxkOwotCQkJdGMtPm5leHQtPnByZXYgPSB0YzsKLQkJfSBlbHNlIHsKLQkJCXRjLT5uZXh0ID0gTlVMTDsKLQkJfQotCQl0Yy0+cGFyZW50ID0gcGFyZW50OwotCQl0Yy0+cHJldiA9IE5VTEw7Ci0JCXBhcmVudC0+Y2hpbGQgPSB0YzsKLQl9IGVsc2UgewotCQl0Yy0+bmV4dCA9IHRjLT5wcmV2ID0gdGMtPnBhcmVudCA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIFRDX1BUUl9GUk9NX0NIVU5LKHRjKTsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIHRhbGxvYyBwb29sCi0gKi8KLQotdm9pZCAqdGFsbG9jX3Bvb2woY29uc3Qgdm9pZCAqY29udGV4dCwgc2l6ZV90IHNpemUpCi17Ci0Jdm9pZCAqcmVzdWx0ID0gX190YWxsb2MoY29udGV4dCwgc2l6ZSArIFRBTExPQ19QT09MX0hEUl9TSVpFKTsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKLQotCWlmICh1bmxpa2VseShyZXN1bHQgPT0gTlVMTCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocmVzdWx0KTsKLQotCXRjLT5mbGFncyB8PSBUQUxMT0NfRkxBR19QT09MOwotCXRjLT5wb29sID0gKGNoYXIgKilyZXN1bHQgKyBUQUxMT0NfUE9PTF9IRFJfU0laRTsKLQotCSp0YWxsb2NfcG9vbF9vYmplY3Rjb3VudCh0YykgPSAxOwotCi0jaWYgZGVmaW5lZChERVZFTE9QRVIpICYmIGRlZmluZWQoVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MpCi0JVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1ModGMtPnBvb2wsIHNpemUpOwotI2VuZGlmCi0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICBzZXR1cCBhIGRlc3RydWN0b3IgdG8gYmUgY2FsbGVkIG9uIGZyZWUgb2YgYSBwb2ludGVyCi0gIHRoZSBkZXN0cnVjdG9yIHNob3VsZCByZXR1cm4gMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLgotICBpZiB0aGUgZGVzdHJ1Y3RvciBmYWlscyB0aGVuIHRoZSBmcmVlIGlzIGZhaWxlZCwgYW5kIHRoZSBtZW1vcnkgY2FuCi0gIGJlIGNvbnRpbnVlZCB0byBiZSB1c2VkCi0qLwotdm9pZCBfdGFsbG9jX3NldF9kZXN0cnVjdG9yKGNvbnN0IHZvaWQgKnB0ciwgaW50ICgqZGVzdHJ1Y3Rvcikodm9pZCAqKSkKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOwotCXRjLT5kZXN0cnVjdG9yID0gZGVzdHJ1Y3RvcjsKLX0KLQotLyoKLSAgaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiBhIHBpZWNlIG9mIG1lbW9yeS4gCi0qLwotaW50IHRhbGxvY19pbmNyZWFzZV9yZWZfY291bnQoY29uc3Qgdm9pZCAqcHRyKQotewotCWlmICh1bmxpa2VseSghdGFsbG9jX3JlZmVyZW5jZShudWxsX2NvbnRleHQsIHB0cikpKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gIGhlbHBlciBmb3IgdGFsbG9jX3JlZmVyZW5jZSgpCi0KLSAgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgZnVuY3Rpb24gcG9pbnRlciBhbmQgc2hvdWxkIG5vdCBiZSBpbmxpbmUKLSovCi1zdGF0aWMgaW50IHRhbGxvY19yZWZlcmVuY2VfZGVzdHJ1Y3RvcihzdHJ1Y3QgdGFsbG9jX3JlZmVyZW5jZV9oYW5kbGUgKmhhbmRsZSkKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpwdHJfdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIoaGFuZGxlLT5wdHIpOwotCV9UTElTVF9SRU1PVkUocHRyX3RjLT5yZWZzLCBoYW5kbGUpOwotCXJldHVybiAwOwotfQotCi0vKgotICAgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGFkZCBhIG5hbWUgdG8gYSBwb2ludGVyIC0gdGhlIG5hbWUgbXVzdCBwb2ludCB0byBhIAotICAgdHJ1ZSBzdHJpbmcgY29uc3RhbnQKLSovCi1zdGF0aWMgaW5saW5lIHZvaWQgX3RhbGxvY19zZXRfbmFtZV9jb25zdChjb25zdCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHRhbGxvY19jaHVuayAqdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKLQl0Yy0+bmFtZSA9IG5hbWU7Ci19Ci0KLS8qCi0gIGludGVybmFsIHRhbGxvY19uYW1lZF9jb25zdCgpCi0qLwotc3RhdGljIGlubGluZSB2b2lkICpfdGFsbG9jX25hbWVkX2NvbnN0KGNvbnN0IHZvaWQgKmNvbnRleHQsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQotewotCXZvaWQgKnB0cjsKLQotCXB0ciA9IF9fdGFsbG9jKGNvbnRleHQsIHNpemUpOwotCWlmICh1bmxpa2VseShwdHIgPT0gTlVMTCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JX3RhbGxvY19zZXRfbmFtZV9jb25zdChwdHIsIG5hbWUpOwotCi0JcmV0dXJuIHB0cjsKLX0KLQotLyoKLSAgbWFrZSBhIHNlY29uZGFyeSByZWZlcmVuY2UgdG8gYSBwb2ludGVyLCBoYW5naW5nIG9mZiB0aGUgZ2l2ZW4gY29udGV4dC4KLSAgdGhlIHBvaW50ZXIgcmVtYWlucyB2YWxpZCB1bnRpbCBib3RoIHRoZSBvcmlnaW5hbCBjYWxsZXIgYW5kIHRoaXMgZ2l2ZW4KLSAgY29udGV4dCBhcmUgZnJlZWQuCi0gIAotICB0aGUgbWFqb3IgdXNlIGZvciB0aGlzIGlzIHdoZW4gdHdvIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIG5lZWQgdG8gcmVmZXJlbmNlIHRoZSAKLSAgc2FtZSB1bmRlcmx5aW5nIGRhdGEsIGFuZCB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGZyZWUgdGhlIHR3byBpbnN0YW5jZXMgc2VwYXJhdGVseSwKLSAgYW5kIGluIGVpdGhlciBvcmRlcgotKi8KLXZvaWQgKl90YWxsb2NfcmVmZXJlbmNlKGNvbnN0IHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKLQlzdHJ1Y3QgdGFsbG9jX3JlZmVyZW5jZV9oYW5kbGUgKmhhbmRsZTsKLQlpZiAodW5saWtlbHkocHRyID09IE5VTEwpKSByZXR1cm4gTlVMTDsKLQotCXRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7Ci0JaGFuZGxlID0gKHN0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSAqKV90YWxsb2NfbmFtZWRfY29uc3QoY29udGV4dCwKLQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgdGFsbG9jX3JlZmVyZW5jZV9oYW5kbGUpLAotCQkJCQkJICAgVEFMTE9DX01BR0lDX1JFRkVSRU5DRSk7Ci0JaWYgKHVubGlrZWx5KGhhbmRsZSA9PSBOVUxMKSkgcmV0dXJuIE5VTEw7Ci0KLQkvKiBub3RlIHRoYXQgd2UgaGFuZyB0aGUgZGVzdHJ1Y3RvciBvZmYgdGhlIGhhbmRsZSwgbm90IHRoZQotCSAgIG1haW4gY29udGV4dCBhcyB0aGF0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHN0aWxsIHNldHVwIHRoZWlyCi0JICAgb3duIGRlc3RydWN0b3Igb24gdGhlIGNvbnRleHQgaWYgdGhleSB3YW50IHRvICovCi0JdGFsbG9jX3NldF9kZXN0cnVjdG9yKGhhbmRsZSwgdGFsbG9jX3JlZmVyZW5jZV9kZXN0cnVjdG9yKTsKLQloYW5kbGUtPnB0ciA9IGRpc2NhcmRfY29uc3RfcCh2b2lkLCBwdHIpOwotCV9UTElTVF9BREQodGMtPnJlZnMsIGhhbmRsZSk7Ci0JcmV0dXJuIGhhbmRsZS0+cHRyOwotfQotCi0KLS8qIAotICAgaW50ZXJuYWwgdGFsbG9jX2ZyZWUgY2FsbAotKi8KLXN0YXRpYyBpbmxpbmUgaW50IF90YWxsb2NfZnJlZSh2b2lkICpwdHIpCi17Ci0Jc3RydWN0IHRhbGxvY19jaHVuayAqdGM7Ci0KLQlpZiAodW5saWtlbHkocHRyID09IE5VTEwpKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOwotCi0JaWYgKHVubGlrZWx5KHRjLT5yZWZzKSkgewotCQlpbnQgaXNfY2hpbGQ7Ci0JCS8qIGNoZWNrIHRoaXMgaXMgYSByZWZlcmVuY2UgZnJvbSBhIGNoaWxkIG9yIGdyYW50Y2hpbGQKLQkJICogYmFjayB0byBpdCdzIHBhcmVudCBvciBncmFudHBhcmVudAotCQkgKgotCQkgKiBpbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byByZW1vdmUgdGhlIHJlZmVyZW5jZSBhbmQKLQkJICogY2FsbCBhbm90aGVyIGluc3RhbmNlIG9mIHRhbGxvY19mcmVlKCkgb24gdGhlIGN1cnJlbnQKLQkJICogcG9pbnRlci4KLQkJICovCi0JCWlzX2NoaWxkID0gdGFsbG9jX2lzX3BhcmVudCh0Yy0+cmVmcywgcHRyKTsKLQkJX3RhbGxvY19mcmVlKHRjLT5yZWZzKTsKLQkJaWYgKGlzX2NoaWxkKSB7Ci0JCQlyZXR1cm4gX3RhbGxvY19mcmVlKHB0cik7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICh1bmxpa2VseSh0Yy0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19MT09QKSkgewotCQkvKiB3ZSBoYXZlIGEgZnJlZSBsb29wIC0gc3RvcCBsb29waW5nICovCi0JCXJldHVybiAwOwotCX0KLQotCWlmICh1bmxpa2VseSh0Yy0+ZGVzdHJ1Y3RvcikpIHsKLQkJdGFsbG9jX2Rlc3RydWN0b3JfdCBkID0gdGMtPmRlc3RydWN0b3I7Ci0JCWlmIChkID09ICh0YWxsb2NfZGVzdHJ1Y3Rvcl90KS0xKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdGMtPmRlc3RydWN0b3IgPSAodGFsbG9jX2Rlc3RydWN0b3JfdCktMTsKLQkJaWYgKGQocHRyKSA9PSAtMSkgewotCQkJdGMtPmRlc3RydWN0b3IgPSBkOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXRjLT5kZXN0cnVjdG9yID0gTlVMTDsKLQl9Ci0KLQlpZiAodGMtPnBhcmVudCkgewotCQlfVExJU1RfUkVNT1ZFKHRjLT5wYXJlbnQtPmNoaWxkLCB0Yyk7Ci0JCWlmICh0Yy0+cGFyZW50LT5jaGlsZCkgewotCQkJdGMtPnBhcmVudC0+Y2hpbGQtPnBhcmVudCA9IHRjLT5wYXJlbnQ7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAodGMtPnByZXYpIHRjLT5wcmV2LT5uZXh0ID0gdGMtPm5leHQ7Ci0JCWlmICh0Yy0+bmV4dCkgdGMtPm5leHQtPnByZXYgPSB0Yy0+cHJldjsKLQl9Ci0KLQl0Yy0+ZmxhZ3MgfD0gVEFMTE9DX0ZMQUdfTE9PUDsKLQotCXdoaWxlICh0Yy0+Y2hpbGQpIHsKLQkJLyogd2UgbmVlZCB0byB3b3JrIG91dCB3aG8gd2lsbCBvd24gYW4gYWJhbmRvbmVkIGNoaWxkCi0JCSAgIGlmIGl0IGNhbm5vdCBiZSBmcmVlZC4gSW4gcHJpb3JpdHkgb3JkZXIsIHRoZSBmaXJzdAotCQkgICBjaG9pY2UgaXMgb3duZXIgb2YgYW55IHJlbWFpbmluZyByZWZlcmVuY2UgdG8gdGhpcwotCQkgICBwb2ludGVyLCB0aGUgc2Vjb25kIGNob2ljZSBpcyBvdXIgcGFyZW50LCBhbmQgdGhlCi0JCSAgIGZpbmFsIGNob2ljZSBpcyB0aGUgbnVsbCBjb250ZXh0LiAqLwotCQl2b2lkICpjaGlsZCA9IFRDX1BUUl9GUk9NX0NIVU5LKHRjLT5jaGlsZCk7Ci0JCWNvbnN0IHZvaWQgKm5ld19wYXJlbnQgPSBudWxsX2NvbnRleHQ7Ci0JCWlmICh1bmxpa2VseSh0Yy0+Y2hpbGQtPnJlZnMpKSB7Ci0JCQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpwID0gdGFsbG9jX3BhcmVudF9jaHVuayh0Yy0+Y2hpbGQtPnJlZnMpOwotCQkJaWYgKHApIG5ld19wYXJlbnQgPSBUQ19QVFJfRlJPTV9DSFVOSyhwKTsKLQkJfQotCQlpZiAodW5saWtlbHkoX3RhbGxvY19mcmVlKGNoaWxkKSA9PSAtMSkpIHsKLQkJCWlmIChuZXdfcGFyZW50ID09IG51bGxfY29udGV4dCkgewotCQkJCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnAgPSB0YWxsb2NfcGFyZW50X2NodW5rKHB0cik7Ci0JCQkJaWYgKHApIG5ld19wYXJlbnQgPSBUQ19QVFJfRlJPTV9DSFVOSyhwKTsKLQkJCX0KLQkJCXRhbGxvY19zdGVhbChuZXdfcGFyZW50LCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQl0Yy0+ZmxhZ3MgfD0gVEFMTE9DX0ZMQUdfRlJFRTsKLQotCWlmICh0Yy0+ZmxhZ3MgJiAoVEFMTE9DX0ZMQUdfUE9PTHxUQUxMT0NfRkxBR19QT09MTUVNKSkgewotCQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpwb29sOwotCQl1bnNpZ25lZCBpbnQgKnBvb2xfb2JqZWN0X2NvdW50OwotCi0JCXBvb2wgPSAodGMtPmZsYWdzICYgVEFMTE9DX0ZMQUdfUE9PTCkKLQkJCT8gdGMgOiAoc3RydWN0IHRhbGxvY19jaHVuayAqKXRjLT5wb29sOwotCi0JCXBvb2xfb2JqZWN0X2NvdW50ID0gdGFsbG9jX3Bvb2xfb2JqZWN0Y291bnQocG9vbCk7Ci0KLQkJaWYgKCpwb29sX29iamVjdF9jb3VudCA9PSAwKSB7Ci0JCQl0YWxsb2NfYWJvcnQoIlBvb2wgb2JqZWN0IGNvdW50IHplcm8hIik7Ci0JCX0KLQotCQkqcG9vbF9vYmplY3RfY291bnQgLT0gMTsKLQotCQlpZiAoKnBvb2xfb2JqZWN0X2NvdW50ID09IDApIHsKLQkJCWZyZWUocG9vbCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWZyZWUodGMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogCi0gICBtb3ZlIGEgbHVtcCBvZiBtZW1vcnkgZnJvbSBvbmUgdGFsbG9jIGNvbnRleHQgdG8gYW5vdGhlciByZXR1cm4gdGhlCi0gICBwdHIgb24gc3VjY2Vzcywgb3IgTlVMTCBpZiBpdCBjb3VsZCBub3QgYmUgdHJhbnNmZXJyZWQuCi0gICBwYXNzaW5nIE5VTEwgYXMgcHRyIHdpbGwgYWx3YXlzIHJldHVybiBOVUxMIHdpdGggbm8gc2lkZSBlZmZlY3RzLgotKi8KLXZvaWQgKl90YWxsb2Nfc3RlYWwoY29uc3Qgdm9pZCAqbmV3X2N0eCwgY29uc3Qgdm9pZCAqcHRyKQotewotCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjLCAqbmV3X3RjOwotCi0JaWYgKHVubGlrZWx5KCFwdHIpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmICh1bmxpa2VseShuZXdfY3R4ID09IE5VTEwpKSB7Ci0JCW5ld19jdHggPSBudWxsX2NvbnRleHQ7Ci0JfQotCi0JdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKLQotCWlmICh1bmxpa2VseShuZXdfY3R4ID09IE5VTEwpKSB7Ci0JCWlmICh0Yy0+cGFyZW50KSB7Ci0JCQlfVExJU1RfUkVNT1ZFKHRjLT5wYXJlbnQtPmNoaWxkLCB0Yyk7Ci0JCQlpZiAodGMtPnBhcmVudC0+Y2hpbGQpIHsKLQkJCQl0Yy0+cGFyZW50LT5jaGlsZC0+cGFyZW50ID0gdGMtPnBhcmVudDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0Yy0+cHJldikgdGMtPnByZXYtPm5leHQgPSB0Yy0+bmV4dDsKLQkJCWlmICh0Yy0+bmV4dCkgdGMtPm5leHQtPnByZXYgPSB0Yy0+cHJldjsKLQkJfQotCQkKLQkJdGMtPnBhcmVudCA9IHRjLT5uZXh0ID0gdGMtPnByZXYgPSBOVUxMOwotCQlyZXR1cm4gZGlzY2FyZF9jb25zdF9wKHZvaWQsIHB0cik7Ci0JfQotCi0JbmV3X3RjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKG5ld19jdHgpOwotCi0JaWYgKHVubGlrZWx5KHRjID09IG5ld190YyB8fCB0Yy0+cGFyZW50ID09IG5ld190YykpIHsKLQkJcmV0dXJuIGRpc2NhcmRfY29uc3RfcCh2b2lkLCBwdHIpOwotCX0KLQotCWlmICh0Yy0+cGFyZW50KSB7Ci0JCV9UTElTVF9SRU1PVkUodGMtPnBhcmVudC0+Y2hpbGQsIHRjKTsKLQkJaWYgKHRjLT5wYXJlbnQtPmNoaWxkKSB7Ci0JCQl0Yy0+cGFyZW50LT5jaGlsZC0+cGFyZW50ID0gdGMtPnBhcmVudDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICh0Yy0+cHJldikgdGMtPnByZXYtPm5leHQgPSB0Yy0+bmV4dDsKLQkJaWYgKHRjLT5uZXh0KSB0Yy0+bmV4dC0+cHJldiA9IHRjLT5wcmV2OwotCX0KLQotCXRjLT5wYXJlbnQgPSBuZXdfdGM7Ci0JaWYgKG5ld190Yy0+Y2hpbGQpIG5ld190Yy0+Y2hpbGQtPnBhcmVudCA9IE5VTEw7Ci0JX1RMSVNUX0FERChuZXdfdGMtPmNoaWxkLCB0Yyk7Ci0KLQlyZXR1cm4gZGlzY2FyZF9jb25zdF9wKHZvaWQsIHB0cik7Ci19Ci0KLQotCi0vKgotICByZW1vdmUgYSBzZWNvbmRhcnkgcmVmZXJlbmNlIHRvIGEgcG9pbnRlci4gVGhpcyB1bmRvJ3Mgd2hhdAotICB0YWxsb2NfcmVmZXJlbmNlKCkgaGFzIGRvbmUuIFRoZSBjb250ZXh0IGFuZCBwb2ludGVyIGFyZ3VtZW50cwotICBtdXN0IG1hdGNoIHRob3NlIGdpdmVuIHRvIGEgdGFsbG9jX3JlZmVyZW5jZSgpCi0qLwotc3RhdGljIGlubGluZSBpbnQgdGFsbG9jX3VucmVmZXJlbmNlKGNvbnN0IHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOwotCXN0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSAqaDsKLQotCWlmICh1bmxpa2VseShjb250ZXh0ID09IE5VTEwpKSB7Ci0JCWNvbnRleHQgPSBudWxsX2NvbnRleHQ7Ci0JfQotCi0JZm9yIChoPXRjLT5yZWZzO2g7aD1oLT5uZXh0KSB7Ci0JCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnAgPSB0YWxsb2NfcGFyZW50X2NodW5rKGgpOwotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBOVUxMKSBicmVhazsKLQkJfSBlbHNlIGlmIChUQ19QVFJfRlJPTV9DSFVOSyhwKSA9PSBjb250ZXh0KSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaCA9PSBOVUxMKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gX3RhbGxvY19mcmVlKGgpOwotfQotCi0vKgotICByZW1vdmUgYSBzcGVjaWZpYyBwYXJlbnQgY29udGV4dCBmcm9tIGEgcG9pbnRlci4gVGhpcyBpcyBhIG1vcmUKLSAgY29udHJvbGxlZCB2YXJpZW50IG9mIHRhbGxvY19mcmVlKCkKLSovCi1pbnQgdGFsbG9jX3VubGluayhjb25zdCB2b2lkICpjb250ZXh0LCB2b2lkICpwdHIpCi17Ci0Jc3RydWN0IHRhbGxvY19jaHVuayAqdGNfcCwgKm5ld19wOwotCXZvaWQgKm5ld19wYXJlbnQ7Ci0KLQlpZiAocHRyID09IE5VTEwpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChjb250ZXh0ID09IE5VTEwpIHsKLQkJY29udGV4dCA9IG51bGxfY29udGV4dDsKLQl9Ci0KLQlpZiAodGFsbG9jX3VucmVmZXJlbmNlKGNvbnRleHQsIHB0cikgPT0gMCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY29udGV4dCA9PSBOVUxMKSB7Ci0JCWlmICh0YWxsb2NfcGFyZW50X2NodW5rKHB0cikgIT0gTlVMTCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHRhbGxvY19jaHVua19mcm9tX3B0cihjb250ZXh0KSAhPSB0YWxsb2NfcGFyZW50X2NodW5rKHB0cikpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQkKLQl0Y19wID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7Ci0KLQlpZiAodGNfcC0+cmVmcyA9PSBOVUxMKSB7Ci0JCXJldHVybiBfdGFsbG9jX2ZyZWUocHRyKTsKLQl9Ci0KLQluZXdfcCA9IHRhbGxvY19wYXJlbnRfY2h1bmsodGNfcC0+cmVmcyk7Ci0JaWYgKG5ld19wKSB7Ci0JCW5ld19wYXJlbnQgPSBUQ19QVFJfRlJPTV9DSFVOSyhuZXdfcCk7Ci0JfSBlbHNlIHsKLQkJbmV3X3BhcmVudCA9IE5VTEw7Ci0JfQotCi0JaWYgKHRhbGxvY191bnJlZmVyZW5jZShuZXdfcGFyZW50LCBwdHIpICE9IDApIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXRhbGxvY19zdGVhbChuZXdfcGFyZW50LCBwdHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gIGFkZCBhIG5hbWUgdG8gYW4gZXhpc3RpbmcgcG9pbnRlciAtIHZhX2xpc3QgdmVyc2lvbgotKi8KLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqdGFsbG9jX3NldF9uYW1lX3YoY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApIFBSSU5URl9BVFRSSUJVVEUoMiwwKTsKLQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICp0YWxsb2Nfc2V0X25hbWVfdihjb25zdCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOwotCXRjLT5uYW1lID0gdGFsbG9jX3Zhc3ByaW50ZihwdHIsIGZtdCwgYXApOwotCWlmIChsaWtlbHkodGMtPm5hbWUpKSB7Ci0JCV90YWxsb2Nfc2V0X25hbWVfY29uc3QodGMtPm5hbWUsICIubmFtZSIpOwotCX0KLQlyZXR1cm4gdGMtPm5hbWU7Ci19Ci0KLS8qCi0gIGFkZCBhIG5hbWUgdG8gYW4gZXhpc3RpbmcgcG9pbnRlcgotKi8KLWNvbnN0IGNoYXIgKnRhbGxvY19zZXRfbmFtZShjb25zdCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdmFfbGlzdCBhcDsKLQl2YV9zdGFydChhcCwgZm10KTsKLQluYW1lID0gdGFsbG9jX3NldF9uYW1lX3YocHRyLCBmbXQsIGFwKTsKLQl2YV9lbmQoYXApOwotCXJldHVybiBuYW1lOwotfQotCi0KLS8qCi0gIGNyZWF0ZSBhIG5hbWVkIHRhbGxvYyBwb2ludGVyLiBBbnkgdGFsbG9jIHBvaW50ZXIgY2FuIGJlIG5hbWVkLCBhbmQKLSAgdGFsbG9jX25hbWVkKCkgb3BlcmF0ZXMganVzdCBsaWtlIHRhbGxvYygpIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyB5b3UKLSAgdG8gbmFtZSB0aGUgcG9pbnRlci4KLSovCi12b2lkICp0YWxsb2NfbmFtZWQoY29uc3Qgdm9pZCAqY29udGV4dCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0Jdm9pZCAqcHRyOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQlwdHIgPSBfX3RhbGxvYyhjb250ZXh0LCBzaXplKTsKLQlpZiAodW5saWtlbHkocHRyID09IE5VTEwpKSByZXR1cm4gTlVMTDsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCW5hbWUgPSB0YWxsb2Nfc2V0X25hbWVfdihwdHIsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0KLQlpZiAodW5saWtlbHkobmFtZSA9PSBOVUxMKSkgewotCQlfdGFsbG9jX2ZyZWUocHRyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIHB0cjsKLX0KLQotLyoKLSAgcmV0dXJuIHRoZSBuYW1lIG9mIGEgdGFsbG9jIHB0ciwgb3IgIlVOTkFNRUQiCi0qLwotY29uc3QgY2hhciAqdGFsbG9jX2dldF9uYW1lKGNvbnN0IHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOwotCWlmICh1bmxpa2VseSh0Yy0+bmFtZSA9PSBUQUxMT0NfTUFHSUNfUkVGRVJFTkNFKSkgewotCQlyZXR1cm4gIi5yZWZlcmVuY2UiOwotCX0KLQlpZiAobGlrZWx5KHRjLT5uYW1lKSkgewotCQlyZXR1cm4gdGMtPm5hbWU7Ci0JfQotCXJldHVybiAiVU5OQU1FRCI7Ci19Ci0KLQotLyoKLSAgY2hlY2sgaWYgYSBwb2ludGVyIGhhcyB0aGUgZ2l2ZW4gbmFtZS4gSWYgaXQgZG9lcywgcmV0dXJuIHRoZSBwb2ludGVyLAotICBvdGhlcndpc2UgcmV0dXJuIE5VTEwKLSovCi12b2lkICp0YWxsb2NfY2hlY2tfbmFtZShjb25zdCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JY29uc3QgY2hhciAqcG5hbWU7Ci0JaWYgKHVubGlrZWx5KHB0ciA9PSBOVUxMKSkgcmV0dXJuIE5VTEw7Ci0JcG5hbWUgPSB0YWxsb2NfZ2V0X25hbWUocHRyKTsKLQlpZiAobGlrZWx5KHBuYW1lID09IG5hbWUgfHwgc3RyY21wKHBuYW1lLCBuYW1lKSA9PSAwKSkgewotCQlyZXR1cm4gZGlzY2FyZF9jb25zdF9wKHZvaWQsIHB0cik7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCB0YWxsb2NfYWJvcnRfdHlwZV9taXNzbWF0Y2goY29uc3QgY2hhciAqbG9jYXRpb24sCi0JCQkJCWNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCWNvbnN0IGNoYXIgKmV4cGVjdGVkKQotewotCWNvbnN0IGNoYXIgKnJlYXNvbjsKLQotCXJlYXNvbiA9IHRhbGxvY19hc3ByaW50ZihOVUxMLAotCQkJCSAiJXM6IFR5cGUgbWlzbWF0Y2g6IG5hbWVbJXNdIGV4cGVjdGVkWyVzXSIsCi0JCQkJIGxvY2F0aW9uLAotCQkJCSBuYW1lP25hbWU6Ik5VTEwiLAotCQkJCSBleHBlY3RlZCk7Ci0JaWYgKCFyZWFzb24pIHsKLQkJcmVhc29uID0gIlR5cGUgbWlzbWF0Y2giOwotCX0KLQotCXRhbGxvY19hYm9ydChyZWFzb24pOwotfQotCi12b2lkICpfdGFsbG9jX2dldF90eXBlX2Fib3J0KGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbG9jYXRpb24pCi17Ci0JY29uc3QgY2hhciAqcG5hbWU7Ci0KLQlpZiAodW5saWtlbHkocHRyID09IE5VTEwpKSB7Ci0JCXRhbGxvY19hYm9ydF90eXBlX21pc3NtYXRjaChsb2NhdGlvbiwgTlVMTCwgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXBuYW1lID0gdGFsbG9jX2dldF9uYW1lKHB0cik7Ci0JaWYgKGxpa2VseShwbmFtZSA9PSBuYW1lIHx8IHN0cmNtcChwbmFtZSwgbmFtZSkgPT0gMCkpIHsKLQkJcmV0dXJuIGRpc2NhcmRfY29uc3RfcCh2b2lkLCBwdHIpOwotCX0KLQotCXRhbGxvY19hYm9ydF90eXBlX21pc3NtYXRjaChsb2NhdGlvbiwgcG5hbWUsIG5hbWUpOwotCXJldHVybiBOVUxMOwotfQotCi0vKgotICB0aGlzIGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgdGFsbG9jCi0qLwotdm9pZCAqdGFsbG9jX2luaXQoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQl2b2lkICpwdHI7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQotCS8qCi0JICogc2FtYmEzIGV4cGVjdHMgdGFsbG9jX3JlcG9ydF9kZXB0aF9jYihOVUxMLCAuLi4pCi0JICogcmVwb3J0cyBhbGwgdGFsbG9jJ2VkIG1lbW9yeSwgc28gd2UgbmVlZCB0byBlbmFibGUKLQkgKiBudWxsX3RyYWNraW5nCi0JICovCi0JdGFsbG9jX2VuYWJsZV9udWxsX3RyYWNraW5nKCk7Ci0KLQlwdHIgPSBfX3RhbGxvYyhOVUxMLCAwKTsKLQlpZiAodW5saWtlbHkocHRyID09IE5VTEwpKSByZXR1cm4gTlVMTDsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCW5hbWUgPSB0YWxsb2Nfc2V0X25hbWVfdihwdHIsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0KLQlpZiAodW5saWtlbHkobmFtZSA9PSBOVUxMKSkgewotCQlfdGFsbG9jX2ZyZWUocHRyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIHB0cjsKLX0KLQotLyoKLSAgdGhpcyBpcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgU2FtYmEzIHRhbGxvY19kZXN0cm95X3Bvb2wgZnVuY3Rpb25hbGl0eS4gSXQKLSAgc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlLiBJdCdzIGluIGhlcmUgdG8ga2VlcCB0aGUgdGFsbG9jCi0gIGNvZGUgY29uc2lzdGVudCBhY3Jvc3MgU2FtYmEgMyBhbmQgNC4KLSovCi12b2lkIHRhbGxvY19mcmVlX2NoaWxkcmVuKHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKLQotCWlmICh1bmxpa2VseShwdHIgPT0gTlVMTCkpIHsKLQkJcmV0dXJuOwotCX0KLQotCXRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7Ci0KLQl3aGlsZSAodGMtPmNoaWxkKSB7Ci0JCS8qIHdlIG5lZWQgdG8gd29yayBvdXQgd2hvIHdpbGwgb3duIGFuIGFiYW5kb25lZCBjaGlsZAotCQkgICBpZiBpdCBjYW5ub3QgYmUgZnJlZWQuIEluIHByaW9yaXR5IG9yZGVyLCB0aGUgZmlyc3QKLQkJICAgY2hvaWNlIGlzIG93bmVyIG9mIGFueSByZW1haW5pbmcgcmVmZXJlbmNlIHRvIHRoaXMKLQkJICAgcG9pbnRlciwgdGhlIHNlY29uZCBjaG9pY2UgaXMgb3VyIHBhcmVudCwgYW5kIHRoZQotCQkgICBmaW5hbCBjaG9pY2UgaXMgdGhlIG51bGwgY29udGV4dC4gKi8KLQkJdm9pZCAqY2hpbGQgPSBUQ19QVFJfRlJPTV9DSFVOSyh0Yy0+Y2hpbGQpOwotCQljb25zdCB2b2lkICpuZXdfcGFyZW50ID0gbnVsbF9jb250ZXh0OwotCQlpZiAodW5saWtlbHkodGMtPmNoaWxkLT5yZWZzKSkgewotCQkJc3RydWN0IHRhbGxvY19jaHVuayAqcCA9IHRhbGxvY19wYXJlbnRfY2h1bmsodGMtPmNoaWxkLT5yZWZzKTsKLQkJCWlmIChwKSBuZXdfcGFyZW50ID0gVENfUFRSX0ZST01fQ0hVTksocCk7Ci0JCX0KLQkJaWYgKHVubGlrZWx5KF90YWxsb2NfZnJlZShjaGlsZCkgPT0gLTEpKSB7Ci0JCQlpZiAobmV3X3BhcmVudCA9PSBudWxsX2NvbnRleHQpIHsKLQkJCQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpwID0gdGFsbG9jX3BhcmVudF9jaHVuayhwdHIpOwotCQkJCWlmIChwKSBuZXdfcGFyZW50ID0gVENfUFRSX0ZST01fQ0hVTksocCk7Ci0JCQl9Ci0JCQl0YWxsb2Nfc3RlYWwobmV3X3BhcmVudCwgY2hpbGQpOwotCQl9Ci0JfQotCi0JaWYgKCh0Yy0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19QT09MKQotCSAgICAmJiAoKnRhbGxvY19wb29sX29iamVjdGNvdW50KHRjKSA9PSAxKSkgewotCQl0Yy0+cG9vbCA9ICgoY2hhciAqKXRjICsgVENfSERSX1NJWkUgKyBUQUxMT0NfUE9PTF9IRFJfU0laRSk7Ci0jaWYgZGVmaW5lZChERVZFTE9QRVIpICYmIGRlZmluZWQoVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MpCi0JCVZBTEdSSU5EX01BS0VfTUVNX05PQUNDRVNTKAotCQkJdGMtPnBvb2wsIHRjLT5zaXplIC0gVEFMTE9DX1BPT0xfSERSX1NJWkUpOwotI2VuZGlmCi0JfQotfQotCi0vKiAKLSAgIEFsbG9jYXRlIGEgYml0IG9mIG1lbW9yeSBhcyBhIGNoaWxkIG9mIGFuIGV4aXN0aW5nIHBvaW50ZXIKLSovCi12b2lkICpfdGFsbG9jKGNvbnN0IHZvaWQgKmNvbnRleHQsIHNpemVfdCBzaXplKQotewotCXJldHVybiBfX3RhbGxvYyhjb250ZXh0LCBzaXplKTsKLX0KLQotLyoKLSAgZXh0ZXJuYWxseSBjYWxsYWJsZSB0YWxsb2Nfc2V0X25hbWVfY29uc3QoKQotKi8KLXZvaWQgdGFsbG9jX3NldF9uYW1lX2NvbnN0KGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlfdGFsbG9jX3NldF9uYW1lX2NvbnN0KHB0ciwgbmFtZSk7Ci19Ci0KLS8qCi0gIGNyZWF0ZSBhIG5hbWVkIHRhbGxvYyBwb2ludGVyLiBBbnkgdGFsbG9jIHBvaW50ZXIgY2FuIGJlIG5hbWVkLCBhbmQKLSAgdGFsbG9jX25hbWVkKCkgb3BlcmF0ZXMganVzdCBsaWtlIHRhbGxvYygpIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyB5b3UKLSAgdG8gbmFtZSB0aGUgcG9pbnRlci4KLSovCi12b2lkICp0YWxsb2NfbmFtZWRfY29uc3QoY29uc3Qgdm9pZCAqY29udGV4dCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIF90YWxsb2NfbmFtZWRfY29uc3QoY29udGV4dCwgc2l6ZSwgbmFtZSk7Ci19Ci0KLS8qIAotICAgZnJlZSBhIHRhbGxvYyBwb2ludGVyLiBUaGlzIGFsc28gZnJlZXMgYWxsIGNoaWxkIHBvaW50ZXJzIG9mIHRoaXMgCi0gICBwb2ludGVyIHJlY3Vyc2l2ZWx5Ci0KLSAgIHJldHVybiAwIGlmIHRoZSBtZW1vcnkgaXMgYWN0dWFsbHkgZnJlZWQsIG90aGVyd2lzZSAtMS4gVGhlIG1lbW9yeQotICAgd2lsbCBub3QgYmUgZnJlZWQgaWYgdGhlIHJlZl9jb3VudCBpcyA+IDEgb3IgdGhlIGRlc3RydWN0b3IgKGlmCi0gICBhbnkpIHJldHVybnMgbm9uLXplcm8KLSovCi1pbnQgdGFsbG9jX2ZyZWUodm9pZCAqcHRyKQotewotCXJldHVybiBfdGFsbG9jX2ZyZWUocHRyKTsKLX0KLQotCi0KLS8qCi0gIEEgdGFsbG9jIHZlcnNpb24gb2YgcmVhbGxvYy4gVGhlIGNvbnRleHQgYXJndW1lbnQgaXMgb25seSB1c2VkIGlmCi0gIHB0ciBpcyBOVUxMCi0qLwotdm9pZCAqX3RhbGxvY19yZWFsbG9jKGNvbnN0IHZvaWQgKmNvbnRleHQsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHRhbGxvY19jaHVuayAqdGM7Ci0Jdm9pZCAqbmV3X3B0cjsKLQlib29sIG1hbGxvY2VkID0gZmFsc2U7Ci0KLQkvKiBzaXplIHplcm8gaXMgZXF1aXZhbGVudCB0byBmcmVlKCkgKi8KLQlpZiAodW5saWtlbHkoc2l6ZSA9PSAwKSkgewotCQlfdGFsbG9jX2ZyZWUocHRyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKHVubGlrZWx5KHNpemUgPj0gTUFYX1RBTExPQ19TSVpFKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiByZWFsbG9jKE5VTEwpIGlzIGVxdWl2YWxlbnQgdG8gbWFsbG9jKCkgKi8KLQlpZiAocHRyID09IE5VTEwpIHsKLQkJcmV0dXJuIF90YWxsb2NfbmFtZWRfY29uc3QoY29udGV4dCwgc2l6ZSwgbmFtZSk7Ci0JfQotCi0JdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKLQotCS8qIGRvbid0IGFsbG93IHJlYWxsb2Mgb24gcmVmZXJlbmNlZCBwb2ludGVycyAqLwotCWlmICh1bmxpa2VseSh0Yy0+cmVmcykpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogZG9uJ3QgbGV0IGFueWJvZHkgdHJ5IHRvIHJlYWxsb2MgYSB0YWxsb2NfcG9vbCAqLwotCWlmICh1bmxpa2VseSh0Yy0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19QT09MKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBkb24ndCBzaHJpbmsgaWYgd2UgaGF2ZSBsZXNzIHRoYW4gMWsgdG8gZ2FpbiAqLwotCWlmICgoc2l6ZSA8IHRjLT5zaXplKSAmJiAoKHRjLT5zaXplIC0gc2l6ZSkgPCAxMDI0KSkgewotCQl0Yy0+c2l6ZSA9IHNpemU7Ci0JCXJldHVybiBwdHI7Ci0JfQotCi0JLyogYnkgcmVzZXR0aW5nIG1hZ2ljIHdlIGNhdGNoIHVzZXJzIG9mIHRoZSBvbGQgbWVtb3J5ICovCi0JdGMtPmZsYWdzIHw9IFRBTExPQ19GTEFHX0ZSRUU7Ci0KLSNpZiBBTFdBWVNfUkVBTExPQwotCW5ld19wdHIgPSBtYWxsb2Moc2l6ZSArIFRDX0hEUl9TSVpFKTsKLQlpZiAobmV3X3B0cikgewotCQltZW1jcHkobmV3X3B0ciwgdGMsIHRjLT5zaXplICsgVENfSERSX1NJWkUpOwotCQlmcmVlKHRjKTsKLQl9Ci0jZWxzZQotCWlmICh0Yy0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19QT09MTUVNKSB7Ci0KLQkJbmV3X3B0ciA9IHRhbGxvY19hbGxvY19wb29sKHRjLCBzaXplICsgVENfSERSX1NJWkUpOwotCQkqdGFsbG9jX3Bvb2xfb2JqZWN0Y291bnQoKHN0cnVjdCB0YWxsb2NfY2h1bmsgKikKLQkJCQkJICh0Yy0+cG9vbCkpIC09IDE7Ci0KLQkJaWYgKG5ld19wdHIgPT0gTlVMTCkgewotCQkJbmV3X3B0ciA9IG1hbGxvYyhUQ19IRFJfU0laRStzaXplKTsKLQkJCW1hbGxvY2VkID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChuZXdfcHRyKSB7Ci0JCQltZW1jcHkobmV3X3B0ciwgdGMsIE1JTih0Yy0+c2l6ZSxzaXplKSArIFRDX0hEUl9TSVpFKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJbmV3X3B0ciA9IHJlYWxsb2ModGMsIHNpemUgKyBUQ19IRFJfU0laRSk7Ci0JfQotI2VuZGlmCi0JaWYgKHVubGlrZWx5KCFuZXdfcHRyKSkgewkKLQkJdGMtPmZsYWdzICY9IH5UQUxMT0NfRkxBR19GUkVFOyAKLQkJcmV0dXJuIE5VTEw7IAotCX0KLQotCXRjID0gKHN0cnVjdCB0YWxsb2NfY2h1bmsgKiluZXdfcHRyOwotCXRjLT5mbGFncyAmPSB+VEFMTE9DX0ZMQUdfRlJFRTsKLQlpZiAobWFsbG9jZWQpIHsKLQkJdGMtPmZsYWdzICY9IH5UQUxMT0NfRkxBR19QT09MTUVNOwotCX0KLQlpZiAodGMtPnBhcmVudCkgewotCQl0Yy0+cGFyZW50LT5jaGlsZCA9IHRjOwotCX0KLQlpZiAodGMtPmNoaWxkKSB7Ci0JCXRjLT5jaGlsZC0+cGFyZW50ID0gdGM7Ci0JfQotCi0JaWYgKHRjLT5wcmV2KSB7Ci0JCXRjLT5wcmV2LT5uZXh0ID0gdGM7Ci0JfQotCWlmICh0Yy0+bmV4dCkgewotCQl0Yy0+bmV4dC0+cHJldiA9IHRjOwotCX0KLQotCXRjLT5zaXplID0gc2l6ZTsKLQlfdGFsbG9jX3NldF9uYW1lX2NvbnN0KFRDX1BUUl9GUk9NX0NIVU5LKHRjKSwgbmFtZSk7Ci0KLQlyZXR1cm4gVENfUFRSX0ZST01fQ0hVTksodGMpOwotfQotCi0vKgotICBhIHdyYXBwZXIgYXJvdW5kIHRhbGxvY19zdGVhbCgpIGZvciBzaXR1YXRpb25zIHdoZXJlIHlvdSBhcmUgbW92aW5nIGEgcG9pbnRlcgotICBiZXR3ZWVuIHR3byBzdHJ1Y3R1cmVzLCBhbmQgd2FudCB0aGUgb2xkIHBvaW50ZXIgdG8gYmUgc2V0IHRvIE5VTEwKLSovCi12b2lkICpfdGFsbG9jX21vdmUoY29uc3Qgdm9pZCAqbmV3X2N0eCwgY29uc3Qgdm9pZCAqX3BwdHIpCi17Ci0JY29uc3Qgdm9pZCAqKnBwdHIgPSBkaXNjYXJkX2NvbnN0X3AoY29uc3Qgdm9pZCAqLF9wcHRyKTsKLQl2b2lkICpyZXQgPSBfdGFsbG9jX3N0ZWFsKG5ld19jdHgsICpwcHRyKTsKLQkoKnBwdHIpID0gTlVMTDsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICByZXR1cm4gdGhlIHRvdGFsIHNpemUgb2YgYSB0YWxsb2MgcG9vbCAoc3VidHJlZSkKLSovCi1zaXplX3QgdGFsbG9jX3RvdGFsX3NpemUoY29uc3Qgdm9pZCAqcHRyKQotewotCXNpemVfdCB0b3RhbCA9IDA7Ci0Jc3RydWN0IHRhbGxvY19jaHVuayAqYywgKnRjOwotCi0JaWYgKHB0ciA9PSBOVUxMKSB7Ci0JCXB0ciA9IG51bGxfY29udGV4dDsKLQl9Ci0JaWYgKHB0ciA9PSBOVUxMKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7Ci0KLQlpZiAodGMtPmZsYWdzICYgVEFMTE9DX0ZMQUdfTE9PUCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQl0Yy0+ZmxhZ3MgfD0gVEFMTE9DX0ZMQUdfTE9PUDsKLQotCXRvdGFsID0gdGMtPnNpemU7Ci0JZm9yIChjPXRjLT5jaGlsZDtjO2M9Yy0+bmV4dCkgewotCQl0b3RhbCArPSB0YWxsb2NfdG90YWxfc2l6ZShUQ19QVFJfRlJPTV9DSFVOSyhjKSk7Ci0JfQotCi0JdGMtPmZsYWdzICY9IH5UQUxMT0NfRkxBR19MT09QOwotCi0JcmV0dXJuIHRvdGFsOwotfQotCi0vKgotICByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgaW4gYSB0YWxsb2MgcG9vbCAoc3VidHJlZSkKLSovCi1zaXplX3QgdGFsbG9jX3RvdGFsX2Jsb2Nrcyhjb25zdCB2b2lkICpwdHIpCi17Ci0Jc2l6ZV90IHRvdGFsID0gMDsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpjLCAqdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKLQotCWlmICh0Yy0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19MT09QKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXRjLT5mbGFncyB8PSBUQUxMT0NfRkxBR19MT09QOwotCi0JdG90YWwrKzsKLQlmb3IgKGM9dGMtPmNoaWxkO2M7Yz1jLT5uZXh0KSB7Ci0JCXRvdGFsICs9IHRhbGxvY190b3RhbF9ibG9ja3MoVENfUFRSX0ZST01fQ0hVTksoYykpOwotCX0KLQotCXRjLT5mbGFncyAmPSB+VEFMTE9DX0ZMQUdfTE9PUDsKLQotCXJldHVybiB0b3RhbDsKLX0KLQotLyoKLSAgcmV0dXJuIHRoZSBudW1iZXIgb2YgZXh0ZXJuYWwgcmVmZXJlbmNlcyB0byBhIHBvaW50ZXIKLSovCi1zaXplX3QgdGFsbG9jX3JlZmVyZW5jZV9jb3VudChjb25zdCB2b2lkICpwdHIpCi17Ci0Jc3RydWN0IHRhbGxvY19jaHVuayAqdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKLQlzdHJ1Y3QgdGFsbG9jX3JlZmVyZW5jZV9oYW5kbGUgKmg7Ci0Jc2l6ZV90IHJldCA9IDA7Ci0KLQlmb3IgKGg9dGMtPnJlZnM7aDtoPWgtPm5leHQpIHsKLQkJcmV0Kys7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gIHJlcG9ydCBvbiBtZW1vcnkgdXNhZ2UgYnkgYWxsIGNoaWxkcmVuIG9mIGEgcG9pbnRlciwgZ2l2aW5nIGEgZnVsbCB0cmVlIHZpZXcKLSovCi12b2lkIHRhbGxvY19yZXBvcnRfZGVwdGhfY2IoY29uc3Qgdm9pZCAqcHRyLCBpbnQgZGVwdGgsIGludCBtYXhfZGVwdGgsCi0JCQkgICAgdm9pZCAoKmNhbGxiYWNrKShjb25zdCB2b2lkICpwdHIsCi0JCQkgIAkJICAgICBpbnQgZGVwdGgsIGludCBtYXhfZGVwdGgsCi0JCQkJCSAgICAgaW50IGlzX3JlZiwKLQkJCQkJICAgICB2b2lkICpwcml2YXRlX2RhdGEpLAotCQkJICAgIHZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpjLCAqdGM7Ci0KLQlpZiAocHRyID09IE5VTEwpIHsKLQkJcHRyID0gbnVsbF9jb250ZXh0OwotCX0KLQlpZiAocHRyID09IE5VTEwpIHJldHVybjsKLQotCXRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7Ci0KLQlpZiAodGMtPmZsYWdzICYgVEFMTE9DX0ZMQUdfTE9PUCkgewotCQlyZXR1cm47Ci0JfQotCi0JY2FsbGJhY2socHRyLCBkZXB0aCwgbWF4X2RlcHRoLCAwLCBwcml2YXRlX2RhdGEpOwotCi0JaWYgKG1heF9kZXB0aCA+PSAwICYmIGRlcHRoID49IG1heF9kZXB0aCkgewotCQlyZXR1cm47Ci0JfQotCi0JdGMtPmZsYWdzIHw9IFRBTExPQ19GTEFHX0xPT1A7Ci0JZm9yIChjPXRjLT5jaGlsZDtjO2M9Yy0+bmV4dCkgewotCQlpZiAoYy0+bmFtZSA9PSBUQUxMT0NfTUFHSUNfUkVGRVJFTkNFKSB7Ci0JCQlzdHJ1Y3QgdGFsbG9jX3JlZmVyZW5jZV9oYW5kbGUgKmggPSAoc3RydWN0IHRhbGxvY19yZWZlcmVuY2VfaGFuZGxlICopVENfUFRSX0ZST01fQ0hVTksoYyk7Ci0JCQljYWxsYmFjayhoLT5wdHIsIGRlcHRoICsgMSwgbWF4X2RlcHRoLCAxLCBwcml2YXRlX2RhdGEpOwotCQl9IGVsc2UgewotCQkJdGFsbG9jX3JlcG9ydF9kZXB0aF9jYihUQ19QVFJfRlJPTV9DSFVOSyhjKSwgZGVwdGggKyAxLCBtYXhfZGVwdGgsIGNhbGxiYWNrLCBwcml2YXRlX2RhdGEpOwotCQl9Ci0JfQotCXRjLT5mbGFncyAmPSB+VEFMTE9DX0ZMQUdfTE9PUDsKLX0KLQotc3RhdGljIHZvaWQgdGFsbG9jX3JlcG9ydF9kZXB0aF9GSUxFX2hlbHBlcihjb25zdCB2b2lkICpwdHIsIGludCBkZXB0aCwgaW50IG1heF9kZXB0aCwgaW50IGlzX3JlZiwgdm9pZCAqX2YpCi17Ci0JY29uc3QgY2hhciAqbmFtZSA9IHRhbGxvY19nZXRfbmFtZShwdHIpOwotCUZJTEUgKmYgPSAoRklMRSAqKV9mOwotCi0JaWYgKGlzX3JlZikgewotCQlmcHJpbnRmKGYsICIlKnNyZWZlcmVuY2UgdG86ICVzXG4iLCBkZXB0aCo0LCAiIiwgbmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZGVwdGggPT0gMCkgewotCQlmcHJpbnRmKGYsIiVzdGFsbG9jIHJlcG9ydCBvbiAnJXMnICh0b3RhbCAlNmx1IGJ5dGVzIGluICUzbHUgYmxvY2tzKVxuIiwgCi0JCQkobWF4X2RlcHRoIDwgMCA/ICJmdWxsICIgOiIiKSwgbmFtZSwKLQkJCSh1bnNpZ25lZCBsb25nKXRhbGxvY190b3RhbF9zaXplKHB0ciksCi0JCQkodW5zaWduZWQgbG9uZyl0YWxsb2NfdG90YWxfYmxvY2tzKHB0cikpOwotCQlyZXR1cm47Ci0JfQotCi0JZnByaW50ZihmLCAiJSpzJS0zMHMgY29udGFpbnMgJTZsdSBieXRlcyBpbiAlM2x1IGJsb2NrcyAocmVmICVkKSAlcFxuIiwgCi0JCWRlcHRoKjQsICIiLAotCQluYW1lLAotCQkodW5zaWduZWQgbG9uZyl0YWxsb2NfdG90YWxfc2l6ZShwdHIpLAotCQkodW5zaWduZWQgbG9uZyl0YWxsb2NfdG90YWxfYmxvY2tzKHB0ciksCi0JCShpbnQpdGFsbG9jX3JlZmVyZW5jZV9jb3VudChwdHIpLCBwdHIpOwotCi0jaWYgMAotCWZwcmludGYoZiwgImNvbnRlbnQ6ICIpOwotCWlmICh0YWxsb2NfdG90YWxfc2l6ZShwdHIpKSB7Ci0JCWludCB0b3QgPSB0YWxsb2NfdG90YWxfc2l6ZShwdHIpOwotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgdG90OyBpKyspIHsKLQkJCWlmICgoKChjaGFyICopcHRyKVtpXSA+IDMxKSAmJiAoKChjaGFyICopcHRyKVtpXSA8IDEyNikpIHsKLQkJCQlmcHJpbnRmKGYsICIlYyIsICgoY2hhciAqKXB0cilbaV0pOwotCQkJfSBlbHNlIHsKLQkJCQlmcHJpbnRmKGYsICJ+JTAyeCIsICgoY2hhciAqKXB0cilbaV0pOwotCQkJfQotCQl9Ci0JfQotCWZwcmludGYoZiwgIlxuIik7Ci0jZW5kaWYKLX0KLQotLyoKLSAgcmVwb3J0IG9uIG1lbW9yeSB1c2FnZSBieSBhbGwgY2hpbGRyZW4gb2YgYSBwb2ludGVyLCBnaXZpbmcgYSBmdWxsIHRyZWUgdmlldwotKi8KLXZvaWQgdGFsbG9jX3JlcG9ydF9kZXB0aF9maWxlKGNvbnN0IHZvaWQgKnB0ciwgaW50IGRlcHRoLCBpbnQgbWF4X2RlcHRoLCBGSUxFICpmKQotewotCXRhbGxvY19yZXBvcnRfZGVwdGhfY2IocHRyLCBkZXB0aCwgbWF4X2RlcHRoLCB0YWxsb2NfcmVwb3J0X2RlcHRoX0ZJTEVfaGVscGVyLCBmKTsKLQlmZmx1c2goZik7Ci19Ci0KLS8qCi0gIHJlcG9ydCBvbiBtZW1vcnkgdXNhZ2UgYnkgYWxsIGNoaWxkcmVuIG9mIGEgcG9pbnRlciwgZ2l2aW5nIGEgZnVsbCB0cmVlIHZpZXcKLSovCi12b2lkIHRhbGxvY19yZXBvcnRfZnVsbChjb25zdCB2b2lkICpwdHIsIEZJTEUgKmYpCi17Ci0JdGFsbG9jX3JlcG9ydF9kZXB0aF9maWxlKHB0ciwgMCwgLTEsIGYpOwotfQotCi0vKgotICByZXBvcnQgb24gbWVtb3J5IHVzYWdlIGJ5IGFsbCBjaGlsZHJlbiBvZiBhIHBvaW50ZXIKLSovCi12b2lkIHRhbGxvY19yZXBvcnQoY29uc3Qgdm9pZCAqcHRyLCBGSUxFICpmKQotewotCXRhbGxvY19yZXBvcnRfZGVwdGhfZmlsZShwdHIsIDAsIDEsIGYpOwotfQotCi0vKgotICByZXBvcnQgb24gYW55IG1lbW9yeSBoYW5naW5nIG9mZiB0aGUgbnVsbCBjb250ZXh0Ci0qLwotc3RhdGljIHZvaWQgdGFsbG9jX3JlcG9ydF9udWxsKHZvaWQpCi17Ci0JaWYgKHRhbGxvY190b3RhbF9zaXplKG51bGxfY29udGV4dCkgIT0gMCkgewotCQl0YWxsb2NfcmVwb3J0KG51bGxfY29udGV4dCwgc3RkZXJyKTsKLQl9Ci19Ci0KLS8qCi0gIHJlcG9ydCBvbiBhbnkgbWVtb3J5IGhhbmdpbmcgb2ZmIHRoZSBudWxsIGNvbnRleHQKLSovCi1zdGF0aWMgdm9pZCB0YWxsb2NfcmVwb3J0X251bGxfZnVsbCh2b2lkKQotewotCWlmICh0YWxsb2NfdG90YWxfc2l6ZShudWxsX2NvbnRleHQpICE9IDApIHsKLQkJdGFsbG9jX3JlcG9ydF9mdWxsKG51bGxfY29udGV4dCwgc3RkZXJyKTsKLQl9Ci19Ci0KLS8qCi0gIGVuYWJsZSB0cmFja2luZyBvZiB0aGUgTlVMTCBjb250ZXh0Ci0qLwotdm9pZCB0YWxsb2NfZW5hYmxlX251bGxfdHJhY2tpbmcodm9pZCkKLXsKLQlpZiAobnVsbF9jb250ZXh0ID09IE5VTEwpIHsKLQkJbnVsbF9jb250ZXh0ID0gX3RhbGxvY19uYW1lZF9jb25zdChOVUxMLCAwLCAibnVsbF9jb250ZXh0Iik7Ci0JfQotfQotCi0vKgotICBkaXNhYmxlIHRyYWNraW5nIG9mIHRoZSBOVUxMIGNvbnRleHQKLSovCi12b2lkIHRhbGxvY19kaXNhYmxlX251bGxfdHJhY2tpbmcodm9pZCkKLXsKLQlfdGFsbG9jX2ZyZWUobnVsbF9jb250ZXh0KTsKLQludWxsX2NvbnRleHQgPSBOVUxMOwotfQotCi0vKgotICBlbmFibGUgbGVhayByZXBvcnRpbmcgb24gZXhpdAotKi8KLXZvaWQgdGFsbG9jX2VuYWJsZV9sZWFrX3JlcG9ydCh2b2lkKQotewotCXRhbGxvY19lbmFibGVfbnVsbF90cmFja2luZygpOwotCWF0ZXhpdCh0YWxsb2NfcmVwb3J0X251bGwpOwotfQotCi0vKgotICBlbmFibGUgZnVsbCBsZWFrIHJlcG9ydGluZyBvbiBleGl0Ci0qLwotdm9pZCB0YWxsb2NfZW5hYmxlX2xlYWtfcmVwb3J0X2Z1bGwodm9pZCkKLXsKLQl0YWxsb2NfZW5hYmxlX251bGxfdHJhY2tpbmcoKTsKLQlhdGV4aXQodGFsbG9jX3JlcG9ydF9udWxsX2Z1bGwpOwotfQotCi0vKiAKLSAgIHRhbGxvYyBhbmQgemVybyBtZW1vcnkuIAotKi8KLXZvaWQgKl90YWxsb2NfemVybyhjb25zdCB2b2lkICpjdHgsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQotewotCXZvaWQgKnAgPSBfdGFsbG9jX25hbWVkX2NvbnN0KGN0eCwgc2l6ZSwgbmFtZSk7Ci0KLQlpZiAocCkgewotCQltZW1zZXQocCwgJ1wwJywgc2l6ZSk7Ci0JfQotCi0JcmV0dXJuIHA7Ci19Ci0KLS8qCi0gIG1lbWR1cCB3aXRoIGEgdGFsbG9jLiAKLSovCi12b2lkICpfdGFsbG9jX21lbWR1cChjb25zdCB2b2lkICp0LCBjb25zdCB2b2lkICpwLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQl2b2lkICpuZXdwID0gX3RhbGxvY19uYW1lZF9jb25zdCh0LCBzaXplLCBuYW1lKTsKLQotCWlmIChsaWtlbHkobmV3cCkpIHsKLQkJbWVtY3B5KG5ld3AsIHAsIHNpemUpOwotCX0KLQotCXJldHVybiBuZXdwOwotfQotCi1zdGF0aWMgaW5saW5lIGNoYXIgKl9fdGFsbG9jX3N0cmxlbmR1cChjb25zdCB2b2lkICp0LCBjb25zdCBjaGFyICpwLCBzaXplX3QgbGVuKQotewotCWNoYXIgKnJldDsKLQotCXJldCA9IChjaGFyICopX190YWxsb2ModCwgbGVuICsgMSk7Ci0JaWYgKHVubGlrZWx5KCFyZXQpKSByZXR1cm4gTlVMTDsKLQotCW1lbWNweShyZXQsIHAsIGxlbik7Ci0JcmV0W2xlbl0gPSAwOwotCi0JX3RhbGxvY19zZXRfbmFtZV9jb25zdChyZXQsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAgc3RyZHVwIHdpdGggYSB0YWxsb2MKLSovCi1jaGFyICp0YWxsb2Nfc3RyZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IGNoYXIgKnApCi17Ci0JaWYgKHVubGlrZWx5KCFwKSkgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIF9fdGFsbG9jX3N0cmxlbmR1cCh0LCBwLCBzdHJsZW4ocCkpOwotfQotCi0vKgotICBzdHJuZHVwIHdpdGggYSB0YWxsb2MKLSovCi1jaGFyICp0YWxsb2Nfc3RybmR1cChjb25zdCB2b2lkICp0LCBjb25zdCBjaGFyICpwLCBzaXplX3QgbikKLXsKLQlpZiAodW5saWtlbHkoIXApKSByZXR1cm4gTlVMTDsKLQlyZXR1cm4gX190YWxsb2Nfc3RybGVuZHVwKHQsIHAsIHN0cm5sZW4ocCwgbikpOwotfQotCi1zdGF0aWMgaW5saW5lIGNoYXIgKl9fdGFsbG9jX3N0cmxlbmR1cF9hcHBlbmQoY2hhciAqcywgc2l6ZV90IHNsZW4sCi0JCQkJCSAgICAgIGNvbnN0IGNoYXIgKmEsIHNpemVfdCBhbGVuKQotewotCWNoYXIgKnJldDsKLQotCXJldCA9IHRhbGxvY19yZWFsbG9jKE5VTEwsIHMsIGNoYXIsIHNsZW4gKyBhbGVuICsgMSk7Ci0JaWYgKHVubGlrZWx5KCFyZXQpKSByZXR1cm4gTlVMTDsKLQotCS8qIGFwcGVuZCB0aGUgc3RyaW5nIGFuZCB0aGUgdHJhaWxpbmcgXDAgKi8KLQltZW1jcHkoJnJldFtzbGVuXSwgYSwgYWxlbik7Ci0JcmV0W3NsZW4rYWxlbl0gPSAwOwotCi0JX3RhbGxvY19zZXRfbmFtZV9jb25zdChyZXQsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIEFwcGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotICovCi1jaGFyICp0YWxsb2Nfc3RyZHVwX2FwcGVuZChjaGFyICpzLCBjb25zdCBjaGFyICphKQotewotCWlmICh1bmxpa2VseSghcykpIHsKLQkJcmV0dXJuIHRhbGxvY19zdHJkdXAoTlVMTCwgYSk7Ci0JfQotCi0JaWYgKHVubGlrZWx5KCFhKSkgewotCQlyZXR1cm4gczsKLQl9Ci0KLQlyZXR1cm4gX190YWxsb2Nfc3RybGVuZHVwX2FwcGVuZChzLCBzdHJsZW4ocyksIGEsIHN0cmxlbihhKSk7Ci19Ci0KLS8qCi0gKiBBcHBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIHRhbGxvYydlZCBidWZmZXIsCi0gKiBub3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotICovCi1jaGFyICp0YWxsb2Nfc3RyZHVwX2FwcGVuZF9idWZmZXIoY2hhciAqcywgY29uc3QgY2hhciAqYSkKLXsKLQlzaXplX3Qgc2xlbjsKLQotCWlmICh1bmxpa2VseSghcykpIHsKLQkJcmV0dXJuIHRhbGxvY19zdHJkdXAoTlVMTCwgYSk7Ci0JfQotCi0JaWYgKHVubGlrZWx5KCFhKSkgewotCQlyZXR1cm4gczsKLQl9Ci0KLQlzbGVuID0gdGFsbG9jX2dldF9zaXplKHMpOwotCWlmIChsaWtlbHkoc2xlbiA+IDApKSB7Ci0JCXNsZW4tLTsKLQl9Ci0KLQlyZXR1cm4gX190YWxsb2Nfc3RybGVuZHVwX2FwcGVuZChzLCBzbGVuLCBhLCBzdHJsZW4oYSkpOwotfQotCi0vKgotICogQXBwZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0gKi8KLWNoYXIgKnRhbGxvY19zdHJuZHVwX2FwcGVuZChjaGFyICpzLCBjb25zdCBjaGFyICphLCBzaXplX3QgbikKLXsKLQlpZiAodW5saWtlbHkoIXMpKSB7Ci0JCXJldHVybiB0YWxsb2Nfc3RyZHVwKE5VTEwsIGEpOwotCX0KLQotCWlmICh1bmxpa2VseSghYSkpIHsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JcmV0dXJuIF9fdGFsbG9jX3N0cmxlbmR1cF9hcHBlbmQocywgc3RybGVuKHMpLCBhLCBzdHJubGVuKGEsIG4pKTsKLX0KLQotLyoKLSAqIEFwcGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgdGFsbG9jJ2VkIGJ1ZmZlciwKLSAqIG5vdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0gKi8KLWNoYXIgKnRhbGxvY19zdHJuZHVwX2FwcGVuZF9idWZmZXIoY2hhciAqcywgY29uc3QgY2hhciAqYSwgc2l6ZV90IG4pCi17Ci0Jc2l6ZV90IHNsZW47Ci0KLQlpZiAodW5saWtlbHkoIXMpKSB7Ci0JCXJldHVybiB0YWxsb2Nfc3RyZHVwKE5VTEwsIGEpOwotCX0KLQotCWlmICh1bmxpa2VseSghYSkpIHsKLQkJcmV0dXJuIHM7Ci0JfQotCi0Jc2xlbiA9IHRhbGxvY19nZXRfc2l6ZShzKTsKLQlpZiAobGlrZWx5KHNsZW4gPiAwKSkgewotCQlzbGVuLS07Ci0JfQotCi0JcmV0dXJuIF9fdGFsbG9jX3N0cmxlbmR1cF9hcHBlbmQocywgc2xlbiwgYSwgc3RybmxlbihhLCBuKSk7Ci19Ci0KLSNpZm5kZWYgSEFWRV9WQV9DT1BZCi0jaWZkZWYgSEFWRV9fX1ZBX0NPUFkKLSNkZWZpbmUgdmFfY29weShkZXN0LCBzcmMpIF9fdmFfY29weShkZXN0LCBzcmMpCi0jZWxzZQotI2RlZmluZSB2YV9jb3B5KGRlc3QsIHNyYykgKGRlc3QpID0gKHNyYykKLSNlbmRpZgotI2VuZGlmCi0KLWNoYXIgKnRhbGxvY192YXNwcmludGYoY29uc3Qgdm9pZCAqdCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotCWludCBsZW47Ci0JY2hhciAqcmV0OwotCXZhX2xpc3QgYXAyOwotCWNoYXIgYzsKLQotCS8qIHRoaXMgY2FsbCBsb29rcyBzdHJhbmdlLCBidXQgaXQgbWFrZXMgaXQgd29yayBvbiBvbGRlciBzb2xhcmlzIGJveGVzICovCi0JdmFfY29weShhcDIsIGFwKTsKLQlsZW4gPSB2c25wcmludGYoJmMsIDEsIGZtdCwgYXAyKTsKLQl2YV9lbmQoYXAyKTsKLQlpZiAodW5saWtlbHkobGVuIDwgMCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0ID0gKGNoYXIgKilfX3RhbGxvYyh0LCBsZW4rMSk7Ci0JaWYgKHVubGlrZWx5KCFyZXQpKSByZXR1cm4gTlVMTDsKLQotCXZhX2NvcHkoYXAyLCBhcCk7Ci0JdnNucHJpbnRmKHJldCwgbGVuKzEsIGZtdCwgYXAyKTsKLQl2YV9lbmQoYXAyKTsKLQotCV90YWxsb2Nfc2V0X25hbWVfY29uc3QocmV0LCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAgUGVyZm9ybSBzdHJpbmcgZm9ybWF0dGluZywgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gbmV3bHkgYWxsb2NhdGVkCi0gIG1lbW9yeSBob2xkaW5nIHRoZSByZXN1bHQsIGluc2lkZSBhIG1lbW9yeSBwb29sLgotICovCi1jaGFyICp0YWxsb2NfYXNwcmludGYoY29uc3Qgdm9pZCAqdCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQljaGFyICpyZXQ7Ci0KLQl2YV9zdGFydChhcCwgZm10KTsKLQlyZXQgPSB0YWxsb2NfdmFzcHJpbnRmKHQsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBjaGFyICpfX3RhbGxvY192YXNsZW5wcmludGZfYXBwZW5kKGNoYXIgKnMsIHNpemVfdCBzbGVuLAotCQkJCQkJIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLQkJCQkJCSBQUklOVEZfQVRUUklCVVRFKDMsMCk7Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciAqX190YWxsb2NfdmFzbGVucHJpbnRmX2FwcGVuZChjaGFyICpzLCBzaXplX3Qgc2xlbiwKLQkJCQkJCSBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0Jc3NpemVfdCBhbGVuOwotCXZhX2xpc3QgYXAyOwotCWNoYXIgYzsKLQotCXZhX2NvcHkoYXAyLCBhcCk7Ci0JYWxlbiA9IHZzbnByaW50ZigmYywgMSwgZm10LCBhcDIpOwotCXZhX2VuZChhcDIpOwotCi0JaWYgKGFsZW4gPD0gMCkgewotCQkvKiBFaXRoZXIgdGhlIHZzbnByaW50ZiBmYWlsZWQgb3IgdGhlIGZvcm1hdCByZXN1bHRlZCBpbgotCQkgKiBubyBjaGFyYWN0ZXJzIGJlaW5nIGZvcm1hdHRlZC4gSW4gdGhlIGZvcm1lciBjYXNlLCB3ZQotCQkgKiBvdWdodCB0byByZXR1cm4gTlVMTCwgaW4gdGhlIGxhdHRlciB3ZSBvdWdodCB0byByZXR1cm4KLQkJICogdGhlIG9yaWdpbmFsIHN0cmluZy4gTW9zdCBjdXJyZW50IGNhbGxlcnMgb2YgdGhpcwotCQkgKiBmdW5jdGlvbiBleHBlY3QgaXQgdG8gbmV2ZXIgcmV0dXJuIE5VTEwuCi0JCSAqLwotCQlyZXR1cm4gczsKLQl9Ci0KLQlzID0gdGFsbG9jX3JlYWxsb2MoTlVMTCwgcywgY2hhciwgc2xlbiArIGFsZW4gKyAxKTsKLQlpZiAoIXMpIHJldHVybiBOVUxMOwotCi0JdmFfY29weShhcDIsIGFwKTsKLQl2c25wcmludGYocyArIHNsZW4sIGFsZW4gKyAxLCBmbXQsIGFwMik7Ci0JdmFfZW5kKGFwMik7Ci0KLQlfdGFsbG9jX3NldF9uYW1lX2NvbnN0KHMsIHMpOwotCXJldHVybiBzOwotfQotCi0vKioKLSAqIFJlYWxsb2MgQHAgcyB0byBhcHBlbmQgdGhlIGZvcm1hdHRlZCByZXN1bHQgb2YgQHAgZm10IGFuZCBAcCBhcCwKLSAqIGFuZCByZXR1cm4gQHAgcywgd2hpY2ggbWF5IGhhdmUgbW92ZWQuICBHb29kIGZvciBncmFkdWFsbHkKLSAqIGFjY3VtdWxhdGluZyBvdXRwdXQgaW50byBhIHN0cmluZyBidWZmZXIuIEFwcGVuZHMgYXQgdGhlIGVuZAotICogb2YgdGhlIHN0cmluZy4KLSAqKi8KLWNoYXIgKnRhbGxvY192YXNwcmludGZfYXBwZW5kKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLQlpZiAodW5saWtlbHkoIXMpKSB7Ci0JCXJldHVybiB0YWxsb2NfdmFzcHJpbnRmKE5VTEwsIGZtdCwgYXApOwotCX0KLQotCXJldHVybiBfX3RhbGxvY192YXNsZW5wcmludGZfYXBwZW5kKHMsIHN0cmxlbihzKSwgZm10LCBhcCk7Ci19Ci0KLS8qKgotICogUmVhbGxvYyBAcCBzIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIHJlc3VsdCBvZiBAcCBmbXQgYW5kIEBwIGFwLAotICogYW5kIHJldHVybiBAcCBzLCB3aGljaCBtYXkgaGF2ZSBtb3ZlZC4gQWx3YXlzIGFwcGVuZHMgYXQgdGhlCi0gKiBlbmQgb2YgdGhlIHRhbGxvYydlZCBidWZmZXIsIG5vdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0gKiovCi1jaGFyICp0YWxsb2NfdmFzcHJpbnRmX2FwcGVuZF9idWZmZXIoY2hhciAqcywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotCXNpemVfdCBzbGVuOwotCi0JaWYgKHVubGlrZWx5KCFzKSkgewotCQlyZXR1cm4gdGFsbG9jX3Zhc3ByaW50ZihOVUxMLCBmbXQsIGFwKTsKLQl9Ci0KLQlzbGVuID0gdGFsbG9jX2dldF9zaXplKHMpOwotCWlmIChsaWtlbHkoc2xlbiA+IDApKSB7Ci0JCXNsZW4tLTsKLQl9Ci0KLQlyZXR1cm4gX190YWxsb2NfdmFzbGVucHJpbnRmX2FwcGVuZChzLCBzbGVuLCBmbXQsIGFwKTsKLX0KLQotLyoKLSAgUmVhbGxvYyBAcCBzIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIHJlc3VsdCBvZiBAcCBmbXQgYW5kIHJldHVybiBAcAotICBzLCB3aGljaCBtYXkgaGF2ZSBtb3ZlZC4gIEdvb2QgZm9yIGdyYWR1YWxseSBhY2N1bXVsYXRpbmcgb3V0cHV0Ci0gIGludG8gYSBzdHJpbmcgYnVmZmVyLgotICovCi1jaGFyICp0YWxsb2NfYXNwcmludGZfYXBwZW5kKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0KLQl2YV9zdGFydChhcCwgZm10KTsKLQlzID0gdGFsbG9jX3Zhc3ByaW50Zl9hcHBlbmQocywgZm10LCBhcCk7Ci0JdmFfZW5kKGFwKTsKLQlyZXR1cm4gczsKLX0KLQotLyoKLSAgUmVhbGxvYyBAcCBzIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIHJlc3VsdCBvZiBAcCBmbXQgYW5kIHJldHVybiBAcAotICBzLCB3aGljaCBtYXkgaGF2ZSBtb3ZlZC4gIEdvb2QgZm9yIGdyYWR1YWxseSBhY2N1bXVsYXRpbmcgb3V0cHV0Ci0gIGludG8gYSBidWZmZXIuCi0gKi8KLWNoYXIgKnRhbGxvY19hc3ByaW50Zl9hcHBlbmRfYnVmZmVyKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0KLQl2YV9zdGFydChhcCwgZm10KTsKLQlzID0gdGFsbG9jX3Zhc3ByaW50Zl9hcHBlbmRfYnVmZmVyKHMsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0JcmV0dXJuIHM7Ci19Ci0KLS8qCi0gIGFsbG9jIGFuIGFycmF5LCBjaGVja2luZyBmb3IgaW50ZWdlciBvdmVyZmxvdyBpbiB0aGUgYXJyYXkgc2l6ZQotKi8KLXZvaWQgKl90YWxsb2NfYXJyYXkoY29uc3Qgdm9pZCAqY3R4LCBzaXplX3QgZWxfc2l6ZSwgdW5zaWduZWQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaWYgKGNvdW50ID49IE1BWF9UQUxMT0NfU0laRS9lbF9zaXplKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gX3RhbGxvY19uYW1lZF9jb25zdChjdHgsIGVsX3NpemUgKiBjb3VudCwgbmFtZSk7Ci19Ci0KLS8qCi0gIGFsbG9jIGFuIHplcm8gYXJyYXksIGNoZWNraW5nIGZvciBpbnRlZ2VyIG92ZXJmbG93IGluIHRoZSBhcnJheSBzaXplCi0qLwotdm9pZCAqX3RhbGxvY196ZXJvX2FycmF5KGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGVsX3NpemUsIHVuc2lnbmVkIGNvdW50LCBjb25zdCBjaGFyICpuYW1lKQotewotCWlmIChjb3VudCA+PSBNQVhfVEFMTE9DX1NJWkUvZWxfc2l6ZSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIF90YWxsb2NfemVybyhjdHgsIGVsX3NpemUgKiBjb3VudCwgbmFtZSk7Ci19Ci0KLS8qCi0gIHJlYWxsb2MgYW4gYXJyYXksIGNoZWNraW5nIGZvciBpbnRlZ2VyIG92ZXJmbG93IGluIHRoZSBhcnJheSBzaXplCi0qLwotdm9pZCAqX3RhbGxvY19yZWFsbG9jX2FycmF5KGNvbnN0IHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3QgZWxfc2l6ZSwgdW5zaWduZWQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaWYgKGNvdW50ID49IE1BWF9UQUxMT0NfU0laRS9lbF9zaXplKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gX3RhbGxvY19yZWFsbG9jKGN0eCwgcHRyLCBlbF9zaXplICogY291bnQsIG5hbWUpOwotfQotCi0vKgotICBhIGZ1bmN0aW9uIHZlcnNpb24gb2YgdGFsbG9jX3JlYWxsb2MoKSwgc28gaXQgY2FuIGJlIHBhc3NlZCBhcyBhIGZ1bmN0aW9uIHBvaW50ZXIKLSAgdG8gbGlicmFyaWVzIHRoYXQgd2FudCBhIHJlYWxsb2MgZnVuY3Rpb24gKGEgcmVhbGxvYyBmdW5jdGlvbiBlbmNhcHN1bGF0ZXMKLSAgYWxsIHRoZSBiYXNpYyBjYXBhYmlsaXRpZXMgb2YgYW4gYWxsb2NhdGlvbiBsaWJyYXJ5LCB3aGljaCBpcyB3aHkgdGhpcyBpcyB1c2VmdWwpCi0qLwotdm9pZCAqdGFsbG9jX3JlYWxsb2NfZm4oY29uc3Qgdm9pZCAqY29udGV4dCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKLXsKLQlyZXR1cm4gX3RhbGxvY19yZWFsbG9jKGNvbnRleHQsIHB0ciwgc2l6ZSwgTlVMTCk7Ci19Ci0KLQotc3RhdGljIGludCB0YWxsb2NfYXV0b2ZyZWVfZGVzdHJ1Y3Rvcih2b2lkICpwdHIpCi17Ci0JYXV0b2ZyZWVfY29udGV4dCA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhbGxvY19hdXRvZnJlZSh2b2lkKQotewotCV90YWxsb2NfZnJlZShhdXRvZnJlZV9jb250ZXh0KTsKLX0KLQotLyoKLSAgcmV0dXJuIGEgY29udGV4dCB3aGljaCB3aWxsIGJlIGF1dG8tZnJlZWQgb24gZXhpdAotICB0aGlzIGlzIHVzZWZ1bCBmb3IgcmVkdWNpbmcgdGhlIG5vaXNlIGluIGxlYWsgcmVwb3J0cwotKi8KLXZvaWQgKnRhbGxvY19hdXRvZnJlZV9jb250ZXh0KHZvaWQpCi17Ci0JaWYgKGF1dG9mcmVlX2NvbnRleHQgPT0gTlVMTCkgewotCQlhdXRvZnJlZV9jb250ZXh0ID0gX3RhbGxvY19uYW1lZF9jb25zdChOVUxMLCAwLCAiYXV0b2ZyZWVfY29udGV4dCIpOwotCQl0YWxsb2Nfc2V0X2Rlc3RydWN0b3IoYXV0b2ZyZWVfY29udGV4dCwgdGFsbG9jX2F1dG9mcmVlX2Rlc3RydWN0b3IpOwotCQlhdGV4aXQodGFsbG9jX2F1dG9mcmVlKTsKLQl9Ci0JcmV0dXJuIGF1dG9mcmVlX2NvbnRleHQ7Ci19Ci0KLXNpemVfdCB0YWxsb2NfZ2V0X3NpemUoY29uc3Qgdm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKLQotCWlmIChjb250ZXh0ID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIoY29udGV4dCk7Ci0KLQlyZXR1cm4gdGMtPnNpemU7Ci19Ci0KLS8qCi0gIGZpbmQgYSBwYXJlbnQgb2YgdGhpcyBjb250ZXh0IHRoYXQgaGFzIHRoZSBnaXZlbiBuYW1lLCBpZiBhbnkKLSovCi12b2lkICp0YWxsb2NfZmluZF9wYXJlbnRfYnluYW1lKGNvbnN0IHZvaWQgKmNvbnRleHQsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHRhbGxvY19jaHVuayAqdGM7Ci0KLQlpZiAoY29udGV4dCA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKGNvbnRleHQpOwotCXdoaWxlICh0YykgewotCQlpZiAodGMtPm5hbWUgJiYgc3RyY21wKHRjLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlyZXR1cm4gVENfUFRSX0ZST01fQ0hVTksodGMpOwotCQl9Ci0JCXdoaWxlICh0YyAmJiB0Yy0+cHJldikgdGMgPSB0Yy0+cHJldjsKLQkJaWYgKHRjKSB7Ci0JCQl0YyA9IHRjLT5wYXJlbnQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gIHNob3cgdGhlIHBhcmVudGFnZSBvZiBhIGNvbnRleHQKLSovCi12b2lkIHRhbGxvY19zaG93X3BhcmVudHMoY29uc3Qgdm9pZCAqY29udGV4dCwgRklMRSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKLQotCWlmIChjb250ZXh0ID09IE5VTEwpIHsKLQkJZnByaW50ZihmaWxlLCAidGFsbG9jIG5vIHBhcmVudHMgZm9yIE5VTExcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIoY29udGV4dCk7Ci0JZnByaW50ZihmaWxlLCAidGFsbG9jIHBhcmVudHMgb2YgJyVzJ1xuIiwgdGFsbG9jX2dldF9uYW1lKGNvbnRleHQpKTsKLQl3aGlsZSAodGMpIHsKLQkJZnByaW50ZihmaWxlLCAiXHQnJXMnXG4iLCB0YWxsb2NfZ2V0X25hbWUoVENfUFRSX0ZST01fQ0hVTksodGMpKSk7Ci0JCXdoaWxlICh0YyAmJiB0Yy0+cHJldikgdGMgPSB0Yy0+cHJldjsKLQkJaWYgKHRjKSB7Ci0JCQl0YyA9IHRjLT5wYXJlbnQ7Ci0JCX0KLQl9Ci0JZmZsdXNoKGZpbGUpOwotfQotCi0vKgotICByZXR1cm4gMSBpZiBwdHIgaXMgYSBwYXJlbnQgb2YgY29udGV4dAotKi8KLWludCB0YWxsb2NfaXNfcGFyZW50KGNvbnN0IHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKLQotCWlmIChjb250ZXh0ID09IE5VTEwpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIoY29udGV4dCk7Ci0Jd2hpbGUgKHRjKSB7Ci0JCWlmIChUQ19QVFJfRlJPTV9DSFVOSyh0YykgPT0gcHRyKSByZXR1cm4gMTsKLQkJd2hpbGUgKHRjICYmIHRjLT5wcmV2KSB0YyA9IHRjLT5wcmV2OwotCQlpZiAodGMpIHsKLQkJCXRjID0gdGMtPnBhcmVudDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy90aW1lci5jIGIvbGlib3Ntb2NvcmUvc3JjL3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZDdkMTYuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvc3JjL3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIChDKSAyMDA4LDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgotCi1zdGF0aWMgTExJU1RfSEVBRCh0aW1lcl9saXN0KTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBzX25lYXJlc3RfdGltZTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBzX3NlbGVjdF90aW1lOwotCi0jZGVmaW5lIE1JQ1JPX1NFQ09ORFMgIDEwMDAwMDBMTAotCi0jZGVmaW5lIFRJTUVfU01BTExFUihsZWZ0LCByaWdodCkgXAotICAgICAgICAobGVmdC50dl9zZWMqTUlDUk9fU0VDT05EUytsZWZ0LnR2X3VzZWMpIDw9IChyaWdodC50dl9zZWMqTUlDUk9fU0VDT05EUytyaWdodC50dl91c2VjKQotCi12b2lkIGJzY19hZGRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQotewotCXN0cnVjdCB0aW1lcl9saXN0ICpsaXN0X3RpbWVyOwotCi0JLyogVE9ETzogT3B0aW1pemUgYW5kIHJlbWVtYmVyIHRoZSBjbG9zZXN0IGl0ZW0uLi4gKi8KLQl0aW1lci0+YWN0aXZlID0gMTsKLQotCS8qIHRoaXMgbWlnaHQgYmUgY2FsbGVkIGZyb20gd2l0aGluIHVwZGF0ZV90aW1lcnMgKi8KLQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaXN0X3RpbWVyLCAmdGltZXJfbGlzdCwgZW50cnkpCi0JCWlmICh0aW1lciA9PSBsaXN0X3RpbWVyKQotCQkJcmV0dXJuOwotCi0JdGltZXItPmluX2xpc3QgPSAxOwotCWxsaXN0X2FkZCgmdGltZXItPmVudHJ5LCAmdGltZXJfbGlzdCk7Ci19Ci0KLXZvaWQgYnNjX3NjaGVkdWxlX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgaW50IHNlY29uZHMsIGludCBtaWNyb3NlY29uZHMpCi17Ci0Jc3RydWN0IHRpbWV2YWwgY3VycmVudF90aW1lOwotCi0JZ2V0dGltZW9mZGF5KCZjdXJyZW50X3RpbWUsIE5VTEwpOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJyZW50VGltZSA9IGN1cnJlbnRfdGltZS50dl9zZWMgKiBNSUNST19TRUNPTkRTICsgY3VycmVudF90aW1lLnR2X3VzZWM7Ci0JY3VycmVudFRpbWUgKz0gc2Vjb25kcyAqIE1JQ1JPX1NFQ09ORFMgKyBtaWNyb3NlY29uZHM7Ci0JdGltZXItPnRpbWVvdXQudHZfc2VjID0gY3VycmVudFRpbWUgLyBNSUNST19TRUNPTkRTOwotCXRpbWVyLT50aW1lb3V0LnR2X3VzZWMgPSBjdXJyZW50VGltZSAlIE1JQ1JPX1NFQ09ORFM7Ci0JYnNjX2FkZF90aW1lcih0aW1lcik7Ci19Ci0KLXZvaWQgYnNjX2RlbF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCi17Ci0JaWYgKHRpbWVyLT5pbl9saXN0KSB7Ci0JCXRpbWVyLT5hY3RpdmUgPSAwOwotCQl0aW1lci0+aW5fbGlzdCA9IDA7Ci0JCWxsaXN0X2RlbCgmdGltZXItPmVudHJ5KTsKLQl9Ci19Ci0KLWludCBic2NfdGltZXJfcGVuZGluZyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCi17Ci0JcmV0dXJuIHRpbWVyLT5hY3RpdmU7Ci19Ci0KLS8qCi0gKiBpZiB3ZSBoYXZlIGEgbmVhcmVzdCB0aW1lIHJldHVybiB0aGUgZGVsdGEgYmV0d2VlbiB0aGUgY3VycmVudAotICogdGltZSBhbmQgdGhlIHRpbWUgb2YgdGhlIG5lYXJlc3QgdGltZXIuCi0gKiBJZiB0aGUgbmVhcmVzdCB0aW1lciB0aW1lZCBvdXQgcmV0dXJuIE5VTEwgYW5kIHRoZW4gd2Ugd2lsbAotICogZGlzcGF0Y2ggZXZlcnl0aGluZyBhZnRlciB0aGUgc2VsZWN0Ci0gKi8KLXN0cnVjdCB0aW1ldmFsICpic2NfbmVhcmVzdF90aW1lcigpCi17Ci0Jc3RydWN0IHRpbWV2YWwgY3VycmVudF90aW1lOwotCi0JaWYgKHNfbmVhcmVzdF90aW1lLnR2X3NlYyA9PSAwICYmIHNfbmVhcmVzdF90aW1lLnR2X3VzZWMgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoZ2V0dGltZW9mZGF5KCZjdXJyZW50X3RpbWUsIE5VTEwpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQotCXVuc2lnbmVkIGxvbmcgbG9uZyBuZWFyZXN0VGltZSA9IHNfbmVhcmVzdF90aW1lLnR2X3NlYyAqIE1JQ1JPX1NFQ09ORFMgKyBzX25lYXJlc3RfdGltZS50dl91c2VjOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJyZW50VGltZSA9IGN1cnJlbnRfdGltZS50dl9zZWMgKiBNSUNST19TRUNPTkRTICsgY3VycmVudF90aW1lLnR2X3VzZWM7Ci0KLQlpZiAobmVhcmVzdFRpbWUgPCBjdXJyZW50VGltZSkgewotCQlzX3NlbGVjdF90aW1lLnR2X3NlYyA9IDA7Ci0JCXNfc2VsZWN0X3RpbWUudHZfdXNlYyA9IDA7Ci0JfSBlbHNlIHsKLQkJc19zZWxlY3RfdGltZS50dl9zZWMgPSAobmVhcmVzdFRpbWUgLSBjdXJyZW50VGltZSkgLyBNSUNST19TRUNPTkRTOwotCQlzX3NlbGVjdF90aW1lLnR2X3VzZWMgPSAobmVhcmVzdFRpbWUgLSBjdXJyZW50VGltZSkgJSBNSUNST19TRUNPTkRTOwotCX0KLQotCXJldHVybiAmc19zZWxlY3RfdGltZTsKLX0KLQotLyoKLSAqIEZpbmQgdGhlIG5lYXJlc3QgdGltZSBhbmQgdXBkYXRlIHNfbmVhcmVzdF90aW1lCi0gKi8KLXZvaWQgYnNjX3ByZXBhcmVfdGltZXJzKCkKLXsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsICpuZWFyZXN0X3RpbWVyID0gTlVMTDsKLQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lciwgJnRpbWVyX2xpc3QsIGVudHJ5KSB7Ci0JCWlmICghbmVhcmVzdF90aW1lciB8fCBUSU1FX1NNQUxMRVIodGltZXItPnRpbWVvdXQsIG5lYXJlc3RfdGltZXItPnRpbWVvdXQpKSB7Ci0JCQluZWFyZXN0X3RpbWVyID0gdGltZXI7Ci0JCX0KLQl9Ci0KLQlpZiAobmVhcmVzdF90aW1lcikgewotCQlzX25lYXJlc3RfdGltZSA9IG5lYXJlc3RfdGltZXItPnRpbWVvdXQ7Ci0JfSBlbHNlIHsKLQkJbWVtc2V0KCZzX25lYXJlc3RfdGltZSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7Ci0JfQotfQotCi0vKgotICogZmlyZSBhbGwgdGltZXJzLi4uIGFuZCByZW1vdmUgdGhlbQotICovCi1pbnQgYnNjX3VwZGF0ZV90aW1lcnMoKQotewotCXN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsICp0bXA7Ci0JaW50IHdvcmsgPSAwOwotCi0JZ2V0dGltZW9mZGF5KCZjdXJyZW50X3RpbWUsIE5VTEwpOwotCi0JLyoKLQkgKiBUaGUgY2FsbGJhY2tzIG1pZ2h0IG1lc3Mgd2l0aCBvdXIgbGlzdCBhbmQgaW4gdGhpcyBjYXNlCi0JICogZXZlbiBsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIGlzIG5vdCBzYWZlIHRvIHVzZS4gVG8gYWxsb3cKLQkgKiBkZWxfdGltZXIsIGFkZF90aW1lciwgc2NoZWR1bGVfdGltZXIgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluCi0JICogdGhlIGNhbGxiYWNrIHdlIGp1bXAgdGhyb3VnaCBzb21lIGxvb3BzLgotCSAqCi0JICogRmlyc3Qgd2Ugc2V0IHRoZSBoYW5kbGVkIGZsYWcgb2YgZWFjaCBhY3RpdmUgdGltZXIgdG8gemVybywKLQkgKiB0aGVuIHdlIGl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBhbmQgZXhlY3V0ZSB0aGUgY2FsbGJhY2tzLiBBcyB0aGUKLQkgKiBsaXN0IG1pZ2h0IGhhdmUgYmVlbiBjaGFuZ2VkIChzcGVjaWFsbHkgdGhlIG5leHQpIGZyb20gd2l0aGluCi0JICogdGhlIGNhbGxiYWNrIHdlIGhhdmUgdG8gc3RhcnQgb3ZlciBhZ2Fpbi4gT25jZSBldmVyeSBjYWxsYmFjawotCSAqIGlzIGRpc3BhdGNoZWQgd2Ugd2lsbCByZW1vdmUgdGhlIG5vbi1hY3RpdmUgZnJvbSB0aGUgbGlzdC4KLQkgKgotCSAqIFRPRE86IElmIHRoaXMgaXMgYSBwZXJmb3JtYW5jZSBpc3N1ZSB3ZSBjYW4gcG9pc29uIGEgZ2xvYmFsCi0JICogdmFyaWFibGUgaW4gYWRkX3RpbWVyIGFuZCBkZWxfdGltZXIgYW5kIG9ubHkgdGhlbiByZXN0YXJ0LgotCSAqLwotCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVyLCAmdGltZXJfbGlzdCwgZW50cnkpIHsKLQkJdGltZXItPmhhbmRsZWQgPSAwOwotCX0KLQotcmVzdGFydDoKLQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lciwgJnRpbWVyX2xpc3QsIGVudHJ5KSB7Ci0JCWlmICghdGltZXItPmhhbmRsZWQgJiYgVElNRV9TTUFMTEVSKHRpbWVyLT50aW1lb3V0LCBjdXJyZW50X3RpbWUpKSB7Ci0JCQl0aW1lci0+aGFuZGxlZCA9IDE7Ci0JCQl0aW1lci0+YWN0aXZlID0gMDsKLQkJCSgqdGltZXItPmNiKSh0aW1lci0+ZGF0YSk7Ci0JCQl3b3JrID0gMTsKLQkJCWdvdG8gcmVzdGFydDsKLQkJfQotCX0KLQotCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGltZXIsIHRtcCwgJnRpbWVyX2xpc3QsIGVudHJ5KSB7Ci0JCXRpbWVyLT5oYW5kbGVkID0gMDsKLQkJaWYgKCF0aW1lci0+YWN0aXZlKSB7Ci0JCQlic2NfZGVsX3RpbWVyKHRpbWVyKTsKLQkJfQotCX0KLQotCXJldHVybiB3b3JrOwotfQotCi1pbnQgYnNjX3RpbWVyX2NoZWNrKHZvaWQpCi17Ci0Jc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyOwotCWludCBpID0gMDsKLQotCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVyLCAmdGltZXJfbGlzdCwgZW50cnkpIHsKLQkJaSsrOwotCX0KLQlyZXR1cm4gaTsKLX0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy90bHZfcGFyc2VyLmMgYi9saWJvc21vY29yZS9zcmMvdGx2X3BhcnNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDdlNTdhLi4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL3NyYy90bHZfcGFyc2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KLSNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KLQotc3RydWN0IHRsdl9kZWZpbml0aW9uIHR2bHZfYXR0X2RlZjsKLQotaW50IHRsdl9kdW1wKHN0cnVjdCB0bHZfcGFyc2VkICpkZWMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IDB4ZmY7IGkrKykgewotCQlpZiAoIWRlYy0+bHZbaV0udmFsKQotCQkJY29udGludWU7Ci0JCXByaW50ZigiVD0lMDJ4IEw9JWRcbiIsIGksIGRlYy0+bHZbaV0ubGVuKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG9fdGFnOiAgb3V0cHV0OiB0YWcgZm91bmQKLSAqIG9fbGVuOiAgb3V0cHV0OiBsZW5ndGggb2YgdGhlIGRhdGEKLSAqIG9fdmFsOiAgb3V0cHV0OiBwb2ludGVyIHRvIHRoZSBkYXRhCi0gKiBkZWY6ICAgICBpbnB1dDogYSBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIHZhbGlkIFRMViB0YWdzIC8gY29uZmlndXJhdGlvbnMKLSAqIGJ1ZjogICAgIGlucHV0OiB0aGUgaW5wdXQgZGF0YSBidWZmZXIgdG8gYmUgcGFyc2VkCi0gKiBidWZfbGVuOiBpbnB1dDogdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXIKLSAqCi0gKiBBbHNvLCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYnkgdGhlIFRMViBlbnRyeQotICovCi1pbnQgdGx2X3BhcnNlX29uZSh1aW50OF90ICpvX3RhZywgdWludDE2X3QgKm9fbGVuLCBjb25zdCB1aW50OF90ICoqb192YWwsCi0JCSAgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpkZWYsCi0JCSAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX2xlbikKLXsKLQl1aW50OF90IHRhZzsKLQlpbnQgbGVuOwotCi0JdGFnID0gKmJ1ZjsKLQkqb190YWcgPSB0YWc7Ci0KLQkvKiBGSVhNRTogdXNlIHRhYmxlcyBmb3Iga253b24gSUVJICovCi0Jc3dpdGNoIChkZWYtPmRlZlt0YWddLnR5cGUpIHsKLQljYXNlIFRMVl9UWVBFX1Q6Ci0JCS8qIEdTTSBUUyAwNC4wNyAxMS4yLjQ6IFR5cGUgMSBUViBvciBUeXBlIDIgVCAqLwotCQkqb192YWwgPSBidWY7Ci0JCSpvX2xlbiA9IDA7Ci0JCWxlbiA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgVExWX1RZUEVfVFY6Ci0JCSpvX3ZhbCA9IGJ1ZisxOwotCQkqb19sZW4gPSAxOwotCQlsZW4gPSAyOwotCQlicmVhazsKLQljYXNlIFRMVl9UWVBFX0ZJWEVEOgotCQkqb192YWwgPSBidWYrMTsKLQkJKm9fbGVuID0gZGVmLT5kZWZbdGFnXS5maXhlZF9sZW47Ci0JCWxlbiA9IGRlZi0+ZGVmW3RhZ10uZml4ZWRfbGVuICsgMTsKLQkJYnJlYWs7Ci0JY2FzZSBUTFZfVFlQRV9UTFY6Ci0JCS8qIEdTTSBUUyAwNC4wNyAxMS4yLjQ6IFR5cGUgNCBUTFYgKi8KLQkJaWYgKGJ1ZiArIDEgPiBidWYgKyBidWZfbGVuKQotCQkJcmV0dXJuIC0xOwotCQkqb192YWwgPSBidWYrMjsKLQkJKm9fbGVuID0gKihidWYrMSk7Ci0JCWxlbiA9ICpvX2xlbiArIDI7Ci0JCWlmIChsZW4gPiBidWZfbGVuKQotCQkJcmV0dXJuIC0yOwotCQlicmVhazsKLQljYXNlIFRMVl9UWVBFX1R2TFY6Ci0JCWlmICgqKGJ1ZisxKSAmIDB4ODApIHsKLQkJCS8qIGxpa2UgVExWLCBidXQgd2l0aG91dCBoaWdoZXN0IGJpdCBvZiBsZW4gKi8KLQkJCWlmIChidWYgKyAxID4gYnVmICsgYnVmX2xlbikKLQkJCQlyZXR1cm4gLTE7Ci0JCQkqb192YWwgPSBidWYrMjsKLQkJCSpvX2xlbiA9ICooYnVmKzEpICYgMHg3ZjsKLQkJCWxlbiA9ICpvX2xlbiArIDI7Ci0JCQlpZiAobGVuID4gYnVmX2xlbikKLQkJCQlyZXR1cm4gLTI7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBsaWtlIFRMMTZWLCBmYWxsdGhyb3VnaCAqLwotCWNhc2UgVExWX1RZUEVfVEwxNlY6Ci0JCWlmICgyID4gYnVmX2xlbikKLQkJCXJldHVybiAtMTsKLQkJKm9fdmFsID0gYnVmKzM7Ci0JCSpvX2xlbiA9ICooYnVmKzEpIDw8IDggfCAqKGJ1ZisyKTsKLQkJbGVuID0gKm9fbGVuICsgMzsKLQkJaWYgKGxlbiA+IGJ1Zl9sZW4pCi0JCQlyZXR1cm4gLTI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMzsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi0vKiBkZWM6ICAgIG91dHB1dDogYSBjYWxsZXItYWxsb2NhdGVkIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgdGx2X3BhcnNlZCwKLSAqIGRlZjogICAgIGlucHV0OiBhIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgdmFsaWQgVExWIHRhZ3MgLyBjb25maWd1cmF0aW9ucwotICogYnVmOiAgICAgaW5wdXQ6IHRoZSBpbnB1dCBkYXRhIGJ1ZmZlciB0byBiZSBwYXJzZWQKLSAqIGJ1Zl9sZW46IGlucHV0OiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcgotICogbHZfdGFnOiAgaW5wdXQ6IGFuIGluaXRpYWwgTFYgdGFnIGF0IHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyCi0gKiBsdl90YWcyOiBpbnB1dDogYSBzZWNvbmQgaW5pdGlhbCBMViB0YWcgZm9sbG93aW5nIGx2X3RhZyAKLSAqLwotaW50IHRsdl9wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gKmRlZiwKLQkgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfbGVuLCB1aW50OF90IGx2X3RhZywKLQkgICAgICB1aW50OF90IGx2X3RhZzIpCi17Ci0JaW50IG9mcyA9IDAsIG51bV9wYXJzZWQgPSAwOwotCXVpbnQxNl90IGxlbjsKLQotCW1lbXNldChkZWMsIDAsIHNpemVvZigqZGVjKSk7Ci0KLQlpZiAobHZfdGFnKSB7Ci0JCWlmIChvZnMgPiBidWZfbGVuKQotCQkJcmV0dXJuIC0xOwotCQlkZWMtPmx2W2x2X3RhZ10udmFsID0gJmJ1ZltvZnMrMV07Ci0JCWRlYy0+bHZbbHZfdGFnXS5sZW4gPSBidWZbb2ZzXTsKLQkJbGVuID0gZGVjLT5sdltsdl90YWddLmxlbiArIDE7Ci0JCWlmIChvZnMgKyBsZW4gPiBidWZfbGVuKQotCQkJcmV0dXJuIC0yOwotCQludW1fcGFyc2VkKys7Ci0JCW9mcyArPSBsZW47Ci0JfQotCWlmIChsdl90YWcyKSB7Ci0JCWlmIChvZnMgPiBidWZfbGVuKQotCQkJcmV0dXJuIC0xOwotCQlkZWMtPmx2W2x2X3RhZzJdLnZhbCA9ICZidWZbb2ZzKzFdOwotCQlkZWMtPmx2W2x2X3RhZzJdLmxlbiA9IGJ1ZltvZnNdOwotCQlsZW4gPSBkZWMtPmx2W2x2X3RhZzJdLmxlbiArIDE7Ci0JCWlmIChvZnMgKyBsZW4gPiBidWZfbGVuKQotCQkJcmV0dXJuIC0yOwotCQludW1fcGFyc2VkKys7Ci0JCW9mcyArPSBsZW47Ci0JfQotCi0Jd2hpbGUgKG9mcyA8IGJ1Zl9sZW4pIHsKLQkJaW50IHJ2OwotCQl1aW50OF90IHRhZzsKLQkJY29uc3QgdWludDhfdCAqdmFsOwotCi0JCXJ2ID0gdGx2X3BhcnNlX29uZSgmdGFnLCAmbGVuLCAmdmFsLCBkZWYsCi0JCSAgICAgICAgICAgICAgICAgICAmYnVmW29mc10sIGJ1Zl9sZW4tb2ZzKTsKLQkJaWYgKHJ2IDwgMCkKLQkJCXJldHVybiBydjsKLQkJZGVjLT5sdlt0YWddLnZhbCA9IHZhbDsKLQkJZGVjLT5sdlt0YWddLmxlbiA9IGxlbjsKLQkJb2ZzICs9IHJ2OwotCQludW1fcGFyc2VkKys7Ci0JfQotCS8vdGx2X2R1bXAoZGVjKTsKLQlyZXR1cm4gbnVtX3BhcnNlZDsKLX0KLQotLyogdGFrZSBhIG1hc3RlciAoc3JjKSB0bHZkZXYgYW5kIGZpbGwgdXAgYWxsIGVtcHR5IHNsb3RzIGluICdkc3QnICovCi12b2lkIHRsdl9kZWZfcGF0Y2goc3RydWN0IHRsdl9kZWZpbml0aW9uICpkc3QsIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiAqc3JjKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHN0LT5kZWYpOyBpKyspIHsKLQkJaWYgKHNyYy0+ZGVmW2ldLnR5cGUgPT0gVExWX1RZUEVfTk9ORSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZHN0LT5kZWZbaV0udHlwZSA9PSBUTFZfVFlQRV9OT05FKQotCQkJZHN0LT5kZWZbaV0gPSBzcmMtPmRlZltpXTsKLQl9Ci19Ci0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfdGx2KHZvaWQpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHZsdl9hdHRfZGVmLmRlZik7IGkrKykKLQkJdHZsdl9hdHRfZGVmLmRlZltpXS50eXBlID0gVExWX1RZUEVfVHZMVjsKLX0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy91dGlscy5jIGIvbGlib3Ntb2NvcmUvc3JjL3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYWIwNjQuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvc3JjL3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgotCi1zdGF0aWMgY2hhciBuYW1lYnVmWzI1NV07Ci1jb25zdCBjaGFyICpnZXRfdmFsdWVfc3RyaW5nKGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgKnZzLCB1aW50MzJfdCB2YWwpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOzsgaSsrKSB7Ci0JCWlmICh2c1tpXS52YWx1ZSA9PSAwICYmIHZzW2ldLnN0ciA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWlmICh2c1tpXS52YWx1ZSA9PSB2YWwpCi0JCQlyZXR1cm4gdnNbaV0uc3RyOwotCX0KLQotCXNucHJpbnRmKG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSwgInVua25vd24gMHgleCIsIHZhbCk7Ci0JcmV0dXJuIG5hbWVidWY7Ci19Ci0KLWludCBnZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgKnZzLCBjb25zdCBjaGFyICpzdHIpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOzsgaSsrKSB7Ci0JCWlmICh2c1tpXS52YWx1ZSA9PSAwICYmIHZzW2ldLnN0ciA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWlmICghc3RyY2FzZWNtcCh2c1tpXS5zdHIsIHN0cikpCi0JCQlyZXR1cm4gdnNbaV0udmFsdWU7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1jaGFyIGJjZDJjaGFyKHVpbnQ4X3QgYmNkKQotewotCWlmIChiY2QgPCAweGEpCi0JCXJldHVybiAnMCcgKyBiY2Q7Ci0JZWxzZQotCQlyZXR1cm4gJ0EnICsgKGJjZCAtIDB4YSk7Ci19Ci0KLS8qIG9ubHkgd29ya3MgZm9yIG51bWJlcnMgaW4gYXNjY2kgKi8KLXVpbnQ4X3QgY2hhcjJiY2QoY2hhciBjKQotewotCXJldHVybiBjIC0gMHgzMDsKLX0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy93cml0ZV9xdWV1ZS5jIGIvbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTA4YjQuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKiBHZW5lcmljIHdyaXRlIHF1ZXVlIGltcGxlbWVudGF0aW9uICovCi0vKgotICogKEMpIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKLSAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCi0gKgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlIDxvc21vY29yZS93cml0ZV9xdWV1ZS5oPgotCi1pbnQgd3JpdGVfcXVldWVfYmZkX2NiKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKLXsKLQlzdHJ1Y3Qgd3JpdGVfcXVldWUgKnF1ZXVlOwotCi0JcXVldWUgPSBjb250YWluZXJfb2YoZmQsIHN0cnVjdCB3cml0ZV9xdWV1ZSwgYmZkKTsKLQotCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCi0JCXF1ZXVlLT5yZWFkX2NiKGZkKTsKLQotCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKSB7Ci0JCXN0cnVjdCBtc2diICptc2c7Ci0KLQkJZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKLQkJbXNnID0gbXNnYl9kZXF1ZXVlKCZxdWV1ZS0+bXNnX3F1ZXVlKTsKLQkJaWYgKCFtc2cpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJLS1xdWV1ZS0+Y3VycmVudF9sZW5ndGg7Ci0JCXF1ZXVlLT53cml0ZV9jYihmZCwgbXNnKTsKLQkJbXNnYl9mcmVlKG1zZyk7Ci0KLQkJaWYgKCFsbGlzdF9lbXB0eSgmcXVldWUtPm1zZ19xdWV1ZSkpCi0JCQlmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgd3JpdGVfcXVldWVfaW5pdChzdHJ1Y3Qgd3JpdGVfcXVldWUgKnF1ZXVlLCBpbnQgbWF4X2xlbmd0aCkKLXsKLQlxdWV1ZS0+bWF4X2xlbmd0aCA9IG1heF9sZW5ndGg7Ci0JcXVldWUtPmN1cnJlbnRfbGVuZ3RoID0gMDsKLQlxdWV1ZS0+cmVhZF9jYiA9IE5VTEw7Ci0JcXVldWUtPndyaXRlX2NiID0gTlVMTDsKLQlxdWV1ZS0+YmZkLmNiID0gd3JpdGVfcXVldWVfYmZkX2NiOwotCUlOSVRfTExJU1RfSEVBRCgmcXVldWUtPm1zZ19xdWV1ZSk7Ci19Ci0KLWludCB3cml0ZV9xdWV1ZV9lbnF1ZXVlKHN0cnVjdCB3cml0ZV9xdWV1ZSAqcXVldWUsIHN0cnVjdCBtc2diICpkYXRhKQotewotLy8JaWYgKHF1ZXVlLT5jdXJyZW50X2xlbmd0aCArIDEgPj0gcXVldWUtPm1heF9sZW5ndGgpCi0vLwkJTE9HUChETVNDLCBMT0dMX0VSUk9SLCAiVGhlIHF1ZXVlIGlzIGZ1bGwuIERyb3BwaW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKLQotCSsrcXVldWUtPmN1cnJlbnRfbGVuZ3RoOwotCW1zZ2JfZW5xdWV1ZSgmcXVldWUtPm1zZ19xdWV1ZSwgZGF0YSk7Ci0JcXVldWUtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvdGVzdHMvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS90ZXN0cy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExOWEwMi4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS90ZXN0cy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotaWYgRU5BQkxFX1RFU1RTCi1TVUJESVJTID0gdGltZXIgc21zCi1lbmRpZgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvdGVzdHMvc21zL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvc21zL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGYxZmY2Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKLW5vaW5zdF9QUk9HUkFNUyA9IHNtc190ZXN0Ci0KLXNtc190ZXN0X1NPVVJDRVMgPSBzbXNfdGVzdC5jCi1zbXNfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGlib3Ntb2NvcmUubGEKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9zbXNfdGVzdC5jIGIvbGlib3Ntb2NvcmUvdGVzdHMvc21zL3Ntc190ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MTgzZDUuLjAwMDAwMDAKLS0tIGEvbGlib3Ntb2NvcmUvdGVzdHMvc21zL3Ntc190ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogKEMpIDIwMDggYnkgRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+Ci0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgotI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCi17Ci0JcHJpbnRmKCJTTVMgdGVzdGluZ1xuIik7Ci0Jc3RydWN0IG1zZ2IgKm1zZzsKLQl1aW50OF90ICpzbXM7Ci0JdWludDhfdCBpOwotCi0gICAgICAgIC8qIHRlc3QgNy1iaXQgY29kaW5nL2RlY29kaW5nICovCi0JY29uc3QgY2hhciAqaW5wdXQgPSAidGVzdCB0ZXh0IjsKLQl1aW50OF90IGxlbmd0aDsKLQl1aW50OF90IGNvZGVkWzI1Nl07Ci0JY2hhciByZXN1bHRbMjU2XTsKLQotCWxlbmd0aCA9IGdzbV83Yml0X2VuY29kZShjb2RlZCwgaW5wdXQpOwotCWdzbV83Yml0X2RlY29kZShyZXN1bHQsIGNvZGVkLCBsZW5ndGgpOwotCWlmIChzdHJjbXAocmVzdWx0LCBpbnB1dCkgIT0gMCkgewotCQlwcmludGYoIjcgQml0IGNvZGluZyBmYWlsZWQuLi4gbGlmZSBzdWNrc1xuIik7Ci0JCXByaW50ZigiV2FudGVkOiAnJXMnIGdvdCAnJXMnXG4iLCBpbnB1dCwgcmVzdWx0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9saWJvc21vY29yZS90ZXN0cy90aW1lci9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2RlY2Y1Li4wMDAwMDAwCi0tLSBhL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1JTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQotbm9pbnN0X1BST0dSQU1TID0gdGltZXJfdGVzdAotCi10aW1lcl90ZXN0X1NPVVJDRVMgPSB0aW1lcl90ZXN0LmMKLXRpbWVyX3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYm9zbW9jb3JlLmxhCi0KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYyBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NThkOC4uMDAwMDAwMAotLS0gYS9saWJvc21vY29yZS90ZXN0cy90aW1lci90aW1lcl90ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogKEMpIDIwMDggYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KLSNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KLQotI2luY2x1ZGUgIi4uLy4uL2NvbmZpZy5oIgotCi1zdGF0aWMgdm9pZCB0aW1lcl9maXJlZCh2b2lkICpkYXRhKTsKLQotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX29uZSA9IHsKLSAgICAuY2IgPSB0aW1lcl9maXJlZCwKLSAgICAuZGF0YSA9ICh2b2lkKikxLAotfTsKLQotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX3R3byA9IHsKLSAgICAuY2IgPSB0aW1lcl9maXJlZCwKLSAgICAuZGF0YSA9ICh2b2lkKikyLAotfTsKLQotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX3RocmVlID0gewotICAgIC5jYiA9IHRpbWVyX2ZpcmVkLAotICAgIC5kYXRhID0gKHZvaWQqKTMsCi19OwotCi1zdGF0aWMgdm9pZCB0aW1lcl9maXJlZCh2b2lkICpfZGF0YSkKLXsKLSAgICB1bnNpZ25lZCBsb25nIGRhdGEgPSAodW5zaWduZWQgbG9uZykgX2RhdGE7Ci0gICAgcHJpbnRmKCJGaXJlZCB0aW1lcjogJWx1XG4iLCBkYXRhKTsKLQotICAgIGlmIChkYXRhID09IDEpIHsKLSAgICAgICAgYnNjX3NjaGVkdWxlX3RpbWVyKCZ0aW1lcl9vbmUsIDMsIDApOwotICAgICAgICBic2NfZGVsX3RpbWVyKCZ0aW1lcl90d28pOwotICAgIH0gZWxzZSBpZiAoZGF0YSA9PSAyKSB7Ci0gICAgICAgIHByaW50ZigiU2hvdWxkIG5vdCBiZSBmaXJlZC4uLiBidWcgaW4gZGVsX3RpbWVyXG4iKTsKLSAgICB9IGVsc2UgaWYgKGRhdGEgPT0gMykgewotICAgICAgICBwcmludGYoIlRpbWVyIGZpcmVkIG5vdCByZWdpc3RlcmluZyBhZ2FpblxuIik7Ci0gICAgfSBlbHNlICB7Ci0gICAgICAgIHByaW50Zigid3RmLi4uIHdyb25nIGRhdGFcbiIpOwotICAgIH0KLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIHByaW50ZigiU3RhcnRpbmcuLi4gdGltZXJcbiIpOwotCi0gICAgYnNjX3NjaGVkdWxlX3RpbWVyKCZ0aW1lcl9vbmUsIDMsIDApOwotICAgIGJzY19zY2hlZHVsZV90aW1lcigmdGltZXJfdHdvLCA1LCAwKTsKLSAgICBic2Nfc2NoZWR1bGVfdGltZXIoJnRpbWVyX3RocmVlLCA0LCAwKTsKLQotI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgYnNjX3NlbGVjdF9tYWluKDApOwotICAgIH0KLSNlbHNlCi0gICAgcHJpbnRmKCJTZWxlY3Qgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIVxuIik7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL29wZW5ic2MvUkVBRE1FIGIvb3BlbmJzYy9SRUFETUUKaW5kZXggNTE4MDdiYi4uZmEwMWZmNCAxMDA2NDQKLS0tIGEvb3BlbmJzYy9SRUFETUUKKysrIGIvb3BlbmJzYy9SRUFETUUKQEAgLTE0LDYgKzE0LDggQEAKIAogICogQS1iaXMgb3ZlciBJUCBhcyB1c2VkIGJ5IHRoZSBpcC5hY2Nlc3MgbmFub0JUUyBwcm9kdWN0IGZhbWlseQogCitZb3UgY2FuIGZpbmQgdGhlIHByb2plY3QgZG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vb3BlbmJzYy5nbnVtb25rcy5vcmcvCisKIFRoaXMgcHJvamVjdCBpcyBzdGlsbCBpbiBpdHMgZWFybHkgZGF5cywgYW5kIHRoZXJlIGFyZSBsb3RzIG9mIGFyZWFzIHdoZXJlIGl0CiBkb2Vzbid0IGJlaGF2ZSBhcyBwZXIgR1NNIHNwZWMuCiAKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29uZmlndXJlLmluIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KaW5kZXggMjdmYjBlZC4uZDJmZDY3YSAxMDA2NDQKLS0tIGEvb3BlbmJzYy9jb25maWd1cmUuaW4KKysrIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KQEAgLTE3LDggKzE3LDEzIEBACiBkbmwgY2hlY2tzIGZvciBsaWJyYXJpZXMKIEFDX1NFQVJDSF9MSUJTKGNyeXB0LCBjcnlwdCwKICAgICBbTElCQ1JZUFQ9Ii1sY3J5cHQiOyBBQ19ERUZJTkUoW1ZUWV9DUllQVF9QV10sIFtdLCBbVXNlIGNyeXB0IGZ1bmN0aW9uYWxpdHkgb2YgdnR5Ll0pXSkKK0FDX1NFQVJDSF9MSUJTKGd0cF9uZXcsIGd0cCwKKyAgICBbTElCQ1JZUFQ9Ii1sZ3RwIjsgQUNfU1VCU1QoW0dQUlNfTElCR1RQXSwgWzFdKV0pCiAKLVBLR19DSEVDS19NT0RVTEVTKExJQk9TTU9DT1JFLCBsaWJvc21vY29yZSA+PSAwLjEuMSkKK0FNX0NPTkRJVElPTkFMKEhBVkVfTElCR1RQLCB0ZXN0ICJ4JEdQUlNfTElCR1RQIiAhPSAieCIpCisKK1BLR19DSEVDS19NT0RVTEVTKExJQk9TTU9DT1JFLCBsaWJvc21vY29yZSA+PSAwLjEuMTEpCitQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJPU01PVlRZLCBsaWJvc21vdnR5ID49IDAuMS45KQogCiBkbmwgY2hlY2tzIGZvciBoZWFkZXIgZmlsZXMKIEFDX0hFQURFUl9TVERDCkBAIC00NCwxMCArNDksMTEgQEAKICAgICBvcGVuYnNjLnBjCiAgICAgbGlic2NjcC5wYwogICAgIGluY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZQotICAgIGluY2x1ZGUvdnR5L01ha2VmaWxlCiAgICAgaW5jbHVkZS9zY2NwL01ha2VmaWxlCiAgICAgaW5jbHVkZS9NYWtlZmlsZQogICAgIHNyYy9NYWtlZmlsZQorICAgIHNyYy9pcGFjY2Vzcy9NYWtlZmlsZQorICAgIHNyYy9ncHJzL01ha2VmaWxlCiAgICAgdGVzdHMvTWFrZWZpbGUKICAgICB0ZXN0cy9kZWJ1Zy9NYWtlZmlsZQogICAgIHRlc3RzL2dzbTA0MDgvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29udHJpYi9ncHJzL2diLXByb3h5LXVuYmxvY2stYnVnLnB5IGIvb3BlbmJzYy9jb250cmliL2dwcnMvZ2ItcHJveHktdW5ibG9jay1idWcucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGNkNGI4NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9ncHJzL2diLXByb3h5LXVuYmxvY2stYnVnLnB5CkBAIC0wLDAgKzEsNTggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiIKK2RlbW9uc3RyYXRlIGEgdW5ibG9jayBidWcgb24gdGhlIEdCIFByb3h5Li4KKyIiIgorCitidHNfbnNfcmVzZXQgPSAiXHgwMlx4MDBceDgxXHgwMVx4MDFceDgyXHgxZlx4ZTdceDA0XHg4Mlx4MWZceGU3IgorbnNfcmVzZXRfYWNrID0gIlx4MDNceDAxXHg4Mlx4MWZceGU3XHgwNFx4ODJceDFmXHhlNyIKKworYnRzX25zX3VuYmxvY2sgPSAiXHgwNiIKK25zX3VuYmxvY2tfYWNrID0gIlx4MDciCisKK2J0c19idmNfcmVzZXRfMCA9ICJceDAwXHgwMFx4MDBceDAwXHgyMlx4MDRceDgyXHgwMFx4MDBceDA3XHg4MVx4MDNceDNiXHg4MVx4MDIiCituc19idmNfcmVzZXRfMF9hY2sgPSAiXHgwMFx4MDBceDAwXHgwMFx4MjNceDA0XHg4Mlx4MDBceDAwIgorCitidHNfYnZjX3Jlc2V0XzgxNjcgPSAiXHgwMFx4MDBceDAwXHgwMFx4MjJceDA0XHg4Mlx4MWZceGU3XHgwN1x4ODFceDA4XHgwOFx4ODhceDcyXHhmNFx4ODBceDEwXHgxY1x4MDBceDljXHg0MCIKKworCitpbXBvcnQgc29ja2V0Citzb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKK3NvY2tldC5iaW5kKCgiMC4wLjAuMCIsIDApKQorc29ja2V0LnNldGJsb2NraW5nKDEpCisKKworaW1wb3J0IHN5cworcG9ydCA9IGludChzeXMuYXJndlsxXSkKK3ByaW50ICJTZW5kaW5nIGRhdGEgdG8gcG9ydDogJWQiICUgcG9ydAorCitkZWYgc2VuZF9hbmRfcmVjZWl2ZShwYWNrZXQpOgorICAgIHNvY2tldC5zZW5kdG8ocGFja2V0LCAoIjEyNy4wLjAuMSIsIHBvcnQpKQorCisgICAgdHJ5OgorICAgICAgICBkYXRhLCBhZGRyID0gc29ja2V0LnJlY3Zmcm9tKDQwOTYpCisgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAgcHJpbnQgIkVSUk9SIiwgZQorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHN5cy5leGl0KDApCisgICAgcmV0dXJuIGRhdGEKKworI3NlbmQgc3R1ZmYgb25jZQorCit0b19zZW5kID0gWworICAgIChidHNfbnNfcmVzZXQsIG5zX3Jlc2V0X2FjaywgInJlc2V0IGFjayIpLAorICAgIChidHNfbnNfdW5ibG9jaywgbnNfdW5ibG9ja19hY2ssICJ1bmJsb2NrIGFjayIpLAorICAgIChidHNfYnZjX3Jlc2V0XzAsIG5zX2J2Y19yZXNldF8wX2FjaywgIkJWQ0k9MCByZXNldCBhY2siKSwKK10KKworCitmb3IgKG91dCwgaW5wLCB0eXBlKSBpbiB0b19zZW5kOgorICAgIHJlcyA9IHNlbmRfYW5kX3JlY2VpdmUob3V0KQorICAgIGlmIHJlcyAhPSBpbnA6CisgICAgICAgIHByaW50ICJGYWlsZWQgdG8gZ2V0IHRoZSAlcyIgJSB0eXBlCisgICAgICAgIHN5cy5leGl0KC0xKQorCitpbXBvcnQgdGltZQordGltZS5zbGVlcCgzKQorcmVzID0gc2VuZF9hbmRfcmVjZWl2ZShidHNfYnZjX3Jlc2V0XzgxNjcpCitwcmludCAiU2VudCBhbGwgbWVzc2FnZXMuLi4gY2hlY2sgd2lyZXNoYXJrIGZvciB0aGUgbGFzdCByZXNwb25zZSIKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29udHJpYi9ncHJzL2dwcnMtYnNzZ3AtaGlzdG9ncmFtLmx1YSBiL29wZW5ic2MvY29udHJpYi9ncHJzL2dwcnMtYnNzZ3AtaGlzdG9ncmFtLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFiNWRmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb250cmliL2dwcnMvZ3Bycy1ic3NncC1oaXN0b2dyYW0ubHVhCkBAIC0wLDAgKzEsNzggQEAKKy0tIFNpbXBsZSBMVUEgc2NyaXB0IHRvIHByaW50IHRoZSBzaXplIG9mIEJTU0dQIG1lc3NhZ2VzIG92ZXIgdGhlaXIgdHlwZS4uLgorCitkbworCWxvY2FsIGlwX2J1Y2tldCA9IHt9CisKKwlsb2NhbCBwZHVfdHlwZXMgPSB7fQorCXBkdV90eXBlc1sgNl0gPSAiUEFHSU5HIgorCXBkdV90eXBlc1sxMV0gPSAiU1VTUEVORCIKKwlwZHVfdHlwZXNbMTJdID0gIlNVU1BFTkQtQUNLIgorCXBkdV90eXBlc1szMl0gPSAiQlZDLUJMT0NLIgorCXBkdV90eXBlc1szM10gPSAiQlZDLUJMT0NLLUFDSyIKKwlwZHVfdHlwZXNbMzRdID0gIkJWQy1SRVNFVCIKKwlwZHVfdHlwZXNbMzVdID0gIkJWQy1SRVNFVC1BQ0siCisJcGR1X3R5cGVzWzM2XSA9ICJVTkJMT0NLIgorCXBkdV90eXBlc1szN10gPSAiVU5CTE9DSy1BQ0siCisJcGR1X3R5cGVzWzM4XSA9ICJGTE9XLUNPTlRST0wtQlZDIgorCXBkdV90eXBlc1szOV0gPSAiRkxPVy1DT05UUk9MLUJWQy1BQ0siCisJcGR1X3R5cGVzWzQwXSA9ICJGTE9XLUNPTlRST0wtTVMiCisJcGR1X3R5cGVzWzQxXSA9ICJGTE9XLUNPTlRST0wtTVMtQUNLIgorCXBkdV90eXBlc1s0NF0gPSAiTExDLURJU0NBUkRFRCIKKworCWxvY2FsIGZ1bmN0aW9uIGluaXRfbGlzdGVuZXIoKQorCQktLSBoYW5kbGUgdGhlIHBvcnQgYXMgTlMgb3ZlciBJUAorCQlsb2NhbCB1ZHBfcG9ydF90YWJsZSA9IERpc3NlY3RvclRhYmxlLmdldCgidWRwLnBvcnQiKQorCQlsb2NhbCBncHJzX25zX2RpcyA9IERpc3NlY3Rvci5nZXQoImdwcnNfbnMiKQorCQl1ZHBfcG9ydF90YWJsZTphZGQoMjMwMDAsZ3Byc19uc19kaXMpCisKKwkJLS0gYnNzZ3AgZmlsdGVycworCQlsb2NhbCBic3NncF9wZHVfZ2V0ID0gRmllbGQubmV3KCJic3NncC5wZHVfdHlwZSIpCisJCWxvY2FsIHVkcF9sZW5ndGhfZ2V0ID0gRmllbGQubmV3KCJ1ZHAubGVuZ3RoIikKKworCQlsb2NhbCB0YXAgPSBMaXN0ZW5lci5uZXcoImlwIiwgInVkcC5wb3J0ID09IDIzMDAwIikKKwkJZnVuY3Rpb24gdGFwLnBhY2tldChwaW5mbyx0dmIsaXApCisJCQlsb2NhbCBwZHUgPSBic3NncF9wZHVfZ2V0KCkKKwkJCWxvY2FsIGxlbiA9IHVkcF9sZW5ndGhfZ2V0KCkKKworCQkJLS0gb25seSBoYW5kbGUgYnNzZ3AsIGJ1dCB3ZSBhbHNvIHdhbnQgdGhlIElQIGZyYW1lCisJCQlpZiBub3QgcGR1IHRoZW4KKwkJCQlyZXR1cm4KKwkJCWVuZAorCisJCQlwZHUgPSB0b3N0cmluZyhwZHUpCisJCQlpZiB0b251bWJlcihwZHUpID09IDAgb3IgdG9udW1iZXIocGR1KSA9PSAxIHRoZW4KKwkJCQlyZXR1cm4KKwkJCWVuZAorCisJCQlsb2NhbCBpcF9zcmMgPSB0b3N0cmluZyhpcC5pcF9zcmMpCisJCQlsb2NhbCBic3NncF9oaXN0byA9IGlwX2J1Y2tldFtpcF9zcmNdCisJCQlpZiBub3QgYnNzZ3BfaGlzdG8gdGhlbgorCQkJCWJzc2dwX2hpc3RvID0ge30KKwkJCQlpcF9idWNrZXRbaXBfc3JjXSA9IGJzc2dwX2hpc3RvCisJCQllbmQKKworCQkJbG9jYWwga2V5ID0gcGR1CisJCQlsb2NhbCBidWNrZXQgPSBic3NncF9oaXN0b1trZXldCisJCQlpZiBub3QgYnVja2V0IHRoZW4KKwkJCQlidWNrZXQgPSB7fQorCQkJCWJzc2dwX2hpc3RvW2tleV0gPSBidWNrZXQKKwkJCWVuZAorCisJCQl0YWJsZS5pbnNlcnQoYnVja2V0LCB0b3N0cmluZyhsZW4pKQorCQkJcHJpbnQoIklQOiAiIC4uIGlwX3NyYyAuLiAiIFBEVTogIiAuLiBwZHVfdHlwZXNbdG9udW1iZXIocGR1KV0gLi4gIiBMZW5ndGg6ICIgLi4gdG9zdHJpbmcobGVuKSkKKwkJZW5kCisKKwkJZnVuY3Rpb24gdGFwLmRyYXcoKQorCQkJLS0gd2VsbC4uLiB0aGlzIHdpbGwgbm90IGJlIGNhbGxlZC4uLgorLS0JCQlmb3IgaXAsYnNzZ3BfaGlzdG8gaW4gcGFpcnMoZHVtcGVycykgZG8KKy0tCQkJCXByaW50KCJJUCAiIC4uIGlwKQorLS0JCQllbmQKKwkJZW5kCisKKwkJZnVuY3Rpb24gdGFwLnJlc2V0KCkKKwkJCS0tIHdlbGwuLi4gdGhpcyB3aWxsIG5vdCBiZSBjYWxsZWQuLi4KKwkJZW5kCisJZW5kCisKKwlpbml0X2xpc3RlbmVyKCkKK2VuZApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL2dwcnMvZ3Bycy1zcGxpdC10cmFjZS1ieS10bGxpLmx1YSBiL29wZW5ic2MvY29udHJpYi9ncHJzL2dwcnMtc3BsaXQtdHJhY2UtYnktdGxsaS5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4YzM3NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9ncHJzL2dwcnMtc3BsaXQtdHJhY2UtYnktdGxsaS5sdWEKQEAgLTAsMCArMSw0NiBAQAorLS0gQ3JlYXRlIGEgZmlsZSBuYW1lZCBieV9pcC8nJ2lwX2FkZGVzcycnLmNhcCB3aXRoIGFsbCBpcCB0cmFmZmljIG9mIGVhY2ggaXAgaG9zdC4gKHdvcmtzIGZvciB0c2hhcmsgb25seSkKKy0tIER1bXAgZmlsZXMgYXJlIGNyZWF0ZWQgZm9yIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBob3N0cworZG8KKwlsb2NhbCBkaXIgPSAiYnlfdGxsaSIKKwlsb2NhbCBkdW1wZXJzID0ge30KKwlsb2NhbCBmdW5jdGlvbiBpbml0X2xpc3RlbmVyKCkKKwkJbG9jYWwgdWRwX3BvcnRfdGFibGUgPSBEaXNzZWN0b3JUYWJsZS5nZXQoInVkcC5wb3J0IikKKwkJbG9jYWwgZ3Byc19uc19kaXMgPSBEaXNzZWN0b3IuZ2V0KCJncHJzX25zIikKKwkJdWRwX3BvcnRfdGFibGU6YWRkKDIzMDAwLGdwcnNfbnNfZGlzKQorCisJCWxvY2FsIGZpZWxkX3RsbGkgPSBGaWVsZC5uZXcoImJzc2dwLnRsbGkiKQorCQlsb2NhbCB0YXAgPSBMaXN0ZW5lci5uZXcoImlwIiwgInVkcC5wb3J0ID09IDIzMDAwIikKKworCQktLSB3ZSB3aWxsIGJlIGNhbGxlZCBvbmNlIGZvciBldmVyeSBJUCBIZWFkZXIuCisJCS0tIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBJUCBoZWFkZXIgaW4gYSBnaXZlbiBwYWNrZXQgd2UnbGwgZHVtcCB0aGUgcGFja2V0IG9uY2UgcGVyIGV2ZXJ5IGhlYWRlcgorCQlmdW5jdGlvbiB0YXAucGFja2V0KHBpbmZvLHR2YixpcCkKKwkJCWxvY2FsIHRsbGkgPSBmaWVsZF90bGxpKCkKKwkJCWlmIG5vdCB0bGxpIHRoZW4KKwkJCQlyZXR1cm4KKwkJCWVuZAorCisJCQlsb2NhbCB0bGxpX3N0ciA9IHRvc3RyaW5nKHRsbGkpCisJCQl0bGxpX2RtcCA9IGR1bXBlcnNbdGxsaV9zdHJdCisJCQlpZiBub3QgdGxsaV9kbXAgdGhlbgorCQkJCWxvY2FsIHRsbGlfaGV4ID0gc3RyaW5nLmZvcm1hdCgiMHgleCIsIHRvbnVtYmVyKHRsbGlfc3RyKSkKKwkJCQlwcmludCgiQ3JlYXRpbmcgZHVtcCBmb3IgVExMSSAiIC4uIHRsbGlfaGV4KQorCQkJCXRsbGlfZG1wID0gRHVtcGVyLm5ld19mb3JfY3VycmVudChkaXIgLi4gIi8iIC4uIHRsbGlfaGV4IC4uICIucGNhcCIpCisJCQkJZHVtcGVyc1t0bGxpX3N0cl0gPSB0bGxpX2RtcAorCQkJZW5kCisJCQl0bGxpX2RtcDpkdW1wX2N1cnJlbnQoKQorCQkJdGxsaV9kbXA6Zmx1c2goKQorCQllbmQKKwkJZnVuY3Rpb24gdGFwLmRyYXcoKQorCQkJZm9yIHRsbGksZHVtcGVyIGluIHBhaXJzKGR1bXBlcnMpIGRvCisJCQkJIGR1bXBlcjpmbHVzaCgpCisJCQllbmQKKwkJZW5kCisJCWZ1bmN0aW9uIHRhcC5yZXNldCgpCisJCQlmb3IgdGxsaSxkdW1wZXIgaW4gcGFpcnMoZHVtcGVycykgZG8KKwkJCQkgZHVtcGVyOmNsb3NlKCkKKwkJCWVuZAorCQkJZHVtcGVycyA9IHt9CisJCWVuZAorCWVuZAorCWluaXRfbGlzdGVuZXIoKQorZW5kCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvZ3Bycy9ncHJzLXZlcmlmeS1udS5sdWEgYi9vcGVuYnNjL2NvbnRyaWIvZ3Bycy9ncHJzLXZlcmlmeS1udS5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0ZmRkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9ncHJzL2dwcnMtdmVyaWZ5LW51Lmx1YQpAQCAtMCwwICsxLDU5IEBACistLSBUaGlzIHNjcmlwdCB2ZXJpZmllcyB0aGF0IHRoZSBOKFUpIGlzIGluY3JlYXNpbmcuLi4KKy0tCitkbworCWxvY2FsIG51X3N0YXRlX3NyYyA9IHt9CisKKwlsb2NhbCBmdW5jdGlvbiBpbml0X2xpc3RlbmVyKCkKKwkJLS0gaGFuZGxlIHRoZSBwb3J0IGFzIE5TIG92ZXIgSVAKKwkJbG9jYWwgdWRwX3BvcnRfdGFibGUgPSBEaXNzZWN0b3JUYWJsZS5nZXQoInVkcC5wb3J0IikKKwkJbG9jYWwgZ3Byc19uc19kaXMgPSBEaXNzZWN0b3IuZ2V0KCJncHJzX25zIikKKwkJdWRwX3BvcnRfdGFibGU6YWRkKDIzMDAwLGdwcnNfbnNfZGlzKQorCisJCS0tIHdlIHdhbnQgdG8gbG9vayBoZXJlLi4uCisJCWxvY2FsIGxsY19zYXBpX2dldCA9IEZpZWxkLm5ldygibGxjZ3Bycy5zYXBpYiIpCisJCWxvY2FsIGxsY19udV9nZXQgPSBGaWVsZC5uZXcoImxsY2dwcnMubnUiKQorCQlsb2NhbCBic3NncF90bGxpX2dldCA9IEZpZWxkLm5ldygiYnNzZ3AudGxsaSIpCisKKwkJbG9jYWwgdGFwID0gTGlzdGVuZXIubmV3KCJpcCIsICJ1ZHAucG9ydCA9PSAyMzAwMCIpCisJCWZ1bmN0aW9uIHRhcC5wYWNrZXQocGluZm8sdHZiLGlwKQorCQkJbG9jYWwgbGxjX3NhcGkgPSBsbGNfc2FwaV9nZXQoKQorCQkJbG9jYWwgbGxjX251ID0gbGxjX251X2dldCgpCisJCQlsb2NhbCBic3NncF90bGxpID0gYnNzZ3BfdGxsaV9nZXQoKQorCisJCQlpZiBub3QgbGxjX3NhcGkgb3Igbm90IGxsY19udSBvciBub3QgYnNzZ3BfdGxsaSB0aGVuCisJCQkJcmV0dXJuCisJCQllbmQKKworCQkJbG9jYWwgaXBfc3JjID0gdG9zdHJpbmcoaXAuaXBfc3JjKQorCQkJbG9jYWwgYnNzZ3BfdGxsaSA9IHRvc3RyaW5nKGJzc2dwX3RsbGkpCisJCQlsb2NhbCBsbGNfbnUgPSB0b3N0cmluZyhsbGNfbnUpCisJCQlsb2NhbCBsbGNfc2FwaSA9IHRvc3RyaW5nKGxsY19zYXBpKQorCisJCQlsb2NhbCBzcmNfa2V5ID0gaXBfc3JjIC4uICItIiAuLiBic3NncF90bGxpIC4uICItIiAuLiBsbGNfc2FwaQorCQkJbG9jYWwgbGFzdF9udSA9IG51X3N0YXRlX3NyY1tzcmNfa2V5XQorCQkJaWYgbm90IGxhc3RfbnUgdGhlbgorCQkJCS0tIHByaW50KCJFc3RhYmxpc2hpbmcgbWFwcGluZyBmb3IgIiAuLiBzcmNfa2V5KQorCQkJCW51X3N0YXRlX3NyY1tzcmNfa2V5XSA9IGxsY19udQorCQkJCXJldHVybgorCQkJZW5kCisKKwkJCWxvY2FsIGZ1bmN0aW9uIHRvaGV4KG51bWJlcikKKwkJCQlyZXR1cm4gc3RyaW5nLmZvcm1hdCgiMHgleCIsIHRvbnVtYmVyKG51bWJlcikpCisJCQllbmQKKworCQkJbnVfc3RhdGVfc3JjW3NyY19rZXldID0gbGxjX251CisJCQlpZiB0b251bWJlcihsYXN0X251KSArIDEgfj0gdG9udW1iZXIobGxjX251KSB0aGVuCisJCQkJcHJpbnQoIkpVTVAgaW4gTihVKSBvbiBUTExJICIgLi4gdG9oZXgoYnNzZ3BfdGxsaSkgLi4gIiBhbmQgU0FQSTogIiAuLiBsbGNfc2FwaSAuLiAiIHNyYzogIiAuLiBpcF9zcmMpCisJCQkJcHJpbnQoIlx0IGxhc3Q6ICIgLi4gbGFzdF9udSAuLiAiIG5vdzogIiAuLiBsbGNfbnUpCisJCQllbmQKKwkJZW5kCisKKwkJZnVuY3Rpb24gdGFwLmRyYXcoKQorCQllbmQKKworCQlmdW5jdGlvbiB0YXAucmVzZXQoKQorCQllbmQKKwllbmQKKwlpbml0X2xpc3RlbmVyKCkKK2VuZAorCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkgYi9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkKaW5kZXggY2YzZWYzOC4uMDVjNDg5ZCAxMDA3NTUKLS0tIGEvb3BlbmJzYy9jb250cmliL21nY3Bfc2VydmVyLnB5CisrKyBiL29wZW5ic2MvY29udHJpYi9tZ2NwX3NlcnZlci5weQpAQCAtMTAsNyArMTAsNyBAQAogYXVkaXRfcGFja2V0ID0gIiIiQVVFUCAlZCAxM0BtZ3cgTUdDUCAxLjBcclxuIiIiCiBjcmN4X3BhY2tldCA9ICIiIkNSQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkw6IHA6MjAsIGE6R1NNLUVGUiwgbnQ6SU5cclxuTTogcmVjdm9ubHlcclxuIiIiCiBkbGN4X3BhY2tldCA9ICIiIkRMQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkk6ICVkXHJcbiIiIgotbWRjeF9wYWNrZXQgPSAiIiJNRENYICVkIDE0QG1ndyBNR0NQIDEuMFxyXG5DOiA0YTg0YWQ1ZDI1ZlxyXG5JOiAlZFxyXG5MOiBwOjIwLCBhOkdTTS1FRlIsIG50OklOXHJcbk06IHJlY3Zvbmx5XHJcblxyXG52PTBcclxubz0tIDI1ODY5NjQ3NyAwIElOIElQNCAxNzIuMTYuMS4xMDdcclxucz0tXHJcbmM9SU4gSVA0IDE3Mi4xNi4xLjEwN1xyXG50PTAgMFxyXG5tPWF1ZGlvIDQ0MDAgUlRQL0FWUCAxMjdcclxuYT1ydHBtYXA6MTI3IEdTTS1FRlIvODAwMC8xXHJcbmE9cHRpbWU6MjBcclxuYT1yZWN2b25seVxyXG5tPWltYWdlIDQ0MDIgdWRwdGwgdDM4XHJcbmE9VDM4RmF4VmVyc2lvbjowXHJcbmE9VDM4TWF4Qml0UmF0ZToxNDQwMFxyXG4iIiIKK21kY3hfcGFja2V0ID0gIiIiTURDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuSTogJWRcclxuTDogcDoyMCwgYTpHU00tRUZSLCBudDpJTlxyXG5NOiByZWN2b25seVxyXG5cclxudj0wXHJcbm89LSAyNTg2OTY0NzcgMCBJTiBJUDQgMTcyLjE2LjEuMTA3XHJcbnM9LVxyXG5jPUlOIElQNCAxNzIuMTYuMS4xMDdcclxudD0wIDBcclxubT1hdWRpbyA2NjY2IFJUUC9BVlAgMTI3XHJcbmE9cnRwbWFwOjEyNyBHU00tRUZSLzgwMDAvMVxyXG5hPXB0aW1lOjIwXHJcbmE9cmVjdm9ubHlcclxubT1pbWFnZSA0NDAyIHVkcHRsIHQzOFxyXG5hPVQzOEZheFZlcnNpb246MFxyXG5hPVQzOE1heEJpdFJhdGU6MTQ0MDBcclxuIiIiCiAKIGRlZiBoZXhkdW1wKHNyYywgbGVuZ3RoPTgpOgogICAgICIiIlJlY2lwZSBpcyBmcm9tIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzE0MjgxMi8iIiIKQEAgLTI1LDE1ICsyNSwyNCBAQAogCiBzZXJ2ZXJfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCiBzZXJ2ZXJfc29ja2V0LmJpbmQoKCIxMjcuMC4wLjEiLCBNR0NQX0NBTExBR0VOVF9QT1JUKSkKLXNlcnZlcl9zb2NrZXQuc2V0YmxvY2tpbmcoMCkKK3NlcnZlcl9zb2NrZXQuc2V0YmxvY2tpbmcoMSkKIAotCi1kZWYgc2VuZF9yZWNlaXZlKHBhY2tldCk6CitsYXN0X2NpID0gMQorZGVmIHNlbmRfYW5kX3JlY2VpdmUocGFja2V0KToKKyAgICBnbG9iYWwgbGFzdF9jaQogICAgIHNlcnZlcl9zb2NrZXQuc2VuZHRvKHBhY2tldCwgKCIxMjcuMC4wLjEiLCBNR0NQX0dBVEVXQVlfUE9SVCkpCiAgICAgdHJ5OgogICAgICAgICBkYXRhLCBhZGRyID0gc2VydmVyX3NvY2tldC5yZWN2ZnJvbSg0MDk2KQorCisgICAgICAgICMgYXR0ZW1wdCB0byBzdG9yZSB0aGUgQ0kgb2YgdGhlIHJlc3BvbnNlCisgICAgICAgIGxpc3QgPSBkYXRhLnNwbGl0KCJcbiIpCisgICAgICAgIGZvciBpdGVtIGluIGxpc3Q6CisgICAgICAgICAgIGlmIGl0ZW0uc3RhcnRzd2l0aCgiSTogIik6CisgICAgICAgICAgICAgICBsYXN0X2NpID0gaW50KGl0ZW1bMzpdKQorCiAgICAgICAgIHByaW50IGhleGR1bXAoZGF0YSksIGFkZHIKLSAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgIHByaW50IGUKICAgICAgICAgcGFzcwogCiBkZWYgZ2VuZXJhdGVfdGlkKCk6CkBAIC00MiwxMyArNTEsMTAgQEAKIAogCiAKLWkgPSAxCiB3aGlsZSBUcnVlOgotICAgIHNlbmRfcmVjZWl2ZShyc2lwX3Jlc3ApCi0gICAgc2VuZF9yZWNlaXZlKGF1ZGl0X3BhY2tldCkKLSAgICBzZW5kX3JlY2VpdmUoY3JjeF9wYWNrZXQgJSBnZW5lcmF0ZV90aWQoKSApCi0gICAgc2VuZF9yZWNlaXZlKG1kY3hfcGFja2V0ICUgKGdlbmVyYXRlX3RpZCgpLCBpKSkKLSAgICBzZW5kX3JlY2VpdmUoZGxjeF9wYWNrZXQgJSAoZ2VuZXJhdGVfdGlkKCksIGkpKQotICAgIGkgPSBpICsgMQorICAgIHNlbmRfYW5kX3JlY2VpdmUoYXVkaXRfcGFja2V0ICUgZ2VuZXJhdGVfdGlkKCkpCisgICAgc2VuZF9hbmRfcmVjZWl2ZShjcmN4X3BhY2tldCAlIGdlbmVyYXRlX3RpZCgpICkKKyAgICBzZW5kX2FuZF9yZWNlaXZlKG1kY3hfcGFja2V0ICUgKGdlbmVyYXRlX3RpZCgpLCBsYXN0X2NpKSkKKyAgICBzZW5kX2FuZF9yZWNlaXZlKGRsY3hfcGFja2V0ICUgKGdlbmVyYXRlX3RpZCgpLCBsYXN0X2NpKSkKIAogICAgIHRpbWUuc2xlZXAoMykKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS9NYWtlZmlsZS5hbQppbmRleCA1NmIyYTMzLi5hNGFjYzIzIDEwMDY0NAotLS0gYS9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0KKysrIGIvb3BlbmJzYy9pbmNsdWRlL01ha2VmaWxlLmFtCkBAIC0xLDMgKzEsMyBAQAotU1VCRElSUyA9IG9wZW5ic2MgdnR5IHNjY3AKK1NVQkRJUlMgPSBvcGVuYnNjIHNjY3AKIAogbm9pbnN0X0hFQURFUlMgPSBtSVNETmlmLmggY29tcGF0X2FmX2lzZG4uaApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbQppbmRleCA0ODM5OTdhLi41OTU3ZDcxIDEwMDY0NAotLS0gYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbQorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbQpAQCAtMSwxMSArMSwxNSBAQAogbm9pbnN0X0hFQURFUlMgPSBhYmlzX25tLmggYWJpc19yc2wuaCBkYi5oIGdzbV8wNF8wOC5oIGdzbV9kYXRhLmggXAogCQkgZ3NtX3N1YnNjcmliZXIuaCBnc21fMDRfMTEuaCBkZWJ1Zy5oIHNpZ25hbC5oIFwKLQkJIG1pc2RuLmggY2hhbl9hbGxvYy5oIHRlbG5ldF9pbnRlcmZhY2UuaCBwYWdpbmcuaCBcCisJCSBtaXNkbi5oIGNoYW5fYWxsb2MuaCBwYWdpbmcuaCBcCiAJCSBzdWJjaGFuX2RlbXV4LmggdHJhdV9mcmFtZS5oIGUxX2lucHV0LmggdHJhdV9tdXguaCBcCiAJCSBpcGFjY2Vzcy5oIHJzMjMyLmggb3BlbmJzY2RlZmluZXMuaCBydHBfcHJveHkuaCBcCiAJCSBic2NfcmxsLmggbW5jYy5oIHRyYW5zYWN0aW9uLmggdXNzZC5oIGdzbV8wNF84MC5oIFwKIAkJIHNpbGVudF9jYWxsLmggbWdjcC5oIG1lYXNfcmVwLmggcmVzdF9vY3RldHMuaCBcCi0JCSBzeXN0ZW1faW5mb3JtYXRpb24uaCBoYW5kb3Zlci5oIG1nY3BfaW50ZXJuYWwuaAorCQkgc3lzdGVtX2luZm9ybWF0aW9uLmggaGFuZG92ZXIuaCBtZ2NwX2ludGVybmFsLmggXAorCQkgdnR5Lmggc29ja2V0LmggXAorCQljcmMyNC5oIGdwcnNfYnNzZ3AuaCBncHJzX2xsYy5oIGdwcnNfbnMuaCBncHJzX2dtbS5oIFwKKwkJZ2JfcHJveHkuaCBncHJzX3Nnc24uaCBnc21fMDRfMDhfZ3Bycy5oIHNnc24uaCBcCisJCWdwcnNfbnNfZnJncmUuaCBhdXRoLmggb3Ntb19tc2MuaAogCi1vcGVuYnNjX0hFQURFUlMgPSBnc21fMDRfMDguaCBtZWFzX3JlcC5oCitvcGVuYnNjX0hFQURFUlMgPSBnc21fMDRfMDguaCBtZWFzX3JlcC5oIGJzY19hcGkuaAogb3BlbmJzY2RpciA9ICQoaW5jbHVkZWRpcikvb3BlbmJzYwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oCmluZGV4IDQ1MzA3ZTMuLmIzYmYyN2UgMTAwNjQ0Ci0tLSBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmgKQEAgLTU1LDYgKzU1LDggQEAKIAl1X2ludDhfdCBjYV9saXN0X3NpMVsxNl07CiB9OwogCitleHRlcm4gY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBhYmlzX25tX2FkbV9zdGF0ZV9uYW1lc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYWJpc19ubV9vYmpfY2xhc3NfbmFtZXNbXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKIAogLyogUFVCTElDICovCkBAIC05Miw3ICs5NCw3IEBACiBpbnQgYWJpc19ubV9yYXdfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsZW4sIHVfaW50OF90ICptc2cpOwogaW50IGFiaXNfbm1fZXZlbnRfcmVwb3J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOwogaW50IGFiaXNfbm1fcmVzZXRfcmVzb3VyY2Uoc3RydWN0IGdzbV9idHMgKmJ0cyk7Ci1pbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAoraW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdHJ4X25yLCBjb25zdCBjaGFyICpmbmFtZSwKIAkJCSAgdV9pbnQ4X3Qgd2luX3NpemUsIGludCBmb3JjZWQsCiAJCQkgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKTsKIGludCBhYmlzX25tX3NvZnR3YXJlX2xvYWRfc3RhdHVzKHN0cnVjdCBnc21fYnRzICpidHMpOwpAQCAtMTQ4LDcgKzE1MCw3IEBACiAJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CiBpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwKIAkJCQlpbnQgYXR0cl9sZW4pOwotaW50IGFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOwogaW50IGFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAogCQkJCXVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKIAkJCQl1X2ludDhfdCAqYXR0ciwgdV9pbnQ4X3QgYXR0cl9sZW4pOwpAQCAtMTY0LDkgKzE2NiwxMyBAQAogCUVWVF9TVEFURUNIR19BRE0sCiB9OwogaW50IG5tX3N0YXRlX2V2ZW50KGVudW0gbm1fZXZ0IGV2dCwgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB2b2lkICpvYmosCi0JCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlKTsgCisJCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlLAorCQkgICBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2luc3QpOwogCiBjb25zdCBjaGFyICpubV9vcHN0YXRlX25hbWUodV9pbnQ4X3Qgb3MpOwogY29uc3QgY2hhciAqbm1fYXZhaWxfbmFtZSh1X2ludDhfdCBhdmFpbCk7CiBpbnQgbm1faXNfcnVubmluZyhzdHJ1Y3QgZ3NtX25tX3N0YXRlICpzKTsKKworaW50IGFiaXNfbm1fdnR5X2luaXQodm9pZCk7CisKICNlbmRpZiAvKiBfTk1fSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfcnNsLmgKaW5kZXggYjI4MDE4NC4uZTg3ZjQzMCAxMDA2NDQKLS0tIGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX3JzbC5oCkBAIC01OSw3ICs1OSw3IEBACiBpbnQgcnNsX2lwYWNjX21kY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBpcCwKIAkJICAgdV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHJ0cF9wYXlsb2FkMik7CiBpbnQgcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Ci1pbnQgcnNsX2lwYWNjX3BkY2hfYWN0aXZhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IHJzbF9pcGFjY19wZGNoX2FjdGl2YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgYWN0KTsKIAogaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKIApAQCAtNjgsMTIgKzY4LDEzIEBACiB1bnNpZ25lZCBpbnQgbl9wYWdfYmxvY2tzKGludCBic19jY2NoX3NkY2NoX2NvbWIsIHVuc2lnbmVkIGludCBic19hZ19ibGtzX3Jlcyk7CiB1X2ludDY0X3Qgc3RyX3RvX2ltc2koY29uc3QgY2hhciAqaW1zaV9zdHIpOwogdV9pbnQ4X3QgbGNoYW4yY2hhbl9ucihjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Ci1pbnQgcnNsX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCk7CitpbnQgcnNsX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwgdV9pbnQ4X3QgcmVhc29uKTsKKworaW50IHJzbF9sY2hhbl9zZXRfc3RhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCk7CiAKIC8qIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvZGUgKi8KIGludCBhYmlzX3JzbF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpOwogaW50IHJzbF9kZWFjdF9zYWNjaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Ci1pbnQgcnNsX2NoYW5fcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CiAKIC8qIEJDQ0ggcmVsYXRlZCBjb2RlICovCiBpbnQgcnNsX2NjY2hfY29uZl90b19ic19jY19jaGFucyhpbnQgY2NjaF9jb25mKTsKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2F1dGguaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2F1dGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTVjYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYXV0aC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0FVVEhfSAorI2RlZmluZSBfQVVUSF9ICisKK3N0cnVjdCBnc21fYXV0aF90dXBsZTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKKworaW50IGF1dGhfZ2V0X3R1cGxlX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwgaW50IGtleV9zZXEpOworCisjZW5kaWYgLyogX0FVVEhfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX2FwaS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTVlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfYXBpLmgKQEAgLTAsMCArMSwyNiBAQAorLyogR1NNIDA4LjA4IGxpa2UgQVBJIGZvciBPcGVuQlNDICovCisKKyNpZm5kZWYgT1BFTkJTQ19CU0NfQVBJX0gKKyNkZWZpbmUgT1BFTkJTQ19CU0NfQVBJX0gKKworI2luY2x1ZGUgImdzbV9kYXRhLmgiCisKK3N0cnVjdCBic2NfYXBpIHsKKwl2b2lkICgqc2FwaV9uX3JlamVjdCkoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBkbGNpKTsKKwl2b2lkICgqY2lwaGVyX21vZGVfY29tcGwpKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLAorCQkJCSAgc3RydWN0IG1zZ2IgKm1zZywgdWludDE2X3QgaW5kKTsKKwl2b2lkICgqY29tcGxfbDMpKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLAorCQkJIHN0cnVjdCBtc2diICptc2csIHVpbnQxNl90IGNob3Nlbl9jaGFubmVsKTsgCisJdm9pZCAoKmFzc19jb21wbCkoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgIHVpbnQxNl90IHJyX2NhdXNlKTsKKwl2b2lkICgqYXNzX2ZhaWwpKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLAorCQkJIHVpbnQxNl90IHJyX2NhdXNlKTsKKwl2b2lkICgqY2xlYXJfcmVxdWVzdCkoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgICB1aW50MzJfdCBjYXVzZSk7CisJdm9pZCAoKmNsZWFyX2NvbXBsKShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubik7Cit9OworCitpbnQgYnNjX2FwaV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgc3RydWN0IGJzY19hcGkgKmFwaSk7CitpbnQgZ3NtMDgwOF9zdWJtaXRfZHRhcChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgaW50IGxpbmtfaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NoYW5fYWxsb2MuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NoYW5fYWxsb2MuaAppbmRleCBmNTY0ZTllLi5kNGY1ODU4IDEwMDY0NAotLS0gYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmgKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvY2hhbl9hbGxvYy5oCkBAIC00NSw2ICs0NSw3IEBACiAKIC8qIEZyZWUgYSBsb2dpY2FsIGNoYW5uZWwgKFNEQ0NILCBUQ0gsIC4uLikgKi8KIHZvaWQgbGNoYW5fZnJlZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Cit2b2lkIGxjaGFuX3Jlc2V0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKIAogLyogQ29uc2lkZXIgcmVsZWFzaW5nIHRoZSBjaGFubmVsICovCiBpbnQgbGNoYW5fYXV0b19yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NyYzI0LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jcmMyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OGZjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jcmMyNC5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfQ1JDMjRfSAorI2RlZmluZSBfQ1JDMjRfSAorCisjZGVmaW5lIElOSVRfQ1JDMjQJMHhmZmZmZmYKKwordV9pbnQzMl90IGNyYzI0X2NhbGModV9pbnQzMl90IGZjcywgdV9pbnQ4X3QgKmNwLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGIuaAppbmRleCBkZjY2NGRiLi4yYTUyMWYwIDEwMDY0NAotLS0gYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RiLmgKQEAgLTQ0LDE5ICs0NCwxOSBAQAogaW50IGRiX3N5bmNfZXF1aXBtZW50KHN0cnVjdCBnc21fZXF1aXBtZW50ICplcXVpcCk7CiAKIC8qIGF1dGggaW5mbyAqLwotaW50IGdldF9hdXRoaW5mb19ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOwotaW50IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7Ci1pbnQgZ2V0X2F1dGh0dXBsZV9ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOwotaW50IHNldF9hdXRodHVwbGVfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IGRiX2dldF9hdXRoaW5mb19mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgZGJfc3luY19hdXRoaW5mb19mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IGRiX2dldF9sYXN0YXV0aHR1cGxlX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgZGJfc3luY19sYXN0YXV0aHR1cGxlX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOwogCiAvKiBTTVMgc3RvcmUtYW5kLWZvcndhcmQgKi8KIGludCBkYl9zbXNfc3RvcmUoc3RydWN0IGdzbV9zbXMgKnNtcyk7Ci1zdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtaW5faWQpOwotc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1pbl9zdWJzY3JfaWQpOworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBsb25nIGxvbmcgbWluX2lkKTsKK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9ieV9zdWJzY3Ioc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fc3Vic2NyX2lkKTsKIHN0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKIGludCBkYl9zbXNfbWFya19zZW50KHN0cnVjdCBnc21fc21zICpzbXMpOwogCkBAIC02Niw2ICs2Niw5IEBACiAJCQl1X2ludDhfdCAqYXBkdSk7CiAKIC8qIFN0YXRpc3RpY3MgY291bnRlciBzdG9yYWdlICovCitzdHJ1Y3QgY291bnRlcjsKIGludCBkYl9zdG9yZV9jb3VudGVyKHN0cnVjdCBjb3VudGVyICpjdHIpOworc3RydWN0IHJhdGVfY3RyX2dyb3VwOworaW50IGRiX3N0b3JlX3JhdGVfY3RyX2dyb3VwKHN0cnVjdCByYXRlX2N0cl9ncm91cCAqY3RyZyk7CiAKICNlbmRpZiAvKiBfREJfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RlYnVnLmgKaW5kZXggNGI2N2M2MS4uMjAzYWVkYiAxMDA2NDQKLS0tIGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgogCiAjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8b3Ntb2NvcmUvbG9nZ2luZy5oPgogCiAvKiBEZWJ1ZyBBcmVhcyBvZiB0aGUgY29kZSAqLwogZW51bSB7CkBAIC0yOCwxMDQgKzI5LDQxIEBACiAJREhPLAogCUREQiwKIAlEUkVGLAorCURHUFJTLAorCUROUywKKwlEQlNTR1AsCisJRExMQywKKwlEU05EQ1AsCiAJRGVidWdfTGFzdEVudHJ5LAogfTsKIAotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERFQlVHUChzcywgZm10LCBhcmdzLi4uKSBkZWJ1Z3Aoc3MsIF9fRklMRV9fLCBfX0xJTkVfXywgMCwgZm10LCAjIyBhcmdzKQotI2RlZmluZSBERUJVR1BDKHNzLCBmbXQsIGFyZ3MuLi4pIGRlYnVncChzcywgX19GSUxFX18sIF9fTElORV9fLCAxLCBmbXQsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBERUJVR1AoeHNzLCBmbXQsIGFyZ3MuLi4pCi0jZGVmaW5lIERFQlVHUEMoc3MsIGZtdCwgYXJncy4uLikKLSNlbmRpZgotCi0KLSNkZWZpbmUgc3RhdGljX2Fzc2VydChleHAsIG5hbWUpIHR5cGVkZWYgaW50IGR1bW15IyNuYW1lIFsoZXhwKSA/IDEgOiAtMV07Ci0KLWNoYXIgKmhleGR1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKTsKLXZvaWQgZGVidWdwKHVuc2lnbmVkIGludCBzdWJzeXMsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNSwgNikpKTsKLQotLyogbmV3IGxvZ2dpbmcgaW50ZXJmYWNlICovCi0jZGVmaW5lIExPR1Aoc3MsIGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRlYnVncDIoc3MsIGxldmVsLCBfX0ZJTEVfXywgX19MSU5FX18sIDAsIGZtdCwgIyNhcmdzKQotI2RlZmluZSBMT0dQQyhzcywgbGV2ZWwsIGZtdCwgYXJncy4uLikgZGVidWdwMihzcywgbGV2ZWwsIF9fRklMRV9fLCBfX0xJTkVfXywgMSwgZm10LCAjI2FyZ3MpCi0KLS8qIGRpZmZlcmVudCBsZXZlbHMgKi8KLSNkZWZpbmUgTE9HTF9ERUJVRwkxCS8qIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBMT0dMX0lORk8JMwotI2RlZmluZSBMT0dMX05PVElDRQk1CS8qIGFibm9ybWFsL3VuZXhwZWN0ZWQgY29uZGl0aW9uICovCi0jZGVmaW5lIExPR0xfRVJST1IJNwkvKiBlcnJvciBjb25kaXRpb24sIHJlcXVpcmVzIHVzZXIgYWN0aW9uICovCi0jZGVmaW5lIExPR0xfRkFUQUwJOAkvKiBmYXRhbCwgcHJvZ3JhbSBhYm9ydGVkICovCi0KIC8qIGNvbnRleHQgKi8KICNkZWZpbmUgQlNDX0NUWF9MQ0hBTgkwCiAjZGVmaW5lIEJTQ19DVFhfU1VCU0NSCTEKICNkZWZpbmUgQlNDX0NUWF9CVFMJMgogI2RlZmluZSBCU0NfQ1RYX1NDQ1AJMworI2RlZmluZSBCU0NfQ1RYX05TVkMJNAorI2RlZmluZSBCU0NfQ1RYX0JWQwk1CiAKIC8qIHRhcmdldCAqLwogCiBlbnVtIHsKLQlERUJVR19GSUxURVJfSU1TSSA9IDEgPDwgMCwKLQlERUJVR19GSUxURVJfQUxMID0gMSA8PCAxLAorCS8vREVCVUdfRklMVEVSX0FMTCA9IDEgPDwgMCwKKwlMT0dfRklMVEVSX0lNU0kgPSAxIDw8IDEsCisJTE9HX0ZJTFRFUl9OU1ZDID0gMSA8PCAyLAorCUxPR19GSUxURVJfQlZDICA9IDEgPDwgMywKIH07CiAKLXN0cnVjdCBkZWJ1Z19jYXRlZ29yeSB7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IGxvZ2xldmVsOwotfTsKKy8qIHdlIGRvbid0IG5lZWQgYSBoZWFkZXIgZGVwZW5kZW5jeSBmb3IgdGhpcy4uLiAqLworc3RydWN0IGdwcnNfbnN2YzsKK3N0cnVjdCBic3NncF9idmNfY3R4OwogCi1zdHJ1Y3QgZGVidWdfdGFyZ2V0IHsKLQlpbnQgZmlsdGVyX21hcDsKLQljaGFyICppbXNpX2ZpbHRlcjsKK3ZvaWQgbG9nX3NldF9pbXNpX2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICppbXNpKTsKK3ZvaWQgbG9nX3NldF9uc3ZjX2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LAorCQkJIHN0cnVjdCBncHJzX25zdmMgKm5zdmMpOwordm9pZCBsb2dfc2V0X2J2Y19maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwKKwkJCXN0cnVjdCBic3NncF9idmNfY3R4ICpiY3R4KTsKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBsb2dfaW5mbyBsb2dfaW5mbzsKIAotCXN0cnVjdCBkZWJ1Z19jYXRlZ29yeSBjYXRlZ29yaWVzW0RlYnVnX0xhc3RFbnRyeV07Ci0JaW50IHVzZV9jb2xvcjsKLQlpbnQgcHJpbnRfdGltZXN0YW1wOwotCWludCBsb2dsZXZlbDsKLQotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCUZJTEUgKm91dDsKLQkJfSB0Z3Rfc3Rkb3V0OwotCi0JCXN0cnVjdCB7Ci0JCQlpbnQgcHJpb3JpdHk7Ci0JCX0gdGd0X3N5c2xvZzsKLQotCQlzdHJ1Y3QgewotCQkJdm9pZCAqdnR5OwotCQl9IHRndF92dHk7Ci0JfTsKLQotICAgICAgICB2b2lkICgqb3V0cHV0KSAoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpzdHJpbmcpOwotCi0gICAgICAgIHN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OwotfTsKLQotLyogdXNlIHRoZSBhYm92ZSBtYWNyb3MgKi8KLXZvaWQgZGVidWdwMih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgbGV2ZWwsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNiwgNykpKTsKLXZvaWQgZGVidWdfaW5pdCh2b2lkKTsKLQotLyogY29udGV4dCBtYW5hZ2VtZW50ICovCi12b2lkIGRlYnVnX3Jlc2V0X2NvbnRleHQodm9pZCk7Ci12b2lkIGRlYnVnX3NldF9jb250ZXh0KGludCBjdHgsIHZvaWQgKnZhbHVlKTsKLQotLyogZmlsdGVyIG9uIHRoZSB0YXJnZXRzICovCi12b2lkIGRlYnVnX3NldF9pbXNpX2ZpbHRlcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKmltc2kpOwotdm9pZCBkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCk7Ci12b2lkIGRlYnVnX3NldF91c2VfY29sb3Ioc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQpOwotdm9pZCBkZWJ1Z19zZXRfcHJpbnRfdGltZXN0YW1wKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50KTsKLXZvaWQgZGVidWdfc2V0X2xvZ19sZXZlbChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBsb2dfbGV2ZWwpOwotdm9pZCBkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciogbWFzayk7Ci1pbnQgZGVidWdfcGFyc2VfbGV2ZWwoY29uc3QgY2hhciAqbHZsKTsKLWludCBkZWJ1Z19wYXJzZV9jYXRlZ29yeShjb25zdCBjaGFyICpjYXRlZ29yeSk7Ci12b2lkIGRlYnVnX3NldF9jYXRlZ29yeV9maWx0ZXIoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQgY2F0ZWdvcnksIGludCBlbmFibGUsIGludCBsZXZlbCk7Ci0KLQotLyogbWFuYWdlbWVudCBvZiB0aGUgdGFyZ2V0cyAqLwotc3RydWN0IGRlYnVnX3RhcmdldCAqZGVidWdfdGFyZ2V0X2NyZWF0ZSh2b2lkKTsKLXN0cnVjdCBkZWJ1Z190YXJnZXQgKmRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKHZvaWQpOwotdm9pZCBkZWJ1Z19hZGRfdGFyZ2V0KHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCk7Ci12b2lkIGRlYnVnX2RlbF90YXJnZXQoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0KTsKICNlbmRpZiAvKiBfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ2JfcHJveHkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2diX3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkZWQyMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2diX3Byb3h5LmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfR0JfUFJPWFlfSAorI2RlZmluZSBfR0JfUFJPWFlfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9jb21tYW5kLmg+CisKK3N0cnVjdCBnYnByb3h5X2NvbmZpZyB7CisJLyogcGFyc2VkIGZyb20gY29uZmlnIGZpbGUgKi8KKwl1X2ludDE2X3QgbnNpcF9zZ3NuX25zZWk7CisKKwkvKiBtaXNjICovCisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpOworfTsKKworZXh0ZXJuIHN0cnVjdCBnYnByb3h5X2NvbmZpZyBnYmNmZzsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgc2hvd19nYnByb3h5X2NtZDsKKworLyogZ2JfcHJveHlfdnR5IC5jICovCisKK2ludCBnYnByb3h5X3Z0eV9pbml0KHZvaWQpOworaW50IGdicHJveHlfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgZ2Jwcm94eV9jb25maWcgKmNmZyk7CisKKworLyogZ2JfcHJveHkuYyAqLworCisvKiBNYWluIGlucHV0IGZ1bmN0aW9uIGZvciBHYiBwcm94eSAqLworaW50IGdicHJveF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDE2X3QgbnNfYnZjaSk7CisKK2ludCBnYnByb3hfc2lnbmFsKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCSAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSk7CisKKy8qIFJlc2V0IGFsbCBwZXJzaXN0ZW50IE5TLVZDJ3MgKi8KK2ludCBnYnByb3hfcmVzZXRfcGVyc2lzdGVudF9uc3ZjcyhzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfYnNzZ3AuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfYnNzZ3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDMyY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ic3NncC5oCkBAIC0wLDAgKzEsMjMyIEBACisjaWZuZGVmIF9HUFJTX0JTU0dQX0gKKyNkZWZpbmUgX0dQUlNfQlNTR1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFNlY3Rpb24gNS40LjEgKi8KKyNkZWZpbmUgQlZDSV9TSUdOQUxMSU5HCTB4MDAwMAorI2RlZmluZSBCVkNJX1BUTQkweDAwMDEKKworLyogU2VjdGlvbiAxMS4zLjI2IC8gVGFibGUgMTEuMjcgKi8KK2VudW0gYnNzZ3BfcGR1X3R5cGUgeworCS8qIFBEVXMgYmV0d2VlbiBSTCBhbmQgQlNTR1AgU0FQcyAqLworCUJTU0dQX1BEVVRfRExfVU5JVERBVEEJCT0gMHgwMCwKKwlCU1NHUF9QRFVUX1VMX1VOSVREQVRBCQk9IDB4MDEsCisJQlNTR1BfUERVVF9SQV9DQVBBQklMSVRZCT0gMHgwMiwKKwlCU1NHUF9QRFVUX1BUTV9VTklUREFUQQkJPSAweDAzLAorCS8qIFBEVXMgYmV0d2VlbiBHTU0gU0FQcyAqLworCUJTU0dQX1BEVVRfUEFHSU5HX1BTCQk9IDB4MDYsCisJQlNTR1BfUERVVF9QQUdJTkdfQ1MJCT0gMHgwNywKKwlCU1NHUF9QRFVUX1JBX0NBUEFfVURQQVRFCT0gMHgwOCwKKwlCU1NHUF9QRFVUX1JBX0NBUEFfVVBEQVRFX0FDSwk9IDB4MDksCisJQlNTR1BfUERVVF9SQURJT19TVEFUVVMJCT0gMHgwYSwKKwlCU1NHUF9QRFVUX1NVU1BFTkQJCT0gMHgwYiwKKwlCU1NHUF9QRFVUX1NVU1BFTkRfQUNLCQk9IDB4MGMsCisJQlNTR1BfUERVVF9TVVNQRU5EX05BQ0sJCT0gMHgwZCwKKwlCU1NHUF9QRFVUX1JFU1VNRQkJPSAweDBlLAorCUJTU0dQX1BEVVRfUkVTVU1FX0FDSwkJPSAweDBmLAorCUJTU0dQX1BEVVRfUkVTVU1FX05BQ0sJCT0gMHgxMCwKKwkvKiBQRHVzIGJldHdlZW4gTk0gU0FQcyAqLworCUJTU0dQX1BEVVRfQlZDX0JMT0NLCQk9IDB4MjAsCisJQlNTR1BfUERVVF9CVkNfQkxPQ0tfQUNLCT0gMHgyMSwKKwlCU1NHUF9QRFVUX0JWQ19SRVNFVAkJPSAweDIyLAorCUJTU0dQX1BEVVRfQlZDX1JFU0VUX0FDSwk9IDB4MjMsCisJQlNTR1BfUERVVF9CVkNfVU5CTE9DSwkJPSAweDI0LAorCUJTU0dQX1BEVVRfQlZDX1VOQkxPQ0tfQUNLCT0gMHgyNSwKKwlCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9CVkMJPSAweDI2LAorCUJTU0dQX1BEVVRfRkxPV19DT05UUk9MX0JWQ19BQ0sJPSAweDI3LAorCUJTU0dQX1BEVVRfRkxPV19DT05UUk9MX01TCT0gMHgyOCwKKwlCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9NU19BQ0sJPSAweDI5LAorCUJTU0dQX1BEVVRfRkxVU0hfTEwJCT0gMHgyYSwKKwlCU1NHUF9QRFVUX0ZMVVNIX0xMX0FDSwkJPSAweDJiLAorCUJTU0dQX1BEVVRfTExDX0RJU0NBUkQJCT0gMHgyYywKKwlCU1NHUF9QRFVUX1NHU05fSU5WT0tFX1RSQUNFCT0gMHg0MCwKKwlCU1NHUF9QRFVUX1NUQVRVUwkJPSAweDQxLAorCS8qIFBEVXMgYmV0d2VlbiBQRk0gU0FQJ3MgKi8KKwlCU1NHUF9QRFVUX0RPV05MT0FEX0JTU19QRkMJPSAweDUwLAorCUJTU0dQX1BEVVRfQ1JFQVRFX0JTU19QRkMJPSAweDUxLAorCUJTU0dQX1BEVVRfQ1JFQVRFX0JTU19QRkNfQUNLCT0gMHg1MiwKKwlCU1NHUF9QRFVUX0NSRUFURV9CU1NfUEZDX05BQ0sJPSAweDUzLAorCUJTU0dQX1BEVVRfTU9ESUZZX0JTU19QRkMJPSAweDU0LAorCUJTU0dQX1BEVVRfTU9ESUZZX0JTU19QRkNfQUNLCT0gMHg1NSwKKwlCU1NHUF9QRFVUX0RFTEVURV9CU1NfUEZDCT0gMHg1NiwKKwlCU1NHUF9QRFVUX0RFTEVURV9CU1NfUEZDX0FDSwk9IDB4NTcsCit9OworCisvKiBTZWN0aW9uIDEwLjIuMSBhbmQgMTAuMi4yICovCitzdHJ1Y3QgYnNzZ3BfdWRfaGRyIHsKKwl1aW50OF90IHBkdV90eXBlOworCXVpbnQzMl90IHRsbGk7CisJdWludDhfdCBxb3NfcHJvZmlsZVszXTsKKwl1aW50OF90IGRhdGFbMF07CS8qIFRMVidzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciB7CisJdWludDhfdCBwZHVfdHlwZTsKKwl1aW50OF90IGRhdGFbMF07CS8qIFRMVidzICovCit9OworCitlbnVtIGJzc2dwX2llaV90eXBlIHsKKwlCU1NHUF9JRV9BTElHTk1FTlQJCT0gMHgwMCwKKwlCU1NHUF9JRV9CTUFYX0RFRkFVTFRfTVMJPSAweDAxLAorCUJTU0dQX0lFX0JTU19BUkVBX0lECQk9IDB4MDIsCisJQlNTR1BfSUVfQlVDS0VUX0xFQUtfUkFURQk9IDB4MDMsCisJQlNTR1BfSUVfQlZDSQkJCT0gMHgwNCwKKwlCU1NHUF9JRV9CVkNfQlVDS0VUX1NJWkUJPSAweDA1LAorCUJTU0dQX0lFX0JWQ19NRUFTVVJFTUVOVAk9IDB4MDYsCisJQlNTR1BfSUVfQ0FVU0UJCQk9IDB4MDcsCisJQlNTR1BfSUVfQ0VMTF9JRAkJPSAweDA4LAorCUJTU0dQX0lFX0NIQU5fTkVFREVECQk9IDB4MDksCisJQlNTR1BfSUVfRFJYX1BBUkFNUwkJPSAweDBhLAorCUJTU0dQX0lFX0VNTFBQX1BSSU8JCT0gMHgwYiwKKwlCU1NHUF9JRV9GTFVTSF9BQ1RJT04JCT0gMHgwYywKKwlCU1NHUF9JRV9JTVNJCQkJPSAweDBkLAorCUJTU0dQX0lFX0xMQ19QRFUJCT0gMHgwZSwKKwlCU1NHUF9JRV9MTENfRlJBTUVTX0RJU0NBUkRFRAk9IDB4MGYsCisJQlNTR1BfSUVfTE9DQVRJT05fQVJFQQkJPSAweDEwLAorCUJTU0dQX0lFX01PQklMRV9JRAkJPSAweDExLAorCUJTU0dQX0lFX01TX0JVQ0tFVF9TSVpFCQk9IDB4MTIsCisJQlNTR1BfSUVfTVNfUkFESU9fQUNDRVNTX0NBUAk9IDB4MTMsCisJQlNTR1BfSUVfT01DX0lECQkJPSAweDE0LAorCUJTU0dQX0lFX1BEVV9JTl9FUlJPUgkJPSAweDE1LAorCUJTU0dQX0lFX1BEVV9MSUZFVElNRQkJPSAweDE2LAorCUJTU0dQX0lFX1BSSU9SSVRZCQk9IDB4MTcsCisJQlNTR1BfSUVfUU9TX1BST0ZJTEUJCT0gMHgxOCwKKwlCU1NHUF9JRV9SQURJT19DQVVTRQkJPSAweDE5LAorCUJTU0dQX0lFX1JBX0NBUF9VUERfQ0FVU0UJPSAweDFhLAorCUJTU0dQX0lFX1JPVVRFSU5HX0FSRUEJCT0gMHgxYiwKKwlCU1NHUF9JRV9SX0RFRkFVTFRfTVMJCT0gMHgxYywKKwlCU1NHUF9JRV9TVVNQRU5EX1JFRl9OUgkJPSAweDFkLAorCUJTU0dQX0lFX1RBRwkJCT0gMHgxZSwKKwlCU1NHUF9JRV9UTExJCQkJPSAweDFmLAorCUJTU0dQX0lFX1RNU0kJCQk9IDB4MjAsCisJQlNTR1BfSUVfVFJBQ0VfUkVGRVJFTkMJCT0gMHgyMSwKKwlCU1NHUF9JRV9UUkFDRV9UWVBFCQk9IDB4MjIsCisJQlNTR1BfSUVfVFJBTlNBQ1RJT05fSUQJCT0gMHgyMywKKwlCU1NHUF9JRV9UUklHR0VSX0lECQk9IDB4MjQsCisJQlNTR1BfSUVfTlVNX09DVF9BRkYJCT0gMHgyNSwKKwlCU1NHUF9JRV9MU0FfSURfTElTVAkJPSAweDI2LAorCUJTU0dQX0lFX0xTQV9JTkZPUk1BVElPTgk9IDB4MjcsCisJQlNTR1BfSUVfUEFDS0VUX0ZMT1dfSUQJCT0gMHgyOCwKKwlCU1NHUF9JRV9QQUNLRVRfRkxPV19USU1FUgk9IDB4MjksCisJQlNTR1BfSUVfQUdHX0JTU19RT1NfUFJPRklMRQk9IDB4M2EsCisJQlNTR1BfSUVfRkVBVFVSRV9CSVRNQVAJCT0gMHgzYiwKKwlCU1NHUF9JRV9CVUNLRVRfRlVMTF9SQVRJTwk9IDB4M2MsCisJQlNTR1BfSUVfU0VSVklDRV9VVFJBTl9DQ08JPSAweDNkLAorfTsKKworLyogU2VjdGlvbiAxMS4zLjggLyBUYWJsZSAxMS4xMDogQ2F1c2UgY29kaW5nICovCitlbnVtIGdwcnNfYnNzZ3BfY2F1c2UgeworCUJTU0dQX0NBVVNFX1BST0NfT1ZFUkxPQUQJPSAweDAwLAorCUJTU0dQX0NBVVNFX0VRVUlQX0ZBSUwJCT0gMHgwMSwKKwlCU1NHUF9DQVVTRV9UUkFTSVRfTkVUX0ZBSUwJPSAweDAyLAorCUJTU0dQX0NBVVNFX0NBUEFfR1JFQVRFUl8wS1BCUwk9IDB4MDMsCisJQlNTR1BfQ0FVU0VfVU5LTk9XTl9NUwkJPSAweDA0LAorCUJTU0dQX0NBVVNFX1VOS05PV05fQlZDSQk9IDB4MDUsCisJQlNTR1BfQ0FVU0VfQ0VMTF9UUkFGX0NPTkcJPSAweDA2LAorCUJTU0dQX0NBVVNFX1NHU05fQ09ORwkJPSAweDA3LAorCUJTU0dQX0NBVVNFX09NTF9JTlRFUlYJCT0gMHgwOCwKKwlCU1NHUF9DQVVTRV9CVkNJX0JMT0NLRUQJPSAweDA5LAorCUJTU0dQX0NBVVNFX1BGQ19DUkVBVEVfRkFJTAk9IDB4MGEsCisJQlNTR1BfQ0FVU0VfU0VNX0lOQ09SUl9QRFUJPSAweDIwLAorCUJTU0dQX0NBVVNFX0lOVl9NQU5EX0lORgk9IDB4MjEsCisJQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFCT0gMHgyMiwKKwlCU1NHUF9DQVVTRV9NSVNTSU5HX0NPTkRfSUUJPSAweDIzLAorCUJTU0dQX0NBVVNFX1VORVhQX0NPTkRfSUUJPSAweDI0LAorCUJTU0dQX0NBVVNFX0NPTkRfSUVfRVJSCQk9IDB4MjUsCisJQlNTR1BfQ0FVU0VfUERVX0lOQ09NUF9TVEFURQk9IDB4MjYsCisJQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQwk9IDB4MjcsCisJQlNTR1BfQ0FVU0VfUERVX0lOQ09NUF9GRUFUCT0gMHgyOCwKK307CisKKy8qIE91ciBpbXBsZW1lbnRhdGlvbiAqLworCisvKiBncHJzX2Jzc2dwX3V0aWwuYyAqLworZXh0ZXJuIHN0cnVjdCBncHJzX25zX2luc3QgKmJzc2dwX25zaTsKK3N0cnVjdCBtc2diICpic3NncF9tc2diX2FsbG9jKHZvaWQpOworY29uc3QgY2hhciAqYnNzZ3BfY2F1c2Vfc3RyKGVudW0gZ3Byc19ic3NncF9jYXVzZSBjYXVzZSk7CisvKiBUcmFuc21pdCBhIHNpbXBsZSByZXNwb25zZSBzdWNoIGFzIEJMT0NLL1VOQkxPQ0svUkVTRVQgQUNLL05BQ0sgKi8KK2ludCBic3NncF90eF9zaW1wbGVfYnZjaSh1aW50OF90IHBkdV90eXBlLCB1aW50MTZfdCBuc2VpLAorCQkJIHVpbnQxNl90IGJ2Y2ksIHVpbnQxNl90IG5zX2J2Y2kpOworLyogQ2hhcHRlciAxMC40LjE0OiBTdGF0dXMgKi8KK2ludCBic3NncF90eF9zdGF0dXModWludDhfdCBjYXVzZSwgdWludDE2X3QgKmJ2Y2ksIHN0cnVjdCBtc2diICpvcmlnX21zZyk7CisKKy8qIGdwcnNfYnNzZ3AuYyAqLworCisjZGVmaW5lIEJWQ19TX0JMT0NLRUQJMHgwMDAxCisKKy8qIFRoZSBwZXItQlRTIGNvbnRleHQgdGhhdCB3ZSBrZWVwIG9uIHRoZSBTR1NOIHNpZGUgb2YgdGhlIEJTU0dQIGxpbmsgKi8KK3N0cnVjdCBic3NncF9idmNfY3R4IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJLyogcGFyc2VkIFJBIElEIGFuZCBDZWxsIElEIG9mIHRoZSByZW1vdGUgQlRTICovCisJc3RydWN0IGdwcnNfcmFfaWQgcmFfaWQ7CisJdWludDE2X3QgY2VsbF9pZDsKKworCS8qIE5TRUkgYW5kIEJWQ0kgb2YgdW5kZXJseWluZyBHYiBsaW5rLiAgVG9nZXRoZXIgdGhleQorCSAqIHVuaXF1ZWx5IGlkZW50aWZ5IGEgbGluayB0byBhIEJUUyAoNS40LjQpICovCisJdWludDE2X3QgYnZjaTsKKwl1aW50MTZfdCBuc2VpOworCisJdWludDMyX3Qgc3RhdGU7CisKKwlzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAgKmN0cmc7CisKKwkvKiB3ZSBtaWdodCB3YW50IHRvIGFkZCB0aGlzIGFzIGEgc2hvcnRjdXQgbGF0ZXIsIGF2b2lkaW5nIHRoZSBOU1ZDCisJICogbG9va3VwIGZvciBldmVyeSBwYWNrZXQsIHNpbWlsYXIgdG8gYSByb3V0aW5nIGNhY2hlICovCisJLy9zdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworfTsKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBic3NncF9idmNfY3R4dHM7CisvKiBGaW5kIGEgQlRTIENvbnRleHQgYmFzZWQgb24gcGFyc2VkIFJBIElEIGFuZCBDZWxsIElEICovCitzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYnRzY3R4X2J5X3JhaWRfY2lkKGNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCB1aW50MTZfdCBjaWQpOworLyogRmluZCBhIEJUUyBjb250ZXh0IGJhc2VkIG9uIEJWQ0krTlNFSSB0dXBsZSAqLworc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ0c2N0eF9ieV9idmNpX25zZWkodWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNlaSk7CisKKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKworLyogQlNTR1AtVUwtVU5JVERBVEEuaW5kICovCitpbnQgZ3Byc19ic3NncF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7CisKKy8qIEJTU0dQLURMLVVOSVREQVRBLnJlcSAqLworc3RydWN0IHNnc25fbW1fY3R4OworaW50IGdwcnNfYnNzZ3BfdHhfZGxfdWQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHNnc25fbW1fY3R4ICptbWN0eCk7CisKK3VpbnQxNl90IGJzc2dwX3BhcnNlX2NlbGxfaWQoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Zik7CisKKy8qIFdyYXBwZXIgYXJvdW5kIFRMViBwYXJzZXIgdG8gcGFyc2UgQlNTR1AgSUVzICovCitzdGF0aWMgaW5saW5lIGludCBic3NncF90bHZfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKnRwLCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisJcmV0dXJuIHRsdl9wYXJzZSh0cCwgJnR2bHZfYXR0X2RlZiwgYnVmLCBsZW4sIDAsIDApOworfQorCitlbnVtIGJzc2dwX3BhZ2luZ19tb2RlIHsKKwlCU1NHUF9QQUdJTkdfUFMsCisJQlNTR1BfUEFHSU5HX0NTLAorfTsKKworZW51bSBic3NncF9wYWdpbmdfc2NvcGUgeworCUJTU0dQX1BBR0lOR19CU1NfQVJFQSwJCS8qIGFsbCBjZWxscyBpbiBCU1MgKi8KKwlCU1NHUF9QQUdJTkdfTE9DQVRJT05fQVJFQSwJLyogYWxsIGNlbGxzIGluIExBICovCisJQlNTR1BfUEFHSU5HX1JPVVRFSU5HX0FSRUEsCS8qIGFsbCBjZWxscyBpbiBSQSAqLworCUJTU0dQX1BBR0lOR19CVkNJLAkJLyogb25lIGNlbGwgKi8KK307CisKK3N0cnVjdCBic3NncF9wYWdpbmdfaW5mbyB7CisJZW51bSBic3NncF9wYWdpbmdfbW9kZSBtb2RlOworCWVudW0gYnNzZ3BfcGFnaW5nX3Njb3BlIHNjb3BlOworCXN0cnVjdCBncHJzX3JhX2lkIHJhaWQ7CisJdWludDE2X3QgYnZjaTsKKwljb25zdCBjaGFyICppbXNpOworCXVpbnQzMl90ICpwdG1zaTsKKwl1aW50MTZfdCBkcnhfcGFyYW1zOworCXVpbnQ4X3QgcW9zWzNdOworfTsKKworLyogU2VuZCBhIHNpbmdsZSBHTU0tUEFHSU5HLnJlcSB0byBhIGdpdmVuIE5TRUkvTlMtQlZDSSAqLworaW50IGdwcnNfYnNzZ3BfdHhfcGFnaW5nKHVpbnQxNl90IG5zZWksIHVpbnQxNl90IG5zX2J2Y2ksCisJCQkgc3RydWN0IGJzc2dwX3BhZ2luZ19pbmZvICpwaW5mbyk7CisKKy8qIGdwcnNfYnNzZ3BfdnR5LmMgKi8KK2ludCBncHJzX2Jzc2dwX3Z0eV9pbml0KHZvaWQpOworCisjZW5kaWYgLyogX0dQUlNfQlNTR1BfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19nbW0uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfZ21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxYjQ4OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfZ21tLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfR1BSU19HTU1fSAorI2RlZmluZSBfR1BSU19HTU1fSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19zZ3NuLmg+CisKK2ludCBnc200OF90eF9nc21fYWN0X3BkcF9yZWooc3RydWN0IHNnc25fbW1fY3R4ICptbSwgdWludDhfdCB0aWQsCisJCQkgICAgIHVpbnQ4X3QgY2F1c2UsIHVpbnQ4X3QgcGNvX2xlbiwgdWludDhfdCAqcGNvX3YpOworaW50IGdzbTQ4X3R4X2dzbV9hY3RfcGRwX2FjYyhzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHApOworaW50IGdzbTQ4X3R4X2dzbV9kZWFjdF9wZHBfYWNjKHN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcCk7CisKK2ludCBnc20wNDA4X2dwcnNfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBncHJzX2xsY19sbG1lICpsbG1lKTsKKworaW50IGdwcnNfZ21tX3J4X3N1c3BlbmQoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIHVpbnQzMl90IHRsbGkpOworaW50IGdwcnNfZ21tX3J4X3Jlc3VtZShzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgdWludDMyX3QgdGxsaSwKKwkJICAgICAgIHVpbnQ4X3Qgc3VzcGVuZF9yZWYpOworCisjZW5kaWYgLyogX0dQUlNfR01NX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfbGxjLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX2xsYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGI1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX2xsYy5oCkBAIC0wLDAgKzEsMTQ5IEBACisjaWZuZGVmIF9HUFJTX0xMQ19ICisjZGVmaW5lIF9HUFJTX0xMQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfc2dzbi5oPgorCisvKiBTZWN0aW9uIDQuNyBMTEMgTGF5ZXIgU3RydWN0dXJlICovCitlbnVtIGdwcnNfbGxjX3NhcGkgeworCUdQUlNfU0FQSV9HTU0JCT0gMSwKKwlHUFJTX1NBUElfVE9NMgkJPSAyLAorCUdQUlNfU0FQSV9TTkRDUDMJPSAzLAorCUdQUlNfU0FQSV9TTkRDUDUJPSA1LAorCUdQUlNfU0FQSV9TTVMJCT0gNywKKwlHUFJTX1NBUElfVE9NOAkJPSA4LAorCUdQUlNfU0FQSV9TTkRDUDkJPSA5LAorCUdQUlNfU0FQSV9TTkRDUDExCT0gMTEsCit9OworCisvKiBTZWN0aW9uIDYuNCBDb21tYW5kcyBhbmQgUmVzcG9uc2VzICovCitlbnVtIGdwcnNfbGxjX3VfY21kIHsKKwlHUFJTX0xMQ19VX0RNX1JFU1AJCT0gMHgwMSwKKwlHUFJTX0xMQ19VX0RJU0NfQ01ECQk9IDB4MDQsCisJR1BSU19MTENfVV9VQV9SRVNQCQk9IDB4MDYsCisJR1BSU19MTENfVV9TQUJNX0NNRAkJPSAweDA3LAorCUdQUlNfTExDX1VfRlJNUl9SRVNQCQk9IDB4MDgsCisJR1BSU19MTENfVV9YSUQJCQk9IDB4MGIsCisJR1BSU19MTENfVV9OVUxMX0NNRAkJPSAweDAwLAorfTsKKworLyogVFMgMDQuNjQgU2VjdGlvbiA3LjEuMiBUYWJsZSA3OiBMTEMgbGF5ZXIgcHJpbWl0aXZlcyAoR01NL1NORENQL1NNUy9UT00pICovCisvKiBUUyAwNC42NSBTZWN0aW9uIDUuMS4yIFRhYmxlIDI6IFNlcnZpY2UgcHJpbWl0aXZlcyB1c2VkIGJ5IFNORENQICovCitlbnVtIGdwcnNfbGxjX3ByaW1pdGl2ZSB7CisJLyogR01NIDwtPiBMTE1FICovCisJTExHTU1fQVNTSUdOX1JFUSwJLyogR01NIHRlbGxzIHVzIG5ldyBUTExJOiBUTExJIG9sZCwgVExMSSBuZXcsIEtjLCBDaXBoQWxnICovCisJTExHTU1fUkVTRVRfUkVRLAkvKiBHTU0gdGVsbHMgdXMgdG8gcGVyZm9ybSBYSUQgbmVnb3RpYXRpb246IFRMTEkgKi8KKwlMTEdNTV9SRVNFVF9DTkYsCS8qIExMQyBpbmZvcm1zIEdNTSB0aGF0IFhJRCBoYXMgY29tcGxldGVkOiBUTExJICovCisJTExHTU1fU1VTUEVORF9SRVEsCS8qIEdNTSB0ZWxscyB1cyBNUyBoYXMgc3VzcGVuZGVkOiBUTExJLCBQYWdlICovCisJTExHTU1fUkVTVU1FX1JFUSwJLyogR01NIHRlbGxzIHVzIE1TIGhhcyByZXN1bWVkOiBUTExJICovCisJTExHTU1fUEFHRV9JTkQsCQkvKiBMTEMgYXNrcyBHTU0gdG8gcGFnZSBNUzogVExMSSAqLworCUxMR01NX0lPVl9SRVEsCQkvKiBHTU0gdGVsbHMgdXMgdG8gcGVyZm9ybSBYSUQ6IFRMTEkgKi8KKwlMTEdNTV9TVEFUVVNfSU5ELAkvKiBMTEMgaW5mb3JtcyBHTU0gYWJvdXQgZXJyb3I6IFRMTEksIENhdXNlICovCisJLyogTExFIDwtPiAoR01NL1NORENQL1NNUy9UT00pICovCisJTExfUkVTRVRfSU5ELAkJLyogVExMSSAqLworCUxMX0VTVEFCTElTSF9SRVEsCS8qIFRMTEksIFhJRCBSZXEgKi8KKwlMTF9FU1RBQkxJU0hfSU5ELAkvKiBUTExJLCBYSUQgUmVxLCBOMjAxLUksIE4yMDEtVSAqLworCUxMX0VTVEFCTElTSF9SRVNQLAkvKiBUTExJLCBYSUQgTmVnb3RpYXRlZCAqLworCUxMX0VTVEFCTElTSF9DT05GLAkvKiBUTExJLCBYSUQgTmVnLCBOMjAxLWksIE4yMDEtVSAqLworCUxMX1JFTEVBU0VfUkVRLAkJLyogVExMSSwgTG9jYWwgKi8KKwlMTF9SRUxFQVNFX0lORCwJCS8qIFRMTEksIENhdXNlICovCisJTExfUkVMRUFTRV9DT05GLAkvKiBUTExJICovCisJTExfWElEX1JFUSwJCS8qIFRMTEksIFhJRCBSZXF1ZXN0ZWQgKi8KKwlMTF9YSURfSU5ELAkJLyogVExMSSwgWElEIFJlcSwgTjIwMS1JLCBOMjAxLVUgKi8KKwlMTF9YSURfUkVTUCwJCS8qIFRMTEksIFhJRCBOZWdvdGlhdGVkICovCisJTExfWElEX0NPTkYsCQkvKiBUTExJLCBYSUQgTmVnLCBOMjAxLUksIE4yMDEtVSAqLworCUxMX0RBVEFfUkVRLAkJLyogVExMSSwgU04tUERVLCBSZWYsIFFvUywgUmFkaW8gUHJpbywgQ2lwaCAqLworCUxMX0RBVEFfSU5ELAkJLyogVExMSSwgU04tUERVICovCisJTExfREFUQV9DT05GLAkJLyogVExMSSwgUmVmICovCisJTExfVU5JVERBVEFfUkVRLAkvKiBUTExJLCBTTi1QRFUsIFJlZiwgUW9TLCBSYWRpbyBQcmlvLCBDaXBoICovCisJTExfVU5JVERBVEFfSU5ELAkvKiBUTExJLCBTTi1QRFUgKi8KKwlMTF9TVEFUVVNfSU5ELAkJLyogVExMSSwgQ2F1c2UgKi8KK307CisKKy8qIFNlY3Rpb24gNC41LjIgTG9naWNhbCBMaW5rIFN0YXRlcyArIEFubmV4IEMuMiAqLworZW51bSBncHJzX2xsY19sbGVfc3RhdGUgeworCUdQUlNfTExFU19VTkFTU0lHTkVECT0gMSwJLyogTm8gVExMSSB5ZXQgKi8KKwlHUFJTX0xMRVNfQVNTSUdORURfQURNCT0gMiwJLyogVExMSSBhc3NpZ25lZCAqLworCUdQUlNfTExFU19MT0NBTF9FU1QJPSAzLAkvKiBMb2NhbCBFc3RhYmxpc2htZW50ICovCisJR1BSU19MTEVTX1JFTU9URV9FU1QJPSA0LAkvKiBSZW1vdGUgRXN0YWJsaXNobWVudCAqLworCUdQUlNfTExFU19BQk0JCT0gNSwKKwlHUFJTX0xMRVNfTE9DQUxfUkVMCT0gNiwJLyogTG9jYWwgUmVsZWFzZSAqLworCUdQUlNfTExFU19USU1FUl9SRUMgCT0gNywJLyogVGltZXIgUmVjb3ZlcnkgKi8KK307CisKK2VudW0gZ3Byc19sbGNfbGxtZV9zdGF0ZSB7CisJR1BSU19MTE1TX1VOQVNTSUdORUQJPSAxLAkvKiBObyBUTExJIHlldCAqLworCUdQUlNfTExNU19BU1NJR05FRAk9IDIsCS8qIFRMTEkgYXNzaWduZWQgKi8KK307CisKKy8qIFNlY3Rpb24gOC45LjkgTExDIGxheWVyIHBhcmFtZXRlciBkZWZhdWx0IHZhbHVlcyAqLworc3RydWN0IGdwcnNfbGxjX3BhcmFtcyB7CisJdWludDE2X3QgaW92X2lfZXhwOworCXVpbnQxNl90IHQyMDBfMjAxOworCXVpbnQxNl90IG4yMDA7CisJdWludDE2X3QgbjIwMV91OworCXVpbnQxNl90IG4yMDFfaTsKKwl1aW50MTZfdCBtRDsKKwl1aW50MTZfdCBtVTsKKwl1aW50MTZfdCBrRDsKKwl1aW50MTZfdCBrVTsKK307CisKKy8qIFNlY3Rpb24gNC43LjE6IExvZ2ljYWwgTGluayBFbnRpdHk6IE9uZSBwZXIgRExDSSAoVExMSSArIFNBUEkpICovCitzdHJ1Y3QgZ3Byc19sbGNfbGxlIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJdWludDMyX3Qgc2FwaTsKKworCXN0cnVjdCBncHJzX2xsY19sbG1lICpsbG1lOworCisJZW51bSBncHJzX2xsY19sbGVfc3RhdGUgc3RhdGU7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0MjAwOworCXN0cnVjdCB0aW1lcl9saXN0IHQyMDE7CS8qIHdhaXQgZm9yIGFja25vd2xlZGdlbWVudCAqLworCisJdWludDE2X3Qgdl9zZW50OworCXVpbnQxNl90IHZfYWNrOworCXVpbnQxNl90IHZfcmVjdjsKKworCXVpbnQxNl90IHZ1X3NlbmQ7CisJdWludDE2X3QgdnVfcmVjdjsKKworCXVuc2lnbmVkIGludCByZXRyYW5zX2N0cjsKKworCXN0cnVjdCBncHJzX2xsY19wYXJhbXMgcGFyYW1zOworfTsKKworI2RlZmluZSBOVU1fU0FQSVMJMTYKKworc3RydWN0IGdwcnNfbGxjX2xsbWUgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwllbnVtIGdwcnNfbGxjX2xsbWVfc3RhdGUgc3RhdGU7CisKKwl1aW50MzJfdCB0bGxpOworCXVpbnQzMl90IG9sZF90bGxpOworCisJLyogb3ZlciB3aGljaCBCU1NHUCBCVFMgY3R4IGRvIHdlIG5lZWQgdG8gdHJhbnNtaXQgKi8KKwl1aW50MTZfdCBidmNpOworCXVpbnQxNl90IG5zZWk7CisJc3RydWN0IGdwcnNfbGxjX2xsZSBsbGVbTlVNX1NBUElTXTsKK307CisKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBncHJzX2xsY19sbG1lczsKKworLyogQlNTR1AtVUwtVU5JVERBVEEuaW5kICovCitpbnQgZ3Byc19sbGNfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0dik7CisKKy8qIExMLVVOSVREQVRBLnJlcSAqLworaW50IGdwcnNfbGxjX3R4X3VpKHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3Qgc2FwaSwgaW50IGNvbW1hbmQsCisJCSAgIHZvaWQgKm1tY3R4KTsKKworLyogMDQuNjQgQ2hhcHRlciA3LjIuMS4xIExMR01NLUFTU0lHTiAqLworaW50IGdwcnNfbGxnbW1fYXNzaWduKHN0cnVjdCBncHJzX2xsY19sbG1lICpsbG1lLAorCQkgICAgICB1aW50MzJfdCBvbGRfdGxsaSwgdWludDMyX3QgbmV3X3RsbGksCisJCSAgICAgIGVudW0gZ3Byc19jaXBoX2FsZ28gYWxnLCBjb25zdCB1aW50OF90ICprYyk7CisKK2ludCBncHJzX2xsY192dHlfaW5pdCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX25zLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzYzM2NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfbnMuaApAQCAtMCwwICsxLDIzMiBAQAorI2lmbmRlZiBfR1BSU19OU19ICisjZGVmaW5lIF9HUFJTX05TX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBHUFJTIE5ldHdvcmtzIFNlcnZpY2UgKE5TKSBtZXNzYWdlcyBvbiB0aGUgR2IgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA4LjE2IHZlcnNpb24gOC4wLjEgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDEgMjk5IFY4LjAuMSAoMjAwMi0wNSkKKyAqIDNHUFAgVFMgNDguMDE2IHZlcnNpb24gNi41LjAgUmVsZWFzZSA2IC8gRVRTSSBUUyAxNDggMDE2IFY2LjUuMCAoMjAwNS0xMSkgKi8KKworc3RydWN0IGdwcnNfbnNfaGRyIHsKKwl1aW50OF90IHBkdV90eXBlOworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFRTIDA4LjE2LCBTZWN0aW9uIDEwLjMuNywgVGFibGUgMTQgKi8KK2VudW0gbnNfcGR1X3R5cGUgeworCU5TX1BEVVRfVU5JVERBVEEJPSAweDAwLAorCU5TX1BEVVRfUkVTRVQJCT0gMHgwMiwKKwlOU19QRFVUX1JFU0VUX0FDSwk9IDB4MDMsCisJTlNfUERVVF9CTE9DSwkJPSAweDA0LAorCU5TX1BEVVRfQkxPQ0tfQUNLCT0gMHgwNSwKKwlOU19QRFVUX1VOQkxPQ0sJCT0gMHgwNiwKKwlOU19QRFVUX1VOQkxPQ0tfQUNLCT0gMHgwNywKKwlOU19QRFVUX1NUQVRVUwkJPSAweDA4LAorCU5TX1BEVVRfQUxJVkUJCT0gMHgwYSwKKwlOU19QRFVUX0FMSVZFX0FDSwk9IDB4MGIsCisJLyogVFMgNDguMDE2IFNlY3Rpb24gMTAuMy43LCBUYWJsZSAxMC4zLjcuMSAqLworCVNOU19QRFVUX0FDSwkJPSAweDBjLAorCVNOU19QRFVUX0FERAkJPSAweDBkLAorCVNOU19QRFVUX0NIQU5HRV9XRUlHSFQJPSAweDBlLAorCVNOU19QRFVUX0NPTkZJRwkJPSAweDBmLAorCVNOU19QRFVUX0NPTkZJR19BQ0sJPSAweDEwLAorCVNOU19QRFVUX0RFTEVURQkJPSAweDExLAorCVNOU19QRFVUX1NJWkUJCT0gMHgxMiwKKwlTTlNfUERVVF9TSVpFX0FDSwk9IDB4MTMsCit9OworCisvKiBUUyAwOC4xNiwgU2VjdGlvbiAxMC4zLCBUYWJsZSAxMiAqLworZW51bSBuc19jdHJsX2llIHsKKwlOU19JRV9DQVVTRQkJPSAweDAwLAorCU5TX0lFX1ZDSQkJPSAweDAxLAorCU5TX0lFX1BEVQkJPSAweDAyLAorCU5TX0lFX0JWQ0kJCT0gMHgwMywKKwlOU19JRV9OU0VJCQk9IDB4MDQsCisJLyogVFMgNDguMDE2IFNlY3Rpb24gMTAuMywgVGFibGUgMTAuMy4xICovCisJTlNfSUVfSVB2NF9MSVNUCQk9IDB4MDUsCisJTlNfSUVfSVB2Nl9MSVNUCQk9IDB4MDYsCisJTlNfSUVfTUFYX05SX05TVkMJPSAweDA3LAorCU5TX0lFX0lQdjRfRVBfTlIJPSAweDA4LAorCU5TX0lFX0lQdjZfRVBfTlIJPSAweDA5LAorCU5TX0lFX1JFU0VUX0ZMQUcJPSAweDBhLAorCU5TX0lFX0lQX0FERFIJCT0gMHgwYiwKK307CisKKy8qIFRTIDA4LjE2LCBTZWN0aW9uIDEwLjMuMiwgVGFibGUgMTMgKi8KK2VudW0gbnNfY2F1c2UgeworCU5TX0NBVVNFX1RSQU5TSVRfRkFJTAkJPSAweDAwLAorCU5TX0NBVVNFX09NX0lOVEVSVkVOVElPTgk9IDB4MDEsCisJTlNfQ0FVU0VfRVFVSVBfRkFJTAkJPSAweDAyLAorCU5TX0NBVVNFX05TVkNfQkxPQ0tFRAkJPSAweDAzLAorCU5TX0NBVVNFX05TVkNfVU5LTk9XTgkJPSAweDA0LAorCU5TX0NBVVNFX0JWQ0lfVU5LTk9XTgkJPSAweDA1LAorCU5TX0NBVVNFX1NFTV9JTkNPUlJfUERVCQk9IDB4MDgsCisJTlNfQ0FVU0VfUERVX0lOQ09NUF9QU1RBVEUJPSAweDBhLAorCU5TX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMJPSAweDBiLAorCU5TX0NBVVNFX0lOVkFMX0VTU0VOVF9JRQk9IDB4MGMsCisJTlNfQ0FVU0VfTUlTU0lOR19FU1NFTlRfSUUJPSAweDBkLAorCS8qIFRTIDQ4LjAxNiBTZWN0aW9uIDEwLjMuMiwgVGFibGUgMTAuMy4yLjEgKi8KKwlOU19DQVVTRV9JTlZBTF9OUl9JUHY0X0VQCT0gMHgwZSwKKwlOU19DQVVTRV9JTlZBTF9OUl9JUHY2X0VQCT0gMHgwZiwKKwlOU19DQVVTRV9JTlZBTF9OUl9OU19WQwkJPSAweDEwLAorCU5TX0NBVVNFX0lOVkFMX1dFSUdICQk9IDB4MTEsCisJTlNfQ0FVU0VfVU5LTl9JUF9FUAkJPSAweDEyLAorCU5TX0NBVVNFX1VOS05fSVBfQUREUgkJPSAweDEzLAorCU5TX0NBVVNFX1VOS05fSVBfVEVTVF9GQUlMRUQJPSAweDE0LAorfTsKKworLyogT3VyIEltcGxlbWVudGF0aW9uICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjZGVmaW5lIE5TX1RJTUVSU19DT1VOVCA3CisjZGVmaW5lIE5TX1RJTUVSUyAiKHRucy1ibG9ja3x0bnMtYmxvY2stcmV0cmllc3x0bnMtcmVzZXR8dG5zLXJlc2V0LXJldHJpZXN8dG5zLXRlc3R8dG5zLWFsaXZlfHRucy1hbGl2ZS1yZXRyaWVzKSIKKyNkZWZpbmUgTlNfVElNRVJTX0hFTFAJXAorCSIodW4pYmxvY2tpbmcgVGltZXIgKFRucy1ibG9jaykgdGltZW91dFxuIgkJXAorCSIodW4pYmxvY2tpbmcgVGltZXIgKFRucy1ibG9jaykgbnVtYmVyIG9mIHJldHJpZXNcbiIJXAorCSJSZXNldCBUaW1lciAoVG5zLXJlc2V0KSB0aW1lb3V0XG4iCQkJXAorCSJSZXNldCBUaW1lciAoVG5zLXJlc2V0KSBudW1iZXIgb2YgcmV0cmllc1xuIgkJXAorCSJUZXN0IFRpbWVyIChUbnMtdGVzdCkgdGltZW91dFxuIgkJCVwKKworZW51bSBuc190aW1lb3V0IHsKKwlOU19UT1VUX1ROU19CTE9DSywKKwlOU19UT1VUX1ROU19CTE9DS19SRVRSSUVTLAorCU5TX1RPVVRfVE5TX1JFU0VULAorCU5TX1RPVVRfVE5TX1JFU0VUX1JFVFJJRVMsCisJTlNfVE9VVF9UTlNfVEVTVCwKKwlOU19UT1VUX1ROU19BTElWRSwKKwlOU19UT1VUX1ROU19BTElWRV9SRVRSSUVTLAorfTsKKworI2RlZmluZSBOU0VfU19CTE9DS0VECTB4MDAwMQorI2RlZmluZSBOU0VfU19BTElWRQkweDAwMDIKKworZW51bSBncHJzX25zX2xsIHsKKwlHUFJTX05TX0xMX1VEUCwKKwlHUFJTX05TX0xMX0UxLAorCUdQUlNfTlNfTExfRlJfR1JFLAorfTsKKworZW51bSBncHJzX25zX2V2dCB7CisJR1BSU19OU19FVlRfVU5JVF9EQVRBLAorfTsKKworc3RydWN0IGdwcnNfbnN2YzsKK3R5cGVkZWYgaW50IGdwcnNfbnNfY2JfdChlbnVtIGdwcnNfbnNfZXZ0IGV2ZW50LCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLAorCQkJIHN0cnVjdCBtc2diICptc2csIHVpbnQxNl90IGJ2Y2kpOworCisvKiBBbiBpbnN0YW5jZSBvZiB0aGUgTlMgcHJvdG9jb2wgc3RhY2sgKi8KK3N0cnVjdCBncHJzX25zX2luc3QgeworCS8qIGNhbGxiYWNrIHRvIHRoZSB1c2VyIGZvciBpbmNvbWluZyBVTklUIERBVEEgSU5EICovCisJZ3Byc19uc19jYl90ICpjYjsKKworCS8qIGxpbmtlZCBsaXN0cyBvZiBhbGwgTlNWQyBpbiB0aGlzIGluc3RhbmNlICovCisJc3RydWN0IGxsaXN0X2hlYWQgZ3Byc19uc3ZjczsKKworCS8qIGEgTlNWQyBvYmplY3QgdGhhdCdzIG5lZWRlZCB0byBkZWFsIHdpdGggcGFja2V0cyBmb3IgdW5rbm93biBOU1ZDICovCisJc3RydWN0IGdwcnNfbnN2YyAqdW5rbm93bl9uc3ZjOworCisJdWludDE2X3QgdGltZW91dFtOU19USU1FUlNfQ09VTlRdOworCisJLyogTlMtb3Zlci1JUCBzcGVjaWZpYyBiaXRzICovCisJc3RydWN0IHsKKwkJc3RydWN0IGJzY19mZCBmZDsKKwkJdWludDMyX3QgbG9jYWxfaXA7CisJCXVpbnQxNl90IGxvY2FsX3BvcnQ7CisJfSBuc2lwOworCS8qIE5TLW92ZXItRlItb3Zlci1HUkUtb3Zlci1JUCBzcGVjaWZpYyBiaXRzICovCisJc3RydWN0IHsKKwkJc3RydWN0IGJzY19mZCBmZDsKKwkJdWludDMyX3QgbG9jYWxfaXA7CisJCWludCBlbmFibGVkOjE7CisJfSBmcmdyZTsKK307CisKK2VudW0gbnN2Y190aW1lcl9tb2RlIHsKKwkvKiBzdGFuZGFyZCB0aW1lcnMgKi8KKwlOU1ZDX1RJTUVSX1ROU19URVNULAorCU5TVkNfVElNRVJfVE5TX0FMSVZFLAorCU5TVkNfVElNRVJfVE5TX1JFU0VULAorCV9OU1ZDX1RJTUVSX05SLAorfTsKKworc3RydWN0IGdwcnNfbnN2YyB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2k7CisKKwl1aW50MTZfdCBuc2VpOwkJLyogZW5kLXRvLWVuZCBzaWduaWZpY2FuY2UgKi8KKwl1aW50MTZfdCBuc3ZjaTsJLyogdW5pcXVlbHkgaWRlbnRpZmllcyBOUy1WQyBhdCBTR1NOICovCisKKwl1aW50MzJfdCBzdGF0ZTsKKwl1aW50MzJfdCByZW1vdGVfc3RhdGU7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwllbnVtIG5zdmNfdGltZXJfbW9kZSB0aW1lcl9tb2RlOworCWludCBhbGl2ZV9yZXRyaWVzOworCisJdW5zaWduZWQgaW50IHJlbW90ZV9lbmRfaXNfc2dzbjoxOworCXVuc2lnbmVkIGludCBwZXJzaXN0ZW50OjE7CisKKwlzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAgKmN0cmc7CisKKwkvKiB3aGljaCBsaW5rLWxheWVyIGFyZSB3ZSBiYXNlZCBvbj8gKi8KKwllbnVtIGdwcnNfbnNfbGwgbGw7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYnRzX2FkZHI7CisJCX0gaXA7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYnRzX2FkZHI7CisJCX0gZnJncmU7CisJfTsKK307CisKKy8qIENyZWF0ZSBhIG5ldyBOUyBwcm90b2NvbCBpbnN0YW5jZSAqLworc3RydWN0IGdwcnNfbnNfaW5zdCAqZ3Byc19uc19pbnN0YW50aWF0ZShncHJzX25zX2NiX3QgKmNiKTsKKworLyogRGVzdHJveSBhIE5TIHByb3RvY29sIGluc3RhbmNlICovCit2b2lkIGdwcnNfbnNfZGVzdHJveShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpOworCisvKiBMaXN0ZW4gZm9yIGluY29taW5nIEdQUlMgcGFja2V0cyB2aWEgTlMvVURQICovCitpbnQgZ3Byc19uc19uc2lwX2xpc3RlbihzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpOworCitzdHJ1Y3Qgc29ja2FkZHJfaW47CisKKy8qIG1haW4gZnVuY3Rpb24gZm9yIGhpZ2hlciBsYXllcnMgKEJTU0dQKSB0byBzZW5kIE5TIG1lc3NhZ2VzICovCitpbnQgZ3Byc19uc19zZW5kbXNnKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgc3RydWN0IG1zZ2IgKm1zZyk7CisKK2ludCBncHJzX25zX3R4X3Jlc2V0KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpOworaW50IGdwcnNfbnNfdHhfYmxvY2soc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDhfdCBjYXVzZSk7CitpbnQgZ3Byc19uc190eF91bmJsb2NrKHN0cnVjdCBncHJzX25zdmMgKm5zdmMpOworCisvKiBMaXN0ZW4gZm9yIGluY29taW5nIEdQUlMgcGFja2V0cyB2aWEgTlMvRlIvR1JFICovCitpbnQgZ3Byc19uc19mcmdyZV9saXN0ZW4oc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKTsKKworLyogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiAoZnJvbSB0aGUgQlNTKSB0byB0aGUgU0dTTiAqLworc3RydWN0IGdwcnNfbnN2YyAqbnNpcF9jb25uZWN0KHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRlc3QsIHVpbnQxNl90IG5zZWksCisJCQkJdWludDE2X3QgbnN2Y2kpOworCitzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjX2NyZWF0ZShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHVpbnQxNl90IG5zdmNpKTsKK3ZvaWQgbnN2Y19kZWxldGUoc3RydWN0IGdwcnNfbnN2YyAqbnN2Yyk7CitzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjX2J5X25zZWkoc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCB1aW50MTZfdCBuc2VpKTsKK3N0cnVjdCBncHJzX25zdmMgKm5zdmNfYnlfbnN2Y2koc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCB1aW50MTZfdCBuc3ZjaSk7CisKKy8qIEluaXRpYXRlIGEgUkVTRVQgcHJvY2VkdXJlIChpbmNsdWRpbmcgdGltZXIgc3RhcnQsIC4uLikqLwordm9pZCBncHJzX25zdmNfcmVzZXQoc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDhfdCBjYXVzZSk7CisKKy8qIEFkZCBOUy1zcGVjaWZpYyBWVFkgc3R1ZmYgKi8KK2ludCBncHJzX25zX3Z0eV9pbml0KHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSk7CisKKyNkZWZpbmUgTlNfQUxMT0NfU0laRQkyMDQ4CisjZGVmaW5lIE5TX0FMTE9DX0hFQURST09NIDIwCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtc2diICpncHJzX25zX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShOU19BTExPQ19TSVpFLCBOU19BTExPQ19IRUFEUk9PTSwgIkdQUlMvTlMiKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX25zX2ZyZ3JlLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX25zX2ZyZ3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjZDQzZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfbnNfZnJncmUuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX0dQUlNfTlNfRlJHUkVfSAorI2RlZmluZSBfR1BSU19OU19GUkdSRV9ICisKK2ludCBncHJzX25zX2ZyZ3JlX3NlbmRtc2coc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19zZ3NuLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX3Nnc24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODAxMTUwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19zZ3NuLmgKQEAgLTAsMCArMSwyMTAgQEAKKyNpZm5kZWYgX0dQUlNfU0dTTl9ICisjZGVmaW5lIF9HUFJTX1NHU05fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKworI2RlZmluZSBHU01fSU1TSV9MRU5HVEggMTcKKyNkZWZpbmUgR1NNX0lNRUlfTEVOR1RIIDE3CisjZGVmaW5lIEdTTV9FWFRFTlNJT05fTEVOR1RIIDE1CisKK3N0cnVjdCBncHJzX2xsY19sbGU7CisKKy8qIFRTIDA0LjA4IDQuMS4zLjMgR01NIG1vYmlsaXR5IG1hbmFnZW1lbnQgc3RhdGVzIG9uIHRoZSBuZXR3b3JrIHNpZGUgKi8KK2VudW0gZ3Byc19tbV9zdGF0ZSB7CisJR01NX0RFUkVHSVNURVJFRCwJCS8qIDQuMS4zLjMuMS4xICovCisJR01NX0NPTU1PTl9QUk9DX0lOSVQsCQkvKiA0LjEuMy4zLjEuMiAqLworCUdNTV9SRUdJU1RFUkVEX05PUk1BTCwJCS8qIDQuMS4zLjMuMi4xICovCisJR01NX1JFR0lTVEVSRURfU1VTUEVOREVELAkvKiA0LjEuMy4zLjIuMiAqLworCUdNTV9ERVJFR0lTVEVSRURfSU5JVCwJCS8qIDQuMS4zLjMuMS40ICovCit9OworCitlbnVtIGdwcnNfY2lwaF9hbGdvIHsKKwlHUFJTX0FMR09fR0VBMCwKKwlHUFJTX0FMR09fR0VBMSwKKwlHUFJTX0FMR09fR0VBMiwKKwlHUFJTX0FMR09fR0VBMywKK307CisKK2VudW0gZ3Byc19tbV9jdHIgeworCUdNTV9DVFJfUEtUU19TSUdfSU4sCisJR01NX0NUUl9QS1RTX1NJR19PVVQsCisJR01NX0NUUl9QS1RTX1VEQVRBX0lOLAorCUdNTV9DVFJfUEtUU19VREFUQV9PVVQsCisJR01NX0NUUl9CWVRFU19VREFUQV9JTiwKKwlHTU1fQ1RSX0JZVEVTX1VEQVRBX09VVCwKKwlHTU1fQ1RSX1BEUF9DVFhfQUNULAorCUdNTV9DVFJfU1VTUEVORCwKKwlHTU1fQ1RSX1BBR0lOR19QUywKKwlHTU1fQ1RSX1BBR0lOR19DUywKKwlHTU1fQ1RSX1JBX1VQREFURSwKK307CisKK2VudW0gZ3Byc19wZHBfY3R4IHsKKwlQRFBfQ1RSX1BLVFNfVURBVEFfSU4sCisJUERQX0NUUl9QS1RTX1VEQVRBX09VVCwKKwlQRFBfQ1RSX0JZVEVTX1VEQVRBX0lOLAorCVBEUF9DVFJfQllURVNfVURBVEFfT1VULAorfTsKKworZW51bSBncHJzX3QzMzUwX21vZGUgeworCUdNTV9UMzM1MF9NT0RFX0FUVCwKKwlHTU1fVDMzNTBfTU9ERV9SQVUsCisJR01NX1QzMzUwX01PREVfUFRNU0lfUkVBTEwsCit9OworCisjZGVmaW5lIE1TX1JBRElPX0FDQ0VTU19DQVBBCisKKy8qIEFjY29yZGluZyB0byBUUyAwMy42MCwgVGFibGUgNTogU0dTTiBNTSBhbmQgUERQIENvbnRleHRzICovCisvKiBFeHRlbmRlZCBieSAzR1BQIFRTIDIzLjA2MCwgVGFibGUgNjogU0dTTiBNTSBhbmQgUERQIENvbnRleHRzICovCitzdHJ1Y3Qgc2dzbl9tbV9jdHggeworCXN0cnVjdCBsbGlzdF9oZWFkCWxpc3Q7CisKKwljaGFyIAkJCWltc2lbR1NNX0lNU0lfTEVOR1RIXTsKKwllbnVtIGdwcnNfbW1fc3RhdGUJbW1fc3RhdGU7CisJdWludDMyX3QgCQlwX3Rtc2k7CisJdWludDMyX3QgCQlwX3Rtc2lfb2xkOwkvKiBvbGQgUC1UTVNJIGJlZm9yZSBuZXcgaXMgY29uZmlybWVkICovCisJdWludDMyX3QgCQlwX3Rtc2lfc2lnOworCWNoYXIgCQkJaW1laVtHU01fSU1FSV9MRU5HVEhdOworCS8qIE9wdDogU29mdHdhcmUgVmVyc2lvbiBOdW1iYmVyIC8gVFMgMjMuMTk1ICovCisJY2hhciAJCQltc2lzZG5bR1NNX0VYVEVOU0lPTl9MRU5HVEhdOworCXN0cnVjdCBncHJzX3JhX2lkCXJhOworCXVpbnQxNl90CQljZWxsX2lkOworCXVpbnQzMl90CQljZWxsX2lkX2FnZTsKKwl1aW50MTZfdAkJc2FjOwkvKiBJdTogU2VydmljZSBBcmVhIENvZGUgKi8KKwl1aW50MzJfdAkJc2FjX2FnZTsvKiBJdTogU2VydmljZSBBcmVhIENvZGUgYWdlICovCisJLyogVkxSIG51bWJlciAqLworCXVpbnQzMl90CQluZXdfc2dzbl9hZGRyOworCS8qIEF1dGhlbnRpY2F0aW9uIFRyaXBsZXRzICovCisJLyogS2MgKi8KKwkvKiBJdTogQ0ssIElLLCBLU0kgKi8KKwkvKiBDS1NOICovCisJZW51bSBncHJzX2NpcGhfYWxnbwljaXBoX2FsZ287CisJc3RydWN0IHsKKwkJdWludDhfdAlidWZbMTRdOwkvKiAxMC41LjUuMTJhICovCisJCXVpbnQ4X3QJbGVuOworCX0gbXNfcmFkaW9fYWNjZXNzX2NhcGE7CisJc3RydWN0IHsKKwkJdWludDhfdAlidWZbNF07CQkvKiAxMC41LjUuMTIgKi8KKwkJdWludDhfdAlsZW47CisJfSBtc19uZXR3b3JrX2NhcGE7CisJdWludDE2X3QJCWRyeF9wYXJtczsKKwlpbnQJCQltbnJnOwkvKiBNUyByZXBvcnRlZCB0byBITFI/ICovCisJaW50CQkJbmdhZjsJLyogTVMgcmVwb3J0ZWQgdG8gTVNDL1ZMUj8gKi8KKwlpbnQJCQlwcGY7CS8qIHBhZ2luZyBmb3IgR1BSUyArIG5vbi1HUFJTPyAqLworCS8qIFNNUyBQYXJhbWV0ZXJzICovCisJaW50CQkJcmVjb3Zlcnk7CisJdWludDhfdAkJCXJhZGlvX3ByaW9fc21zOworCisJc3RydWN0IGxsaXN0X2hlYWQJcGRwX2xpc3Q7CisKKwkvKiBBZGRpdGlvbmFsIGJpdHMgbm90IHByZXNlbnQgaW4gdGhlIEdTTSBUUyAqLworCXN0cnVjdCBncHJzX2xsY19sbG1lCSpsbG1lOworCXVpbnQzMl90CQl0bGxpOworCXVpbnQzMl90CQl0bGxpX25ldzsKKwl1aW50MTZfdAkJbnNlaTsKKwl1aW50MTZfdAkJYnZjaTsKKwlzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAJKmN0cmc7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJdW5zaWduZWQgaW50CQlUOwkJLyogVHh4eHggbnVtYmVyICovCisJdW5zaWduZWQgaW50CQludW1fVF9leHA7CS8qIG51bWJlciBvZiBjb25zZWN1dGl2ZSBUIGV4cGlyYXRpb25zICovCisKKwllbnVtIGdwcnNfdDMzNTBfbW9kZQl0MzM1MF9tb2RlOworCXVpbnQ4X3QJCQl0MzM3MF9pZF90eXBlOworfTsKKworLyogbG9vay11cCBhIFNHU04gTU0gY29udGV4dCBiYXNlZCBvbiBUTExJICsgUkFJICovCitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2J5X3RsbGkodWludDMyX3QgdGxsaSwKKwkJCQkJY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQpOworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9ieV9wdG1zaSh1aW50MzJfdCB0bXNpKTsKK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYnlfaW1zaShjb25zdCBjaGFyICppbXNpKTsKKworLyogQWxsb2NhdGUgYSBuZXcgU0dTTiBNTSBjb250ZXh0ICovCitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2FsbG9jKHVpbnQzMl90IHRsbGksCisJCQkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKTsKKworCitlbnVtIHBkcF9jdHhfc3RhdGUgeworCVBEUF9TVEFURV9OT05FLAorCVBEUF9TVEFURV9DUl9SRVEsCisJUERQX1NUQVRFX0NSX0NPTkYsCit9OworCitlbnVtIHBkcF90eXBlIHsKKwlQRFBfVFlQRV9OT05FLAorCVBEUF9UWVBFX0VUU0lfUFBQLAorCVBEUF9UWVBFX0lBTkFfSVB2NCwKKwlQRFBfVFlQRV9JQU5BX0lQdjYsCit9OworCitzdHJ1Y3Qgc2dzbl9wZHBfY3R4IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZAlsaXN0OwkvKiBsaXN0X2hlYWQgZm9yIG1tY3R4LT5wZHBfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkCWdfbGlzdDsJLyogbGlzdF9oZWFkIGZvciBnbG9iYWwgbGlzdCAqLworCXN0cnVjdCBzZ3NuX21tX2N0eAkqbW07CS8qIGJhY2sgcG9pbnRlciB0byBNTSBDVFggKi8KKwlzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eAkqZ2dzbjsJLyogd2hpY2ggR0dTTiBzZXJ2ZXMgdGhpcyBQRFAgKi8KKwlzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAJKmN0cmc7CisKKwkvL3Vuc2lnbmVkIGludAkJaWQ7CisJc3RydWN0IHBkcF90CQkqbGliOwkvKiBwb2ludGVyIHRvIGxpYmd0cCBQRFAgY3R4ICovCisJZW51bSBwZHBfY3R4X3N0YXRlCXN0YXRlOworCWVudW0gcGRwX3R5cGUJCXR5cGU7CisJdWludDMyX3QJCWFkZHJlc3M7CisJY2hhciAJCQkqYXBuX3N1YnNjcmliZWQ7CisJLy9jaGFyIAkJCSphcG5fdXNlZDsKKwl1aW50MTZfdAkJbnNhcGk7CS8qIFNORENQICovCisJdWludDE2X3QJCXNhcGk7CS8qIExMQyAqLworCXVpbnQ4X3QJCQl0aTsJLyogdHJhbnNhY3Rpb24gaWRlbnRpZmllciAqLworCWludAkJCXZwbG1uX2FsbG93ZWQ7CisJdWludDMyX3QJCXFvc19wcm9maWxlX3N1YnNjcjsKKwkvL3VpbnQzMl90CQlxb3NfcHJvZmlsZV9yZXE7CisJLy91aW50MzJfdAkJcW9zX3Byb2ZpbGVfbmVnOworCXVpbnQ4X3QJCQlyYWRpb19wcmlvOworCXVpbnQzMl90CQl0eF9ucGR1X25yOworCXVpbnQzMl90CQlyeF9ucGR1X25yOworCXVpbnQzMl90CQl0eF9ndHBfc25kOworCXVpbnQzMl90CQlyeF9ndHBfc251OworCS8vdWludDMyX3QJCWNoYXJnaW5nX2lkOworCWludAkJCXJlb3JkZXJpbmdfcmVxZDsKK307CisKKworLyogbG9vayB1cCBQRFAgY29udGV4dCBieSBNTSBjb250ZXh0IGFuZCBOU0FQSSAqLworc3RydWN0IHNnc25fcGRwX2N0eCAqc2dzbl9wZHBfY3R4X2J5X25zYXBpKGNvbnN0IHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sCisJCQkJCSAgIHVpbnQ4X3QgbnNhcGkpOworLyogbG9vayB1cCBQRFAgY29udGV4dCBieSBNTSBjb250ZXh0IGFuZCB0cmFuc2FjdGlvbiBJRCAqLworc3RydWN0IHNnc25fcGRwX2N0eCAqc2dzbl9wZHBfY3R4X2J5X3RpZChjb25zdCBzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLAorCQkJCQkgdWludDhfdCB0aWQpOworCitzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpzZ3NuX3BkcF9jdHhfYWxsb2Moc3RydWN0IHNnc25fbW1fY3R4ICptbSwKKwkJCQkJdWludDhfdCBuc2FwaSk7Cit2b2lkIHNnc25fcGRwX2N0eF9mcmVlKHN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcCk7CisKKworc3RydWN0IHNnc25fZ2dzbl9jdHggeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJdWludDMyX3QgaWQ7CisJdW5zaWduZWQgaW50IGd0cF92ZXJzaW9uOworCXN0cnVjdCBpbl9hZGRyIHJlbW90ZV9hZGRyOworCXN0cnVjdCBnc25fdCAqZ3NuOworfTsKK3N0cnVjdCBzZ3NuX2dnc25fY3R4ICpzZ3NuX2dnc25fY3R4X2FsbG9jKHVpbnQzMl90IGlkKTsKK3N0cnVjdCBzZ3NuX2dnc25fY3R4ICpzZ3NuX2dnc25fY3R4X2J5X2lkKHVpbnQzMl90IGlkKTsKK3N0cnVjdCBzZ3NuX2dnc25fY3R4ICpzZ3NuX2dnc25fY3R4X2ZpbmRfYWxsb2ModWludDMyX3QgaWQpOworCitzdHJ1Y3QgYXBuX2N0eCB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2dzbjsKKwljaGFyICpuYW1lOworCWNoYXIgKmRlc2NyaXB0aW9uOworfTsKKworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIHNnc25fbW1fY3R4dHM7CitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgc2dzbl9nZ3NuX2N0eHRzOworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIHNnc25fYXBuX2N0eHRzOworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIHNnc25fcGRwX2N0eHRzOworCit1aW50MzJfdCBzZ3NuX2FsbG9jX3B0bXNpKHZvaWQpOworCisjZW5kaWYgLyogX0dQUlNfU0dTTl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDguaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oCmluZGV4IGM0MDE4Y2QuLjFlNWZmY2UgMTAwNjQ0Ci0tLSBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oCkBAIC0xMSwyMSArMTEsMjggQEAKIHN0cnVjdCBnc21fc3Vic2NyaWJlcjsKIHN0cnVjdCBnc21fbmV0d29yazsKIHN0cnVjdCBnc21fdHJhbnM7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbjsKKworI2RlZmluZSBHU000OF9BTExPQ19TSVpFCTEwMjQKKyNkZWZpbmUgR1NNNDhfQUxMT0NfSEVBRFJPT00JMTI4CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1zZ2IgKmdzbTQ4X21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShHU000OF9BTExPQ19TSVpFLCBHU000OF9BTExPQ19IRUFEUk9PTSwKKwkJCQkgICAiR1NNIDA0LjA4Iik7Cit9CiAKIC8qIGNvbmZpZyBvcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGxvd2VyIGxldmVzICovCiB2b2lkIGdzbTA0MDhfYWxsb3dfZXZlcnlvbmUoaW50IGFsbG93KTsKK3ZvaWQgZ3NtMDQwOF9jbGVhcl9yZXF1ZXN0KHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCB1aW50MzJfdCBjYXVzZSk7CiAKIGludCBnc20wNDA4X3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKTsKIGVudW0gZ3NtX2NoYW5fdCBnZXRfY3R5cGVfYnlfY2hyZXEoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcmEsIGludCBuZWNpKTsKIGVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGdldF9yZWFzb25fYnlfY2hyZXEoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcmEsIGludCBuZWNpKTsKIAotaW50IGdzbTQ4X3R4X21tX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IGdzbTQ4X3R4X21tX2luZm8oc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4pOwogaW50IGdzbTQ4X3R4X21tX2F1dGhfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCAqcmFuZCwgaW50IGtleV9zZXEpOwogaW50IGdzbTQ4X3R4X21tX2F1dGhfcmVqKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKLXN0cnVjdCBtc2diICpnc200OF9tc2diX2FsbG9jKHZvaWQpOwotaW50IGdzbTQ4X3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOwotaW50IGdzbTQ4X21pX3RvX3N0cmluZyhjaGFyICpzdHJpbmcsIGNvbnN0IGludCBzdHJfbGVuLCBjb25zdCB1X2ludDhfdCAqbWksIGNvbnN0IGludCBtaV9sZW4pOwotCiBpbnQgZ3NtNDhfc2VuZF9ycl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKIGludCBnc200OF9zZW5kX3JyX2NpcGhfbW9kZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50IHdhbnRfaW1laXN2KTsKIGludCBnc200OF9zZW5kX3JyX2FwcF9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBhcGR1X2lkLApAQCAtNDUsNyArNTIsOCBAQAogCQkgICAgICBpbnQgaF9sZW4pOwogCiBpbnQgc2VuZF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCAqY2xhc3NtYXJrMl9sdik7Ci1pbnQgZ3NtNDhfcGFnaW5nX2V4dHJhY3RfbWkoc3RydWN0IG1zZ2IgKm1zZywgY2hhciAqbWlfc3RyaW5nLCB1X2ludDhfdCAqbWlfdHlwZSk7CitpbnQgZ3NtNDhfZXh0cmFjdF9taSh1aW50OF90ICpjbGFzc21hcmsyLCBpbnQgbGVuZ3RoLCBjaGFyICptaV9zdHJpbmcsIHVpbnQ4X3QgKm1pX3R5cGUpOworaW50IGdzbTQ4X3BhZ2luZ19leHRyYWN0X21pKHN0cnVjdCBnc200OF9wYWdfcmVzcCAqcGFnLCBpbnQgbGVuZ3RoLCBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKTsKIGludCBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOwogCiBpbnQgZ3NtNDhfbGNoYW5fbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsY2hhbl9tb2RlKTsKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOF9ncHJzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDhfZ3Bycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTUxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDhfZ3Bycy5oCkBAIC0wLDAgKzEsMzY2IEBACisjaWZuZGVmIF9HU000OF9HUFJTX0gKKyNkZWZpbmUgX0dTTTQ4X0dQUlNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+CisKKy8qIFRhYmxlIDEwLjQgLyAxMC40YSwgR1BSUyBNb2JpbGl0eSBNYW5hZ2VtZW50IChHTU0pICovCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfUkVRCQkweDAxCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfQUNLCQkweDAyCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfQ09NUEwJMHgwMworI2RlZmluZSBHU000OF9NVF9HTU1fQVRUQUNIX1JFSgkJMHgwNAorI2RlZmluZSBHU000OF9NVF9HTU1fREVUQUNIX1JFUQkJMHgwNQorI2RlZmluZSBHU000OF9NVF9HTU1fREVUQUNIX0FDSwkJMHgwNgorCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfUkVRCQkweDA4CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfQUNLCQkweDA5CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfQ09NUEwJMHgwYQorI2RlZmluZSBHU000OF9NVF9HTU1fUkFfVVBEX1JFSgkJMHgwYgorCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9QVE1TSV9SRUFMTF9DTUQJMHgxMAorI2RlZmluZSBHU000OF9NVF9HTU1fUFRNU0lfUkVBTExfQ09NUEwJMHgxMQorI2RlZmluZSBHU000OF9NVF9HTU1fQVVUSF9DSVBIX1JFUQkweDEyCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVVRIX0NJUEhfUkVTUAkweDEzCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVVRIX0NJUEhfUkVKCTB4MTQKKyNkZWZpbmUgR1NNNDhfTVRfR01NX0lEX1JFUQkJMHgxNQorI2RlZmluZSBHU000OF9NVF9HTU1fSURfUkVTUAkJMHgxNgorI2RlZmluZSBHU000OF9NVF9HTU1fU1RBVFVTCQkweDIwCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9JTkZPCQkweDIxCisKKy8qIFRhYmxlIDEwLjRhLCBHUFJTIFNlc3Npb24gTWFuYWdlbWVudCAoR1NNKSAqLworI2RlZmluZSBHU000OF9NVF9HU01fQUNUX1BEUF9SRVEJMHg0MQorI2RlZmluZSBHU000OF9NVF9HU01fQUNUX1BEUF9BQ0sJMHg0MgorI2RlZmluZSBHU000OF9NVF9HU01fQUNUX1BEUF9SRUoJMHg0MworI2RlZmluZSBHU000OF9NVF9HU01fUkVRX1BEUF9BQ1QJMHg0NAorI2RlZmluZSBHU000OF9NVF9HU01fUkVRX1BEUF9BQ1RfUkVKCTB4NDUKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0RFQUNUX1BEUF9SRVEJMHg0NgorI2RlZmluZSBHU000OF9NVF9HU01fREVBQ1RfUERQX0FDSwkweDQ3CisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX1JFUQkweDUwCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX0FDSwkweDUxCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX1JFSgkweDUyCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9ERUFDVF9BQV9QRFBfUkVRCTB4NTMKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0RFQUNUX0FBX1BEUF9BQ0sJMHg1NAorI2RlZmluZSBHU000OF9NVF9HU01fU1RBVFVTCQkweDU1CisKKy8qIENoYXB0ZXIgMTAuNS41LjIgLyBUYWJsZSAxMC41LjEzNSAqLworI2RlZmluZSBHUFJTX0FUVF9UX0FUVEFDSAkJMQorI2RlZmluZSBHUFJTX0FUVF9UX0FUVF9XSElMRV9JTVNJCTIKKyNkZWZpbmUgR1BSU19BVFRfVF9DT01CSU5FRAkJMworCisvKiBDaGFwdGVyIDEwLjUuNS41IC8gVGFibGUgMTAuNS4xMzggKi8KKyNkZWZpbmUgR1BSU19ERVRfVF9NT19HUFJTCQkxCisjZGVmaW5lIEdQUlNfREVUX1RfTU9fSU1TSQkJMgorI2RlZmluZSBHUFJTX0RFVF9UX01PX0NPTUJJTkVECQkzCisvKiBOZXR3b3JrIHRvIE1TIGRpcmVjdGlvbiAqLworI2RlZmluZSBHUFJTX0RFVF9UX01UX1JFQVRUX1JFUQkJMQorI2RlZmluZSBHUFJTX0RFVF9UX01UX1JFQVRUX05PVFJFUQkyCisjZGVmaW5lIEdQUlNfREVUX1RfTVRfSU1TSQkJMworCisvKiBDaGFwdGVyIDEwLjUuNS4xOCAvIFRhYmxlIDEwNS4xNTAgKi8KKyNkZWZpbmUgR1BSU19VUERfVF9SQQkJCTAKKyNkZWZpbmUgR1BSU19VUERfVF9SQV9MQQkJMQorI2RlZmluZSBHUFJTX1VQRF9UX1JBX0xBX0lNU0lfQVRUCTIKKyNkZWZpbmUgR1BSU19VUERfVF9QRVJJT0RJQwkJMworCitlbnVtIGdzbTQ4X2dwcnNfaWVfbW0geworCUdTTTQ4X0lFX0dNTV9USU1FUl9SRUFEWQk9IDB4MTcsCS8qIDEwLjUuNy4zICovCisJR1NNNDhfSUVfR01NX0FMTE9DX1BUTVNJCT0gMHgxOCwJLyogMTAuNS4xLjQgKi8KKwlHU000OF9JRV9HTU1fUFRNU0lfU0lHCQk9IDB4MTksCS8qIDEwLjUuNS44ICovCisJR1NNNDhfSUVfR01NX0FVVEhfUkFORAkJPSAweDIxLAkvKiAxMC41LjMuMSAqLworCUdTTTQ4X0lFX0dNTV9BVVRIX1NSRVMJCT0gMHgyMiwJLyogMTAuNS4zLjIgKi8KKwlHU000OF9JRV9HTU1fSU1FSVNWCQk9IDB4MjMsCS8qIDEwLjUuMS40ICovCisJR1NNNDhfSUVfR01NX0RSWF9QQVJBTQkJPSAweDI3LAkvKiAxMC41LjUuNiAqLworCUdTTTQ4X0lFX0dNTV9NU19ORVRfQ0FQQQk9IDB4MzEsCS8qIDEwLjUuNS4xMiAqLworCUdTTTQ4X0lFX0dNTV9QRFBfQ1RYX1NUQVRVUwk9IDB4MzIsCS8qIDEwLjUuNy4xICovCisJR1NNNDhfSUVfR01NX1BTX0xDU19DQVBBCT0gMHgzMywJLyogMTAuNS41LjIyICovCisJR1NNNDhfSUVfR01NX0dNTV9NQk1TX0NUWF9TVAk9IDB4MzUsCS8qIDEwLjUuNy42ICovCit9OworCitlbnVtIGdzbTQ4X2dwcnNfaWVfc20geworCUdTTTQ4X0lFX0dTTV9BUE4JCT0gMHgyOCwJLyogMTAuNS42LjEgKi8KKwlHU000OF9JRV9HU01fUFJPVE9fQ09ORl9PUFQJPSAweDI3LAkvKiAxMC41LjYuMyAqLworCUdTTTQ4X0lFX0dTTV9QRFBfQUREUgkJPSAweDJiLCAvKiAxMC41LjYuNCAqLworCUdTTTQ4X0lFX0dTTV9BQV9UTVIJCT0gMHgyOSwJLyogMTAuNS43LjMgKi8KKwlHU000OF9JRV9HU01fTkFNRV9GVUxMCQk9IDB4NDMsIC8qIDEwLjUuMy41YSAqLworCUdTTTQ4X0lFX0dTTV9OQU1FX1NIT1JUCQk9IDB4NDUsIC8qIDEwLjUuMy41YSAqLworCUdTTTQ4X0lFX0dTTV9USU1FWk9ORQkJPSAweDQ2LCAvKiAxMC41LjMuOCAqLworCUdTTTQ4X0lFX0dTTV9VVENfQU5EX1RaCQk9IDB4NDcsIC8qIDEwLjUuMy45ICovCisJR1NNNDhfSUVfR1NNX0xTQV9JRAkJPSAweDQ4LCAvKiAxMC41LjMuMTEgKi8KKworCS8qIEZha2UgSUVzIHRoYXQgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBMYXllcjMgYWlyIGludGVyZmFjZSwKKwkgKiBidXQgd2hpY2ggd2UgdXNlIHRvIHNpbXBsaWZ5IGludGVybmFsIEFQSXMgKi8KKwlPU01PX0lFX0dTTV9SRVFfUU9TCQk9IDB4ZmQsCisJT1NNT19JRV9HU01fUkVRX1BEUF9BRERSCT0gMHhmZSwKK307CisKKy8qIENoYXB0ZXIgOS40LjE1IC8gVGFibGUgOS40LjE1ICovCitzdHJ1Y3QgZ3NtNDhfcmFfdXBkX2FjayB7CisJdWludDhfdCBmb3JjZV9zdGJ5OjQsCS8qIDEwLjUuNS43ICovCisJCSB1cGRfcmVzdWx0OjQ7CS8qIDEwLjUuNS4xNyAqLworCXVpbnQ4X3QgcmFfdXBkX3RpbWVyOwkvKiAxMC41LjcuMyAqLworCXN0cnVjdCBnc200OF9yYV9pZCByYV9pZDsgLyogMTAuNS41LjE1ICovCisJdWludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciAxMC41LjcuMyAqLworZW51bSBnc200OF9ncHJzX3Rtcl91bml0IHsKKwlHUFJTX1RNUl8yU0VDT05EUwk9IDAgPDwgNSwKKwlHUFJTX1RNUl9NSU5VVEUJCT0gMSA8PCA1LAorCUdQUlNfVE1SXzZNSU5VVEUJPSAyIDw8IDUsCisJR1BSU19UTVJfREVBQ1RJVkFURUQJPSAzIDw8IDUsCit9OworCisvKiBDaGFwdGVyIDkuNC4yIC8gVGFibGUgOS40LjIgKi8KK3N0cnVjdCBnc200OF9hdHRhY2hfYWNrIHsKKwl1aW50OF90IGF0dF9yZXN1bHQ6NCwJLyogMTAuNS41LjcgKi8KKwkJIGZvcmNlX3N0Ynk6NDsJLyogMTAuNS41LjEgKi8KKwl1aW50OF90IHJhX3VwZF90aW1lcjsJLyogMTAuNS43LjMgKi8KKwl1aW50OF90IHJhZGlvX3ByaW87CS8qIDEwLjUuNy4yICovCisJc3RydWN0IGdzbTQ4X3JhX2lkIHJhX2lkOyAvKiAxMC41LjUuMTUgKi8KKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBDaGFwdGVyIDkuNS4xIC8gVGFibGUgOS41LjEgKi8KK3N0cnVjdCBnc200OF9hY3RfcGRwX2N0eF9yZXEgeworCXVpbnQ4X3QgcmVxX25zYXBpOworCXVpbnQ4X3QgcmVxX2xsY19zYXBpOworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIENoYXB0ZXIgMTAuNS41LjE0IC8gVGFibGUgMTAuNS4xNDcgKi8KK2VudW0gZ3NtNDhfZ21tX2NhdXNlIHsKKwlHTU1fQ0FVU0VfSU1TSV9VTktOT1dOCQk9IDB4MDIsCisJR01NX0NBVVNFX0lMTEVHQUxfTVMJCT0gMHgwMywKKwlHTU1fQ0FVU0VfSUxMRUdBTF9NRQkJPSAweDA2LAorCUdNTV9DQVVTRV9HUFJTX05PVEFMTE9XRUQJPSAweDA3LAorCUdNTV9DQVVTRV9HUFJTX09USEVSX05PVEFMTE9XRUQJPSAweDA4LAorCUdNTV9DQVVTRV9NU19JRF9OT1RfREVSSVZFRAk9IDB4MDksCisJR01NX0NBVVNFX0lNUExfREVUQUNIRUQJCT0gMHgwYSwKKwlHTU1fQ0FVU0VfUExNTl9OT1RBTExPV0VECT0gMHgwYiwKKwlHTU1fQ0FVU0VfTEFfTk9UQUxMT1dFRAkJPSAweDBjLAorCUdNTV9DQVVTRV9ST0FNSU5HX05PVEFMTE9XRUQJPSAweDBkLAorCUdNTV9DQVVTRV9OT19HUFJTX1BMTU4JCT0gMHgwZSwKKwlHTU1fQ0FVU0VfTVNDX1RFTVBfTk9UUkVBQ0gJPSAweDEwLAorCUdNTV9DQVVTRV9ORVRfRkFJTAkJPSAweDExLAorCUdNTV9DQVVTRV9DT05HRVNUSU9OCQk9IDB4MTYsCisJR01NX0NBVVNFX1NFTV9JTkNPUlJfTVNHCT0gMHg1ZiwKKwlHTU1fQ0FVU0VfSU5WX01BTkRfSU5GTwkJPSAweDYwLAorCUdNTV9DQVVTRV9NU0dUX05PVEVYSVNUX05PVElNUEwJPSAweDYxLAorCUdNTV9DQVVTRV9NU0dUX0lOQ09NUF9QX1NUQVRFCT0gMHg2MiwKKwlHTU1fQ0FVU0VfSUVfTk9URVhJU1RfTk9USU1QTAk9IDB4NjMsCisJR01NX0NBVVNFX0NPTkRfSUVfRVJSCQk9IDB4NjQsCisJR01NX0NBVVNFX01TR19JTkNPTVBfUF9TVEFURQk9IDB4NjUsCisJR01NX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMJPSAweDZmLAorfTsKKworLyogQ2hhcHRlciAxMC40LjYuNiAvIFRhYmxlIDEwLjUuMTU3ICovCitlbnVtIGdzbTQ4X2dzbV9jYXVzZSB7CisJR1NNX0NBVVNFX0lOU1VGRl9SU1JDCQk9IDB4MWEsCisJR1NNX0NBVVNFX01JU1NJTkdfQVBOCQk9IDB4MWIsCisJR1NNX0NBVVNFX1VOS05PV05fUERQCQk9IDB4MWMsCisJR1NNX0NBVVNFX0FVVEhfRkFJTEVECQk9IDB4MWQsCisJR1NNX0NBVVNFX0FDVF9SRUpfR0dTTgkJPSAweDFlLAorCUdTTV9DQVVTRV9BQ1RfUkVKX1VOU1BFQwk9IDB4MWYsCisJR1NNX0NBVVNFX1NFUlZfT1BUX05PVFNVUFAJPSAweDIwLAorCUdTTV9DQVVTRV9SRVFfU0VSVl9PUFRfTk9UU1VCCT0gMHgyMSwKKwlHU01fQ0FVU0VfU0VSVl9PUFRfVEVNUF9PT08JPSAweDIyLAorCUdTTV9DQVVTRV9OU0FQSV9JTl9VU0UJCT0gMHgyMywKKwlHU01fQ0FVU0VfREVBQ1RfUkVHVUxBUgkJPSAweDI0LAorCUdTTV9DQVVTRV9RT1NfTk9UX0FDQ0VQVEVECT0gMHgyNSwKKwlHU01fQ0FVU0VfTkVUX0ZBSUwJCT0gMHgyNiwKKwlHU01fQ0FVU0VfUkVBQ1RfUlFECQk9IDB4MjcsCisJR1NNX0NBVVNFX0ZFQVRVUkVfTk9UU1VQUAk9IDB4MjgsCisJR1NNX0NBVVNFX0lOVkFMSURfVFJBTlNfSUQJPSAweDUxLAorCUdTTV9DQVVTRV9TRU1fSU5DT1JSX01TRwk9IDB4NWYsCisJR1NNX0NBVVNFX0lOVl9NQU5EX0lORk8JCT0gMHg2MCwKKwlHU01fQ0FVU0VfTVNHVF9OT1RFWElTVF9OT1RJTVBMCT0gMHg2MSwKKwlHU01fQ0FVU0VfTVNHVF9JTkNPTVBfUF9TVEFURQk9IDB4NjIsCisJR1NNX0NBVVNFX0lFX05PVEVYSVNUX05PVElNUEwJPSAweDYzLAorCUdTTV9DQVVTRV9DT05EX0lFX0VSUgkJPSAweDY0LAorCUdTTV9DQVVTRV9NU0dfSU5DT01QX1BfU1RBVEUJPSAweDY1LAorCUdTTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDCT0gMHg2ZiwKK307CisKKy8qIFNlY3Rpb24gNi4xLjIuMjogU2Vzc2lvbiBtYW5hZ2VtZW50IHN0YXRlcyBvbiB0aGUgbmV0d29yayBzaWRlICovCitlbnVtIGdzbTQ4X3BkcF9zdGF0ZSB7CisJUERQX1NfSU5BQ1RJVkUsCisJUERQX1NfQUNUSVZFX1BFTkRJTkcsCisJUERQX1NfQUNUSVZFLAorCVBEUF9TX0lOQUNUSVZFX1BFTkRJTkcsCisJUERQX1NfTU9ESUZZX1BFTkRJTkcsCit9OworCisvKiBUYWJsZSAxMC41LjE1NS8zR1BQIFRTIDI0LjAwOCAqLworZW51bSBnc200OF9wZHBfdHlwZV9vcmcgeworCVBEUF9UWVBFX09SR19FVFNJCQk9IDB4MDAsCisJUERQX1RZUEVfT1JHX0lFVEYJCT0gMHgwMSwKK307CitlbnVtIGdzbTQ4X3BkcF90eXBlX25yIHsKKwlQRFBfVFlQRV9OX0VUU0lfUkVTRVJWRUQJPSAweDAwLAorCVBEUF9UWVBFX05fRVRTSV9QUFAJCT0gMHgwMSwKKwlQRFBfVFlQRV9OX0lFVEZfSVB2NAkJPSAweDIxLAorCVBEUF9UWVBFX05fSUVURl9JUHY2CQk9IDB4NTcsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfcmVsaWFiX2NsYXNzIHsKKwlHU000OF9RT1NfUkNfTExDX0FDS19STENfQUNLX0RBVEFfUFJPVAk9IDIsCisJR1NNNDhfUU9TX1JDX0xMQ19VTl9STENfQUNLX0RBVEFfUFJPVAk9IDMsCisJR1NNNDhfUU9TX1JDX0xMQ19VTl9STENfVU5fUFJPVF9EQVRBCT0gNCwKKwlHU000OF9RT1NfUkNfTExDX1VOX1JMQ19VTl9EQVRBX1VOCT0gNSwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19wcmVjZWRfY2xhc3MgeworCUdTTTQ4X1FPU19QQ19ISUdICT0gMSwKKwlHU000OF9RT1NfUENfTk9STUFMCT0gMiwKKwlHU000OF9RT1NfUENfTE9XCT0gMywKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19wZWFrX3RwdXQgeworCUdTTTQ4X1FPU19QRUFLX1RQVVRfMTAwMGJwcwk9IDEsCisJR1NNNDhfUU9TX1BFQUtfVFBVVF8yMDAwYnBzCT0gMiwKKwlHU000OF9RT1NfUEVBS19UUFVUXzQwMDBicHMJPSAzLAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfODAwMGJwcwk9IDQsCisJR1NNNDhfUU9TX1BFQUtfVFBVVF8xNjAwMGJwcwk9IDUsCisJR1NNNDhfUU9TX1BFQUtfVFBVVF8zMjAwMGJwcwk9IDYsCisJR1NNNDhfUU9TX1BFQUtfVFBVVF82NDAwMGJwcwk9IDcsCisJR1NNNDhfUU9TX1BFQUtfVFBVVF8xMjgwMDBicHMJPSA4LAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfMjU2MDAwYnBzCT0gOSwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19tZWFuX3RwdXQgeworCUdTTTQ4X1FPU19NRUFOX1RQVVRfMTAwYnBoCT0gMSwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzIwMGJwaAk9IDIsCisJR1NNNDhfUU9TX01FQU5fVFBVVF81MDBicGgJPSAzLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMTAwMGJwaAk9IDQsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8yMDAwYnBoCT0gNSwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzUwMDBicGgJPSA2LAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMTAwMDBicGgJPSA3LAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMjAwMDBicGgJPSA4LAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfNTAwMDBicGgJPSA5LAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMTAwa2JwaAk9IDEwLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMjAwa2JwaAk9IDExLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfNTAwa2JwaAk9IDB4YywKKwlHU000OF9RT1NfTUVBTl9UUFVUXzFNYnBoCT0gMHhkLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMk1icGgJPSAweGUsCisJR1NNNDhfUU9TX01FQU5fVFBVVF81TWJwaAk9IDB4ZiwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzEwTWJwaAk9IDB4MTAsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8yME1icGgJPSAweDExLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfNTBNYnBoCT0gMHgxMiwKKwlHU000OF9RT1NfTUVBTl9UUFVUX0JFU1RfRUZGT1JUCT0gMHgxZiwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19lcnJfc2R1IHsKKwlHU000OF9RT1NfRVJSU0RVX05PREVURUNUCT0gMSwKKwlHU000OF9RT1NfRVJSU0RVX1lFUwkJPSAyLAorCUdTTTQ4X1FPU19FUlJTRFVfTk8JCT0gMywKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19kZWxpdl9vcmRlciB7CisJR1NNNDhfUU9TX0RPX09SREVSRUQJCT0gMSwKKwlHU000OF9RT1NfRE9fVU5PUkRFUkVECQk9IDIsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfdHJhZl9jbGFzcyB7CisJR1NNNDhfUU9TX1RDX0NPTlZFUlNBVElPTkFMCT0gMSwKKwlHU000OF9RT1NfVENfU1RSRUFNSU5HCQk9IDIsCisJR1NNNDhfUU9TX1RDX0lOVEVSQUNUSVZFCT0gMywKKwlHU000OF9RT1NfVENfQkFDS0dST1VORAkJPSA0LAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX21heF9zZHVfc2l6ZSB7CisJLyogdmFsdWVzIGJlbG93IGluIDEwIG9jdGV0IGdyYW51bGFyaXR5ICovCisJR1NNNDhfUU9TX01BWFNEVV8xNTAyCQk9IDB4OTcsCisJR1NNNDhfUU9TX01BWFNEVV8xNTEwCQk9IDB4OTgsCisJR1NNNDhfUU9TX01BWFNEVV8xNTIwCQk9IDB4OTksCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfbWF4X2JpdHJhdGUgeworCUdTTTQ4X1FPU19NQlJBVEVfMWsJCT0gMHgwMSwKKwlHU000OF9RT1NfTUJSQVRFXzYzawkJPSAweDNmLAorCUdTTTQ4X1FPU19NQlJBVEVfNjRrCQk9IDB4NDAsCisJR1NNNDhfUU9TX01CUkFURV81NjhrCQk9IDB4N2YsCisJR1NNNDhfUU9TX01CUkFURV81NzZrCQk9IDB4ODAsCisJR1NNNDhfUU9TX01CUkFURV84NjQwawkJPSAweGZlLAorCUdTTTQ4X1FPU19NQlJBVEVfMGsJCT0gMHhmZiwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19yZXNpZF9iZXIgeworCUdTTTQ4X1FPU19SQkVSXzVlXzIJCT0gMHgwMSwKKwlHU000OF9RT1NfUkJFUl8xZV8yCQk9IDB4MDIsCisJR1NNNDhfUU9TX1JCRVJfNWVfMwkJPSAweDAzLAorCUdTTTQ4X1FPU19SQkVSXzRlXzMJCT0gMHgwNCwKKwlHU000OF9RT1NfUkJFUl8xZV8zCQk9IDB4MDUsCisJR1NNNDhfUU9TX1JCRVJfMWVfNAkJPSAweDA2LAorCUdTTTQ4X1FPU19SQkVSXzFlXzUJCT0gMHgwNywKKwlHU000OF9RT1NfUkJFUl8xZV82CQk9IDB4MDgsCisJR1NNNDhfUU9TX1JCRVJfNmVfOAkJPSAweDA5LAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX3NkdV9lcnIgeworCUdTTTQ4X1FPU19TRVJSXzFlXzIJCT0gMHgwMSwKKwlHU000OF9RT1NfU0VSUl83ZV8yCQk9IDB4MDIsCisJR1NNNDhfUU9TX1NFUlJfMWVfMwkJPSAweDAzLAorCUdTTTQ4X1FPU19TRVJSXzFlXzQJCT0gMHgwNCwKKwlHU000OF9RT1NfU0VSUl8xZV81CQk9IDB4MDUsCisJR1NNNDhfUU9TX1NFUlJfMWVfNgkJPSAweDA2LAorCUdTTTQ4X1FPU19TRVJSXzFlXzEJCT0gMHgwNywKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitzdHJ1Y3QgZ3NtNDhfcW9zIHsKKwkvKiBvY3RldCAzICovCisJdWludDhfdCByZWxpYWJfY2xhc3M6MzsKKwl1aW50OF90IGRlbGF5X2NsYXNzOjM7CisJdWludDhfdCBzcGFyZToyOworCS8qIG9jdGV0IDQgKi8KKwl1aW50OF90IHByZWNlZF9jbGFzczozOworCXVpbnQ4X3Qgc3BhcmUyOjE7CisJdWludDhfdCBwZWFrX3RwdXQ6NDsKKwkvKiBvY3RldCA1ICovCisJdWludDhfdCBtZWFuX3RwdXQ6NTsKKwl1aW50OF90IHNwYXJlMzozOworCS8qIG9jdGV0IDYgKi8KKwl1aW50OF90IGRlbGl2X2Vycl9zZHU6MzsKKwl1aW50OF90IGRlbGl2X29yZGVyOjI7CisJdWludDhfdCB0cmFmX2NsYXNzOjM7CisJLyogb2N0ZXQgNyAqLworCXVpbnQ4X3QgbWF4X3NkdV9zaXplOworCS8qIG9jdGV0IDggKi8KKwl1aW50OF90IG1heF9iaXRyYXRlX3VwOworCS8qIG9jdGV0IDkgKi8KKwl1aW50OF90IG1heF9iaXRyYXRlX2Rvd247CisJLyogb2N0ZXQgMTAgKi8KKwl1aW50OF90IHNkdV9lcnJfcmF0aW86NDsKKwl1aW50OF90IHJlc2lkX2Jlcjo0OworCS8qIG9jdGV0IDExICovCisJdWludDhfdCBoYW5kbGluZ19wcmlvOjI7CisJdWludDhfdCB4ZmVyX2RlbGF5OjY7CisJLyogb2N0ZXQgMTIgKi8KKwl1aW50OF90IGd1YXJfYml0cmF0ZV91cDsKKwkvKiBvY3RldCAxMyAqLworCXVpbnQ4X3QgZ3Vhcl9iaXRyYXRlX2Rvd247CisJLyogb2N0ZXQgMTQgKi8KKwl1aW50OF90IHNyY19zdGF0c19kZXNjOjQ7CisJdWludDhfdCBzaWdfaW5kOjE7CisJdWludDhfdCBzcGFyZTU6MzsKKwkvKiBvY3RldCAxNSAqLworCXVpbnQ4X3QgbWF4X2JpdHJhdGVfZG93bl9leHQ7CisJLyogb2N0ZXQgMTYgKi8KKwl1aW50OF90IGd1YXJfYml0cmF0ZV9kb3duX2V4dDsKK307CisKKworaW50IGdwcnNfdGxsaV90eXBlKHVpbnQzMl90IHRsbGkpOworCisjZW5kaWYgLyogX0dTTTQ4X0dQUlNfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMTEuaAppbmRleCA5YmFkZDM2Li45NWZmNWVmIDEwMDY0NAotLS0gYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMTEuaAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMTEuaApAQCAtMyw2ICszLDggQEAKIAogI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oPgogCisjZGVmaW5lIFVNX1NBUElfU01TIDMJLyogU2VlIEdTTSAwNC4wNS8wNC4wNiAqLworCiAvKiBTTVMgZGVsaXZlciBQRFUgKi8KIHN0cnVjdCBzbXNfZGVsaXZlciB7CiAJdV9pbnQ4X3QgbXRpOjI7CQkvKiBtZXNzYWdlIHR5cGUgaW5kaWNhdG9yICovCkBAIC0yNSw3ICsyNyw3IEBACiAKIGludCBnc20wNDExX3Jjdl9zbXMoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CiAKLWludCBnc200MTFfc2VuZF9zbXNfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fc21zICpzbXMpOworaW50IGdzbTQxMV9zZW5kX3Ntc19sY2hhbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IGdzbV9zbXMgKnNtcyk7CiAKIHN0cnVjdCBnc21fc21zICpzbXNfYWxsb2Modm9pZCk7CiB2b2lkIHNtc19mcmVlKHN0cnVjdCBnc21fc21zICpzbXMpOwpAQCAtMzMsNCArMzUsNSBAQAogdm9pZCBfZ3NtNDExX3Ntc190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKIGludCBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAogCQkJICAgc3RydWN0IGdzbV9zbXMgKnNtcyk7Cit2b2lkIGdzbTQxMV9zYXBpX25fcmVqZWN0KHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX2RhdGEuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmgKaW5kZXggODhlN2YxNi4uNDI5MmJiMSAxMDA2NDQKLS0tIGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX2RhdGEuaAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCkBAIC02NSw2ICs2NSw3IEBACiBlbnVtIGdzbV9ob29rcyB7CiAJR1NNX0hPT0tfTk1fU1dMT0FELAogCUdTTV9IT09LX1JSX1BBR0lORywKKwlHU01fSE9PS19SUl9TRUNVUklUWSwKIH07CiAKIGVudW0gZ3NtX3BhZ2luZ19ldmVudCB7CkBAIC03Myw2ICs3NCw0NSBAQAogCUdTTV9QQUdJTkdfT09NLAogfTsKIAorZW51bSBidHNfZ3Byc19tb2RlIHsKKwlCVFNfR1BSU19OT05FID0gMCwKKwlCVFNfR1BSU19HUFJTID0gMSwKKwlCVFNfR1BSU19FR1BSUyA9IDIsCit9OworCisvKiB0aGUgZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGluIG1zZ2ItPmNiIGZvciBvcGVuYnNjIGFwcHMgKi8KK3N0cnVjdCBvcGVuYnNjX21zZ2JfY2IgeworCXVuc2lnbmVkIGNoYXIgKmJzc2dwaDsKKwl1bnNpZ25lZCBjaGFyICpsbGNoOworCisJLyogQ2VsbCBJZGVudGlmaWVyICovCisJdW5zaWduZWQgY2hhciAqYnNzZ3BfY2VsbF9pZDsKKworCS8qIElkZW50aWZpZXJzIG9mIGEgQlRTLCBlcXVhbCB0byAnc3RydWN0IGJzc2dwX2J0c19jdHgnICovCisJdV9pbnQxNl90IG5zZWk7CisJdV9pbnQxNl90IGJ2Y2k7CisKKwkvKiBJZGVudGlmaWVyIG9mIGEgTVMgKGluc2lkZSBCVFMpLCBlcXVhbCB0byAnc3RydWN0IHNnc25fbW1fY3R4JyAqLworCXVfaW50MzJfdCB0bGxpOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNkZWZpbmUgT0JTQ19NU0dCX0NCKF9fbXNnYikJKChzdHJ1Y3Qgb3BlbmJzY19tc2diX2NiICopJigoX19tc2diKS0+Y2JbMF0pKQorI2RlZmluZSBtc2diX3RsbGkoX194KQkJT0JTQ19NU0dCX0NCKF9feCktPnRsbGkKKyNkZWZpbmUgbXNnYl9uc2VpKF9feCkJCU9CU0NfTVNHQl9DQihfX3gpLT5uc2VpCisjZGVmaW5lIG1zZ2JfYnZjaShfX3gpCQlPQlNDX01TR0JfQ0IoX194KS0+YnZjaQorI2RlZmluZSBtc2diX2dtbWgoX194KQkJKF9feCktPmwzaAorI2RlZmluZSBtc2diX2Jzc2dwaChfX3gpCU9CU0NfTVNHQl9DQihfX3gpLT5ic3NncGgKKyNkZWZpbmUgbXNnYl9ic3NncF9sZW4oX194KQkoKF9feCktPnRhaWwgLSAodWludDhfdCAqKW1zZ2JfYnNzZ3BoKF9feCkpCisjZGVmaW5lIG1zZ2JfYmNpZChfX3gpCQlPQlNDX01TR0JfQ0IoX194KS0+YnNzZ3BfY2VsbF9pZAorI2RlZmluZSBtc2diX2xsY2goX194KQkJT0JTQ19NU0dCX0NCKF9feCktPmxsY2gKKworI2RlZmluZSBPQlNDX0xJTktJRF9DQihfX21zZ2IpCShfX21zZ2IpLT5jYlszXQorCitlbnVtIGdzbV9zZWN1cml0eV9ldmVudCB7CisJR1NNX1NFQ1VSSVRZX05PQVZBSUwsCisJR1NNX1NFQ1VSSVRZX0FVVEhfRkFJTEVELAorCUdTTV9TRUNVUklUWV9TVUNDRUVERUQsCit9OworCiBzdHJ1Y3QgbXNnYjsKIHR5cGVkZWYgaW50IGdzbV9jYmZuKHVuc2lnbmVkIGludCBob29rbnVtLAogCQkgICAgIHVuc2lnbmVkIGludCBldmVudCwKQEAgLTg0LDI2ICsxMjQsMjEgQEAKICAqIHdpbGwgYmUgc3RhcnRlZC4KICAqLwogI2RlZmluZSBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQgMjAsIDAKLSNkZWZpbmUgdXNlX2xjaGFuKGxjaGFuKSBcCi0JZG8gewlsY2hhbi0+dXNlX2NvdW50Kys7IFwKKyNkZWZpbmUgdXNlX3N1YnNjcl9jb24oY29uKSBcCisJZG8gewkoY29uKS0+dXNlX2NvdW50Kys7IFwKIAkJREVCVUdQKERSRUYsICJsY2hhbiAoYnRzPSVkLHRyeD0lZCx0cz0lZCxjaD0lZCkgaW5jcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwgXAotCQkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwgXAotCQkJbGNoYW4tPm5yLCBsY2hhbi0+dXNlX2NvdW50KTsgXAotCQlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOyB9IHdoaWxlKDApOworCQkJKGNvbiktPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCAoY29uKS0+bGNoYW4tPnRzLT50cngtPm5yLCAoY29uKS0+bGNoYW4tPnRzLT5uciwgXAorCQkJKGNvbiktPmxjaGFuLT5uciwgKGNvbiktPnVzZV9jb3VudCk7IFwKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCYoY29uKS0+cmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsgfSB3aGlsZSgwKTsKIAotI2RlZmluZSBwdXRfbGNoYW4obGNoYW4pIFwKLQlkbyB7IGxjaGFuLT51c2VfY291bnQtLTsgXAorI2RlZmluZSBwdXRfc3Vic2NyX2Nvbihjb24pIFwKKwlkbyB7IChjb24pLT51c2VfY291bnQtLTsgXAogCQlERUJVR1AoRFJFRiwgImxjaGFuIChidHM9JWQsdHJ4PSVkLHRzPSVkLGNoPSVkKSBkZWNyZWFzZXMgdXNhZ2UgdG86ICVkXG4iLCBcCi0JCQlsY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgbGNoYW4tPnRzLT50cngtPm5yLCBsY2hhbi0+dHMtPm5yLCBcCi0JCQlsY2hhbi0+bnIsIGxjaGFuLT51c2VfY291bnQpOyBcCisJCQkoY29uKS0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIChjb24pLT5sY2hhbi0+dHMtPnRyeC0+bnIsIChjb24pLT5sY2hhbi0+dHMtPm5yLCBcCisJCQkoY29uKS0+bGNoYW4tPm5yLCAoY29uKS0+dXNlX2NvdW50KTsgXAogCX0gd2hpbGUoMCk7CiAKIAotLyogY29tbXVuaWNhdGlvbnMgbGluayB3aXRoIGEgQlRTICovCi1zdHJ1Y3QgZ3NtX2J0c19saW5rIHsKLQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOwotfTsKLQogLyogUmVhbCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBjb250YWluaW5nIEtpICovCiBlbnVtIGdzbV9hdXRoX2FsZ28gewogCUFVVEhfQUxHT19OT05FLApAQCAtMTI0LDEyICsxNTksMTQgQEAKIAl1X2ludDhfdCBzcmVzWzRdOwogCXVfaW50OF90IGtjWzhdOwogfTsKKyNkZWZpbmUgR1NNX0tFWV9TRVFfSU5WQUwJNwkvKiBHU00gMDQuMDggLSAxMC41LjEuMiAqLwogCiAKIHN0cnVjdCBnc21fbGNoYW47CiBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXI7CiBzdHJ1Y3QgZ3NtX21uY2M7CiBzdHJ1Y3QgcnRwX3NvY2tldDsKK3N0cnVjdCBic2NfYXBpOwogCiAvKiBOZXR3b3JrIE1hbmFnZW1lbnQgU3RhdGUgKi8KIHN0cnVjdCBnc21fbm1fc3RhdGUgewpAQCAtMTQ5LDYgKzE4NiwxNiBAQAogICAgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB1cGRhdGluZ190aW1lcjsKIAl1bnNpZ25lZCBpbnQgd2FpdGluZ19mb3JfaW1zaSA6IDE7CiAJdW5zaWduZWQgaW50IHdhaXRpbmdfZm9yX2ltZWkgOiAxOworCXVuc2lnbmVkIGludCBrZXlfc2VxIDogNDsKK307CisKKy8qCisgKiBBVVRIRU5USUNBVElPTi9DSVBIRVJJTkcgc3RhdGUKKyAqLworc3RydWN0IGdzbV9zZWN1cml0eV9vcGVyYXRpb24geworCXN0cnVjdCBnc21fYXV0aF90dXBsZSBhdHVwbGU7CisJZ3NtX2NiZm4gKmNiOworCXZvaWQgKmNiX2RhdGE7CiB9OwogCiAvKiBNYXhpbXVtIG51bWJlciBvZiBuZWlnaGJvciBjZWxscyB3aG9zZSBhdmVyYWdlIHdlIHRyYWNrICovCkBAIC0xNjYsNiArMjEzLDkgQEAKIH07CiAKICNkZWZpbmUgTUFYX0E1X0tFWV9MRU4JKDEyOC84KQorI2RlZmluZSBBMzhfWE9SX01JTl9LRVlfTEVOCTEyCisjZGVmaW5lIEEzOF9YT1JfTUFYX0tFWV9MRU4JMTYKKyNkZWZpbmUgQTM4X0NPTVAxMjhfS0VZX0xFTgkxNgogI2RlZmluZSBSU0xfRU5DX0FMR19BNSh4KQkoeCsxKQogCiAvKiBpcyB0aGUgZGF0YSBsaW5rIGVzdGFibGlzaGVkPyB3aG8gZXN0YWJsaXNoZWQgaXQ/ICovCkBAIC0xNzksOSArMjI5LDM1IEBACiAJTENIQU5fU19BQ1RfUkVRLAkvKiBjaGFubmVsIGFjdGl2YXRpbiByZXF1ZXN0ZWQgKi8KIAlMQ0hBTl9TX0FDVElWRSwJCS8qIGNoYW5uZWwgaXMgYWN0aXZlIGFuZCBvcGVyYXRpb25hbCAqLwogCUxDSEFOX1NfUkVMX1JFUSwJLyogY2hhbm5lbCByZWxlYXNlIGhhcyBiZWVuIHJlcXVlc3RlZCAqLworCUxDSEFOX1NfUkVMX0VSUiwJLyogY2hhbm5lbCBpcyBpbiBhbiBlcnJvciBzdGF0ZSAqLwogCUxDSEFOX1NfSU5BQ1RJVkUsCS8qIGNoYW5uZWwgaXMgc2V0IGluYWN0aXZlICovCiB9OwogCisvKiB0aGUgcGVyIHN1YnNjcmliZXIgZGF0YSBmb3IgbGNoYW4gKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uIHsKKwkvKiBUbyB3aG9tIHdlIGFyZSBhbGxvY2F0ZWQgYXQgdGhlIG1vbWVudCAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogVGltZXIgc3RhcnRlZCB0byByZWxlYXNlIHRoZSBjaGFubmVsICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmVsZWFzZV90aW1lcjsKKworCS8qCisJICogT3BlcmF0aW9ucyB0aGF0IGhhdmUgYSBzdGF0ZSBhbmQgbWlnaHQgYmUgcGVuZGluZworCSAqLworCXN0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbiAqbG9jX29wZXJhdGlvbjsKKwlzdHJ1Y3QgZ3NtX3NlY3VyaXR5X29wZXJhdGlvbiAqc2VjX29wZXJhdGlvbjsKKworCS8qIHVzZSBjb3VudC4gaG93IG1hbnkgdXNlcnMgdXNlIHRoaXMgY2hhbm5lbCAqLworCXVuc2lnbmVkIGludCB1c2VfY291bnQ7CisKKwkvKiBBcmUgd2UgcGFydCBvZiBhIHNwZWNpYWwgInNpbGVudCIgY2FsbCAqLworCWludCBzaWxlbnRfY2FsbDsKKworCS8qIGJhY2sgcG9pbnRlcnMgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworfTsKKwogc3RydWN0IGdzbV9sY2hhbiB7CiAJLyogVGhlIFRTIHRoYXQgd2UncmUgcGFydCBvZiAqLwogCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CkBAIC0yMDQsMzEgKzI4MCwxNyBAQAogCQl1X2ludDhfdCBrZXlfbGVuOwogCQl1X2ludDhfdCBrZXlbTUFYX0E1X0tFWV9MRU5dOwogCX0gZW5jcjsKLQkvKiBBcmUgd2UgcGFydCBvZiBhIHNwZWNpYWwgInNpbGVudCIgY2FsbCAqLwotCWludCBzaWxlbnRfY2FsbDsKKworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTAxOworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTExOworCXN0cnVjdCB0aW1lcl9saXN0IGVycm9yX3RpbWVyOwogCiAJLyogQU1SIGJpdHMgKi8KIAlzdHJ1Y3QgZ3NtNDhfbXVsdGlfcmF0ZV9jb25mIG1yX2NvbmY7CiAJCi0JLyogVG8gd2hvbSB3ZSBhcmUgYWxsb2NhdGVkIGF0IHRoZSBtb21lbnQgKi8KLQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKLQotCS8qIFRpbWVyIHN0YXJ0ZWQgdG8gcmVsZWFzZSB0aGUgY2hhbm5lbCAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHJlbGVhc2VfdGltZXI7Ci0KLQlzdHJ1Y3QgdGltZXJfbGlzdCBUMzEwMTsKLQogCS8qIEVzdGFibGlzaGVkIGRhdGEgbGluayBsYXllciBzZXJ2aWNlcyAqLwogCXVfaW50OF90IHNhcGlzWzhdOwogCi0JLyoKLQkgKiBPcGVyYXRpb25zIHRoYXQgaGF2ZSBhIHN0YXRlIGFuZCBtaWdodCBiZSBwZW5kaW5nCi0JICovCi0Jc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uICpsb2Nfb3BlcmF0aW9uOwotCi0JLyogdXNlIGNvdW50LiBob3cgbWFueSB1c2VycyB1c2UgdGhpcyBjaGFubmVsICovCi0JdW5zaWduZWQgaW50IHVzZV9jb3VudDsKLQogCS8qIGNhY2hlIG9mIGxhc3QgbWVhc3VyZW1lbnQgcmVwb3J0cyBvbiB0aGlzIGxjaGFuICovCiAJc3RydWN0IGdzbV9tZWFzX3JlcCBtZWFzX3JlcFs2XTsKIAlpbnQgbWVhc19yZXBfaWR4OwpAQCAtMjQyLDEwICszMDQsMTMgQEAKIAkJdV9pbnQxNl90IGJvdW5kX3BvcnQ7CiAJCXVfaW50MTZfdCBjb25uZWN0X3BvcnQ7CiAJCXVfaW50MTZfdCBjb25uX2lkOworCQl1X2ludDhfdCBydHBfcGF5bG9hZDsKIAkJdV9pbnQ4X3QgcnRwX3BheWxvYWQyOwogCQl1X2ludDhfdCBzcGVlY2hfbW9kZTsKIAkJc3RydWN0IHJ0cF9zb2NrZXQgKnJ0cF9zb2NrZXQ7CiAJfSBhYmlzX2lwOworCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gY29ubjsKIH07CiAKIHN0cnVjdCBnc21fZTFfc3Vic2xvdCB7CkBAIC0yNTcsNyArMzIyLDcgQEAKIAl1X2ludDhfdAllMV90c19zczsKIH07CiAKLSNkZWZpbmUgQlRTX1RSWF9GX0FDVElWQVRFRAkweDAwMDEKKyNkZWZpbmUgVFNfRl9QRENIX01PREUJMHgxMDAwCiAvKiBPbmUgVGltZXNsb3QgaW4gYSBUUlggKi8KIHN0cnVjdCBnc21fYnRzX3RyeF90cyB7CiAJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CkBAIC0yODUsNiArMzUwLDggQEAKIAlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOwogCS8qIG51bWJlciBvZiB0aGlzIFRSWCBpbiB0aGUgQlRTICovCiAJdV9pbnQ4X3QgbnI7CisJLyogaHVtYW4gcmVhZGFibGUgbmFtZSAvIGRlc2NyaXB0aW9uICovCisJY2hhciAqZGVzY3JpcHRpb247CiAJLyogaG93IGRvIHdlIHRhbGsgUlNMIHdpdGggdGhpcyBUUlg/ICovCiAJc3RydWN0IGdzbV9lMV9zdWJzbG90IHJzbF9lMV9saW5rOwogCXVfaW50OF90IHJzbF90ZWk7CkBAIC0zNTgsNyArNDI1LDYgQEAKIHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSB7CiAJLyogcGVuZGluZyByZXF1ZXN0cyAqLwogCXN0cnVjdCBsbGlzdF9oZWFkIHBlbmRpbmdfcmVxdWVzdHM7Ci0Jc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqbGFzdF9yZXF1ZXN0OwogCXN0cnVjdCBnc21fYnRzICpidHM7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCB3b3JrX3RpbWVyOwpAQCAtMzczLDExICs0MzksMTQgQEAKIAogc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjIHsKIAlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCS8qIGRhdGEgcmVhZCB2aWEgVlRZIGNvbmZpZyBmaWxlLCB0byBjb25maWd1cmUgdGhlIEJUUworCSAqIHZpYSBPTUwgZnJvbSBCU0MgKi8KIAlpbnQgaWQ7CiAJdV9pbnQxNl90IG5zdmNpOwotCXVfaW50MTZfdCBsb2NhbF9wb3J0OwotCXVfaW50MTZfdCByZW1vdGVfcG9ydDsKLQl1X2ludDMyX3QgcmVtb3RlX2lwOworCXVfaW50MTZfdCBsb2NhbF9wb3J0OwkvKiBvbiB0aGUgQlRTICovCisJdV9pbnQxNl90IHJlbW90ZV9wb3J0OwkvKiBvbiB0aGUgU0dTTiAqLworCXVfaW50MzJfdCByZW1vdGVfaXA7CS8qIG9uIHRoZSBTR1NOICovCisKIAlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOwogfTsKIApAQCAtMzg5LDYgKzQ1OCw4IEBACiAJc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrOwogCS8qIG51bWJlciBvZiB0aHMgQlRTIGluIG5ldHdvcmsgKi8KIAl1X2ludDhfdCBucjsKKwkvKiBodW1hbiByZWFkYWJsZSBuYW1lIC8gZGVzY3JpcHRpb24gKi8KKwljaGFyICpkZXNjcmlwdGlvbjsKIAkvKiBDZWxsIElkZW50aXR5ICovCiAJdV9pbnQxNl90IGNlbGxfaWRlbnRpdHk7CiAJLyogbG9jYXRpb24gYXJlYSBjb2RlIG9mIHRoaXMgQlRTICovCkBAIC00NjYsMTggKzUzNywyNCBAQAogCiAJLyogTm90IGVudGlyZWx5IHN1cmUgaG93IGlwLmFjY2VzcyBzcGVjaWZpYyB0aGlzIGlzICovCiAJc3RydWN0IHsKLQkJaW50IGVuYWJsZWQ7CisJCWVudW0gYnRzX2dwcnNfbW9kZSBtb2RlOwogCQlzdHJ1Y3QgewogCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKIAkJCXVfaW50MTZfdCBuc2VpOworCQkJdWludDhfdCB0aW1lcls3XTsKIAkJfSBuc2U7CiAJCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOwogCQkJdV9pbnQxNl90IGJ2Y2k7CisJCQl1aW50OF90IHRpbWVyWzExXTsKIAkJfSBjZWxsOwogCQlzdHJ1Y3QgZ3NtX2J0c19ncHJzX25zdmMgbnN2Y1syXTsKIAkJdV9pbnQ4X3QgcmFjOwogCX0gZ3ByczsKKworCS8qIFJBQ0ggTk0gdmFsdWVzICovCisJaW50IHJhY2hfYl90aHJlc2g7CisJaW50IHJhY2hfbGRhdmdfc2xvdHM7CiAJCiAJLyogdHJhbnNjZWl2ZXJzICovCiAJaW50IG51bV90cng7CkBAIC01MjUsNiArNjAyLDE0IEBACiAJCXN0cnVjdCBjb3VudGVyICphbGVydGVkOwkvKiB3ZSBhbGVydGVkIHRoZSBvdGhlciBlbmQgKi8KIAkJc3RydWN0IGNvdW50ZXIgKmNvbm5lY3RlZDsvKiBob3cgbWFueSBjYWxscyB3ZXJlIGFjY2VwdGVkICovCiAJfSBjYWxsOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpyZl9mYWlsOworCQlzdHJ1Y3QgY291bnRlciAqcmxsX2VycjsKKwl9IGNoYW47CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKm9tbF9mYWlsOworCQlzdHJ1Y3QgY291bnRlciAqcnNsX2ZhaWw7CisJfSBidHM7CiB9OwogCiBlbnVtIGdzbV9hdXRoX3BvbGljeSB7CkBAIC01NzAsNiArNjU1LDcgQEAKIAlpbnQgKCptbmNjX3JlY3YpIChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpOwogCXN0cnVjdCBsbGlzdF9oZWFkIHVwcXVldWU7CiAJc3RydWN0IGxsaXN0X2hlYWQgdHJhbnNfbGlzdDsKKwlzdHJ1Y3QgYnNjX2FwaSAqYnNjX2FwaTsKIAogCXVuc2lnbmVkIGludCBudW1fYnRzOwogCXN0cnVjdCBsbGlzdF9oZWFkIGJ0c19saXN0OwpAQCAtNjg3LDE1ICs3NzMsMTAgQEAKIGVudW0gcnJscF9tb2RlIHJybHBfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpOwogY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWUoZW51bSBycmxwX21vZGUgbW9kZSk7CiAKLXZvaWQgZ3NtX3RyeF9sb2NrX3JmKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCBpbnQgbG9ja2VkKTsKK2VudW0gYnRzX2dwcnNfbW9kZSBidHNfZ3Byc19tb2RlX3BhcnNlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpidHNfZ3Byc19tb2RlX25hbWUoZW51bSBidHNfZ3Byc19tb2RlIG1vZGUpOwogCi0vKiBBIHBhcnNlZCBHUFJTIHJvdXRpbmcgYXJlYSAqLwotc3RydWN0IGdwcnNfcmFfaWQgewotCXVfaW50MTZfdAltbmM7Ci0JdV9pbnQxNl90CW1jYzsKLQl1X2ludDE2X3QJbGFjOwotCXVfaW50OF90CXJhYzsKLX07Cit2b2lkIGdzbV90cnhfbG9ja19yZihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgaW50IGxvY2tlZCk7CiAKIGludCBnc200OF9yYV9pZF9ieV9idHModV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CiB2b2lkIGdwcnNfcmFfaWRfYnlfYnRzKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2lwYWNjZXNzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oCmluZGV4IDg2MjQ4YWEuLmY4ZGRmZDQgMTAwNjQ0Ci0tLSBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2lwYWNjZXNzLmgKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApAQCAtNTMsNiArNTMsOCBAQAogCiBpbnQgaXBhY2Nlc3NfaWR0YWdfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKmRlYywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKTsKIAoraW50IGlwYWNjZXNzX2Ryb3Bfb21sKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGlwYWNjZXNzX2Ryb3BfcnNsKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKIAogLyoKICAqIEZpcm13YXJlIHNwZWNpZmljIGhlYWRlcgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oCmluZGV4IGY3ZTgwMGIuLjcxYjdmYzEgMTAwNjQ0Ci0tLSBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwLmgKQEAgLTc3LDYgKzc3LDcgQEAKIAogdHlwZWRlZiBpbnQgKCptZ2NwX2NoYW5nZSkoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGludCBlbmRwb2ludCwgaW50IHN0YXRlLCBpbnQgbG9jYWxfcnRwKTsKIHR5cGVkZWYgaW50ICgqbWdjcF9wb2xpY3kpKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBpbnQgZW5kcG9pbnQsIGludCBzdGF0ZSwgY29uc3QgY2hhciAqdHJhbnNhY3Rpb19pZCk7Cit0eXBlZGVmIGludCAoKm1nY3BfcmVzZXQpKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKTsKIAogc3RydWN0IG1nY3BfY29uZmlnIHsKIAlpbnQgc291cmNlX3BvcnQ7CkBAIC04NCw2ICs4NSw3IEBACiAJY2hhciAqc291cmNlX2FkZHI7CiAJdW5zaWduZWQgaW50IG51bWJlcl9lbmRwb2ludHM7CiAJY2hhciAqYnRzX2lwOworCWNoYXIgKmNhbGxfYWdlbnRfYWRkcjsKIAogCXN0cnVjdCBpbl9hZGRyIGJ0c19pbjsKIAljaGFyICphdWRpb19uYW1lOwpAQCAtOTUsOCArOTcsMTIgQEAKIAljaGFyICpmb3J3YXJkX2lwOwogCWludCBmb3J3YXJkX3BvcnQ7CiAKKwkvKiBzcGVjIGhhbmRsaW5nICovCisJaW50IGZvcmNlX3JlYWxsb2M7CisKIAltZ2NwX2NoYW5nZSBjaGFuZ2VfY2I7CiAJbWdjcF9wb2xpY3kgcG9saWN5X2NiOworCW1nY3BfcmVzZXQgcmVzZXRfY2I7CiAJdm9pZCAqZGF0YTsKIAogCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwb2ludHM7CkBAIC0xMTUsOCArMTIxLDE1IEBACiAgKiBmb3JtYXQgaGVscGVyIGZ1bmN0aW9ucwogICovCiBzdHJ1Y3QgbXNnYiAqbWdjcF9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7Ci1zdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcnNpcCh2b2lkKTsKIHN0cnVjdCBtc2diICptZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnMsIGNvbnN0IGNoYXIgKmRhdGEpOwogCisvKiBhZGMgaGVscGVyICovCitzdGF0aWMgaW5saW5lIGludCBtZ2NwX3RpbWVzbG90X3RvX2VuZHBvaW50KGludCBtdWx0aXBsZXgsIGludCB0aW1lc2xvdCkKK3sKKwlpZiAodGltZXNsb3QgPT0gMCkKKwkJdGltZXNsb3QgPSAxOworCXJldHVybiB0aW1lc2xvdCArICgzMSAqIG11bHRpcGxleCk7Cit9CisKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmgKaW5kZXggMTBkMGNhNi4uZDVhZWMzMCAxMDA2NDQKLS0tIGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3BfaW50ZXJuYWwuaApAQCAtNTcsOCArNTcsMjIgQEAKIAogCS8qIGJhY2twb2ludGVyICovCiAJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7CisKKwkvKiBzdGF0aXN0aWNzICovCisJdW5zaWduZWQgaW50IGluX2J0czsKKwl1bnNpZ25lZCBpbnQgaW5fcmVtb3RlOwogfTsKIAogI2RlZmluZSBFTkRQT0lOVF9OVU1CRVIoZW5kcCkgYWJzKGVuZHAgLSBlbmRwLT5jZmctPmVuZHBvaW50cykKIAorc3RydWN0IG1nY3BfbXNnX3B0ciB7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBsZW5ndGg7Cit9OworCitpbnQgbWdjcF9hbmFseXplX2hlYWRlcihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZywKKwkJCXN0cnVjdCBtZ2NwX21zZ19wdHIgKnB0ciwgaW50IHNpemUsCisJCQljb25zdCBjaGFyICoqdHJhbnNhY3Rpb25faWQsIHN0cnVjdCBtZ2NwX2VuZHBvaW50ICoqZW5kcCk7CitpbnQgbWdjcF9zZW5kX2R1bW15KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9vc21vX21zYy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3Ntb19tc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQ4OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3Ntb19tc2MuaApAQCAtMCwwICsxLDEwIEBACisvKiBSb3V0aW5lcyBmb3IgdGhlIE1TQyBoYW5kbGluZyAqLworCisjaWZuZGVmIE9TTU9fTVNDX0gKKyNkZWZpbmUgT1NNT19NU0NfSAorCisjaW5jbHVkZSAiYnNjX2FwaS5oIgorCitzdHJ1Y3QgYnNjX2FwaSAqbXNjX2JzY19hcGkoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaAppbmRleCA0ZTcyYzBmLi42ZDkwMTE5IDEwMDY0NAotLS0gYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Jlc3Rfb2N0ZXRzLmgKQEAgLTcxLDYgKzcxLDcgQEAKIAlHUFJTX05NT19JSUkJPSAyLAkvKiBubyBwYWdpbmcgY29vcmRpbmF0aW9uICovCiB9OwogCisvKiBUUyAwNC42MCAxMi4yNCAqLwogc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zIHsKIAllbnVtIGdwcnNfbm1vIG5tbzsKIAkvKiBUMzE2ODogd2FpdCBmb3IgcGFja2V0IHVwbGluayBhc3NpZ25tZW50IG1lc3NhZ2UgKi8KQEAgLTc5LDYgKzgwLDE2IEBACiAJdV9pbnQzMl90IHQzMTkyOwkvKiBpbiBtaWxsaXNlY29uZHMgKi8KIAl1X2ludDMyX3QgZHJ4X3RpbWVyX21heDsvKiBpbiBzZWNvbmRzICovCiAJdV9pbnQzMl90IGJzX2N2X21heDsKKworCXVfaW50OF90IGV4dF9pbmZvX3ByZXNlbnQ7CisJc3RydWN0IHsKKwkJdV9pbnQ4X3QgZWdwcnNfc3VwcG9ydGVkOworCQkJdV9pbnQ4X3QgdXNlX2VncHJzX3BfY2hfcmVxOworCQkJdV9pbnQ4X3QgYmVwX3BlcmlvZDsKKwkJdV9pbnQ4X3QgcGZjX3N1cHBvcnRlZDsKKwkJdV9pbnQ4X3QgZHRtX3N1cHBvcnRlZDsKKwkJdV9pbnQ4X3QgYnNzX3BhZ2luZ19jb29yZGluYXRpb247CisJfSBleHRfaW5mbzsKIH07CiAKIC8qIFRTIDA0LjYwIFRhYmxlIDEyLjkuMiAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnRwX3Byb3h5LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaAppbmRleCBmODI3MTFhLi42NWIxYTVmIDEwMDY0NAotLS0gYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaApAQCAtMjgsNiArMjgsMTIgQEAKICNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KICNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KIAorI2RlZmluZSBSVFBfUFRfR1NNX0ZVTEwgMworI2RlZmluZSBSVFBfUFRfR1NNX0hBTEYgOTYKKyNkZWZpbmUgUlRQX1BUX0dTTV9FRlIgOTcKKyNkZWZpbmUgUlRQX1BUX0FNUl9GVUxMIDk4CisjZGVmaW5lIFJUUF9QVF9BTVJfSEFMRiA5OQorCiBlbnVtIHJ0cF9yeF9hY3Rpb24gewogCVJUUF9OT05FLAogCVJUUF9QUk9YWSwKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Nnc24uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Nnc24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2NmZGVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2dzbi5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX1NHU05fSAorI2RlZmluZSBfU0dTTl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19zZ3NuLmg+CisKK3N0cnVjdCBzZ3NuX2NvbmZpZyB7CisJLyogcGFyc2VkIGZyb20gY29uZmlnIGZpbGUgKi8KKworCWNoYXIgKmd0cF9zdGF0ZWRpcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gZ3RwX2xpc3RlbmFkZHI7CisKKwkvKiBtaXNjICovCisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpOworfTsKKworc3RydWN0IHNnc25faW5zdGFuY2UgeworCWNoYXIgKmNvbmZpZ19maWxlOworCXN0cnVjdCBzZ3NuX2NvbmZpZyBjZmc7CisJLyogRmlsZSBkZXNjcmlwdG9yIHdyYXBwZXJzIGZvciBMaWJHVFAgKi8KKwlzdHJ1Y3QgYnNjX2ZkIGd0cF9mZDA7CisJc3RydWN0IGJzY19mZCBndHBfZmQxYzsKKwlzdHJ1Y3QgYnNjX2ZkIGd0cF9mZDF1OworCS8qIFRpbWVyIGZvciBsaWJHVFAgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBndHBfdGltZXI7CisJLyogR1NOIGluc3RhbmNlIGZvciBsaWJndHAgKi8KKwlzdHJ1Y3QgZ3NuX3QgKmdzbjsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc2dzbl9pbnN0YW5jZSAqc2dzbjsKKworLyogc2dzbl92dHkuYyAqLworCitpbnQgc2dzbl92dHlfaW5pdCh2b2lkKTsKK2ludCBzZ3NuX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfZmlsZSwgc3RydWN0IHNnc25fY29uZmlnICpjZmcpOworCisvKiBzZ3NuLmMgKi8KKworLyogTWFpbiBpbnB1dCBmdW5jdGlvbiBmb3IgR2IgcHJveHkgKi8KK2ludCBzZ3NuX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50MTZfdCBuc19idmNpKTsKKworCitzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpzZ3NuX2NyZWF0ZV9wZHBfY3R4KHN0cnVjdCBzZ3NuX2dnc25fY3R4ICpnZ3NuLAorCQkJCQkgc3RydWN0IHNnc25fbW1fY3R4ICptbWN0eCwKKwkJCQkJIHVpbnQxNl90IG5zYXBpLAorCQkJCQkgc3RydWN0IHRsdl9wYXJzZWQgKnRwKTsKK2ludCBzZ3NuX2RlbGV0ZV9wZHBfY3R4KHN0cnVjdCBzZ3NuX3BkcF9jdHggKnBjdHgpOworCisvKiBncHJzX3NuZGNwLmMgKi8KKworLyogRW50cnkgcG9pbnQgZm9yIHRoZSBTTlNNLUFDVElWQVRFLmluZGljYXRpb24gKi8KK2ludCBzbmRjcF9zbV9hY3RpdmF0ZV9pbmQoc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlLCB1aW50OF90IG5zYXBpKTsKKy8qIEVudHJ5IHBvaW50IGZvciB0aGUgU05TTS1ERUFDVElWQVRFLmluZGljYXRpb24gKi8KK2ludCBzbmRjcF9zbV9kZWFjdGl2YXRlX2luZChzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGUsIHVpbnQ4X3QgbnNhcGkpOworLyogQ2FsbGVkIGJ5IFNORENQIHdoZW4gaXQgaGFzIHJlY2VpdmVkL3JlLWFzc2VtYmxlZCBhIE4tUERVICovCitpbnQgc2dzbl9yeF9zbmRjcF91ZF9pbmQodWludDMyX3QgdGxsaSwgdWludDhfdCBuc2FwaSwgc3RydWN0IG1zZ2IgKm1zZywKKwkJCSB1aW50MzJfdCBucGR1X2xlbiwgdWludDhfdCAqbnBkdSk7CitpbnQgc25kY3BfdW5pdGRhdGFfcmVxKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSwgdWludDhfdCBuc2FwaSwKKwkJCXZvaWQgKm1tY29udGV4dCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lnbmFsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaAppbmRleCAwYzIyODY5Li40OGY3OTQ2IDEwMDY0NAotLS0gYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaApAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAKICNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+Ci0jaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgogCiAjaW5jbHVkZSA8b3Ntb2NvcmUvc2lnbmFsLmg+CiAKQEAgLTQyLDYgKzQxLDggQEAKIAlTU19TVUJTQ1IsCiAJU1NfU0NBTEwsCiAJU1NfR0xPQkFMLAorCVNTX0NIQUxMT0MsCisJU1NfTlMsCiB9OwogCiAvKiBTU19QQUdJTkcgc2lnbmFscyAqLwpAQCAtOTMsNiArOTQsMTIgQEAKIAlTX0xDSEFOX01FQVNfUkVQLAkJLyogMDguNTggTWVhc3VyZW1lbnQgUmVwb3J0ICovCiB9OwogCisvKiBTU19DSEFMTE9DIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX2NoYWxsb2MgeworCVNfQ0hBTExPQ19BTExPQ19GQUlMLAkvKiBhbGxvY2F0aW9uIG9mIGxjaGFuIGhhcyBmYWlsZWQgKi8KKwlTX0NIQUxMT0NfRlJFRUQsCS8qIGxjaGFuIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmcmVlZCAqLworfTsKKwogLyogU1NfU1VCU0NSIHNpZ25hbHMgKi8KIGVudW0gc2lnbmFsX3N1YnNjciB7CiAJU19TVUJTQ1JfQVRUQUNIRUQsCkBAIC0xMTEsNiArMTE4LDggQEAKIAlTX0dMT0JBTF9TSFVURE9XTiwKIH07CiAKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKKwogc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSB7CiAJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CiAJc3RydWN0IGdzbV9idHMgKmJ0czsKQEAgLTEyNiw4ICsxMzUsMjYgQEAKIH07CiAKIHN0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgewotCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CiAJdV9pbnQ4X3QgbXNnX3R5cGU7CQogfTsKIAorc3RydWN0IGNoYWxsb2Nfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJZW51bSBnc21fY2hhbl90IHR5cGU7Cit9OworCitlbnVtIHNpZ25hbF9ucyB7CisJU19OU19SRVNFVCwKKwlTX05TX0JMT0NLLAorCVNfTlNfVU5CTE9DSywKKwlTX05TX0FMSVZFX0VYUCwJLyogVG5zLWFsaXZlIGV4cGlyZWQgbW9yZSB0aGFuIE4gdGltZXMgKi8KK307CisKK3N0cnVjdCBuc19zaWduYWxfZGF0YSB7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKwl1aW50OF90IGNhdXNlOworfTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zb2NrZXQuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzE2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zb2NrZXQuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9CU0NfU09DS0VUX0gKKyNkZWZpbmUgX0JTQ19TT0NLRVRfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisKKyNpZm5kZWYgSVBQUk9UT19HUkUKKyNkZWZpbmUgSVBQUk9UT19HUkUgNDcKKyNlbmRpZgorCitpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50IHByb3RvLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LAorCSAgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpKTsKKworI2VuZGlmIC8qIF9CU0NfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlNzk0Yi4uMDAwMDAwMAotLS0gYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBtaW5pbWFsaXN0aWMgdGVsbmV0L25ldHdvcmsgaW50ZXJmYWNlIGl0IG1pZ2h0IHR1cm4gaW50byBhIHdpcmUgaW50ZXJmYWNlICovCi0vKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+Ci0gKiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKi8KLQotI2lmbmRlZiBURUxORVRfSU5URVJGQUNFX0gKLSNkZWZpbmUgVEVMTkVUX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlICJnc21fZGF0YS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+Ci0KLSNpbmNsdWRlIDx2dHkvdnR5Lmg+Ci0KLXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiB7Ci0Jc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7Ci0Jc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrOwotCXN0cnVjdCBic2NfZmQgZmQ7Ci0Jc3RydWN0IHZ0eSAqdnR5OwotCXN0cnVjdCBkZWJ1Z190YXJnZXQgKmRiZzsKLX07Ci0KLQotdm9pZCB0ZWxuZXRfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIGludCBwb3J0KTsKLQotaW50IGJzY192dHlfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmgKaW5kZXggNTBjM2NjNS4uOTBhMDA4YiAxMDA2NDQKLS0tIGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmFuc2FjdGlvbi5oCkBAIC0yMCw4ICsyMCw4IEBACiAJLyogVG8gd2hvbSB3ZSBiZWxvbmcsIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHJlbW90ZSBNTSBlbnRpdHkgKi8KIAlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKIAotCS8qIFRoZSBMQ0hBTiB0aGF0IHdlJ3JlIGN1cnJlbnRseSB1c2luZyB0byB0cmFuc21pdCBtZXNzYWdlcyAqLwotCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCS8qIFRoZSBhc3NvY2lhdGVkIGNvbm5lY3Rpb24gd2UgYXJlIHVzaW5nIHRvIHRyYW5zbWl0IG1lc3NhZ2VzICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CiAKIAkvKiByZWZlcmVuY2UgZnJvbSBNTkNDIG9yIG90aGVyIGFwcGxpY2F0aW9uICovCiAJdV9pbnQzMl90IGNhbGxyZWY7CkBAIC03MSw2ICs3MSw2IEBACiAKIC8qIHVwZGF0ZSBhbGwgdHJhbnNhY3Rpb25zIHRvIHVzZSBhIGRpZmZlcmVudCBMQ0hBTiwgZS5nLgogICogYWZ0ZXIgaGFuZG92ZXIgaGFzIHN1Y2NlZWRlZCAqLwotaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9vbGQsCi0JCSAgICAgICBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9uZXcpOworaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9vbGQsCisJCSAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9uZXcpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy92dHkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Z0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjFlODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy92dHkuaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIE9QRU5CU0NfVlRZX0gKKyNkZWZpbmUgT1BFTkJTQ19WVFlfSAorCisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdnR5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvY29tbWFuZC5oPgorCitzdHJ1Y3QgZ3NtX25ldHdvcms7CitzdHJ1Y3QgdnR5OworCit2b2lkIGxvZ2dpbmdfdnR5X2FkZF9jbWRzKHZvaWQpOwordm9pZCBvcGVuYnNjX3Z0eV9wcmludF9zdGF0aXN0aWNzKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9uZXR3b3JrICopOworCitzdHJ1Y3QgYnVmZmVyICp2dHlfYXJndl90b19idWZmZXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSwgaW50IGJhc2UpOworCitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNmZ19kZXNjcmlwdGlvbl9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNmZ19ub19kZXNjcmlwdGlvbl9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IG91cm5vZGVfZXhpdF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IG91cm5vZGVfZW5kX2NtZDsKKworZW51bSBic2NfdnR5X25vZGUgeworCUdTTU5FVF9OT0RFID0gX0xBU1RfT1NNT1ZUWV9OT0RFICsgMSwKKwlCVFNfTk9ERSwKKwlUUlhfTk9ERSwKKwlUU19OT0RFLAorCVNVQlNDUl9OT0RFLAorCU1HQ1BfTk9ERSwKKwlHQlBST1hZX05PREUsCisJU0dTTl9OT0RFLAorCU5TX05PREUsCisJQlNTR1BfTk9ERSwKKwlPTUxfTk9ERSwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NzQ3NjYuLjAwMDAwMDAKLS0tIGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW5vaW5zdF9IRUFERVJTID0gYnVmZmVyLmggY29tbWFuZC5oICB2ZWN0b3IuaCB2dHkuaApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvYnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTE5NDAuLjAwMDAwMDAKLS0tIGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQnVmZmVyaW5nIHRvIG91dHB1dCBhbmQgaW5wdXQuCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggS3VuaWhpcm8gSXNoaWd1cm8KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCi0gKgotICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9aRUJSQV9CVUZGRVJfSAotI2RlZmluZSBfWkVCUkFfQlVGRkVSX0gKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0vKiBDcmVhdGUgYSBuZXcgYnVmZmVyLiAgTWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkIGluIGNodW5rcyBvZiB0aGUgZ2l2ZW4KLSAgIHNpemUuICBJZiB0aGUgYXJndW1lbnQgaXMgMCwgdGhlIGxpYnJhcnkgd2lsbCBzdXBwbHkgYSByZWFzb25hYmxlCi0gICBkZWZhdWx0IHNpemUgc3VpdGFibGUgZm9yIGJ1ZmZlcmluZyBzb2NrZXQgSS9PLiAqLwotc3RydWN0IGJ1ZmZlciAqYnVmZmVyX25ldyhzaXplX3QpOwotCi0vKiBGcmVlIGFsbCBkYXRhIGluIHRoZSBidWZmZXIuICovCi12b2lkIGJ1ZmZlcl9yZXNldChzdHJ1Y3QgYnVmZmVyICopOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNhbGxzIGJ1ZmZlcl9yZXNldCB0byByZWxlYXNlIGFsbCBidWZmZXJlZCBkYXRhLgotICAgVGhlbiBpdCBmcmVlcyB0aGUgc3RydWN0IGJ1ZmZlciBpdHNlbGYuICovCi12b2lkIGJ1ZmZlcl9mcmVlKHN0cnVjdCBidWZmZXIgKik7Ci0KLS8qIEFkZCB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCi1leHRlcm4gdm9pZCBidWZmZXJfcHV0KHN0cnVjdCBidWZmZXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwotLyogQWRkIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCi1leHRlcm4gdm9pZCBidWZmZXJfcHV0YyhzdHJ1Y3QgYnVmZmVyICosIHVfY2hhcik7Ci0vKiBBZGQgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLwotZXh0ZXJuIHZvaWQgYnVmZmVyX3B1dHN0cihzdHJ1Y3QgYnVmZmVyICosIGNvbnN0IGNoYXIgKik7Ci0KLS8qIENvbWJpbmUgYWxsIGFjY3VtdWxhdGVkIChhbmQgdW5mbHVzaGVkKSBkYXRhIGluc2lkZSB0aGUgYnVmZmVyIGludG8gYQotICAgc2luZ2xlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBhbGxvY2F0ZWQgdXNpbmcgWE1BTExPQyhNVFlQRV9UTVApLiAgTm90ZQotICAgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsdGVyIHRoZSBzdGF0ZSBvZiB0aGUgYnVmZmVyLCBzbyB0aGUgZGF0YQotICAgaXMgc3RpbGwgaW5zaWRlIHdhaXRpbmcgdG8gYmUgZmx1c2hlZC4gKi8KLWNoYXIgKmJ1ZmZlcl9nZXRzdHIoc3RydWN0IGJ1ZmZlciAqKTsKLQotLyogUmV0dXJucyAxIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgZGF0YSBpbiB0aGUgYnVmZmVyLiAgT3RoZXJ3aXNlIHJldHVybnMgMC4gKi8KLWludCBidWZmZXJfZW1wdHkoc3RydWN0IGJ1ZmZlciAqKTsKLQotdHlwZWRlZiBlbnVtIHsKLQkvKiBBbiBJL08gZXJyb3Igb2NjdXJyZWQuICBUaGUgYnVmZmVyIHNob3VsZCBiZSBkZXN0cm95ZWQgYW5kIHRoZQotCSAgIGZpbGUgZGVzY3JpcHRvciBzaG91bGQgYmUgY2xvc2VkLiAqLwotCUJVRkZFUl9FUlJPUiA9IC0xLAotCi0JLyogVGhlIGRhdGEgd2FzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LCBhbmQgdGhlIGJ1ZmZlciBpcyBub3cgZW1wdHkKLQkgICAodGhlcmUgaXMgbm8gcGVuZGluZyBkYXRhIHdhaXRpbmcgdG8gYmUgZmx1c2hlZCkuICovCi0JQlVGRkVSX0VNUFRZID0gMCwKLQotCS8qIFRoZXJlIGlzIHBlbmRpbmcgZGF0YSBpbiB0aGUgYnVmZmVyIHdhaXRpbmcgdG8gYmUgZmx1c2hlZC4gIFBsZWFzZQotCSAgIHRyeSBmbHVzaGluZyB0aGUgYnVmZmVyIHdoZW4gc2VsZWN0IGluZGljYXRlcyB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IKLQkgICBpcyB3cml0ZWFibGUuICovCi0JQlVGRkVSX1BFTkRJTkcgPSAxCi19IGJ1ZmZlcl9zdGF0dXNfdDsKLQotLyogVHJ5IHRvIHdyaXRlIHRoaXMgZGF0YSB0byB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgQW55IGRhdGEgdGhhdCBjYW5ub3QKLSAgIGJlIHdyaXR0ZW4gaW1tZWRpYXRlbHkgaXMgYWRkZWQgdG8gdGhlIGJ1ZmZlciBxdWV1ZS4gKi8KLWV4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX3dyaXRlKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkLAotCQkJCSAgICBjb25zdCB2b2lkICosIHNpemVfdCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gZmx1c2ggc29tZSAoYnV0IHBlcmhhcHMgbm90IGFsbCkgb2YKLSAgIHRoZSBxdWV1ZWQgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiAqLwotZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYXZhaWxhYmxlKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkKTsKLQotLyogVGhlIGZvbGxvd2luZyAyIGZ1bmN0aW9ucyAoYnVmZmVyX2ZsdXNoX2FsbCBhbmQgYnVmZmVyX2ZsdXNoX3dpbmRvdykKLSAgIGFyZSBmb3IgdXNlIGluIGxpYi92dHkuYyBvbmx5LiAgVGhleSBzaG91bGQgbm90IGJlIHVzZWQgZWxzZXdoZXJlLiAqLwotCi0vKiBDYWxsIGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUgcmVwZWF0ZWRseSB1bnRpbCBlaXRoZXIgYWxsIGRhdGEgaGFzIGJlZW4KLSAgIGZsdXNoZWQsIG9yIGFuIEkvTyBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZCwgb3IgdGhlIG9wZXJhdGlvbiB3b3VsZAotICAgYmxvY2suICovCi1leHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF9hbGwoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQpOwotCi0vKiBBdHRlbXB0IHRvIHdyaXRlIGVub3VnaCBkYXRhIHRvIHRoZSBnaXZlbiBmZCB0byBmaWxsIGEgd2luZG93IG9mIHRoZQotICAgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodCAoYW5kIHJlbW92ZSB0aGUgZGF0YSB3cml0dGVuIGZyb20gdGhlIGJ1ZmZlcikuCi0KLSAgIElmICFub19tb3JlLCB0aGVuIGEgbWVzc2FnZSBzYXlpbmcgIiAtLU1vcmUtLSAiIGlzIGFwcGVuZGVkLgotICAgSWYgZXJhc2UgaXMgdHJ1ZSwgdGhlbiBmaXJzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzICIgLS1Nb3JlLS0gIiBtZXNzYWdlCi0gICB3aXRoIHNwYWNlcy4KLQotICAgQW55IHdyaXRlIGVycm9yIChpbmNsdWRpbmcgRUFHQUlOIG9yIEVJTlRSKSB3aWxsIGNhdXNlIHRoaXMgZnVuY3Rpb24KLSAgIHRvIHJldHVybiAtMSAoYmVjYXVzZSB0aGUgbG9naWMgZm9yIGhhbmRsaW5nIHRoZSBlcmFzZSBhbmQgbW9yZSBmZWF0dXJlcwotICAgaXMgdG9vIGNvbXBsaWNhdGVkIHRvIHJldHJ5IHRoZSB3cml0ZSBsYXRlcikuCi0qLwotZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfd2luZG93KHN0cnVjdCBidWZmZXIgKiwgaW50IGZkLCBpbnQgd2lkdGgsCi0JCQkJCSAgIGludCBoZWlnaHQsIGludCBlcmFzZSwgaW50IG5vX21vcmUpOwotCi0jZW5kaWYJCQkJLyogX1pFQlJBX0JVRkZFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L2NvbW1hbmQuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvY29tbWFuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2IwNzFmLi4wMDAwMDAwCi0tLSBhL29wZW5ic2MvaW5jbHVkZS92dHkvY29tbWFuZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qCi0gKiBaZWJyYSBjb25maWd1cmF0aW9uIGNvbW1hbmQgaW50ZXJmYWNlIHJvdXRpbmUKLSAqIENvcHlyaWdodCAoQykgMTk5NywgOTggS3VuaWhpcm8gSXNoaWd1cm8KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCi0gKgotICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9aRUJSQV9DT01NQU5EX0gKLSNkZWZpbmUgX1pFQlJBX0NPTU1BTkRfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJ2ZWN0b3IuaCIKLSNpbmNsdWRlICJ2dHkuaCIKLQotLyogSG9zdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICovCi1zdHJ1Y3QgaG9zdCB7Ci0JLyogSG9zdCBuYW1lIG9mIHRoaXMgcm91dGVyLiAqLwotCWNoYXIgKm5hbWU7Ci0KLQkvKiBQYXNzd29yZCBmb3IgdnR5IGludGVyZmFjZS4gKi8KLQljaGFyICpwYXNzd29yZDsKLQljaGFyICpwYXNzd29yZF9lbmNyeXB0OwotCi0JLyogRW5hYmxlIHBhc3N3b3JkICovCi0JY2hhciAqZW5hYmxlOwotCWNoYXIgKmVuYWJsZV9lbmNyeXB0OwotCi0JLyogU3lzdGVtIHdpZGUgdGVybWluYWwgbGluZXMuICovCi0JaW50IGxpbmVzOwotCi0JLyogTG9nIGZpbGVuYW1lLiAqLwotCWNoYXIgKmxvZ2ZpbGU7Ci0KLQkvKiBjb25maWcgZmlsZSBuYW1lIG9mIHRoaXMgaG9zdCAqLwotCWNoYXIgKmNvbmZpZzsKLQotCS8qIEZsYWdzIGZvciBzZXJ2aWNlcyAqLwotCWludCBhZHZhbmNlZDsKLQlpbnQgZW5jcnlwdDsKLQotCS8qIEJhbm5lciBjb25maWd1cmF0aW9uLiAqLwotCWNvbnN0IGNoYXIgKm1vdGQ7Ci0JY2hhciAqbW90ZGZpbGU7Ci19OwotCi0vKiBUaGVyZSBhcmUgc29tZSBjb21tYW5kIGxldmVscyB3aGljaCBjYWxsZWQgZnJvbSBjb21tYW5kIG5vZGUuICovCi1lbnVtIG5vZGVfdHlwZSB7Ci0JQVVUSF9OT0RFLAkJLyogQXV0aGVudGljYXRpb24gbW9kZSBvZiB2dHkgaW50ZXJmYWNlLiAqLwotCVZJRVdfTk9ERSwJCS8qIFZpZXcgbm9kZS4gRGVmYXVsdCBtb2RlIG9mIHZ0eSBpbnRlcmZhY2UuICovCi0JQVVUSF9FTkFCTEVfTk9ERSwJLyogQXV0aGVudGljYXRpb24gbW9kZSBmb3IgY2hhbmdlIGVuYWJsZS4gKi8KLQlFTkFCTEVfTk9ERSwJCS8qIEVuYWJsZSBub2RlLiAqLwotCUNPTkZJR19OT0RFLAkJLyogQ29uZmlnIG5vZGUuIERlZmF1bHQgbW9kZSBvZiBjb25maWcgZmlsZS4gKi8KLQlTRVJWSUNFX05PREUsCQkvKiBTZXJ2aWNlIG5vZGUuICovCi0JREVCVUdfTk9ERSwJCS8qIERlYnVnIG5vZGUuICovCi0jaWYgMAotCUFBQV9OT0RFLAkJLyogQUFBIG5vZGUuICovCi0JS0VZQ0hBSU5fTk9ERSwJCS8qIEtleS1jaGFpbiBub2RlLiAqLwotCUtFWUNIQUlOX0tFWV9OT0RFLAkvKiBLZXktY2hhaW4ga2V5IG5vZGUuICovCi0JSU5URVJGQUNFX05PREUsCQkvKiBJbnRlcmZhY2UgbW9kZSBub2RlLiAqLwotCVpFQlJBX05PREUsCQkvKiB6ZWJyYSBjb25uZWN0aW9uIG5vZGUuICovCi0JVEFCTEVfTk9ERSwJCS8qIHJ0bV90YWJsZSBzZWxlY3Rpb24gbm9kZS4gKi8KLQlSSVBfTk9ERSwJCS8qIFJJUCBwcm90b2NvbCBtb2RlIG5vZGUuICovCi0JUklQTkdfTk9ERSwJCS8qIFJJUG5nIHByb3RvY29sIG1vZGUgbm9kZS4gKi8KLQlCR1BfTk9ERSwJCS8qIEJHUCBwcm90b2NvbCBtb2RlIHdoaWNoIGluY2x1ZGVzIEJHUDQrICovCi0JQkdQX1ZQTlY0X05PREUsCQkvKiBCR1AgTVBMUy1WUE4gUEUgZXhjaGFuZ2UuICovCi0JQkdQX0lQVjRfTk9ERSwJCS8qIEJHUCBJUHY0IHVuaWNhc3QgYWRkcmVzcyBmYW1pbHkuICAqLwotCUJHUF9JUFY0TV9OT0RFLAkJLyogQkdQIElQdjQgbXVsdGljYXN0IGFkZHJlc3MgZmFtaWx5LiAgKi8KLQlCR1BfSVBWNl9OT0RFLAkJLyogQkdQIElQdjYgYWRkcmVzcyBmYW1pbHkgKi8KLQlPU1BGX05PREUsCQkvKiBPU1BGIHByb3RvY29sIG1vZGUgKi8KLQlPU1BGNl9OT0RFLAkJLyogT1NQRiBwcm90b2NvbCBmb3IgSVB2NiBtb2RlICovCi0JSVNJU19OT0RFLAkJLyogSVNJUyBwcm90b2NvbCBtb2RlICovCi0JTUFTQ19OT0RFLAkJLyogTUFTQyBmb3IgbXVsdGljYXN0LiAgKi8KLQlJUkRQX05PREUsCQkvKiBJQ01QIFJvdXRlciBEaXNjb3ZlcnkgUHJvdG9jb2wgbW9kZS4gKi8KLQlJUF9OT0RFLAkJLyogU3RhdGljIGlwIHJvdXRlIG5vZGUuICovCi0JQUNDRVNTX05PREUsCQkvKiBBY2Nlc3MgbGlzdCBub2RlLiAqLwotCVBSRUZJWF9OT0RFLAkJLyogUHJlZml4IGxpc3Qgbm9kZS4gKi8KLQlBQ0NFU1NfSVBWNl9OT0RFLAkvKiBBY2Nlc3MgbGlzdCBub2RlLiAqLwotCVBSRUZJWF9JUFY2X05PREUsCS8qIFByZWZpeCBsaXN0IG5vZGUuICovCi0JQVNfTElTVF9OT0RFLAkJLyogQVMgbGlzdCBub2RlLiAqLwotCUNPTU1VTklUWV9MSVNUX05PREUsCS8qIENvbW11bml0eSBsaXN0IG5vZGUuICovCi0JUk1BUF9OT0RFLAkJLyogUm91dGUgbWFwIG5vZGUuICovCi0JU01VWF9OT0RFLAkJLyogU05NUCBjb25maWd1cmF0aW9uIG5vZGUuICovCi0JRFVNUF9OT0RFLAkJLyogUGFja2V0IGR1bXAgbm9kZS4gKi8KLQlGT1JXQVJESU5HX05PREUsCS8qIElQIGZvcndhcmRpbmcgbm9kZS4gKi8KLSNlbmRpZgotCVZUWV9OT0RFLAkJLyogVnR5IG5vZGUuICovCi0KLQlHU01ORVRfTk9ERSwKLQlCVFNfTk9ERSwKLQlUUlhfTk9ERSwKLQlUU19OT0RFLAotCVNVQlNDUl9OT0RFLAotCU1HQ1BfTk9ERSwKLX07Ci0KLS8qIE5vZGUgd2hpY2ggaGFzIHNvbWUgY29tbWFuZHMgYW5kIHByb21wdCBzdHJpbmcgYW5kIGNvbmZpZ3VyYXRpb24KLSAgIGZ1bmN0aW9uIHBvaW50ZXIgLiAqLwotc3RydWN0IGNtZF9ub2RlIHsKLQkvKiBOb2RlIGluZGV4LiAqLwotCWVudW0gbm9kZV90eXBlIG5vZGU7Ci0KLQkvKiBQcm9tcHQgY2hhcmFjdGVyIGF0IHZ0eSBpbnRlcmZhY2UuICovCi0JY29uc3QgY2hhciAqcHJvbXB0OwotCi0JLyogSXMgdGhpcyBub2RlJ3MgY29uZmlndXJhdGlvbiBnb2VzIHRvIHZ0eXNoID8gKi8KLQlpbnQgdnR5c2g7Ci0KLQkvKiBOb2RlJ3MgY29uZmlndXJhdGlvbiB3cml0ZSBmdW5jdGlvbiAqLwotCWludCAoKmZ1bmMpIChzdHJ1Y3QgdnR5ICopOwotCi0JLyogVmVjdG9yIG9mIHRoaXMgbm9kZSdzIGNvbW1hbmQgbGlzdC4gKi8KLQl2ZWN0b3IgY21kX3ZlY3RvcjsKLX07Ci0KLWVudW0gewotCUNNRF9BVFRSX0RFUFJFQ0FURUQgPSAxLAotCUNNRF9BVFRSX0hJRERFTiwKLX07Ci0KLS8qIFN0cnVjdHVyZSBvZiBjb21tYW5kIGVsZW1lbnQuICovCi1zdHJ1Y3QgY21kX2VsZW1lbnQgewotCWNvbnN0IGNoYXIgKnN0cmluZzsJLyogQ29tbWFuZCBzcGVjaWZpY2F0aW9uIGJ5IHN0cmluZy4gKi8KLQlpbnQgKCpmdW5jKSAoc3RydWN0IGNtZF9lbGVtZW50ICosIHN0cnVjdCB2dHkgKiwgaW50LCBjb25zdCBjaGFyICpbXSk7Ci0JY29uc3QgY2hhciAqZG9jOwkvKiBEb2N1bWVudGF0aW9uIG9mIHRoaXMgY29tbWFuZC4gKi8KLQlpbnQgZGFlbW9uOwkJLyogRGFlbW9uIHRvIHdoaWNoIHRoaXMgY29tbWFuZCBiZWxvbmcuICovCi0JdmVjdG9yIHN0cnZlYzsJCS8qIFBvaW50aW5nIG91dCBlYWNoIGRlc2NyaXB0aW9uIHZlY3Rvci4gKi8KLQl1bnNpZ25lZCBpbnQgY21kc2l6ZTsJLyogQ29tbWFuZCBpbmRleCBjb3VudC4gKi8KLQljaGFyICpjb25maWc7CQkvKiBDb25maWd1cmF0aW9uIHN0cmluZyAqLwotCXZlY3RvciBzdWJjb25maWc7CS8qIFN1YiBjb25maWd1cmF0aW9uIHN0cmluZyAqLwotCXVfY2hhciBhdHRyOwkJLyogQ29tbWFuZCBhdHRyaWJ1dGVzICovCi19OwotCi0vKiBDb21tYW5kIGRlc2NyaXB0aW9uIHN0cnVjdHVyZS4gKi8KLXN0cnVjdCBkZXNjIHsKLQljb25zdCBjaGFyICpjbWQ7CS8qIENvbW1hbmQgc3RyaW5nLiAqLwotCWNvbnN0IGNoYXIgKnN0cjsJLyogQ29tbWFuZCdzIGRlc2NyaXB0aW9uLiAqLwotfTsKLQotLyogUmV0dXJuIHZhbHVlIG9mIHRoZSBjb21tYW5kcy4gKi8KLSNkZWZpbmUgQ01EX1NVQ0NFU1MgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQ01EX1dBUk5JTkcgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQ01EX0VSUl9OT19NQVRDSCAgICAgICAgIDIKLSNkZWZpbmUgQ01EX0VSUl9BTUJJR1VPVVMgICAgICAgIDMKLSNkZWZpbmUgQ01EX0VSUl9JTkNPTVBMRVRFICAgICAgIDQKLSNkZWZpbmUgQ01EX0VSUl9FWEVFRF9BUkdDX01BWCAgIDUKLSNkZWZpbmUgQ01EX0VSUl9OT1RISU5HX1RPRE8gICAgIDYKLSNkZWZpbmUgQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0ggIDcKLSNkZWZpbmUgQ01EX0NPTVBMRVRFX01BVENIICAgICAgIDgKLSNkZWZpbmUgQ01EX0NPTVBMRVRFX0xJU1RfTUFUQ0ggIDkKLSNkZWZpbmUgQ01EX1NVQ0NFU1NfREFFTU9OICAgICAgMTAKLQotLyogQXJnYyBtYXggY291bnRzLiAqLwotI2RlZmluZSBDTURfQVJHQ19NQVggICAyNQotCi0vKiBUdXJuIG9mZiB0aGVzZSBtYWNyb3Mgd2hlbiB1aXNuZyBjcHAgd2l0aCBleHRyYWN0LnBsICovCi0jaWZuZGVmIFZUWVNIX0VYVFJBQ1RfUEwKLQotLyogaGVscGVyIGRlZmluZXMgZm9yIGVuZC11c2VyIERFRlVOKiBtYWNyb3MgKi8KLSNkZWZpbmUgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cnMsIGRudW0pIFwKLSAgc3RydWN0IGNtZF9lbGVtZW50IGNtZG5hbWUgPSBcCi0gIHsgXAotICAgIC5zdHJpbmcgPSBjbWRzdHIsIFwKLSAgICAuZnVuYyA9IGZ1bmNuYW1lLCBcCi0gICAgLmRvYyA9IGhlbHBzdHIsIFwKLSAgICAuYXR0ciA9IGF0dHJzLCBcCi0gICAgLmRhZW1vbiA9IGRudW0sIFwKLSAgfTsKLQotI2RlZmluZSBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCi0gIHN0YXRpYyBpbnQgZnVuY25hbWUgKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBzdHJ1Y3QgdnR5ICosIGludCwgY29uc3QgY2hhciAqW10pOyBcCi0KLSNkZWZpbmUgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkgXAotICBzdGF0aWMgaW50IGZ1bmNuYW1lIFwKLSAgICAoc3RydWN0IGNtZF9lbGVtZW50ICpzZWxmLCBzdHJ1Y3QgdnR5ICp2dHksIGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCi0KLS8qIERFRlVOIGZvciB2dHkgY29tbWFuZCBpbnRlcmFmY2UuIExpdHRsZSBiaXQgaGFja3kgOy0pLiAqLwotI2RlZmluZSBERUZVTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCi0gIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKLSAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkgXAotICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQotCi0jZGVmaW5lIERFRlVOX0FUVFIoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAotICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCi0gIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIDApIFwKLSAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKLQotI2RlZmluZSBERUZVTl9ISURERU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAotICBERUZVTl9BVFRSIChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4pCi0KLSNkZWZpbmUgREVGVU5fREVQUkVDQVRFRChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCi0gIERFRlVOX0FUVFIgKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQpIFwKLQotLyogREVGVU5fTk9TSCBmb3IgY29tbWFuZHMgdGhhdCB2dHlzaCBzaG91bGQgaWdub3JlICovCi0jZGVmaW5lIERFRlVOX05PU0goZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAotICBERUZVTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKQotCi0vKiBERUZTSCBmb3IgdnR5c2guICovCi0jZGVmaW5lIERFRlNIKGRhZW1vbiwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCi0gIERFRlVOX0NNRF9FTEVNRU5UKE5VTEwsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgZGFlbW9uKSBcCi0KLS8qIERFRlVOICsgREVGU0ggKi8KLSNkZWZpbmUgREVGVU5TSChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKLSAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAotICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCBkYWVtb24pIFwKLSAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKLQotLyogREVGVU4gKyBERUZTSCB3aXRoIGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgREVGVU5TSF9BVFRSKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAotICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCi0gIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIGRhZW1vbikgXAotICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQotCi0jZGVmaW5lIERFRlVOU0hfSElEREVOKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAotICBERUZVTlNIX0FUVFIgKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOKQotCi0jZGVmaW5lIERFRlVOU0hfREVQUkVDQVRFRChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKLSAgREVGVU5TSF9BVFRSIChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQpCi0KLS8qIEFMSUFTIG1hY3JvIHdoaWNoIGRlZmluZSBleGlzdGluZyBjb21tYW5kJ3MgYWxpYXMuICovCi0jZGVmaW5lIEFMSUFTKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKLSAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkKLQotI2RlZmluZSBBTElBU19BVFRSKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKLSAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0ciwgMCkKLQotI2RlZmluZSBBTElBU19ISURERU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAotICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4sIDApCi0KLSNkZWZpbmUgQUxJQVNfREVQUkVDQVRFRChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCi0gIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQsIDApCi0KLSNkZWZpbmUgQUxJQVNfU0goZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCi0gIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIGRhZW1vbikKLQotI2RlZmluZSBBTElBU19TSF9ISURERU4oZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCi0gIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTiwgZGFlbW9uKQotCi0jZGVmaW5lIEFMSUFTX1NIX0RFUFJFQ0FURUQoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCi0gIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQsIGRhZW1vbikKLQotI2VuZGlmCQkJCS8qIFZUWVNIX0VYVFJBQ1RfUEwgKi8KLQotLyogU29tZSBtYWNyb2VzICovCi0jZGVmaW5lIENNRF9PUFRJT04oUykgICAoKFNbMF0pID09ICdbJykKLSNkZWZpbmUgQ01EX1ZBUklBQkxFKFMpICgoKFNbMF0pID49ICdBJyAmJiAoU1swXSkgPD0gJ1onKSB8fCAoKFNbMF0pID09ICc8JykpCi0jZGVmaW5lIENNRF9WQVJBUkcoUykgICAoKFNbMF0pID09ICcuJykKLSNkZWZpbmUgQ01EX1JBTkdFKFMpCSgoU1swXSA9PSAnPCcpKQotCi0jZGVmaW5lIENNRF9JUFY0KFMpCSAgICgoc3RyY21wICgoUyksICJBLkIuQy5EIikgPT0gMCkpCi0jZGVmaW5lIENNRF9JUFY0X1BSRUZJWChTKSAoKHN0cmNtcCAoKFMpLCAiQS5CLkMuRC9NIikgPT0gMCkpCi0jZGVmaW5lIENNRF9JUFY2KFMpICAgICAgICAoKHN0cmNtcCAoKFMpLCAiWDpYOjpYOlgiKSA9PSAwKSkKLSNkZWZpbmUgQ01EX0lQVjZfUFJFRklYKFMpICgoc3RyY21wICgoUyksICJYOlg6Olg6WC9NIikgPT0gMCkpCi0KLS8qIENvbW1vbiBkZXNjcmlwdGlvbnMuICovCi0jZGVmaW5lIFNIT1dfU1RSICJTaG93IHJ1bm5pbmcgc3lzdGVtIGluZm9ybWF0aW9uXG4iCi0jZGVmaW5lIElQX1NUUiAiSVAgaW5mb3JtYXRpb25cbiIKLSNkZWZpbmUgSVBWNl9TVFIgIklQdjYgaW5mb3JtYXRpb25cbiIKLSNkZWZpbmUgTk9fU1RSICJOZWdhdGUgYSBjb21tYW5kIG9yIHNldCBpdHMgZGVmYXVsdHNcbiIKLSNkZWZpbmUgQ0xFQVJfU1RSICJSZXNldCBmdW5jdGlvbnNcbiIKLSNkZWZpbmUgUklQX1NUUiAiUklQIGluZm9ybWF0aW9uXG4iCi0jZGVmaW5lIEJHUF9TVFIgIkJHUCBpbmZvcm1hdGlvblxuIgotI2RlZmluZSBPU1BGX1NUUiAiT1NQRiBpbmZvcm1hdGlvblxuIgotI2RlZmluZSBORUlHSEJPUl9TVFIgIlNwZWNpZnkgbmVpZ2hib3Igcm91dGVyXG4iCi0jZGVmaW5lIERFQlVHX1NUUiAiRGVidWdnaW5nIGZ1bmN0aW9ucyAoc2VlIGFsc28gJ3VuZGVidWcnKVxuIgotI2RlZmluZSBVTkRFQlVHX1NUUiAiRGlzYWJsZSBkZWJ1Z2dpbmcgZnVuY3Rpb25zIChzZWUgYWxzbyAnZGVidWcnKVxuIgotI2RlZmluZSBST1VURVJfU1RSICJFbmFibGUgYSByb3V0aW5nIHByb2Nlc3NcbiIKLSNkZWZpbmUgQVNfU1RSICJBUyBudW1iZXJcbiIKLSNkZWZpbmUgTUJHUF9TVFIgIk1CR1AgaW5mb3JtYXRpb25cbiIKLSNkZWZpbmUgTUFUQ0hfU1RSICJNYXRjaCB2YWx1ZXMgZnJvbSByb3V0aW5nIHRhYmxlXG4iCi0jZGVmaW5lIFNFVF9TVFIgIlNldCB2YWx1ZXMgaW4gZGVzdGluYXRpb24gcm91dGluZyBwcm90b2NvbFxuIgotI2RlZmluZSBPVVRfU1RSICJGaWx0ZXIgb3V0Z29pbmcgcm91dGluZyB1cGRhdGVzXG4iCi0jZGVmaW5lIElOX1NUUiAgIkZpbHRlciBpbmNvbWluZyByb3V0aW5nIHVwZGF0ZXNcbiIKLSNkZWZpbmUgVjROT1RBVElPTl9TVFIgInNwZWNpZnkgYnkgSVB2NCBhZGRyZXNzIG5vdGF0aW9uKGUuZy4gMC4wLjAuMClcbiIKLSNkZWZpbmUgT1NQRjZfTlVNQkVSX1NUUiAiU3BlY2lmeSBieSBudW1iZXJcbiIKLSNkZWZpbmUgSU5URVJGQUNFX1NUUiAiSW50ZXJmYWNlIGluZm9tYXRpb25cbiIKLSNkZWZpbmUgSUZOQU1FX1NUUiAiSW50ZXJmYWNlIG5hbWUoZS5nLiBlcDApXG4iCi0jZGVmaW5lIElQNl9TVFIgIklQdjYgSW5mb3JtYXRpb25cbiIKLSNkZWZpbmUgT1NQRjZfU1RSICJPcGVuIFNob3J0ZXN0IFBhdGggRmlyc3QgKE9TUEYpIGZvciBJUHY2XG4iCi0jZGVmaW5lIE9TUEY2X1JPVVRFUl9TVFIgIkVuYWJsZSBhIHJvdXRpbmcgcHJvY2Vzc1xuIgotI2RlZmluZSBPU1BGNl9JTlNUQU5DRV9TVFIgIjwxLTY1NTM1PiBJbnN0YW5jZSBJRFxuIgotI2RlZmluZSBTRUNPTkRTX1NUUiAiPDEtNjU1MzU+IFNlY29uZHNcbiIKLSNkZWZpbmUgUk9VVEVfU1RSICJSb3V0aW5nIFRhYmxlXG4iCi0jZGVmaW5lIFBSRUZJWF9MSVNUX1NUUiAiQnVpbGQgYSBwcmVmaXggbGlzdFxuIgotI2RlZmluZSBPU1BGNl9EVU1QX1RZUEVfTElTVCBcCi0iKG5laWdoYm9yfGludGVyZmFjZXxhcmVhfGxzYXx6ZWJyYXxjb25maWd8ZGJleHxzcGZ8cm91dGV8bHNkYnxyZWRpc3RyaWJ1dGV8aG9va3xhc2JyfHByZWZpeHxhYnIpIgotI2RlZmluZSBJU0lTX1NUUiAiSVMtSVMgaW5mb3JtYXRpb25cbiIKLSNkZWZpbmUgQVJFQV9UQUdfU1RSICJbYXJlYSB0YWddXG4iCi0KLSNkZWZpbmUgQ09ORl9CQUNLVVBfRVhUICIuc2F2IgotCi0vKiBJUHY0IG9ubHkgbWFjaGluZSBzaG91bGQgbm90IGFjY2VwdCBJUHY2IGFkZHJlc3MgZm9yIHBlZXIncyBJUAotICAgYWRkcmVzcy4gIFNvIHdlIHJlcGxhY2UgVlRZIGNvbW1hbmQgc3RyaW5nIGxpa2UgYmVsb3cuICovCi0jaWZkZWYgSEFWRV9JUFY2Ci0jZGVmaW5lIE5FSUdIQk9SX0NNRCAgICAgICAibmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlgpICIKLSNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EICAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WCkgIgotI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUiAgIk5laWdoYm9yIGFkZHJlc3NcbklQdjYgYWRkcmVzc1xuIgotI2RlZmluZSBORUlHSEJPUl9DTUQyICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYfFdPUkQpICIKLSNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EMiAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WHxXT1JEKSAiCi0jZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSMiAiTmVpZ2hib3IgYWRkcmVzc1xuTmVpZ2hib3IgSVB2NiBhZGRyZXNzXG5OZWlnaGJvciB0YWdcbiIKLSNlbHNlCi0jZGVmaW5lIE5FSUdIQk9SX0NNRCAgICAgICAibmVpZ2hib3IgQS5CLkMuRCAiCi0jZGVmaW5lIE5PX05FSUdIQk9SX0NNRCAgICAibm8gbmVpZ2hib3IgQS5CLkMuRCAiCi0jZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSICAiTmVpZ2hib3IgYWRkcmVzc1xuIgotI2RlZmluZSBORUlHSEJPUl9DTUQyICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFdPUkQpICIKLSNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EMiAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxXT1JEKSAiCi0jZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSMiAiTmVpZ2hib3IgYWRkcmVzc1xuTmVpZ2hib3IgdGFnXG4iCi0jZW5kaWYJCQkJLyogSEFWRV9JUFY2ICovCi0KLS8qIFByb3RvdHlwZXMuICovCi12b2lkIGluc3RhbGxfbm9kZShzdHJ1Y3QgY21kX25vZGUgKiwgaW50ICgqKShzdHJ1Y3QgdnR5ICopKTsKLXZvaWQgaW5zdGFsbF9kZWZhdWx0KGVudW0gbm9kZV90eXBlKTsKLXZvaWQgaW5zdGFsbF9lbGVtZW50KGVudW0gbm9kZV90eXBlLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKik7Ci12b2lkIHNvcnRfbm9kZSgpOwotCi0vKiBDb25jYXRlbmF0ZXMgYXJndltzaGlmdF0gdGhyb3VnaCBhcmd2W2FyZ2MtMV0gaW50byBhIHNpbmdsZSBOVUwtdGVybWluYXRlZAotICAgc3RyaW5nIHdpdGggYSBzcGFjZSBiZXR3ZWVuIGVhY2ggZWxlbWVudCAoYWxsb2NhdGVkIHVzaW5nCi0gICBYTUFMTE9DKE1UWVBFX1RNUCkpLiAgUmV0dXJucyBOVUxMIGlmIHNoaWZ0ID49IGFyZ2MuICovCi1jaGFyICphcmd2X2NvbmNhdChjb25zdCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGludCBzaGlmdCk7Ci0KLXZlY3RvciBjbWRfbWFrZV9zdHJ2ZWMoY29uc3QgY2hhciAqKTsKLXZvaWQgY21kX2ZyZWVfc3RydmVjKHZlY3Rvcik7Ci12ZWN0b3IgY21kX2Rlc2NyaWJlX2NvbW1hbmQoKTsKLWNoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZCgpOwotY29uc3QgY2hhciAqY21kX3Byb21wdChlbnVtIG5vZGVfdHlwZSk7Ci1pbnQgY29uZmlnX2Zyb21fZmlsZShzdHJ1Y3QgdnR5ICosIEZJTEUgKik7Ci1lbnVtIG5vZGVfdHlwZSBub2RlX3BhcmVudChlbnVtIG5vZGVfdHlwZSk7Ci1pbnQgY21kX2V4ZWN1dGVfY29tbWFuZCh2ZWN0b3IsIHN0cnVjdCB2dHkgKiwgc3RydWN0IGNtZF9lbGVtZW50ICoqLCBpbnQpOwotaW50IGNtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZlY3Rvciwgc3RydWN0IHZ0eSAqLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKiopOwotdm9pZCBjb25maWdfcmVwbGFjZV9zdHJpbmcoc3RydWN0IGNtZF9lbGVtZW50ICosIGNoYXIgKiwgLi4uKTsKLXZvaWQgY21kX2luaXQoaW50KTsKLQotLyogRXhwb3J0IHR5cGljYWwgZnVuY3Rpb25zLiAqLwotZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfZW5kX2NtZDsKLWV4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2V4aXRfY21kOwotZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfcXVpdF9jbWQ7Ci1leHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19oZWxwX2NtZDsKLWV4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2xpc3RfY21kOwotY2hhciAqaG9zdF9jb25maWdfZmlsZSgpOwotdm9pZCBob3N0X2NvbmZpZ19zZXQoY29uc3QgY2hhciAqKTsKLQotdm9pZCBwcmludF92ZXJzaW9uKGNvbnN0IGNoYXIgKik7Ci0KLWV4dGVybiB2b2lkICp0YWxsX3Z0eV9jbWRfY3R4OwotCi0jZW5kaWYJCQkJLyogX1pFQlJBX0NPTU1BTkRfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92ZWN0b3IuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYTE4NGQuLjAwMDAwMDAKLS0tIGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92ZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBHZW5lcmljIHZlY3RvciBpbnRlcmZhY2UgaGVhZGVyLgotICogQ29weXJpZ2h0IChDKSAxOTk3LCA5OCBLdW5paGlybyBJc2hpZ3VybwotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KLSAqCi0gKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICogMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpZm5kZWYgX1pFQlJBX1ZFQ1RPUl9ICi0jZGVmaW5lIF9aRUJSQV9WRUNUT1JfSAotCi0vKiBzdHJ1Y3QgZm9yIHZlY3RvciAqLwotc3RydWN0IF92ZWN0b3IgewotCXVuc2lnbmVkIGludCBhY3RpdmU7CS8qIG51bWJlciBvZiBhY3RpdmUgc2xvdHMgKi8KLQl1bnNpZ25lZCBpbnQgYWxsb2NlZDsJLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBzbG90ICovCi0Jdm9pZCAqKmluZGV4OwkJLyogaW5kZXggdG8gZGF0YSAqLwotfTsKLXR5cGVkZWYgc3RydWN0IF92ZWN0b3IgKnZlY3RvcjsKLQotI2RlZmluZSBWRUNUT1JfTUlOX1NJWkUgMQotCi0vKiAoU29tZXRpbWVzKSB1c2VmdWxsIG1hY3Jvcy4gIFRoaXMgbWFjcm8gY29udmVydCBpbmRleCBleHByZXNzaW9uIHRvCi0gYXJyYXkgZXhwcmVzc2lvbi4gKi8KLS8qIFJlZmVyZW5jZSBzbG90IGF0IGdpdmVuIGluZGV4LCBjYWxsZXIgbXVzdCBlbnN1cmUgc2xvdCBpcyBhY3RpdmUgKi8KLSNkZWZpbmUgdmVjdG9yX3Nsb3QoVixJKSAgKChWKS0+aW5kZXhbKEkpXSkKLS8qIE51bWJlciBvZiBhY3RpdmUgc2xvdHMuCi0gKiBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gdmVjdG9yX2NvdW50KCkgYXMgaXQgdGhlIGNvdW50IHJldHVybmVkCi0gKiB3aWxsIGluY2x1ZGUgYW55IGVtcHR5IHNsb3RzCi0gKi8KLSNkZWZpbmUgdmVjdG9yX2FjdGl2ZShWKSAoKFYpLT5hY3RpdmUpCi0KLS8qIFByb3RvdHlwZXMuICovCi12ZWN0b3IgdmVjdG9yX2luaXQodW5zaWduZWQgaW50IHNpemUpOwotdm9pZCB2ZWN0b3JfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgbnVtKTsKLWludCB2ZWN0b3JfZW1wdHlfc2xvdCh2ZWN0b3Igdik7Ci1pbnQgdmVjdG9yX3NldCh2ZWN0b3Igdiwgdm9pZCAqdmFsKTsKLWludCB2ZWN0b3Jfc2V0X2luZGV4KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSwgdm9pZCAqdmFsKTsKLXZvaWQgdmVjdG9yX3Vuc2V0KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSk7Ci11bnNpZ25lZCBpbnQgdmVjdG9yX2NvdW50KHZlY3RvciB2KTsKLXZvaWQgdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKHZlY3RvciB2KTsKLXZvaWQgdmVjdG9yX29ubHlfaW5kZXhfZnJlZSh2b2lkICppbmRleCk7Ci12b2lkIHZlY3Rvcl9mcmVlKHZlY3RvciB2KTsKLXZlY3RvciB2ZWN0b3JfY29weSh2ZWN0b3Igdik7Ci0KLXZvaWQgKnZlY3Rvcl9sb29rdXAodmVjdG9yLCB1bnNpZ25lZCBpbnQpOwotdm9pZCAqdmVjdG9yX2xvb2t1cF9lbnN1cmUodmVjdG9yLCB1bnNpZ25lZCBpbnQpOwotCi1leHRlcm4gdm9pZCAqdGFsbF92dHlfdmVjX2N0eDsKLQotI2VuZGlmCQkJCS8qIF9aRUJSQV9WRUNUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvdnR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDFmYzUuLjAwMDAwMDAKLS0tIGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jaWZuZGVmIF9WVFlfSAotI2RlZmluZSBfVlRZX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLS8qIEdDQyBoYXZlIHByaW50ZiB0eXBlIGF0dHJpYnV0ZSBjaGVjay4gICovCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgVlRZX1BSSU5URl9BVFRSSUJVVEUoYSxiKSBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgYSwgYikpKQotI2Vsc2UKLSNkZWZpbmUgVlRZX1BSSU5URl9BVFRSSUJVVEUoYSxiKQotI2VuZGlmCQkJCS8qIF9fR05VQ19fICovCi0KLS8qIERvZXMgdGhlIEkvTyBlcnJvciBpbmRpY2F0ZSB0aGF0IHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHJldHJpZWQgbGF0ZXI/ICovCi0jZGVmaW5lIEVSUk5PX0lPX1JFVFJZKEVOKSBcCi0JKCgoRU4pID09IEVBR0FJTikgfHwgKChFTikgPT0gRVdPVUxEQkxPQ0spIHx8ICgoRU4pID09IEVJTlRSKSkKLQotLyogVnR5IHJlYWQgYnVmZmVyIHNpemUuICovCi0jZGVmaW5lIFZUWV9SRUFEX0JVRlNJWiA1MTIKLQotI2RlZmluZSBWVFlfQlVGU0laIDUxMgotI2RlZmluZSBWVFlfTUFYSElTVCAyMAotCi0vKiBWdHkgZXZlbnRzICovCi1lbnVtIGV2ZW50IHsKLQlWVFlfU0VSViwKLQlWVFlfUkVBRCwKLQlWVFlfV1JJVEUsCi0JVlRZX0NMT1NFRCwKLQlWVFlfVElNRU9VVF9SRVNFVCwKLSNpZmRlZiBWVFlTSAotCVZUWVNIX1NFUlYsCi0JVlRZU0hfUkVBRCwKLQlWVFlTSF9XUklURQotI2VuZGlmCQkJCS8qIFZUWVNIICovCi19OwotCi1zdHJ1Y3QgdnR5IHsKLQlGSUxFICpmaWxlOwotCi0JLyogcHJpdmF0ZSBkYXRhLCBzcGVjaWZpZWQgYnkgY3JlYXRvciAqLwotCXZvaWQgKnByaXY7Ci0KLQkvKiBGaWxlIGRlc2NyaXB0ZXIgb2YgdGhpcyB2dHkuICovCi0JaW50IGZkOwotCi0JLyogSXMgdGhpcyB2dHkgY29ubmVjdCB0byBmaWxlIG9yIG5vdCAqLwotCWVudW0geyBWVFlfVEVSTSwgVlRZX0ZJTEUsIFZUWV9TSEVMTCwgVlRZX1NIRUxMX1NFUlYgfSB0eXBlOwotCi0JLyogTm9kZSBzdGF0dXMgb2YgdGhpcyB2dHkgKi8KLQlpbnQgbm9kZTsKLQotCS8qIEZhaWx1cmUgY291bnQgKi8KLQlpbnQgZmFpbDsKLQotCS8qIE91dHB1dCBidWZmZXIuICovCi0Jc3RydWN0IGJ1ZmZlciAqb2J1ZjsKLQotCS8qIENvbW1hbmQgaW5wdXQgYnVmZmVyICovCi0JY2hhciAqYnVmOwotCi0JLyogQ29tbWFuZCBjdXJzb3IgcG9pbnQgKi8KLQlpbnQgY3A7Ci0KLQkvKiBDb21tYW5kIGxlbmd0aCAqLwotCWludCBsZW5ndGg7Ci0KLQkvKiBDb21tYW5kIG1heCBsZW5ndGguICovCi0JaW50IG1heDsKLQotCS8qIEhpc3RyeSBvZiBjb21tYW5kICovCi0JY2hhciAqaGlzdFtWVFlfTUFYSElTVF07Ci0KLQkvKiBIaXN0b3J5IGxvb2t1cCBjdXJyZW50IHBvaW50ICovCi0JaW50IGhwOwotCi0JLyogSGlzdG9yeSBpbnNlcnQgZW5kIHBvaW50ICovCi0JaW50IGhpbmRleDsKLQotCS8qIEZvciBjdXJyZW50IHJlZmVyZW5jaW5nIHBvaW50IG9mIGludGVyZmFjZSwgcm91dGUtbWFwLAotCSAgIGFjY2Vzcy1saXN0IGV0Yy4uLiAqLwotCXZvaWQgKmluZGV4OwotCi0JLyogRm9yIG11bHRpcGxlIGxldmVsIGluZGV4IHRyZWF0bWVudCBzdWNoIGFzIGtleSBjaGFpbiBhbmQga2V5LiAqLwotCXZvaWQgKmluZGV4X3N1YjsKLQotCS8qIEZvciBlc2NhcGUgY2hhcmFjdGVyLiAqLwotCXVuc2lnbmVkIGNoYXIgZXNjYXBlOwotCi0JLyogQ3VycmVudCB2dHkgc3RhdHVzLiAqLwotCWVudW0geyBWVFlfTk9STUFMLCBWVFlfQ0xPU0UsIFZUWV9NT1JFLCBWVFlfTU9SRUxJTkUgfSBzdGF0dXM7Ci0KLQkvKiBJQUMgaGFuZGxpbmc6IHdhcyB0aGUgbGFzdCBjaGFyYWN0ZXIgcmVjZWl2ZWQgdGhlIElBQwotCSAqIChpbnRlcnByZXQtYXMtY29tbWFuZCkgZXNjYXBlIGNoYXJhY3RlciAoYW5kIHRoZXJlZm9yZSB0aGUgbmV4dAotCSAqIGNoYXJhY3RlciB3aWxsIGJlIHRoZSBjb21tYW5kIGNvZGUpPyAgUmVmZXIgdG8gVGVsbmV0IFJGQyA4NTQuICovCi0JdW5zaWduZWQgY2hhciBpYWM7Ci0KLQkvKiBJQUMgU0IgKG9wdGlvbiBzdWJuZWdvdGlhdGlvbikgaGFuZGxpbmcgKi8KLQl1bnNpZ25lZCBjaGFyIGlhY19zYl9pbl9wcm9ncmVzczsKLQkvKiBBdCB0aGUgbW9tZW50LCB3ZSBjYXJlIG9ubHkgYWJvdXQgdGhlIE5BV1MgKHdpbmRvdyBzaXplKSBuZWdvdGlhdGlvbiwKLQkgKiBhbmQgdGhhdCByZXF1aXJlcyBqdXN0IGEgNS1jaGFyYWN0ZXIgYnVmZmVyIChSRkMgMTA3Myk6Ci0JICogPE5BV1MgY2hhcj4gPDE2LWJpdCB3aWR0aD4gPDE2LWJpdCBoZWlnaHQ+ICovCi0jZGVmaW5lIFRFTE5FVF9OQVdTX1NCX0xFTiA1Ci0JdW5zaWduZWQgY2hhciBzYl9idWZbVEVMTkVUX05BV1NfU0JfTEVOXTsKLQkvKiBIb3cgbWFueSBzdWJuZWdvdGlhdGlvbiBjaGFyYWN0ZXJzIGhhdmUgd2UgcmVjZWl2ZWQ/ICBXZSBqdXN0IGRyb3AKLQkgKiB0aG9zZSB0aGF0IGRvIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlci4gKi8KLQlzaXplX3Qgc2JfbGVuOwotCi0JLyogV2luZG93IHdpZHRoL2hlaWdodC4gKi8KLQlpbnQgd2lkdGg7Ci0JaW50IGhlaWdodDsKLQotCS8qIENvbmZpZ3VyZSBsaW5lcy4gKi8KLQlpbnQgbGluZXM7Ci0KLQlpbnQgbW9uaXRvcjsKLQotCS8qIEluIGNvbmZpZ3VyZSBtb2RlLiAqLwotCWludCBjb25maWc7Ci19OwotCi0vKiBTbWFsbCBtYWNybyB0byBkZXRlcm1pbmUgbmV3bGluZSBpcyBuZXdsaW5lIG9ubHkgb3IgbGluZWZlZWQgbmVlZGVkLiAqLwotI2RlZmluZSBWVFlfTkVXTElORSAgKCh2dHktPnR5cGUgPT0gVlRZX1RFUk0pID8gIlxyXG4iIDogIlxuIikKLQotc3RhdGljIGlubGluZSBjaGFyICp2dHlfbmV3bGluZShzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0JcmV0dXJuIFZUWV9ORVdMSU5FOwotfQotCi0vKiBQcm90b3R5cGVzLiAqLwotdm9pZCB2dHlfaW5pdCAodm9pZCk7Ci1pbnQgdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKLXZvaWQgdnR5X2luaXRfdnR5c2ggKHZvaWQpOwotdm9pZCB2dHlfcmVzZXQgKHZvaWQpOwotc3RydWN0IHZ0eSAqdnR5X25ldyAodm9pZCk7Ci1zdHJ1Y3QgdnR5ICp2dHlfY3JlYXRlIChpbnQgdnR5X3NvY2ssIHZvaWQgKnByaXYpOwotaW50IHZ0eV9vdXQgKHN0cnVjdCB2dHkgKiwgY29uc3QgY2hhciAqLCAuLi4pIFZUWV9QUklOVEZfQVRUUklCVVRFKDIsIDMpOwotaW50IHZ0eV9vdXRfbmV3bGluZShzdHJ1Y3QgdnR5ICopOwotaW50IHZ0eV9yZWFkKHN0cnVjdCB2dHkgKnZ0eSk7Ci0vL3ZvaWQgdnR5X3RpbWVfcHJpbnQgKHN0cnVjdCB2dHkgKiwgaW50KTsKLXZvaWQgdnR5X2Nsb3NlIChzdHJ1Y3QgdnR5ICopOwotY2hhciAqdnR5X2dldF9jd2QgKHZvaWQpOwotdm9pZCB2dHlfbG9nIChjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqcHJvdG8sIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCk7Ci1pbnQgdnR5X2NvbmZpZ19sb2NrIChzdHJ1Y3QgdnR5ICopOwotaW50IHZ0eV9jb25maWdfdW5sb2NrIChzdHJ1Y3QgdnR5ICopOwotaW50IHZ0eV9zaGVsbCAoc3RydWN0IHZ0eSAqKTsKLWludCB2dHlfc2hlbGxfc2VydiAoc3RydWN0IHZ0eSAqKTsKLXZvaWQgdnR5X2hlbGxvIChzdHJ1Y3QgdnR5ICopOwotCi12b2lkICp0YWxsX3Z0eV9jdHg7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0KaW5kZXggMWQxODQ3NS4uODdjZDBlYSAxMDA2NDQKLS0tIGEvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0KKysrIGIvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0KQEAgLTEsNDggKzEsNDQgQEAKIElOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIC1JJCh0b3BfYnVpbGRkaXIpCi1BTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpICQoTElCT1NNT1ZUWV9DRkxBR1MpCiBBTV9MREZMQUdTID0gJChMSUJPU01PQ09SRV9MSUJTKQogCi1zYmluX1BST0dSQU1TID0gYnNjX2hhY2sgYnMxMV9jb25maWcgaXBhY2Nlc3MtZmluZCBpcGFjY2Vzcy1jb25maWcgXAotICAgICAgICAgICAgICAgIGlzZG5zeW5jIGJzY19tZ2NwIGlwYWNjZXNzLXByb3h5Ci1ub2luc3RfTElCUkFSSUVTID0gbGliYnNjLmEgbGlibXNjLmEgbGlidnR5LmEKLW5vaW5zdF9IRUFERVJTID0gdnR5L2NhcmRzaGVsbC5oCisjIGJ1aWxkIGN1cnJlbnQgZGlyZWN0b3J5IGJlZm9yZSBidWlsZGluZyBncHJzCitTVUJESVJTID0gLiBpcGFjY2VzcyBncHJzCisKK3NiaW5fUFJPR1JBTVMgPSBic2NfaGFjayBiczExX2NvbmZpZyBpc2Ruc3luYyBic2NfbWdjcAorbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJzYy5hIGxpYm1zYy5hIGxpYnZ0eS5hIGxpYnNjY3AuYQogCiBic2NkaXIgPSAkKGxpYmRpcikKIGJzY19MSUJSQVJJRVMgPSBsaWJzY2NwLmEKIAogbGliYnNjX2FfU09VUkNFUyA9IGFiaXNfcnNsLmMgYWJpc19ubS5jIGdzbV9kYXRhLmMgZ3NtXzA0XzA4X3V0aWxzLmMgXAotCQljaGFuX2FsbG9jLmMgZGVidWcuYyBcCisJCWNoYW5fYWxsb2MuYyBkZWJ1Zy5jIHNvY2tldC5jIGFiaXNfbm1fdnR5LmMgXAogCQlnc21fc3Vic2NyaWJlcl9iYXNlLmMgc3ViY2hhbl9kZW11eC5jIGJzY19ybGwuYyB0cmFuc2FjdGlvbi5jIFwKIAkJdHJhdV9mcmFtZS5jIHRyYXVfbXV4LmMgcGFnaW5nLmMgZTFfY29uZmlnLmMgZTFfaW5wdXQuYyBcCiAJCWlucHV0L21pc2RuLmMgaW5wdXQvaXBhY2Nlc3MuYyBcCiAJCXRhbGxvY19jdHguYyBzeXN0ZW1faW5mb3JtYXRpb24uYyByZXN0X29jdGV0cy5jIFwKIAkJcnRwX3Byb3h5LmMgYnRzX3NpZW1lbnNfYnMxMS5jIGJ0c19pcGFjY2Vzc19uYW5vYnRzLmMgXAotCQlidHNfdW5rbm93bi5jIGJzY192ZXJzaW9uLmMKKwkJYnRzX3Vua25vd24uYyBic2NfdmVyc2lvbi5jIGJzY19hcGkuYyBic2NfdnR5LmMKIAotbGlibXNjX2FfU09VUkNFUyA9IGdzbV9zdWJzY3JpYmVyLmMgZGIuYyB0ZWxuZXRfaW50ZXJmYWNlLmMgXAorbGlibXNjX2FfU09VUkNFUyA9IGdzbV9zdWJzY3JpYmVyLmMgZGIuYyBcCiAJCW1uY2MuYyBnc21fMDRfMDguYyBnc21fMDRfMTEuYyB0cmFuc2FjdGlvbi5jIFwKIAkJdG9rZW5fYXV0aC5jIHJybHAuYyBnc21fMDRfODAuYyB1c3NkLmMgc2lsZW50X2NhbGwuYyBcCi0JCWhhbmRvdmVyX2xvZ2ljLmMgaGFuZG92ZXJfZGVjaXNpb24uYyBtZWFzX3JlcC5jCisJCWhhbmRvdmVyX2xvZ2ljLmMgaGFuZG92ZXJfZGVjaXNpb24uYyBtZWFzX3JlcC5jIGF1dGguYyBcCisJCW9zbW9fbXNjLmMKIAotbGlidnR5X2FfU09VUkNFUyA9IHZ0eS9idWZmZXIuYyB2dHkvY29tbWFuZC5jIHZ0eS92ZWN0b3IuYyB2dHkvdnR5LmMKK2xpYnZ0eV9hX1NPVVJDRVMgPSBjb21tb25fdnR5LmMKIAogbGlic2NjcF9hX1NPVVJDRVMgPSBzY2NwL3NjY3AuYwogCi1ic2NfaGFja19TT1VSQ0VTID0gYnNjX2hhY2suYyBic2NfaW5pdC5jIHZ0eV9pbnRlcmZhY2UuYyB2dHlfaW50ZXJmYWNlX2xheWVyMy5jCi1ic2NfaGFja19MREFERCA9IGxpYm1zYy5hIGxpYmJzYy5hIGxpYm1zYy5hIGxpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKK2JzY19oYWNrX1NPVVJDRVMgPSBic2NfaGFjay5jIGJzY19pbml0LmMgYnNjX3Z0eS5jIHZ0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKK2JzY19oYWNrX0xEQUREID0gbGlibXNjLmEgbGliYnNjLmEgbGlidnR5LmEgbGlibXNjLmEgXAorCQktbGRsIC1sZGJpICQoTElCQ1JZUFQpICQoTElCT1NNT1ZUWV9MSUJTKQogCiBiczExX2NvbmZpZ19TT1VSQ0VTID0gYnMxMV9jb25maWcuYyBhYmlzX25tLmMgZ3NtX2RhdGEuYyBkZWJ1Zy5jIFwKIAkJICAgICAgcnMyMzIuYyBidHNfc2llbWVuc19iczExLmMKIAotaXBhY2Nlc3NfZmluZF9TT1VSQ0VTID0gaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jCi0KLWlwYWNjZXNzX2NvbmZpZ19TT1VSQ0VTID0gaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMgaXBhY2Nlc3MvaXBhY2Nlc3MtZmlybXdhcmUuYwotaXBhY2Nlc3NfY29uZmlnX0xEQUREID0gbGliYnNjLmEgbGlibXNjLmEgbGliYnNjLmEgbGlidnR5LmEgLWxkbCAtbGRiaSAkKExJQkNSWVBUKQotCiBpc2Ruc3luY19TT1VSQ0VTID0gaXNkbnN5bmMuYwogCiBic2NfbWdjcF9TT1VSQ0VTID0gbWdjcC9tZ2NwX21haW4uYyBtZ2NwL21nY3BfcHJvdG9jb2wuYyBtZ2NwL21nY3BfbmV0d29yay5jIG1nY3AvbWdjcF92dHkuYyBcCi0JCSAgIGRlYnVnLmMgdGVsbmV0X2ludGVyZmFjZS5jCi1ic2NfbWdjcF9MREFERCA9IGxpYnZ0eS5hCi0KLWlwYWNjZXNzX3Byb3h5X1NPVVJDRVMgPSBpcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jIGRlYnVnLmMKKwkJICAgZGVidWcuYworYnNjX21nY3BfTERBREQgPSBsaWJ2dHkuYSAkKExJQk9TTU9WVFlfTElCUykKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2FiaXNfbm0uYyBiL29wZW5ic2Mvc3JjL2FiaXNfbm0uYwppbmRleCBjOTg1MmJmLi42ODM3MzA1IDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9hYmlzX25tLmMKKysrIGIvb3BlbmJzYy9zcmMvYWJpc19ubS5jCkBAIC0xLDQgKzEsNCBAQAotLyogR1NNIE5ldHdvcmsgTWFuYWdlbWVudCAoT01MKSBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorLyogR1NNIE5ldHdvcmsgTWFuYWdlbWVudCAoT01MKSBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCiAgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLwogCiAvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CkBAIC00MTksMzAgKzQxOSwzMCBAQAogCiBzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX3N3KHN0cnVjdCBtc2diICptYik7CiAKLXN0YXRpYyBzdHJ1Y3QgdmFsdWVfc3RyaW5nIG9ial9jbGFzc19uYW1lc1tdID0gewotCXsgTk1fT0NfU0lURV9NQU5BR0VSLAkiU0lURSBNQU5BR0VSIiB9LAorY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBhYmlzX25tX29ial9jbGFzc19uYW1lc1tdID0geworCXsgTk1fT0NfU0lURV9NQU5BR0VSLAkiU0lURS1NQU5BR0VSIiB9LAogCXsgTk1fT0NfQlRTLAkJIkJUUyIgfSwKLQl7IE5NX09DX1JBRElPX0NBUlJJRVIsCSJSQURJTyBDQVJSSUVSIiB9LAotCXsgTk1fT0NfQkFTRUJfVFJBTlNDLAkiQkFTRUJBTkQgVFJBTlNDRUlWRVIiIH0sCisJeyBOTV9PQ19SQURJT19DQVJSSUVSLAkiUkFESU8tQ0FSUklFUiIgfSwKKwl7IE5NX09DX0JBU0VCX1RSQU5TQywJIkJBU0VCQU5ELVRSQU5TQ0VJVkVSIiB9LAogCXsgTk1fT0NfQ0hBTk5FTCwJIkNIQU5ORUwiIH0sCiAJeyBOTV9PQ19CUzExX0FESkMsCSJBREpDIiB9LAogCXsgTk1fT0NfQlMxMV9IQU5ET1ZFUiwJIkhBTkRPVkVSIiB9LAotCXsgTk1fT0NfQlMxMV9QV1JfQ1RSTCwJIlBPV0VSIENPTlRST0wiIH0sCisJeyBOTV9PQ19CUzExX1BXUl9DVFJMLAkiUE9XRVItQ09OVFJPTCIgfSwKIAl7IE5NX09DX0JTMTFfQlRTRSwJIkJUU0UiIH0sCiAJeyBOTV9PQ19CUzExX1JBQ0ssCSJSQUNLIiB9LAogCXsgTk1fT0NfQlMxMV9URVNULAkiVEVTVCIgfSwKIAl7IE5NX09DX0JTMTFfRU5WQUJUU0UsCSJFTlZBQlRTRSIgfSwKIAl7IE5NX09DX0JTMTFfQlBPUlQsCSJCUE9SVCIgfSwKLQl7IE5NX09DX0dQUlNfTlNFLAkiR1BSUyBOU0UiIH0sCi0JeyBOTV9PQ19HUFJTX0NFTEwsCSJHUFJTIENFTEwiIH0sCi0JeyBOTV9PQ19HUFJTX05TVkMsCSJHUFJTIE5TVkMiIH0sCisJeyBOTV9PQ19HUFJTX05TRSwJIkdQUlMtTlNFIiB9LAorCXsgTk1fT0NfR1BSU19DRUxMLAkiR1BSUy1DRUxMIiB9LAorCXsgTk1fT0NfR1BSU19OU1ZDLAkiR1BSUy1OU1ZDIiB9LAogCXsgTk1fT0NfQlMxMSwJCSJTSUVNRU5TSFciIH0sCiAJeyAwLAkJCU5VTEwgfQogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm9ial9jbGFzc19uYW1lKHVfaW50OF90IG9jKQogewotCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKG9ial9jbGFzc19uYW1lcywgb2MpOworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGFiaXNfbm1fb2JqX2NsYXNzX25hbWVzLCBvYyk7CiB9CiAKIGNvbnN0IGNoYXIgKm5tX29wc3RhdGVfbmFtZSh1X2ludDhfdCBvcykKQEAgLTQ5MCwxOCArNDkwLDE3IEBACiAJeyAwLCBOVUxMIH0KIH07CiAKK2NvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYWJpc19ubV9hZG1fc3RhdGVfbmFtZXNbXSA9IHsKKwl7IE5NX1NUQVRFX0xPQ0tFRCwJIkxvY2tlZCIgfSwKKwl7IE5NX1NUQVRFX1VOTE9DS0VELAkiVW5sb2NrZWQiIH0sCisJeyBOTV9TVEFURV9TSFVURE9XTiwJIlNodXRkb3duIiB9LAorCXsgTk1fU1RBVEVfTlVMTCwJIk5VTEwiIH0sCisJeyAwLCBOVUxMIH0KK307CisKIGNvbnN0IGNoYXIgKm5tX2FkbV9uYW1lKHVfaW50OF90IGFkbSkKIHsKLQlzd2l0Y2ggKGFkbSkgewotCWNhc2UgMToKLQkJcmV0dXJuICJMb2NrZWQiOwotCWNhc2UgMjoKLQkJcmV0dXJuICJVbmxvY2tlZCI7Ci0JY2FzZSAzOgotCQlyZXR1cm4gIlNodXRkb3duIjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gIjxub3QgdXNlZD4iOwotCX0KKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhhYmlzX25tX2FkbV9zdGF0ZV9uYW1lcywgYWRtKTsKIH0KIAogaW50IG5tX2lzX3J1bm5pbmcoc3RydWN0IGdzbV9ubV9zdGF0ZSAqcykgewpAQCAtNTE0LDcgKzUxMyw3IEBACiBzdGF0aWMgdm9pZCBkZWJ1Z3BfZm9oKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCkKIHsKIAlERUJVR1AoRE5NLCAiT0M9JXMoJTAyeCkgSU5TVD0oJTAyeCwlMDJ4LCUwMngpICIsCi0JCW9ial9jbGFzc19uYW1lKGZvaC0+b2JqX2NsYXNzKSwgZm9oLT5vYmpfY2xhc3MsIAorCQlvYmpfY2xhc3NfbmFtZShmb2gtPm9ial9jbGFzcyksIGZvaC0+b2JqX2NsYXNzLAogCQlmb2gtPm9ial9pbnN0LmJ0c19uciwgZm9oLT5vYmpfaW5zdC50cnhfbnIsCiAJCWZvaC0+b2JqX2luc3QudHNfbnIpOwogfQpAQCAtNjc4LDcgKzY3Nyw3IEBACiAJbmV3X3N0YXRlID0gKm5tX3N0YXRlOwogCW5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9IGFkbV9zdGF0ZTsKIAotCXJjID0gbm1fc3RhdGVfZXZlbnQoRVZUX1NUQVRFQ0hHX0FETSwgb2JqX2NsYXNzLCBvYmosIG5tX3N0YXRlLCAmbmV3X3N0YXRlKTsKKwlyYyA9IG5tX3N0YXRlX2V2ZW50KEVWVF9TVEFURUNIR19BRE0sIG9ial9jbGFzcywgb2JqLCBubV9zdGF0ZSwgJm5ld19zdGF0ZSwgb2JqX2luc3QpOwogCiAJbm1fc3RhdGUtPmFkbWluaXN0cmF0aXZlID0gYWRtX3N0YXRlOwogCkBAIC03MzIsNyArNzMxLDcgQEAKIAkJLyogVXBkYXRlIHRoZSBvcGVyYXRpb25hbCBzdGF0ZSBvZiBhIGdpdmVuIG9iamVjdCBpbiBvdXIgaW4tbWVtb3J5IGRhdGEKICAJCSogc3RydWN0dXJlcyBhbmQgc2VuZCBhbiBldmVudCB0byB0aGUgaGlnaGVyIGxheWVyICovCiAJCXZvaWQgKm9iaiA9IG9iamNsYXNzMm9iaihidHMsIGZvaC0+b2JqX2NsYXNzLCAmZm9oLT5vYmpfaW5zdCk7Ci0JCXJjID0gbm1fc3RhdGVfZXZlbnQoRVZUX1NUQVRFQ0hHX09QRVIsIGZvaC0+b2JqX2NsYXNzLCBvYmosIG5tX3N0YXRlLCAmbmV3X3N0YXRlKTsKKwkJcmMgPSBubV9zdGF0ZV9ldmVudChFVlRfU1RBVEVDSEdfT1BFUiwgZm9oLT5vYmpfY2xhc3MsIG9iaiwgbm1fc3RhdGUsICZuZXdfc3RhdGUsICZmb2gtPm9ial9pbnN0KTsKIAkJbm1fc3RhdGUtPm9wZXJhdGlvbmFsID0gbmV3X3N0YXRlLm9wZXJhdGlvbmFsOwogCQlubV9zdGF0ZS0+YXZhaWxhYmlsaXR5ID0gbmV3X3N0YXRlLmF2YWlsYWJpbGl0eTsKIAkJaWYgKG5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9PSAwKQpAQCAtODIyLDE1ICs4MjEsNTYgQEAKIAlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKIH0KIAorc3RhdGljIGludCBhYmlzX25tX3BhcnNlX3N3X2Rlc2NyKGNvbnN0IHVfaW50OF90ICpzd19kZXNjciwgaW50IHN3X2Rlc2NyX2xlbikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIHN3X2Rlc2NyX2RlZiA9IHsKKwkJLmRlZiA9IHsKKwkJCVtOTV9BVFRfRklMRV9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgfSwKKwkJCVtOTV9BVFRfRklMRV9WRVJTSU9OXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCB9LAorCQl9LAorCX07CisKKwl1X2ludDhfdCB0YWc7CisJdV9pbnQxNl90IHRhZ19sZW47CisJY29uc3QgdV9pbnQ4X3QgKnZhbDsKKwlpbnQgb2ZzID0gMCwgbGVuOworCisJLyogQ2xhc3NpYyBUTFYgcGFyc2luZyBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIFNXX0RFU0NSIGJlY2F1c2Ugb2YgaXQncworCSAqIG5lc3RlZCBuYXR1cmUgYW5kIHRoZSBmYWN0IHlvdSBoYXZlIHRvIGFzc3VtZSBpdCBjb250YWlucyBvbmx5IHR3byBzdWIKKwkgKiB0YWdzIE5NX0FUVF9GSUxFX1ZFUlNJT04gJiBOTV9BVFRfRklMRV9JRCB0byBwYXJzZSBpdCAqLworCisJaWYgKHN3X2Rlc2NyWzBdICE9IE5NX0FUVF9TV19ERVNDUikgeworCQlERUJVR1AoRE5NLCAiU1dfREVTQ1IgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJb2ZzICs9IDE7CisKKwlsZW4gPSB0bHZfcGFyc2Vfb25lKCZ0YWcsICZ0YWdfbGVuLCAmdmFsLAorCQkmc3dfZGVzY3JfZGVmLCAmc3dfZGVzY3Jbb2ZzXSwgc3dfZGVzY3JfbGVuLW9mcyk7CisJaWYgKGxlbiA8IDAgfHwgKHRhZyAhPSBOTV9BVFRfRklMRV9JRCkpIHsKKwkJREVCVUdQKEROTSwgIkZJTEVfSUQgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtMjsKKwl9CisJb2ZzICs9IGxlbjsKKworCWxlbiA9IHRsdl9wYXJzZV9vbmUoJnRhZywgJnRhZ19sZW4sICZ2YWwsCisJCSZzd19kZXNjcl9kZWYsICZzd19kZXNjcltvZnNdLCBzd19kZXNjcl9sZW4tb2ZzKTsKKwlpZiAobGVuIDwgMCB8fCAodGFnICE9IE5NX0FUVF9GSUxFX1ZFUlNJT04pKSB7CisJCURFQlVHUChETk0sICJGSUxFX1ZFUlNJT04gYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtMzsKKwl9CisJb2ZzICs9IGxlbjsKKworCXJldHVybiBvZnM7Cit9CisKIHN0YXRpYyBpbnQgYWJpc19ubV9yeF9zd19hY3RfcmVxKHN0cnVjdCBtc2diICptYikKIHsKIAlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CiAJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CiAJc3RydWN0IHRsdl9wYXJzZWQgdHA7CiAJY29uc3QgdV9pbnQ4X3QgKnN3X2NvbmZpZzsKLQlpbnQgc3dfY29uZmlnX2xlbjsKLQlpbnQgZmlsZV9pZF9sZW47Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBzd19jb25maWdfbGVuLCBzd19kZXNjcl9sZW47CiAKIAlkZWJ1Z3BfZm9oKGZvaCk7CiAKQEAgLTg1NCwyMCArODk0LDE2IEBACiAJCURFQlVHUChETk0sICJGb3VuZCBTVyBjb25maWc6ICVzXG4iLCBoZXhkdW1wKHN3X2NvbmZpZywgc3dfY29uZmlnX2xlbikpOwogCX0KIAotCWlmIChzd19jb25maWdbMF0gIT0gTk1fQVRUX1NXX0RFU0NSKQotCQlERUJVR1AoRE5NLCAiU1dfREVTQ1IgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7Ci0JaWYgKHN3X2NvbmZpZ1sxXSAhPSBOTV9BVFRfRklMRV9JRCkKLQkJREVCVUdQKEROTSwgIkZJTEVfSUQgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7Ci0JZmlsZV9pZF9sZW4gPSBzd19jb25maWdbMl0gKiAyNTYgKyBzd19jb25maWdbM107CisJCS8qIFVzZSB0aGUgZmlyc3QgU1dfREVTQ1IgcHJlc2VudCBpbiBTVyBjb25maWcgKi8KKwlzd19kZXNjcl9sZW4gPSBhYmlzX25tX3BhcnNlX3N3X2Rlc2NyKHN3X2NvbmZpZywgc3dfY29uZmlnX2xlbik7CisJaWYgKHN3X2Rlc2NyX2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOwogCi0JLyogQXNzdW1lcyBmaXJzdCBTVyBmaWxlIGluIGxpc3QgaXMgdGhlIG9uZSB0byBiZSBhY3RpdmF0ZWQgKi8KLQkvKiBzd19jb25maWcgKyA0IHRvIHNraXAgb3ZlciAyIGF0dHJpYnV0ZSBJRCBieXRlcyBhbmQgMTYtYml0IGxlbmd0aCBmaWVsZCAqLwogCXJldHVybiBpcGFjY19zd19hY3RpdmF0ZShtYi0+dHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAogCQkJCSBmb2gtPm9ial9pbnN0LmJ0c19uciwKIAkJCQkgZm9oLT5vYmpfaW5zdC50cnhfbnIsCiAJCQkJIGZvaC0+b2JqX2luc3QudHNfbnIsCi0JCQkJIHN3X2NvbmZpZyArIDQsCi0JCQkJIGZpbGVfaWRfbGVuKTsKKwkJCQkgc3dfY29uZmlnLCBzd19kZXNjcl9sZW4pOwogfQogCiAvKiBSZWNlaXZlIGEgQ0hBTkdFX0FETV9TVEFURV9BQ0ssIHBhcnNlIHRoZSBUTFYgYW5kIHVwZGF0ZSBsb2NhbCBzdGF0ZSAqLwpAQCAtOTM4LDcgKzk3NCw3IEBACiAKIAkJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOwogCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKLQkJCURFQlVHUEMoRE5NLCAiQ0FVU0U9JXNcbiIsIAorCQkJREVCVUdQQyhETk0sICJDQVVTRT0lc1xuIiwKIAkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOwogCQllbHNlCiAJCQlERUJVR1BDKEROTSwgIlxuIik7CkBAIC0xMTAyLDYgKzExMzgsNyBAQAogCiBzdHJ1Y3QgYWJpc19ubV9zdyB7CiAJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgdHJ4X25yOwogCWdzbV9jYmZuICpjYmZuOwogCXZvaWQgKmNiX2RhdGE7CiAJaW50IGZvcmNlZDsKQEAgLTEzNDksNyArMTM4Niw3IEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJLyogcmVhZCBmaXJzdCBsaW5lIGFuZCBwYXJzZSBmaWxlIElEIGFuZCBWRVJTSU9OICovCi0JCXJjID0gZnNjYW5mKHN3LT5zdHJlYW0sICJAKCMpJTEyczolODBzXHJcbiIsIAorCQlyYyA9IGZzY2FuZihzdy0+c3RyZWFtLCAiQCgjKSUxMnM6JTgwc1xyXG4iLAogCQkJICAgIGZpbGVfaWQsIGZpbGVfdmVyc2lvbik7CiAJCWlmIChyYyAhPSAyKSB7CiAJCQlwZXJyb3IoInBhcnNpbmcgaGVhZGVyIGxpbmUgb2Ygc29mdHdhcmUgZmlsZSIpOwpAQCAtMTU1NSw3ICsxNTkyLDcgQEAKIH0KIAogLyogTG9hZCB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLwotaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWQoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHRyeF9uciwgY29uc3QgY2hhciAqZm5hbWUsCiAJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLAogCQkJICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSkKIHsKQEAgLTE1NjksNiArMTYwNiw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlzdy0+YnRzID0gYnRzOworCXN3LT50cnhfbnIgPSB0cnhfbnI7CiAKIAlzd2l0Y2ggKGJ0cy0+dHlwZSkgewogCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CkBAIC0xNTc5LDggKzE2MTcsOCBAQAogCQlicmVhazsKIAljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgogCQlzdy0+b2JqX2NsYXNzID0gTk1fT0NfQkFTRUJfVFJBTlNDOwotCQlzdy0+b2JqX2luc3RhbmNlWzBdID0gMHgwMDsKLQkJc3ctPm9ial9pbnN0YW5jZVsxXSA9IDB4MDA7CisJCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSBzdy0+YnRzLT5ucjsKKwkJc3ctPm9ial9pbnN0YW5jZVsxXSA9IHN3LT50cnhfbnI7CiAJCXN3LT5vYmpfaW5zdGFuY2VbMl0gPSAweGZmOwogCQlicmVhazsKIAljYXNlIEdTTV9CVFNfVFlQRV9VTktOT1dOOgpAQCAtMjIzMyw3ICsyMjcxLDcgQEAKIH0KIAogLyogbGlrZSBhYmlzX25tX2Nvbm5fdGVycl90cmFmICsgc2V0X3RlaSAqLwotaW50IGFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydCwgCitpbnQgYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0LAogCQkJICB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwKIAkJCSAgdV9pbnQ4X3QgdGVpKQogewpAQCAtMjUxNCw3ICsyNTUyLDcgQEAKIAkJZmxlID0gZmxfZGVxdWV1ZSgmYnMxMV9zdy0+ZmlsZV9saXN0KTsKIAkJaWYgKGZsZSkgewogCQkJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCi0JCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChiczExX3N3LT5idHMsIGZsZS0+Zm5hbWUsCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChiczExX3N3LT5idHMsIDB4ZmYsIGZsZS0+Zm5hbWUsCiAJCQkJCQkgICBiczExX3N3LT53aW5fc2l6ZSwKIAkJCQkJCSAgIGJzMTFfc3ctPmZvcmNlZCwKIAkJCQkJCSAgICZiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKQEAgLTI1NzAsNyArMjYwOCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCi0JcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoYnRzLCBmbGUtPmZuYW1lLCB3aW5fc2l6ZSwgZm9yY2VkLAorCXJjID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkKGJ0cywgMHhmZiwgZmxlLT5mbmFtZSwgd2luX3NpemUsIGZvcmNlZCwKIAkJCQkgICBiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKIAl0YWxsb2NfZnJlZShmbGUpOwogCXJldHVybiByYzsKQEAgLTI1OTUsNyArMjYzMyw3IEBACiAJTk1fQVRUX1NXX0RFU0NSLCBOTV9BVFRfR0VUX0FSSSB9OwogI2VuZGlmCiAJCi1zdGF0aWMgdV9pbnQ4X3QgcmVxX2F0dHJbXSA9IHsgCitzdGF0aWMgdV9pbnQ4X3QgcmVxX2F0dHJbXSA9IHsKIAlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQVZBSUxfU1RBVFVTLCAweGE4LCBOTV9BVFRfT1BFUl9TVEFURSwKIAkweGQ1LCAweGExLCBOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTywgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8sCiAJMHg0MiwgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwsIE5NX0FUVF9CUzExX1BMTCB9OwpAQCAtMjY3NCwxMSArMjcxMiwxMSBAQAogCQlERUJVR1BDKEROTSwgIlJTTCBDT05ORUNUIEFDSyAiKTsKIAkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVApKQogCQkJREVCVUdQQyhETk0sICJJUD0lcyAiLAotCQkJCWluZXRfbnRvYSgqKChzdHJ1Y3QgaW5fYWRkciAqKSAKKwkJCQlpbmV0X250b2EoKigoc3RydWN0IGluX2FkZHIgKikKIAkJCQkJVExWUF9WQUwoJnRwLCBOTV9BVFRfSVBBQ0NfRFNUX0lQKSkpKTsKIAkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCkpCiAJCQlERUJVR1BDKEROTSwgIlBPUlQ9JXUgIiwKLQkJCQludG9ocygqKCh1X2ludDE2X3QgKikgCisJCQkJbnRvaHMoKigodV9pbnQxNl90ICopCiAJCQkJCVRMVlBfVkFMKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUKSkpKTsKIAkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKQogCQkJREVCVUdQQyhETk0sICJTVFJFQU09MHglMDJ4ICIsCkBAIC0yNjg4LDcgKzI3MjYsNyBAQAogCWNhc2UgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfTkFDSzoKIAkJTE9HUChETk0sIExPR0xfRVJST1IsICJSU0wgQ09OTkVDVCBOQUNLICIpOwogCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKLQkJCURFQlVHUEMoRE5NLCAiIENBVVNFPSVzXG4iLCAKKwkJCURFQlVHUEMoRE5NLCAiIENBVVNFPSVzXG4iLAogCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CiAJCWVsc2UKIAkJCURFQlVHUEMoRE5NLCAiXG4iKTsKQEAgLTI3MDAsNyArMjczOCw3IEBACiAJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0s6CiAJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiU0VUIE5WQVRUUiBOQUNLICIpOwogCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKLQkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwgCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICIgQ0FVU0U9JXNcbiIsCiAJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKIAkJZWxzZQogCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiXG4iKTsKQEAgLTI3MTIsNyArMjc1MCw3IEBACiAJY2FzZSBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0s6CiAJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIkdFVCBOVkFUVFIgTkFDSyAiKTsKIAkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCi0JCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICIgQ0FVU0U9JXNcbiIsIAorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLAogCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CiAJCWVsc2UKIAkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlxuIik7CkBAIC0yNzIzLDcgKzI3NjEsNyBAQAogCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX0FUVFJfTkFDSzoKIAkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiU0VUIEFUVFIgTkFDSyAiKTsKIAkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCi0JCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICIgQ0FVU0U9JXNcbiIsIAorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLAogCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CiAJCWVsc2UKIAkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlxuIik7CkBAIC0yNzM4LDEyICsyNzc2LDEyIEBACiAJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLOgogCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLOgogCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLOgotCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLnRyeCA9IGdzbV9idHNfdHJ4X2J5X25yKG1zZy0+dHJ4LT5idHMsIGZvaC0+b2JqX2luc3QudHJ4X25yKTsKIAkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKIAkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX05BQ0ssICZzaWduYWwpOwogCQlicmVhazsKIAljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgotCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLnRyeCA9IGdzbV9idHNfdHJ4X2J5X25yKG1zZy0+dHJ4LT5idHMsIGZvaC0+b2JqX2luc3QudHJ4X25yKTsKIAkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKIAkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX0FDSywgJnNpZ25hbCk7CiAJCWJyZWFrOwpAQCAtMjgwMCw3ICsyODM4LDcgQEAKIAkJCQkgICAgYXR0cl9sZW4pOwogfQogCi1pbnQgYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgCitpbnQgYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKIAkJCQkgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3Qgc3RyZWFtKQogewogCXN0cnVjdCBpbl9hZGRyIGlhOwpAQCAtMjgyOSw5ICsyODY3LDE2IEBACiB9CiAKIC8qIHJlc3RhcnQgLyByZWJvb3QgYW4gaXAuYWNjZXNzIG5hbm9CVFMgKi8KLWludCBhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cykKK2ludCBhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCiB7Ci0JcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0lQQUNDX1JFU1RBUlQpOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0lQQUNDX1JFU1RBUlQsIE5NX09DX0JBU0VCX1RSQU5TQywKKwkJCXRyeC0+YnRzLT5uciwgdHJ4LT5uciwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOwogfQogCiBpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9hYmlzX25tX3Z0eS5jIGIvb3BlbmJzYy9zcmMvYWJpc19ubV92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmVjYTNiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYWJpc19ubV92dHkuYwpAQCAtMCwwICsxLDE5OCBAQAorLyogVlRZIGludGVyZmFjZSBmb3IgQS1iaXMgT01MIChOZXRvd3JrIE1hbmFnZW1lbnQpICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorCitleHRlcm4gc3RydWN0IGdzbV9uZXR3b3JrICpic2NfZ3NtbmV0OworCitzdGF0aWMgc3RydWN0IGNtZF9ub2RlIG9tbF9ub2RlID0geworCU9NTF9OT0RFLAorCSIlcyhvbWwpIyAiLAorCTEsCit9OworCitzdHJ1Y3Qgb21sX25vZGVfc3RhdGUgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJdWludDhfdCBvYmpfY2xhc3M7CisJdWludDhfdCBvYmpfaW5zdFszXTsKK307CisKK3N0YXRpYyBpbnQgZHVtbXlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnYpCit7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBGSVhNRTogYXV0by1nZW5lcmF0ZSB0aG9zZSBzdHJpbmdzIGZyb20gdGhlIHZhbHVlX3N0cmluZyBsaXN0cyAqLworI2RlZmluZSBOTV9PQkpDTEFTU19WVFkgIihzaXRlLW1hbmFnZXJ8YnRzfHJhZGlvLWNhcnJpZXJ8YmFzZWJhbmQtdHJhbnNjZWl2ZXJ8Y2hhbm5lbHxhZGpjfGhhbmRvdmVyfHBvd2VyLWNvbnRvcmx8YnRzZXxyYWNrfHRlc3R8ZW52YWJ0c2V8YnBvcnR8Z3Bycy1uc2V8Z3Bycy1jZWxsfGdwcnMtbnN2Y3xzaWVtZW5zaHcpIgorI2RlZmluZSBOTV9PQkpDTEFTU19WVFlfSEVMUCAiRklYTUUiCisKK0RFRlVOKG9tbF9jbGFzc19pbnN0LCBvbWxfY2xhc3NfaW5zdF9jbWQsCisJImJ0cyA8MC0yNTU+IG9tbCBjbGFzcyAiIE5NX09CSkNMQVNTX1ZUWQorCQkJCQkiIGluc3RhbmNlIDwwLTI1NT4gPDAtMjU1PiA8MC0yNTU+IiwKKwkiQlRTIHJlbGF0ZWQgY29tbWFuZHNcbiIgIkJUUyBOdW1iZXJcbiIKKwkiTWFuaXB1bGF0ZSB0aGUgT01MIG1hbmFnZWQgb2JqZWN0c1xuIgorCSJPYmplY3QgQ2xhc3NcbiIgCU5NX09CSkNMQVNTX1ZUWV9IRUxQCisJIk9iamVjdCBJbnN0YW5jZVxuIiAiQlRTIE51bWJlclxuIiAiVFJYIE51bWJlclxuIiAiVFMgTnVtYmVyXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IG9tbF9ub2RlX3N0YXRlICpvbXM7CisJaW50IGJ0c19uciA9IGF0b2koYXJndlswXSk7CisKKwlidHMgPSBnc21fYnRzX251bShic2NfZ3NtbmV0LCBidHNfbnIpOworCWlmICghYnRzKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3VjaCBCVFMgKCVkKSVzIiwgYnRzX25yLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlvbXMgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBvbWxfbm9kZV9zdGF0ZSk7CisJaWYgKCFvbXMpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCW9tcy0+YnRzID0gYnRzOworCW9tcy0+b2JqX2NsYXNzID0gZ2V0X3N0cmluZ192YWx1ZShhYmlzX25tX29ial9jbGFzc19uYW1lcywgYXJndlsxXSk7CisJb21zLT5vYmpfaW5zdFswXSA9IGF0b2koYXJndlsyXSk7CisJb21zLT5vYmpfaW5zdFsxXSA9IGF0b2koYXJndlszXSk7CisJb21zLT5vYmpfaW5zdFsyXSA9IGF0b2koYXJndls0XSk7CisKKwl2dHktPmluZGV4ID0gb21zOworCXZ0eS0+bm9kZSA9IE9NTF9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworCit9CisKK0RFRlVOKG9tbF9jbGFzc251bV9pbnN0LCBvbWxfY2xhc3NudW1faW5zdF9jbWQsCisJImJ0cyA8MC0yNTU+IG9tbCBjbGFzcyA8MC0yNTU+IGluc3RhbmNlIDwwLTI1NT4gPDAtMjU1PiA8MC0yNTU+IiwKKwkiQlRTIHJlbGF0ZWQgY29tbWFuZHNcbiIgIkJUUyBOdW1iZXJcbiIKKwkiTWFuaXB1bGF0ZSB0aGUgT01MIG1hbmFnZWQgb2JqZWN0c1xuIgorCSJPYmplY3QgQ2xhc3NcbiIgIk9iamVjdCBDbGFzc1xuIgorCSJPYmplY3QgSW5zdGFuY2VcbiIgIkJUUyBOdW1iZXJcbiIgIlRSWCBOdW1iZXJcbiIgIlRTIE51bWJlclxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBvbWxfbm9kZV9zdGF0ZSAqb21zOworCWludCBidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCisJYnRzID0gZ3NtX2J0c19udW0oYnNjX2dzbW5ldCwgYnRzX25yKTsKKwlpZiAoIWJ0cykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1Y2ggQlRTICglZCklcyIsIGJ0c19uciwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJb21zID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3Qgb21sX25vZGVfc3RhdGUpOworCWlmICghb21zKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwlvbXMtPmJ0cyA9IGJ0czsKKwlvbXMtPm9ial9jbGFzcyA9IGF0b2koYXJndlsxXSk7CisJb21zLT5vYmpfaW5zdFswXSA9IGF0b2koYXJndlsyXSk7CisJb21zLT5vYmpfaW5zdFsxXSA9IGF0b2koYXJndlszXSk7CisJb21zLT5vYmpfaW5zdFsyXSA9IGF0b2koYXJndls0XSk7CisKKwl2dHktPmluZGV4ID0gb21zOworCXZ0eS0+bm9kZSA9IE9NTF9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihvbWxfYXR0cmliX2dldCwgb21sX2F0dHJpYl9nZXRfY21kLAorCSJhdHRyaWJ1dGUgZ2V0IDwwLTI1NT4iLAorCSJPTUwgQXR0cmlidXRlIEFjdGlvbnNcbiIgIkdldCBhIHNpbmdsZSBPTUwgQXR0cmlidXRlXG4iCisJIk9NTCBBdHRyaWJ1dGUgTnVtYmVyXG4iKQoreworCXN0cnVjdCBvbWxfbm9kZV9zdGF0ZSAqb21zID0gdnR5LT5pbmRleDsKKworCS8qIEZJWE1FICovCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihvbWxfYXR0cmliX3NldCwgb21sX2F0dHJpYl9zZXRfY21kLAorCSJhdHRyaWJ1dGUgc2V0IDwwLTI1NT4gLkhFWCIsCisJIk9NTCBBdHRyaWJ1dGUgQWN0aW9uc1xuIiAiU2V0IGEgc2luZ2xlIE9NTCBBdHRyaWJ1dGVcbiIKKwkiT01MIEF0dHJpYnV0ZSBOdW1iZXJcbiIpCit7CisJc3RydWN0IG9tbF9ub2RlX3N0YXRlICpvbXMgPSB2dHktPmluZGV4OworCisJLyogRklYTUUgKi8KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG9tbF9jaGdfYWRtX3N0YXRlLCBvbWxfY2hnX2FkbV9zdGF0ZV9jbWQsCisJImNoYW5nZS1hZG0tc3RhdGUgKGxvY2tlZHx1bmxvY2tlZHxzaHV0ZG93bnxudWxsKSIsCisJIkNoYW5nZSB0aGUgQWRtaW5pc3RyYXRpdmUgU3RhdGVcbiIKKwkiTG9ja2VkXG4iICJVbmxvY2tlZFxuIiAiU2h1dGRvd25cbiIgIk5VTExcbiIpCit7CisJc3RydWN0IG9tbF9ub2RlX3N0YXRlICpvbXMgPSB2dHktPmluZGV4OworCWVudW0gYWJpc19ubV9hZG1fc3RhdGUgc3RhdGU7CisKKwlzdGF0ZSA9IGdldF9zdHJpbmdfdmFsdWUoYWJpc19ubV9hZG1fc3RhdGVfbmFtZXMsIGFyZ3ZbMF0pOworCisJYWJpc19ubV9jaGdfYWRtX3N0YXRlKG9tcy0+YnRzLCBvbXMtPm9ial9jbGFzcywgb21zLT5vYmpfaW5zdFswXSwKKwkJCSAgICAgIG9tcy0+b2JqX2luc3RbMV0sIG9tcy0+b2JqX2luc3RbMl0sIHN0YXRlKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4ob21sX29wc3RhcnQsIG9tbF9vcHN0YXJ0X2NtZCwKKwkib3BzdGFydCIsICJTZW5kIGFuIE9QU1RBUlQgbWVzc2FnZSB0byB0aGUgb2JqZWN0IikKK3sKKwlzdHJ1Y3Qgb21sX25vZGVfc3RhdGUgKm9tcyA9IHZ0eS0+aW5kZXg7CisKKwlhYmlzX25tX29wc3RhcnQob21zLT5idHMsIG9tcy0+b2JqX2NsYXNzLCBvbXMtPm9ial9pbnN0WzBdLAorCQkJb21zLT5vYmpfaW5zdFsxXSwgb21zLT5vYmpfaW5zdFsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBhYmlzX25tX3Z0eV9pbml0KHZvaWQpCit7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmb21sX2NsYXNzX2luc3RfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZvbWxfY2xhc3NudW1faW5zdF9jbWQpOworCWluc3RhbGxfbm9kZSgmb21sX25vZGUsIGR1bW15X2NvbmZpZ193cml0ZSk7CisKKwlpbnN0YWxsX2RlZmF1bHQoT01MX05PREUpOworCWluc3RhbGxfZWxlbWVudChPTUxfTk9ERSwgJm91cm5vZGVfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChPTUxfTk9ERSwgJm9tbF9hdHRyaWJfZ2V0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE9NTF9OT0RFLCAmb21sX2F0dHJpYl9zZXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoT01MX05PREUsICZvbWxfY2hnX2FkbV9zdGF0ZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChPTUxfTk9ERSwgJm9tbF9vcHN0YXJ0X2NtZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2FiaXNfcnNsLmMgYi9vcGVuYnNjL3NyYy9hYmlzX3JzbC5jCmluZGV4IGU3ODQ0YWYuLjQ1MWM4MGQgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL2FiaXNfcnNsLmMKKysrIGIvb3BlbmJzYy9zcmMvYWJpc19yc2wuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQogICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KIAogLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgpAQCAtMTE4LDggKzExOCw4IEBACiAJfQogCiAJbGNoYW4gPSAmdHMtPmxjaGFuW2xjaF9pZHhdOwotCWRlYnVnX3NldF9jb250ZXh0KEJTQ19DVFhfTENIQU4sIGxjaGFuKTsKLQlkZWJ1Z19zZXRfY29udGV4dChCU0NfQ1RYX1NVQlNDUiwgbGNoYW4tPnN1YnNjcik7CisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTENIQU4sIGxjaGFuKTsKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9TVUJTQ1IsIGxjaGFuLT5jb25uLnN1YnNjcik7CiAKIAlyZXR1cm4gbGNoYW47CiB9CkBAIC0yMjIsNyArMjIyLDcgQEAKIAogCUxPR1BDKERSU0wsIGx2bCwgIkNBVVNFPTB4JTAyeCglcykgIiwKIAkJY2F1c2VfdlswXSwgcnNsX2Vycl9uYW1lKGNhdXNlX3ZbMF0pKTsKLQlmb3IgKGkgPSAxOyBpIDwgY2F1c2VfbGVuLTE7IGkrKykgCisJZm9yIChpID0gMTsgaSA8IGNhdXNlX2xlbi0xOyBpKyspCiAJCUxPR1BDKERSU0wsIGx2bCwgIiUwMnggIiwgY2F1c2VfdltpXSk7CiB9CiAKQEAgLTI0NSw3ICsyNDUsNyBAQAogCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7CiB9CiAKLWludCByc2xfc2FjY2hfZmlsbGluZyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwgCitpbnQgcnNsX3NhY2NoX2ZpbGxpbmcoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsCiAJCSAgICAgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKQogewogCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpjaDsKQEAgLTQxNiw3ICs0MTYsNyBAQAogfQogI2VuZGlmCiAKLWludCByc2xfY2hhbl9hY3RpdmF0ZV9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYWN0X3R5cGUsIAoraW50IHJzbF9jaGFuX2FjdGl2YXRlX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBhY3RfdHlwZSwKIAkJCSAgICB1X2ludDhfdCB0YSwgdV9pbnQ4X3QgaG9fcmVmKQogewogCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOwpAQCAtNTY4LDEyICs1NjgsMzMgQEAKIAlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOwogfQogCitzdGF0aWMgdm9pZCBlcnJvcl90aW1lb3V0X2NiKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBkYXRhOworCWlmIChsY2hhbi0+c3RhdGUgIT0gTENIQU5fU19SRUxfRVJSKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIGVycm9yIHRpbWVvdXQgYnV0IG5vdCBpbiBlcnJvciBzdGF0ZTogJWRcbiIsCisJCSAgICAgZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBsY2hhbi0+c3RhdGUpOworCQlyZXR1cm47CisJfQorCisJLyogZ28gYmFjayB0byB0aGUgbm9uZSBzdGF0ZSAqLworCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBpcyBiYWNrIGluIG9wZXJhdGlvbi5cbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisJcnNsX2xjaGFuX3NldF9zdGF0ZShsY2hhbiwgTENIQU5fU19OT05FKTsKK30KKwogLyogQ2hhcHRlciA4LjQuMTQgLyA0Ljc6IFRlbGwgQlRTIHRvIHJlbGVhc2UgdGhlIHJhZGlvIGNoYW5uZWwgKi8KLWludCByc2xfcmZfY2hhbl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQorc3RhdGljIGludCByc2xfcmZfY2hhbl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgZXJyb3IpCiB7CiAJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7Ci0Jc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IG1zZ2IgKm1zZzsKIAorCWlmIChsY2hhbi0+c3RhdGUgPT0gTENIQU5fU19SRUxfRVJSKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBpcyBpbiBlcnJvciBzdGF0ZSBub3Qgc2VuZGluZyByZWxlYXNlLlxuIiwKKwkJICAgICBnc21fbGNoYW5fbmFtZShsY2hhbikpOworCQlyZXR1cm4gLTE7CisJfQorCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKIAlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOwogCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfUkZfQ0hBTl9SRUwpOwogCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CkBAIC01ODEsNyArNjAyLDIwIEBACiAJbXNnLT5sY2hhbiA9IGxjaGFuOwogCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CiAKLQlERUJVR1AoRFJTTCwgIiVzIFJGIENoYW5uZWwgUmVsZWFzZSBDTURcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisJREVCVUdQKERSU0wsICIlcyBSRiBDaGFubmVsIFJlbGVhc2UgQ01EIGR1ZSBlcnJvciAlZFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBlcnJvcik7CisKKwlpZiAoZXJyb3IpIHsKKwkJLyoKKwkJICogdGhlIG5hbm9CVFMgc2VuZHMgUkxMIHJlbGVhc2UgaW5kaWNhdGlvbnMgYWZ0ZXIgdGhlIGNoYW5uZWwgcmVsZWFzZS4gVGhpcyBjYW4KKwkJICogYmUgYSBwcm9ibGVtIHdoZW4gd2UgaGF2ZSByZWFzc2lnbmVkIHRoZSBjaGFubmVsIHRvIHNvbWVvbmUgZWxzZSBhbmQgdGhlbiBjYW4KKwkJICogbm90IGZpZ3VyZSBvdXQgd2hvIHVzZWQgdGhpcyBjaGFubmVsLgorCQkgKi8KKwkJcnNsX2xjaGFuX3NldF9zdGF0ZShsY2hhbiwgTENIQU5fU19SRUxfRVJSKTsKKwkJbGNoYW4tPmVycm9yX3RpbWVyLmRhdGEgPSBsY2hhbjsKKwkJbGNoYW4tPmVycm9yX3RpbWVyLmNiID0gZXJyb3JfdGltZW91dF9jYjsKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+ZXJyb3JfdGltZXIsCisJCQkJICAgbXNnLT50cngtPmJ0cy0+bmV0d29yay0+VDMxMTEgKyAyLCAwKTsKKwl9CiAKIAkvKiBCVFMgd2lsbCByZXNwb25kIGJ5IFJGIENIQU4gUkVMIEFDSyAqLwogCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7CkBAIC03MTgsMTYgKzc1MiwxNiBAQAogICAgUkVMRUFTRSBDT05GSVJNLCB3aGljaCB3ZSBpbiB0dXJuIHVzZSB0byB0cmlnZ2VyIFJTTCBDSEFOTkVMIFJFTEVBU0UsCiAgICB3aGljaCBpbiB0dXJuIGlzIGFja25vd2xlZGdlZCBieSBSU0wgQ0hBTk5FTCBSRUxFQVNFIEFDSywgd2hpY2ggY2FsbHMKICAgIGxjaGFuX2ZyZWUoKSAqLwotaW50IHJzbF9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpCitpbnQgcnNsX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwgdV9pbnQ4X3QgcmVhc29uKQogewogCiAJc3RydWN0IG1zZ2IgKm1zZzsKIAogCW1zZyA9IHJzbF9ybGxfc2ltcGxlKFJTTF9NVF9SRUxfUkVRLCBsY2hhbjJjaGFuX25yKGxjaGFuKSwKIAkJCSAgICAgbGlua19pZCwgMCk7Ci0JbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfUkVMRUFTRV9NT0RFLCAwKTsJLyogbm9ybWFsIHJlbGVhc2UgKi8KKwkvKiAwIGlzIG5vcm1hbCByZWxlYXNlLCAxIGlzIGxvY2FsIGVuZCAqLworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1JFTEVBU0VfTU9ERSwgcmVhc29uKTsKIAotCWxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfUkVMX1JFUTsKIAkvKiBGSVhNRTogc3RhcnQgc29tZSB0aW1lciBpbiBjYXNlIHdlIGRvbid0IHJlY2VpdmUgYSBSRUwgQUNLID8gKi8KIAogCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CkBAIC03MzUsNiArNzY5LDEyIEBACiAJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKIH0KIAoraW50IHJzbF9sY2hhbl9zZXRfc3RhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCBzdGF0ZSkKK3sKKwlsY2hhbi0+c3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gMDsKK30KKwogLyogQ2hhcHRlciA4LjQuMjogQ2hhbm5lbCBBY3RpdmF0ZSBBY2tub3dsZWRnZSAqLwogc3RhdGljIGludCByc2xfcnhfY2hhbl9hY3RfYWNrKHN0cnVjdCBtc2diICptc2cpCiB7CkBAIC03NDksNyArNzg5LDcgQEAKIAkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENIQU4gQUNUIEFDSywgYnV0IHN0YXRlICVzXG4iLAogCQkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbiksCiAJCQlnc21fbGNoYW5zX25hbWUobXNnLT5sY2hhbi0+c3RhdGUpKTsKLQltc2ctPmxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfQUNUSVZFOworCXJzbF9sY2hhbl9zZXRfc3RhdGUobXNnLT5sY2hhbiwgTENIQU5fU19BQ1RJVkUpOwogCiAJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0FDVElWQVRFX0FDSywgbXNnLT5sY2hhbik7CiAKQEAgLTc3NSwxMCArODE1LDEwIEBACiAJCXByaW50X3JzbF9jYXVzZShMT0dMX0VSUk9SLCBjYXVzZSwKIAkJCQlUTFZQX0xFTigmdHAsIFJTTF9JRV9DQVVTRSkpOwogCQlpZiAoKmNhdXNlICE9IFJTTF9FUlJfUkNIX0FMUl9BQ1RWX0FMTE9DKQotCQkJbXNnLT5sY2hhbi0+c3RhdGUgPSBMQ0hBTl9TX05PTkU7CisJCQlyc2xfbGNoYW5fc2V0X3N0YXRlKG1zZy0+bGNoYW4sIExDSEFOX1NfTk9ORSk7CiAJfSBlbHNlCi0JCW1zZy0+bGNoYW4tPnN0YXRlID0gTENIQU5fU19OT05FOwotIAorCQlyc2xfbGNoYW5fc2V0X3N0YXRlKG1zZy0+bGNoYW4sIExDSEFOX1NfTk9ORSk7CisKIAlMT0dQQyhEUlNMLCBMT0dMX0VSUk9SLCAiXG4iKTsKIAogCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9BQ1RJVkFURV9OQUNLLCBtc2ctPmxjaGFuKTsKQEAgLTgwNSw3ICs4NDUsOCBAQAogCiAJTE9HUEMoRFJTTCwgTE9HTF9OT1RJQ0UsICJcbiIpOwogCS8qIEZJWE1FOiBvbmx5IGZyZWUgaXQgYWZ0ZXIgY2hhbm5lbCByZWxlYXNlIEFDSyAqLwotCXJldHVybiByc2xfcmZfY2hhbl9yZWxlYXNlKG1zZy0+bGNoYW4pOworCWNvdW50ZXJfaW5jKG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuY2hhbi5yZl9mYWlsKTsKKwlyZXR1cm4gcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuLCAxKTsKIH0KIAogc3RhdGljIHZvaWQgcHJpbnRfbWVhc19yZXBfdW5pKHN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyICptcnUsCkBAIC05NzcsMTEgKzEwMTgsMTQgQEAKIAkJYnJlYWs7CiAJY2FzZSBSU0xfTVRfUkZfQ0hBTl9SRUxfQUNLOgogCQlERUJVR1AoRFJTTCwgIiVzIFJGIENIQU5ORUwgUkVMRUFTRSBBQ0tcbiIsIHRzX25hbWUpOwotCQlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19SRUxfUkVRKQorCQlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19SRUxfUkVRICYmIG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfUkVMX0VSUikKIAkJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBDSEFOIFJFTCBBQ0sgYnV0IHN0YXRlICVzXG4iLAogCQkJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pLAogCQkJCWdzbV9sY2hhbnNfbmFtZShtc2ctPmxjaGFuLT5zdGF0ZSkpOwotCQltc2ctPmxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfTk9ORTsKKwkJYnNjX2RlbF90aW1lcigmbXNnLT5sY2hhbi0+VDMxMTEpOworCQkvKiB3ZSBoYXZlIGFuIGVycm9yIHRpbWVyIHBlbmRpbmcgdG8gcmVsZWFzZSB0aGF0ICovCisJCWlmIChtc2ctPmxjaGFuLT5zdGF0ZSAhPSBMQ0hBTl9TX1JFTF9FUlIpCisJCQlyc2xfbGNoYW5fc2V0X3N0YXRlKG1zZy0+bGNoYW4sIExDSEFOX1NfTk9ORSk7CiAJCWxjaGFuX2ZyZWUobXNnLT5sY2hhbik7CiAJCWJyZWFrOwogCWNhc2UgUlNMX01UX01PREVfTU9ESUZZX0FDSzoKQEAgLTk5MiwxMiArMTAzNiwxNCBAQAogCQlicmVhazsKIAljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfQUNUX0FDSzoKIAkJREVCVUdQQyhEUlNMLCAiJXMgSVBBQyBQRENIIEFDVCBBQ0tcbiIsIHRzX25hbWUpOworCQltc2ctPmxjaGFuLT50cy0+ZmxhZ3MgfD0gVFNfRl9QRENIX01PREU7CiAJCWJyZWFrOwogCWNhc2UgUlNMX01UX0lQQUNfUERDSF9BQ1RfTkFDSzoKIAkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQyBQRENIIEFDVCBOQUNLXG4iLCB0c19uYW1lKTsKIAkJYnJlYWs7CiAJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0RFQUNUX0FDSzoKIAkJREVCVUdQKERSU0wsICIlcyBJUEFDIFBEQ0ggREVBQ1QgQUNLXG4iLCB0c19uYW1lKTsKKwkJbXNnLT5sY2hhbi0+dHMtPmZsYWdzICY9IH5UU19GX1BEQ0hfTU9ERTsKIAkJYnJlYWs7CiAJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0RFQUNUX05BQ0s6CiAJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUMgUERDSCBERUFDVCBOQUNLXG4iLCB0c19uYW1lKTsKQEAgLTEwNTQsNyArMTEwMCw3IEBACiAJCS8vREVCVUdQKERSU0wsICIlcyBSRiBSZXNvdXJjZSBJbmRpY2F0aW9uXG4iLCBnc21fdHJ4X25hbWUobXNnLT50cngpKTsKIAkJYnJlYWs7CiAJY2FzZSBSU0xfTVRfT1ZFUkxPQUQ6Ci0JCS8qIGluZGljYXRlIENDQ0ggLyBBQ0NIIC8gcHJvY2Vzc29yIG92ZXJsb2FkICovIAorCQkvKiBpbmRpY2F0ZSBDQ0NIIC8gQUNDSCAvIHByb2Nlc3NvciBvdmVybG9hZCAqLwogCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBDQ0NIL0FDQ0gvQ1BVIE92ZXJsb2FkXG4iLAogCQkgICAgIGdzbV90cnhfbmFtZShtc2ctPnRyeCkpOwogCQlicmVhazsKQEAgLTEwNzEsNyArMTExNywxNSBAQAogewogCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gZGF0YTsKIAotCXJzbF9yZl9jaGFuX3JlbGVhc2UobGNoYW4pOworCXJzbF9yZl9jaGFuX3JlbGVhc2UobGNoYW4sIDEpOworfQorCisvKiBJZiBUMzExMSBleHBpcmVzLCB3ZSB3aWxsIHNlbmQgdGhlIFJGIENoYW5uZWwgUmVxdWVzdCAqLworc3RhdGljIHZvaWQgdDMxMTFfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gZGF0YTsKKworCXJzbF9yZl9jaGFuX3JlbGVhc2UobGNoYW4sIDApOwogfQogCiAvKiBNUyBoYXMgcmVxdWVzdGVkIGEgY2hhbm5lbCBvbiB0aGUgUkFDSCAqLwpAQCAtMTEyMiw3ICsxMTc2LDcgQEAKIAkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIGxjaGFuX2FsbG9jKCkgcmV0dXJuZWQgY2hhbm5lbCAiCiAJCSAgICAgImluIHN0YXRlICVzXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbiksCiAJCSAgICAgZ3NtX2xjaGFuc19uYW1lKGxjaGFuLT5zdGF0ZSkpOwotCWxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfQUNUX1JFUTsKKwlyc2xfbGNoYW5fc2V0X3N0YXRlKGxjaGFuLCBMQ0hBTl9TX0FDVF9SRVEpOwogCiAJdHNfbnVtYmVyID0gbGNoYW4tPnRzLT5ucjsKIAlhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbjsKQEAgLTExNzksNiArMTIzMywxMCBAQAogCXN3aXRjaCAocnNsaC0+ZGF0YVswXSkgewogCWNhc2UgUlNMX0lFX1BBR0lOR19MT0FEOgogCQlwZ19idWZfc3BhY2UgPSByc2xoLT5kYXRhWzFdIDw8IDggfCByc2xoLT5kYXRhWzJdOworCQlpZiAoaXNfaXBhY2Nlc3NfYnRzKG1zZy0+dHJ4LT5idHMpICYmIHBnX2J1Zl9zcGFjZSA9PSAweGZmZmYpIHsKKwkJCS8qIHBhZ2luZyBsb2FkIGJlbG93IGNvbmZpZ3VyZWQgdGhyZXNob2xkLCB1c2UgNTAgYXMgZGVmYXVsdCAqLworCQkJcGdfYnVmX3NwYWNlID0gNTA7CisJCX0KIAkJcGFnaW5nX3VwZGF0ZV9idWZmZXJfc3BhY2UobXNnLT50cngtPmJ0cywgcGdfYnVmX3NwYWNlKTsKIAkJYnJlYWs7CiAJY2FzZSBSU0xfSUVfUkFDSF9MT0FEOgpAQCAtMTIzOCwxMyArMTI5NiwzMSBAQAogCiAJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwgQlNDX1JMTFJfSU5EX0VSUl9JTkQpOwogCi0JaWYgKHJsbV9jYXVzZVsxXSA9PSBSTExfQ0FVU0VfVDIwMF9FWFBJUkVEKQotCQlyZXR1cm4gcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwlpZiAocmxtX2NhdXNlWzFdID09IFJMTF9DQVVTRV9UMjAwX0VYUElSRUQpIHsKKwkJY291bnRlcl9pbmMobXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrLT5zdGF0cy5jaGFuLnJsbF9lcnIpOworCQlyZXR1cm4gcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuLCAxKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAotLyoJRVNUQUJMSVNIIElORElDQVRJT04sIExPQ0FUSU9OIEFSRUEgVVBEQVRFIFJFUVVFU1QgCitzdGF0aWMgdm9pZCByc2xfaGFuZGxlX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpZiAobGNoYW4tPnN0YXRlICE9IExDSEFOX1NfUkVMX1JFUSkKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiUkYgcmVsZWFzZSBvbiAlcyBidXQgc3RhdGUgJXNcbiIsCisJCQlnc21fbGNoYW5fbmFtZShsY2hhbiksCisJCQlnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSk7CisKKworCS8qIHdhaXQgYSBiaXQgdG8gc2VuZCB0aGUgUkYgQ2hhbm5lbCBSZWxlYXNlICovCisJbGNoYW4tPlQzMTExLmNiID0gdDMxMTFfZXhwaXJlZDsKKwlsY2hhbi0+VDMxMTEuZGF0YSA9IGxjaGFuOworCWJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+VDMxMTEsIGJ0cy0+bmV0d29yay0+VDMxMTEsIDApOworfQorCisvKglFU1RBQkxJU0ggSU5ESUNBVElPTiwgTE9DQVRJT04gQVJFQSBVUERBVEUgUkVRVUVTVAogCTB4MDIsIDB4MDYsCiAJMHgwMSwgMHgyMCwKIAkweDAyLCAweDAwLApAQCAtMTI2NCw3ICsxMzQwLDcgQEAKIAlzd2l0Y2ggKHJsbGgtPmMubXNnX3R5cGUpIHsKIAljYXNlIFJTTF9NVF9EQVRBX0lORDoKIAkJREVCVUdQQyhEUkxMLCAiREFUQSBJTkRJQ0FUSU9OXG4iKTsKLQkJaWYgKG1zZ2JfbDJsZW4obXNnKSA+IAorCQlpZiAobXNnYl9sMmxlbihtc2cpID4KIAkJICAgIHNpemVvZihzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkcikgKyBzaXplb2YoKnJsbGgpICYmCiAJCSAgICBybGxoLT5kYXRhWzBdID09IFJTTF9JRV9MM19JTkZPKSB7CiAJCQltc2ctPmwzaCA9ICZybGxoLT5kYXRhWzNdOwpAQCAtMTI3Niw3ICsxMzUyLDcgQEAKIAkJLyogbGNoYW4gaXMgZXN0YWJsaXNoZWQsIHN0b3AgVDMxMDEgKi8KIAkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX01TOwogCQlic2NfZGVsX3RpbWVyKCZtc2ctPmxjaGFuLT5UMzEwMSk7Ci0JCWlmIChtc2diX2wybGVuKG1zZykgPiAKKwkJaWYgKG1zZ2JfbDJsZW4obXNnKSA+CiAJCSAgICBzaXplb2Yoc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIpICsgc2l6ZW9mKCpybGxoKSAmJgogCQkgICAgcmxsaC0+ZGF0YVswXSA9PSBSU0xfSUVfTDNfSU5GTykgewogCQkJbXNnLT5sM2ggPSAmcmxsaC0+ZGF0YVszXTsKQEAgLTEyOTUsMjAgKzEzNzEsMTQgQEAKIAkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX1VOVVNFRDsKIAkJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwKIAkJCQkgIEJTQ19STExSX0lORF9SRUxfSU5EKTsKLQkJLyogd2UgY2FuIG5vdyByZWxlYWUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUy9BYmlzIHNpZGUgKi8KLQkJLyogRklYTUU6IG9mZmljaWFsbHkgd2UgbmVlZCB0byBzdGFydCBUMzExMSBhbmQgd2FpdCBmb3IKLQkJICogc29tZSBncmFjZSBwZXJpb2QgKi8KLQkJcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJcnNsX2hhbmRsZV9yZWxlYXNlKG1zZy0+bGNoYW4pOwogCQlicmVhazsKIAljYXNlIFJTTF9NVF9SRUxfQ09ORjoKIAkJLyogQlRTIGluZm9ybXMgdXMgb2YgaGF2aW5nIHJlY2VpdmVkIFVBIGZyb20gTVMsCiAJCSAqIGluIHJlc3BvbnNlIHRvIERJU0MgdGhhdCB3ZSd2ZSBzZW50IGVhcmxpZXIgKi8KIAkJREVCVUdQQyhEUkxMLCAiUkVMRUFTRSBDT05GSVJNQVRJT05cbiIpOwogCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfVU5VU0VEOwotCQkvKiB3ZSBjYW4gbm93IHJlbGVhZSB0aGUgY2hhbm5lbCBvbiB0aGUgQlRTL0FiaXMgc2lkZSAqLwotCQkvKiBGSVhNRTogb2ZmaWNpYWxseSB3ZSBuZWVkIHRvIHN0YXJ0IFQzMTExIGFuZCB3YWl0IGZvcgotCQkgKiBzb21lIGdyYWNlIHBlcmlvZCAqLwotCQlyc2xfcmZfY2hhbl9yZWxlYXNlKG1zZy0+bGNoYW4pOworCQlyc2xfaGFuZGxlX3JlbGVhc2UobXNnLT5sY2hhbik7CiAJCWJyZWFrOwogCWNhc2UgUlNMX01UX0VSUk9SX0lORDoKIAkJcmMgPSByc2xfcnhfcmxsX2Vycl9pbmQobXNnKTsKQEAgLTEzNjEsNiArMTQzMSw0NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdV9pbnQ4X3QgaXBhX3J0cF9wdF9mb3JfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3dpdGNoIChsY2hhbi0+dGNoX21vZGUpIHsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9WMToKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiBSVFBfUFRfR1NNX0ZVTEw7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQkJcmV0dXJuIFJUUF9QVF9HU01fSEFMRjsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIFJUUF9QVF9HU01fRUZSOworCQkvKiB0aGVyZSdzIG5vIGhhbGYtcmF0ZSBFRlIgKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIFJUUF9QVF9BTVJfRlVMTDsKKwkJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCQlyZXR1cm4gUlRQX1BUX0FNUl9IQUxGOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGRldGVybWluZSBpcC5hY2Nlc3MgcnRwIHBheWxvYWQgdHlwZSBmb3IgIgorCQkidGNoX21vZGUgPT0gMHglMDJ4XG4gJiBsY2hhbl90eXBlID09ICVkIiwKKwkJbGNoYW4tPnRjaF9tb2RlLCBsY2hhbi0+dHlwZSk7CisJcmV0dXJuIDA7Cit9CisKIC8qIGlwLmFjY2VzcyBzcGVjaWZpYyBSU0wgZXh0ZW5zaW9ucyAqLwogc3RhdGljIHZvaWQgaXBhY19wYXJzZV9ydHAoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCB0bHZfcGFyc2VkICp0dikKIHsKQEAgLTE0MjcsMTAgKzE1MzUsMTMgQEAKIAogCS8qIDB4MS0gPT0gcmVjZWl2ZS1vbmx5LCAweC0xID09IEVGUiBjb2RlYyAqLwogCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlID0gMHgxMCB8IGlwYV9zbW9kX3NfZm9yX2xjaGFuKGxjaGFuKTsKKwlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCA9IGlwYV9ydHBfcHRfZm9yX2xjaGFuKGxjaGFuKTsKIAltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRCwgbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQpOwogCi0JREVCVUdQKERSU0wsICIlcyBJUEFDX0JJTkQgc3BlZWNoX21vZGU9MHglMDJ4XG4iLAotCQlnc21fbGNoYW5fbmFtZShsY2hhbiksIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwlERUJVR1AoRFJTTCwgIiVzIElQQUNfQklORCBzcGVlY2hfbW9kZT0weCUwMnggUlRQX1BBWUxPQUQ9JWRcbiIsCisJCWdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUsCisJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkKTsKIAogCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CiAKQEAgLTE0NTcsMTEgKzE1NjgsMTMgQEAKIAogCS8qIDB4MC0gPT0gYm90aCBkaXJlY3Rpb25zLCAweC0xID09IEVGUiBjb2RlYyAqLwogCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlID0gMHgwMCB8IGlwYV9zbW9kX3NfZm9yX2xjaGFuKGxjaGFuKTsKKwlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCA9IGlwYV9ydHBfcHRfZm9yX2xjaGFuKGxjaGFuKTsKIAogCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKLQlERUJVR1AoRFJTTCwgIiVzIElQQUNfTURDWCBJUD0lcyBQT1JUPSVkIFJUUF9QQVlMT0FEMj0lZCBDT05OX0lEPSVkICIKLQkJInNwZWVjaF9tb2RlPTB4JTAyeFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBpbmV0X250b2EoaWEpLCBwb3J0LAotCQlydHBfcGF5bG9hZDIsIGxjaGFuLT5hYmlzX2lwLmNvbm5faWQsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwlERUJVR1AoRFJTTCwgIiVzIElQQUNfTURDWCBJUD0lcyBQT1JUPSVkIFJUUF9QQVlMT0FEPSVkIFJUUF9QQVlMT0FEMj0lZCAiCisJCSJDT05OX0lEPSVkIHNwZWVjaF9tb2RlPTB4JTAyeFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLAorCQlpbmV0X250b2EoaWEpLCBwb3J0LCBsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCwgcnRwX3BheWxvYWQyLAorCQlsY2hhbi0+YWJpc19pcC5jb25uX2lkLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CiAKIAltc2diX3R2MTZfcHV0KG1zZywgUlNMX0lFX0lQQUNfQ09OTl9JRCwgbGNoYW4tPmFiaXNfaXAuY29ubl9pZCk7CiAJbXNnYl92X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9JUCk7CkBAIC0xNDY5LDYgKzE1ODIsNyBAQAogCSphdHRfaXAgPSBpYS5zX2FkZHI7CiAJbXNnYl90djE2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JULCBwb3J0KTsKIAltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRCwgbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQpOwogCWlmIChydHBfcGF5bG9hZDIpCiAJCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyLCBydHBfcGF5bG9hZDIpOwogCQpAQCAtMTQ5MSwxNyArMTYwNSwyNCBAQAogCXJldHVybiByYzsKIH0KIAotaW50IHJzbF9pcGFjY19wZGNoX2FjdGl2YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoraW50IHJzbF9pcGFjY19wZGNoX2FjdGl2YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgYWN0KQogewogCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOwogCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXVfaW50OF90IG1zZ190eXBlOworCisJaWYgKGFjdCkKKwkJbXNnX3R5cGUgPSBSU0xfTVRfSVBBQ19QRENIX0FDVDsKKwllbHNlCisJCW1zZ190eXBlID0gUlNMX01UX0lQQUNfUERDSF9ERUFDVDsKIAogCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7Ci0JaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JUEFDX1BEQ0hfQUNUKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgbXNnX3R5cGUpOwogCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX0RFRF9DSEFOOwogCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CiAKLQlERUJVR1AoRFJTTCwgIiVzIElQQUNfUERDSF9BQ1RcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisJREVCVUdQKERSU0wsICIlcyBJUEFDX1BEQ0hfJXNBQ1RcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwKKwkJYWN0ID8gIiIgOiAiREUiKTsKIAogCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CiAKQEAgLTE2NDMsOSArMTc2NCwyMSBAQAogLyogRW50cnktcG9pbnQgd2hlcmUgTDIgUlNMIGZyb20gQlRTIGVudGVycyAqLwogaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQogewotCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoID0gbXNnYl9sMihtc2cpCTsKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqcnNsaDsKIAlpbnQgcmMgPSAwOwogCisJaWYgKCFtc2cpIHsKKwkJREVCVUdQKERSU0wsICJFbXB0eSBSU0wgbXNnPy4uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtc2diX2wybGVuKG1zZykgPCBzaXplb2YoKnJzbGgpKSB7CisJCURFQlVHUChEUlNMLCAiVHJ1bmNhdGVkIFJTTCBtZXNzYWdlIHdpdGggbDJsZW46ICV1XG4iLCBtc2diX2wybGVuKG1zZykpOworCQlyZXR1cm4gLTE7CisJfQorCisJcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwogCXN3aXRjaCAocnNsaC0+bXNnX2Rpc2NyICYgMHhmZSkgewogCWNhc2UgQUJJU19SU0xfTURJU0NfUkxMOgogCQlyYyA9IGFiaXNfcnNsX3J4X3JsbChtc2cpOwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYXV0aC5jIGIvb3BlbmJzYy9zcmMvYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1N2I2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9hdXRoLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIEF1dGhlbnRpY2F0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zICovCisKKy8qCisgKiAoQykgMjAxMCBieSBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2NvbXAxMjguaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKK3N0YXRpYyBpbnQKK191c2VfeG9yKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywgc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUpCit7CisJaW50IGksIGwgPSBhaW5mby0+YTNhOF9raV9sZW47CisKKwlpZiAoKGwgPiBBMzhfWE9SX01BWF9LRVlfTEVOKSB8fCAobCA8IEEzOF9YT1JfTUlOX0tFWV9MRU4pKSB7CisJCURFQlVHUChETU0sICJJbnZhbGlkIFhPUiBrZXkgKGxlbj0lZCkgJXMiLAorCQkJYWluZm8tPmEzYThfa2lfbGVuLAorCQkJaGV4ZHVtcChhaW5mby0+YTNhOF9raSwgYWluZm8tPmEzYThfa2lfbGVuKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGk9MDsgaTw0OyBpKyspCisJCWF0dXBsZS0+c3Jlc1tpXSA9IGF0dXBsZS0+cmFuZFtpXSBeIGFpbmZvLT5hM2E4X2tpW2ldOworCWZvciAoaT04OyBpPDEyOyBpKyspCisJCWF0dXBsZS0+a2NbaS00XSA9IGF0dXBsZS0+cmFuZFtpXSBeIGFpbmZvLT5hM2E4X2tpW2ldOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK191c2VfY29tcDEyOF92MShzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sIHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlKQoreworCWlmIChhaW5mby0+YTNhOF9raV9sZW4gIT0gQTM4X0NPTVAxMjhfS0VZX0xFTikgeworCQlERUJVR1AoRE1NLCAiSW52YWxpZCBDT01QMTI4djEga2V5IChsZW49JWQpICVzIiwKKwkJCWFpbmZvLT5hM2E4X2tpX2xlbiwKKwkJCWhleGR1bXAoYWluZm8tPmEzYThfa2ksIGFpbmZvLT5hM2E4X2tpX2xlbikpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29tcDEyOChhaW5mby0+YTNhOF9raSwgYXR1cGxlLT5yYW5kLCBhdHVwbGUtPnNyZXMsIGF0dXBsZS0+a2MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZXMgCisgKiAgLTEgLT4gSW50ZXJuYWwgZXJyb3IKKyAqICAgMCAtPiBOb3QgYXZhaWxhYmxlCisgKiAgIDEgLT4gVHVwbGUgcmV0dXJuZWQsIG5lZWQgdG8gZG8gYXV0aCwgdGhlbiBlbmFibGUgY2lwaGVyCisgKiAgIDIgLT4gVHVwbGUgcmV0dXJuZWQsIG5lZWQgdG8gZW5hYmxlIGNpcGhlcgorICovCitpbnQgYXV0aF9nZXRfdHVwbGVfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCBpbnQga2V5X3NlcSkKK3sKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlpbnQgaSwgcmM7CisKKwkvKiBHZXQgc3Vic2NyaWJlciBpbmZvIChpZiBhbnkpICovCisJcmMgPSBkYl9nZXRfYXV0aGluZm9fZm9yX3N1YnNjcigmYWluZm8sIHN1YnNjcik7CisJaWYgKHJjIDwgMCkgeworCQlERUJVR1AoRE1NLCAiTm8gcmV0cmlldmFibGUgS2kgZm9yIHN1YnNjcmliZXIsIHNraXBwaW5nIGF1dGgiKTsKKwkJcmV0dXJuIHJjID09IC1FTk9FTlQgPyAwIDogLTE7CisJfQorCisJLyogSWYgcG9zc2libGUsIHJlLXVzZSB0aGUgbGFzdCB0dXBsZSBhbmQgc2tpcCBhdXRoICovCisJcmMgPSBkYl9nZXRfbGFzdGF1dGh0dXBsZV9mb3Jfc3Vic2NyKGF0dXBsZSwgc3Vic2NyKTsKKwlpZiAoKHJjID09IDApICYmCisJICAgIChhdHVwbGUtPmtleV9zZXEgIT0gR1NNX0tFWV9TRVFfSU5WQUwpICYmCisJICAgIChhdHVwbGUtPnVzZV9jb3VudCA8IDMpKQorCXsKKwkJYXR1cGxlLT51c2VfY291bnQrKzsKKwkJZGJfc3luY19sYXN0YXV0aHR1cGxlX2Zvcl9zdWJzY3IoYXR1cGxlLCBzdWJzY3IpOworCQlyZXR1cm4gMjsKKwl9CisKKwkvKiBHZW5lcmF0ZSBhIG5ldyBvbmUgKi8KKwlhdHVwbGUtPnVzZV9jb3VudCA9IDE7CisJYXR1cGxlLT5rZXlfc2VxID0gKGF0dXBsZS0+a2V5X3NlcSArIDEpICUgNzsKKyAgICAgICAgZm9yIChpPTA7IGk8c2l6ZW9mKGF0dXBsZS0+cmFuZCk7IGkrKykKKyAgICAgICAgICAgICAgICBhdHVwbGUtPnJhbmRbaV0gPSByYW5kb20oKSAmIDB4ZmY7CisKKwlzd2l0Y2ggKGFpbmZvLmF1dGhfYWxnbykgeworCQljYXNlIEFVVEhfQUxHT19OT05FOgorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBBVVRIX0FMR09fWE9SOgorCQkJaWYgKF91c2VfeG9yKCZhaW5mbywgYXR1cGxlKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgQVVUSF9BTEdPX0NPTVAxMjh2MToKKwkJCWlmIChfdXNlX2NvbXAxMjhfdjEoJmFpbmZvLCBhdHVwbGUpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURFQlVHUChETU0sICJVbnN1cHBvcnRlZCBhdXRoIHR5cGUgYWxnb19pZD0lZFxuIiwKKwkJCQlhaW5mby5hdXRoX2FsZ28pOworCQkJcmV0dXJuIDA7CisJfQorCisgICAgICAgIGRiX3N5bmNfbGFzdGF1dGh0dXBsZV9mb3Jfc3Vic2NyKGF0dXBsZSwgc3Vic2NyKTsKKworCXJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jIGIvb3BlbmJzYy9zcmMvYnMxMV9jb25maWcuYwppbmRleCA4MGY5YmE5Li40NGNlZjBhIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCisrKyBiL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMKQEAgLTMsNyArMyw3IEBACiAvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZAogICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgYmFzZWQgb24gaWRlYXMgKGJ1dCBub3QgY29kZSkgb2YgQlMxMUNvbmZpZyAKKyAqIFRoaXMgc29mdHdhcmUgaXMgYmFzZWQgb24gaWRlYXMgKGJ1dCBub3QgY29kZSkgb2YgQlMxMUNvbmZpZwogICogKEMpIDIwMDkgYnkgRGlldGVyIFNwYWFyIDxzcGFhckBtaXJpZGVyLmF1Z3VzdGEuZGU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTU0LDkgKzU0LDkgQEAKIHN0YXRpYyBjaGFyICpjb21tYW5kLCAqdmFsdWU7CiBzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0dXNfdGltZXI7CiAKLXN0YXRpYyBjb25zdCB1X2ludDhfdCBvYmpfbGlfYXR0cltdID0geyAKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBvYmpfbGlfYXR0cltdID0gewogCU5NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0gsIDB4MDksIDB4MDAsCi0JTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFLCAweDAwLCAKKwlOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEUsIDB4MDAsCiAJTk1fQVRUX0JTMTFfTElORV9DRkcsIDB4MDAsCiB9Owogc3RhdGljIGNvbnN0IHVfaW50OF90IG9ial9iYnNpZzBfYXR0cltdID0gewpAQCAtNzEsNyArNzEsNyBAQAogCiBzdGF0aWMgY29uc3QgdV9pbnQ4X3QgdG9vX2Zhc3RbXSA9IHsgMHgxMiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiB9OwogCi1zdGF0aWMgc3RydWN0IGRlYnVnX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKK3N0YXRpYyBzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKIAogLyogZHVtbXkgZnVuY3Rpb24gdG8ga2VlcCBnc21fZGF0YS5jIGhhcHB5ICovCiBzdHJ1Y3QgY291bnRlciAqY291bnRlcl9hbGxvYyhjb25zdCBjaGFyICpuYW1lKQpAQCAtNDgxLDcgKzQ4MSw3IEBACiAJCSAqIGFyZ3VtZW50LCBzbyBvdXIgc3dsb2FkX2NiZm4gY2FuIGRpc3Rpbmd1aXNoCiAJCSAqIGEgc2FmZXR5IGxvYWQgZnJvbSBhIHJlZ3VsYXIgc29mdHdhcmUgKi8KIAkJaWYgKGZpbGVfaXNfcmVhZGFibGUoZm5hbWVfc2FmZXR5KSkKLQkJCXJjID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkKGdfYnRzLCBmbmFtZV9zYWZldHksCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChnX2J0cywgMHhmZiwgZm5hbWVfc2FmZXR5LAogCQkJCQkJICAgd2luX3NpemUsIHBhcmFtX2ZvcmNlZCwKIAkJCQkJCSAgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CiAJCWVsc2UKQEAgLTY5Nyw3ICs2OTcsOCBAQAogfQogCiBpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKLQkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCisJCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlLAorCQkgICBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2lucykKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTc3OCw3ICs3NzksNyBAQAogCQkJc2VyaWFsX3BvcnQgPSBvcHRhcmc7CiAJCQlicmVhazsKIAkJY2FzZSAnYic6Ci0JCQlkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsIG9wdGFyZyk7CisJCQlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCBvcHRhcmcpOwogCQkJYnJlYWs7CiAJCWNhc2UgJ3MnOgogCQkJZm5hbWVfc29mdHdhcmUgPSBvcHRhcmc7CkBAIC04MjksMTUgKzgzMCwxNiBAQAogCX0KIH0KIAorZXh0ZXJuIGludCBidHNfbW9kZWxfYnMxMV9pbml0KHZvaWQpOwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OwogCWludCByYzsKIAotCWRlYnVnX2luaXQoKTsKLQlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKLQlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOwotCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKIAloYW5kbGVfb3B0aW9ucyhhcmdjLCBhcmd2KTsKIAlidHNfbW9kZWxfYnMxMV9pbml0KCk7CiAKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19hcGkuYyBiL29wZW5ic2Mvc3JjL2JzY19hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWI4YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2FwaS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKiBHU00gMDguMDggbGlrZSBBUEkgZm9yIE9wZW5CU0MuIFRoZSBicmlkZ2UgZnJvbSBNU0MgdG8gQlNDICovCisKKy8qIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAxMCBieSBPbiBXYXZlcworICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvYnNjX2FwaS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX3JsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCitzdGF0aWMgdm9pZCBybGxfaW5kX2NiKHN0cnVjdCBnc21fbGNoYW4gKiwgdWludDhfdCwgdm9pZCAqLCBlbnVtIGJzY19ybGxyX2luZCk7CitzdGF0aWMgdm9pZCBzZW5kX3NhcGlfcmVqZWN0KHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBpbnQgbGlua19pZCk7CisKK2ludCBic2NfYXBpX2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBzdHJ1Y3QgYnNjX2FwaSAqYXBpKQoreworCW5ldHdvcmstPmJzY19hcGkgPSBhcGk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnc20wODA4X3N1Ym1pdF9kdGFwKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLAorCQkJc3RydWN0IG1zZ2IgKm1zZywgaW50IGxpbmtfaWQpCit7CisJdWludDhfdCBzYXBpID0gbGlua19pZCAmIDB4NzsKKwltc2ctPmxjaGFuID0gY29ubi0+bGNoYW47CisJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJaWYgKGNvbm4tPmxjaGFuLT5zYXBpc1tzYXBpXSA9PSBMQ0hBTl9TQVBJX1VOVVNFRCkgeworCQlPQlNDX0xJTktJRF9DQihtc2cpID0gbGlua19pZDsKKwkJaWYgKHJsbF9lc3RhYmxpc2gobXNnLT5sY2hhbiwgc2FwaSwgcmxsX2luZF9jYiwgbXNnKSAhPSAwKSB7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJCXNlbmRfc2FwaV9yZWplY3QoY29ubiwgbGlua19pZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHJzbF9kYXRhX3JlcXVlc3QobXNnLCBsaW5rX2lkKTsKKwl9Cit9CisKKy8qIGRlcXVldWUgbWVzc2FnZXMgdG8gbGF5ZXIgNCAqLworaW50IGJzY191cHF1ZXVlKHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBnc21fbW5jYyAqbW5jYzsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCB3b3JrID0gMDsKKworCWlmIChuZXQpCisJCXdoaWxlICgobXNnID0gbXNnYl9kZXF1ZXVlKCZuZXQtPnVwcXVldWUpKSkgeworCQkJbW5jYyA9IChzdHJ1Y3QgZ3NtX21uY2MgKiltc2ctPmRhdGE7CisJCQlpZiAobmV0LT5tbmNjX3JlY3YpCisJCQkJbmV0LT5tbmNjX3JlY3YobmV0LCBtbmNjLT5tc2dfdHlwZSwgbW5jYyk7CisJCQl3b3JrID0gMTsgLyogd29yayBkb25lICovCisJCQl0YWxsb2NfZnJlZShtc2cpOworCQl9CisKKwlyZXR1cm4gd29yazsKK30KKworc3RhdGljIHZvaWQgc2VuZF9zYXBpX3JlamVjdChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgaW50IGxpbmtfaWQpCit7CisJc3RydWN0IGJzY19hcGkgKmFwaTsKKworCWFwaSA9IGNvbm4tPmJ0cy0+bmV0d29yay0+YnNjX2FwaTsKKwlpZiAoIWFwaSB8fCAhYXBpLT5zYXBpX25fcmVqZWN0KQorCQlyZXR1cm47CisKKwlhcGktPnNhcGlfbl9yZWplY3QoY29ubiwgbGlua19pZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJsbF9pbmRfY2Ioc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVpbnQ4X3QgbGlua19pZCwgdm9pZCAqX2RhdGEsIGVudW0gYnNjX3JsbHJfaW5kIHJsbHJfaW5kKQoreworCXN0cnVjdCBtc2diICptc2cgPSBfZGF0YTsKKworCXN3aXRjaCAocmxscl9pbmQpIHsKKwljYXNlIEJTQ19STExSX0lORF9FU1RfQ09ORjoKKwkJcnNsX2RhdGFfcmVxdWVzdChtc2csIE9CU0NfTElOS0lEX0NCKG1zZykpOworCQlicmVhazsKKwljYXNlIEJTQ19STExSX0lORF9SRUxfSU5EOgorCWNhc2UgQlNDX1JMTFJfSU5EX0VSUl9JTkQ6CisJY2FzZSBCU0NfUkxMUl9JTkRfVElNRU9VVDoKKwkJc2VuZF9zYXBpX3JlamVjdCgmbGNoYW4tPmNvbm4sIE9CU0NfTElOS0lEX0NCKG1zZykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGJzY19oYW5kbGVfbGNoYW5fc2lnbmFsKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkJICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgYnNjX2FwaSAqYnNjOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJaWYgKHN1YnN5cyAhPSBTU19MQ0hBTiB8fCBzaWduYWwgIT0gU19MQ0hBTl9VTkVYUEVDVEVEX1JFTEVBU0UpCisJCXJldHVybiAwOworCisJbGNoYW4gPSAoc3RydWN0IGdzbV9sY2hhbiAqKXNpZ25hbF9kYXRhOworCWlmICghbGNoYW4pCisJCXJldHVybiAwOworCisKKwlic2MgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrLT5ic2NfYXBpOworCWlmICghYnNjIHx8ICFic2MtPmNsZWFyX3JlcXVlc3QpCisJCXJldHVybiAwOworCisJYnNjLT5jbGVhcl9yZXF1ZXN0KCZsY2hhbi0+Y29ubiwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfYnNjKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTENIQU4sIGJzY19oYW5kbGVfbGNoYW5fc2lnbmFsLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMgYi9vcGVuYnNjL3NyYy9ic2NfaGFjay5jCmluZGV4IDRjZGU0ZGQuLjdiZTAzNjAgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2hhY2suYwpAQCAtMzcsMTIgKzM3LDE1IEBACiAjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KIAorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKworI2luY2x1ZGUgIi4uL2JzY2NvbmZpZy5oIgorCiAvKiBNQ0MgYW5kIE1OQyBmb3IgdGhlIExvY2F0aW9uIEFyZWEgSWRlbnRpZmllciAqLwotc3RhdGljIHN0cnVjdCBkZWJ1Z190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CitzdGF0aWMgc3RydWN0IGxvZ190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CiBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmJzY19nc21uZXQgPSAwOwogc3RhdGljIGNvbnN0IGNoYXIgKmRhdGFiYXNlX25hbWUgPSAiaGxyLnNxbGl0ZTMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlID0gIm9wZW5ic2MuY2ZnIjsKLWV4dGVybiBjb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb247CiBleHRlcm4gY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQ7CiAKIC8qIHRpbWVyIHRvIHN0b3JlIHN0YXRpc3RpY3MgKi8KQEAgLTg3LDE2ICs5MCw2IEBACiAJcHJpbnRmKCIgIC1lIC0tbG9nLWxldmVsIG51bWJlci4gU2V0IGEgZ2xvYmFsIGxvZ2xldmVsLlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24oKQotewotCXByaW50ZigiJXNcbiIsIG9wZW5ic2NfdmVyc2lvbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X2NvcHlyaWdodCgpCi17Ci0JcHV0cyhvcGVuYnNjX2NvcHlyaWdodCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikKIHsKIAl3aGlsZSAoMSkgewpAQCAtMTI3LDEwICsxMjAsMTAgQEAKIAkJCXByaW50X2hlbHAoKTsKIAkJCWV4aXQoMCk7CiAJCWNhc2UgJ3MnOgotCQkJZGVidWdfc2V0X3VzZV9jb2xvcihzdGRlcnJfdGFyZ2V0LCAwKTsKKwkJCWxvZ19zZXRfdXNlX2NvbG9yKHN0ZGVycl90YXJnZXQsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgJ2QnOgotCQkJZGVidWdfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCBvcHRhcmcpOworCQkJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKIAkJCWJyZWFrOwogCQljYXNlICdsJzoKIAkJCWRhdGFiYXNlX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKQEAgLTE0MiwxOCArMTM1LDE2IEBACiAJCQljcmVhdGVfcGNhcF9maWxlKG9wdGFyZyk7CiAJCQlicmVhazsKIAkJY2FzZSAnVCc6Ci0JCQlkZWJ1Z19zZXRfcHJpbnRfdGltZXN0YW1wKHN0ZGVycl90YXJnZXQsIDEpOworCQkJbG9nX3NldF9wcmludF90aW1lc3RhbXAoc3RkZXJyX3RhcmdldCwgMSk7CiAJCQlicmVhazsKIAkJY2FzZSAnUCc6CiAJCQlpcGFjY19ydHBfZGlyZWN0ID0gMDsKIAkJCWJyZWFrOwogCQljYXNlICdlJzoKLQkJCWRlYnVnX3NldF9sb2dfbGV2ZWwoc3RkZXJyX3RhcmdldCwgYXRvaShvcHRhcmcpKTsKKwkJCWxvZ19zZXRfbG9nX2xldmVsKHN0ZGVycl90YXJnZXQsIGF0b2kob3B0YXJnKSk7CiAJCQlicmVhazsKIAkJY2FzZSAnVic6Ci0JCQlwcmludF92ZXJzaW9uKCk7Ci0JCQlwcmludGYoIlxuIik7Ci0JCQlwcmludF9jb3B5cmlnaHQoKTsKKwkJCXByaW50X3ZlcnNpb24oMSk7CiAJCQlleGl0KDApOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0yMDcsMjkgKzE5OCw0NyBAQAogZXh0ZXJuIGludCBidHNfbW9kZWxfYnMxMV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBidHNfbW9kZWxfbmFub2J0c19pbml0KHZvaWQpOwogCitleHRlcm4gZW51bSBub2RlX3R5cGUgYnNjX3Z0eV9nb19wYXJlbnQoc3RydWN0IHZ0eSAqdnR5KTsKKworc3RhdGljIHN0cnVjdCB2dHlfYXBwX2luZm8gdnR5X2luZm8gPSB7CisJLm5hbWUgCQk9ICJPcGVuQlNDIiwKKwkudmVyc2lvbgk9IFBBQ0tBR0VfVkVSU0lPTiwKKwkuZ29fcGFyZW50X2NiCT0gYnNjX3Z0eV9nb19wYXJlbnQsCit9OworCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJaW50IHJjOwogCi0JZGVidWdfaW5pdCgpOworCXZ0eV9pbmZvLmNvcHlyaWdodCA9IG9wZW5ic2NfY29weXJpZ2h0OworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKIAl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgIm9wZW5ic2MiKTsKIAl0YWxsb2NfY3R4X2luaXQoKTsKIAlvbl9kc29fbG9hZF90b2tlbigpOwogCW9uX2Rzb19sb2FkX3JybHAoKTsKIAlvbl9kc29fbG9hZF9ob19kZWMoKTsKLQlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKLQlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKIAogCWJ0c19tb2RlbF91bmtub3duX2luaXQoKTsKIAlidHNfbW9kZWxfYnMxMV9pbml0KCk7CiAJYnRzX21vZGVsX25hbm9idHNfaW5pdCgpOwogCiAJLyogZW5hYmxlIGZpbHRlcnMgKi8KLQlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwkvKiBUaGlzIG5lZWRzIHRvIHByZWNlZGUgaGFuZGxlX29wdGlvbnMoKSAqLworCXZ0eV9pbml0KCZ2dHlfaW5mbyk7CisJYnNjX3Z0eV9pbml0KCk7CiAKIAkvKiBwYXJzZSBvcHRpb25zICovCiAJaGFuZGxlX29wdGlvbnMoYXJnYywgYXJndik7CiAKKwlyYyA9IGJzY19ib290c3RyYXBfbmV0d29yayhtbmNjX3JlY3YsIGNvbmZpZ19maWxlKTsKKwlpZiAocmMgPCAwKQorCQlleGl0KDEpOworCiAJLyogc2VlZCB0aGUgUFJORyAqLwogCXNyYW5kKHRpbWUoTlVMTCkpOwogCkBAIC0yNTAsMTAgKzI1OSw2IEBACiAJZGJfc3luY190aW1lci5kYXRhID0gTlVMTDsKIAlic2Nfc2NoZWR1bGVfdGltZXIoJmRiX3N5bmNfdGltZXIsIERCX1NZTkNfSU5URVJWQUwpOwogCi0JcmMgPSBic2NfYm9vdHN0cmFwX25ldHdvcmsobW5jY19yZWN2LCBjb25maWdfZmlsZSk7Ci0JaWYgKHJjIDwgMCkKLQkJZXhpdCgxKTsKLQogCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CiAJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CiAJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CkBAIC0yNjIsNyArMjY3LDcgQEAKIAogCXdoaWxlICgxKSB7CiAJCWJzY191cHF1ZXVlKGJzY19nc21uZXQpOwotCQlkZWJ1Z19yZXNldF9jb250ZXh0KCk7CisJCWxvZ19yZXNldF9jb250ZXh0KCk7CiAJCWJzY19zZWxlY3RfbWFpbigwKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwppbmRleCBmMzQzNjYyLi5kZGI1M2JhIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jCisrKyBiL29wZW5ic2Mvc3JjL2JzY19pbml0LmMKQEAgLTEsNiArMSw2IEBACiAvKiBBIGhhY2tpc2ggbWluaW1hbCBCU0MgKCtNU0MgK0hMUikgaW1wbGVtZW50YXRpb24gKi8KIAotLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgogICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZAogICoKQEAgLTI3LDEwICsyNywxMiBAQAogI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgogI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KICNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+Ci0jaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9vc21vX21zYy5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L3RlbG5ldF9pbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxvcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oPgogI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KICNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KIAogLyogZ2xvYmFsIHBvaW50ZXIgdG8gdGhlIGdzbSBuZXR3b3JrIGRhdGEgc3RydWN0dXJlICovCkBAIC0zNzcsMTEgKzM3OSwxMSBAQAogCQk0LAkvKiBOMzEwMyAqLwogCQk4LAkvKiBOMzEwNSAqLwogCQkxNSwJLyogUkxDIENWIGNvdW50ZG93biAqLwotCU5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUywgMCwgMiwgIDB4MGYsIDB4MDAsCisJTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLCAwLCAyLCAgMHgwZiwgMHgwMCwJLyogQ1MxLi5DUzQgKi8KIAlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yLCAwLCA1LAotCQkweDAwLCAyNTAsCi0JCTB4MDAsIDI1MCwKLQkJMiwJLyogTUNTMiAqLworCQkweDAwLCAyNTAsCS8qIFQgZG93bmxpbmsgVEJGIGV4dGVuc2lvbiAoMC4uNTAwKSAqLworCQkweDAwLCAyNTAsCS8qIFQgdXBsaW5rIFRCRiBleHRlbnNpb24gKDAuLjUwMCkgKi8KKwkJMiwJLyogQ1MyICovCiAjaWYgMAogCS8qIEVER0UgbW9kZWwgb25seSwgYnJlYWtzIG9sZGVyIG1vZGVscy4KIAkgKiBTaG91bGQgaW5xdWlyZSB0aGUgQlRTIGNhcGFiaWxpdGllcyAqLwpAQCAtNDAwLDcgKzQwMiw4IEBACiAKIC8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuZXZlciB3ZSBnZXQgYSBHU00gMTIuMjEgc3RhdGUgY2hhbmdlIGV2ZW50ICovCiBpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKLQkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCisJCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlLAorCQkgICBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2luc3QpCiB7CiAJc3RydWN0IGdzbV9idHMgKmJ0czsKIAlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKQEAgLTQxNyw5ICs0MjAsOSBAQAogCXN3aXRjaCAob2JqX2NsYXNzKSB7CiAJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CiAJCWJ0cyA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBnc21fYnRzLCBzaXRlX21ncik7Ci0JCWlmICgobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAyICYmCisJCWlmICgobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSBOTV9PUFNUQVRFX0VOQUJMRUQgJiYKIAkJICAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09LKSB8fAotCQkgICAgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gTk1fT1BTVEFURV9ESVNBQkxFRCAmJgogCQkgICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0ZGX0xJTkUpKQogCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLCAweGZmLCAweGZmLCAweGZmKTsKIAkJYnJlYWs7CkBAIC00MzksNyArNDQyLDcgQEAKIAljYXNlIE5NX09DX0NIQU5ORUw6CiAJCXRzID0gb2JqOwogCQl0cnggPSB0cy0+dHJ4OwotCQlpZiAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAxICYmCisJCWlmIChuZXdfc3RhdGUtPm9wZXJhdGlvbmFsID09IE5NX09QU1RBVEVfRElTQUJMRUQgJiYKIAkJICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfREVQRU5ERU5DWSkgewogCQkJcGF0Y2hfbm1fdGFibGVzKHRyeC0+YnRzKTsKIAkJCWVudW0gYWJpc19ubV9jaGFuX2NvbWIgY2NvbWIgPQpAQCAtNDU0LDE2ICs0NTcsMTYgQEAKIAkJYnJlYWs7CiAJY2FzZSBOTV9PQ19SQURJT19DQVJSSUVSOgogCQl0cnggPSBvYmo7Ci0JCWlmIChuZXdfc3RhdGUtPm9wZXJhdGlvbmFsID09IDEgJiYKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gTk1fT1BTVEFURV9ESVNBQkxFRCAmJgogCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PSykKIAkJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgb2JqX2NsYXNzLCB0cngtPmJ0cy0+YnRzX25yLAogCQkJCQl0cngtPm5yLCAweGZmKTsKIAkJYnJlYWs7CiAJY2FzZSBOTV9PQ19HUFJTX05TRToKIAkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMubnNlKTsKLQkJaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkKKwkJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpCiAJCQlicmVhazsKLQkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IDUpIHsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfREVQRU5ERU5DWSkgewogCQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCiAJCQkJCQkgIDB4ZmYsIDB4ZmYsIG5hbm9idHNfYXR0cl9uc2UsCiAJCQkJCQkgIHNpemVvZihuYW5vYnRzX2F0dHJfbnNlKSk7CkBAIC00NzUsOSArNDc4LDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBOTV9PQ19HUFJTX0NFTEw6CiAJCWJ0cyA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBnc21fYnRzLCBncHJzLmNlbGwpOwotCQlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKQorCQlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkKIAkJCWJyZWFrOwotCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gNSkgeworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CiAJCQlhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKIAkJCQkJCSAgMCwgMHhmZiwgbmFub2J0c19hdHRyX2NlbGwsCiAJCQkJCQkgIHNpemVvZihuYW5vYnRzX2F0dHJfY2VsbCkpOwpAQCAtNDkwLDkgKzQ5Myw5IEBACiAJY2FzZSBOTV9PQ19HUFJTX05TVkM6CiAJCW5zdmMgPSBvYmo7CiAJCWJ0cyA9IG5zdmMtPmJ0czsKLQkJaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkKKwkJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpCiAJCQlicmVhazsKLQkgICAgICAgIC8qIFdlIHNraXAgTlNWQzEgc2luY2Ugd2Ugb25seSB1c2UgTlNWQzAgKi8KKwkJLyogV2Ugc2tpcCBOU1ZDMSBzaW5jZSB3ZSBvbmx5IHVzZSBOU1ZDMCAqLwogCQlpZiAobnN2Yy0+aWQgPT0gMSkKIAkJCWJyZWFrOwogCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PRkZfTElORSkgewpAQCAtNzk4LDcgKzgwMSw3IEBACiAJCQlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKIAkJCXJzbF9iY2NoX2luZm8odHJ4LCBpLCBzaV90bXAsIHNpemVvZihzaV90bXApKTsKIAkJfQotCQlpZiAoYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJaWYgKGJ0cy0+Z3Bycy5tb2RlICE9IEJUU19HUFJTX05PTkUpIHsKIAkJCWkgPSAxMzsKIAkJCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIFJTTF9TWVNURU1fSU5GT18xMyk7CiAJCQlpZiAocmMgPCAwKQpAQCAtODUyLDYgKzg1NSwyMiBAQAogCWJzMTFfYXR0cl9yYWRpb1syXSB8PSBhcmZjbl9oaWdoOwogCWJzMTFfYXR0cl9yYWRpb1szXSA9IGFyZmNuX2xvdzsKIAorCS8qIHBhdGNoIHRoZSBSQUNIIGF0dHJpYnV0ZXMgKi8KKwlpZiAoYnRzLT5yYWNoX2JfdGhyZXNoICE9IC0xKSB7CisJCW5hbm9idHNfYXR0cl9idHNbMzNdID0gYnRzLT5yYWNoX2JfdGhyZXNoICYgMHhmZjsKKwkJYnMxMV9hdHRyX2J0c1szM10gPSBidHMtPnJhY2hfYl90aHJlc2ggJiAweGZmOworCX0KKworCWlmIChidHMtPnJhY2hfbGRhdmdfc2xvdHMgIT0gLTEpIHsKKwkJdV9pbnQ4X3QgYXZnX2hpZ2ggPSBidHMtPnJhY2hfbGRhdmdfc2xvdHMgJiAweGZmOworCQl1X2ludDhfdCBhdmdfbG93ID0gKGJ0cy0+cmFjaF9sZGF2Z19zbG90cyA+PiA4KSAmIDB4MGY7CisKKwkJbmFub2J0c19hdHRyX2J0c1szNV0gPSBhdmdfaGlnaDsKKwkJbmFub2J0c19hdHRyX2J0c1szNl0gPSBhdmdfbG93OworCQliczExX2F0dHJfYnRzWzM1XSA9IGF2Z19oaWdoOworCQliczExX2F0dHJfYnRzWzM2XSA9IGF2Z19sb3c7CisJfQorCiAJLyogcGF0Y2ggQlNJQyAqLwogCWJzMTFfYXR0cl9idHNbMV0gPSBidHMtPmJzaWM7CiAJbmFub2J0c19hdHRyX2J0c1tzaXplb2YobmFub2J0c19hdHRyX2J0cyktMTFdID0gYnRzLT5ic2ljOwpAQCAtODY2LDYgKzg4NSwxMCBAQAogCS8qIHBhdGNoIE5TRUkgKi8KIAluYW5vYnRzX2F0dHJfbnNlWzNdID0gYnRzLT5ncHJzLm5zZS5uc2VpID4+IDg7CiAJbmFub2J0c19hdHRyX25zZVs0XSA9IGJ0cy0+Z3Bycy5uc2UubnNlaSAmIDB4ZmY7CisJbWVtY3B5KG5hbm9idHNfYXR0cl9uc2UrOCwgYnRzLT5ncHJzLm5zZS50aW1lciwKKwkJQVJSQVlfU0laRShidHMtPmdwcnMubnNlLnRpbWVyKSk7CisJbWVtY3B5KG5hbm9idHNfYXR0cl9uc2UrMTgsIGJ0cy0+Z3Bycy5jZWxsLnRpbWVyLAorCQlBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5jZWxsLnRpbWVyKSk7CiAKIAkvKiBwYXRjaCBOU1ZDSSAqLwogCW5hbm9idHNfYXR0cl9uc3ZjMFszXSA9IGJ0cy0+Z3Bycy5uc3ZjWzBdLm5zdmNpID4+IDg7CkBAIC04ODUsNiArOTA4LDExIEBACiAJLyogcGF0Y2ggUkFDICovCiAJbmFub2J0c19hdHRyX2NlbGxbM10gPSBidHMtPmdwcnMucmFjOwogCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX0VHUFJTKSB7CisJCS8qIHBhdGNoIEVHUFJTIGNvZGluZyBzY2hlbWVzIE1DUyAxLi45ICovCisJCW5hbm9idHNfYXR0cl9jZWxsWzI5XSA9IDB4OGY7CisJCW5hbm9idHNfYXR0cl9jZWxsWzMwXSA9IDB4ZmY7CisJfQogfQogCiBzdGF0aWMgdm9pZCBib290c3RyYXBfcnNsKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQpAQCAtODk5LDYgKzkyNyw4IEBACiAKIHZvaWQgaW5wdXRfZXZlbnQoaW50IGV2ZW50LCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKIHsKKwlpbnQgdHNfbm8sIGxjaGFuX25vOworCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgRVZUX0UxX1RFSV9VUDoKIAkJc3dpdGNoICh0eXBlKSB7CkBAIC05MTMsOCArOTQzLDM1IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBFVlRfRTFfVEVJX0ROOgotCQlMT0dQKERNSSwgTE9HTF9OT1RJQ0UsICJMb3N0IHNvbWUgRTEgVEVJIGxpbmtcbiIpOwotCQkvKiBGSVhNRTogZGVhbCB3aXRoIFRFSSBvciBMMSBsaW5rIGxvc3MgKi8KKwkJTE9HUChETUksIExPR0xfRVJST1IsICJMb3N0IHNvbWUgRTEgVEVJIGxpbms6ICVkICVwXG4iLCB0eXBlLCB0cngpOworCisJCWlmICh0eXBlID09IEUxSU5QX1NJR05fT01MKQorCQkJY291bnRlcl9pbmModHJ4LT5idHMtPm5ldHdvcmstPnN0YXRzLmJ0cy5vbWxfZmFpbCk7CisJCWVsc2UgaWYgKHR5cGUgPT0gRTFJTlBfU0lHTl9SU0wpCisJCQljb3VudGVyX2luYyh0cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuYnRzLnJzbF9mYWlsKTsKKworCQkvKgorCQkgKiBmcmVlIGFsbCBhbGxvY2F0ZWQgY2hhbm5lbHMuIGNoYW5nZSB0aGUgbm1fc3RhdGUgc28gdGhlCisJCSAqIHRyeCBhbmQgdHJ4X3RzIGJlY29tZXMgdW51c2FibGUgYW5kIGNoYW5fYWxsb2MuYyBjYW4gbm90CisJCSAqIGFsbG9jYXRlIGZyb20gaXQuCisJCSAqLworCQlmb3IgKHRzX25vID0gMDsgdHNfbm8gPCBBUlJBWV9TSVpFKHRyeC0+dHMpOyArK3RzX25vKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbdHNfbm9dOworCisJCQlmb3IgKGxjaGFuX25vID0gMDsgbGNoYW5fbm8gPCBBUlJBWV9TSVpFKHRzLT5sY2hhbik7ICsrbGNoYW5fbm8pIHsKKwkJCQlpZiAodHMtPmxjaGFuW2xjaGFuX25vXS5zdGF0ZSAhPSBHU01fTENIQU5fTk9ORSkKKwkJCQkJbGNoYW5fZnJlZSgmdHMtPmxjaGFuW2xjaGFuX25vXSk7CisJCQkJbGNoYW5fcmVzZXQoJnRzLT5sY2hhbltsY2hhbl9ub10pOworCQkJfQorCisJCQl0cy0+bm1fc3RhdGUub3BlcmF0aW9uYWwgPSAwOworCQkJdHMtPm5tX3N0YXRlLmF2YWlsYWJpbGl0eSA9IDA7CisJCX0KKworCQl0cngtPm5tX3N0YXRlLm9wZXJhdGlvbmFsID0gMDsKKwkJdHJ4LT5ubV9zdGF0ZS5hdmFpbGFiaWxpdHkgPSAwOworCQl0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZS5vcGVyYXRpb25hbCA9IDA7CisJCXRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlLmF2YWlsYWJpbGl0eSA9IDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtOTIzLDYgKzk4MCwxMCBAQAogCiBzdGF0aWMgaW50IGJvb3RzdHJhcF9idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKIHsKKwlpbnQgaSwgbjsKKworCS8qIEZJWE1FOiBXaGF0IGFib3V0IHNlY29uZGFyeSBUUlggb2YgYSBCVFM/ICBXaGF0IGFib3V0IGEgQlRTIHRoYXQgaGFzIFRSWAorCSAqIGluIGRpZmZlcmVudCBiYW5kcz8gV2h5IGlzICdiYW5kJyBhIHBhcmFtZXRlciBvZiB0aGUgQlRTIGFuZCBub3Qgb2YgdGhlIFRSWD8gKi8KIAlzd2l0Y2ggKGJ0cy0+YmFuZCkgewogCWNhc2UgR1NNX0JBTkRfMTgwMDoKIAkJaWYgKGJ0cy0+YzAtPmFyZmNuIDwgNTEyIHx8IGJ0cy0+YzAtPmFyZmNuID4gODg1KSB7CkBAIC05NDQsNiArMTAwNSwxMiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBHU01fQkFORF84NTA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDEyOCB8fCBidHMtPmMwLT5hcmZjbiA+IDI1MSkgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU004NTAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gMTI4LTI1MS5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJTE9HUChETk0sIExPR0xfRVJST1IsICJVbnN1cHBvcnRlZCBmcmVxdWVuY3kgYmFuZC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk1OSwxMCArMTAyNiwzNCBAQAogCiAJLyogQ29udHJvbCBDaGFubmVsIERlc2NyaXB0aW9uICovCiAJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmF0dCA9IDE7Ci0JYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl8xX0M7CiAJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX3BhX21mcm1zID0gUlNMX0JTX1BBX01GUk1TXzU7CiAJLyogVDMyMTIgaXMgc2V0IGZyb20gdnR5L2NvbmZpZyAqLwogCisJLyogU2V0IGNjY2ggY29uZmlnIGJ5IGxvb2tpbmcgYXQgdHMgY29uZmlnICovCisJZm9yIChuPTAsIGk9MDsgaTw4OyBpKyspCisJCW4gKz0gYnRzLT5jMC0+dHNbaV0ucGNoYW4gPT0gR1NNX1BDSEFOX0NDQ0ggPyAxIDogMDsKKworCXN3aXRjaCAobikgeworCWNhc2UgMDoKKwkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl8xX0M7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl8xX05DOworCQlicmVhazsKKwljYXNlIDI6CisJCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPSBSU0xfQkNDSF9DQ0NIX0NPTkZfMl9OQzsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuY2NjaF9jb25mID0gUlNMX0JDQ0hfQ0NDSF9DT05GXzNfTkM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl80X05DOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIENDQ0ggdGltZXNsb3QgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIHNvbWUgZGVmYXVsdHMgZm9yIG91ciBzeXN0ZW0gaW5mb3JtYXRpb24gKi8KIAlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMucmFkaW9fbGlua190aW1lb3V0ID0gMjsgLyogMTIgKi8KIAlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMuZHR4ID0gMjsgLyogTVMgc2hhbGwgbm90IHVzZSB1cHBsaW5rIERUWCAqLwpAQCAtOTgwLDYgKzEwNzEsNyBAQAogaW50IGJzY19ib290c3RyYXBfbmV0d29yayhpbnQgKCptbmNjX3JlY3YpKHN0cnVjdCBnc21fbmV0d29yayAqLCBpbnQsIHZvaWQgKiksCiAJCQkgIGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlKQogeworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiBkdW1teV9jb25uOwogCXN0cnVjdCBnc21fYnRzICpidHM7CiAJaW50IHJjOwogCkBAIC05OTAsMTQgKzEwODIsMjAgQEAKIAogCWJzY19nc21uZXQtPm5hbWVfbG9uZyA9IHRhbGxvY19zdHJkdXAoYnNjX2dzbW5ldCwgIk9wZW5CU0MiKTsKIAlic2NfZ3NtbmV0LT5uYW1lX3Nob3J0ID0gdGFsbG9jX3N0cmR1cChic2NfZ3NtbmV0LCAiT3BlbkJTQyIpOworCWJzY19hcGlfaW5pdChic2NfZ3NtbmV0LCBtc2NfYnNjX2FwaSgpKTsKIAotCXRlbG5ldF9pbml0KGJzY19nc21uZXQsIDQyNDIpOwotCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUpOworCS8qIG91ciB2dHkgY29tbWFuZCBjb2RlIGV4cGVjdHMgdnR5LT5wcml2IHRvIHBvaW50IHRvIGEgdGVsbmV0X2Nvbm5lY3Rpb24gKi8KKwlkdW1teV9jb25uLnByaXYgPSBic2NfZ3NtbmV0OworCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUsICZkdW1teV9jb25uKTsKIAlpZiAocmMgPCAwKSB7CiAJCUxPR1AoRE5NLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBjb25maWcgZmlsZTogJyVzJ1xuIiwgY29uZmlnX2ZpbGUpOwogCQlyZXR1cm4gcmM7CiAJfQogCisJcmMgPSB0ZWxuZXRfaW5pdCh0YWxsX2JzY19jdHgsIGJzY19nc21uZXQsIDQyNDIpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwogCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX05NLCBubV9zaWdfY2IsIE5VTEwpOwogCiAJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmYnNjX2dzbW5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19ybGwuYyBiL29wZW5ic2Mvc3JjL2JzY19ybGwuYwppbmRleCAxNTUxZDk0Li5hOGU2NDJmIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9ic2NfcmxsLmMKKysrIGIvb3BlbmJzYy9zcmMvYnNjX3JsbC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgogI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgogI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgogCiBzdHJ1Y3QgYnNjX3JsbF9yZXEgewogCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CkBAIC01MSw4ICs1MiwxMCBAQAogCiBzdGF0aWMgdm9pZCBjb21wbGV0ZV9ybGxyKHN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciwgZW51bSBic2Nfcmxscl9pbmQgdHlwZSkKIHsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAmcmxsci0+bGNoYW4tPmNvbm47CiAJbGxpc3RfZGVsKCZybGxyLT5saXN0KTsKLQlwdXRfbGNoYW4ocmxsci0+bGNoYW4pOwogCXJsbHItPmNiKHJsbHItPmxjaGFuLCBybGxyLT5saW5rX2lkLCBybGxyLT5kYXRhLCB0eXBlKTsKIAl0YWxsb2NfZnJlZShybGxyKTsKIH0KQEAgLTcwLDYgKzczLDcgQEAKIAkJCSAgICAgZW51bSBic2Nfcmxscl9pbmQpLAogCQkgIHZvaWQgKmRhdGEpCiB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CiAJc3RydWN0IGJzY19ybGxfcmVxICpybGxyID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgYnNjX3JsbF9yZXEpOwogCXVfaW50OF90IGxpbmtfaWQ7CiAJaWYgKCFybGxyKQpAQCAtODMsNyArODcsNyBAQAogCSAgICAgbGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX1RDSF9IKSAmJiBzYXBpICE9IDApCiAJCWxpbmtfaWQgfD0gMHg0MDsKIAotCXVzZV9sY2hhbihsY2hhbik7CisJY29ubiA9ICZsY2hhbi0+Y29ubjsKIAlybGxyLT5sY2hhbiA9IGxjaGFuOwogCXJsbHItPmxpbmtfaWQgPSBsaW5rX2lkOwogCXJsbHItPmNiID0gY2I7CkBAIC0xMTUsMyArMTE5LDI5IEBACiAJCX0KIAl9CiB9CisKK3N0YXRpYyBpbnQgcmxsX2xjaGFuX3NpZ25hbCh1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJICAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGNoYWxsb2Nfc2lnbmFsX2RhdGEgKmNoYWxsb2M7CisJc3RydWN0IGJzY19ybGxfcmVxICpybGxyLCAqcmxscjI7CisKKwlpZiAoc3Vic3lzICE9IFNTX0NIQUxMT0MgfHwgc2lnbmFsICE9IFNfQ0hBTExPQ19GUkVFRCkKKwkJcmV0dXJuIDA7CisKKwljaGFsbG9jID0gKHN0cnVjdCBjaGFsbG9jX3NpZ25hbF9kYXRhICopIHNpZ25hbF9kYXRhOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShybGxyLCBybGxyMiwgJmJzY19ybGxfcmVxcywgbGlzdCkgeworCQlpZiAocmxsci0+bGNoYW4gPT0gY2hhbGxvYy0+bGNoYW4pIHsKKwkJCWJzY19kZWxfdGltZXIoJnJsbHItPnRpbWVyKTsKKwkJCWNvbXBsZXRlX3JsbHIocmxsciwgQlNDX1JMTFJfSU5EX0VSUl9JTkQpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfcmxsKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfQ0hBTExPQywgcmxsX2xjaGFuX3NpZ25hbCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfdmVyc2lvbi5jIGIvb3BlbmJzYy9zcmMvYnNjX3ZlcnNpb24uYwppbmRleCAwMjY2MTk0Li40MzJlNjNiIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9ic2NfdmVyc2lvbi5jCisrKyBiL29wZW5ic2Mvc3JjL2JzY192ZXJzaW9uLmMKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2luY2x1ZGUgImJzY2NvbmZpZy5oIgogCi1jb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb24gPSAiT3BlbkJTQyAiIFBBQ0tBR0VfVkVSU0lPTjsKIGNvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0ID0KIAkiQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgSGFyYWxkIFdlbHRlLCBIb2xnZXIgRnJleXRoZXJcbiIKIAkiQ29udHJpYnV0aW9ucyBieSBEYW5pZWwgV2lsbG1hbm4sIEphbiBMw7xiYmUsU3RlZmFuIFNjaG1pZHRcbiIKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2UuYyBiL29wZW5ic2Mvc3JjL2JzY192dHkuYwpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBvcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMKcmVuYW1lIHRvIG9wZW5ic2Mvc3JjL2JzY192dHkuYwppbmRleCBlODk0ODY5Li5hMTcwNjRkIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMKKysrIGIvb3BlbmJzYy9zcmMvYnNjX3Z0eS5jCkBAIC0yMiw5ICsyMiwxMSBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KLSNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+Ci0jaW5jbHVkZSA8dnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAKQEAgLTM3LDkgKzM5LDM4IEBACiAjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgogI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KICNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KLSNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KIAotc3RhdGljIHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworI2luY2x1ZGUgIi4uL2JzY2NvbmZpZy5oIgorCisvKiBGSVhNRTogdGhpcyBzaG91bGQgZ28gdG8gc29tZSBjb21tb24gZmlsZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgZ3Byc19uc190aW1lcl9zdHJzW10gPSB7CisJeyAwLCAidG5zLWJsb2NrIiB9LAorCXsgMSwgInRucy1ibG9jay1yZXRyaWVzIiB9LAorCXsgMiwgInRucy1yZXNldCIgfSwKKwl7IDMsICJ0bnMtcmVzZXQtcmV0cmllcyIgfSwKKwl7IDQsICJ0bnMtdGVzdCIgfSwKKwl7IDUsICJ0bnMtYWxpdmUiIH0sCisJeyA2LCAidG5zLWFsaXZlLXJldHJpZXMiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdwcnNfYnNzZ3BfY2ZnX3N0cnNbXSA9IHsKKwl7IDAsCSJibG9ja2luZy10aW1lciIgfSwKKwl7IDEsCSJibG9ja2luZy1yZXRyaWVzIiB9LAorCXsgMiwJInVuYmxvY2tpbmctcmV0cmllcyIgfSwKKwl7IDMsCSJyZXNldC10aW1lciIgfSwKKwl7IDQsCSJyZXNldC1yZXRyaWVzIiB9LAorCXsgNSwJInN1c3BlbmQtdGltZXIiIH0sCisJeyA2LAkic3VzcGVuZC1yZXRyaWVzIiB9LAorCXsgNywJInJlc3VtZS10aW1lciIgfSwKKwl7IDgsCSJyZXN1bWUtcmV0cmllcyIgfSwKKwl7IDksCSJjYXBhYmlsaXR5LXVwZGF0ZS10aW1lciIgfSwKKwl7IDEwLAkiY2FwYWJpbGl0eS11cGRhdGUtcmV0cmllcyIgfSwKKwl7IDAsCU5VTEwgfQorfTsKIAogc3RydWN0IGNtZF9ub2RlIG5ldF9ub2RlID0gewogCUdTTU5FVF9OT0RFLApAQCAtNjUsNiArOTYsMjEgQEAKIAkxLAogfTsKIAorZXh0ZXJuIHN0cnVjdCBnc21fbmV0d29yayAqYnNjX2dzbW5ldDsKKworc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXRfZnJvbV92dHkoc3RydWN0IHZ0eSAqdikKK3sKKwkvKiBJbiBjYXNlIHdlIHJlYWQgZnJvbSB0aGUgY29uZmlnIGZpbGUsIHRoZSB2dHktPnByaXYgY2Fubm90CisJICogcG9pbnQgdG8gYSBzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24sIGFuZCB0aHVzIGNvbm4tPnByaXYKKwkgKiB3aWxsIG5vdCBwb2ludCB0byB0aGUgZ3NtX25ldHdvcmsgc3RydWN0dXJlICovCisjaWYgMAorCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubiA9IHYtPnByaXY7CisJcmV0dXJuIChzdHJ1Y3QgZ3NtX25ldHdvcmsgKikgY29ubi0+cHJpdjsKKyNlbHNlCisJcmV0dXJuIGJzY19nc21uZXQ7CisjZW5kaWYKK30KKwogc3RhdGljIGludCBkdW1teV9jb25maWdfd3JpdGUoc3RydWN0IHZ0eSAqdikKIHsKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CkBAIC0xMzAsNyArMTc2LDcgQEAKIERFRlVOKHNob3dfbmV0LCBzaG93X25ldF9jbWQsICJzaG93IG5ldHdvcmsiLAogCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgR1NNIE5FVFdPUktcbiIpCiB7Ci0Jc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKIAluZXRfZHVtcF92dHkodnR5LCBuZXQpOwogCiAJcmV0dXJuIENNRF9TVUNDRVNTOwpAQCAtMTYyLDggKzIwOCwxMCBAQAogCQkiQlNJQyAldSwgVFNDICV1IGFuZCAldSBUUlglcyIsCiAJCWJ0cy0+bnIsIGJ0c3R5cGUyc3RyKGJ0cy0+dHlwZSksIGdzbV9iYW5kX25hbWUoYnRzLT5iYW5kKSwKIAkJYnRzLT5jZWxsX2lkZW50aXR5LAotCQlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSwgYnRzLT5ic2ljLCBidHMtPnRzYywgCisJCWJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLCBidHMtPmJzaWMsIGJ0cy0+dHNjLAogCQlidHMtPm51bV90cngsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkRlc2NyaXB0aW9uOiAlcyVzIiwKKwkJYnRzLT5kZXNjcmlwdGlvbiA/IGJ0cy0+ZGVzY3JpcHRpb24gOiAiKG51bGwpIiwgVlRZX05FV0xJTkUpOwogCXZ0eV9vdXQodnR5LCAiTVMgTWF4IHBvd2VyOiAldSBkQm0lcyIsIGJ0cy0+bXNfbWF4X3Bvd2VyLCBWVFlfTkVXTElORSk7CiAJdnR5X291dCh2dHksICJNaW5pbXVtIFJ4IExldmVsIGZvciBBY2Nlc3M6ICVpIGRCbSVzIiwKIAkJcnhsZXYyZGJtKGJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5yeGxldl9hY2NfbWluKSwKQEAgLTIwMiw3ICsyNTAsNyBAQAogCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgQlRTXG4iCiAJCSJCVFMgbnVtYmVyIikKIHsKLQlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOwogCWludCBidHNfbnI7CiAKIAlpZiAoYXJnYyAhPSAwKSB7CkBAIC0yNjUsNiArMzEzLDEyIEBACiAJaW50IGk7CiAKIAl2dHlfb3V0KHZ0eSwgIiAgdHJ4ICV1JXMiLCB0cngtPm5yLCBWVFlfTkVXTElORSk7CisJaWYgKHRyeC0+ZGVzY3JpcHRpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgZGVzY3JpcHRpb24gJXMlcyIsIHRyeC0+ZGVzY3JpcHRpb24sCisJCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICByZl9sb2NrZWQgJXUlcyIsCisJCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPT0gTk1fU1RBVEVfTE9DS0VEID8gMSA6IDAsCisJCVZUWV9ORVdMSU5FKTsKIAl2dHlfb3V0KHZ0eSwgIiAgIGFyZmNuICV1JXMiLCB0cngtPmFyZmNuLCBWVFlfTkVXTElORSk7CiAJdnR5X291dCh2dHksICIgICBub21pbmFsIHBvd2VyICV1JXMiLCB0cngtPm5vbWluYWxfcG93ZXIsIFZUWV9ORVdMSU5FKTsKIAl2dHlfb3V0KHZ0eSwgIiAgIG1heF9wb3dlcl9yZWQgJXUlcyIsIHRyeC0+bWF4X3Bvd2VyX3JlZCwgVlRZX05FV0xJTkUpOwpAQCAtMjc1LDEzICszMjksNTMgQEAKIAkJY29uZmlnX3dyaXRlX3RzX3NpbmdsZSh2dHksICZ0cngtPnRzW2ldKTsKIH0KIAorc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX2J0c19ncHJzKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBtb2RlICVzJXMiLCBidHNfZ3Byc19tb2RlX25hbWUoYnRzLT5ncHJzLm1vZGUpLAorCQlWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpCisJCXJldHVybjsKKworCXZ0eV9vdXQodnR5LCAiICBncHJzIHJvdXRpbmcgYXJlYSAldSVzIiwgYnRzLT5ncHJzLnJhYywKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBncHJzIGNlbGwgYnZjaSAldSVzIiwgYnRzLT5ncHJzLmNlbGwuYnZjaSwKKwkJVlRZX05FV0xJTkUpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5jZWxsLnRpbWVyKTsgaSsrKQorCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBjZWxsIHRpbWVyICVzICV1JXMiLAorCQkJZ2V0X3ZhbHVlX3N0cmluZyhncHJzX2Jzc2dwX2NmZ19zdHJzLCBpKSwKKwkJCWJ0cy0+Z3Bycy5jZWxsLnRpbWVyW2ldLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGdwcnMgbnNlaSAldSVzIiwgYnRzLT5ncHJzLm5zZS5uc2VpLAorCQlWVFlfTkVXTElORSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zZS50aW1lcik7IGkrKykKKwkJdnR5X291dCh2dHksICIgIGdwcnMgbnMgdGltZXIgJXMgJXUlcyIsCisJCQlnZXRfdmFsdWVfc3RyaW5nKGdwcnNfbnNfdGltZXJfc3RycywgaSksCisJCQlidHMtPmdwcnMubnNlLnRpbWVyW2ldLCBWVFlfTkVXTElORSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpOyBpKyspIHsKKwkJc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjICpuc3ZjID0KKwkJCQkJJmJ0cy0+Z3Bycy5uc3ZjW2ldOworCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCQlpYS5zX2FkZHIgPSBodG9ubChuc3ZjLT5yZW1vdGVfaXApOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IG5zdmNpICV1JXMiLCBpLAorCQkJbnN2Yy0+bnN2Y2ksIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSBsb2NhbCB1ZHAgcG9ydCAldSVzIiwgaSwKKwkJCW5zdmMtPmxvY2FsX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSByZW1vdGUgdWRwIHBvcnQgJXUlcyIsIGksCisJCQluc3ZjLT5yZW1vdGVfcG9ydCwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IHJlbW90ZSBpcCAlcyVzIiwgaSwKKwkJCWluZXRfbnRvYShpYSksIFZUWV9ORVdMSU5FKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV9idHNfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKIHsKIAlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKLQlpbnQgaTsKIAogCXZ0eV9vdXQodnR5LCAiIGJ0cyAldSVzIiwgYnRzLT5uciwgVlRZX05FV0xJTkUpOwogCXZ0eV9vdXQodnR5LCAiICB0eXBlICVzJXMiLCBidHN0eXBlMnN0cihidHMtPnR5cGUpLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+ZGVzY3JpcHRpb24pCisJCXZ0eV9vdXQodnR5LCAiICBkZXNjcmlwdGlvbiAlcyVzIiwgYnRzLT5kZXNjcmlwdGlvbiwgVlRZX05FV0xJTkUpOwogCXZ0eV9vdXQodnR5LCAiICBiYW5kICVzJXMiLCBnc21fYmFuZF9uYW1lKGJ0cy0+YmFuZCksIFZUWV9ORVdMSU5FKTsKIAl2dHlfb3V0KHZ0eSwgIiAgY2VsbF9pZGVudGl0eSAldSVzIiwgYnRzLT5jZWxsX2lkZW50aXR5LCBWVFlfTkVXTElORSk7CiAJdnR5X291dCh2dHksICIgIGxvY2F0aW9uX2FyZWFfY29kZSAldSVzIiwgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsCkBAIC0zMDQsOCArMzk4LDE3IEBACiAJdnR5X291dCh2dHksICIgIHJhY2ggbWF4IHRyYW5zbWlzc2lvbiAldSVzIiwKIAkJcmFjaF9tYXhfdHJhbnNfcmF3MnZhbChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zKSwKIAkJVlRZX05FV0xJTkUpOworCisJaWYgKGJ0cy0+cmFjaF9iX3RocmVzaCAhPSAtMSkKKwkJdnR5X291dCh2dHksICIgIHJhY2ggbm0gYnVzeSB0aHJlc2hvbGQgJXUlcyIsCisJCQlidHMtPnJhY2hfYl90aHJlc2gsIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5yYWNoX2xkYXZnX3Nsb3RzICE9IC0xKQorCQl2dHlfb3V0KHZ0eSwgIiAgcmFjaCBubSBsb2FkIGF2ZXJhZ2UgJXUlcyIsCisJCQlidHMtPnJhY2hfbGRhdmdfc2xvdHMsIFZUWV9ORVdMSU5FKTsKIAlpZiAoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyKQogCQl2dHlfb3V0KHZ0eSwgIiAgY2VsbCBiYXJyZWQgMSVzIiwgVlRZX05FV0xJTkUpOworCWlmICgoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnQyICYgMHg0KSA9PSAwKQorCQl2dHlfb3V0KHZ0eSwgIiAgcmFjaCBlbWVyZ2VuY3kgY2FsbCBhbGxvd2VkIDElcyIsIFZUWV9ORVdMSU5FKTsKIAlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKIAkJdnR5X291dCh2dHksICIgIGlwLmFjY2VzcyB1bml0X2lkICV1ICV1JXMiLAogCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLCBWVFlfTkVXTElORSk7CkBAIC0zMTQsMzAgKzQxNyw3IEBACiAJCWNvbmZpZ193cml0ZV9lMV9saW5rKHZ0eSwgJmJ0cy0+b21sX2UxX2xpbmssICIgIG9tbCAiKTsKIAkJdnR5X291dCh2dHksICIgIG9tbCBlMSB0ZWkgJXUlcyIsIGJ0cy0+b21sX3RlaSwgVlRZX05FV0xJTkUpOwogCX0KLQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBlbmFibGVkICV1JXMiLCBidHMtPmdwcnMuZW5hYmxlZCwgVlRZX05FV0xJTkUpOwotCWlmIChidHMtPmdwcnMuZW5hYmxlZCkgewotCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyByb3V0aW5nIGFyZWEgJXUlcyIsIGJ0cy0+Z3Bycy5yYWMsCi0JCQlWVFlfTkVXTElORSk7Ci0JCXZ0eV9vdXQodnR5LCAiICBncHJzIGNlbGwgYnZjaSAldSVzIiwgYnRzLT5ncHJzLmNlbGwuYnZjaSwKLQkJCVZUWV9ORVdMSU5FKTsKLQkJdnR5X291dCh2dHksICIgIGdwcnMgbnNlaSAldSVzIiwgYnRzLT5ncHJzLm5zZS5uc2VpLAotCQkJVlRZX05FV0xJTkUpOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHMtPmdwcnMubnN2Yyk7IGkrKykgewotCQkJc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjICpuc3ZjID0KLQkJCQkJCSZidHMtPmdwcnMubnN2Y1tpXTsKLQkJCXN0cnVjdCBpbl9hZGRyIGlhOwotCi0JCQlpYS5zX2FkZHIgPSBodG9ubChuc3ZjLT5yZW1vdGVfaXApOwotCQkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSBuc3ZjaSAldSVzIiwgaSwKLQkJCQluc3ZjLT5uc3ZjaSwgVlRZX05FV0xJTkUpOwotCQkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSBsb2NhbCB1ZHAgcG9ydCAldSVzIiwgaSwKLQkJCQluc3ZjLT5sb2NhbF9wb3J0LCBWVFlfTkVXTElORSk7Ci0JCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IHJlbW90ZSB1ZHAgcG9ydCAldSVzIiwgaSwKLQkJCQluc3ZjLT5yZW1vdGVfcG9ydCwgVlRZX05FV0xJTkUpOwotCQkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSByZW1vdGUgaXAgJXMlcyIsIGksCi0JCQkJaW5ldF9udG9hKGlhKSwgVlRZX05FV0xJTkUpOwotCQl9Ci0JfQorCWNvbmZpZ193cml0ZV9idHNfZ3Bycyh2dHksIGJ0cyk7CiAKIAlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQogCQljb25maWdfd3JpdGVfdHJ4X3NpbmdsZSh2dHksIHRyeCk7CkBAIC0zNDUsNiArNDI1LDcgQEAKIAogc3RhdGljIGludCBjb25maWdfd3JpdGVfYnRzKHN0cnVjdCB2dHkgKnYpCiB7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodik7CiAJc3RydWN0IGdzbV9idHMgKmJ0czsKIAogCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJmdzbW5ldC0+YnRzX2xpc3QsIGxpc3QpCkBAIC0zNTUsNiArNDM2LDggQEAKIAogc3RhdGljIGludCBjb25maWdfd3JpdGVfbmV0KHN0cnVjdCB2dHkgKnZ0eSkKIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCiAJdnR5X291dCh2dHksICJuZXR3b3JrJXMiLCBWVFlfTkVXTElORSk7CiAJdnR5X291dCh2dHksICIgbmV0d29yayBjb3VudHJ5IGNvZGUgJXUlcyIsIGdzbW5ldC0+Y291bnRyeV9jb2RlLCBWVFlfTkVXTElORSk7CiAJdnR5X291dCh2dHksICIgbW9iaWxlIG5ldHdvcmsgY29kZSAldSVzIiwgZ3NtbmV0LT5uZXR3b3JrX2NvZGUsIFZUWV9ORVdMSU5FKTsKQEAgLTQwMCw2ICs0ODMsOCBAQAogewogCXZ0eV9vdXQodnR5LCAiVFJYICV1IG9mIEJUUyAldSBpcyBvbiBBUkZDTiAldSVzIiwKIAkJdHJ4LT5uciwgdHJ4LT5idHMtPm5yLCB0cngtPmFyZmNuLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJEZXNjcmlwdGlvbjogJXMlcyIsCisJCXRyeC0+ZGVzY3JpcHRpb24gPyB0cngtPmRlc2NyaXB0aW9uIDogIihudWxsKSIsIFZUWV9ORVdMSU5FKTsKIAl2dHlfb3V0KHZ0eSwgIiAgUkYgTm9taW5hbCBQb3dlcjogJWQgZEJtLCByZWR1Y2VkIGJ5ICV1IGRCLCAiCiAJCSJyZXN1bHRpbmcgQlMgcG93ZXI6ICVkIGRCbSVzIiwKIAkJdHJ4LT5ub21pbmFsX3Bvd2VyLCB0cngtPm1heF9wb3dlcl9yZWQsCkBAIC00MjAsOSArNTA1LDExIEBACiBERUZVTihzaG93X3RyeCwKICAgICAgIHNob3dfdHJ4X2NtZCwKICAgICAgICJzaG93IHRyeCBbYnRzX25yXSBbdHJ4X25yXSIsCi0JU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBUUlhcbiIpCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBUUlhcbiIKKwkiQlRTIE51bWJlclxuIgorCSJUUlggTnVtYmVyXG4iKQogewotCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CiAJc3RydWN0IGdzbV9idHMgKmJ0cyA9IE5VTEw7CiAJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CiAJaW50IGJ0c19uciwgdHJ4X25yOwpAQCAtNDg1LDkgKzU3MiwxMCBAQAogREVGVU4oc2hvd190cywKICAgICAgIHNob3dfdHNfY21kLAogICAgICAgInNob3cgdGltZXNsb3QgW2J0c19ucl0gW3RyeF9ucl0gW3RzX25yXSIsCi0JU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBUU1xuIikKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIFRTXG4iCisJIkJUUyBOdW1iZXJcbiIgIlRSWCBOdW1iZXJcbiIgIlRpbWVzbG90IE51bWJlclxuIikKIHsKLQlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOwogCXN0cnVjdCBnc21fYnRzICpidHM7CiAJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CiAJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKQEAgLTUzOSwxMCArNjI3LDYgQEAKIAogc3RhdGljIHZvaWQgc3Vic2NyX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCiB7Ci0JaW50IHJjOwotCXN0cnVjdCBnc21fYXV0aF9pbmZvIGFpbmZvOwotCXN0cnVjdCBnc21fYXV0aF90dXBsZSBhdHVwbGU7Ci0KIAl2dHlfb3V0KHZ0eSwgIiAgICBJRDogJWxsdSwgQXV0aG9yaXplZDogJWQlcyIsIHN1YnNjci0+aWQsCiAJCXN1YnNjci0+YXV0aG9yaXplZCwgVlRZX05FV0xJTkUpOwogCWlmIChzdWJzY3ItPm5hbWUpCkBAIC01OTMsMjkgKzY3NywyOSBAQAogCW1lYXNfcmVwX2R1bXBfdW5pX3Z0eSh2dHksICZtci0+dWwsIHByZWZpeCwgInVsIik7CiB9CiAKLXN0YXRpYyB2b2lkIGxjaGFuX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCitzdGF0aWMgdm9pZCBsY2hhbl9kdW1wX2Z1bGxfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCiB7CiAJaW50IGlkeDsKIAogCXZ0eV9vdXQodnR5LCAiTGNoYW4gJXUgaW4gVGltZXNsb3QgJXUgb2YgVFJYICV1IGluIEJUUyAldSwgVHlwZSAlcyVzIiwKLQkJbGNoYW4tPm5yLCBsY2hhbi0+dHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIAorCQlsY2hhbi0+bnIsIGxjaGFuLT50cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwKIAkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGdzbV9sY2hhbnRfbmFtZShsY2hhbi0+dHlwZSksCiAJCVZUWV9ORVdMSU5FKTsKLQl2dHlfb3V0KHZ0eSwgIiAgVXNlIENvdW50OiAldSwgU3RhdGU6ICVzJXMiLCBsY2hhbi0+dXNlX2NvdW50LAorCXZ0eV9vdXQodnR5LCAiICBVc2UgQ291bnQ6ICV1LCBTdGF0ZTogJXMlcyIsIGxjaGFuLT5jb25uLnVzZV9jb3VudCwKIAkJZ3NtX2xjaGFuc19uYW1lKGxjaGFuLT5zdGF0ZSksIFZUWV9ORVdMSU5FKTsKIAl2dHlfb3V0KHZ0eSwgIiAgQlMgUG93ZXI6ICV1IGRCbSwgTVMgUG93ZXI6ICV1IGRCbSVzIiwKIAkJbGNoYW4tPnRzLT50cngtPm5vbWluYWxfcG93ZXIgLSBsY2hhbi0+dHMtPnRyeC0+bWF4X3Bvd2VyX3JlZAogCQktIGxjaGFuLT5ic19wb3dlcioyLAogCQltc19wd3JfZGJtKGxjaGFuLT50cy0+dHJ4LT5idHMtPmJhbmQsIGxjaGFuLT5tc19wb3dlciksCiAJCVZUWV9ORVdMSU5FKTsKLQlpZiAobGNoYW4tPnN1YnNjcikgeworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IpIHsKIAkJdnR5X291dCh2dHksICIgIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7Ci0JCXN1YnNjcl9kdW1wX3Z0eSh2dHksIGxjaGFuLT5zdWJzY3IpOworCQlzdWJzY3JfZHVtcF92dHkodnR5LCBsY2hhbi0+Y29ubi5zdWJzY3IpOwogCX0gZWxzZQogCQl2dHlfb3V0KHZ0eSwgIiAgTm8gU3Vic2NyaWJlciVzIiwgVlRZX05FV0xJTkUpOwogCWlmIChpc19pcGFjY2Vzc19idHMobGNoYW4tPnRzLT50cngtPmJ0cykpIHsKIAkJc3RydWN0IGluX2FkZHIgaWE7Ci0JCWlhLnNfYWRkciA9IGxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwOworCQlpYS5zX2FkZHIgPSBodG9ubChsY2hhbi0+YWJpc19pcC5ib3VuZF9pcCk7CiAJCXZ0eV9vdXQodnR5LCAiICBCb3VuZCBJUDogJXMgUG9ydCAldSBSVFBfVFlQRTI9JXUgQ09OTl9JRD0ldSVzIiwKIAkJCWluZXRfbnRvYShpYSksIGxjaGFuLT5hYmlzX2lwLmJvdW5kX3BvcnQsCiAJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIsIGxjaGFuLT5hYmlzX2lwLmNvbm5faWQsCkBAIC02MjgsMzkgKzcxMiwzMCBAQAogCW1lYXNfcmVwX2R1bXBfdnR5KHZ0eSwgJmxjaGFuLT5tZWFzX3JlcFtpZHhdLCAiICAiKTsKIH0KIAotI2lmIDAKLVRPRE86IGNhbGxyZWYgYW5kIHJlbW90ZSBjYWxscmVmIG9mIGNhbGwgbXVzdCBiZSByZXNvbHZlZCB0byBnZXQgZ3NtX3RyYW5zIG9iamVjdAotc3RhdGljIHZvaWQgY2FsbF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fY2FsbCAqY2FsbCkKK3N0YXRpYyB2b2lkIGxjaGFuX2R1bXBfc2hvcnRfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCiB7Ci0JdnR5X291dCh2dHksICJDYWxsIFR5cGUgJXUsIFN0YXRlICV1LCBUcmFuc2FjdGlvbiBJRCAldSVzIiwKLQkJY2FsbC0+dHlwZSwgY2FsbC0+c3RhdGUsIGNhbGwtPnRyYW5zYWN0aW9uX2lkLCBWVFlfTkVXTElORSk7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbXI7CisJaW50IGlkeDsKIAotCWlmIChjYWxsLT5sb2NhbF9sY2hhbikgewotCQl2dHlfb3V0KHZ0eSwgIkNhbGwgTG9jYWwgQ2hhbm5lbDolcyIsIFZUWV9ORVdMSU5FKTsKLQkJbGNoYW5fZHVtcF92dHkodnR5LCBjYWxsLT5sb2NhbF9sY2hhbik7Ci0JfSBlbHNlCi0JCXZ0eV9vdXQodnR5LCAiQ2FsbCBoYXMgbm8gTG9jYWwgQ2hhbm5lbCVzIiwgVlRZX05FV0xJTkUpOworCS8qIHdlIHdhbnQgdG8gcmVwb3J0IHRoZSBsYXN0IG1lYXN1cmVtZW50IHJlcG9ydCAqLworCWlkeCA9IGNhbGNfaW5pdGlhbF9pZHgoQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApLAorCQkJICAgICAgIGxjaGFuLT5tZWFzX3JlcF9pZHgsIDEpOworCW1yID0gICZsY2hhbi0+bWVhc19yZXBbaWR4XTsKIAotCWlmIChjYWxsLT5yZW1vdGVfbGNoYW4pIHsKLQkJdnR5X291dCh2dHksICJDYWxsIFJlbW90ZSBDaGFubmVsOiVzIiwgVlRZX05FV0xJTkUpOwotCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGNhbGwtPnJlbW90ZV9sY2hhbik7Ci0JfSBlbHNlCi0JCXZ0eV9vdXQodnR5LCAiQ2FsbCBoYXMgbm8gUmVtb3RlIENoYW5uZWwlcyIsIFZUWV9ORVdMSU5FKTsKLQotCWlmIChjYWxsLT5jYWxsZWRfc3Vic2NyKSB7Ci0JCXZ0eV9vdXQodnR5LCAiQ2FsbGVkIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7Ci0JCXN1YnNjcl9kdW1wX3Z0eSh2dHksIGNhbGwtPmNhbGxlZF9zdWJzY3IpOwotCX0gZWxzZQotCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIENhbGxlZCBTdWJzY3JpYmVyJXMiLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJMY2hhbjogJXUgVGltZXNsb3Q6ICV1IFRSWDogJXUgQlRTOiAldSBUeXBlOiAlcyAtIEwxIE1TIFBvd2VyOiAldSBkQm0gIgorCQkgICAgICJSWEwtRlVMTC1kbDogJTRkIGRCbSBSWEwtRlVMTC11bDogJTRkIGRCbSVzIiwKKwkJbGNoYW4tPm5yLCBsY2hhbi0+dHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLAorCQltci0+bXNfbDEucHdyLAorCQlyeGxldjJkYm0obXItPmRsLmZ1bGwucnhfbGV2KSwKKwkJcnhsZXYyZGJtKG1yLT51bC5mdWxsLnJ4X2xldiksCisJCVZUWV9ORVdMSU5FKTsKIH0KLSNlbmRpZgogCi1ERUZVTihzaG93X2xjaGFuLAotICAgICAgc2hvd19sY2hhbl9jbWQsCi0gICAgICAic2hvdyBsY2hhbiBbYnRzX25yXSBbdHJ4X25yXSBbdHNfbnJdIFtsY2hhbl9ucl0iLAotCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgbG9naWNhbCBjaGFubmVsXG4iKQorc3RhdGljIGludCBsY2hhbl9zdW1tYXJ5KHN0cnVjdCB2dHkgKnZ0eSwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorCQkJIHZvaWQgKCpkdW1wX2NiKShzdHJ1Y3QgdnR5ICosIHN0cnVjdCBnc21fbGNoYW4gKikpCiB7Ci0Jc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKIAlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOwogCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OwogCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CkBAIC03MDMsNyArNzc4LDcgQEAKIAkJCXJldHVybiBDTURfV0FSTklORzsKIAkJfQogCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbGNoYW5fbnJdOwotCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGxjaGFuKTsKKwkJZHVtcF9jYih2dHksIGxjaGFuKTsKIAkJcmV0dXJuIENNRF9TVUNDRVNTOwogCX0KIAlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKQEAgLTcxNyw3ICs3OTIsNyBAQAogCQkJCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbGNoYW5fbnJdOwogCQkJCQlpZiAobGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX05PTkUpCiAJCQkJCQljb250aW51ZTsKLQkJCQkJbGNoYW5fZHVtcF92dHkodnR5LCBsY2hhbik7CisJCQkJCWR1bXBfY2IodnR5LCBsY2hhbik7CiAJCQkJfQogCQkJfQogCQl9CkBAIC03MjYsNiArODAxLDI4IEBACiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCisKK0RFRlVOKHNob3dfbGNoYW4sCisgICAgICBzaG93X2xjaGFuX2NtZCwKKyAgICAgICJzaG93IGxjaGFuIFtidHNfbnJdIFt0cnhfbnJdIFt0c19ucl0gW2xjaGFuX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2dpY2FsIGNoYW5uZWxcbiIKKwkiQlRTIE51bWJlclxuIiAiVFJYIE51bWJlclxuIiAiVGltZXNsb3QgTnVtYmVyXG4iCisJIkxvZ2ljYWwgQ2hhbm5lbCBOdW1iZXJcbiIpCisKK3sKKwlyZXR1cm4gbGNoYW5fc3VtbWFyeSh2dHksIGFyZ2MsIGFyZ3YsIGxjaGFuX2R1bXBfZnVsbF92dHkpOworfQorCitERUZVTihzaG93X2xjaGFuX3N1bW1hcnksCisgICAgICBzaG93X2xjaGFuX3N1bW1hcnlfY21kLAorICAgICAgInNob3cgbGNoYW4gc3VtbWFyeSBbYnRzX25yXSBbdHJ4X25yXSBbdHNfbnJdIFtsY2hhbl9ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgbG9naWNhbCBjaGFubmVsXG4iCisJIkJUUyBOdW1iZXJcbiIgIlRSWCBOdW1iZXJcbiIgIlRpbWVzbG90IE51bWJlclxuIgorCSJMb2dpY2FsIENoYW5uZWwgTnVtYmVyXG4iKQoreworCXJldHVybiBsY2hhbl9zdW1tYXJ5KHZ0eSwgYXJnYywgYXJndiwgbGNoYW5fZHVtcF9zaG9ydF92dHkpOworfQorCiBzdGF0aWMgdm9pZCBlMWRydl9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBlMWlucF9kcml2ZXIgKmRydikKIHsKIAl2dHlfb3V0KHZ0eSwgIkUxIElucHV0IERyaXZlciAlcyVzIiwgZHJ2LT5uYW1lLCBWVFlfTkVXTElORSk7CkBAIC03NTQsNyArODUxLDggQEAKIERFRlVOKHNob3dfZTFsaW5lLAogICAgICAgc2hvd19lMWxpbmVfY21kLAogICAgICAgInNob3cgZTFfbGluZSBbbGluZV9ucl0iLAotCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgRTEgbGluZVxuIikKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIEUxIGxpbmVcbiIKKwkiRTEgTGluZSBOdW1iZXJcbiIpCiB7CiAJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CiAKQEAgLTc4Nyw3ICs4ODUsOCBAQAogREVGVU4oc2hvd19lMXRzLAogICAgICAgc2hvd19lMXRzX2NtZCwKICAgICAgICJzaG93IGUxX3RpbWVzbG90IFtsaW5lX25yXSBbdHNfbnJdIiwKLQlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIEUxIHRpbWVzbG90XG4iKQorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgRTEgdGltZXNsb3RcbiIKKwkiRTEgTGluZSBOdW1iZXJcbiIgIkUxIFRpbWVzbG90IE51bWJlclxuIikKIHsKIAlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IE5VTEw7CiAJc3RydWN0IGUxaW5wX3RzICp0czsKQEAgLTg1MSw5ICs5NTAsMTAgQEAKIERFRlVOKHNob3dfcGFnaW5nLAogICAgICAgc2hvd19wYWdpbmdfY21kLAogICAgICAgInNob3cgcGFnaW5nIFtidHNfbnJdIiwKLQlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBwYWdpbmcgcmV1cWVzdHMgb2YgYSBCVFNcbiIpCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgcGFnaW5nIHJldXFlc3RzIG9mIGEgQlRTXG4iCisJIkJUUyBOdW1iZXJcbiIpCiB7Ci0Jc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKIAlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOwogCWludCBidHNfbnI7CiAKQEAgLTg3OCwyNTAgKzk3OCwxMyBAQAogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAotc3RhdGljIHZvaWQgX3Z0eV9vdXRwdXQoc3RydWN0IGRlYnVnX3RhcmdldCAqdGd0LCBjb25zdCBjaGFyICpsaW5lKQotewotCXN0cnVjdCB2dHkgKnZ0eSA9IHRndC0+dGd0X3Z0eS52dHk7Ci0JdnR5X291dCh2dHksICIlcyIsIGxpbmUpOwotCS8qIFRoaXMgaXMgYW4gdWdseSBoYWNrLCBidXQgdGhlcmUgaXMgbm8gZWFzeSB3YXkuLi4gKi8KLQlpZiAoc3RyY2hyKGxpbmUsICdcbicpKQotCQl2dHlfb3V0KHZ0eSwgIlxyIik7Ci19Ci0KLXN0cnVjdCBkZWJ1Z190YXJnZXQgKmRlYnVnX3RhcmdldF9jcmVhdGVfdnR5KHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQ7Ci0KLQl0YXJnZXQgPSBkZWJ1Z190YXJnZXRfY3JlYXRlKCk7Ci0JaWYgKCF0YXJnZXQpCi0JCXJldHVybiBOVUxMOwotCi0JdGFyZ2V0LT50Z3RfdnR5LnZ0eSA9IHZ0eTsKLQl0YXJnZXQtPm91dHB1dCA9IF92dHlfb3V0cHV0OwotCXJldHVybiB0YXJnZXQ7Ci19Ci0KLURFRlVOKGVuYWJsZV9sb2dnaW5nLAotICAgICAgZW5hYmxlX2xvZ2dpbmdfY21kLAotICAgICAgImxvZ2dpbmcgZW5hYmxlIiwKLSAgICAgICJFbmFibGVzIGxvZ2dpbmcgdG8gdGhpcyB2dHlcbiIpCi17Ci0Jc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOwotCi0JY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OwotCWlmIChjb25uLT5kYmcpIHsKLQkJdnR5X291dCh2dHksICJMb2dnaW5nIGFscmVhZHkgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKLQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCX0KLQotCWNvbm4tPmRiZyA9IGRlYnVnX3RhcmdldF9jcmVhdGVfdnR5KHZ0eSk7Ci0JaWYgKCFjb25uLT5kYmcpCi0JCXJldHVybiBDTURfV0FSTklORzsKLQotCWRlYnVnX2FkZF90YXJnZXQoY29ubi0+ZGJnKTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOKGxvZ2dpbmdfZmx0cl9pbXNpLAotICAgICAgbG9nZ2luZ19mbHRyX2ltc2lfY21kLAotICAgICAgImxvZ2dpbmcgZmlsdGVyIGltc2kgSU1TSSIsCi0gICAgICAiUHJpbnQgYWxsIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gYSBJTVNJXG4iKQotewotCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKLQotCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKLQlpZiAoIWNvbm4tPmRiZykgewotCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JZGVidWdfc2V0X2ltc2lfZmlsdGVyKGNvbm4tPmRiZywgYXJndlswXSk7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihsb2dnaW5nX2ZsdHJfYWxsLAotICAgICAgbG9nZ2luZ19mbHRyX2FsbF9jbWQsCi0gICAgICAibG9nZ2luZyBmaWx0ZXIgYWxsIDwwLTE+IiwKLSAgICAgICJQcmludCBhbGwgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGVcbiIpCi17Ci0Jc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOwotCi0JY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OwotCWlmICghY29ubi0+ZGJnKSB7Ci0JCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7Ci0JCXJldHVybiBDTURfV0FSTklORzsKLQl9Ci0KLQlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4obG9nZ2luZ191c2VfY2xyLAotICAgICAgbG9nZ2luZ191c2VfY2xyX2NtZCwKLSAgICAgICJsb2dnaW5nIGNvbG9yIDwwLTE+IiwKLSAgICAgICJVc2UgY29sb3IgZm9yIHByaW50aW5nIG1lc3NhZ2VzXG4iKQotewotCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKLQotCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKLQlpZiAoIWNvbm4tPmRiZykgewotCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JZGVidWdfc2V0X3VzZV9jb2xvcihjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4obG9nZ2luZ19wcm50X3RpbWVzdGFtcCwKLSAgICAgIGxvZ2dpbmdfcHJudF90aW1lc3RhbXBfY21kLAotICAgICAgImxvZ2dpbmcgdGltZXN0YW1wIDwwLTE+IiwKLSAgICAgICJQcmludCB0aGUgdGltZXN0YW1wIG9mIGVhY2ggbWVzc2FnZVxuIikKLXsKLQlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47Ci0KLQljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7Ci0JaWYgKCFjb25uLT5kYmcpIHsKLQkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKLQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCX0KLQotCWRlYnVnX3NldF9wcmludF90aW1lc3RhbXAoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLS8qIEZJWE1FOiB0aG9zZSBoYXZlIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBsb2cgbGV2ZWxzIGFuZCBjYXRlZ29yaWVzICovCi0jZGVmaW5lIFZUWV9ERUJVR19DQVRFR09SSUVTICIocmxsfGNjfG1tfHJyfHJzbHxubXxzbXN8cGFnfG1uY2N8aW5wfG1pfG1pYnxtdXh8bWVhc3xzY2NwfG1zY3xtZ2NwfGhvfGRifHJlZikiCi0jZGVmaW5lIFZUWV9ERUJVR19MRVZFTFMgIihldmVyeXRoaW5nfGRlYnVnfGluZm98bm90aWNlfGVycm9yfGZhdGFsKSIKLURFRlVOKGxvZ2dpbmdfbGV2ZWwsCi0gICAgICBsb2dnaW5nX2xldmVsX2NtZCwKLSAgICAgICJsb2dnaW5nIGxldmVsICIgVlRZX0RFQlVHX0NBVEVHT1JJRVMgIiAiIFZUWV9ERUJVR19MRVZFTFMsCi0gICAgICAiU2V0IHRoZSBsb2cgbGV2ZWwgZm9yIGEgc3BlY2lmaWVkIGNhdGVnb3J5XG4iKQotewotCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKLQlpbnQgY2F0ZWdvcnkgPSBkZWJ1Z19wYXJzZV9jYXRlZ29yeShhcmd2WzBdKTsKLQlpbnQgbGV2ZWwgPSBkZWJ1Z19wYXJzZV9sZXZlbChhcmd2WzFdKTsKLQotCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKLQlpZiAoIWNvbm4tPmRiZykgewotCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JaWYgKGNhdGVnb3J5IDwgMCkgewotCQl2dHlfb3V0KHZ0eSwgIkludmFsaWQgY2F0ZWdvcnkgYCVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JaWYgKGxldmVsIDwgMCkgewotCQl2dHlfb3V0KHZ0eSwgIkludmFsaWQgbGV2ZWwgYCVzJyVzIiwgYXJndlsxXSwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JY29ubi0+ZGJnLT5jYXRlZ29yaWVzW2NhdGVnb3J5XS5lbmFibGVkID0gMTsKLQljb25uLT5kYmctPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmxvZ2xldmVsID0gbGV2ZWw7Ci0KLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOKGxvZ2dpbmdfc2V0X2NhdGVnb3J5X21hc2ssCi0gICAgICBsb2dnaW5nX3NldF9jYXRlZ29yeV9tYXNrX2NtZCwKLSAgICAgICJsb2dnaW5nIHNldCBkZWJ1ZyBtYXNrIE1BU0siLAotICAgICAgIkRlY2lkZSB3aGljaCBjYXRlZ29yaWVzIHRvIG91dHB1dC5cbiIpCi17Ci0Jc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOwotCi0JY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OwotCWlmICghY29ubi0+ZGJnKSB7Ci0JCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7Ci0JCXJldHVybiBDTURfV0FSTklORzsKLQl9Ci0KLQlkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKGNvbm4tPmRiZywgYXJndlswXSk7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihsb2dnaW5nX3NldF9sb2dfbGV2ZWwsCi0gICAgICBsb2dnaW5nX3NldF9sb2dfbGV2ZWxfY21kLAotICAgICAgImxvZ2dpbmcgc2V0IGxvZyBsZXZlbCA8MC04PiIsCi0gICAgICAiU2V0IHRoZSBnbG9iYWwgbG9nIGxldmVsLiBUaGUgdmFsdWUgMCBpbXBsaWVzIG5vIGZpbHRlcmluZy5cbiIpCi17Ci0Jc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOwotCi0JY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OwotCWlmICghY29ubi0+ZGJnKSB7Ci0JCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7Ci0JCXJldHVybiBDTURfV0FSTklORzsKLQl9Ci0KLQlkZWJ1Z19zZXRfbG9nX2xldmVsKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihkaWFibGVfbG9nZ2luZywKLSAgICAgIGRpc2FibGVfbG9nZ2luZ19jbWQsCi0gICAgICAibG9nZ2luZyBkaXNhYmxlIiwKLSAgICAgICJEaXNhYmxlcyBsb2dnaW5nIHRvIHRoaXMgdnR5XG4iKQotewotCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKLQotCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKLQlpZiAoIWNvbm4tPmRiZykgewotCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JZGVidWdfZGVsX3RhcmdldChjb25uLT5kYmcpOwotCXRhbGxvY19mcmVlKGNvbm4tPmRiZyk7Ci0JY29ubi0+ZGJnID0gTlVMTDsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOKHNob3dfc3RhdHMsCi0gICAgICBzaG93X3N0YXRzX2NtZCwKLSAgICAgICJzaG93IHN0YXRpc3RpY3MiLAotCVNIT1dfU1RSICJEaXNwbGF5IG5ldHdvcmsgc3RhdGlzdGljc1xuIikKLXsKLQlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKLQotCXZ0eV9vdXQodnR5LCAiQ2hhbm5lbCBSZXF1ZXN0cyAgICAgICAgOiAlbHUgdG90YWwsICVsdSBubyBjaGFubmVsJXMiLAotCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNocmVxLnRvdGFsKSwKLQkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5jaHJlcS5ub19jaGFubmVsKSwgVlRZX05FV0xJTkUpOwotCXZ0eV9vdXQodnR5LCAiTG9jYXRpb24gVXBkYXRlICAgICAgICAgOiAlbHUgYXR0YWNoLCAlbHUgbm9ybWFsLCAlbHUgcGVyaW9kaWMlcyIsCi0JCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmF0dGFjaCksCi0JCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLm5vcm1hbCksCi0JCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLnBlcmlvZGljKSwgVlRZX05FV0xJTkUpOwotCXZ0eV9vdXQodnR5LCAiSU1TSSBEZXRhY2ggSW5kaWNhdGlvbnMgOiAlbHUlcyIsCi0JCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmRldGFjaCksIFZUWV9ORVdMSU5FKTsKLQl2dHlfb3V0KHZ0eSwgIkxvY2F0aW9uIFVwZGF0ZSBSZXNwb25zZTogJWx1IGFjY2VwdCwgJWx1IHJlamVjdCVzIiwKLQkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AuYWNjZXB0KSwKLQkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AucmVqZWN0KSwgVlRZX05FV0xJTkUpOwotCXZ0eV9vdXQodnR5LCAiUGFnaW5nICAgICAgICAgICAgICAgICAgOiAlbHUgYXR0ZW1wdGVkLCAlbHUgY29tcGxldGUsICVsdSBleHBpcmVkJXMiLAotCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQpLAotCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5jb21wbGV0ZWQpLAotCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5leHBpcmVkKSwgVlRZX05FV0xJTkUpOwotCXZ0eV9vdXQodnR5LCAiSGFuZG92ZXIgICAgICAgICAgICAgICAgOiAlbHUgYXR0ZW1wdGVkLCAlbHUgbm9fY2hhbm5lbCwgJWx1IHRpbWVvdXQsICIKLQkJIiVsdSBjb21wbGV0ZWQsICVsdSBmYWlsZWQlcyIsCi0JCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIuYXR0ZW1wdGVkKSwKLQkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5ub19jaGFubmVsKSwKLQkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci50aW1lb3V0KSwKLQkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQpLAotCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmZhaWxlZCksIFZUWV9ORVdMSU5FKTsKLQl2dHlfb3V0KHZ0eSwgIlNNUyBNTyAgICAgICAgICAgICAgICAgIDogJWx1IHN1Ym1pdHRlZCwgJWx1IG5vIHJlY2VpdmVyJXMiLAotCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5zdWJtaXR0ZWQpLAotCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ub19yZWNlaXZlciksIFZUWV9ORVdMSU5FKTsKLQl2dHlfb3V0KHZ0eSwgIlNNUyBNVCAgICAgICAgICAgICAgICAgIDogJWx1IGRlbGl2ZXJlZCwgJWx1IG5vIG1lbW9yeSwgJWx1IG90aGVyIGVycm9yJXMiLAotCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5kZWxpdmVyZWQpLAotCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ycF9lcnJfbWVtKSwKLQkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMucnBfZXJyX290aGVyKSwgVlRZX05FV0xJTkUpOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KKyNkZWZpbmUgTkVUV09SS19TVFIgIkNvbmZpZ3VyZSB0aGUgR1NNIG5ldHdvcmtcbiIKIAogREVGVU4oY2ZnX25ldCwKICAgICAgIGNmZ19uZXRfY21kLAotICAgICAgIm5ldHdvcmsiLAotICAgICAgIkNvbmZpZ3VyZSB0aGUgR1NNIG5ldHdvcmsiKQorICAgICAgIm5ldHdvcmsiLCBORVRXT1JLX1NUUikKIHsKLQl2dHktPmluZGV4ID0gZ3NtbmV0OworCXZ0eS0+aW5kZXggPSBnc21uZXRfZnJvbV92dHkodnR5KTsKIAl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKIAogCXJldHVybiBDTURfU1VDQ0VTUzsKQEAgLTExMzMsNiArOTk2LDggQEAKICAgICAgICJuZXR3b3JrIGNvdW50cnkgY29kZSA8MS05OTk+IiwKICAgICAgICJTZXQgdGhlIEdTTSBuZXR3b3JrIGNvdW50cnkgY29kZSIpCiB7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwogCWdzbW5ldC0+Y291bnRyeV9jb2RlID0gYXRvaShhcmd2WzBdKTsKIAogCXJldHVybiBDTURfU1VDQ0VTUzsKQEAgLTExNDMsNiArMTAwOCw4IEBACiAgICAgICAibW9iaWxlIG5ldHdvcmsgY29kZSA8MS05OTk+IiwKICAgICAgICJTZXQgdGhlIEdTTSBtb2JpbGUgbmV0d29yayBjb2RlIikKIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCiAJZ3NtbmV0LT5uZXR3b3JrX2NvZGUgPSBhdG9pKGFyZ3ZbMF0pOwogCiAJcmV0dXJuIENNRF9TVUNDRVNTOwpAQCAtMTE1Myw2ICsxMDIwLDggQEAKICAgICAgICJzaG9ydCBuYW1lIE5BTUUiLAogICAgICAgIlNldCB0aGUgc2hvcnQgR1NNIG5ldHdvcmsgbmFtZSIpCiB7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwogCWlmIChnc21uZXQtPm5hbWVfc2hvcnQpCiAJCXRhbGxvY19mcmVlKGdzbW5ldC0+bmFtZV9zaG9ydCk7CiAKQEAgLTExNjYsNiArMTAzNSw4IEBACiAgICAgICAibG9uZyBuYW1lIE5BTUUiLAogICAgICAgIlNldCB0aGUgbG9uZyBHU00gbmV0d29yayBuYW1lIikKIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCiAJaWYgKGdzbW5ldC0+bmFtZV9sb25nKQogCQl0YWxsb2NfZnJlZShnc21uZXQtPm5hbWVfbG9uZyk7CiAKQEAgLTExNzcsOSArMTA0OCwxNCBAQAogREVGVU4oY2ZnX25ldF9hdXRoX3BvbGljeSwKICAgICAgIGNmZ19uZXRfYXV0aF9wb2xpY3lfY21kLAogICAgICAgImF1dGggcG9saWN5IChjbG9zZWR8YWNjZXB0LWFsbHx0b2tlbikiLAotICAgICAgIlNldCB0aGUgR1NNIG5ldHdvcmsgYXV0aGVudGljYXRpb24gcG9saWN5XG4iKQorCSJBdXRoZW50aWNhdGlvbiAobm90IGNyeXB0b2dyYXBoaWMpXG4iCisJIlNldCB0aGUgR1NNIG5ldHdvcmsgYXV0aGVudGljYXRpb24gcG9saWN5XG4iCisJIlJlcXVpcmUgdGhlIE1TIHRvIGJlIGFjdGl2YXRlZCBpbiBITFJcbiIKKwkiQWNjZXB0IGFsbCBNUywgd2hldGhlciBpbiBITFIgb3Igbm90XG4iCisJIlVzZSBTTVMtdG9rZW4gYmFzZWQgYXV0aGVudGljYXRpb25cbiIpCiB7CiAJZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5ID0gZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CiAKIAlnc21uZXQtPmF1dGhfcG9saWN5ID0gcG9saWN5OwogCkBAIC0xMTkxLDYgKzEwNjcsOCBAQAogICAgICAgImxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZSA8Mi0xMTE+IiwKICAgICAgICJTZXQgdGhlIHJlamVjdCBjYXVzZSBvZiBsb2NhdGlvbiB1cGRhdGluZyByZWplY3RcbiIpCiB7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwogCWdzbW5ldC0+cmVqZWN0X2NhdXNlID0gYXRvaShhcmd2WzBdKTsKIAogCXJldHVybiBDTURfU1VDQ0VTUzsKQEAgLTExOTksOCArMTA3NywxMiBAQAogREVGVU4oY2ZnX25ldF9lbmNyeXB0aW9uLAogICAgICAgY2ZnX25ldF9lbmNyeXB0aW9uX2NtZCwKICAgICAgICJlbmNyeXB0aW9uIGE1ICgwfDF8MikiLAotICAgICAgIkVuYWJsZSBvciBkaXNhYmxlIGVuY3J5cHRpb24gKEE1KSBmb3IgdGhpcyBuZXR3b3JrXG4iKQorCSJFbmNyeXB0aW9uIG9wdGlvbnNcbiIKKwkiQTUgZW5jcnlwdGlvblxuIiAiQTUvMDogTm8gZW5jcnlwdGlvblxuIgorCSJBNS8xOiBFbmNyeXB0aW9uXG4iICJBNS8yOiBFeHBvcnQtZ3JhZGUgRW5jcnlwdGlvblxuIikKIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCiAJZ3NtbmV0LT5hNV9lbmNyeXB0aW9uPSBhdG9pKGFyZ3ZbMF0pOwogCiAJcmV0dXJuIENNRF9TVUNDRVNTOwpAQCAtMTIwOSwxNiArMTA5MSwyNiBAQAogREVGVU4oY2ZnX25ldF9uZWNpLAogICAgICAgY2ZnX25ldF9uZWNpX2NtZCwKICAgICAgICJuZWNpICgwfDEpIiwKLSAgICAgICJTZXQgaWYgTkVDSSBvZiBjZWxsIHNlbGVjdGlvbiBpcyB0byBiZSBzZXQiKQorCSJOZXcgRXN0YWJsaXNoIENhdXNlIEluZGljYXRpb25cbiIKKwkiRG9uJ3Qgc2V0IHRoZSBORUNJIGJpdFxuIiAiU2V0IHRoZSBORUNJIGJpdFxuIikKIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCiAJZ3NtbmV0LT5uZWNpID0gYXRvaShhcmd2WzBdKTsKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKIERFRlVOKGNmZ19uZXRfcnJscF9tb2RlLCBjZmdfbmV0X3JybHBfbW9kZV9jbWQsCiAgICAgICAicnJscCBtb2RlIChub25lfG1zLWJhc2VkfG1zLXByZWZlcnJlZHxhc3MtcHJlZmVycmVkKSIsCi0JIlNldCB0aGUgUmFkaW8gUmVzb3VyY2UgTG9jYXRpb24gUHJvdG9jb2wgTW9kZSIpCisJIlJhZGlvIFJlc291cmNlIExvY2F0aW9uIFByb3RvY29sXG4iCisJIlNldCB0aGUgUmFkaW8gUmVzb3VyY2UgTG9jYXRpb24gUHJvdG9jb2wgTW9kZVxuIgorCSJEb24ndCBzZW5kIFJSTFAgcmVxdWVzdFxuIgorCSJSZXF1ZXN0IE1TLWJhc2VkIGxvY2F0aW9uXG4iCisJIlJlcXVlc3QgYW55IGxvY2F0aW9uLCBwcmVmZXIgTVMtYmFzZWRcbiIKKwkiUmVxdWVzdCBhbnkgbG9jYXRpb24sIHByZWZlciBNUy1hc3Npc3RlZFxuIikKIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCiAJZ3NtbmV0LT5ycmxwLm1vZGUgPSBycmxwX21vZGVfcGFyc2UoYXJndlswXSk7CiAKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CkBAIC0xMjI4LDE2ICsxMTIwLDIzIEBACiAgICAgICAibW0gaW5mbyAoMHwxKSIsCiAJIldoZXRoZXIgdG8gc2VuZCBNTSBJTkZPIGFmdGVyIExPQyBVUEQgQUNDRVBUIikKIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCiAJZ3NtbmV0LT5zZW5kX21tX2luZm8gPSBhdG9pKGFyZ3ZbMF0pOwogCiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCisjZGVmaW5lIEhBTkRPVkVSX1NUUgkiSGFuZG92ZXIgT3B0aW9uc1xuIgorCiBERUZVTihjZmdfbmV0X2hhbmRvdmVyLCBjZmdfbmV0X2hhbmRvdmVyX2NtZCwKICAgICAgICJoYW5kb3ZlciAoMHwxKSIsCi0JIldoZXRoZXIgb3Igbm90IHRvIHVzZSBpbi1jYWxsIGhhbmRvdmVyIikKKwlIQU5ET1ZFUl9TVFIKKwkiRG9uJ3QgcGVyZm9ybSBpbi1jYWxsIGhhbmRvdmVyXG4iCisJIlBlcmZvcm0gaW4tY2FsbCBoYW5kb3ZlclxuIikKIHsKIAlpbnQgZW5hYmxlID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOwogCiAJaWYgKGVuYWJsZSAmJiBpcGFjY19ydHBfZGlyZWN0KSB7CiAJCXZ0eV9vdXQodnR5LCAiJSUgQ2Fubm90IGVuYWJsZSBoYW5kb3ZlciB1bmxlc3MgUlRQIFByb3h5IG1vZGUgIgpAQCAtMTI1MCw1MCArMTE0OSw2NyBAQAogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAorI2RlZmluZSBIT19XSU5fU1RSIEhBTkRPVkVSX1NUUiAiTWVhc3VyZW1lbnQgV2luZG93XG4iCisjZGVmaW5lIEhPX1dJTl9SWExFVl9TVFIgSE9fV0lOX1NUUiAiUmVjZWl2ZWQgTGV2ZWwgQXZlcmFnaW5nXG4iCisjZGVmaW5lIEhPX1dJTl9SWFFVQUxfU1RSIEhPX1dJTl9TVFIgIlJlY2VpdmVkIFF1YWxpdHkgQXZlcmFnaW5nXG4iCisjZGVmaW5lIEhPX1BCVURHRVRfU1RSIEhBTkRPVkVSX1NUUiAiUG93ZXIgQnVkZ2V0XG4iCisKIERFRlVOKGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2ZywgY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX2NtZCwKICAgICAgICJoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nIDwxLTEwPiIsCisJSE9fV0lOX1JYTEVWX1NUUgogCSJIb3cgbWFueSBSeExldiBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCiB7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKIAlnc21uZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmcgPSBhdG9pKGFyZ3ZbMF0pOwogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAogREVGVU4oY2ZnX25ldF9ob193aW5fcnhxdWFsX2F2ZywgY2ZnX25ldF9ob193aW5fcnhxdWFsX2F2Z19jbWQsCiAgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgPDEtMTA+IiwKKwlIT19XSU5fUlhRVUFMX1NUUgogCSJIb3cgbWFueSBSeFF1YWwgbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmciKQogeworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CiAJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZyA9IGF0b2koYXJndlswXSk7CiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCiBERUZVTihjZmdfbmV0X2hvX3dpbl9yeGxldl9uZWlnaF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19uZWlnaF9jbWQsCiAgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4bGV2IG5laWdoYm9yIGF2ZXJhZ2luZyA8MS0xMD4iLAorCUhPX1dJTl9SWExFVl9TVFIKIAkiSG93IG1hbnkgUnhRdWFsIG1lYXN1cmVtZW50cyBhcmUgdXNlZCBmb3IgYXZlcmFnaW5nIikKIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOwogCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCA9IGF0b2koYXJndlswXSk7CiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCiBERUZVTihjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbCwgY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kLAogICAgICAgImhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCA8MS05OT4iLAorCUhPX1BCVURHRVRfU1RSCiAJIkhvdyBvZnRlbiB0byBjaGVjayBpZiB3ZSBoYXZlIGEgYmV0dGVyIGNlbGwgKFNBQ0NIIGZyYW1lcykiKQogeworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CiAJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaW50ZXJ2YWwgPSBhdG9pKGFyZ3ZbMF0pOwogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAogREVGVU4oY2ZnX25ldF9ob19wd3JfaHlzdGVyZXNpcywgY2ZnX25ldF9ob19wd3JfaHlzdGVyZXNpc19jbWQsCiAgICAgICAiaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGh5c3RlcmVzaXMgPDAtOTk5PiIsCisJSE9fUEJVREdFVF9TVFIKIAkiSG93IG1hbnkgZEIgZG9lcyBhIG5laWdoYm9yIHRvIGJlIHN0cm9uZ2VyIHRvIGJlY29tZSBhIEhPIGNhbmRpZGF0ZSIpCiB7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKIAlnc21uZXQtPmhhbmRvdmVyLnB3cl9oeXN0ZXJlc2lzID0gYXRvaShhcmd2WzBdKTsKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKIERFRlVOKGNmZ19uZXRfaG9fbWF4X2Rpc3RhbmNlLCBjZmdfbmV0X2hvX21heF9kaXN0YW5jZV9jbWQsCiAgICAgICAiaGFuZG92ZXIgbWF4aW11bSBkaXN0YW5jZSA8MC05OTk5PiIsCisJSEFORE9WRVJfU1RSCiAJIkhvdyBiaWcgaXMgdGhlIG1heGltdW0gdGltaW5nIGFkdmFuY2UgYmVmb3JlIEhPIGlzIGZvcmNlZCIpCiB7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKIAlnc21uZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSA9IGF0b2koYXJndlswXSk7CiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQpAQCAtMTMwMiw4ICsxMjE4LDEwIEBACiAgICAgREVGVU4oY2ZnX25ldF9UIyNudW1iZXIsCQkJCQlcCiAgICAgICBjZmdfbmV0X1QjI251bWJlciMjX2NtZCwJCQkJCVwKICAgICAgICJ0aW1lciB0IiAjbnVtYmVyICAiIDwwLTY1NTM1PiIsCQkJCVwKKyAgICAgICJDb25maWd1cmUgR1NNIFRpbWVyc1xuIgkJCQkJXAogICAgICAgZG9jKQkJCQkJCQlcCiB7CQkJCQkJCQlcCisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsJXAogCWludCB2YWx1ZSA9IGF0b2koYXJndlswXSk7CQkJCVwKIAkJCQkJCQkJXAogCWlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA2NTUzNSkgewkJCVwKQEAgLTEzMjEsNyArMTIzOSw3IEBACiBERUNMQVJFX1RJTUVSKDMxMDUsICJDdXJyZW50bHkgbm90IHVzZWQuIikKIERFQ0xBUkVfVElNRVIoMzEwNywgIkN1cnJlbnRseSBub3QgdXNlZC4iKQogREVDTEFSRV9USU1FUigzMTA5LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCi1ERUNMQVJFX1RJTUVSKDMxMTEsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzExMSwgIlNldCB0aGUgUlNMIHRpbWVvdXQgdG8gd2FpdCBiZWZvcmUgcmVsZWFzaW5nIHRoZSBSRiBDaGFubmVsLiIpCiBERUNMQVJFX1RJTUVSKDMxMTMsICJTZXQgdGhlIHRpbWUgdG8gdHJ5IHBhZ2luZyBhIHN1YnNjcmliZXIuIikKIERFQ0xBUkVfVElNRVIoMzExNSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQogREVDTEFSRV9USU1FUigzMTE3LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCkBAIC0xMzMzLDggKzEyNTEsMTAgQEAKIERFRlVOKGNmZ19idHMsCiAgICAgICBjZmdfYnRzX2NtZCwKICAgICAgICJidHMgQlRTX05SIiwKLSAgICAgICJTZWxlY3QgYSBCVFMgdG8gY29uZmlndXJlXG4iKQorICAgICAgIlNlbGVjdCBhIEJUUyB0byBjb25maWd1cmVcbiIKKwkiQlRTIE51bWJlclxuIikKIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOwogCWludCBidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOwogCXN0cnVjdCBnc21fYnRzICpidHM7CiAKQEAgLTEzNDYsNyArMTI2Niw3IEBACiAJCS8qIGFsbG9jYXRlIGEgbmV3IG9uZSAqLwogCQlidHMgPSBnc21fYnRzX2FsbG9jKGdzbW5ldCwgR1NNX0JUU19UWVBFX1VOS05PV04sCiAJCQkJICAgIEhBUkRDT0RFRF9UU0MsIEhBUkRDT0RFRF9CU0lDKTsKLQl9IGVsc2UgCisJfSBlbHNlCiAJCWJ0cyA9IGdzbV9idHNfbnVtKGdzbW5ldCwgYnRzX25yKTsKIAogCWlmICghYnRzKSB7CkBAIC0xMzU2LDYgKzEyNzYsNyBAQAogCX0KIAogCXZ0eS0+aW5kZXggPSBidHM7CisJdnR5LT5pbmRleF9zdWIgPSAmYnRzLT5kZXNjcmlwdGlvbjsKIAl2dHktPm5vZGUgPSBCVFNfTk9ERTsKIAogCXJldHVybiBDTURfU1VDQ0VTUzsKQEAgLTE0OTYsOSArMTQxNywxMyBAQAogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAorI2RlZmluZSBPTUxfU1RSCSJPcmdhbml6YXRpb24gJiBNYWludGVuYW5jZSBMaW5rXG4iCisjZGVmaW5lIElQQV9TVFIgImlwLmFjY2VzcyBTcGVjaWZpYyBPcHRpb25zXG4iCisKIERFRlVOKGNmZ19idHNfc3RyZWFtX2lkLAogICAgICAgY2ZnX2J0c19zdHJlYW1faWRfY21kLAogICAgICAgIm9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkIDwwLTI1NT4iLAorCU9NTF9TVFIgSVBBX1NUUgogICAgICAgIlNldCB0aGUgaXAuYWNjZXNzIFN0cmVhbSBJRCBvZiB0aGUgT01MIGxpbmsgb2YgdGhpcyBCVFNcbiIpCiB7CiAJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CkBAIC0xNTE0LDEwICsxNDM5LDEyIEBACiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCisjZGVmaW5lIE9NTF9FMV9TVFIgT01MX1NUUiAiRTEgTGluZVxuIgogCiBERUZVTihjZmdfYnRzX29tbF9lMSwKICAgICAgIGNmZ19idHNfb21sX2UxX2NtZCwKICAgICAgICJvbWwgZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisJT01MX0UxX1NUUgogICAgICAgIkUxIGludGVyZmFjZSB0byBiZSB1c2VkIGZvciBPTUxcbiIpCiB7CiAJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CkBAIC0xNTMxLDYgKzE0NTgsNyBAQAogREVGVU4oY2ZnX2J0c19vbWxfZTFfdGVpLAogICAgICAgY2ZnX2J0c19vbWxfZTFfdGVpX2NtZCwKICAgICAgICJvbWwgZTEgdGVpIDwwLTYzPiIsCisJT01MX0UxX1NUUgogICAgICAgIlNldCB0aGUgVEVJIHRvIGJlIHVzZWQgZm9yIE9NTCIpCiB7CiAJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CkBAIC0xNTQyLDcgKzE0NzAsOSBAQAogCiBERUZVTihjZmdfYnRzX2NoYWxsb2MsIGNmZ19idHNfY2hhbGxvY19jbWQsCiAgICAgICAiY2hhbm5lbCBhbGxvY2F0b3IgKGFzY2VuZGluZ3xkZXNjZW5kaW5nKSIsCi0gICAgICAiU2hvdWxkIHRoZSBjaGFubmVsIGFsbG9jYXRvciBhbGxvY2F0ZSBpbiByZXZlcnNlIFRSWCBvcmRlcj8iKQorCSJDaGFubm5lbCBBbGxvY2F0b3JcbiIgIkNoYW5uZWwgQWxsb2NhdG9yXG4iCisJIkFsbG9jYXRlIFRpbWVzbG90cyBhbmQgVHJhbnNjZWl2ZXJzIGluIGFzY2VuZGluZyBvcmRlclxuIgorCSJBbGxvY2F0ZSBUaW1lc2xvdHMgYW5kIFRyYW5zY2VpdmVycyBpbiBkZXNjZW5kaW5nIG9yZGVyXG4iKQogewogCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OwogCkBAIC0xNTU0LDkgKzE0ODQsMTIgQEAKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKKyNkZWZpbmUgUkFDSF9TVFIgIlJhbmRvbSBBY2Nlc3MgQ29udHJvbCBDaGFubmVsXG4iCisKIERFRlVOKGNmZ19idHNfcmFjaF90eF9pbnRlZ2VyLAogICAgICAgY2ZnX2J0c19yYWNoX3R4X2ludGVnZXJfY21kLAogICAgICAgInJhY2ggdHggaW50ZWdlciA8MC0xNT4iLAorCVJBQ0hfU1RSCiAgICAgICAiU2V0IHRoZSByYXcgdHggaW50ZWdlciB2YWx1ZSBpbiBSQUNIIENvbnRyb2wgcGFyYW1ldGVycyBJRSIpCiB7CiAJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CkBAIC0xNTY3LDYgKzE1MDAsNyBAQAogREVGVU4oY2ZnX2J0c19yYWNoX21heF90cmFucywKICAgICAgIGNmZ19idHNfcmFjaF9tYXhfdHJhbnNfY21kLAogICAgICAgInJhY2ggbWF4IHRyYW5zbWlzc2lvbiAoMXwyfDR8NykiLAorCVJBQ0hfU1RSCiAgICAgICAiU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBSQUNIIGJ1cnN0IHRyYW5zbWlzc2lvbnMiKQogewogCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OwpAQCAtMTU3NCw2ICsxNTA4LDMwIEBACiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCisjZGVmaW5lIE5NX1NUUiAiTmV0d29yayBNYW5hZ2VtZW50XG4iCisKK0RFRlVOKGNmZ19idHNfcmFjaF9ubV9iX3RocmVzaCwKKyAgICAgIGNmZ19idHNfcmFjaF9ubV9iX3RocmVzaF9jbWQsCisgICAgICAicmFjaCBubSBidXN5IHRocmVzaG9sZCA8MC0yNTU+IiwKKwlSQUNIX1NUUiBOTV9TVFIKKyAgICAgICJTZXQgdGhlIE5NIEJ1c3kgVGhyZXNob2xkIGluIGRCIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlidHMtPnJhY2hfYl90aHJlc2ggPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX25tX2xkYXZnLAorICAgICAgY2ZnX2J0c19yYWNoX25tX2xkYXZnX2NtZCwKKyAgICAgICJyYWNoIG5tIGxvYWQgYXZlcmFnZSA8MC02NTUzNT4iLAorCVJBQ0hfU1RSIE5NX1NUUgorICAgICAgIlNldCB0aGUgTk0gTG9hZGF2ZXJhZ2UgU2xvdHMgdmFsdWUiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWJ0cy0+cmFjaF9sZGF2Z19zbG90cyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCiBERUZVTihjZmdfYnRzX2NlbGxfYmFycmVkLCBjZmdfYnRzX2NlbGxfYmFycmVkX2NtZCwKICAgICAgICJjZWxsIGJhcnJlZCAoMHwxKSIsCiAgICAgICAiU2hvdWxkIHRoaXMgY2VsbCBiZSBiYXJyZWQgZnJvbSBhY2Nlc3M/IikKQEAgLTE1ODUsNiArMTU0MywyMCBAQAogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAorREVGVU4oY2ZnX2J0c19yYWNoX2VjX2FsbG93ZWQsIGNmZ19idHNfcmFjaF9lY19hbGxvd2VkX2NtZCwKKyAgICAgICJyYWNoIGVtZXJnZW5jeSBjYWxsIGFsbG93ZWQgKDB8MSkiLAorICAgICAgIlNob3VsZCB0aGlzIGNlbGwgYWxsb3cgZW1lcmdlbmN5IGNhbGxzPyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYXRvaShhcmd2WzBdKSA9PSAwKQorCQlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudDIgfD0gMHg0OworCWVsc2UKKwkJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnQyICY9IH4weDQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKIERFRlVOKGNmZ19idHNfbXNfbWF4X3Bvd2VyLCBjZmdfYnRzX21zX21heF9wb3dlcl9jbWQsCiAgICAgICAibXMgbWF4IHBvd2VyIDwwLTQwPiIsCiAgICAgICAiTWF4aW11bSB0cmFuc21pdCBwb3dlciBvZiB0aGUgTVMiKQpAQCAtMTYyOSwxMyArMTYwMSwxNyBAQAogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAorI2RlZmluZSBHUFJTX1RFWFQJIkdQUlMgUGFja2V0IE5ldHdvcmtcbiIKKwogREVGVU4oY2ZnX2J0c19wcnNfYnZjaSwgY2ZnX2J0c19ncHJzX2J2Y2lfY21kLAotCSJncHJzIGNlbGwgYnZjaSA8MC02NTUzNT4iLAorCSJncHJzIGNlbGwgYnZjaSA8Mi02NTUzNT4iLAorCUdQUlNfVEVYVAorCSJHUFJTIENlbGwgU2V0dGluZ3NcbiIKIAkiR1BSUyBCU1NHUCBWQyBJZGVudGlmaWVyIikKIHsKIAlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKIAotCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgewogCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKIAkJcmV0dXJuIENNRF9XQVJOSU5HOwogCX0KQEAgLTE2NDcsMTEgKzE2MjMsMTIgQEAKIAogREVGVU4oY2ZnX2J0c19ncHJzX25zZWksIGNmZ19idHNfZ3Byc19uc2VpX2NtZCwKIAkiZ3BycyBuc2VpIDwwLTY1NTM1PiIsCisJR1BSU19URVhUCiAJIkdQUlMgTlMgRW50aXR5IElkZW50aWZpZXIiKQogewogCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OwogCi0JaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkgeworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CiAJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOwogCQlyZXR1cm4gQ01EX1dBUk5JTkc7CiAJfQpAQCAtMTY2MSwxNSArMTYzOCwxOSBAQAogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAorI2RlZmluZSBOU1ZDX1RFWFQgIk5ldHdvcmsgU2VydmljZSBWaXJ0dWFsIENvbm5lY3Rpb24gKE5TLVZDKVxuIiBcCisJCSJOU1ZDIExvZ2ljYWwgTnVtYmVyXG4iCiAKIERFRlVOKGNmZ19idHNfZ3Byc19uc3ZjaSwgY2ZnX2J0c19ncHJzX25zdmNpX2NtZCwKIAkiZ3BycyBuc3ZjIDwwLTE+IG5zdmNpIDwwLTY1NTM1PiIsCisJR1BSU19URVhUIE5TVkNfVEVYVAorCSJOUyBWaXJ0dWFsIENvbm5lY3Rpb24gSWRlbnRpZmllclxuIgogCSJHUFJTIE5TIFZDIElkZW50aWZpZXIiKQogewogCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OwogCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOwogCi0JaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkgeworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CiAJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOwogCQlyZXR1cm4gQ01EX1dBUk5JTkc7CiAJfQpAQCAtMTY4MSwxMiArMTY2MiwxMyBAQAogCiBERUZVTihjZmdfYnRzX2dwcnNfbnN2Y19scG9ydCwgY2ZnX2J0c19ncHJzX25zdmNfbHBvcnRfY21kLAogCSJncHJzIG5zdmMgPDAtMT4gbG9jYWwgdWRwIHBvcnQgPDAtNjU1MzU+IiwKKwlHUFJTX1RFWFQgTlNWQ19URVhUCiAJIkdQUlMgTlMgTG9jYWwgVURQIFBvcnQiKQogewogCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OwogCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOwogCi0JaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkgeworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CiAJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOwogCQlyZXR1cm4gQ01EX1dBUk5JTkc7CiAJfQpAQCAtMTY5OCwxMiArMTY4MCwxMyBAQAogCiBERUZVTihjZmdfYnRzX2dwcnNfbnN2Y19ycG9ydCwgY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kLAogCSJncHJzIG5zdmMgPDAtMT4gcmVtb3RlIHVkcCBwb3J0IDwwLTY1NTM1PiIsCisJR1BSU19URVhUIE5TVkNfVEVYVAogCSJHUFJTIE5TIFJlbW90ZSBVRFAgUG9ydCIpCiB7CiAJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CiAJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CiAKLQlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKIAkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CiAJCXJldHVybiBDTURfV0FSTklORzsKIAl9CkBAIC0xNzE1LDEzICsxNjk4LDE0IEBACiAKIERFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX3JpcCwgY2ZnX2J0c19ncHJzX25zdmNfcmlwX2NtZCwKIAkiZ3BycyBuc3ZjIDwwLTE+IHJlbW90ZSBpcCBBLkIuQy5EIiwKKwlHUFJTX1RFWFQgTlNWQ19URVhUCiAJIkdQUlMgTlMgUmVtb3RlIElQIEFkZHJlc3MiKQogewogCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OwogCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOwogCXN0cnVjdCBpbl9hZGRyIGlhOwogCi0JaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkgeworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CiAJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOwogCQlyZXR1cm4gQ01EX1dBUk5JTkc7CiAJfQpAQCAtMTczMiwxMyArMTcxNiw3NCBAQAogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAorREVGVU4oY2ZnX2J0c19ncHJzX25zX3RpbWVyLCBjZmdfYnRzX2dwcnNfbnNfdGltZXJfY21kLAorCSJncHJzIG5zIHRpbWVyICIgTlNfVElNRVJTICIgPDAtMjU1PiIsCisJR1BSU19URVhUICJOZXR3b3JrIFNlcnZpY2VcbiIKKwkiTmV0d29yayBTZXJ2aWNlIFRpbWVyXG4iCisJTlNfVElNRVJTX0hFTFAgIlRpbWVyIFZhbHVlXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBnZXRfc3RyaW5nX3ZhbHVlKGdwcnNfbnNfdGltZXJfc3RycywgYXJndlswXSk7CisJaW50IHZhbCA9IGF0b2koYXJndlsxXSk7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChpZHggPCAwIHx8IGlkeCA+PSBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5uc2UudGltZXIpKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwlidHMtPmdwcnMubnNlLnRpbWVyW2lkeF0gPSB2YWw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgQlNTR1BfVElNRVJTICIoYmxvY2tpbmctdGltZXJ8YmxvY2tpbmctcmV0cmllc3x1bmJsb2NraW5nLXJldHJpZXN8cmVzZXQtdGltZXJ8cmVzZXQtcmV0cmllc3xzdXNwZW5kLXRpbWVyfHN1c3BlbmQtcmV0cmllc3xyZXN1bWUtdGltZXJ8cmVzdW1lLXJldHJpZXN8Y2FwYWJpbGl0eS11cGRhdGUtdGltZXJ8Y2FwYWJpbGl0eS11cGRhdGUtcmV0cmllcykiCisjZGVmaW5lIEJTU0dQX1RJTUVSU19IRUxQCVwKKwkiVGJ2Yy1ibG9jayB0aW1lb3V0XG4iCQkJXAorCSJUYnZjLWJsb2NrIHJldHJpZXNcbiIJCQlcCisJIlRidmMtdW5ibG9jayByZXRyaWVzXG4iCQlcCisJIlRidmNjLXJlc2V0IHRpbWVvdXRcbiIJCQlcCisJIlRidmMtcmVzZXQgcmV0cmllc1xuIgkJCVwKKwkiVGJ2Yy1zdXNwZW5kIHRpbWVvdXRcbiIJCVwKKwkiVGJ2Yy1zdXNwZW5kIHJldHJpZXNcbiIJCVwKKwkiVGJ2Yy1yZXN1bWUgdGltZW91dFxuIgkJCVwKKwkiVGJ2Yy1yZXN1bWUgcmV0cmllc1xuIgkJCVwKKwkiVGJ2Yy1jYXBhLXVwZGF0ZSB0aW1lb3V0XG4iCQlcCisJIlRidmMtY2FwYS11cGRhdGUgcmV0cmllc1xuIgorCitERUZVTihjZmdfYnRzX2dwcnNfY2VsbF90aW1lciwgY2ZnX2J0c19ncHJzX2NlbGxfdGltZXJfY21kLAorCSJncHJzIGNlbGwgdGltZXIgIiBCU1NHUF9USU1FUlMgIiA8MC0yNTU+IiwKKwlHUFJTX1RFWFQgIkNlbGwgLyBCU1NHUFxuIgorCSJDZWxsL0JTU0dQIFRpbWVyXG4iCisJQlNTR1BfVElNRVJTX0hFTFAgIlRpbWVyIFZhbHVlXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBnZXRfc3RyaW5nX3ZhbHVlKGdwcnNfYnNzZ3BfY2ZnX3N0cnMsIGFyZ3ZbMF0pOworCWludCB2YWwgPSBhdG9pKGFyZ3ZbMV0pOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gQVJSQVlfU0laRShidHMtPmdwcnMuY2VsbC50aW1lcikpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCWJ0cy0+Z3Bycy5jZWxsLnRpbWVyW2lkeF0gPSB2YWw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKIERFRlVOKGNmZ19idHNfZ3Byc19yYWMsIGNmZ19idHNfZ3Byc19yYWNfY21kLAogCSJncHJzIHJvdXRpbmcgYXJlYSA8MC0yNTU+IiwKKwlHUFJTX1RFWFQKIAkiR1BSUyBSb3V0aW5nIEFyZWEgQ29kZSIpCiB7CiAJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CiAKLQlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKIAkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CiAJCXJldHVybiBDTURfV0FSTklORzsKIAl9CkBAIC0xNzQ4LDIyICsxNzkzLDI4IEBACiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCi1ERUZVTihjZmdfYnRzX2dwcnNfZW5hYmxlZCwgY2ZnX2J0c19ncHJzX2VuYWJsZWRfY21kLAotCSJncHJzIGVuYWJsZWQgPDAtMT4iLAotCSJHUFJTIEVuYWJsZWQgb24gdGhpcyBCVFMiKQorREVGVU4oY2ZnX2J0c19ncHJzX21vZGUsIGNmZ19idHNfZ3Byc19tb2RlX2NtZCwKKwkiZ3BycyBtb2RlIChub25lfGdwcnN8ZWdwcnMpIiwKKwlHUFJTX1RFWFQKKwkiR1BSUyBNb2RlIGZvciB0aGlzIEJUU1xuIgorCSJHUFJTIERpc2FibGVkIG9uIHRoaXMgQlRTXG4iCisJIkdQUlMgRW5hYmxlZCBvbiB0aGlzIEJUU1xuIgorCSJFR1BSUyAoRURHRSkgRW5hYmxlZCBvbiB0aGlzIEJUU1xuIikKIHsKIAlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKIAotCWJ0cy0+Z3Bycy5lbmFibGVkID0gYXRvaShhcmd2WzBdKTsKKwlidHMtPmdwcnMubW9kZSA9IGJ0c19ncHJzX21vZGVfcGFyc2UoYXJndlswXSk7CiAKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKKyNkZWZpbmUgVFJYX1RFWFQgIlJhZGlvIFRyYW5zY2VpdmVyXG4iCiAKIC8qIHBlciBUUlggY29uZmlndXJhdGlvbiAqLwogREVGVU4oY2ZnX3RyeCwKICAgICAgIGNmZ190cnhfY21kLAogICAgICAgInRyeCBUUlhfTlIiLAorCVRSWF9URVhUCiAgICAgICAiU2VsZWN0IGEgVFJYIHRvIGNvbmZpZ3VyZSIpCiB7CiAJaW50IHRyeF9uciA9IGF0b2koYXJndlswXSk7CkBAIC0xNzc3LDEzICsxODI4LDE0IEBACiAJfSBlbHNlIGlmICh0cnhfbnIgPT0gYnRzLT5udW1fdHJ4KSB7CiAJCS8qIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgb25lICovCiAJCXRyeCA9IGdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7Ci0JfSBlbHNlIAorCX0gZWxzZQogCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOwotCQorCiAJaWYgKCF0cngpCiAJCXJldHVybiBDTURfV0FSTklORzsKIAogCXZ0eS0+aW5kZXggPSB0cng7CisJdnR5LT5pbmRleF9zdWIgPSAmdHJ4LT5kZXNjcmlwdGlvbjsKIAl2dHktPm5vZGUgPSBUUlhfTk9ERTsKIAogCXJldHVybiBDTURfU1VDQ0VTUzsKQEAgLTE3OTEsNyArMTg0Myw3IEBACiAKIERFRlVOKGNmZ190cnhfYXJmY24sCiAgICAgICBjZmdfdHJ4X2FyZmNuX2NtZCwKLSAgICAgICJhcmZjbiA8MS0xMDI0PiIsCisgICAgICAiYXJmY24gPDAtMTAyND4iLAogICAgICAgIlNldCB0aGUgQVJGQ04gZm9yIHRoaXMgVFJYXG4iKQogewogCWludCBhcmZjbiA9IGF0b2koYXJndlswXSk7CkBAIC0xOTM3LDM5ICsxOTg5LDY3IEBACiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCi1pbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQordm9pZCBvcGVuYnNjX3Z0eV9wcmludF9zdGF0aXN0aWNzKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCiB7Ci0JZ3NtbmV0ID0gbmV0OworCXZ0eV9vdXQodnR5LCAiQ2hhbm5lbCBSZXF1ZXN0cyAgICAgICAgOiAlbHUgdG90YWwsICVsdSBubyBjaGFubmVsJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNocmVxLnRvdGFsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5jaHJlcS5ub19jaGFubmVsKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiQ2hhbm5lbCBGYWlsdXJlcyAgICAgICAgOiAlbHUgcmZfZmFpbHVyZXMsICVsdSBybGwgZmFpbHVyZXMlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hhbi5yZl9mYWlsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5jaGFuLnJsbF9lcnIpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJQYWdpbmcgICAgICAgICAgICAgICAgICA6ICVsdSBhdHRlbXB0ZWQsICVsdSBjb21wbGV0ZSwgJWx1IGV4cGlyZWQlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmV4cGlyZWQpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJCVFMgZmFpbHVyZXMgICAgICAgICAgICA6ICVsdSBPTUwsICVsdSBSU0wlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuYnRzLm9tbF9mYWlsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5idHMucnNsX2ZhaWwpLCBWVFlfTkVXTElORSk7Cit9CiAKLQljbWRfaW5pdCgxKTsKLQl2dHlfaW5pdCgpOworREVGVU4obG9nZ2luZ19mbHRyX2ltc2ksCisgICAgICBsb2dnaW5nX2ZsdHJfaW1zaV9jbWQsCisgICAgICAibG9nZ2luZyBmaWx0ZXIgaW1zaSBJTVNJIiwKKwlMT0dHSU5HX1NUUiBGSUxURVJfU1RSCisgICAgICAiRmlsdGVyIGxvZyBtZXNzYWdlcyBieSBJTVNJXG4iICJJTVNJIHRvIGJlIHVzZWQgYXMgZmlsdGVyXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKIAotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X25ldF9jbWQpOwotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2J0c19jbWQpOwotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3RyeF9jbWQpOwotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3RzX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfbGNoYW5fY21kKTsKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KIAotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2UxZHJ2X2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfZTFsaW5lX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfZTF0c19jbWQpOworCWxvZ19zZXRfaW1zaV9maWx0ZXIoY29ubi0+ZGJnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CiAKLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19wYWdpbmdfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19zdGF0c19jbWQpOworZXh0ZXJuIGludCBic2NfdnR5X2luaXRfZXh0cmEodm9pZCk7CitleHRlcm4gY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQ7CiAKLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmZW5hYmxlX2xvZ2dpbmdfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmZGlzYWJsZV9sb2dnaW5nX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfZmx0cl9pbXNpX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfZmx0cl9hbGxfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ191c2VfY2xyX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfcHJudF90aW1lc3RhbXBfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19zZXRfY2F0ZWdvcnlfbWFza19jbWQpOwotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX2xldmVsX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfc2V0X2xvZ19sZXZlbF9jbWQpOworaW50IGJzY192dHlfaW5pdCh2b2lkKQoreworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19uZXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfYnRzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X3RyeF9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd190c19jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19sY2hhbl9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19sY2hhbl9zdW1tYXJ5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZsb2dnaW5nX2ZsdHJfaW1zaV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X2UxZHJ2X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X2UxbGluZV9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19lMXRzX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfcGFnaW5nX2NtZCk7CisKKwlsb2dnaW5nX3Z0eV9hZGRfY21kcygpOwogCiAJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX25ldF9jbWQpOwogCWluc3RhbGxfbm9kZSgmbmV0X25vZGUsIGNvbmZpZ193cml0ZV9uZXQpOwogCWluc3RhbGxfZGVmYXVsdChHU01ORVRfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmb3Vybm9kZV9lbmRfY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25jY19jbWQpOwogCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW5jX2NtZCk7CiAJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCk7CkBAIC0yMDAyLDcgKzIwODIsMTEgQEAKIAlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfYnRzX2NtZCk7CiAJaW5zdGFsbF9ub2RlKCZidHNfbm9kZSwgY29uZmlnX3dyaXRlX2J0cyk7CiAJaW5zdGFsbF9kZWZhdWx0KEJUU19OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZvdXJub2RlX2V4aXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZvdXJub2RlX2VuZF9jbWQpOwogCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfdHlwZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19kZXNjcmlwdGlvbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19ub19kZXNjcmlwdGlvbl9jbWQpOwogCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfYmFuZF9jbWQpOwogCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2lfY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2xhY19jbWQpOwpAQCAtMjAxNSwxNCArMjA5OSwxOSBAQAogCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2hhbGxvY19jbWQpOwogCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcmFjaF90eF9pbnRlZ2VyX2NtZCk7CiAJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yYWNoX21heF90cmFuc19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcmFjaF9ubV9iX3RocmVzaF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcmFjaF9ubV9sZGF2Z19jbWQpOwogCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2VsbF9iYXJyZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfZWNfYWxsb3dlZF9jbWQpOwogCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfbXNfbWF4X3Bvd2VyX2NtZCk7CiAJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19wZXJfbG9jX3VwZF9jbWQpOwogCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2VsbF9yZXNlbF9oeXN0X2NtZCk7CiAJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yeGxldl9hY2NfbWluX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX2VuYWJsZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbW9kZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc190aW1lcl9jbWQpOwogCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19yYWNfY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfYnZjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19jZWxsX3RpbWVyX2NtZCk7CiAJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zZWlfY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y2lfY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y19scG9ydF9jbWQpOwpAQCAtMjAzMiw3ICsyMTIxLDExIEBACiAJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX3RyeF9jbWQpOwogCWluc3RhbGxfbm9kZSgmdHJ4X25vZGUsIGR1bW15X2NvbmZpZ193cml0ZSk7CiAJaW5zdGFsbF9kZWZhdWx0KFRSWF9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZvdXJub2RlX2V4aXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZvdXJub2RlX2VuZF9jbWQpOwogCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfYXJmY25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfZGVzY3JpcHRpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfbm9fZGVzY3JpcHRpb25fY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X25vbWluYWxfcG93ZXJfY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X21heF9wb3dlcl9yZWRfY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X3JzbF9lMV9jbWQpOwpAQCAtMjA0MiwxMCArMjEzNSwxNCBAQAogCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190c19jbWQpOwogCWluc3RhbGxfbm9kZSgmdHNfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKIAlpbnN0YWxsX2RlZmF1bHQoVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRTX05PREUsICZvdXJub2RlX2V4aXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFNfTk9ERSwgJm91cm5vZGVfZW5kX2NtZCk7CiAJaW5zdGFsbF9lbGVtZW50KFRTX05PREUsICZjZmdfdHNfcGNoYW5fY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoVFNfTk9ERSwgJmNmZ190c19lMV9zdWJzbG90X2NtZCk7CiAKLQlic2NfdnR5X2luaXRfZXh0cmEobmV0KTsKKwlhYmlzX25tX3Z0eV9pbml0KCk7CisKKwlic2NfdnR5X2luaXRfZXh0cmEoKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvY2hhbl9hbGxvYy5jIGIvb3BlbmJzYy9zcmMvY2hhbl9hbGxvYy5jCmluZGV4IDJlODg1MjQuLjlkZjQ0OWYgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYworKysgYi9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMKQEAgLTE1Miw2ICsxNTIsNyBAQAogCVtHU01fUENIQU5fVENIX0hdID0gMiwKIAlbR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDXSA9IDgsCiAJLyogRklYTUU6IHdoYXQgYWJvdXQgZHluYW1pYyBUQ0hfRl9UQ0hfSCA/ICovCisJW0dTTV9QQ0hBTl9UQ0hfRl9QRENIXSA9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGdzbV9sY2hhbiAqCkBAIC0xNjcsNyArMTY4LDE0IEBACiAJCXRzID0gJnRyeC0+dHNbal07CiAJCWlmICghdHNfaXNfdXNhYmxlKHRzKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAodHMtPnBjaGFuICE9IHBjaGFuKQorCQkvKiBpcC5hY2Nlc3MgZHluYW1pYyBUQ0gvRiArIFBEQ0ggY29tYmluYXRpb24gKi8KKwkJaWYgKHRzLT5wY2hhbiA9PSBHU01fUENIQU5fVENIX0ZfUERDSCAmJgorCQkgICAgcGNoYW4gPT0gR1NNX1BDSEFOX1RDSF9GKSB7CisJCQkvKiB3ZSBjYW4gb25seSBjb25zaWRlciBzdWNoIGEgZHluYW1pYyBjaGFubmVsCisJCQkgKiBpZiB0aGUgUERDSCBpcyBjdXJyZW50bHkgaW5hY3RpdmUgKi8KKwkJCWlmICh0cy0+ZmxhZ3MgJiBUU19GX1BEQ0hfTU9ERSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICh0cy0+cGNoYW4gIT0gcGNoYW4pCiAJCQljb250aW51ZTsKIAkJLyogY2hlY2sgaWYgYWxsIHN1Yi1zbG90cyBhcmUgYWxsb2NhdGVkIHlldCAqLwogCQlmb3IgKHNzID0gMDsgc3MgPCBzdWJzbG90c19wZXJfcGNoYW5bcGNoYW5dOyBzcysrKSB7CkBAIC0xNzcsNiArMTg1LDcgQEAKIAkJCQlyZXR1cm4gbGM7CiAJCX0KIAl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMjUyLDcgKzI2MSw2IEBACiAKIAlpZiAobGNoYW4pIHsKIAkJbGNoYW4tPnR5cGUgPSB0eXBlOwotCQlsY2hhbi0+dXNlX2NvdW50ID0gMDsKIAogCQkvKiBjbGVhciBzYXBpcyAqLwogCQltZW1zZXQobGNoYW4tPnNhcGlzLCAwLCBBUlJBWV9TSVpFKGxjaGFuLT5zYXBpcykpOwpAQCAtMjYwLDEwICsyNjgsMjEgQEAKIAkJLyogY2xlYXIgbXVsdGkgcmF0ZSBjb25maWcgKi8KIAkJbWVtc2V0KCZsY2hhbi0+bXJfY29uZiwgMCwgc2l6ZW9mKGxjaGFuLT5tcl9jb25mKSk7CiAKKwkJLyogY2xlYXIgcGVyIE1TQy9CU0MgZGF0YSAqLworCQltZW1zZXQoJmxjaGFuLT5jb25uLCAwLCBzaXplb2YobGNoYW4tPmNvbm4pKTsKKwogCQkvKiBDb25maWd1cmUgdGhlIHRpbWUgYW5kIHN0YXJ0IGl0IHNvIGl0IHdpbGwgYmUgY2xvc2VkICovCi0JCWxjaGFuLT5yZWxlYXNlX3RpbWVyLmNiID0gYXV0b19yZWxlYXNlX2NoYW5uZWw7Ci0JCWxjaGFuLT5yZWxlYXNlX3RpbWVyLmRhdGEgPSBsY2hhbjsKLQkJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+cmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsKKwkJbGNoYW4tPmNvbm4ubGNoYW4gPSBsY2hhbjsKKwkJbGNoYW4tPmNvbm4uYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwkJbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lci5jYiA9IGF1dG9fcmVsZWFzZV9jaGFubmVsOworCQlsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyLmRhdGEgPSBsY2hhbjsKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOworCisJfSBlbHNlIHsKKwkJc3RydWN0IGNoYWxsb2Nfc2lnbmFsX2RhdGEgc2lnOworCQlzaWcuYnRzID0gYnRzOworCQlzaWcudHlwZSA9IHR5cGU7CisJCWRpc3BhdGNoX3NpZ25hbChTU19DSEFMTE9DLCBTX0NIQUxMT0NfQUxMT0NfRkFJTCwgJnNpZyk7CiAJfQogCiAJcmV0dXJuIGxjaGFuOwpAQCAtMjcyLDIyICsyOTEsMjQgQEAKIC8qIEZyZWUgYSBsb2dpY2FsIGNoYW5uZWwgKi8KIHZvaWQgbGNoYW5fZnJlZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKIHsKKwlzdHJ1Y3QgY2hhbGxvY19zaWduYWxfZGF0YSBzaWc7CiAJaW50IGk7CiAKKwlzaWcudHlwZSA9IGxjaGFuLT50eXBlOwogCWxjaGFuLT50eXBlID0gR1NNX0xDSEFOX05PTkU7Ci0JaWYgKGxjaGFuLT5zdWJzY3IpIHsKLQkJc3Vic2NyX3B1dChsY2hhbi0+c3Vic2NyKTsKLQkJbGNoYW4tPnN1YnNjciA9IE5VTEw7CisJaWYgKGxjaGFuLT5jb25uLnN1YnNjcikgeworCQlzdWJzY3JfcHV0KGxjaGFuLT5jb25uLnN1YnNjcik7CisJCWxjaGFuLT5jb25uLnN1YnNjciA9IE5VTEw7CiAJfQogCiAJLyogV2UgbWlnaHQga2lsbCBhbiBhY3RpdmUgY2hhbm5lbC4uLiAqLwotCWlmIChsY2hhbi0+dXNlX2NvdW50ICE9IDApIHsKKwlpZiAobGNoYW4tPmNvbm4udXNlX2NvdW50ICE9IDApIHsKIAkJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSwgbGNoYW4pOwotCQlsY2hhbi0+dXNlX2NvdW50ID0gMDsKKwkJbGNoYW4tPmNvbm4udXNlX2NvdW50ID0gMDsKIAl9CiAKIAkvKiBzdG9wIHRoZSB0aW1lciAqLwotCWJzY19kZWxfdGltZXIoJmxjaGFuLT5yZWxlYXNlX3RpbWVyKTsKKwlic2NfZGVsX3RpbWVyKCZsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyKTsKIAlic2NfZGVsX3RpbWVyKCZsY2hhbi0+VDMxMDEpOwogCiAJLyogY2xlYXIgY2FjaGVkIG1lYXN1ZW1lbnQgcmVwb3J0cyAqLwpAQCAtMjk5LDMxICszMjAsNTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsY2hhbi0+bmVpZ2hfbWVhcyk7IGkrKykKIAkJbGNoYW4tPm5laWdoX21lYXNbaV0uYXJmY24gPSAwOwogCi0JbGNoYW4tPnNpbGVudF9jYWxsID0gMDsKKwlsY2hhbi0+Y29ubi5zaWxlbnRfY2FsbCA9IDA7CisKKwlzaWcubGNoYW4gPSBsY2hhbjsKKwlzaWcuYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwlkaXNwYXRjaF9zaWduYWwoU1NfQ0hBTExPQywgU19DSEFMTE9DX0ZSRUVELCAmc2lnKTsKIAogCS8qIEZJWE1FOiB0c19mcmVlKCkgdGhlIHRpbWVzbG90LCBpZiB3ZSdyZSB0aGUgbGFzdCBsb2dpY2FsCiAJICogY2hhbm5lbCB1c2luZyBpdCAqLwogfQogCisvKgorICogVGhlcmUgd2FzIGFuIGVycm9yIHdpdGggdGhlIFRSWCBhbmQgd2UgbmVlZCB0byBmb3JnZXQKKyAqIGFueSBzdGF0ZSBzbyB0aGF0IGEgbGNoYW4gY2FuIGJlIGFsbG9jYXRlZCBhZ2FpbiBhZnRlcgorICogdGhlIHRyeCBpcyBmdWxseSB1c2FibGUuCisgKi8KK3ZvaWQgbGNoYW5fcmVzZXQoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJYnNjX2RlbF90aW1lcigmbGNoYW4tPlQzMTAxKTsKKwlic2NfZGVsX3RpbWVyKCZsY2hhbi0+VDMxMTEpOworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5lcnJvcl90aW1lcik7CisKKwlsY2hhbi0+dHlwZSA9IEdTTV9MQ0hBTl9OT05FOworCWxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfTk9ORTsKK30KKworCiAvKiBDb25zaWRlciByZWxlYXNpbmcgdGhlIGNoYW5uZWwgbm93ICovCiBpbnQgbGNoYW5fYXV0b19yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQogewotCWlmIChsY2hhbi0+dXNlX2NvdW50ID4gMCkgeworCWlmIChsY2hhbi0+Y29ubi51c2VfY291bnQgPiAwKSB7CiAJCXJldHVybiAwOwogCX0KIAogCS8qIEFzc3VtZSB3ZSBoYXZlIEdTTTA0LjA4IHJ1bm5pbmcgYW5kIHNlbmQgYSByZWxlYXNlICovCi0JaWYgKGxjaGFuLT5zdWJzY3IpIHsKKwlpZiAobGNoYW4tPmNvbm4uc3Vic2NyKSB7CiAJCWdzbTQ4X3NlbmRfcnJfcmVsZWFzZShsY2hhbik7CiAJfQogCiAJLyogc3Bvb2ZlZD8gbWVzc2FnZSAqLwotCWlmIChsY2hhbi0+dXNlX2NvdW50IDwgMCkKKwlpZiAobGNoYW4tPmNvbm4udXNlX2NvdW50IDwgMCkKIAkJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiQ2hhbm5lbCBjb3VudCBpcyBuZWdhdGl2ZTogJWRcbiIsCi0JCQlsY2hhbi0+dXNlX2NvdW50KTsKKwkJCWxjaGFuLT5jb25uLnVzZV9jb3VudCk7CiAKIAlERUJVR1AoRFJMTCwgIiVzIFJlY3ljbGluZyBDaGFubmVsXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbikpOwotCXJzbF9yZWxlYXNlX3JlcXVlc3QobGNoYW4sIDApOworCXJzbF9sY2hhbl9zZXRfc3RhdGUobGNoYW4sIExDSEFOX1NfUkVMX1JFUSk7CisJcnNsX3JlbGVhc2VfcmVxdWVzdChsY2hhbiwgMCwgMCk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTMzMywxOSArMzc1LDE5IEBACiAJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CiAKIAlpZiAoIWxjaGFuX2F1dG9fcmVsZWFzZShsY2hhbikpCi0JCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPnJlbGVhc2VfdGltZXIsIExDSEFOX1JFTEVBU0VfVElNRU9VVCk7CisJCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsKIH0KIAogc3RydWN0IGdzbV9sY2hhbiogbGNoYW5fZmluZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikgewogCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OwotCWludCB0c19ubywgbGNoYW5fbm87IAorCWludCB0c19ubywgbGNoYW5fbm87CiAKIAlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CiAJCWZvciAodHNfbm8gPSAwOyB0c19ubyA8IDg7ICsrdHNfbm8pIHsKIAkJCWZvciAobGNoYW5fbm8gPSAwOyBsY2hhbl9ubyA8IFRTX01BWF9MQ0hBTjsgKytsY2hhbl9ubykgewogCQkJCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0KIAkJCQkJJnRyeC0+dHNbdHNfbm9dLmxjaGFuW2xjaGFuX25vXTsKLQkJCQlpZiAoc3Vic2NyID09IGxjaGFuLT5zdWJzY3IpCisJCQkJaWYgKHN1YnNjciA9PSBsY2hhbi0+Y29ubi5zdWJzY3IpCiAJCQkJCXJldHVybiBsY2hhbjsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvY29tbW9uX3Z0eS5jIGIvb3BlbmJzYy9zcmMvY29tbW9uX3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDY4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9jb21tb25fdnR5LmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qIE9wZW5CU0MgVlRZIGNvbW1vbiBoZWxwZXJzICovCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorCisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKworCitlbnVtIG5vZGVfdHlwZSBic2NfdnR5X2dvX3BhcmVudChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEdTTU5FVF9OT0RFOgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgQlRTX05PREU6CisJCXZ0eS0+bm9kZSA9IEdTTU5FVF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gYnRzLT5uZXR3b3JrOworCQl9CisJCWJyZWFrOworCWNhc2UgVFJYX05PREU6CisJCXZ0eS0+bm9kZSA9IEJUU19OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRyeC0+YnRzOworCQl9CisJCWJyZWFrOworCWNhc2UgVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gVFJYX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cy0+dHJ4OworCQl9CisJCWJyZWFrOworCWNhc2UgT01MX05PREU6CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQl0YWxsb2NfZnJlZSh2dHktPmluZGV4KTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCX0KKworCXJldHVybiB2dHktPm5vZGU7Cit9CisKKy8qIERvd24gdnR5IG5vZGUgbGV2ZWwuICovCitnREVGVU4ob3Vybm9kZV9leGl0LAorICAgICAgIG91cm5vZGVfZXhpdF9jbWQsICJleGl0IiwgIkV4aXQgY3VycmVudCBtb2RlIGFuZCBkb3duIHRvIHByZXZpb3VzIG1vZGVcbiIpCit7CisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEdTTU5FVF9OT0RFOgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgQlRTX05PREU6CisJCXZ0eS0+bm9kZSA9IEdTTU5FVF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gYnRzLT5uZXR3b3JrOworCQkJdnR5LT5pbmRleF9zdWIgPSBOVUxMOworCQl9CisJCWJyZWFrOworCWNhc2UgVFJYX05PREU6CisJCXZ0eS0+bm9kZSA9IEJUU19OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRyeC0+YnRzOworCQkJdnR5LT5pbmRleF9zdWIgPSAmdHJ4LT5idHMtPmRlc2NyaXB0aW9uOworCQl9CisJCWJyZWFrOworCWNhc2UgVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gVFJYX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cy0+dHJ4OworCQkJdnR5LT5pbmRleF9zdWIgPSAmdHMtPnRyeC0+ZGVzY3JpcHRpb247CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNR0NQX05PREU6CisJY2FzZSBHQlBST1hZX05PREU6CisJY2FzZSBTR1NOX05PREU6CisJY2FzZSBOU19OT0RFOgorCWNhc2UgQlNTR1BfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIE9NTF9OT0RFOgorCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJdGFsbG9jX2ZyZWUodnR5LT5pbmRleCk7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBFbmQgb2YgY29uZmlndXJhdGlvbi4gKi8KK2dERUZVTihvdXJub2RlX2VuZCwKKyAgICAgICBvdXJub2RlX2VuZF9jbWQsICJlbmQiLCAiRW5kIGN1cnJlbnQgbW9kZSBhbmQgY2hhbmdlIHRvIGVuYWJsZSBtb2RlLiIpCit7CisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgR1NNTkVUX05PREU6CisJY2FzZSBCVFNfTk9ERToKKwljYXNlIFRSWF9OT0RFOgorCWNhc2UgVFNfTk9ERToKKwljYXNlIE1HQ1BfTk9ERToKKwljYXNlIEdCUFJPWFlfTk9ERToKKwljYXNlIFNHU05fTk9ERToKKwljYXNlIE5TX05PREU6CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQl2dHktPmluZGV4X3N1YiA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2RiLmMgYi9vcGVuYnNjL3NyYy9kYi5jCmluZGV4IDEwYzFkNmQuLjcyZTZiZDMgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL2RiLmMKKysrIGIvb3BlbmJzYy9zcmMvZGIuYwpAQCAtMjAsMTMgKzIwLDggQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KLSNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgotI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KLSNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KLSNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgotCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxsaWJnZW4uaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzQsNiArMjksMTQgQEAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGRiaS9kYmkuaD4KIAorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisKIHN0YXRpYyBjaGFyICpkYl9iYXNlbmFtZSA9IE5VTEw7CiBzdGF0aWMgY2hhciAqZGJfZGlybmFtZSA9IE5VTEw7CiBzdGF0aWMgZGJpX2Nvbm4gY29ubjsKQEAgLTEyNCwxNSArMTI3LDIwIEBACiAJCSJ2YWx1ZSBJTlRFR0VSIE5PVCBOVUxMLCAiCiAJCSJuYW1lIFRFWFQgTk9UIE5VTEwgIgogCQkiKSIsCi0JIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEF1dGhLZXlzICgiCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFJhdGVDb3VudGVycyAoIgogCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCi0JCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJ0aW1lc3RhbXAgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ2YWx1ZSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJuYW1lIFRFWFQgTk9UIE5VTEwsICIKKwkJImlkeCBJTlRFR0VSIE5PVCBOVUxMICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoS2V5cyAoIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCAiCiAJCSJhbGdvcml0aG1faWQgSU5URUdFUiBOT1QgTlVMTCwgIgogCQkiYTNhOF9raSBCTE9CICIKIAkJIikiLAotCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoVHVwbGVzICgiCi0JCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKLQkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwsICIKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aExhc3RUdXBsZXMgKCIKKwkJInN1YnNjcmliZXJfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgIgogCQkiaXNzdWVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgogCQkidXNlX2NvdW50IElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCAiCiAJCSJrZXlfc2VxIElOVEVHRVIgTk9UIE5VTEwsICIKQEAgLTI1NCw3ICsyNjIsNyBAQAogCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOwogCiAJLyogSXMgdGhpcyBzdWJzY3JpYmVyIGtub3duIGluIHRoZSBkYj8gKi8KLQlzdWJzY3IgPSBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGltc2kpOyAKKwlzdWJzY3IgPSBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGltc2kpOwogCWlmIChzdWJzY3IpIHsKIAkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSBTdWJzY3JpYmVyIHNldCB1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpICIKQEAgLTI4OCw2ICsyOTYsOCBAQAogCXJldHVybiBzdWJzY3I7CiB9CiAKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHVuc2lnbmVkIGNoYXIpID09IHNpemVvZihzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSksIGNsYXNzbWFyazFfc2l6ZSk7CisKIHN0YXRpYyBpbnQgZ2V0X2VxdWlwbWVudF9ieV9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCiB7CiAJZGJpX3Jlc3VsdCByZXN1bHQ7CkBAIC0zMTYsOSArMzI2LDEwIEBACiAJCXN0cm5jcHkoZXF1aXAtPmltZWksIHN0cmluZywgc2l6ZW9mKGVxdWlwLT5pbWVpKSk7CiAKIAlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiY2xhc3NtYXJrMSIpOwotCWlmIChzdHJpbmcpCi0JCSBjbTEgPSBhdG9pKHN0cmluZykgJiAweGZmOwotCWVxdWlwLT5jbGFzc21hcmsxID0gKigoc3RydWN0IGdzbTQ4X2NsYXNzbWFyazEgKikgJmNtMSk7CisJaWYgKHN0cmluZykgeworCQljbTEgPSBhdG9pKHN0cmluZykgJiAweGZmOworCQltZW1jcHkoJmVxdWlwLT5jbGFzc21hcmsxLCAmY20xLCBzaXplb2YoZXF1aXAtPmNsYXNzbWFyazEpKTsKKwl9CiAKIAllcXVpcC0+Y2xhc3NtYXJrMl9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiY2xhc3NtYXJrMiIpOwogCWNtMiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJjbGFzc21hcmsyIik7CkBAIC0zMzcsOCArMzQ4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGdldF9hdXRoaW5mb19ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAotCQkJICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCitpbnQgZGJfZ2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQogewogCWRiaV9yZXN1bHQgcmVzdWx0OwogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmEzYThfa2k7CkBAIC0zNjYsOCArMzc3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKLQkJCSAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK2ludCBkYl9zeW5jX2F1dGhpbmZvX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKIHsKIAlkYmlfcmVzdWx0IHJlc3VsdDsKIAlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mb19vbGQ7CkBAIC0zODksNyArNDAwLDcgQEAKIAl9CiAKIAkvKiBDaGVjayBpZiBhbHJlYWR5IGV4aXN0aW5nICovCi0JcmMgPSBnZXRfYXV0aGluZm9fYnlfc3Vic2NyKCZhaW5mb19vbGQsIHN1YnNjcik7CisJcmMgPSBkYl9nZXRfYXV0aGluZm9fZm9yX3N1YnNjcigmYWluZm9fb2xkLCBzdWJzY3IpOwogCWlmIChyYyAmJiByYyAhPSAtRU5PRU5UKQogCQlyZXR1cm4gcmM7CiAJdXBkID0gcmMgPyAwIDogMTsKQEAgLTQyMiwxNSArNDMzLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKLQkJCSAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK2ludCBkYl9nZXRfbGFzdGF1dGh0dXBsZV9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCiB7CiAJZGJpX3Jlc3VsdCByZXN1bHQ7CiAJaW50IGxlbjsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpibG9iOwogCiAJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCi0JCQkiU0VMRUNUICogRlJPTSBBdXRoVHVwbGVzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJIlNFTEVDVCAqIEZST00gQXV0aExhc3RUdXBsZXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCiAJCQlzdWJzY3ItPmlkKTsKIAlpZiAoIXJlc3VsdCkKIAkJcmV0dXJuIC1FSU87CkBAIC00NzUsOCArNDg2LDggQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAotaW50IHNldF9hdXRodHVwbGVfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKLQkJCSAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCitpbnQgZGJfc3luY19sYXN0YXV0aHR1cGxlX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCiB7CiAJZGJpX3Jlc3VsdCByZXN1bHQ7CiAJaW50IHJjLCB1cGQ7CkBAIC00ODYsNyArNDk3LDcgQEAKIAkvKiBEZWxldGlvbiA/ICovCiAJaWYgKGF0dXBsZSA9PSBOVUxMKSB7CiAJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAotCQkJIkRFTEVURSBGUk9NIEF1dGhUdXBsZXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQkiREVMRVRFIEZST00gQXV0aExhc3RUdXBsZXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCiAJCQlzdWJzY3ItPmlkKTsKIAogCQlpZiAoIXJlc3VsdCkKQEAgLTQ5OCw3ICs1MDksNyBAQAogCX0KIAogCS8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKi8KLQlyYyA9IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKCZhdHVwbGVfb2xkLCBzdWJzY3IpOworCXJjID0gZGJfZ2V0X2xhc3RhdXRodHVwbGVfZm9yX3N1YnNjcigmYXR1cGxlX29sZCwgc3Vic2NyKTsKIAlpZiAocmMgJiYgcmMgIT0gLUVOT0VOVCkKIAkJcmV0dXJuIHJjOwogCXVwZCA9IHJjID8gMCA6IDE7CkBAIC01MTMsNyArNTI0LDcgQEAKIAogCWlmICghdXBkKSB7CiAJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAotCQkJCSJJTlNFUlQgSU5UTyBBdXRoVHVwbGVzICIKKwkJCQkiSU5TRVJUIElOVE8gQXV0aExhc3RUdXBsZXMgIgogCQkJCSIoc3Vic2NyaWJlcl9pZCwgaXNzdWVkLCB1c2VfY291bnQsICIKIAkJCQkgImtleV9zZXEsIHJhbmQsIHNyZXMsIGtjKSAiCiAJCQkJIlZBTFVFUyAoJXUsIGRhdGV0aW1lKCdub3cnKSwgJXUsICIKQEAgLTUyNCw3ICs1MzUsNyBAQAogCQljaGFyICppc3N1ZWQgPSBhdHVwbGUtPmtleV9zZXEgPT0gYXR1cGxlX29sZC5rZXlfc2VxID8KIAkJCQkJImlzc3VlZCIgOiAiZGF0ZXRpbWUoJ25vdycpIjsKIAkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCi0JCQkJIlVQREFURSBBdXRoS2V5cyAiCisJCQkJIlVQREFURSBBdXRoTGFzdFR1cGxlcyAiCiAJCQkJIlNFVCBpc3N1ZWQ9JXMsIHVzZV9jb3VudD0ldSwgIgogCQkJCSAia2V5X3NlcT0ldSwgcmFuZD0lcywgc3Jlcz0lcywga2M9JXMgIgogCQkJCSJXSEVSRSBzdWJzY3JpYmVyX2lkID0gJXUiLApAQCAtMTAxNCw3ICsxMDI1LDcgQEAKIH0KIAogLyogcmV0cmlldmUgdGhlIG5leHQgdW5zZW50IFNNUyB3aXRoIElEID49IG1pbl9pZCAqLwotc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbWluX2lkKQorc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBsb25nIGxvbmcgbWluX2lkKQogewogCWRiaV9yZXN1bHQgcmVzdWx0OwogCXN0cnVjdCBnc21fc21zICpzbXM7CkBAIC0xMDQxLDcgKzEwNTIsNyBAQAogCXJldHVybiBzbXM7CiB9CiAKLXN0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9ieV9zdWJzY3Ioc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtaW5fc3Vic2NyX2lkKQorc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgbG9uZyBsb25nIG1pbl9zdWJzY3JfaWQpCiB7CiAJZGJpX3Jlc3VsdCByZXN1bHQ7CiAJc3RydWN0IGdzbV9zbXMgKnNtczsKQEAgLTEwNDksNyArMTA2MCw3IEBACiAJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCiAJCSJTRUxFQ1QgKiBGUk9NIFNNUyxTdWJzY3JpYmVyICIKIAkJIldIRVJFIHNtcy5yZWNlaXZlcl9pZCA+PSAlbGx1IEFORCBzbXMuc2VudCBpcyBOVUxMICIKLQkJCSJBTkQgc21zLnJlY2VpdmVyX2lkID0gc3Vic2NyaWJlci5pZCAiIAorCQkJIkFORCBzbXMucmVjZWl2ZXJfaWQgPSBzdWJzY3JpYmVyLmlkICIKIAkJCSJBTkQgc3Vic2NyaWJlci5sYWMgPiAwICIKIAkJIk9SREVSIEJZIHNtcy5yZWNlaXZlcl9pZCwgaWQgTElNSVQgMSIsCiAJCW1pbl9zdWJzY3JfaWQpOwpAQCAtMTEzMyw3ICsxMTQ0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRiX2FwZHVfYmxvYl9zdG9yZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwgCitpbnQgZGJfYXBkdV9ibG9iX3N0b3JlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAogCQkJdV9pbnQ4X3QgYXBkdV9pZF9mbGFncywgdV9pbnQ4X3QgbGVuLAogCQkJdV9pbnQ4X3QgKmFwZHUpCiB7CkBAIC0xMTc3LDMgKzExODgsNDIgQEAKIAlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGludCBkYl9zdG9yZV9yYXRlX2N0cihzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAgKmN0cmcsIHVuc2lnbmVkIGludCBudW0sCisJCQkgICAgIGNoYXIgKnFfcHJlZml4KQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNoYXIgKnFfbmFtZTsKKworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGN0cmctPmRlc2MtPmN0cl9kZXNjW251bV0ubmFtZSwKKwkJCQkgICAmcV9uYW1lKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSW5zZXJ0IElOVE8gUmF0ZUNvdW50ZXJzICIKKwkJIih0aW1lc3RhbXAsbmFtZSxpZHgsdmFsdWUpIFZBTFVFUyAiCisJCSIoZGF0ZXRpbWUoJ25vdycpLCVzLiVzLCV1LCUiUFJJdTY0IikiLAorCQlxX3ByZWZpeCwgcV9uYW1lLCBjdHJnLT5pZHgsIGN0cmctPmN0cltudW1dLmN1cnJlbnQpOworCisJZnJlZShxX25hbWUpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdG9yZV9yYXRlX2N0cl9ncm91cChzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAgKmN0cmcpCit7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqcV9wcmVmaXg7CisKKwlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCBjdHJnLT5kZXNjLT5ncm91cF9uYW1lX3ByZWZpeCwgJnFfcHJlZml4KTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHJnLT5kZXNjLT5udW1fY3RyOyBpKyspCisJCWRiX3N0b3JlX3JhdGVfY3RyKGN0cmcsIGksIHFfcHJlZml4KTsKKworCWZyZWUocV9wcmVmaXgpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9kZWJ1Zy5jIGIvb3BlbmJzYy9zcmMvZGVidWcuYwppbmRleCA4ZjdhMWMzLi41MTI5MzVhIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9kZWJ1Zy5jCisrKyBiL29wZW5ic2Mvc3JjL2RlYnVnLmMKQEAgLTEsNSArMSw2IEBACi0vKiBEZWJ1Z2dpbmcvTG9nZ2luZyBzdXBwb3J0IGNvZGUgKi8KLS8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisvKiBPcGVuQlNDIERlYnVnZ2luZy9Mb2dnaW5nIHN1cHBvcnQgY29kZSAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CiAgKiAoQykgMjAwOCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAgKgpAQCAtMjcsNDAxICsyOCwyMTggQEAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KIAotI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KICNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KICNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KIAogLyogZGVmYXVsdCBjYXRlZ29yaWVzICovCi1zdGF0aWMgc3RydWN0IGRlYnVnX2NhdGVnb3J5IGRlZmF1bHRfY2F0ZWdvcmllc1tEZWJ1Z19MYXN0RW50cnldID0gewotICAgIFtEUkxMXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAotICAgIFtEQ0NdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCi0gICAgW0ROTV0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKLSAgICBbRFJSXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAotICAgIFtEUlNMXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAotICAgIFtETU1dCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfSU5GTyB9LAotICAgIFtETU5DQ10JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKLSAgICBbRFNNU10JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKLSAgICBbRFBBR10JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKLSAgICBbRE1FQVNdCT0geyAuZW5hYmxlZCA9IDAsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCi0gICAgW0RNSV0JPSB7IC5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKLSAgICBbRE1JQl0JPSB7IC5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKLSAgICBbRE1VWF0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKLSAgICBbRElOUF0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKLSAgICBbRFNDQ1BdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCi0gICAgW0RNU0NdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCi0gICAgW0RNR0NQXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAotICAgIFtESE9dCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCi0gICAgW0REQl0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKLSAgICBbRFJFRl0JPSB7IC5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbG9nX2luZm9fY2F0IGRlZmF1bHRfY2F0ZWdvcmllc1tdID0geworCVtEUkxMXSA9IHsKKwkJLm5hbWUgPSAiRFJMTCIsCisJCS5kZXNjcmlwdGlvbiA9ICJBLWJpcyBSYWRpbyBMaW5rIExheWVyIChSTEwpIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszMW0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RDQ10gPSB7CisJCS5uYW1lID0gIkRDQyIsCisJCS5kZXNjcmlwdGlvbiA9ICJMYXllcjMgQ2FsbCBDb250cm9sIChDQykiLAorCQkuY29sb3IgPSAiXDAzM1sxOzMybSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1NXSA9IHsKKwkJLm5hbWUgPSAiRE1NIiwKKwkJLmRlc2NyaXB0aW9uID0gIkxheWVyMyBNb2JpbGl0eSBNYW5hZ2VtZW50IChNTSkiLAorCQkuY29sb3IgPSAiXDAzM1sxOzMzbSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFJSXSA9IHsKKwkJLm5hbWUgPSAiRFJSIiwKKwkJLmRlc2NyaXB0aW9uID0gIkxheWVyMyBSYWRpbyBSZXNvdXJjZSAoUlIpIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszNG0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RSU0xdID0geworCQkubmFtZSA9ICJEUlNMIiwKKwkJLmRlc2NyaXB0aW9uID0gIkEtYmlzIFJhZGlvIFNpZ2FubGxpbmcgTGluayAoUlNMKSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzVtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETk1dID0JeworCQkubmFtZSA9ICJETk0iLAorCQkuZGVzY3JpcHRpb24gPSAiQS1iaXMgTmV0d29yayBNYW5hZ2VtZW50IC8gTyZNIChOTS9PTUwpIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszNm0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfSU5GTywKKwl9LAorCVtETU5DQ10gPSB7CisJCS5uYW1lID0gIkRNTkNDIiwKKwkJLmRlc2NyaXB0aW9uID0gIk1OQ0MgQVBJIGZvciBDYWxsIENvbnRyb2wgYXBwbGljYXRpb24iLAorCQkuY29sb3IgPSAiXDAzM1sxOzM5bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFNNU10gPSB7CisJCS5uYW1lID0gIkRTTVMiLAorCQkuZGVzY3JpcHRpb24gPSAiTGF5ZXIzIFNob3J0IE1lc3NhZ2UgU2VydmljZSAoU01TKSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzdtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEUEFHXQk9IHsKKwkJLm5hbWUgPSAiRFBBRyIsCisJCS5kZXNjcmlwdGlvbiA9ICJQYWdpbmcgU3Vic3lzdGVtIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszOG0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNRUFTXSA9IHsKKwkJLm5hbWUgPSAiRE1FQVMiLAorCQkuZGVzY3JpcHRpb24gPSAiUmFkaW8gTWVhc3VyZW1lbnQgUHJvY2Vzc2luZyIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1JXSA9IHsKKwkJLm5hbWUgPSAiRE1JIiwKKwkJLmRlc2NyaXB0aW9uID0gIkEtYmlzIElucHV0IERyaXZlciBmb3IgU2lnbmFsbGluZyIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1JQl0gPSB7CisJCS5uYW1lID0gIkRNSUIiLAorCQkuZGVzY3JpcHRpb24gPSAiQS1iaXMgSW5wdXQgRHJpdmVyIGZvciBCLUNoYW5uZWxzICh2b2ljZSkiLAorCQkuZW5hYmxlZCA9IDAsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNVVhdID0geworCQkubmFtZSA9ICJETVVYIiwKKwkJLmRlc2NyaXB0aW9uID0gIkEtYmlzIEItU3ViY2hhbm5lbCBUUkFVIEZyYW1lIE11bHRpcGxleCIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRElOUF0gPSB7CisJCS5uYW1lID0gIkRJTlAiLAorCQkuZGVzY3JpcHRpb24gPSAiQS1iaXMgSW50cHV0IFN1YnN5c3RlbSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFNDQ1BdID0geworCQkubmFtZSA9ICJEU0NDUCIsCisJCS5kZXNjcmlwdGlvbiA9ICJTQ0NQIFByb3RvY29sIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETVNDXSA9IHsKKwkJLm5hbWUgPSAiRE1TQyIsCisJCS5kZXNjcmlwdGlvbiA9ICJNb2JpbGUgU3dpdGNoaW5nIENlbnRlciIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1HQ1BdID0geworCQkubmFtZSA9ICJETUdDUCIsCisJCS5kZXNjcmlwdGlvbiA9ICJNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RIT10gPSB7CisJCS5uYW1lID0gIkRITyIsCisJCS5kZXNjcmlwdGlvbiA9ICJIYW5kLU92ZXIiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0REQl0gPSB7CisJCS5uYW1lID0gIkREQiIsCisJCS5kZXNjcmlwdGlvbiA9ICJEYXRhYmFzZSBMYXllciIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFJFRl0gPSB7CisJCS5uYW1lID0gIkRSRUYiLAorCQkuZGVzY3JpcHRpb24gPSAiUmVmZXJlbmNlIENvdW50aW5nIiwKKwkJLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtER1BSU10gPSB7CisJCS5uYW1lID0gIkRHUFJTIiwKKwkJLmRlc2NyaXB0aW9uID0gIkdQUlMgUGFja2V0IFNlcnZpY2UiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfREVCVUcsCisJfSwKKwlbRE5TXSA9IHsKKwkJLm5hbWUgPSAiRE5TIiwKKwkJLmRlc2NyaXB0aW9uID0gIkdQUlMgTmV0d29yayBTZXJ2aWNlIChOUykiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfSU5GTywKKwl9LAorCVtEQlNTR1BdID0geworCQkubmFtZSA9ICJEQlNTR1AiLAorCQkuZGVzY3JpcHRpb24gPSAiR1BSUyBCU1MgR2F0ZXdheSBQcm90b2NvbCAoQlNTR1ApIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX0RFQlVHLAorCX0sCisJW0RMTENdID0geworCQkubmFtZSA9ICJETExDIiwKKwkJLmRlc2NyaXB0aW9uID0gIkdQUlMgTG9naWNhbCBMaW5rIENvbnRyb2wgUHJvdG9jb2wgKExMQykiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfREVCVUcsCisJfSwKKwlbRFNORENQXSA9IHsKKwkJLm5hbWUgPSAiRFNORENQIiwKKwkJLmRlc2NyaXB0aW9uID0gIkdQUlMgU3ViLU5ldHdvcmsgRGVwZW5kZW50IENvbnRyb2wgUHJvdG9jb2wgKFNORENQKSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9ERUJVRywKKwl9LAogfTsKIAotc3RydWN0IGRlYnVnX2luZm8gewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqY29sb3I7Ci0JY29uc3QgY2hhciAqZGVzY3JpcHRpb247Ci0JaW50IG51bWJlcjsKLQlpbnQgcG9zaXRpb247CitlbnVtIGxvZ19maWx0ZXIgeworCV9GTFRfQUxMID0gTE9HX0ZJTFRFUl9BTEwsCS8qIGxpYm9zbW9jb3JlICovCisJRkxUX0lNU0kgPSAxLAorCUZMVF9OU1ZDID0gMiwKKwlGTFRfQlZDICA9IDMsCiB9OwogCi1zdHJ1Y3QgZGVidWdfY29udGV4dCB7Ci0Jc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47Ci0Jc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7Ci0Jc3RydWN0IGdzbV9idHMgKmJ0czsKK3N0YXRpYyBpbnQgZmlsdGVyX2ZuKGNvbnN0IHN0cnVjdCBsb2dfY29udGV4dCAqY3R4LAorCQkgICAgIHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBjdHgtPmN0eFtCU0NfQ1RYX1NVQlNDUl07CisJY29uc3Qgc3RydWN0IGdwcnNfbnN2YyAqbnN2YyA9IGN0eC0+Y3R4W0JTQ19DVFhfTlNWQ107CisJY29uc3Qgc3RydWN0IGdwcnNfbnN2YyAqYnZjID0gY3R4LT5jdHhbQlNDX0NUWF9CVkNdOworCisJaWYgKCh0YXItPmZpbHRlcl9tYXAgJiAoMSA8PCBGTFRfSU1TSSkpICE9IDAKKwkgICAgJiYgc3Vic2NyICYmIHN0cmNtcChzdWJzY3ItPmltc2ksIHRhci0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldKSA9PSAwKQorCQlyZXR1cm4gMTsKKworCS8qIEZpbHRlciBvbiB0aGUgTlMgVmlydHVhbCBDb25uZWN0aW9uICovCisJaWYgKCh0YXItPmZpbHRlcl9tYXAgJiAoMSA8PCBGTFRfTlNWQykpICE9IDAKKwkgICAgJiYgbnN2YyAmJiAobnN2YyA9PSB0YXItPmZpbHRlcl9kYXRhW0ZMVF9OU1ZDXSkpCisJCXJldHVybiAxOworCisJLyogRmlsdGVyIG9uIHRoZSBOUyBWaXJ0dWFsIENvbm5lY3Rpb24gKi8KKwlpZiAoKHRhci0+ZmlsdGVyX21hcCAmICgxIDw8IEZMVF9CVkMpKSAhPSAwCisJICAgICYmIGJ2YyAmJiAoYnZjID09IHRhci0+ZmlsdGVyX2RhdGFbRkxUX0JWQ10pKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgbG9nX2luZm8gbG9nX2luZm8gPSB7CisJLmZpbHRlcl9mbiA9IGZpbHRlcl9mbiwKKwkuY2F0ID0gZGVmYXVsdF9jYXRlZ29yaWVzLAorCS5udW1fY2F0ID0gQVJSQVlfU0laRShkZWZhdWx0X2NhdGVnb3JpZXMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBkZWJ1Z19jb250ZXh0IGRlYnVnX2NvbnRleHQ7Ci1zdGF0aWMgdm9pZCAqdGFsbF9kYmdfY3R4ID0gTlVMTDsKLXN0YXRpYyBMTElTVF9IRUFEKHRhcmdldF9saXN0KTsKLQotI2RlZmluZSBERUJVR19DQVRFR09SWShOVU1CRVIsIE5BTUUsIENPTE9SLCBERVNDUklQVElPTikgXAotCXsgLm5hbWUgPSBOQU1FLCAuY29sb3IgPSBDT0xPUiwgLmRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT04sIC5udW1iZXIgPSBOVU1CRVIgfSwKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z19pbmZvIGRlYnVnX2luZm9bXSA9IHsKLQlERUJVR19DQVRFR09SWShEUkxMLCAgIkRSTEwiLCAiXDAzM1sxOzMxbSIsICIiKQotCURFQlVHX0NBVEVHT1JZKERDQywgICAiRENDIiwgICJcMDMzWzE7MzJtIiwgIiIpCi0JREVCVUdfQ0FURUdPUlkoRE1NLCAgICJETU0iLCAgIlwwMzNbMTszM20iLCAiIikKLQlERUJVR19DQVRFR09SWShEUlIsICAgIkRSUiIsICAiXDAzM1sxOzM0bSIsICIiKQotCURFQlVHX0NBVEVHT1JZKERSU0wsICAiRFJTTCIsICJcMDMzWzE7MzVtIiwgIiIpCi0JREVCVUdfQ0FURUdPUlkoRE5NLCAgICJETk0iLCAgIlwwMzNbMTszNm0iLCAiIikKLQlERUJVR19DQVRFR09SWShEU01TLCAgIkRTTVMiLCAiXDAzM1sxOzM3bSIsICIiKQotCURFQlVHX0NBVEVHT1JZKERQQUcsICAiRFBBRyIsICJcMDMzWzE7MzhtIiwgIiIpCi0JREVCVUdfQ0FURUdPUlkoRE1OQ0MsICJETU5DQyIsIlwwMzNbMTszOW0iLCAiIikKLQlERUJVR19DQVRFR09SWShESU5QLCAgIkRJTlAiLCAiIiwgIiIpCi0JREVCVUdfQ0FURUdPUlkoRE1JLCAgIkRNSSIsICIiLCAiIikKLQlERUJVR19DQVRFR09SWShETUlCLCAgIkRNSUIiLCAiIiwgIiIpCi0JREVCVUdfQ0FURUdPUlkoRE1VWCwgICJETVVYIiwgIiIsICIiKQotCURFQlVHX0NBVEVHT1JZKERNRUFTLCAgIkRNRUFTIiwgIiIsICIiKQotCURFQlVHX0NBVEVHT1JZKERTQ0NQLCAiRFNDQ1AiLCAiIiwgIiIpCi0JREVCVUdfQ0FURUdPUlkoRE1TQywgIkRNU0MiLCAiIiwgIiIpCi0JREVCVUdfQ0FURUdPUlkoRE1HQ1AsICJETUdDUCIsICIiLCAiIikKLQlERUJVR19DQVRFR09SWShESE8sICJESE8iLCAiIiwgIiIpCi0JREVCVUdfQ0FURUdPUlkoRERCLCAiRERCIiwgIiIsICIiKQotCURFQlVHX0NBVEVHT1JZKERSRUYsICJEUkVGIiwgIiIsICIiKQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbG9nbGV2ZWxfc3Ryc1tdID0gewotCXsgMCwJIkVWRVJZVEhJTkciIH0sCi0JeyAxLAkiREVCVUciIH0sCi0JeyAzLAkiSU5GTyIgfSwKLQl7IDUsCSJOT1RJQ0UiIH0sCi0JeyA3LAkiRVJST1IiIH0sCi0JeyA4LAkiRkFUQUwiIH0sCi0JeyAwLCBOVUxMIH0sCi19OwotCi1pbnQgZGVidWdfcGFyc2VfbGV2ZWwoY29uc3QgY2hhciAqbHZsKQotewotCXJldHVybiBnZXRfc3RyaW5nX3ZhbHVlKGxvZ2xldmVsX3N0cnMsIGx2bCk7Ci19Ci0KLWludCBkZWJ1Z19wYXJzZV9jYXRlZ29yeShjb25zdCBjaGFyICpjYXRlZ29yeSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlYnVnX2luZm8pOyArK2kpIHsKLQkJaWYgKCFzdHJjYXNlY21wKGRlYnVnX2luZm9baV0ubmFtZSsxLCBjYXRlZ29yeSkpCi0JCQlyZXR1cm4gZGVidWdfaW5mb1tpXS5udW1iZXI7Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qCi0gKiBQYXJzZSB0aGUgY2F0ZWdvcnkgbWFzay4KLSAqIFRoZSBmb3JtYXQgY2FuIGJlIHRoaXM6IGNhdGVnb3J5MTpjYXRlZ29yeTI6Y2F0ZWdvcnkzCi0gKiBvciBjYXRlZ29yeTEsMjpjYXRlZ29yeTIsMzouLi4KLSAqLwotdm9pZCBkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0cnVjdCBkZWJ1Z190YXJnZXQqIHRhcmdldCwgY29uc3QgY2hhciAqX21hc2spCi17Ci0JaW50IGkgPSAwOwotCWNoYXIgKm1hc2sgPSBzdHJkdXAoX21hc2spOwotCWNoYXIgKmNhdGVnb3J5X3Rva2VuID0gTlVMTDsKLQotCS8qIERpc2FibGUgZXZlcnl0aGluZyB0byBlbmFibGUgaXQgYWZ0ZXJ3YXJkcyAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhcmdldC0+Y2F0ZWdvcmllcyk7ICsraSkKLQkJdGFyZ2V0LT5jYXRlZ29yaWVzW2ldLmVuYWJsZWQgPSAwOwotCi0JY2F0ZWdvcnlfdG9rZW4gPSBzdHJ0b2sobWFzaywgIjoiKTsKLQlkbyB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlYnVnX2luZm8pOyArK2kpIHsKLQkJCWNoYXIqIGNvbG9uID0gc3Ryc3RyKGNhdGVnb3J5X3Rva2VuLCAiLCIpOwotCQkJaW50IGxlbmd0aCA9IHN0cmxlbihjYXRlZ29yeV90b2tlbik7Ci0KLQkJCWlmIChjb2xvbikKLQkJCSAgICBsZW5ndGggPSBjb2xvbiAtIGNhdGVnb3J5X3Rva2VuOwotCi0JCQlpZiAoc3RybmNhc2VjbXAoZGVidWdfaW5mb1tpXS5uYW1lLCBjYXRlZ29yeV90b2tlbiwgbGVuZ3RoKSA9PSAwKSB7Ci0JCQkJaW50IG51bWJlciA9IGRlYnVnX2luZm9baV0ubnVtYmVyOwotCQkJCWludCBsZXZlbCA9IDA7Ci0KLQkJCQlpZiAoY29sb24pCi0JCQkJCWxldmVsID0gYXRvaShjb2xvbisxKTsKLQotCQkJCXRhcmdldC0+Y2F0ZWdvcmllc1tudW1iZXJdLmVuYWJsZWQgPSAxOwotCQkJCXRhcmdldC0+Y2F0ZWdvcmllc1tudW1iZXJdLmxvZ2xldmVsID0gbGV2ZWw7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlICgoY2F0ZWdvcnlfdG9rZW4gPSBzdHJ0b2soTlVMTCwgIjoiKSkpOwotCi0JZnJlZShtYXNrKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGNvbG9yKGludCBzdWJzeXMpCi17Ci0JaW50IGkgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGVidWdfaW5mbyk7ICsraSkgewotCQlpZiAoZGVidWdfaW5mb1tpXS5udW1iZXIgPT0gc3Vic3lzKQotCQkJcmV0dXJuIGRlYnVnX2luZm9baV0uY29sb3I7Ci0JfQotCi0JcmV0dXJuICIiOwotfQotCi1zdGF0aWMgdm9pZCBfb3V0cHV0KHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgdW5zaWduZWQgaW50IHN1YnN5cywgY2hhciAqZmlsZSwgaW50IGxpbmUsCi0JCSAgICBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQotewotCWNoYXIgY29sWzMwXTsKLQljaGFyIHN1YlszMF07Ci0JY2hhciB0aW1bMzBdOwotCWNoYXIgYnVmWzQwOTZdOwotCWNoYXIgZmluYWxbNDA5Nl07Ci0KLQkvKiBwcmVwYXJlIHRoZSBkYXRhICovCi0JY29sWzBdID0gJ1wwJzsKLQlzdWJbMF0gPSAnXDAnOwotCXRpbVswXSA9ICdcMCc7Ci0JYnVmWzBdID0gJ1wwJzsKLQotCS8qIGFyZSB3ZSB1c2luZyBjb2xvciAqLwotCWlmICh0YXJnZXQtPnVzZV9jb2xvcikgewotCQlzbnByaW50Zihjb2wsIHNpemVvZihjb2wpLCAiJXMiLCBjb2xvcihzdWJzeXMpKTsKLQkJY29sW3NpemVvZihjb2wpLTFdID0gJ1wwJzsKLQl9Ci0JdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYXApOwotCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7Ci0KLQlpZiAoIWNvbnQpIHsKLQkJaWYgKHRhcmdldC0+cHJpbnRfdGltZXN0YW1wKSB7Ci0JCQljaGFyICp0aW1lc3RyOwotCQkJdGltZV90IHRtOwotCQkJdG0gPSB0aW1lKE5VTEwpOwotCQkJdGltZXN0ciA9IGN0aW1lKCZ0bSk7Ci0JCQl0aW1lc3RyW3N0cmxlbih0aW1lc3RyKS0xXSA9ICdcMCc7Ci0JCQlzbnByaW50Zih0aW0sIHNpemVvZih0aW0pLCAiJXMgIiwgdGltZXN0cik7Ci0JCQl0aW1bc2l6ZW9mKHRpbSktMV0gPSAnXDAnOwotCQl9Ci0JCXNucHJpbnRmKHN1Yiwgc2l6ZW9mKHN1YiksICI8JTQuNHg+ICVzOiVkICIsIHN1YnN5cywgZmlsZSwgbGluZSk7Ci0JCXN1YltzaXplb2Yoc3ViKS0xXSA9ICdcMCc7Ci0JfQotCi0Jc25wcmludGYoZmluYWwsIHNpemVvZihmaW5hbCksICIlcyVzJXMlc1wwMzNbMDttIiwgY29sLCB0aW0sIHN1YiwgYnVmKTsKLQlmaW5hbFtzaXplb2YoZmluYWwpLTFdID0gJ1wwJzsKLQl0YXJnZXQtPm91dHB1dCh0YXJnZXQsIGZpbmFsKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBfZGVidWdwKHVuc2lnbmVkIGludCBzdWJzeXMsIGludCBsZXZlbCwgY2hhciAqZmlsZSwgaW50IGxpbmUsCi0JCSAgICBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQotewotCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcjsKLQotCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhciwgJnRhcmdldF9saXN0LCBlbnRyeSkgewotCQlzdHJ1Y3QgZGVidWdfY2F0ZWdvcnkgKmNhdGVnb3J5OwotCQlpbnQgb3V0cHV0ID0gMDsKLQotCQljYXRlZ29yeSA9ICZ0YXItPmNhdGVnb3JpZXNbc3Vic3lzXTsKLQkJLyogc3Vic3lzdGVtIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBkZWJ1Z2dlZCAqLwotCQlpZiAoIWNhdGVnb3J5LT5lbmFibGVkKQotCQkJY29udGludWU7Ci0KLQkJLyogQ2hlY2sgdGhlIGdsb2JhbCBsb2cgbGV2ZWwgKi8KLQkJaWYgKHRhci0+bG9nbGV2ZWwgIT0gMCAmJiBsZXZlbCA8IHRhci0+bG9nbGV2ZWwpCi0JCQljb250aW51ZTsKLQotCQkvKiBDaGVjayB0aGUgY2F0ZWdvcnkgbG9nIGxldmVsICovCi0JCWlmICh0YXItPmxvZ2xldmVsID09IDAgJiYgY2F0ZWdvcnktPmxvZ2xldmVsICE9IDAgJiYgbGV2ZWwgPCBjYXRlZ29yeS0+bG9nbGV2ZWwpCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBBcHBseSBmaWx0ZXJzIGhlcmUuLi4gaWYgdGhhdCBiZWNvbWVzIG1lc3N5IHdlIHdpbGwgbmVlZCB0byBwdXQKLQkJICogZmlsdGVycyBpbiBhIGxpc3QgYW5kIGVhY2ggZmlsdGVyIHdpbGwgc2F5IHN0b3AsIGNvbnRpbnVlLCBvdXRwdXQKLQkJICovCi0JCWlmICgodGFyLT5maWx0ZXJfbWFwICYgREVCVUdfRklMVEVSX0FMTCkgIT0gMCkgewotCQkJb3V0cHV0ID0gMTsKLQkJfSBlbHNlIGlmICgodGFyLT5maWx0ZXJfbWFwICYgREVCVUdfRklMVEVSX0lNU0kpICE9IDAKLQkJCSAgICAgICYmIGRlYnVnX2NvbnRleHQuc3Vic2NyICYmIHN0cmNtcChkZWJ1Z19jb250ZXh0LnN1YnNjci0+aW1zaSwgdGFyLT5pbXNpX2ZpbHRlcikgPT0gMCkgewotCQkJb3V0cHV0ID0gMTsKLQkJfQotCi0JCWlmIChvdXRwdXQpIHsKLQkJCS8qIEZJWE1FOiBjb3B5aW5nIHRoZSB2YV9saXN0IGlzIGFuIHVnbHkgd29ya2Fyb3VuZCBhZ2FpbnN0IGEgYnVnCi0JCQkgKiBoaWRkZW4gc29tZXdoZXJlIGluIF9vdXRwdXQuICBJZiB3ZSBkbyBub3QgY29weSBoZXJlLCB0aGUgZmlyc3QKLQkJCSAqIGNhbGwgdG8gX291dHB1dCgpIHdpbGwgY29ycnVwdCB0aGUgdmFfbGlzdCBjb250ZW50cywgYW5kIGFueQotCQkJICogZnVydGhlciBfb3V0cHV0KCkgY2FsbHMgd2l0aCB0aGUgc2FtZSB2YV9saXN0IHdpbGwgc2VnZmF1bHQgKi8KLQkJCXZhX2xpc3QgYnA7Ci0JCQl2YV9jb3B5KGJwLCBhcCk7Ci0JCQlfb3V0cHV0KHRhciwgc3Vic3lzLCBmaWxlLCBsaW5lLCBjb250LCBmb3JtYXQsIGJwKTsKLQkJCXZhX2VuZChicCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgZGVidWdwKHVuc2lnbmVkIGludCBzdWJzeXMsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQotCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOwotCV9kZWJ1Z3Aoc3Vic3lzLCBMT0dMX0RFQlVHLCBmaWxlLCBsaW5lLCBjb250LCBmb3JtYXQsIGFwKTsKLQl2YV9lbmQoYXApOwotfQotCi12b2lkIGRlYnVncDIodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IGxldmVsLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0KLQl2YV9zdGFydChhcCwgZm9ybWF0KTsKLQlfZGVidWdwKHN1YnN5cywgbGV2ZWwsIGZpbGUsIGxpbmUsIGNvbnQsIGZvcm1hdCwgYXApOwotCXZhX2VuZChhcCk7Ci19Ci0KLXN0YXRpYyBjaGFyIGhleGRfYnVmZls0MDk2XTsKLQotY2hhciAqaGV4ZHVtcChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0JY2hhciAqY3VyID0gaGV4ZF9idWZmOwotCi0JaGV4ZF9idWZmWzBdID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaW50IGxlbl9yZW1haW4gPSBzaXplb2YoaGV4ZF9idWZmKSAtIChjdXIgLSBoZXhkX2J1ZmYpOwotCQlpbnQgcmMgPSBzbnByaW50ZihjdXIsIGxlbl9yZW1haW4sICIlMDJ4ICIsIGJ1ZltpXSk7Ci0JCWlmIChyYyA8PSAwKQotCQkJYnJlYWs7Ci0JCWN1ciArPSByYzsKLQl9Ci0JaGV4ZF9idWZmW3NpemVvZihoZXhkX2J1ZmYpLTFdID0gMDsKLQlyZXR1cm4gaGV4ZF9idWZmOwotfQotCi0KLQotdm9pZCBkZWJ1Z19hZGRfdGFyZ2V0KHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCkKLXsKLQlsbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5lbnRyeSwgJnRhcmdldF9saXN0KTsKLX0KLQotdm9pZCBkZWJ1Z19kZWxfdGFyZ2V0KHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCkKLXsKLQlsbGlzdF9kZWwoJnRhcmdldC0+ZW50cnkpOwotfQotCi12b2lkIGRlYnVnX3Jlc2V0X2NvbnRleHQodm9pZCkKLXsKLQltZW1zZXQoJmRlYnVnX2NvbnRleHQsIDAsIHNpemVvZihkZWJ1Z19jb250ZXh0KSk7Ci19Ci0KLS8qIGN1cnJlbnRseSB3ZSBhcmUgbm90IHJlZmZpbmcgdGhlc2UgKi8KLXZvaWQgZGVidWdfc2V0X2NvbnRleHQoaW50IGN0eCwgdm9pZCAqdmFsdWUpCi17Ci0Jc3dpdGNoIChjdHgpIHsKLQljYXNlIEJTQ19DVFhfTENIQU46Ci0JCWRlYnVnX2NvbnRleHQubGNoYW4gPSAoc3RydWN0IGdzbV9sY2hhbiAqKSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBCU0NfQ1RYX1NVQlNDUjoKLQkJZGVidWdfY29udGV4dC5zdWJzY3IgPSAoc3RydWN0IGdzbV9zdWJzY3JpYmVyICopIHZhbHVlOwotCQlicmVhazsKLQljYXNlIEJTQ19DVFhfQlRTOgotCQlkZWJ1Z19jb250ZXh0LmJ0cyA9IChzdHJ1Y3QgZ3NtX2J0cyAqKSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBCU0NfQ1RYX1NDQ1A6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBkZWJ1Z19zZXRfaW1zaV9maWx0ZXIoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICppbXNpKQordm9pZCBsb2dfc2V0X2ltc2lfZmlsdGVyKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKmltc2kpCiB7CiAJaWYgKGltc2kpIHsKLQkJdGFyZ2V0LT5maWx0ZXJfbWFwIHw9IERFQlVHX0ZJTFRFUl9JTVNJOwotCQl0YXJnZXQtPmltc2lfZmlsdGVyID0gdGFsbG9jX3N0cmR1cCh0YXJnZXQsIGltc2kpOwotCX0gZWxzZSBpZiAodGFyZ2V0LT5pbXNpX2ZpbHRlcikgewotCQl0YXJnZXQtPmZpbHRlcl9tYXAgJj0gfkRFQlVHX0ZJTFRFUl9JTVNJOwotCQl0YWxsb2NfZnJlZSh0YXJnZXQtPmltc2lfZmlsdGVyKTsKLQkJdGFyZ2V0LT5pbXNpX2ZpbHRlciA9IE5VTEw7CisJCXRhcmdldC0+ZmlsdGVyX21hcCB8PSAoMSA8PCBGTFRfSU1TSSk7CisJCXRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldID0gdGFsbG9jX3N0cmR1cCh0YXJnZXQsIGltc2kpOworCX0gZWxzZSBpZiAodGFyZ2V0LT5maWx0ZXJfZGF0YVtGTFRfSU1TSV0pIHsKKwkJdGFyZ2V0LT5maWx0ZXJfbWFwICY9IH4oMSA8PCBGTFRfSU1TSSk7CisJCXRhbGxvY19mcmVlKHRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldKTsKKwkJdGFyZ2V0LT5maWx0ZXJfZGF0YVtGTFRfSU1TSV0gPSBOVUxMOwogCX0KIH0KIAotdm9pZCBkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBhbGwpCit2b2lkIGxvZ19zZXRfbnN2Y19maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgc3RydWN0IGdwcnNfbnN2YyAqbnN2YykKIHsKLQlpZiAoYWxsKQotCQl0YXJnZXQtPmZpbHRlcl9tYXAgfD0gREVCVUdfRklMVEVSX0FMTDsKLQllbHNlCi0JCXRhcmdldC0+ZmlsdGVyX21hcCAmPSB+REVCVUdfRklMVEVSX0FMTDsKKwlpZiAobnN2YykgeworCQl0YXJnZXQtPmZpbHRlcl9tYXAgfD0gKDEgPDwgRkxUX05TVkMpOworCQl0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9OU1ZDXSA9IG5zdmM7CisJfSBlbHNlIGlmICh0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9OU1ZDXSkgeworCQl0YXJnZXQtPmZpbHRlcl9tYXAgPSB+KDEgPDwgRkxUX05TVkMpOworCQl0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9OU1ZDXSA9IE5VTEw7CisJfQogfQogCi12b2lkIGRlYnVnX3NldF91c2VfY29sb3Ioc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQgdXNlX2NvbG9yKQordm9pZCBsb2dfc2V0X2J2Y19maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgc3RydWN0IGJzc2dwX2J2Y19jdHggKmJjdHgpCiB7Ci0JdGFyZ2V0LT51c2VfY29sb3IgPSB1c2VfY29sb3I7Ci19Ci0KLXZvaWQgZGVidWdfc2V0X3ByaW50X3RpbWVzdGFtcChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBwcmludF90aW1lc3RhbXApCi17Ci0JdGFyZ2V0LT5wcmludF90aW1lc3RhbXAgPSBwcmludF90aW1lc3RhbXA7Ci19Ci0KLXZvaWQgZGVidWdfc2V0X2xvZ19sZXZlbChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBsb2dfbGV2ZWwpCi17Ci0JdGFyZ2V0LT5sb2dsZXZlbCA9IGxvZ19sZXZlbDsKLX0KLQotdm9pZCBkZWJ1Z19zZXRfY2F0ZWdvcnlfZmlsdGVyKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50IGNhdGVnb3J5LCBpbnQgZW5hYmxlLCBpbnQgbGV2ZWwpCi17Ci0JaWYgKGNhdGVnb3J5ID49IERlYnVnX0xhc3RFbnRyeSkKLQkJcmV0dXJuOwotCXRhcmdldC0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0uZW5hYmxlZCA9ICEhZW5hYmxlOwotCXRhcmdldC0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0ubG9nbGV2ZWwgPSBsZXZlbDsKLX0KLQotc3RhdGljIHZvaWQgX3N0ZGVycl9vdXRwdXQoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpsb2cpCi17Ci0JZnByaW50Zih0YXJnZXQtPnRndF9zdGRvdXQub3V0LCAiJXMiLCBsb2cpOwotCWZmbHVzaCh0YXJnZXQtPnRndF9zdGRvdXQub3V0KTsKLX0KLQotc3RydWN0IGRlYnVnX3RhcmdldCAqZGVidWdfdGFyZ2V0X2NyZWF0ZSh2b2lkKQotewotCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldDsKLQotCXRhcmdldCA9IHRhbGxvY196ZXJvKHRhbGxfZGJnX2N0eCwgc3RydWN0IGRlYnVnX3RhcmdldCk7Ci0JaWYgKCF0YXJnZXQpCi0JCXJldHVybiBOVUxMOwotCi0JSU5JVF9MTElTVF9IRUFEKCZ0YXJnZXQtPmVudHJ5KTsKLQltZW1jcHkodGFyZ2V0LT5jYXRlZ29yaWVzLCBkZWZhdWx0X2NhdGVnb3JpZXMsIHNpemVvZihkZWZhdWx0X2NhdGVnb3JpZXMpKTsKLQl0YXJnZXQtPnVzZV9jb2xvciA9IDE7Ci0JdGFyZ2V0LT5wcmludF90aW1lc3RhbXAgPSAwOwotCXRhcmdldC0+bG9nbGV2ZWwgPSAwOwotCXJldHVybiB0YXJnZXQ7Ci19Ci0KLXN0cnVjdCBkZWJ1Z190YXJnZXQgKmRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKHZvaWQpCi17Ci0Jc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0OwotCi0JdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZSgpOwotCWlmICghdGFyZ2V0KQotCQlyZXR1cm4gTlVMTDsKLQotCXRhcmdldC0+dGd0X3N0ZG91dC5vdXQgPSBzdGRlcnI7Ci0JdGFyZ2V0LT5vdXRwdXQgPSBfc3RkZXJyX291dHB1dDsKLQlyZXR1cm4gdGFyZ2V0OwotfQotCi12b2lkIGRlYnVnX2luaXQodm9pZCkKLXsKLQl0YWxsX2RiZ19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgImRlYnVnIik7CisJaWYgKGJjdHgpIHsKKwkJdGFyZ2V0LT5maWx0ZXJfbWFwIHw9ICgxIDw8IEZMVF9CVkMpOworCQl0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9CVkNdID0gYmN0eDsKKwl9IGVsc2UgaWYgKHRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX05TVkNdKSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCA9IH4oMSA8PCBGTFRfQlZDKTsKKwkJdGFyZ2V0LT5maWx0ZXJfZGF0YVtGTFRfQlZDXSA9IE5VTEw7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYyBiL29wZW5ic2Mvc3JjL2UxX2lucHV0LmMKaW5kZXggYzIwMzU5Yy4uYjFkZmU5YiAxMDA2NDQKLS0tIGEvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYworKysgYi9vcGVuYnNjL3NyYy9lMV9pbnB1dC5jCkBAIC00MjAsNyArNDIwLDE3IEBACiAKIHZvaWQgZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluaykKIHsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCiAJbGxpc3RfZGVsKCZsaW5rLT5saXN0KTsKKwl3aGlsZSAoIWxsaXN0X2VtcHR5KCZsaW5rLT50eF9saXN0KSkgeworCQltc2cgPSBtc2diX2RlcXVldWUoJmxpbmstPnR4X2xpc3QpOworCQltc2diX2ZyZWUobXNnKTsKKwl9CisKKwlpZiAobGluay0+dHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9TSUdOKQorCQlic2NfZGVsX3RpbWVyKCZsaW5rLT50cy0+c2lnbi50eF90aW1lcik7CisKIAl0YWxsb2NfZnJlZShsaW5rKTsKIH0KIApAQCAtNDQyLDcgKzQ1Miw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCWRlYnVnX3NldF9jb250ZXh0KEJTQ19DVFhfQlRTLCBsaW5rLT50cngtPmJ0cyk7CisJCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX0JUUywgbGluay0+dHJ4LT5idHMpOwogCQlzd2l0Y2ggKGxpbmstPnR5cGUpIHsKIAkJY2FzZSBFMUlOUF9TSUdOX09NTDoKIAkJCW1zZy0+dHJ4ID0gbGluay0+dHJ4OwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9NYWtlZmlsZS5hbSBiL29wZW5ic2Mvc3JjL2dwcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiNDVmNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNSBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUkkKHRvcF9idWlsZGRpcikKK0FNX0NGTEFHUz0tV2FsbCAtZm5vLXN0cmljdC1hbGlhc2luZyAkKExJQk9TTU9DT1JFX0NGTEFHUykgJChMSUJPU01PVlRZX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKExJQk9TTU9DT1JFX0xJQlMpICQoTElCT1NNT1ZUWV9MSUJTKQorCitub2luc3RfTElCUkFSSUVTID0gbGliZ2IuYQorCitpZiBIQVZFX0xJQkdUUAorc2Jpbl9QUk9HUkFNUyA9IG9zbW8tZ2Jwcm94eSBvc21vLXNnc24KK2Vsc2UKK3NiaW5fUFJPR1JBTVMgPSBvc21vLWdicHJveHkKK2VuZGlmCisKKworbGliZ2JfYV9TT1VSQ0VTID0gZ3Byc19ucy5jIGdwcnNfbnNfZnJncmUuYyBncHJzX25zX3Z0eS5jIFwKKwkJICBncHJzX2Jzc2dwLmMgZ3Byc19ic3NncF91dGlsLmMgZ3Byc19ic3NncF92dHkuYyBcCisJCSAgZ3Byc19sbGMuYyBncHJzX2xsY192dHkuYyBjcmMyNC5jCisKK29zbW9fZ2Jwcm94eV9TT1VSQ0VTID0gZ2JfcHJveHkuYyBnYl9wcm94eV9tYWluLmMgZ2JfcHJveHlfdnR5LmMgXAorCQkJJCh0b3Bfc3JjZGlyKS9zcmMvc29ja2V0LmMgJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYworb3Ntb19nYnByb3h5X0xEQUREID0gbGliZ2IuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYnZ0eS5hCisKK29zbW9fc2dzbl9TT1VSQ0VTID0JZ3Byc19nbW0uYyBncHJzX3Nnc24uYyBncHJzX3NuZGNwLmMgXAorCQkJc2dzbl9tYWluLmMgc2dzbl92dHkuYyBzZ3NuX2xpYmd0cC5jIFwKKwkJCSQodG9wX3NyY2Rpcikvc3JjL3NvY2tldC5jICQodG9wX3NyY2Rpcikvc3JjL2RlYnVnLmMKK29zbW9fc2dzbl9MREFERCA9IGxpYmdiLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJ2dHkuYSAtbGd0cApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9jcmMyNC5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9jcmMyNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODIxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2NyYzI0LmMKQEAgLTAsMCArMSw2OSBAQAorLyogR1BSUyBMTEMgQ1JDLTI0IEltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY3JjMjQuaD4KKworLyogQ1JDMjQgdGFibGUgLSBGQ1MgKi8KK3N0YXRpYyBjb25zdCB1X2ludDMyX3QgdGJsX2NyYzI0WzI1Nl0gPSB7CisJMHgwMDAwMDAwMCwgMHgwMGQ2YTc3NiwgMHgwMGY2NDU1NywgMHgwMDIwZTIyMSwgMHgwMGI3ODExNSwgMHgwMDYxMjY2MywgMHgwMDQxYzQ0MiwgMHgwMDk3NjMzNCwKKwkweDAwMzQwOTkxLCAweDAwZTJhZWU3LCAweDAwYzI0Y2M2LCAweDAwMTRlYmIwLCAweDAwODM4ODg0LCAweDAwNTUyZmYyLCAweDAwNzVjZGQzLCAweDAwYTM2YWE1LAorCTB4MDA2ODEzMjIsIDB4MDBiZWI0NTQsIDB4MDA5ZTU2NzUsIDB4MDA0OGYxMDMsIDB4MDBkZjkyMzcsIDB4MDAwOTM1NDEsIDB4MDAyOWQ3NjAsIDB4MDBmZjcwMTYsCisJMHgwMDVjMWFiMywgMHgwMDhhYmRjNSwgMHgwMGFhNWZlNCwgMHgwMDdjZjg5MiwgMHgwMGViOWJhNiwgMHgwMDNkM2NkMCwgMHgwMDFkZGVmMSwgMHgwMGNiNzk4NywKKwkweDAwZDAyNjQ0LCAweDAwMDY4MTMyLCAweDAwMjY2MzEzLCAweDAwZjBjNDY1LCAweDAwNjdhNzUxLCAweDAwYjEwMDI3LCAweDAwOTFlMjA2LCAweDAwNDc0NTcwLAorCTB4MDBlNDJmZDUsIDB4MDAzMjg4YTMsIDB4MDAxMjZhODIsIDB4MDBjNGNkZjQsIDB4MDA1M2FlYzAsIDB4MDA4NTA5YjYsIDB4MDBhNWViOTcsIDB4MDA3MzRjZTEsCisJMHgwMGI4MzU2NiwgMHgwMDZlOTIxMCwgMHgwMDRlNzAzMSwgMHgwMDk4ZDc0NywgMHgwMDBmYjQ3MywgMHgwMGQ5MTMwNSwgMHgwMGY5ZjEyNCwgMHgwMDJmNTY1MiwKKwkweDAwOGMzY2Y3LCAweDAwNWE5YjgxLCAweDAwN2E3OWEwLCAweDAwYWNkZWQ2LCAweDAwM2JiZGUyLCAweDAwZWQxYTk0LCAweDAwY2RmOGI1LCAweDAwMWI1ZmMzLAorCTB4MDBmYjQ3MzMsIDB4MDAyZGUwNDUsIDB4MDAwZDAyNjQsIDB4MDBkYmE1MTIsIDB4MDA0Y2M2MjYsIDB4MDA5YTYxNTAsIDB4MDBiYTgzNzEsIDB4MDA2YzI0MDcsCisJMHgwMGNmNGVhMiwgMHgwMDE5ZTlkNCwgMHgwMDM5MGJmNSwgMHgwMGVmYWM4MywgMHgwMDc4Y2ZiNywgMHgwMGFlNjhjMSwgMHgwMDhlOGFlMCwgMHgwMDU4MmQ5NiwKKwkweDAwOTM1NDExLCAweDAwNDVmMzY3LCAweDAwNjUxMTQ2LCAweDAwYjNiNjMwLCAweDAwMjRkNTA0LCAweDAwZjI3MjcyLCAweDAwZDI5MDUzLCAweDAwMDQzNzI1LAorCTB4MDBhNzVkODAsIDB4MDA3MWZhZjYsIDB4MDA1MTE4ZDcsIDB4MDA4N2JmYTEsIDB4MDAxMGRjOTUsIDB4MDBjNjdiZTMsIDB4MDBlNjk5YzIsIDB4MDAzMDNlYjQsCisJMHgwMDJiNjE3NywgMHgwMGZkYzYwMSwgMHgwMGRkMjQyMCwgMHgwMDBiODM1NiwgMHgwMDljZTA2MiwgMHgwMDRhNDcxNCwgMHgwMDZhYTUzNSwgMHgwMGJjMDI0MywKKwkweDAwMWY2OGU2LCAweDAwYzljZjkwLCAweDAwZTkyZGIxLCAweDAwM2Y4YWM3LCAweDAwYThlOWYzLCAweDAwN2U0ZTg1LCAweDAwNWVhY2E0LCAweDAwODgwYmQyLAorCTB4MDA0MzcyNTUsIDB4MDA5NWQ1MjMsIDB4MDBiNTM3MDIsIDB4MDA2MzkwNzQsIDB4MDBmNGYzNDAsIDB4MDAyMjU0MzYsIDB4MDAwMmI2MTcsIDB4MDBkNDExNjEsCisJMHgwMDc3N2JjNCwgMHgwMGExZGNiMiwgMHgwMDgxM2U5MywgMHgwMDU3OTllNSwgMHgwMGMwZmFkMSwgMHgwMDE2NWRhNywgMHgwMDM2YmY4NiwgMHgwMGUwMThmMCwKKwkweDAwYWQ4NWRkLCAweDAwN2IyMmFiLCAweDAwNWJjMDhhLCAweDAwOGQ2N2ZjLCAweDAwMWEwNGM4LCAweDAwY2NhM2JlLCAweDAwZWM0MTlmLCAweDAwM2FlNmU5LAorCTB4MDA5OThjNGMsIDB4MDA0ZjJiM2EsIDB4MDA2ZmM5MWIsIDB4MDBiOTZlNmQsIDB4MDAyZTBkNTksIDB4MDBmOGFhMmYsIDB4MDBkODQ4MGUsIDB4MDAwZWVmNzgsCisJMHgwMGM1OTZmZiwgMHgwMDEzMzE4OSwgMHgwMDMzZDNhOCwgMHgwMGU1NzRkZSwgMHgwMDcyMTdlYSwgMHgwMGE0YjA5YywgMHgwMDg0NTJiZCwgMHgwMDUyZjVjYiwKKwkweDAwZjE5ZjZlLCAweDAwMjczODE4LCAweDAwMDdkYTM5LCAweDAwZDE3ZDRmLCAweDAwNDYxZTdiLCAweDAwOTBiOTBkLCAweDAwYjA1YjJjLCAweDAwNjZmYzVhLAorCTB4MDA3ZGEzOTksIDB4MDBhYjA0ZWYsIDB4MDA4YmU2Y2UsIDB4MDA1ZDQxYjgsIDB4MDBjYTIyOGMsIDB4MDAxYzg1ZmEsIDB4MDAzYzY3ZGIsIDB4MDBlYWMwYWQsCisJMHgwMDQ5YWEwOCwgMHgwMDlmMGQ3ZSwgMHgwMGJmZWY1ZiwgMHgwMDY5NDgyOSwgMHgwMGZlMmIxZCwgMHgwMDI4OGM2YiwgMHgwMDA4NmU0YSwgMHgwMGRlYzkzYywKKwkweDAwMTViMGJiLCAweDAwYzMxN2NkLCAweDAwZTNmNWVjLCAweDAwMzU1MjlhLCAweDAwYTIzMWFlLCAweDAwNzQ5NmQ4LCAweDAwNTQ3NGY5LCAweDAwODJkMzhmLAorCTB4MDAyMWI5MmEsIDB4MDBmNzFlNWMsIDB4MDBkN2ZjN2QsIDB4MDAwMTViMGIsIDB4MDA5NjM4M2YsIDB4MDA0MDlmNDksIDB4MDA2MDdkNjgsIDB4MDBiNmRhMWUsCisJMHgwMDU2YzJlZSwgMHgwMDgwNjU5OCwgMHgwMGEwODdiOSwgMHgwMDc2MjBjZiwgMHgwMGUxNDNmYiwgMHgwMDM3ZTQ4ZCwgMHgwMDE3MDZhYywgMHgwMGMxYTFkYSwKKwkweDAwNjJjYjdmLCAweDAwYjQ2YzA5LCAweDAwOTQ4ZTI4LCAweDAwNDIyOTVlLCAweDAwZDU0YTZhLCAweDAwMDNlZDFjLCAweDAwMjMwZjNkLCAweDAwZjVhODRiLAorCTB4MDAzZWQxY2MsIDB4MDBlODc2YmEsIDB4MDBjODk0OWIsIDB4MDAxZTMzZWQsIDB4MDA4OTUwZDksIDB4MDA1ZmY3YWYsIDB4MDA3ZjE1OGUsIDB4MDBhOWIyZjgsCisJMHgwMDBhZDg1ZCwgMHgwMGRjN2YyYiwgMHgwMGZjOWQwYSwgMHgwMDJhM2E3YywgMHgwMGJkNTk0OCwgMHgwMDZiZmUzZSwgMHgwMDRiMWMxZiwgMHgwMDlkYmI2OSwKKwkweDAwODZlNGFhLCAweDAwNTA0M2RjLCAweDAwNzBhMWZkLCAweDAwYTYwNjhiLCAweDAwMzE2NWJmLCAweDAwZTdjMmM5LCAweDAwYzcyMGU4LCAweDAwMTE4NzllLAorCTB4MDBiMmVkM2IsIDB4MDA2NDRhNGQsIDB4MDA0NGE4NmMsIDB4MDA5MjBmMWEsIDB4MDAwNTZjMmUsIDB4MDBkM2NiNTgsIDB4MDBmMzI5NzksIDB4MDAyNThlMGYsCisJMHgwMGVlZjc4OCwgMHgwMDM4NTBmZSwgMHgwMDE4YjJkZiwgMHgwMGNlMTVhOSwgMHgwMDU5NzY5ZCwgMHgwMDhmZDFlYiwgMHgwMGFmMzNjYSwgMHgwMDc5OTRiYywKKwkweDAwZGFmZTE5LCAweDAwMGM1OTZmLCAweDAwMmNiYjRlLCAweDAwZmExYzM4LCAweDAwNmQ3ZjBjLCAweDAwYmJkODdhLCAweDAwOWIzYTViLCAweDAwNGQ5ZDJkCit9OworCisjZGVmaW5lIElOSVRfQ1JDMjQJMHhmZmZmZmYKKwordV9pbnQzMl90IGNyYzI0X2NhbGModV9pbnQzMl90IGZjcywgdV9pbnQ4X3QgKmNwLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXdoaWxlIChsZW4tLSkKKwkJZmNzID0gKGZjcyA+PiA4KSBeIHRibF9jcmMyNFsoZmNzIF4gKmNwKyspICYgMHhmZl07CisJcmV0dXJuIGZjczsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHkuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTU5MjliCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eS5jCkBAIC0wLDAgKzEsNjE2IEBACisvKiBOUy1vdmVyLUlQIHByb3h5ICovCisKKy8qIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBPbiBXYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nYl9wcm94eS5oPgorCitzdHJ1Y3QgZ2Jwcm94X3BlZXIgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBOUy1WQyBvdmVyIHdoaWNoIHdlIHNlbmQvcmVjZWl2ZSBkYXRhIHRvIHRoaXMgQlZDICovCisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCS8qIEJWQ0kgdXNlZCBmb3IgUG9pbnQtdG8tUG9pbnQgdG8gdGhpcyBwZWVyICovCisJdWludDE2X3QgYnZjaTsKKworCS8qIFJvdXRlaW5nIEFyZWEgdGhhdCB0aGlzIHBlZXIgaXMgcGFydCBvZiAocmF3IDA0LjA4IGVuY29kaW5nKSAqLworCXVpbnQ4X3QgcmFbNl07Cit9OworCisvKiBMaW5rZWQgbGlzdCBvZiBhbGwgR2IgcGVlcnMgKGV4Y2VwdCBTR1NOKSAqLworc3RhdGljIExMSVNUX0hFQUQoZ2Jwcm94X2J0c19wZWVycyk7CisKKy8qIEZpbmQgdGhlIGdicHJveF9wZWVyIGJ5IGl0cyBCVkNJICovCitzdGF0aWMgc3RydWN0IGdicHJveF9wZWVyICpwZWVyX2J5X2J2Y2kodWludDE2X3QgYnZjaSkKK3sKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJmdicHJveF9idHNfcGVlcnMsIGxpc3QpIHsKKwkJaWYgKHBlZXItPmJ2Y2kgPT0gYnZjaSkKKwkJCXJldHVybiBwZWVyOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBnYnByb3hfcGVlciAqcGVlcl9ieV9uc3ZjKHN0cnVjdCBncHJzX25zdmMgKm5zdmMpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBlZXIsICZnYnByb3hfYnRzX3BlZXJzLCBsaXN0KSB7CisJCWlmIChwZWVyLT5uc3ZjID09IG5zdmMpCisJCQlyZXR1cm4gcGVlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGxvb2stdXAgYSBwZWVyIGJ5IGl0cyBSb3V0ZWluZyBBcmVhIENvZGUgKFJBQykgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXJfYnlfcmFjKGNvbnN0IHVpbnQ4X3QgKnJhKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkgeworCQlpZiAoIW1lbWNtcChwZWVyLT5yYSwgcmEsIDYpKQorCQkJcmV0dXJuIHBlZXI7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBsb29rLXVwIGEgcGVlciBieSBpdHMgTG9jYXRpb24gQXJlYSBDb2RlIChMQUMpICovCitzdGF0aWMgc3RydWN0IGdicHJveF9wZWVyICpwZWVyX2J5X2xhYyhjb25zdCB1aW50OF90ICpsYSkKK3sKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJmdicHJveF9idHNfcGVlcnMsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAocGVlci0+cmEsIGxhLCA1KSkKKwkJCXJldHVybiBwZWVyOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBnYnByb3hfcGVlciAqcGVlcl9hbGxvYyh1aW50MTZfdCBidmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKworCXBlZXIgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBnYnByb3hfcGVlcik7CisJaWYgKCFwZWVyKQorCQlyZXR1cm4gTlVMTDsKKworCXBlZXItPmJ2Y2kgPSBidmNpOworCWxsaXN0X2FkZCgmcGVlci0+bGlzdCwgJmdicHJveF9idHNfcGVlcnMpOworCisJcmV0dXJuIHBlZXI7Cit9CisKK3N0YXRpYyB2b2lkIHBlZXJfZnJlZShzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXIpCit7CisJbGxpc3RfZGVsKCZwZWVyLT5saXN0KTsKKwl0YWxsb2NfZnJlZShwZWVyKTsKK30KKworLyogRklYTUU6IHRoaXMgbmVlZHMgdG8gZ28gdG8gbGlib3Ntb2NvcmUvbXNnYi5jICovCitzdGF0aWMgc3RydWN0IG1zZ2IgKm1zZ2JfY29weShjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvcGVuYnNjX21zZ2JfY2IgKm9sZF9jYiwgKm5ld19jYjsKKwlzdHJ1Y3QgbXNnYiAqbmV3X21zZzsKKworCW5ld19tc2cgPSBtc2diX2FsbG9jKG1zZy0+ZGF0YV9sZW4sIG5hbWUpOworCWlmICghbmV3X21zZykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBjb3B5IGRhdGEgKi8KKwltZW1jcHkobmV3X21zZy0+X2RhdGEsIG1zZy0+X2RhdGEsIG5ld19tc2ctPmRhdGFfbGVuKTsKKworCS8qIGNvcHkgaGVhZGVyICovCisJbmV3X21zZy0+bGVuID0gbXNnLT5sZW47CisJbmV3X21zZy0+ZGF0YSArPSBtc2ctPmRhdGEgLSBtc2ctPl9kYXRhOworCW5ld19tc2ctPmhlYWQgKz0gbXNnLT5oZWFkIC0gbXNnLT5fZGF0YTsKKwluZXdfbXNnLT50YWlsICs9IG1zZy0+dGFpbCAtIG1zZy0+X2RhdGE7CisKKwluZXdfbXNnLT5sMWggPSBuZXdfbXNnLT5fZGF0YSArIChtc2ctPmwxaCAtIG1zZy0+X2RhdGEpOworCW5ld19tc2ctPmwyaCA9IG5ld19tc2ctPl9kYXRhICsgKG1zZy0+bDJoIC0gbXNnLT5fZGF0YSk7CisJbmV3X21zZy0+bDNoID0gbmV3X21zZy0+X2RhdGEgKyAobXNnLT5sM2ggLSBtc2ctPl9kYXRhKTsKKwluZXdfbXNnLT5sNGggPSBuZXdfbXNnLT5fZGF0YSArIChtc2ctPmw0aCAtIG1zZy0+X2RhdGEpOworCisJLyogY29weSBHQiBzcGVjaWZpYyBkYXRhICovCisJb2xkX2NiID0gT0JTQ19NU0dCX0NCKG1zZyk7CisJbmV3X2NiID0gT0JTQ19NU0dCX0NCKG5ld19tc2cpOworCisJbmV3X2NiLT5ic3NncGggPSBuZXdfbXNnLT5fZGF0YSArIChvbGRfY2ItPmJzc2dwaCAtIG1zZy0+X2RhdGEpOworCW5ld19jYi0+bGxjaCA9IG5ld19tc2ctPl9kYXRhICsgKG9sZF9jYi0+bGxjaCAtIG1zZy0+X2RhdGEpOworCisJbmV3X2NiLT5ic3NncF9jZWxsX2lkID0gb2xkX2NiLT5ic3NncF9jZWxsX2lkOworCW5ld19jYi0+bnNlaSA9IG9sZF9jYi0+bnNlaTsKKwluZXdfY2ItPmJ2Y2kgPSBvbGRfY2ItPmJ2Y2k7CisJbmV3X2NiLT50bGxpID0gb2xkX2NiLT50bGxpOworCisJcmV0dXJuIG5ld19tc2c7Cit9CisKKy8qIHN0cmlwIG9mZiB0aGUgTlMgaGVhZGVyICovCitzdGF0aWMgdm9pZCBzdHJpcF9uc19oZHIoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpbnQgc3RyaXBfbGVuID0gbXNnYl9ic3NncGgobXNnKSAtIG1zZy0+ZGF0YTsKKwltc2diX3B1bGwobXNnLCBzdHJpcF9sZW4pOworfQorCisvKiBmZWVkIGEgbWVzc2FnZSBkb3duIHRoZSBOUy1WQyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwZWVyICovCitzdGF0aWMgaW50IGdicHJveF9yZWxheTJzZ3NuKHN0cnVjdCBtc2diICpvbGRfbXNnLCB1aW50MTZfdCBuc19idmNpKQoreworCS8qIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIG1lc3NhZ2Ugc28gdGhlIG9sZCBvbmUgY2FuCisJICogYmUgZnJlZSgpZCBzYWZlbHkgd2hlbiB3ZSByZXR1cm4gZnJvbSBnYnByb3hfcmN2bXNnKCkgKi8KKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9jb3B5KG9sZF9tc2csICJtc2diX3JlbGF5MnNnc24iKTsKKworCURFQlVHUChER1BSUywgIk5TRUk9JXUgcHJveHlpbmcgQlRTLT5TR1NOIChOU19CVkNJPSV1LCBOU0VJPSV1KVxuIiwKKwkJbXNnYl9uc2VpKG1zZyksIG5zX2J2Y2ksIGdiY2ZnLm5zaXBfc2dzbl9uc2VpKTsKKworCW1zZ2JfYnZjaShtc2cpID0gbnNfYnZjaTsKKwltc2diX25zZWkobXNnKSA9IGdiY2ZnLm5zaXBfc2dzbl9uc2VpOworCisJc3RyaXBfbnNfaGRyKG1zZyk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KKworLyogZmVlZCBhIG1lc3NhZ2UgZG93biB0aGUgTlMtVkMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGVlciAqLworc3RhdGljIGludCBnYnByb3hfcmVsYXkycGVlcihzdHJ1Y3QgbXNnYiAqb2xkX21zZywgc3RydWN0IGdicHJveF9wZWVyICpwZWVyLAorCQkJICB1aW50MTZfdCBuc19idmNpKQoreworCS8qIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIG1lc3NhZ2Ugc28gdGhlIG9sZCBvbmUgY2FuCisJICogYmUgZnJlZSgpZCBzYWZlbHkgd2hlbiB3ZSByZXR1cm4gZnJvbSBnYnByb3hfcmN2bXNnKCkgKi8KKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9jb3B5KG9sZF9tc2csICJtc2diX3JlbGF5MnBlZXIiKTsKKworCURFQlVHUChER1BSUywgIk5TRUk9JXUgcHJveHlpbmcgU0dTTi0+QlNTIChOU19CVkNJPSV1LCBOU0VJPSV1KVxuIiwKKwkJbXNnYl9uc2VpKG1zZyksIG5zX2J2Y2ksIHBlZXItPm5zdmMtPm5zZWkpOworCisJbXNnYl9idmNpKG1zZykgPSBuc19idmNpOworCW1zZ2JfbnNlaShtc2cpID0gcGVlci0+bnN2Yy0+bnNlaTsKKworCS8qIFN0cmlwIHRoZSBvbGQgTlMgaGVhZGVyLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBuZXcgb25lICovCisJc3RyaXBfbnNfaGRyKG1zZyk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KKworLyogU2VuZCBhIG1lc3NhZ2UgdG8gYSBwZWVyIGlkZW50aWZpZWQgYnkgcHRwX2J2Y2kgYnV0IHVzaW5nIG5zX2J2Y2kKKyAqIGluIHRoZSBOUyBoZHIgKi8KK3N0YXRpYyBpbnQgZ2Jwcm94X3JlbGF5MmJ2Y2koc3RydWN0IG1zZ2IgKm1zZywgdWludDE2X3QgcHRwX2J2Y2ksCisJCQkgIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCisJcGVlciA9IHBlZXJfYnlfYnZjaShwdHBfYnZjaSk7CisJaWYgKCFwZWVyKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJCVkNJPSV1OiBDYW5ub3QgZmluZCBCU1NcbiIsCisJCQlwdHBfYnZjaSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXJldHVybiBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworfQorCisvKiBSZWNlaXZlIGFuIGluY29taW5nIHNpZ25hbGxpbmcgbWVzc2FnZSBmcm9tIGEgQlNTLXNpZGUgTlMtVkMgKi8KK3N0YXRpYyBpbnQgZ2Jwcm94X3J4X3NpZ19mcm9tX2JzcyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLAorCQkJCSAgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9IChzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX2Jzc2dwaChtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXVpbnQ4X3QgcGR1X3R5cGUgPSBiZ3BoLT5wZHVfdHlwZTsKKwlpbnQgZGF0YV9sZW4gPSBtc2diX2Jzc2dwX2xlbihtc2cpIC0gc2l6ZW9mKCpiZ3BoKTsKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKmZyb21fcGVlcjsKKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYWlkOworCisJaWYgKG5zX2J2Y2kgIT0gMCkgeworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIk5TRUk9JXUgQlZDST0ldSBpcyBub3Qgc2lnbmFsbGluZ1xuIiwKKwkJCW5zdmMtPm5zZWksIG5zX2J2Y2kpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB3ZSBhY3R1YWxseSBzaG91bGQgbmV2ZXIgc2VlIHRob3NlIHR3byBmb3IgQlZDSSA9PSAwLCBidXQgZG91YmxlLWNoZWNrCisJICoganVzdCB0byBtYWtlIHN1cmUgICovCisJaWYgKHBkdV90eXBlID09IEJTU0dQX1BEVVRfVUxfVU5JVERBVEEgfHwKKwkgICAgcGR1X3R5cGUgPT0gQlNTR1BfUERVVF9ETF9VTklUREFUQSkgeworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIk5TRUk9JXUgVU5JVERBVEEgbm90IGFsbG93ZWQgaW4gIgorCQkJInNpZ25hbGxpbmdcbiIsIG5zdmMtPm5zZWkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlic3NncF90bHZfcGFyc2UoJnRwLCBiZ3BoLT5kYXRhLCBkYXRhX2xlbik7CisKKwlzd2l0Y2ggKHBkdV90eXBlKSB7CisJY2FzZSBCU1NHUF9QRFVUX1NVU1BFTkQ6CisJY2FzZSBCU1NHUF9QRFVUX1JFU1VNRToKKwkJLyogV2UgaW1wbGVtZW50IFJBQyBzbm9vcGluZyBkdXJpbmcgU1VTUEVORC9SRVNVTUUsIHNpbmNlCisJCSAqIGl0IGVzdGFibGlzaGVzIGEgcmVsYXRpb25zaXAgYmV0d2VlbiBCVkNJL3BlZXIgYW5kIHRoZQorCQkgKiByb3V0ZWluZyBhcmVhIGNvZGUuICBUaGUgc25vb3BlZCBpbmZvcm1hdGlvbiBpcyB0aGVuCisJCSAqIHVzZWQgZm9yIHJvdXRpbmcgdGhlIHtTVVNQRU5ELFJFU1VNRX1fW05dQUNLIGJhY2sgdG8KKwkJICogdGhlIGNvcnJlY3QgQlNTR1AgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCWZyb21fcGVlciA9IHBlZXJfYnlfbnN2Yyhuc3ZjKTsKKwkJaWYgKCFmcm9tX3BlZXIpCisJCQlnb3RvIGVycl9ub19wZWVyOworCQltZW1jcHkoZnJvbV9wZWVyLT5yYSwgVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSwKKwkJCXNpemVvZihmcm9tX3BlZXItPnJhKSk7CisJCWdzbTQ4X3BhcnNlX3JhKCZyYWlkLCBmcm9tX3BlZXItPnJhKTsKKwkJTE9HUChER1BSUywgTE9HTF9JTkZPLCAiTlNFST0ldSBCU1NHUCBTVVNQRU5EL1JFU1VNRSAiCisJCQkiUkFDIHNub29waW5nOiBSQUMgJXUtJXUtJXUtJXUgYmVoaW5kIEJWQ0k9JXUsICIKKwkJCSJOU1ZDST0ldVxuIixuc3ZjLT5uc2VpLCByYWlkLm1jYywgcmFpZC5tbmMsIHJhaWQubGFjLAorCQkJcmFpZC5yYWMgLCBmcm9tX3BlZXItPmJ2Y2ksIG5zdmMtPm5zdmNpKTsKKwkJLyogRklYTUU6IFRoaXMgb25seSBzdXBwb3J0cyBvbmUgQlNTIHBlciBSQSAqLworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1JFU0VUOgorCQkvKiBJZiB3ZSByZWNlaXZlIGEgQlZDIHJlc2V0IG9uIHRoZSBzaWduYWxsaW5nIGVuZHBvaW50LCB3ZQorCQkgKiBkb24ndCB3YW50IHRoZSBTR1NOIHRvIHJlc2V0LCBhcyB0aGUgc2lnbmFsbGluZyBlbmRwb2ludAorCQkgKiBpcyBjb21tb24gZm9yIGFsbCBwb2ludC10by1wb2ludCBCVkNzIChhbmQgdGh1cyBhbGwgQlRTKSAqLworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfQlZDSSkpIHsKKwkJCXVpbnQxNl90IGJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKSk7CisJCQlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJOU0VJPSV1IFJ4IEJWQyBSRVNFVCAoQlZDST0ldSlcbiIsCisJCQkJbnN2Yy0+bnNlaSwgYnZjaSk7CisJCQlpZiAoYnZjaSA9PSAwKSB7CisJCQkJLyogRklYTUU6IG9ubHkgZG8gdGhpcyBpZiBTR1NOIGlzIGFsaXZlISAqLworCQkJCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIk5TRUk9JXUgVHggZmFrZSAiCisJCQkJCSJCVkMgUkVTRVQgQUNLIG9mIEJWQ0k9MFxuIiwgbnN2Yy0+bnNlaSk7CisJCQkJcmV0dXJuIGJzc2dwX3R4X3NpbXBsZV9idmNpKEJTU0dQX1BEVVRfQlZDX1JFU0VUX0FDSywKKwkJCQkJCQkgICAgbnN2Yy0+bnNlaSwgMCwgbnNfYnZjaSk7CisJCQl9CisJCQlmcm9tX3BlZXIgPSBwZWVyX2J5X2J2Y2koYnZjaSk7CisJCQlpZiAoIWZyb21fcGVlcikgeworCQkJCS8qIGlmIGEgUFRQLUJWQyBpcyByZXNldCwgYW5kIHdlIGRvbid0IGtub3cgdGhhdAorCQkJCSAqIFBUUC1CVkNJIHlldCwgd2Ugc2hvdWxkIGFsbG9jYXRlIGEgbmV3IHBlZXIgKi8KKwkJCQlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJBbGxvY2F0aW9uZyBuZXcgcGVlciBmb3IgIgorCQkJCSAgICAgIkJWQ0k9JXUgdmlhIE5TVkNJPSV1L05TRUk9JXVcbiIsIGJ2Y2ksCisJCQkJICAgICBuc3ZjLT5uc3ZjaSwgbnN2Yy0+bnNlaSk7CisJCQkJZnJvbV9wZWVyID0gcGVlcl9hbGxvYyhidmNpKTsKKwkJCQlmcm9tX3BlZXItPm5zdmMgPSBuc3ZjOworCQkJfQorCQkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0NFTExfSUQpKSB7CisJCQkJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKwkJCQkvKiBXZSBoYXZlIGEgQ2VsbCBJZGVudGlmaWVyIHByZXNlbnQgaW4gdGhpcworCQkJCSAqIFBEVSwgdGhpcyBtZWFucyB3ZSBjYW4gZXh0ZW5kIG91ciBsb2NhbAorCQkJCSAqIHN0YXRlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcGFydGljdWxhciBjZWxsCisJCQkJICogKi8KKwkJCQltZW1jcHkoZnJvbV9wZWVyLT5yYSwKKwkJCQkJVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9DRUxMX0lEKSwKKwkJCQkJc2l6ZW9mKGZyb21fcGVlci0+cmEpKTsKKwkJCQlnc200OF9wYXJzZV9yYSgmcmFpZCwgZnJvbV9wZWVyLT5yYSk7CisJCQkJTE9HUChER1BSUywgTE9HTF9JTkZPLCAiTlNFST0ldS9CVkNJPSV1ICIKKwkJCQkgICAgICJDZWxsIElEICV1LSV1LSV1LSV1XG4iLCBuc3ZjLT5uc2VpLAorCQkJCSAgICAgYnZjaSwgcmFpZC5tY2MsIHJhaWQubW5jLCByYWlkLmxhYywKKwkJCQkgICAgIHJhaWQucmFjKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBOb3JtYWxseSwgd2UgY2FuIHNpbXBseSBwYXNzIG9uIGFsbCBzaWduYWxsaW5nIG1lc3NhZ2VzIGZyb20gQlNTIHRvCisJICogU0dTTiAqLworCXJldHVybiBnYnByb3hfcmVsYXkyc2dzbihtc2csIG5zX2J2Y2kpOworZXJyX25vX3BlZXI6CisJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUoQlNTKSBjYW5ub3QgZmluZCBwZWVyIGJhc2VkIG9uIFJBQ1xuIiwKKwkJbnN2Yy0+bnNlaSk7CisJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9VTktOT1dOX0JWQ0ksIE5VTEwsIG1zZyk7CitlcnJfbWFuZF9pZToKKwlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiTlNFST0ldShCU1MpIG1pc3NpbmcgbWFuZGF0b3J5IFJBIElFXG4iLAorCQluc3ZjLT5uc2VpKTsKKwlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwgTlVMTCwgbXNnKTsKK30KKworLyogUmVjZWl2ZSBwYWdpbmcgcmVxdWVzdCBmcm9tIFNHU04sIHdlIG5lZWQgdG8gcmVsYXkgdG8gcHJvcGVyIEJTUyAqLworc3RhdGljIGludCBnYnByb3hfcnhfcGFnaW5nKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCwKKwkJCSAgICBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlciA9IE5VTEw7CisKKwlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJOU0VJPSV1KFNHU04pIEJTU0dQIFBBR0lORyAiLAorCQluc3ZjLT5uc2VpKTsKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9CVkNJKSkgeworCQl1aW50MTZfdCBidmNpID0gbnRvaHMoKih1aW50MTZfdCAqKVRMVlBfVkFMKHRwLCBCU1NHUF9JRV9CVkNJKSk7CisJCUxPR1BDKERHUFJTLCBMT0dMX0lORk8sICJyb3V0aW5nIGJ5IEJWQ0kgdG8gcGVlciBCVkNJPSV1XG4iLAorCQkJYnZjaSk7CisJfSBlbHNlIGlmIChUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpKSB7CisJCXBlZXIgPSBwZWVyX2J5X3JhYyhUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkpOworCQlMT0dQQyhER1BSUywgTE9HTF9JTkZPLCAicm91dGluZyBieSBSQUMgdG8gcGVlciBCVkNJPSV1XG4iLAorCQkJcGVlciA/IHBlZXItPmJ2Y2kgOiAtMSk7CisJfSBlbHNlIGlmIChUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0xPQ0FUSU9OX0FSRUEpKSB7CisJCXBlZXIgPSBwZWVyX2J5X2xhYyhUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfTE9DQVRJT05fQVJFQSkpOworCQlMT0dQQyhER1BSUywgTE9HTF9JTkZPLCAicm91dGluZyBieSBMQUMgdG8gcGVlciBCVkNJPSV1XG4iLAorCQkJcGVlciA/IHBlZXItPmJ2Y2kgOiAtMSk7CisJfSBlbHNlCisJCUxPR1BDKERHUFJTLCBMT0dMX0lORk8sICJcbiIpOworCisJaWYgKCFwZWVyKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJOU0VJPSV1KFNHU04pIEJTU0dQIFBBR0lORzogIgorCQkJInVuYWJsZSB0byByb3V0ZSwgbWlzc2luZyBJRVxuIiwgbnN2Yy0+bnNlaSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gZ2Jwcm94X3JlbGF5MnBlZXIobXNnLCBwZWVyLCBuc19idmNpKTsKK30KKworLyogUmVjZWl2ZSBhbiBpbmNvbWluZyBCVkMtUkVTRVQgbWVzc2FnZSBmcm9tIHRoZSBTR1NOICovCitzdGF0aWMgaW50IHJ4X3Jlc2V0X2Zyb21fc2dzbihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsCisJCQkgICAgICBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwl1aW50MTZfdCBwdHBfYnZjaTsKKworCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9CVkNJKSkgeworCQlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwKKwkJCQkgICAgICAgTlVMTCwgbXNnKTsKKwl9CisJcHRwX2J2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwodHAsIEJTU0dQX0lFX0JWQ0kpKTsKKworCWlmIChwdHBfYnZjaSA+PSAyKSB7CisJCS8qIEEgcmVzZXQgZm9yIGEgUFRQIEJWQyB3YXMgcmVjZWl2ZWQsIGZvcndhcmQgaXQgdG8gaXRzCisJCSAqIHJlc3BlY3RpdmUgcGVlciAqLworCQlwZWVyID0gcGVlcl9ieV9idmNpKHB0cF9idmNpKTsKKwkJaWYgKCFwZWVyKSB7CisJCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiTlNFST0ldSBCVkNJPSV1OiBDYW5ub3QgZmluZCBCU1NcbiIsCisJCQkJbnN2Yy0+bnNlaSwgcHRwX2J2Y2kpOworCQkJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9VTktOT1dOX0JWQ0ksCisJCQkJCSAgICAgICBOVUxMLCBtc2cpOworCQl9CisJCXJldHVybiBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCX0KKworCS8qIEEgcmVzZXQgZm9yIHRoZSBTaWduYWxsaW5nIGVudGl0eSBoYXMgYmVlbiByZWNlaXZlZAorCSAqIGZyb20gdGhlIFNHU04uICBBcyB0aGUgc2lnbmFsbGluZyBCVkNJIGlzIHNoYXJlZAorCSAqIGFtb25nIGFsbCB0aGUgQlNTJ3MgdGhhdCB3ZSBtdWx0aXBsZXgsIGl0IG5lZWRzIHRvCisJICogYmUgcmVsYXllZCAgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkKKwkJZ2Jwcm94X3JlbGF5MnBlZXIobXNnLCBwZWVyLCBuc19idmNpKTsKKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGFuIGluY29taW5nIHNpZ25hbGxpbmcgbWVzc2FnZSBmcm9tIHRoZSBTR1NOLXNpZGUgTlMtVkMgKi8KK3N0YXRpYyBpbnQgZ2Jwcm94X3J4X3NpZ19mcm9tX3Nnc24oc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJCQkgICB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0gKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCBwZHVfdHlwZSA9IGJncGgtPnBkdV90eXBlOworCWludCBkYXRhX2xlbiA9IG1zZ2JfYnNzZ3BfbGVuKG1zZykgLSBzaXplb2YoKmJncGgpOworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwl1aW50MTZfdCBidmNpOworCWludCByYyA9IDA7CisKKwlpZiAobnNfYnZjaSAhPSAwKSB7CisJCUxPR1AoREdQUlMsIExPR0xfTk9USUNFLCAiTlNFST0ldShTR1NOKSBCVkNJPSV1IGlzIG5vdCAiCisJCQkic2lnbmFsbGluZ1xuIiwgbnN2Yy0+bnNlaSwgbnNfYnZjaSk7CisJCS8qIEZJWE1FOiBTZW5kIHByb3BlciBlcnJvciBtZXNzYWdlICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHdlIGFjdHVhbGx5IHNob3VsZCBuZXZlciBzZWUgdGhvc2UgdHdvIGZvciBCVkNJID09IDAsIGJ1dCBkb3VibGUtY2hlY2sKKwkgKiBqdXN0IHRvIG1ha2Ugc3VyZSAgKi8KKwlpZiAocGR1X3R5cGUgPT0gQlNTR1BfUERVVF9VTF9VTklUREFUQSB8fAorCSAgICBwZHVfdHlwZSA9PSBCU1NHUF9QRFVUX0RMX1VOSVREQVRBKSB7CisJCUxPR1AoREdQUlMsIExPR0xfTk9USUNFLCAiTlNFST0ldShTR1NOKSBVTklUREFUQSBub3QgYWxsb3dlZCBpbiAiCisJCQkic2lnbmFsbGluZ1xuIiwgbnN2Yy0+bnNlaSk7CisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywgTlVMTCwgbXNnKTsKKwl9CisKKwlyYyA9IGJzc2dwX3Rsdl9wYXJzZSgmdHAsIGJncGgtPmRhdGEsIGRhdGFfbGVuKTsKKworCXN3aXRjaCAocGR1X3R5cGUpIHsKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1JFU0VUOgorCQlyYyA9IHJ4X3Jlc2V0X2Zyb21fc2dzbihtc2csICZ0cCwgbnN2YywgbnNfYnZjaSk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9GTFVTSF9MTDoKKwljYXNlIEJTU0dQX1BEVVRfQlZDX0JMT0NLX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1VOQkxPQ0tfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9CVkNfUkVTRVRfQUNLOgorCQkvKiBzaW1wbGUgY2FzZTogQlZDSSBJRSBpcyBtYW5kYXRvcnkgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9CVkNJKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCWJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKSk7CisJCXJjID0gZ2Jwcm94X3JlbGF5MmJ2Y2kobXNnLCBidmNpLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1BBR0lOR19QUzoKKwljYXNlIEJTU0dQX1BEVVRfUEFHSU5HX0NTOgorCQkvKiBwcm9jZXNzIHRoZSBwYWdpbmcgcmVxdWVzdCAoTEFDL1JBQyBsb29rdXApICovCisJCXJjID0gZ2Jwcm94X3J4X3BhZ2luZyhtc2csICZ0cCwgbnN2YywgbnNfYnZjaSk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9TVEFUVVM6CisJCS8qIFNvbWUgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAqLworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwKKwkJCSJOU0VJPSV1KFNHU04pIEJTU0dQIFNUQVRVUyAiLCBuc3ZjLT5uc2VpKTsKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9DQVVTRSkpIHsKKwkJCUxPR1BDKERHUFJTLCBMT0dMX05PVElDRSwgIlxuIik7CisJCQlnb3RvIGVycl9tYW5kX2llOworCQl9CisJCUxPR1BDKERHUFJTLCBMT0dMX05PVElDRSwKKwkJCSJjYXVzZT0weCUwMngoJXMpICIsICpUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX0NBVVNFKSwKKwkJCWJzc2dwX2NhdXNlX3N0cigqVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9DQVVTRSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0JWQ0kpKSB7CisJCQl1aW50MTZfdCAqYnZjaSA9ICh1aW50MTZfdCAqKQorCQkJCQkJVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKTsKKwkJCUxPR1BDKERHUFJTLCBMT0dMX05PVElDRSwKKwkJCQkiQlZDST0ldVxuIiwgbnRvaHMoKmJ2Y2kpKTsKKwkJfSBlbHNlCisJCQlMT0dQQyhER1BSUywgTE9HTF9OT1RJQ0UsICJcbiIpOworCQlicmVhazsKKwkvKiB0aG9zZSBvbmx5IGV4aXN0IGluIHRoZSBTR1NOIC0+IEJTUyBkaXJlY3Rpb24gKi8KKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORF9BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1NVU1BFTkRfTkFDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX05BQ0s6CisJCS8qIFJBQyBJRSBpcyBtYW5kYXRvcnkgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCXBlZXIgPSBwZWVyX2J5X3JhYyhUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpKTsKKwkJaWYgKCFwZWVyKQorCQkJZ290byBlcnJfbm9fcGVlcjsKKwkJcmMgPSBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfU0dTTl9JTlZPS0VfVFJBQ0U6CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsCisJCSAgICAgIk5TRUk9JXUoU0dTTikgQlNTR1AgSU5WT0tFIFRSQUNFIG5vdCBzdXBwb3J0ZWRcbiIsbnN2Yy0+bnNlaSk7CisJCXJjID0gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX1BEVV9JTkNPTVBfRkVBVCwgTlVMTCwgbXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJCU1NHUCBQRFUgdHlwZSAweCUwMnggdW5rbm93blxuIiwKKwkJCXBkdV90eXBlKTsKKwkJcmMgPSBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywgTlVMTCwgbXNnKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworZXJyX21hbmRfaWU6CisJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUoU0dTTikgbWlzc2luZyBtYW5kYXRvcnkgSUVcbiIsCisJCW5zdmMtPm5zZWkpOworCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLCBOVUxMLCBtc2cpOworZXJyX25vX3BlZXI6CisJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUoU0dTTikgY2Fubm90IGZpbmQgcGVlciBiYXNlZCBvbiBSQUNcbiIsCisJCW5zdmMtPm5zZWkpOworCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfVU5LTk9XTl9CVkNJLCBOVUxMLCBtc2cpOworfQorCisvKiBNYWluIGlucHV0IGZ1bmN0aW9uIGZvciBHYiBwcm94eSAqLworaW50IGdicHJveF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlpbnQgcmM7CisKKwkvKiBPbmx5IEJWQ0k9MCBtZXNzYWdlcyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50ICovCisJaWYgKG5zX2J2Y2kgPT0gMCB8fCBuc19idmNpID09IDEpIHsKKwkJaWYgKG5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbikKKwkJCXJjID0gZ2Jwcm94X3J4X3NpZ19mcm9tX3Nnc24obXNnLCBuc3ZjLCBuc19idmNpKTsKKwkJZWxzZQorCQkJcmMgPSBnYnByb3hfcnhfc2lnX2Zyb21fYnNzKG1zZywgbnN2YywgbnNfYnZjaSk7CisJfSBlbHNlIHsKKwkJLyogQWxsIG90aGVyIEJWQ0kgYXJlIFBUUCBhbmQgdGh1cyBjYW4gYmUgc2ltcGx5IGZvcndhcmRlZCAqLworCQlpZiAoIW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbikgeworCQkJcmMgPSBnYnByb3hfcmVsYXkyc2dzbihtc2csIG5zX2J2Y2kpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGdicHJveF9wZWVyICpwZWVyID0gcGVlcl9ieV9idmNpKG5zX2J2Y2kpOworCQkJaWYgKCFwZWVyKSB7CisJCQkJTE9HUChER1BSUywgTE9HTF9JTkZPLCAiQWxsb2NhdGlvbmcgbmV3IHBlZXIgZm9yICIKKwkJCQkgICAgICJCVkNJPSV1IHZpYSBOU1ZDPSV1L05TRUk9JXVcbiIsIG5zX2J2Y2ksCisJCQkJICAgICBuc3ZjLT5uc3ZjaSwgbnN2Yy0+bnNlaSk7CisJCQkJcGVlciA9IHBlZXJfYWxsb2MobnNfYnZjaSk7CisJCQkJcGVlci0+bnN2YyA9IG5zdmM7CisJCQl9CisJCQlyYyA9IGdicHJveF9yZWxheTJwZWVyKG1zZywgcGVlciwgbnNfYnZjaSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBnYnByb3hfcmVzZXRfcGVyc2lzdGVudF9uc3ZjcyhzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zdmMsICZuc2ktPmdwcnNfbnN2Y3MsIGxpc3QpIHsKKwkJaWYgKCFuc3ZjLT5wZXJzaXN0ZW50KQorCQkJY29udGludWU7CisJCWdwcnNfbnN2Y19yZXNldChuc3ZjLCBOU19DQVVTRV9PTV9JTlRFUlZFTlRJT04pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU2lnbmFsIGhhbmRsZXIgZm9yIHNpZ25hbHMgZnJvbSBOUyBsYXllciAqLworaW50IGdicHJveF9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBuc19zaWduYWxfZGF0YSAqbnNzZCA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmMgPSBuc3NkLT5uc3ZjOworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKworCWlmIChzdWJzeXMgIT0gU1NfTlMpCisJCXJldHVybiAwOworCisJaWYgKHNpZ25hbCA9PSBTX05TX1JFU0VUICYmIG5zdmMtPm5zZWkgPT0gZ2JjZmcubnNpcF9zZ3NuX25zZWkpIHsKKwkJLyogV2UgaGF2ZSByZWNlaXZlZCBhIE5TLVJFU0VUIGZyb20gdGhlIE5TRUkgYW5kIE5TVkMKKwkJICogb2YgdGhlIFNHU04uICBUaGlzIG1pZ2h0IGhhcHBlbiB3aXRoIFNHU04gdGhhdCBzdGFydAorCQkgKiB0aGVpciBvd24gTlMtUkVTRVQgcHJvY2VkdXJlIHdpdGhvdXQgd2FpdGluZyBmb3Igb3VyCisJCSAqIE5TLVJFU0VUICovCisJCW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA9IDE7CisJfQorCisJaWYgKHNpZ25hbCA9PSBTX05TX0FMSVZFX0VYUCAmJiBuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24pIHsKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJUbnMgYWxpdmUgZXhwaXJlZCB0b28gb2Z0ZW4sICIKKwkJCSJyZS1zdGFydGluZyBSRVNFVCBwcm9jZWR1cmVcbiIpOworCQluc2lwX2Nvbm5lY3QobnN2Yy0+bnNpLCAmbnN2Yy0+aXAuYnRzX2FkZHIsIG5zdmMtPm5zZWksCisJCQkgICAgIG5zdmMtPm5zdmNpKTsKKwl9CisKKwkvKiBXZSBjdXJyZW50bHkgb25seSBjYXJlIGFib3V0IHNpZ25hbHMgZnJvbSB0aGUgU0dTTiAqLworCWlmICghbnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuKQorCQlyZXR1cm4gMDsKKworCS8qIGl0ZXJhdGUgb3ZlciBhbGwgQlRTIHBlZXJzIGFuZCBzZW5kIHRoZSByZXNwZWN0aXZlIFBEVSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBlZXIsICZnYnByb3hfYnRzX3BlZXJzLCBsaXN0KSB7CisJCXN3aXRjaCAoc2lnbmFsKSB7CisJCWNhc2UgU19OU19SRVNFVDoKKwkJCWdwcnNfbnNfdHhfcmVzZXQocGVlci0+bnN2YywgbnNzZC0+Y2F1c2UpOworCQkJYnJlYWs7CisJCWNhc2UgU19OU19CTE9DSzoKKwkJCWdwcnNfbnNfdHhfYmxvY2socGVlci0+bnN2YywgbnNzZC0+Y2F1c2UpOworCQkJYnJlYWs7CisJCWNhc2UgU19OU19VTkJMT0NLOgorCQkJZ3Byc19uc190eF91bmJsb2NrKHBlZXItPm5zdmMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKworZ0RFRlVOKHNob3dfZ2Jwcm94eSwgc2hvd19nYnByb3h5X2NtZCwgInNob3cgZ2Jwcm94eSIsCisgICAgICAgU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEdiIHByb3h5IikKK3sKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkgeworCQlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjID0gcGVlci0+bnN2YzsKKwkJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKwkJZ3NtNDhfcGFyc2VfcmEoJnJhaWQsIHBlZXItPnJhKTsKKworCQl2dHlfb3V0KHZ0eSwgIk5TRUkgJTV1LCBOUy1WQyAlNXUsIFBUUC1CVkNJICU1dSwgIgorCQkJIlJBQyAldS0ldS0ldS0ldSIsCisJCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSwgcGVlci0+YnZjaSwKKwkJCXJhaWQubWNjLCByYWlkLm1uYywgcmFpZC5sYWMsIHJhaWQucmFjKTsKKwkJaWYgKG5zdmMtPmxsID09IEdQUlNfTlNfTExfVURQIHx8IG5zdmMtPmxsID09IEdQUlNfTlNfTExfRlJfR1JFKQorCQkJdnR5X291dCh2dHksICIgJXM6JXUlcyIsCisJCQkJaW5ldF9udG9hKG5zdmMtPmlwLmJ0c19hZGRyLnNpbl9hZGRyKSwKKwkJCQludG9ocyhuc3ZjLT5pcC5idHNfYWRkci5zaW5fcG9ydCksIFZUWV9ORVdMSU5FKTsKKwkJZWxzZQorCQkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eV9tYWluLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJiZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9nYl9wcm94eV9tYWluLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qIE5TLW92ZXItSVAgcHJveHkgKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2diX3Byb3h5Lmg+CisKKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiLi4vLi4vYnNjY29uZmlnLmgiCisKKy8qIHRoaXMgaXMgaGVyZSBmb3IgdGhlIHZ0eS4uLiBpdCB3aWxsIG5ldmVyIGJlIGNhbGxlZCAqLwordm9pZCBzdWJzY3JfcHV0KCkgeyBhYm9ydCgpOyB9CisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordm9pZCAqdGFsbF9ic2NfY3R4OworCitjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodCA9CisJIkNvcHlyaWdodCAoQykgMjAxMCBIYXJhbGQgV2VsdGUgYW5kIE9uLVdhdmVzXG4iCisJIkxpY2Vuc2UgR1BMdjIrOiBHTlUgR1BMIHZlcnNpb24gMiBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+XG4iCisJIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorCSJUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIjsKKworc3RhdGljIHN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0Oworc3RhdGljIGNoYXIgKmNvbmZpZ19maWxlID0gIm9zbW9fZ2Jwcm94eS5jZmciOworc3RydWN0IGdicHJveHlfY29uZmlnIGdiY2ZnOworCisvKiBQb2ludGVyIHRvIHRoZSBTR1NOIHBlZXIgKi8KK2V4dGVybiBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKmdicHJveF9wZWVyX3Nnc247CisKKy8qIGNhbGwtYmFjayBmdW5jdGlvbiBmb3IgdGhlIE5TIHByb3RvY29sICovCitzdGF0aWMgaW50IHByb3h5X25zX2NiKGVudW0gZ3Byc19uc19ldnQgZXZlbnQsIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsCisJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHVfaW50MTZfdCBidmNpKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBHUFJTX05TX0VWVF9VTklUX0RBVEE6CisJCXJjID0gZ2Jwcm94X3Jjdm1zZyhtc2csIG5zdmMsIGJ2Y2kpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiU0dTTjogVW5rbm93biBldmVudCAldSBmcm9tIE5TXG4iLCBldmVudCk7CisJCWlmIChtc2cpCisJCQl0YWxsb2NfZnJlZShtc2cpOworCQlyYyA9IC1FSU87CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJzaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQlkaXNwYXRjaF9zaWduYWwoU1NfR0xPQkFMLCBTX0dMT0JBTF9TSFVURE9XTiwgTlVMTCk7CisJCXNsZWVwKDEpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnQodGFsbF92dHlfY3R4LCBzdGRlcnIpOworCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9ic2NfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwljYXNlIFNJR1VTUjI6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2UoKQoreworCXByaW50ZigiVXNhZ2U6IGJzY19oYWNrXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKCIgIFNvbWUgdXNlZnVsIGhlbHAuLi5cbiIpOworCXByaW50ZigiICAtaCAtLWhlbHAgdGhpcyB0ZXh0XG4iKTsKKwlwcmludGYoIiAgLWQgb3B0aW9uIC0tZGVidWc9RE5TOkRHUFJTLDA6MCBlbmFibGUgZGVidWdnaW5nXG4iKTsKKwlwcmludGYoIiAgLWMgLS1jb25maWctZmlsZSBmaWxlbmFtZSBUaGUgY29uZmlnIGZpbGUgdG8gdXNlLlxuIik7CisJcHJpbnRmKCIgIC1zIC0tZGlzYWJsZS1jb2xvclxuIik7CisJcHJpbnRmKCIgIC1UIC0tdGltZXN0YW1wIFByZWZpeCBldmVyeSBsb2cgbGluZSB3aXRoIGEgdGltZXN0YW1wXG4iKTsKKwlwcmludGYoIiAgLVYgLS12ZXJzaW9uLiBQcmludCB0aGUgdmVyc2lvbiBvZiBPcGVuQlNDLlxuIik7CisJcHJpbnRmKCIgIC1lIC0tbG9nLWxldmVsIG51bWJlci4gU2V0IGEgZ2xvYmFsIGxvZ2xldmVsLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMCwgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJCQl7ICJkZWJ1ZyIsIDEsIDAsICdkJyB9LAorCQkJeyAiY29uZmlnLWZpbGUiLCAxLCAwLCAnYycgfSwKKwkJCXsgImRpc2FibGUtY29sb3IiLCAwLCAwLCAncycgfSwKKwkJCXsgInRpbWVzdGFtcCIsIDAsIDAsICdUJyB9LAorCQkJeyAidmVyc2lvbiIsIDAsIDAsICdWJyB9LAorCQkJeyAibG9nLWxldmVsIiwgMSwgMCwgJ2UnIH0sCisJCQl7IDAsIDAsIDAsIDAgfQorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGQ6YzpzVFZlOiIsCisJCQkJbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnaCc6CisJCQlwcmludF91c2FnZSgpOworCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncyc6CisJCQlsb2dfc2V0X3VzZV9jb2xvcihzdGRlcnJfdGFyZ2V0LCAwKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb25maWdfZmlsZSA9IHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkJbG9nX3NldF9wcmludF90aW1lc3RhbXAoc3RkZXJyX3RhcmdldCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlsb2dfc2V0X2xvZ19sZXZlbChzdGRlcnJfdGFyZ2V0LCBhdG9pKG9wdGFyZykpOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRfdmVyc2lvbigxKTsKKwkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitleHRlcm4gdm9pZCAqdGFsbF9tc2diX2N0eDsKKworZXh0ZXJuIGVudW0gbm9kZV90eXBlIGJzY192dHlfZ29fcGFyZW50KHN0cnVjdCB2dHkgKnZ0eSk7CisKK3N0YXRpYyBzdHJ1Y3QgdnR5X2FwcF9pbmZvIHZ0eV9pbmZvID0geworCS5uYW1lIAkJPSAiT3Ntb2NvbSBHYiBQcm94eSIsCisJLnZlcnNpb24JPSBQQUNLQUdFX1ZFUlNJT04sCisJLmdvX3BhcmVudF9jYgk9IGJzY192dHlfZ29fcGFyZW50LAorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayBkdW1teV9uZXR3b3JrOworCWludCByYzsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAwLCAibnNpcF9wcm94eSIpOworCXRhbGxfbXNnYl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibXNnYiIpOworCisJc2lnbmFsKFNJR0lOVCwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHQUJSVCwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVVNSMSwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVVNSMiwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwl2dHlfaW5mby5jb3B5cmlnaHQgPSBvcGVuYnNjX2NvcHlyaWdodDsKKwl2dHlfaW5pdCgmdnR5X2luZm8pOworCWxvZ2dpbmdfdnR5X2FkZF9jbWRzKCk7CisJZ2Jwcm94eV92dHlfaW5pdCgpOworCisJaGFuZGxlX29wdGlvbnMoYXJnYywgYXJndik7CisKKwlyYXRlX2N0cl9pbml0KHRhbGxfYnNjX2N0eCk7CisKKwlyYyA9IHRlbG5ldF9pbml0KHRhbGxfYnNjX2N0eCwgJmR1bW15X25ldHdvcmssIDQyNDYpOworCWlmIChyYyA8IDApCisJCWV4aXQoMSk7CisKKwlic3NncF9uc2kgPSBncHJzX25zX2luc3RhbnRpYXRlKCZwcm94eV9uc19jYik7CisJaWYgKCFic3NncF9uc2kpIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBOU1xuIik7CisJCWV4aXQoMSk7CisJfQorCWdiY2ZnLm5zaSA9IGJzc2dwX25zaTsKKwlncHJzX25zX3Z0eV9pbml0KGJzc2dwX25zaSk7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTlMsICZnYnByb3hfc2lnbmFsLCBOVUxMKTsKKworCXJjID0gZ2Jwcm94eV9wYXJzZV9jb25maWcoY29uZmlnX2ZpbGUsICZnYmNmZyk7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0ZBVEFMLCAiQ2Fubm90IHBhcnNlIGNvbmZpZyBmaWxlXG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlpZiAoIW5zdmNfYnlfbnNlaShnYmNmZy5uc2ksIGdiY2ZnLm5zaXBfc2dzbl9uc2VpKSkgeworCQlMT0dQKERHUFJTLCBMT0dMX0ZBVEFMLCAiWW91IGNhbm5vdCBwcm94eSB0byBOU0VJICV1ICIKKwkJCSJ3aXRob3V0IGNyZWF0aW5nIHRoYXQgTlNFSSBiZWZvcmVcbiIsCisJCQlnYmNmZy5uc2lwX3Nnc25fbnNlaSk7CisJCWV4aXQoMik7CisJfQorCisJcmMgPSBncHJzX25zX25zaXBfbGlzdGVuKGJzc2dwX25zaSk7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0ZBVEFMLCAiQ2Fubm90IGJpbmQvbGlzdGVuIG9uIE5TSVAgc29ja2V0XG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlyYyA9IGdwcnNfbnNfZnJncmVfbGlzdGVuKGJzc2dwX25zaSk7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0ZBVEFMLCAiQ2Fubm90IGJpbmQvbGlzdGVuIEdSRSAiCisJCQkic29ja2V0LiBEbyB5b3UgaGF2ZSBDQVBfTkVUX1JBVz9cbiIpOworCQlleGl0KDIpOworCX0KKworCS8qIFJlc2V0IGFsbCB0aGUgcGVyc2lzdGVudCBOUy1WQ3MgdGhhdCB3ZSd2ZSByZWFkIGZyb20gdGhlIGNvbmZpZyAqLworCWdicHJveF9yZXNldF9wZXJzaXN0ZW50X25zdmNzKGJzc2dwX25zaSk7CisKKwl3aGlsZSAoMSkgeworCQlyYyA9IGJzY19zZWxlY3RfbWFpbigwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQoMyk7CisJfQorCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHlfdnR5LmMgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNmQyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X3Z0eS5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2diX3Byb3h5Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKworc3RhdGljIHN0cnVjdCBnYnByb3h5X2NvbmZpZyAqZ19jZmcgPSBOVUxMOworCisvKgorICogdnR5IGNvZGUgZm9yIG1nY3AgYmVsb3cKKyAqLworc3RhdGljIHN0cnVjdCBjbWRfbm9kZSBnYnByb3h5X25vZGUgPSB7CisJR0JQUk9YWV9OT0RFLAorCSIlcyhnYnByb3h5KSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9nYnByb3h5KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgImdicHJveHklcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiIHNnc24gbnNlaSAldSVzIiwgZ19jZmctPm5zaXBfc2dzbl9uc2VpLAorCQlWVFlfTkVXTElORSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19nYnByb3h5LAorICAgICAgY2ZnX2dicHJveHlfY21kLAorICAgICAgImdicHJveHkiLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgR2IgcHJveHkiKQoreworCXZ0eS0+bm9kZSA9IEdCUFJPWFlfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX3Nnc25fbnNlaSwKKyAgICAgIGNmZ19uc2lwX3Nnc25fbnNlaV9jbWQsCisgICAgICAic2dzbiBuc2VpIDwwLTY1NTM0PiIsCisgICAgICAiU2V0IHRoZSBOU0VJIHRvIGJlIHVzZWQgaW4gdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUgU0dTTiIpCit7CisJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCisJZ19jZmctPm5zaXBfc2dzbl9uc2VpID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBnYnByb3h5X3Z0eV9pbml0KHZvaWQpCit7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X2dicHJveHlfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19nYnByb3h5X2NtZCk7CisJaW5zdGFsbF9ub2RlKCZnYnByb3h5X25vZGUsIGNvbmZpZ193cml0ZV9nYnByb3h5KTsKKwlpbnN0YWxsX2RlZmF1bHQoR0JQUk9YWV9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoR0JQUk9YWV9OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdCUFJPWFlfTk9ERSwgJm91cm5vZGVfZW5kX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdCUFJPWFlfTk9ERSwgJmNmZ19uc2lwX3Nnc25fbnNlaV9jbWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYnByb3h5X3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfZmlsZSwgc3RydWN0IGdicHJveHlfY29uZmlnICpjZmcpCit7CisJaW50IHJjOworCisJZ19jZmcgPSBjZmc7CisJcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSwgTlVMTCk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0aGUgY29uZmlnIGZpbGU6ICclcydcbiIsIGNvbmZpZ19maWxlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfYnNzZ3AuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ic3NncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzg3M2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfYnNzZ3AuYwpAQCAtMCwwICsxLDg1MiBAQAorLyogR1BSUyBCU1NHUCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBhcyBwZXIgM0dQUCBUUyAwOC4xOCAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogVE9ETzoKKyAqICBvICBwcm9wZXJseSBjb3VudCBpbmNvbWluZyBCVkMtUkVTRVQgcGFja2V0cyBpbiBjb3VudGVyIGdyb3VwCisgKiAgbyAgc2V0IGxvZyBjb250ZXh0IGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBvdXRnb2luZyBwYWNrZXRzCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcmF0ZV9jdHIuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDhfZ3Bycy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19sbGMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfc2dzbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19nbW0uaD4KKwordm9pZCAqYnNzZ3BfdGFsbF9jdHggPSBOVUxMOworCisjZGVmaW5lIEJWQ19GX0JMT0NLRUQJMHgwMDAxCisKK2VudW0gYnNzZ3BfY3RyIHsKKwlCU1NHUF9DVFJfUEtUU19JTiwKKwlCU1NHUF9DVFJfUEtUU19PVVQsCisJQlNTR1BfQ1RSX0JZVEVTX0lOLAorCUJTU0dQX0NUUl9CWVRFU19PVVQsCisJQlNTR1BfQ1RSX0JMT0NLRUQsCisJQlNTR1BfQ1RSX0RJU0NBUkRFRCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmF0ZV9jdHJfZGVzYyBic3NncF9jdHJfZGVzY3JpcHRpb25bXSA9IHsKKwl7ICJwYWNrZXRzLmluIiwJIlBhY2tldHMgYXQgQlNTR1AgTGV2ZWwgKCBJbikiIH0sCisJeyAicGFja2V0cy5vdXQiLCJQYWNrZXRzIGF0IEJTU0dQIExldmVsIChPdXQpIiB9LAorCXsgImJ5dGVzLmluIiwJIkJ5dGVzIGF0IEJTU0dQIExldmVsICAgKCBJbikiIH0sCisJeyAiYnl0ZXMub3V0IiwJIkJ5dGVzIGF0IEJTU0dQIExldmVsICAgKE91dCkiIH0sCisJeyAiYmxvY2tlZCIsCSJCVkMgQmxvY2tpbmcgY291bnQiIH0sCisJeyAiZGlzY2FyZGVkIiwJIkJWQyBMTEMgRGlzY2FyZGVkIGNvdW50IiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByYXRlX2N0cl9ncm91cF9kZXNjIGJzc2dwX2N0cmdfZGVzYyA9IHsKKwkuZ3JvdXBfbmFtZV9wcmVmaXggPSAiYnNzZ3AuYnNzX2N0eCIsCisJLmdyb3VwX2Rlc2NyaXB0aW9uID0gIkJTU0dQIFBlZXIgU3RhdGlzdGljcyIsCisJLm51bV9jdHIgPSBBUlJBWV9TSVpFKGJzc2dwX2N0cl9kZXNjcmlwdGlvbiksCisJLmN0cl9kZXNjID0gYnNzZ3BfY3RyX2Rlc2NyaXB0aW9uLAorfTsKKworTExJU1RfSEVBRChic3NncF9idmNfY3R4dHMpOworCisvKiBGaW5kIGEgQlRTIENvbnRleHQgYmFzZWQgb24gcGFyc2VkIFJBIElEIGFuZCBDZWxsIElEICovCitzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYnRzY3R4X2J5X3JhaWRfY2lkKGNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCB1aW50MTZfdCBjaWQpCit7CisJc3RydWN0IGJzc2dwX2J2Y19jdHggKmJjdHg7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShiY3R4LCAmYnNzZ3BfYnZjX2N0eHRzLCBsaXN0KSB7CisJCWlmICghbWVtY21wKCZiY3R4LT5yYV9pZCwgcmFpZCwgc2l6ZW9mKGJjdHgtPnJhX2lkKSkgJiYKKwkJICAgIGJjdHgtPmNlbGxfaWQgPT0gY2lkKQorCQkJcmV0dXJuIGJjdHg7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBGaW5kIGEgQlRTIGNvbnRleHQgYmFzZWQgb24gQlZDSStOU0VJIHR1cGxlICovCitzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYnRzY3R4X2J5X2J2Y2lfbnNlaSh1aW50MTZfdCBidmNpLCB1aW50MTZfdCBuc2VpKQoreworCXN0cnVjdCBic3NncF9idmNfY3R4ICpiY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYmN0eCwgJmJzc2dwX2J2Y19jdHh0cywgbGlzdCkgeworCQlpZiAoYmN0eC0+bnNlaSA9PSBuc2VpICYmIGJjdHgtPmJ2Y2kgPT0gYnZjaSkKKwkJCXJldHVybiBiY3R4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ0c2N0eF9hbGxvYyh1aW50MTZfdCBidmNpLCB1aW50MTZfdCBuc2VpKQoreworCXN0cnVjdCBic3NncF9idmNfY3R4ICpjdHg7CisKKwljdHggPSB0YWxsb2NfemVybyhic3NncF90YWxsX2N0eCwgc3RydWN0IGJzc2dwX2J2Y19jdHgpOworCWlmICghY3R4KQorCQlyZXR1cm4gTlVMTDsKKwljdHgtPmJ2Y2kgPSBidmNpOworCWN0eC0+bnNlaSA9IG5zZWk7CisJLyogRklYTUU6IEJWQ0kgaXMgbm90IHVuaXF1ZSwgb25seSBCVkNJK05TRUkgPyE/ICovCisJY3R4LT5jdHJnID0gcmF0ZV9jdHJfZ3JvdXBfYWxsb2MoY3R4LCAmYnNzZ3BfY3RyZ19kZXNjLCBidmNpKTsKKworCWxsaXN0X2FkZCgmY3R4LT5saXN0LCAmYnNzZ3BfYnZjX2N0eHRzKTsKKworCXJldHVybiBjdHg7Cit9CisKKy8qIENoYXB0ZXIgMTAuNC41OiBGbG93IENvbnRyb2wgQlZDIEFDSyAqLworc3RhdGljIGludCBic3NncF90eF9mY19idmNfYWNrKHVpbnQxNl90IG5zZWksIHVpbnQ4X3QgdGFnLCB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBtc2diICptc2cgPSBic3NncF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpiZ3BoKSk7CisKKwltc2diX25zZWkobXNnKSA9IG5zZWk7CisJbXNnYl9idmNpKG1zZykgPSBuc19idmNpOworCisJYmdwaC0+cGR1X3R5cGUgPSBCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9CVkNfQUNLOworCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9UQUcsIDEsICZ0YWcpOworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CisKKy8qIDEwLjMuNyBTVVNQRU5ELUFDSyBQRFUgKi8KK2ludCBic3NncF90eF9zdXNwZW5kX2Fjayh1aW50MTZfdCBuc2VpLCB1aW50MzJfdCB0bGxpLAorCQkJIGNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYV9pZCwgdWludDhfdCBzdXNwZW5kX3JlZikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gYnNzZ3BfbXNnYl9hbGxvYygpOworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0KKwkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpiZ3BoKSk7CisJdWludDMyX3QgX3RsbGk7CisJdWludDhfdCByYVs2XTsKKworCW1zZ2JfbnNlaShtc2cpID0gbnNlaTsKKwltc2diX2J2Y2kobXNnKSA9IDA7IC8qIFNpZ25hbGxpbmcgKi8KKwliZ3BoLT5wZHVfdHlwZSA9IEJTU0dQX1BEVVRfU1VTUEVORF9BQ0s7CisKKwlfdGxsaSA9IGh0b25sKHRsbGkpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9UTExJLCA0LCAodWludDhfdCAqKSAmX3RsbGkpOworCWdzbTQ4X2NvbnN0cnVjdF9yYShyYSwgcmFfaWQpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBLCA2LCByYSk7CisJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX1NVU1BFTkRfUkVGX05SLCAxLCAmc3VzcGVuZF9yZWYpOworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CisKKy8qIDEwLjMuOCBTVVNQRU5ELU5BQ0sgUERVICovCitpbnQgYnNzZ3BfdHhfc3VzcGVuZF9uYWNrKHVpbnQxNl90IG5zZWksIHVpbnQzMl90IHRsbGksCisJCQkgIHVpbnQ4X3QgKmNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBic3NncF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkoc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmJncGgpKTsKKwl1aW50MzJfdCBfdGxsaTsKKworCW1zZ2JfbnNlaShtc2cpID0gbnNlaTsKKwltc2diX2J2Y2kobXNnKSA9IDA7IC8qIFNpZ25hbGxpbmcgKi8KKwliZ3BoLT5wZHVfdHlwZSA9IEJTU0dQX1BEVVRfU1VTUEVORF9OQUNLOworCisJX3RsbGkgPSBodG9ubCh0bGxpKTsKKwltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfVExMSSwgNCwgKHVpbnQ4X3QgKikgJl90bGxpKTsKKwlpZiAoY2F1c2UpCisJCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9DQVVTRSwgMSwgY2F1c2UpOworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CisKKy8qIDEwLjMuMTAgUkVTVU1FLUFDSyBQRFUgKi8KK2ludCBic3NncF90eF9yZXN1bWVfYWNrKHVpbnQxNl90IG5zZWksIHVpbnQzMl90IHRsbGksCisJCQljb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFfaWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGJzc2dwX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9CisJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYmdwaCkpOworCXVpbnQzMl90IF90bGxpOworCXVpbnQ4X3QgcmFbNl07CisKKwltc2diX25zZWkobXNnKSA9IG5zZWk7CisJbXNnYl9idmNpKG1zZykgPSAwOyAvKiBTaWduYWxsaW5nICovCisJYmdwaC0+cGR1X3R5cGUgPSBCU1NHUF9QRFVUX1JFU1VNRV9BQ0s7CisKKwlfdGxsaSA9IGh0b25sKHRsbGkpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9UTExJLCA0LCAodWludDhfdCAqKSAmX3RsbGkpOworCWdzbTQ4X2NvbnN0cnVjdF9yYShyYSwgcmFfaWQpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBLCA2LCByYSk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KKworLyogMTAuMy4xMSBSRVNVTUUtTkFDSyBQRFUgKi8KK2ludCBic3NncF90eF9yZXN1bWVfbmFjayh1aW50MTZfdCBuc2VpLCB1aW50MzJfdCB0bGxpLAorCQkJIGNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYV9pZCwgdWludDhfdCAqY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGJzc2dwX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9CisJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYmdwaCkpOworCXVpbnQzMl90IF90bGxpOworCXVpbnQ4X3QgcmFbNl07CisKKwltc2diX25zZWkobXNnKSA9IG5zZWk7CisJbXNnYl9idmNpKG1zZykgPSAwOyAvKiBTaWduYWxsaW5nICovCisJYmdwaC0+cGR1X3R5cGUgPSBCU1NHUF9QRFVUX1NVU1BFTkRfTkFDSzsKKworCV90bGxpID0gaHRvbmwodGxsaSk7CisJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX1RMTEksIDQsICh1aW50OF90ICopICZfdGxsaSk7CisJZ3NtNDhfY29uc3RydWN0X3JhKHJhLCByYV9pZCk7CisJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEsIDYsIHJhKTsKKwlpZiAoY2F1c2UpCisJCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9DQVVTRSwgMSwgY2F1c2UpOworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CisKK3VpbnQxNl90IGJzc2dwX3BhcnNlX2NlbGxfaWQoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKwkvKiA2IG9jdGV0cyBSQUMgKi8KKwlnc200OF9wYXJzZV9yYShyYWlkLCBidWYpOworCS8qIDIgb2N0ZXRzIENJRCAqLworCXJldHVybiBudG9ocygqKHVpbnQxNl90ICopIChidWYrNikpOworfQorCisvKiBDaGFwdGVyIDguNCBCVkMtUmVzZXQgUHJvY2VkdXJlICovCitzdGF0aWMgaW50IGJzc2dwX3J4X2J2Y19yZXNldChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsCQorCQkJICAgICAgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYmN0eDsKKwl1aW50MTZfdCBuc2VpID0gbXNnYl9uc2VpKG1zZyk7CisJdWludDE2X3QgYnZjaTsKKwlpbnQgcmM7CisKKwlidmNpID0gbnRvaHMoKih1aW50MTZfdCAqKVRMVlBfVkFMKHRwLCBCU1NHUF9JRV9CVkNJKSk7CisJREVCVUdQKERCU1NHUCwgIkJTU0dQIEJWQ0k9JXUgUnggUkVTRVQgY2F1c2U9JXNcbiIsIGJ2Y2ksCisJCWJzc2dwX2NhdXNlX3N0cigqVExWUF9WQUwodHAsIEJTU0dQX0lFX0NBVVNFKSkpOworCisJLyogbG9vay11cCBvciBjcmVhdGUgdGhlIEJUUyBjb250ZXh0IGZvciB0aGlzIEJWQyAqLworCWJjdHggPSBidHNjdHhfYnlfYnZjaV9uc2VpKGJ2Y2ksIG5zZWkpOworCWlmICghYmN0eCkKKwkJYmN0eCA9IGJ0c2N0eF9hbGxvYyhidmNpLCBuc2VpKTsKKworCS8qIEFzIG9wcG9zZWQgdG8gTlMtVkNzLCBCVkNzIGFyZSBOT1QgYmxvY2tlZCBhZnRlciBSRVNFVCAqLworCWJjdHgtPnN0YXRlICY9IH5CVkNfU19CTE9DS0VEOworCisJLyogV2hlbiB3ZSByZWNlaXZlIGEgQlZDLVJFU0VUIFBEVSAoYXQgbGVhc3Qgb2YgYSBQVFAgQlZDSSksIHRoZSBCU1MKKwkgKiBpbmZvcm1zIHVzIGFib3V0IGl0cyBSQUMgKyBDZWxsIElELCBzbyB3ZSBjYW4gY3JlYXRlIGEgbWFwcGluZyAqLworCWlmIChidmNpICE9IDAgJiYgYnZjaSAhPSAxKSB7CisJCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9DRUxMX0lEKSkgeworCQkJTE9HUChEQlNTR1AsIExPR0xfRVJST1IsICJCU1NHUCBCVkNJPSV1IFJFU0VUICIKKwkJCQkibWlzc2luZyBtYW5kYXRvcnkgSUVcbiIsIGJ2Y2kpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogYWN0dWFsbHkgZXh0cmFjdCBSQUMgLyBDSUQgKi8KKwkJYmN0eC0+Y2VsbF9pZCA9IGJzc2dwX3BhcnNlX2NlbGxfaWQoJmJjdHgtPnJhX2lkLAorCQkJCQkJVExWUF9WQUwodHAsIEJTU0dQX0lFX0NFTExfSUQpKTsKKwkJTE9HUChEQlNTR1AsIExPR0xfTk9USUNFLCAiQ2VsbCAldS0ldS0ldS0ldSBDSSAldSBvbiBCVkNJICV1XG4iLAorCQkJYmN0eC0+cmFfaWQubWNjLCBiY3R4LT5yYV9pZC5tbmMsIGJjdHgtPnJhX2lkLmxhYywKKwkJCWJjdHgtPnJhX2lkLnJhYywgYmN0eC0+Y2VsbF9pZCwgYnZjaSk7CisJfQorCisJLyogQWNrbm93bGVkZ2UgdGhlIFJFU0VUIHRvIHRoZSBCVFMgKi8KKwlyYyA9IGJzc2dwX3R4X3NpbXBsZV9idmNpKEJTU0dQX1BEVVRfQlZDX1JFU0VUX0FDSywKKwkJCQkgIG5zZWksIGJ2Y2ksIG5zX2J2Y2kpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJzc2dwX3J4X2J2Y19ibG9jayhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisJdWludDE2X3QgYnZjaTsKKwlzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqcHRwX2N0eDsKKworCWJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwodHAsIEJTU0dQX0lFX0JWQ0kpKTsKKwlpZiAoYnZjaSA9PSBCVkNJX1NJR05BTExJTkcpIHsKKwkJLyogOC4zLjI6IFNpZ25hbGxpbmcgQlZDIHNoYWxsIG5ldmVyIGJlIGJsb2NrZWQgKi8KKwkJTE9HUChEQlNTR1AsIExPR0xfRVJST1IsICJOU0VJPSV1L0JWQ0k9JXUgIgorCQkJInJlY2VpdmVkIGJsb2NrIGZvciBzaWduYWxsaW5nIEJWQyE/IVxuIiwKKwkJCW1zZ2JfbnNlaShtc2cpLCBtc2diX2J2Y2kobXNnKSk7CisJCXJldHVybiAwOworCX0KKworCUxPR1AoREJTU0dQLCBMT0dMX0lORk8sICJCU1NHUCBCVkNJPSV1IEJWQy1CTE9DS1xuIiwgYnZjaSk7CisKKwlwdHBfY3R4ID0gYnRzY3R4X2J5X2J2Y2lfbnNlaShidmNpLCBtc2diX25zZWkobXNnKSk7CisJaWYgKCFwdHBfY3R4KQorCQlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX1VOS05PV05fQlZDSSwgJmJ2Y2ksIG1zZyk7CisKKwlwdHBfY3R4LT5zdGF0ZSB8PSBCVkNfU19CTE9DS0VEOworCXJhdGVfY3RyX2luYygmcHRwX2N0eC0+Y3RyZy0+Y3RyW0JTU0dQX0NUUl9CTE9DS0VEXSk7CisKKwkvKiBGSVhNRTogU2VuZCBOTV9CVkNfQkxPQ0suaW5kIHRvIE5NICovCisKKwkvKiBXZSBhbHdheXMgYWNrbm93bGVkZ2UgdGhlIEJMT0NLaW5nICovCisJcmV0dXJuIGJzc2dwX3R4X3NpbXBsZV9idmNpKEJTU0dQX1BEVVRfQlZDX0JMT0NLX0FDSywgbXNnYl9uc2VpKG1zZyksCisJCQkJICAgIGJ2Y2ksIG1zZ2JfYnZjaShtc2cpKTsKK307CisKK3N0YXRpYyBpbnQgYnNzZ3BfcnhfYnZjX3VuYmxvY2soc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwKQoreworCXVpbnQxNl90IGJ2Y2k7CisJc3RydWN0IGJzc2dwX2J2Y19jdHggKnB0cF9jdHg7CisKKwlidmNpID0gbnRvaHMoKih1aW50MTZfdCAqKVRMVlBfVkFMKHRwLCBCU1NHUF9JRV9CVkNJKSk7CisJaWYgKGJ2Y2kgPT0gQlZDSV9TSUdOQUxMSU5HKSB7CisJCS8qIDguMy4yOiBTaWduYWxsaW5nIEJWQyBzaGFsbCBuZXZlciBiZSBibG9ja2VkICovCisJCUxPR1AoREJTU0dQLCBMT0dMX0VSUk9SLCAiTlNFST0ldS9CVkNJPSV1ICIKKwkJCSJyZWNlaXZlZCB1bmJsb2NrIGZvciBzaWduYWxsaW5nIEJWQyE/IVxuIiwKKwkJCW1zZ2JfbnNlaShtc2cpLCBtc2diX2J2Y2kobXNnKSk7CisJCXJldHVybiAwOworCX0KKworCURFQlVHUChEQlNTR1AsICJCU1NHUCBCVkNJPSV1IFJ4IEJWQy1VTkJMT0NLXG4iLCBidmNpKTsKKworCXB0cF9jdHggPSBidHNjdHhfYnlfYnZjaV9uc2VpKGJ2Y2ksIG1zZ2JfbnNlaShtc2cpKTsKKwlpZiAoIXB0cF9jdHgpCisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfVU5LTk9XTl9CVkNJLCAmYnZjaSwgbXNnKTsKKworCXB0cF9jdHgtPnN0YXRlICY9IH5CVkNfU19CTE9DS0VEOworCisJLyogRklYTUU6IFNlbmQgTk1fQlZDX1VOQkxPQ0suaW5kIHRvIE5NICovCisKKwkvKiBXZSBhbHdheXMgYWNrbm93bGVkZ2UgdGhlIHVuQkxPQ0tpbmcgKi8KKwlyZXR1cm4gYnNzZ3BfdHhfc2ltcGxlX2J2Y2koQlNTR1BfUERVVF9CVkNfVU5CTE9DS19BQ0ssIG1zZ2JfbnNlaShtc2cpLAorCQkJCSAgICBidmNpLCBtc2diX2J2Y2kobXNnKSk7Cit9OworCisvKiBVcGxpbmsgdW5pdC1kYXRhICovCitzdGF0aWMgaW50IGJzc2dwX3J4X3VsX3VkKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCwKKwkJCSAgc3RydWN0IGJzc2dwX2J2Y19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgYnNzZ3BfdWRfaGRyICpidWRoID0gKHN0cnVjdCBic3NncF91ZF9oZHIgKikgbXNnYl9ic3NncGgobXNnKTsKKworCS8qIGV4dHJhY3QgVExMSSBhbmQgcGFyc2UgVExWIElFcyAqLworCW1zZ2JfdGxsaShtc2cpID0gbnRvaGwoYnVkaC0+dGxsaSk7CisKKwlERUJVR1AoREJTU0dQLCAiQlNTR1AgVExMST0weCUwOHggVVBMSU5LLVVOSVREQVRBXG4iLCBtc2diX3RsbGkobXNnKSk7CisKKwkvKiBDZWxsIElEIGFuZCBMTENfUERVIGFyZSB0aGUgb25seSBtYW5kYXRvcnkgSUUgKi8KKwlpZiAoIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQ0VMTF9JRCkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfTExDX1BEVSkpIHsKKwkJTE9HUChEQlNTR1AsIExPR0xfRVJST1IsICJCU1NHUCBUTExJPTB4JTA4eCBSeCBVTC1VRCAiCisJCQkibWlzc2luZyBtYW5kYXRvcnkgSUVcbiIsIG1zZ2JfdGxsaShtc2cpKTsKKwkJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9NSVNTSU5HX01BTkRfSUUsIE5VTEwsIG1zZyk7CisJfQorCisJLyogc3RvcmUgcG9pbnRlciB0byBMTEMgaGVhZGVyIGFuZCBDRUxMIElEIGluIG1zZ2ItPmNiICovCisJbXNnYl9sbGNoKG1zZykgPSAodWludDhfdCAqKSBUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfTExDX1BEVSk7CisJbXNnYl9iY2lkKG1zZykgPSAodWludDhfdCAqKSBUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQ0VMTF9JRCk7CisKKwlyZXR1cm4gZ3Byc19sbGNfcmN2bXNnKG1zZywgdHApOworfQorCitzdGF0aWMgaW50IGJzc2dwX3J4X3N1c3BlbmQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLAorCQkJICAgIHN0cnVjdCBic3NncF9idmNfY3R4ICpjdHgpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKwl1aW50MzJfdCB0bGxpOworCWludCByYzsKKworCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9UTExJKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSkgeworCQlMT0dQKERCU1NHUCwgTE9HTF9FUlJPUiwgIkJTU0dQIEJWQ0k9JXUgUnggU1VTUEVORCAiCisJCQkibWlzc2luZyBtYW5kYXRvcnkgSUVcbiIsIGN0eC0+YnZjaSk7CisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLCBOVUxMLCBtc2cpOworCX0KKworCXRsbGkgPSBudG9obCgqKHVpbnQzMl90ICopVExWUF9WQUwodHAsIEJTU0dQX0lFX1RMTEkpKTsKKworCURFQlVHUChEQlNTR1AsICJCU1NHUCBCVkNJPSV1IFRMTEk9MHglMDh4IFJ4IFNVU1BFTkRcbiIsCisJCWN0eC0+YnZjaSwgdGxsaSk7CisKKwlnc200OF9wYXJzZV9yYSgmcmFpZCwgVExWUF9WQUwodHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpKTsKKworCS8qIEluZm9ybSBHTU0gYWJvdXQgdGhlIFNVU1BFTkQgcmVxdWVzdCAqLworCXJjID0gZ3Byc19nbW1fcnhfc3VzcGVuZCgmcmFpZCwgdGxsaSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIGJzc2dwX3R4X3N1c3BlbmRfbmFjayhtc2diX25zZWkobXNnKSwgdGxsaSwgTlVMTCk7CisKKwlic3NncF90eF9zdXNwZW5kX2Fjayhtc2diX25zZWkobXNnKSwgdGxsaSwgJnJhaWQsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnNzZ3BfcnhfcmVzdW1lKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCwKKwkJCSAgIHN0cnVjdCBic3NncF9idmNfY3R4ICpjdHgpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKwl1aW50MzJfdCB0bGxpOworCXVpbnQ4X3Qgc3VzcGVuZF9yZWY7CisJaW50IHJjOworCisJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1RMTEkpIHx8CisJICAgICFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpIHx8CisJICAgICFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1NVU1BFTkRfUkVGX05SKSkgeworCQlMT0dQKERCU1NHUCwgTE9HTF9FUlJPUiwgIkJTU0dQIEJWQ0k9JXUgUnggUkVTVU1FICIKKwkJCSJtaXNzaW5nIG1hbmRhdG9yeSBJRVxuIiwgY3R4LT5idmNpKTsKKwkJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9NSVNTSU5HX01BTkRfSUUsIE5VTEwsIG1zZyk7CisJfQorCisJdGxsaSA9IG50b2hsKCoodWludDMyX3QgKilUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfVExMSSkpOworCXN1c3BlbmRfcmVmID0gKlRMVlBfVkFMKHRwLCBCU1NHUF9JRV9TVVNQRU5EX1JFRl9OUik7CisKKwlERUJVR1AoREJTU0dQLCAiQlNTR1AgQlZDST0ldSBUTExJPTB4JTA4eCBSRVNVTUVcbiIsIGN0eC0+YnZjaSwgdGxsaSk7CisKKwlnc200OF9wYXJzZV9yYSgmcmFpZCwgVExWUF9WQUwodHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpKTsKKworCS8qIEluZm9ybSBHTU0gYWJvdXQgdGhlIFJFU1VNRSByZXF1ZXN0ICovCisJcmMgPSBncHJzX2dtbV9yeF9yZXN1bWUoJnJhaWQsIHRsbGksIHN1c3BlbmRfcmVmKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gYnNzZ3BfdHhfcmVzdW1lX25hY2sobXNnYl9uc2VpKG1zZyksIHRsbGksICZyYWlkLAorCQkJCQkgICAgTlVMTCk7CisKKwlic3NncF90eF9yZXN1bWVfYWNrKG1zZ2JfbnNlaShtc2cpLCB0bGxpLCAmcmFpZCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBic3NncF9yeF9sbGNfZGlzYyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsCisJCQkgICAgIHN0cnVjdCBic3NncF9idmNfY3R4ICpjdHgpCit7CisJdWludDMyX3QgdGxsaTsKKworCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9UTExJKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9MTENfRlJBTUVTX0RJU0NBUkRFRCkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQlZDSSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfTlVNX09DVF9BRkYpKSB7CisJCUxPR1AoREJTU0dQLCBMT0dMX0VSUk9SLCAiQlNTR1AgQlZDST0ldSBSeCBMTEMgRElTQ0FSREVEICIKKwkJCSJtaXNzaW5nIG1hbmRhdG9yeSBJRVxuIiwgY3R4LT5idmNpKTsKKwl9CisKKwl0bGxpID0gbnRvaGwoKih1aW50MzJfdCAqKVRMVlBfVkFMKHRwLCBCU1NHUF9JRV9UTExJKSk7CisKKwlERUJVR1AoREJTU0dQLCAiQlNTR1AgQlZDST0ldSBUTExJPSV1IExMQyBESVNDQVJERURcbiIsCisJCWN0eC0+YnZjaSwgdGxsaSk7CisKKwlyYXRlX2N0cl9pbmMoJmN0eC0+Y3RyZy0+Y3RyW0JTU0dQX0NUUl9ESVNDQVJERURdKTsKKworCS8qIEZJWE1FOiBzZW5kIE5NX0xMQ19ESVNDQVJERUQgdG8gTk0gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBic3NncF9yeF9mY19idmMoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLAorCQkJICAgc3RydWN0IGJzc2dwX2J2Y19jdHggKmJjdHgpCit7CisKKwlERUJVR1AoREJTU0dQLCAiQlNTR1AgQlZDST0ldSBSeCBGbG93IENvbnRyb2wgQlZDXG4iLAorCQliY3R4LT5idmNpKTsKKworCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9UQUcpIHx8CisJICAgICFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0JWQ19CVUNLRVRfU0laRSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQlVDS0VUX0xFQUtfUkFURSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQk1BWF9ERUZBVUxUX01TKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9SX0RFRkFVTFRfTVMpKSB7CisJCUxPR1AoREJTU0dQLCBMT0dMX0VSUk9SLCAiQlNTR1AgQlZDST0ldSBSeCBGQyBCVkMgIgorCQkJIm1pc3NpbmcgbWFuZGF0b3J5IElFXG4iLCBiY3R4LT5idmNpKTsKKwkJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9NSVNTSU5HX01BTkRfSUUsIE5VTEwsIG1zZyk7CisJfQorCisJLyogRklYTUU6IGFjdHVhbGx5IGltcGxlbWVudCBmbG93IGNvbnRyb2wgKi8KKworCS8qIFNlbmQgRkxPV19DT05UUk9MX0JWQ19BQ0sgKi8KKwlyZXR1cm4gYnNzZ3BfdHhfZmNfYnZjX2Fjayhtc2diX25zZWkobXNnKSwgKlRMVlBfVkFMKHRwLCBCU1NHUF9JRV9UQUcpLAorCQkJCSAgIG1zZ2JfYnZjaShtc2cpKTsKK30KKworLyogUmVjZWl2ZSBhIEJTU0dQIFBEVSBmcm9tIGEgQlNTIG9uIGEgUFRQIEJWQ0kgKi8KK3N0YXRpYyBpbnQgZ3Byc19ic3NncF9yeF9wdHAoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLAorCQkJICAgICBzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYmN0eCkKK3sKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9CisJCQkoc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKikgbXNnYl9ic3NncGgobXNnKTsKKwl1aW50OF90IHBkdV90eXBlID0gYmdwaC0+cGR1X3R5cGU7CisJaW50IHJjID0gMDsKKworCS8qIElmIHRyYWZmaWMgaXMgcmVjZWl2ZWQgb24gYSBCVkMgdGhhdCBpcyBtYXJrZWQgYXMgYmxvY2tlZCwgdGhlCisJICogcmVjZWl2ZWQgUERVIHNoYWxsIG5vdCBiZSBhY2NlcHRlZCBhbmQgYSBTVEFUVVMgUERVIChDYXVzZSB2YWx1ZToKKwkgKiBCVkMgQmxvY2tlZCkgc2hhbGwgYmUgc2VudCB0byB0aGUgcGVlciBlbnRpdHkgb24gdGhlIHNpZ25hbGxpbmcgQlZDICovCisJaWYgKGJjdHgtPnN0YXRlICYgQlZDX1NfQkxPQ0tFRCAmJiBwZHVfdHlwZSAhPSBCU1NHUF9QRFVUX1NUQVRVUykgeworCQl1aW50MTZfdCBidmNpID0gbXNnYl9idmNpKG1zZyk7CisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfQlZDSV9CTE9DS0VELCAmYnZjaSwgbXNnKTsKKwl9CisKKwlzd2l0Y2ggKHBkdV90eXBlKSB7CisJY2FzZSBCU1NHUF9QRFVUX1VMX1VOSVREQVRBOgorCQkvKiBzb21lIExMQyBkYXRhIGZyb20gdGhlIE1TICovCisJCXJjID0gYnNzZ3BfcnhfdWxfdWQobXNnLCB0cCwgYmN0eCk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9SQV9DQVBBQklMSVRZOgorCQkvKiBCU1MgcmVxdWVzdHMgUkEgY2FwYWJpbGl0eSBvciBJTVNJICovCisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBCVkNJPSV1IFJ4IFJBIENBUEFCSUxJVFkgVVBEQVRFXG4iLAorCQkJYmN0eC0+YnZjaSk7CisJCS8qIEZJWE1FOiBzZW5kIEdNTV9SQV9DQVBBQklMSVRZX1VQREFURS5pbmQgdG8gR01NICovCisJCS8qIEZJWE1FOiBzZW5kIFJBX0NBUEFfVVBEQVRFX0FDSyAqLworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfUkFESU9fU1RBVFVTOgorCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgQlZDST0ldSBSeCBSQURJTyBTVEFUVVNcbiIsIGJjdHgtPmJ2Y2kpOworCQkvKiBCU1MgaW5mb3JtcyB1cyBvZiBzb21lIGV4Y2VwdGlvbiAqLworCQkvKiBGSVhNRTogc2VuZCBHTU1fUkFESU9fU1RBVFVTLmluZCB0byBHTU0gKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9CVkM6CisJCS8qIEJTUyBpbmZvcm1zIHVzIG9mIGF2YWlsYWJsZSBiYW5kd2lkdGggaW4gR2IgaW50ZXJmYWNlICovCisJCXJjID0gYnNzZ3BfcnhfZmNfYnZjKG1zZywgdHAsIGJjdHgpOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfRkxPV19DT05UUk9MX01TOgorCQkvKiBCU1MgaW5mb3JtcyB1cyBvZiBhdmFpbGFibGUgYmFuZHdpZHRoIHRvIG9uZSBNUyAqLworCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgQlZDST0ldSBSeCBGbG93IENvbnRyb2wgTVNcbiIsCisJCQliY3R4LT5idmNpKTsKKwkJLyogRklYTUU6IGFjdHVhbGx5IGltcGxlbWVudCBmbG93IGNvbnRyb2wgKi8KKwkJLyogRklYTUU6IFNlbmQgRkxPV19DT05UUk9MX01TX0FDSyAqLworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfU1RBVFVTOgorCQkvKiBTb21lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgKi8KKwkJLyogRklYTUU6IHNlbmQgTk1fU1RBVFVTLmluZCB0byBOTSAqLworCWNhc2UgQlNTR1BfUERVVF9ET1dOTE9BRF9CU1NfUEZDOgorCWNhc2UgQlNTR1BfUERVVF9DUkVBVEVfQlNTX1BGQ19BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0NSRUFURV9CU1NfUEZDX05BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX01PRElGWV9CU1NfUEZDOgorCWNhc2UgQlNTR1BfUERVVF9ERUxFVEVfQlNTX1BGQ19BQ0s6CisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBCVkNJPSV1IFJ4IFBEVSB0eXBlIDB4JTAyeCBub3QgW3lldF0gIgorCQkJImltcGxlbWVudGVkXG4iLCBiY3R4LT5idmNpLCBwZHVfdHlwZSk7CisJCXJjID0gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX1BEVV9JTkNPTVBfRkVBVCwgTlVMTCwgbXNnKTsKKwkJYnJlYWs7CisJLyogdGhvc2Ugb25seSBleGlzdCBpbiB0aGUgU0dTTiAtPiBCU1MgZGlyZWN0aW9uICovCisJY2FzZSBCU1NHUF9QRFVUX0RMX1VOSVREQVRBOgorCWNhc2UgQlNTR1BfUERVVF9QQUdJTkdfUFM6CisJY2FzZSBCU1NHUF9QRFVUX1BBR0lOR19DUzoKKwljYXNlIEJTU0dQX1BEVVRfUkFfQ0FQQV9VUERBVEVfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfQlZDX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfRkxPV19DT05UUk9MX01TX0FDSzoKKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIEJWQ0k9JXUgUERVIHR5cGUgMHglMDJ4IG9ubHkgZXhpc3RzICIKKwkJCSJpbiBETFxuIiwgYmN0eC0+YnZjaSwgcGR1X3R5cGUpOworCQlic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywgTlVMTCwgbXNnKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgQlZDST0ldSBQRFUgdHlwZSAweCUwMnggdW5rbm93blxuIiwKKwkJCWJjdHgtPmJ2Y2ksIHBkdV90eXBlKTsKKwkJcmMgPSBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywgTlVMTCwgbXNnKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIGEgQlNTR1AgUERVIGZyb20gYSBCU1Mgb24gYSBTSUdOQUxMSU5HIEJWQ0kgKi8KK3N0YXRpYyBpbnQgZ3Byc19ic3NncF9yeF9zaWduKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCwKKwkJCQlzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYmN0eCkKK3sKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9CisJCQkoc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKikgbXNnYl9ic3NncGgobXNnKTsKKwl1aW50OF90IHBkdV90eXBlID0gYmdwaC0+cGR1X3R5cGU7CisJaW50IHJjID0gMDsKKwl1aW50MTZfdCBuc19idmNpID0gbXNnYl9idmNpKG1zZyk7CisJdWludDE2X3QgYnZjaTsKKworCXN3aXRjaCAoYmdwaC0+cGR1X3R5cGUpIHsKKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORDoKKwkJLyogTVMgd2FudHMgdG8gc3VzcGVuZCAqLworCQlyYyA9IGJzc2dwX3J4X3N1c3BlbmQobXNnLCB0cCwgYmN0eCk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9SRVNVTUU6CisJCS8qIE1TIHdhbnRzIHRvIHJlc3VtZSAqLworCQlyYyA9IGJzc2dwX3J4X3Jlc3VtZShtc2csIHRwLCBiY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0ZMVVNIX0xMX0FDSzoKKwkJLyogQlNTIGluZm9ybXMgdXMgaXQgaGFzIHBlcmZvcm1lZCBMTCBGTFVTSCAqLworCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgQlZDST0ldSBSeCBGTFVTSCBMTCBBQ0tcbiIsIGJjdHgtPmJ2Y2kpOworCQkvKiBGSVhNRTogc2VuZCBOTV9GTFVTSF9MTC5yZXMgdG8gTk0gKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0xMQ19ESVNDQVJEOgorCQkvKiBCU1MgaW5mb3JtcyB0aGF0IHNvbWUgTExDIFBEVSdzIGhhdmUgYmVlbiBkaXNjYXJkZWQgKi8KKwkJcmMgPSBic3NncF9yeF9sbGNfZGlzYyhtc2csIHRwLCBiY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19CTE9DSzoKKwkJLyogQlNTIHRlbGxzIHVzIHRoYXQgQlZDIHNoYWxsIGJlIGJsb2NrZWQgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0JWQ0kpIHx8CisJCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9DQVVTRSkpIHsKKwkJCUxPR1AoREJTU0dQLCBMT0dMX0VSUk9SLCAiQlNTR1AgUnggQlZDLUJMT0NLICIKKwkJCQkibWlzc2luZyBtYW5kYXRvcnkgSUVcbiIpOworCQkJZ290byBlcnJfbWFuZF9pZTsKKwkJfQorCQlyYyA9IGJzc2dwX3J4X2J2Y19ibG9jayhtc2csIHRwKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19VTkJMT0NLOgorCQkvKiBCU1MgdGVsbHMgdXMgdGhhdCBCVkMgc2hhbGwgYmUgdW5ibG9ja2VkICovCisJCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9CVkNJKSkgeworCQkJTE9HUChEQlNTR1AsIExPR0xfRVJST1IsICJCU1NHUCBSeCBCVkMtVU5CTE9DSyAiCisJCQkJIm1pc3NpbmcgbWFuZGF0b3J5IElFXG4iKTsKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCX0KKwkJcmMgPSBic3NncF9yeF9idmNfdW5ibG9jayhtc2csIHRwKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19SRVNFVDoKKwkJLyogQlNTIHRlbGxzIHVzIHRoYXQgQlZDIGluaXQgaXMgcmVxdWlyZWQgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0JWQ0kpIHx8CisJCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9DQVVTRSkpIHsKKwkJCUxPR1AoREJTU0dQLCBMT0dMX0VSUk9SLCAiQlNTR1AgUnggQlZDLVJFU0VUICIKKwkJCQkibWlzc2luZyBtYW5kYXRvcnkgSUVcbiIpOworCQkJZ290byBlcnJfbWFuZF9pZTsKKwkJfQorCQlyYyA9IGJzc2dwX3J4X2J2Y19yZXNldChtc2csIHRwLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1NUQVRVUzoKKwkJLyogU29tZSBleGNlcHRpb24gaGFzIG9jY3VycmVkICovCisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBCVkNJPSV1IFJ4IEJWQyBTVEFUVVNcbiIsIGJjdHgtPmJ2Y2kpOworCQkvKiBGSVhNRTogc2VuZCBOTV9TVEFUVVMuaW5kIHRvIE5NICovCisJCWJyZWFrOworCS8qIHRob3NlIG9ubHkgZXhpc3QgaW4gdGhlIFNHU04gLT4gQlNTIGRpcmVjdGlvbiAqLworCWNhc2UgQlNTR1BfUERVVF9QQUdJTkdfUFM6CisJY2FzZSBCU1NHUF9QRFVUX1BBR0lOR19DUzoKKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORF9BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1NVU1BFTkRfTkFDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX05BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0ZMVVNIX0xMOgorCWNhc2UgQlNTR1BfUERVVF9CVkNfQkxPQ0tfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9CVkNfVU5CTE9DS19BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1NHU05fSU5WT0tFX1RSQUNFOgorCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgQlZDST0ldSBSeCBQRFUgdHlwZSAweCUwMnggb25seSBleGlzdHMgIgorCQkJImluIERMXG4iLCBiY3R4LT5idmNpLCBwZHVfdHlwZSk7CisJCWJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9QUk9UT19FUlJfVU5TUEVDLCBOVUxMLCBtc2cpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBCVkNJPSV1IFJ4IFBEVSB0eXBlIDB4JTAyeCB1bmtub3duXG4iLAorCQkJYmN0eC0+YnZjaSwgcGR1X3R5cGUpOworCQlyYyA9IGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9QUk9UT19FUlJfVU5TUEVDLCBOVUxMLCBtc2cpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7CitlcnJfbWFuZF9pZToKKwlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwgTlVMTCwgbXNnKTsKK30KKworLyogV2UgZXhwZWN0IG1zZ2JfYnNzZ3BoKCkgdG8gcG9pbnQgdG8gdGhlIEJTU0dQIGhlYWRlciAqLworaW50IGdwcnNfYnNzZ3BfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IGJzc2dwX3VkX2hkciAqYnVkaCA9IChzdHJ1Y3QgYnNzZ3BfdWRfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGJzc2dwX2J2Y19jdHggKmJjdHg7CisJdWludDhfdCBwZHVfdHlwZSA9IGJncGgtPnBkdV90eXBlOworCXVpbnQxNl90IG5zX2J2Y2kgPSBtc2diX2J2Y2kobXNnKTsKKwlpbnQgZGF0YV9sZW47CisJaW50IHJjID0gMDsKKworCS8qIElkZW50aWZpZXJzIGZyb20gRE9XTjogTlNFSSwgQlZDSSAoYm90aCBpbiBtc2ctPmNiKSAqLworCisJLyogVU5JVERBVEEgQlNTR1AgaGVhZGVycyBoYXZlIFRMTEkgaW4gZnJvbnQgKi8KKwlpZiAocGR1X3R5cGUgIT0gQlNTR1BfUERVVF9VTF9VTklUREFUQSAmJgorCSAgICBwZHVfdHlwZSAhPSBCU1NHUF9QRFVUX0RMX1VOSVREQVRBKSB7CisJCWRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYmdwaCk7CisJCXJjID0gYnNzZ3BfdGx2X3BhcnNlKCZ0cCwgYmdwaC0+ZGF0YSwgZGF0YV9sZW4pOworCX0gZWxzZSB7CisJCWRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYnVkaCk7CisJCXJjID0gYnNzZ3BfdGx2X3BhcnNlKCZ0cCwgYnVkaC0+ZGF0YSwgZGF0YV9sZW4pOworCX0KKworCS8qIGxvb2stdXAgb3IgY3JlYXRlIHRoZSBCVFMgY29udGV4dCBmb3IgdGhpcyBCVkMgKi8KKwliY3R4ID0gYnRzY3R4X2J5X2J2Y2lfbnNlaShuc19idmNpLCBtc2diX25zZWkobXNnKSk7CisJLyogT25seSBhIFJFU0VUIFBEVSBjYW4gY3JlYXRlIGEgbmV3IEJWQyBjb250ZXh0ICovCisJaWYgKCFiY3R4ICYmIHBkdV90eXBlICE9IEJTU0dQX1BEVVRfQlZDX1JFU0VUKSB7CisJCUxPR1AoREJTU0dQLCBMT0dMX05PVElDRSwgIk5TRUk9JXUvQlZDST0ldSBSZWplY3RpbmcgUERVICIKKwkJCSJ0eXBlICV1IGZvciB1bmtub3duIEJWQ0lcbiIsIG1zZ2JfbnNlaShtc2cpLCBuc19idmNpLAorCQkJcGR1X3R5cGUpOworCQlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX1VOS05PV05fQlZDSSwgTlVMTCwgbXNnKTsKKwl9CisKKwlpZiAoYmN0eCkgeworCQlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9CVkMsIGJjdHgpOworCQlyYXRlX2N0cl9pbmMoJmJjdHgtPmN0cmctPmN0cltCU1NHUF9DVFJfUEtUU19JTl0pOworCQlyYXRlX2N0cl9hZGQoJmJjdHgtPmN0cmctPmN0cltCU1NHUF9DVFJfQllURVNfSU5dLAorCQkJICAgICBtc2diX2Jzc2dwX2xlbihtc2cpKTsKKwl9CisKKwlpZiAobnNfYnZjaSA9PSBCVkNJX1NJR05BTExJTkcpCisJCXJjID0gZ3Byc19ic3NncF9yeF9zaWduKG1zZywgJnRwLCBiY3R4KTsKKwllbHNlIGlmIChuc19idmNpID09IEJWQ0lfUFRNKQorCQlyYyA9IGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9QRFVfSU5DT01QX0ZFQVQsIE5VTEwsIG1zZyk7CisJZWxzZQorCQlyYyA9IGdwcnNfYnNzZ3BfcnhfcHRwKG1zZywgJnRwLCBiY3R4KTsKKworCXJldHVybiByYzsKK30KKworLyogRW50cnkgZnVuY3Rpb24gZnJvbSB1cHBlciBsZXZlbCAoTExDKSwgYXNraW5nIHVzIHRvIHRyYW5zbWl0IGEgQlNTR1AgUERVCisgKiB0byBhIHJlbW90ZSBNUyAoaWRlbnRpZmllZCBieSBUTExJKSBhdCBhIEJUUyBpZGVudGlmaWVkIGJ5IGl0cyBCVkNJIGFuZCBOU0VJICovCitpbnQgZ3Byc19ic3NncF90eF9kbF91ZChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tY3R4KQoreworCXN0cnVjdCBic3NncF9idmNfY3R4ICpiY3R4OworCXN0cnVjdCBic3NncF91ZF9oZHIgKmJ1ZGg7CisJdWludDhfdCBsbGNfcGR1X3Rsdl9oZHJfbGVuID0gMjsKKwl1aW50OF90ICpsbGNfcGR1X3RsdiwgKnFvc19wcm9maWxlOworCXVpbnQxNl90IHBkdV9saWZldGltZSA9IDEwMDA7IC8qIGNlbnRpLXNlY29uZHMgKi8KKwl1aW50OF90IHFvc19wcm9maWxlX2RlZmF1bHRbM10gPSB7IDB4MDAsIDB4MDAsIDB4MjAgfTsKKwl1aW50MTZfdCBtc2dfbGVuID0gbXNnLT5sZW47CisJdWludDE2X3QgYnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCXVpbnQxNl90IG5zZWkgPSBtc2diX25zZWkobXNnKTsKKwl1aW50MTZfdCBkcnhfcGFyYW1zOworCisJLyogSWRlbnRpZmllcnMgZnJvbSBVUDogVExMSSwgQlZDSSwgTlNFSSAoYWxsIGluIG1zZ2ItPmNiKSAqLworCWlmIChidmNpIDw9IEJWQ0lfUFRNICkgeworCQlMT0dQKERCU1NHUCwgTE9HTF9FUlJPUiwgIkNhbm5vdCBzZW5kIERMLVVEIHRvIEJWQ0kgJXVcbiIsCisJCQlidmNpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmN0eCA9IGJ0c2N0eF9ieV9idmNpX25zZWkoYnZjaSwgbnNlaSk7CisJaWYgKCFiY3R4KSB7CisJCS8qIEZJWE1FOiBkb24ndCBzaW1wbHkgY3JlYXRlIG1pc3NpbmcgY29udGV4dCwgYnV0IHJlamVjdCBtZXNzYWdlICovCisJCWJjdHggPSBidHNjdHhfYWxsb2MoYnZjaSwgbnNlaSk7CisJfQorCisJaWYgKG1zZy0+bGVuID4gVFZMVl9NQVhfT05FQllURSkKKwkJbGxjX3BkdV90bHZfaGRyX2xlbiArPSAxOworCisJLyogcHJlcGVuZCB0aGUgdGFnIGFuZCBsZW5ndGggb2YgdGhlIExMQy1QRFUgVExWICovCisJbGxjX3BkdV90bHYgPSBtc2diX3B1c2gobXNnLCBsbGNfcGR1X3Rsdl9oZHJfbGVuKTsKKwlsbGNfcGR1X3RsdlswXSA9IEJTU0dQX0lFX0xMQ19QRFU7CisJaWYgKGxsY19wZHVfdGx2X2hkcl9sZW4gPiAyKSB7CisJCWxsY19wZHVfdGx2WzFdID0gbXNnX2xlbiA+PiA4OworCQlsbGNfcGR1X3RsdlsyXSA9IG1zZ19sZW4gJiAweGZmOworCX0gZWxzZSB7CisJCWxsY19wZHVfdGx2WzFdID0gbXNnX2xlbiAmIDB4N2Y7CisJCWxsY19wZHVfdGx2WzFdIHw9IDB4ODA7CisJfQorCisJLyogRklYTUU6IG9wdGlvbmFsIGVsZW1lbnRzOiBBbGlnbm1lbnQsIFVUUkFOIENDTywgTFNBLCBQRkkgKi8KKworCWlmIChtbWN0eCkgeworCQkvKiBPbGQgVExMSSB0byBoZWxwIEJTUyBtYXAgZnJvbSBvbGQtPm5ldyAqLworI2lmIDAKKwkJaWYgKG1tY3R4LT50bGxpX29sZCkKKwkJCW1zZ2JfdHZsdl9wdXNoKG1zZywgQlNTR1BfSUVfVExMSSwgNCwgaHRvbmwoKnRsbGlfb2xkKSk7CisjZW5kaWYKKworCQkvKiBJTVNJICovCisJCWlmIChzdHJsZW4obW1jdHgtPmltc2kpKSB7CisJCQl1aW50OF90IG1pWzEwXTsKKwkJCWludCBpbXNpX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kobWksIG1tY3R4LT5pbXNpKTsKKwkJCWlmIChpbXNpX2xlbiA+IDIpCisJCQkJbXNnYl90dmx2X3B1c2gobXNnLCBCU1NHUF9JRV9JTVNJLAorCQkJCQkJCWltc2lfbGVuLTIsIG1pKzIpOworCQl9CisKKwkJLyogRFJYIHBhcmFtZXRlcnMgKi8KKwkJZHJ4X3BhcmFtcyA9IGh0b25zKG1tY3R4LT5kcnhfcGFybXMpOworCQltc2diX3R2bHZfcHVzaChtc2csIEJTU0dQX0lFX0RSWF9QQVJBTVMsIDIsCisJCQkJKHVpbnQ4X3QgKikgJmRyeF9wYXJhbXMpOworCisJCS8qIEZJWE1FOiBQcmlvcml0eSAqLworCisJCS8qIE1TIFJhZGlvIEFjY2VzcyBDYXBhYmlsaXR5ICovCisJCWlmIChtbWN0eC0+bXNfcmFkaW9fYWNjZXNzX2NhcGEubGVuKQorCQkJbXNnYl90dmx2X3B1c2gobXNnLCBCU1NHUF9JRV9NU19SQURJT19BQ0NFU1NfQ0FQLAorCQkJCQltbWN0eC0+bXNfcmFkaW9fYWNjZXNzX2NhcGEubGVuLAorCQkJCQltbWN0eC0+bXNfcmFkaW9fYWNjZXNzX2NhcGEuYnVmKTsKKwl9CisKKwkvKiBwcmVwZW5kIHRoZSBwZHUgbGlmZXRpbWUgKi8KKwlwZHVfbGlmZXRpbWUgPSBodG9ucyhwZHVfbGlmZXRpbWUpOworCW1zZ2JfdHZsdl9wdXNoKG1zZywgQlNTR1BfSUVfUERVX0xJRkVUSU1FLCAyLCAodWludDhfdCAqKSZwZHVfbGlmZXRpbWUpOworCisJLyogcHJlcGVuZCB0aGUgUW9TIHByb2ZpbGUsIFRMTEkgYW5kIHBkdSB0eXBlICovCisJYnVkaCA9IChzdHJ1Y3QgYnNzZ3BfdWRfaGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqYnVkaCkpOworCW1lbWNweShidWRoLT5xb3NfcHJvZmlsZSwgcW9zX3Byb2ZpbGVfZGVmYXVsdCwgc2l6ZW9mKHFvc19wcm9maWxlX2RlZmF1bHQpKTsKKwlidWRoLT50bGxpID0gaHRvbmwobXNnYl90bGxpKG1zZykpOworCWJ1ZGgtPnBkdV90eXBlID0gQlNTR1BfUERVVF9ETF9VTklUREFUQTsKKworCXJhdGVfY3RyX2luYygmYmN0eC0+Y3RyZy0+Y3RyW0JTU0dQX0NUUl9QS1RTX09VVF0pOworCXJhdGVfY3RyX2FkZCgmYmN0eC0+Y3RyZy0+Y3RyW0JTU0dQX0NUUl9CWVRFU19PVVRdLCBtc2ctPmxlbik7CisKKwkvKiBJZGVudGlmaWVycyBkb3duOiBCVkNJLCBOU0VJIChpbiBtc2diLT5jYikgKi8KKworCXJldHVybiBncHJzX25zX3NlbmRtc2coYnNzZ3BfbnNpLCBtc2cpOworfQorCisvKiBTZW5kIGEgc2luZ2xlIEdNTS1QQUdJTkcucmVxIHRvIGEgZ2l2ZW4gTlNFSS9OUy1CVkNJICovCitpbnQgZ3Byc19ic3NncF90eF9wYWdpbmcodWludDE2X3QgbnNlaSwgdWludDE2X3QgbnNfYnZjaSwKKwkJCSBzdHJ1Y3QgYnNzZ3BfcGFnaW5nX2luZm8gKnBpbmZvKQoreworCXN0cnVjdCBtc2diICptc2cgPSBic3NncF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpiZ3BoKSk7CisJdWludDE2X3QgZHJ4X3BhcmFtcyA9IGh0b25zKHBpbmZvLT5kcnhfcGFyYW1zKTsKKwl1aW50OF90IG1pWzEwXTsKKwlpbnQgaW1zaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV9pbXNpKG1pLCBwaW5mby0+aW1zaSk7CisJdWludDhfdCByYVs2XTsKKworCWlmIChpbXNpX2xlbiA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnYl9uc2VpKG1zZykgPSBuc2VpOworCW1zZ2JfYnZjaShtc2cpID0gbnNfYnZjaTsKKworCWlmIChwaW5mby0+bW9kZSA9PSBCU1NHUF9QQUdJTkdfUFMpCisJCWJncGgtPnBkdV90eXBlID0gQlNTR1BfUERVVF9QQUdJTkdfUFM7CisJZWxzZQorCQliZ3BoLT5wZHVfdHlwZSA9IEJTU0dQX1BEVVRfUEFHSU5HX0NTOworCS8qIElNU0kgKi8KKwltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfSU1TSSwgaW1zaV9sZW4tMiwgbWkrMik7CisJLyogRFJYIFBhcmFtZXRlcnMgKi8KKwltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfRFJYX1BBUkFNUywgMiwKKwkJCSh1aW50OF90ICopICZkcnhfcGFyYW1zKTsKKwkvKiBTY29wZSAqLworCXN3aXRjaCAocGluZm8tPnNjb3BlKSB7CisJY2FzZSBCU1NHUF9QQUdJTkdfQlNTX0FSRUE6CisJCXsKKwkJCXVpbnQ4X3QgbnVsbCA9IDA7CisJCQltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfQlNTX0FSRUFfSUQsIDEsICZudWxsKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJTU0dQX1BBR0lOR19MT0NBVElPTl9BUkVBOgorCQlnc200OF9jb25zdHJ1Y3RfcmEocmEsICZwaW5mby0+cmFpZCk7CisJCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9MT0NBVElPTl9BUkVBLCA0LCByYSk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUEFHSU5HX1JPVVRFSU5HX0FSRUE6CisJCWdzbTQ4X2NvbnN0cnVjdF9yYShyYSwgJnBpbmZvLT5yYWlkKTsKKwkJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEsIDYsIHJhKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QQUdJTkdfQlZDSToKKwkJeworCQkJdWludDE2X3QgYnZjaSA9IGh0b25zKHBpbmZvLT5idmNpKTsKKwkJCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9CVkNJLCAyLCAodWludDhfdCAqKSZidmNpKTsKKwkJfQorCQlicmVhazsKKwl9CisJLyogUW9TIHByb2ZpbGUgbWFuZGF0b3J5IGZvciBQUyAqLworCWlmIChwaW5mby0+bW9kZSA9PSBCU1NHUF9QQUdJTkdfUFMpCisJCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9RT1NfUFJPRklMRSwgMywgcGluZm8tPnFvcyk7CisKKwkvKiBPcHRpb25hbCAoUC0pVE1TSSAqLworCWlmIChwaW5mby0+cHRtc2kpIHsKKwkJdWludDMyX3QgcHRtc2kgPSBodG9ubCgqcGluZm8tPnB0bXNpKTsKKwkJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX1RNU0ksIDQsICh1aW50OF90ICopICZwdG1zaSk7CisJfQorCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfYnNzZ3BfdXRpbC5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2Jzc2dwX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzYwMjUyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2Jzc2dwX3V0aWwuYwpAQCAtMCwwICsxLDEyMCBAQAorLyogR1BSUyBCU1NHUCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBhcyBwZXIgM0dQUCBUUyAwOC4xOCAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKworc3RydWN0IGdwcnNfbnNfaW5zdCAqYnNzZ3BfbnNpOworCisvKiBCU1NHUCBQcm90b2NvbCBzcGVjaWZpYywgbm90IGltcGxlbWVudGF0aW9uIHNwZWNpZmljICovCisvKiBGSVhNRTogVGhpcyBuZWVkcyB0byBnbyBpbnRvIGxpYm9zbW9jb3JlIGFmdGVyIGZpbmlzaGVkICovCisKKy8qIENoYXB0ZXIgMTEuMy45IC8gVGFibGUgMTEuMTA6IENhdXNlIGNvZGluZyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYnNzZ3BfY2F1c2Vfc3RyaW5nc1tdID0geworCXsgQlNTR1BfQ0FVU0VfUFJPQ19PVkVSTE9BRCwJIlByb2Nlc3NvciBvdmVybG9hZCIgfSwKKwl7IEJTU0dQX0NBVVNFX0VRVUlQX0ZBSUwsCSJFcXVpcG1lbnQgRmFpbHVyZSIgfSwKKwl7IEJTU0dQX0NBVVNFX1RSQVNJVF9ORVRfRkFJTCwJIlRyYW5zaXQgbmV0b3drciBzZXJ2aWNlIGZhaWx1cmUiIH0sCisJeyBCU1NHUF9DQVVTRV9DQVBBX0dSRUFURVJfMEtQQlMsIlRyYW5zbWlzc2lvbiBjYXBhY2l0eSBtb2RpZmllZCIgfSwKKwl7IEJTU0dQX0NBVVNFX1VOS05PV05fTVMsCSJVbmtub3duIE1TIiB9LAorCXsgQlNTR1BfQ0FVU0VfVU5LTk9XTl9CVkNJLAkiVW5rbm93biBCVkNJIiB9LAorCXsgQlNTR1BfQ0FVU0VfQ0VMTF9UUkFGX0NPTkcsCSJDZWxsIHRyYWZmaWMgY29uZ2VzdGlvbiIgfSwKKwl7IEJTU0dQX0NBVVNFX1NHU05fQ09ORywJIlNHU04gY29uZ2VzdGlvbiIgfSwKKwl7IEJTU0dQX0NBVVNFX09NTF9JTlRFUlYsCSJPJk0gaW50ZXJ2ZW50aW9uIiB9LAorCXsgQlNTR1BfQ0FVU0VfQlZDSV9CTE9DS0VELAkiQlZDSSBibG9ja2VkIiB9LAorCXsgQlNTR1BfQ0FVU0VfUEZDX0NSRUFURV9GQUlMLAkiUEZDIGNyZWF0ZSBmYWlsdXJlIiB9LAorCXsgQlNTR1BfQ0FVU0VfU0VNX0lOQ09SUl9QRFUsCSJTZW1hbnRpY2FsbHkgaW5jb3JyZWN0IFBEVSIgfSwKKwl7IEJTU0dQX0NBVVNFX0lOVl9NQU5EX0lORiwJIkludmFsaWQgbWFuZGF0b3J5IGluZm9ybWF0aW9uIiB9LAorCXsgQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLAkiTWlzc2luZyBtYW5kYXRvcnkgSUUiIH0sCisJeyBCU1NHUF9DQVVTRV9NSVNTSU5HX0NPTkRfSUUsCSJNaXNzaW5nIGNvbmRpdGlvbmFsIElFIiB9LAorCXsgQlNTR1BfQ0FVU0VfVU5FWFBfQ09ORF9JRSwJIlVuZXhwZWN0ZWQgY29uZGl0aW9uYWwgSUUiIH0sCisJeyBCU1NHUF9DQVVTRV9DT05EX0lFX0VSUiwJIkNvbmRpdGlvbmFsIElFIGVycm9yIiB9LAorCXsgQlNTR1BfQ0FVU0VfUERVX0lOQ09NUF9TVEFURSwJIlBEVSBpbmNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEJTU0dQX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMsCSJQcm90b2NvbCBlcnJvciAtIHVuc3BlY2lmaWVkIiB9LAorCXsgQlNTR1BfQ0FVU0VfUERVX0lOQ09NUF9GRUFULCAJIlBEVSBub3QgY29tcGF0aWJsZSB3aXRoIGZlYXR1cmUgc2V0IiB9LAorCXsgMCwgTlVMTCB9LAorfTsKKworY29uc3QgY2hhciAqYnNzZ3BfY2F1c2Vfc3RyKGVudW0gZ3Byc19ic3NncF9jYXVzZSBjYXVzZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhic3NncF9jYXVzZV9zdHJpbmdzLCBjYXVzZSk7Cit9CisKKworc3RydWN0IG1zZ2IgKmJzc2dwX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbSg0MDk2LCAxMjgsICJCU1NHUCIpOworfQorCisvKiBUcmFuc21pdCBhIHNpbXBsZSByZXNwb25zZSBzdWNoIGFzIEJMT0NLL1VOQkxPQ0svUkVTRVQgQUNLL05BQ0sgKi8KK2ludCBic3NncF90eF9zaW1wbGVfYnZjaSh1aW50OF90IHBkdV90eXBlLCB1aW50MTZfdCBuc2VpLAorCQkJIHVpbnQxNl90IGJ2Y2ksIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGJzc2dwX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9CisJCQkoc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmJncGgpKTsKKwl1aW50MTZfdCBfYnZjaTsKKworCW1zZ2JfbnNlaShtc2cpID0gbnNlaTsKKwltc2diX2J2Y2kobXNnKSA9IG5zX2J2Y2k7CisKKwliZ3BoLT5wZHVfdHlwZSA9IHBkdV90eXBlOworCV9idmNpID0gaHRvbnMoYnZjaSk7CisJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX0JWQ0ksIDIsICh1aW50OF90ICopICZfYnZjaSk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KKworLyogQ2hhcHRlciAxMC40LjE0OiBTdGF0dXMgKi8KK2ludCBic3NncF90eF9zdGF0dXModWludDhfdCBjYXVzZSwgdWludDE2X3QgKmJ2Y2ksIHN0cnVjdCBtc2diICpvcmlnX21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gYnNzZ3BfbXNnYl9hbGxvYygpOworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0KKwkJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYmdwaCkpOworCisJTE9HUChEQlNTR1AsIExPR0xfTk9USUNFLCAiQlNTR1AgQlZDST0ldSBUeCBTVEFUVVMsIGNhdXNlPSVzXG4iLAorCQlidmNpID8gKmJ2Y2kgOiAwLCBic3NncF9jYXVzZV9zdHIoY2F1c2UpKTsKKwltc2diX25zZWkobXNnKSA9IG1zZ2JfbnNlaShvcmlnX21zZyk7CisJbXNnYl9idmNpKG1zZykgPSAwOworCisJYmdwaC0+cGR1X3R5cGUgPSBCU1NHUF9QRFVUX1NUQVRVUzsKKwltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfQ0FVU0UsIDEsICZjYXVzZSk7CisJaWYgKGJ2Y2kpIHsKKwkJdWludDE2X3QgX2J2Y2kgPSBodG9ucygqYnZjaSk7CisJCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9CVkNJLCAyLCAodWludDhfdCAqKSAmX2J2Y2kpOworCX0KKwlpZiAob3JpZ19tc2cpCisJCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9QRFVfSU5fRVJST1IsCisJCQkgICAgICBtc2diX2Jzc2dwX2xlbihvcmlnX21zZyksIG1zZ2JfYnNzZ3BoKG9yaWdfbXNnKSk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ic3NncF92dHkuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ic3NncF92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzFmNjVjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2Jzc2dwX3Z0eS5jCkBAIC0wLDAgKzEsMTc4IEBACisvKiBWVFkgaW50ZXJmYWNlIGZvciBvdXIgR1BSUyBCU1MgR2F0ZXdheSBQcm90b2NvbCAoQlNTR1ApIGltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorCisvKiBGSVhNRTogdGhpcyBzaG91bGQgZ28gdG8gc29tZSBjb21tb24gZmlsZSBhcyBpdCBpcyBjb3BpZWQKKyAqIGluIHZ0eV9pbnRlcmZhY2UuYyBvZiB0aGUgQlNDICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX2Jzc2dwX3RpbWVyX3N0cnNbXSA9IHsKKwl7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbWRfbm9kZSBic3NncF9ub2RlID0geworCUJTU0dQX05PREUsCisJIiVzKGJzc2dwKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9ic3NncChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJic3NncCVzIiwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnNzZ3AsIGNmZ19ic3NncF9jbWQsCisgICAgICAiYnNzZ3AiLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgR1BSUyBCU1MgR2F0ZXdheSBQcm90b2NvbCIpCit7CisJdnR5LT5ub2RlID0gQlNTR1BfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYnZjKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ2YywgaW50IHN0YXRzKQoreworCXZ0eV9vdXQodnR5LCAiTlNFSSAlNXUsIEJWQ0kgJTV1LCBSQS1JRDogJXUtJXUtJXUtJXUsIENJRDogJXUsICIKKwkJIlNUQVRFOiAlcyVzIiwgYnZjLT5uc2VpLCBidmMtPmJ2Y2ksIGJ2Yy0+cmFfaWQubWNjLAorCQlidmMtPnJhX2lkLm1uYywgYnZjLT5yYV9pZC5sYWMsIGJ2Yy0+cmFfaWQucmFjLCBidmMtPmNlbGxfaWQsCisJCWJ2Yy0+c3RhdGUgJiBCVkNfU19CTE9DS0VEID8gIkJMT0NLRUQiIDogIlVOQkxPQ0tFRCIsCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAoc3RhdHMpCisJCXZ0eV9vdXRfcmF0ZV9jdHJfZ3JvdXAodnR5LCAiICIsIGJ2Yy0+Y3RyZyk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYnNzZ3Aoc3RydWN0IHZ0eSAqdnR5LCBpbnQgc3RhdHMpCit7CisJc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ2YzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ2YywgJmJzc2dwX2J2Y19jdHh0cywgbGlzdCkgeworCQlkdW1wX2J2Yyh2dHksIGJ2Yywgc3RhdHMpOworCX0KK30KKworI2RlZmluZSBCU1NHUF9TVFIgIlNob3cgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJTU0dQIHByb3RvY29sXG4iCisKK0RFRlVOKHNob3dfYnNzZ3AsIHNob3dfYnNzZ3BfY21kLCAic2hvdyBic3NncCIsCisJU0hPV19TVFIgQlNTR1BfU1RSKQoreworCWR1bXBfYnNzZ3AodnR5LCAwKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfYnNzZ3Bfc3RhdHMsIHNob3dfYnNzZ3Bfc3RhdHNfY21kLCAic2hvdyBic3NncCBzdGF0cyIsCisJU0hPV19TVFIgQlNTR1BfU1RSCisJIkluY2x1ZGUgc3RhdGlzdGljc1xuIikKK3sKKwlkdW1wX2Jzc2dwKHZ0eSwgMSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X2J2Yywgc2hvd19idmNfY21kLCAic2hvdyBic3NncCBuc2VpIDwwLTY1NTM1PiBbc3RhdHNdIiwKKwlTSE9XX1NUUiBCU1NHUF9TVFIKKwkiU2hvdyBhbGwgQlZDcyBvbiBvbmUgTlNFXG4iCisJIlRoZSBOU0VJXG4iICJJbmNsdWRlIFN0YXRpc3RpY3NcbiIpCit7CisJc3RydWN0IGJzc2dwX2J2Y19jdHggKmJ2YzsKKwl1aW50MTZfdCBuc2VpID0gYXRvaShhcmd2WzFdKTsKKwlpbnQgc2hvd19zdGF0cyA9IDA7CisKKwlpZiAoYXJnYyA+PSAyKQorCQlzaG93X3N0YXRzID0gMTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ2YywgJmJzc2dwX2J2Y19jdHh0cywgbGlzdCkgeworCQlpZiAoYnZjLT5uc2VpICE9IG5zZWkpCisJCQljb250aW51ZTsKKwkJZHVtcF9idmModnR5LCBidmMsIHNob3dfc3RhdHMpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19mbHRyX2J2YywKKyAgICAgIGxvZ2dpbmdfZmx0cl9idmNfY21kLAorICAgICAgImxvZ2dpbmcgZmlsdGVyIGJ2YyBuc2VpIDwwLTY1NTM1PiBidmNpIDwwLTY1NTM1PiIsCisJTE9HR0lOR19TVFIgRklMVEVSX1NUUgorCSJGaWx0ZXIgYmFzZWQgb24gQlNTR1AgVmlydHVhbCBDb25uZWN0aW9uXG4iCisJIk5TRUkgb2YgdGhlIEJWQyB0byBiZSBmaWx0ZXJlZFxuIgorCSJOZXR3b3JrIFNlcnZpY2UgRW50aXR5IElkZW50aWZpZXIgKE5TRUkpXG4iCisJIkJWQ0kgb2YgdGhlIEJWQyB0byBiZSBmaWx0ZXJlZFxuIgorCSJCU1NHUCBWaXJ0dWFsIENvbm5lY3Rpb24gSWRlbnRpZmllciAoQlZDSSlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBic3NncF9idmNfY3R4ICpidmM7CisJdWludDE2X3QgbnNlaSA9IGF0b2koYXJndlswXSk7CisJdWludDE2X3QgYnZjaSA9IGF0b2koYXJndlsxXSk7CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ2YyA9IGJ0c2N0eF9ieV9idmNpX25zZWkoYnZjaSwgbnNlaSk7CisJaWYgKCFidmMpIHsKKwkJdnR5X291dCh2dHksICJObyBCVkMgYnkgdGhhdCBpZGVudGlmaWVyJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X2J2Y19maWx0ZXIoY29ubi0+ZGJnLCBidmMpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworaW50IGdwcnNfYnNzZ3BfdnR5X2luaXQodm9pZCkKK3sKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfYnNzZ3BfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfYnNzZ3Bfc3RhdHNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfYnZjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZsb2dnaW5nX2ZsdHJfYnZjX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfYnNzZ3BfY21kKTsKKwlpbnN0YWxsX25vZGUoJmJzc2dwX25vZGUsIGNvbmZpZ193cml0ZV9ic3NncCk7CisJaW5zdGFsbF9kZWZhdWx0KEJTU0dQX05PREUpOworCWluc3RhbGxfZWxlbWVudChCU1NHUF9OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJTU0dQX05PREUsICZvdXJub2RlX2VuZF9jbWQpOworCS8vaW5zdGFsbF9lbGVtZW50KEJTU0dQX05PREUsICZjZmdfYnNzZ3BfdGltZXJfY21kKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2dtbS5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2dtbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDJlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfZ21tLmMKQEAgLTAsMCArMSwxMzIwIEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcmF0ZV9jdHIuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDhfZ3Bycy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19sbGMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfc2dzbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19nbW0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Nnc24uaD4KKworI2luY2x1ZGUgPHBkcC5oPgorCisjZGVmaW5lIFBUTVNJX0FMTE9DCisKKy8qIFNlY3Rpb24gMTEuMi4yIC8gVGFibGUgMTEuNCBNTSB0aW1lcnMgbmV0b3drciBzaWRlICovCisjZGVmaW5lIEdTTTA0MDhfVDMzMjJfU0VDUwk2CS8qIERFVEFDSF9SRVEgLT4gREVUQUNIX0FDQyAqLworI2RlZmluZSBHU00wNDA4X1QzMzUwX1NFQ1MJNgkvKiB3YWl0aW5nIGZvciBBVFQvUkFVL1RNU0kgQ09NUEwgKi8KKyNkZWZpbmUgR1NNMDQwOF9UMzM2MF9TRUNTCTYJLyogd2FpdGluZyBmb3IgQVVUSC9DSVBIIFJFU1AgKi8KKyNkZWZpbmUgR1NNMDQwOF9UMzM3MF9TRUNTCTYJLyogd2FpdGluZyBmb3IgSUQgUkVTUCAqLworCisvKiBTZWN0aW9uIDExLjIuMiAvIFRhYmxlIDExLjRhIE1NIHRpbWVycyBuZXRvd2tyIHNpZGUgKi8KKyNkZWZpbmUgR1NNMDQwOF9UMzMxM19TRUNTCTMwCS8qIHdhaXRpbmcgZm9yIHBhZ2luZyByZXNwb25zZSAqLworI2RlZmluZSBHU00wNDA4X1QzMzE0X1NFQ1MJNDQJLyogZm9yY2UgdG8gU1RCWSBvbiBleHBpcnkgKi8KKyNkZWZpbmUgR1NNMDQwOF9UMzMxNl9TRUNTCTQ0CisKK2V4dGVybiBzdHJ1Y3Qgc2dzbl9pbnN0YW5jZSAqc2dzbjsKKworLyogUHJvdG9jb2wgcmVsYXRlZCBzdHVmZiwgc2hvdWxkIGdvIGludG8gbGlib3Ntb2NvcmUgKi8KKworLyogMTAuNS41LjE0IEdQUlMgTU0gQ2F1c2UgLyBUYWJsZSAxMC41LjE0NyAqLworY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBnbW1fY2F1c2VfbmFtZXNbXSA9IHsKKwkvKiBGSVhNRSAqLworCXsgR01NX0NBVVNFX1NFTV9JTkNPUlJfTVNHLCAiU2VtYW50aWNhbGx5IGluY29ycmVjdCBtZXNzYWdlIiB9LAorCXsgR01NX0NBVVNFX0lOVl9NQU5EX0lORk8sICJJbnZhbGlkIG1hbmRhdG9yeSBpbmZvcm1hdGlvbiIgfSwKKwl7IEdNTV9DQVVTRV9NU0dUX05PVEVYSVNUX05PVElNUEwsCisJCQkiTWVzc2FnZSB0eXBlIG5vbi1leGlzdGFudCBvciBub3QgaW1wbGVtZW50ZWQiIH0sCisJeyBHTU1fQ0FVU0VfTVNHVF9JTkNPTVBfUF9TVEFURSwKKwkJCSJNZXNzYWdlIHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdNTV9DQVVTRV9JRV9OT1RFWElTVF9OT1RJTVBMLAorCQkJIkluZm9ybWF0aW9uIGVsZW1lbnQgbm9uLWV4aXN0ZW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdNTV9DQVVTRV9DT05EX0lFX0VSUiwgIkNvbmRpdGlvbmFsIElFIGVycm9yIiB9LAorCXsgR01NX0NBVVNFX01TR19JTkNPTVBfUF9TVEFURSwKKwkJCQkiTWVzc2FnZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlICIgfSwKKwl7IEdNTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDLCAiUHJvdG9jb2wgZXJyb3IsIHVuc3BlY2lmaWVkIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCisvKiAxMC41LjYuNiBTTSBDYXVzZSAvIFRhYmxlIDEwLjUuMTU3ICovCitjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdzbV9jYXVzZV9uYW1lc1tdID0geworCXsgR1NNX0NBVVNFX0lOU1VGRl9SU1JDLCAiSW5zdWZmaWNpZW50IHJlc291cmNlcyIgfSwKKwl7IEdTTV9DQVVTRV9NSVNTSU5HX0FQTiwgIk1pc3Npbmcgb3IgdW5rbm93biBBUE4iIH0sCisJeyBHU01fQ0FVU0VfVU5LTk9XTl9QRFAsICJVbmtub3duIFBEUCBhZGRyZXNzIG9yIFBEUCB0eXBlIiB9LAorCXsgR1NNX0NBVVNFX0FVVEhfRkFJTEVELCAiVXNlciBBdXRoZW50aWNhdGlvbiBmYWlsZWQiIH0sCisJeyBHU01fQ0FVU0VfQUNUX1JFSl9HR1NOLCAiQWN0aXZhdGlvbiByZWplY3RlZCBieSBHR1NOIiB9LAorCXsgR1NNX0NBVVNFX0FDVF9SRUpfVU5TUEVDLCAiQWN0aXZhdGlvbiByZWplY3RlZCwgdW5zcGVjaWZpZWQiIH0sCisJeyBHU01fQ0FVU0VfU0VSVl9PUFRfTk9UU1VQUCwgIlNlcnZpY2Ugb3B0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBHU01fQ0FVU0VfUkVRX1NFUlZfT1BUX05PVFNVQiwKKwkJCQkiUmVxdWVzdGVkIHNlcnZpY2Ugb3B0aW9uIG5vdCBzdWJzY3JpYmVkIiB9LAorCXsgR1NNX0NBVVNFX1NFUlZfT1BUX1RFTVBfT09PLAorCQkJCSJTZXJ2aWNlIG9wdGlvbiB0ZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIiIH0sCisJeyBHU01fQ0FVU0VfTlNBUElfSU5fVVNFLCAiTlNBUEkgYWxyZWFkeSB1c2VkIiB9LAorCXsgR1NNX0NBVVNFX0RFQUNUX1JFR1VMQVIsICJSZWd1bGFyIGRlYWN0aXZhdGlvbiIgfSwKKwl7IEdTTV9DQVVTRV9RT1NfTk9UX0FDQ0VQVEVELCAiUW9TIG5vdCBhY2NlcHRlZCIgfSwKKwl7IEdTTV9DQVVTRV9ORVRfRkFJTCwgIk5ldHdvcmsgRmFpbHVyZSIgfSwKKwl7IEdTTV9DQVVTRV9SRUFDVF9SUUQsICJSZWFjdGl2YXRpb24gcmVxdWlyZWQiIH0sCisJeyBHU01fQ0FVU0VfRkVBVFVSRV9OT1RTVVBQLCAiRmVhdHVyZSBub3Qgc3VwcG9ydGVkICIgfSwKKwl7IEdTTV9DQVVTRV9JTlZBTElEX1RSQU5TX0lELCAiSW52YWxpZCB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIiB9LAorCXsgR1NNX0NBVVNFX1NFTV9JTkNPUlJfTVNHLCAiU2VtYW50aWNhbGx5IGluY29ycmVjdCBtZXNzYWdlIiB9LAorCXsgR1NNX0NBVVNFX0lOVl9NQU5EX0lORk8sICJJbnZhbGlkIG1hbmRhdG9yeSBpbmZvcm1hdGlvbiIgfSwKKwl7IEdTTV9DQVVTRV9NU0dUX05PVEVYSVNUX05PVElNUEwsCisJCQkiTWVzc2FnZSB0eXBlIG5vbi1leGlzdGFudCBvciBub3QgaW1wbGVtZW50ZWQiIH0sCisJeyBHU01fQ0FVU0VfTVNHVF9JTkNPTVBfUF9TVEFURSwKKwkJCSJNZXNzYWdlIHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdTTV9DQVVTRV9JRV9OT1RFWElTVF9OT1RJTVBMLAorCQkJIkluZm9ybWF0aW9uIGVsZW1lbnQgbm9uLWV4aXN0ZW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdTTV9DQVVTRV9DT05EX0lFX0VSUiwgIkNvbmRpdGlvbmFsIElFIGVycm9yIiB9LAorCXsgR1NNX0NBVVNFX01TR19JTkNPTVBfUF9TVEFURSwKKwkJCQkiTWVzc2FnZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlICIgfSwKKwl7IEdTTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDLCAiUHJvdG9jb2wgZXJyb3IsIHVuc3BlY2lmaWVkIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCisvKiAxMC41LjUuMiAqLworY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX2F0dF90X3N0cnNbXSA9IHsKKwl7IEdQUlNfQVRUX1RfQVRUQUNILCAJCSJHUFJTIGF0dGFjaCIgfSwKKwl7IEdQUlNfQVRUX1RfQVRUX1dISUxFX0lNU0ksIAkiR1BSUyBhdHRhY2ggd2hpbGUgSU1TSSBhdHRhY2hlZCIgfSwKKwl7IEdQUlNfQVRUX1RfQ09NQklORUQsIAkJIkNvbWJpbmVkIEdQUlMvSU1TSSBhdHRhY2giIH0sCisJeyAwLCBOVUxMIH0KK307CisKK2NvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgZ3Byc191cGRfdF9zdHJzW10gPSB7CisJeyBHUFJTX1VQRF9UX1JBLAkJIlJBIHVwZGF0aW5nIiB9LAorCXsgR1BSU19VUERfVF9SQV9MQSwJCSJjb21iaW5lZCBSQS9MQSB1cGRhdGluZyIgfSwKKwl7IEdQUlNfVVBEX1RfUkFfTEFfSU1TSV9BVFQsCSJjb21iaW5lZCBSQS9MQSB1cGRhdGluZyArIElNU0kgYXR0YWNoIiB9LAorCXsgR1BSU19VUERfVF9QRVJJT0RJQywJCSJwZXJpb2RpYyB1cGRhdGluZyIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworLyogMTAuNS41LjUgKi8KK2NvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgZ3Byc19kZXRfdF9tb19zdHJzW10gPSB7CisJeyBHUFJTX0RFVF9UX01PX0dQUlMsCQkiR1BSUyBkZXRhY2giIH0sCisJeyBHUFJTX0RFVF9UX01PX0lNU0ksCQkiSU1TSSBkZXRhY2giIH0sCisJeyBHUFJTX0RFVF9UX01PX0NPTUJJTkVELAkiQ29tYmluZWQgR1BSUy9JTVNJIGRldGFjaCIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBnc200OF9nbW1fYXR0X3RsdmRlZiA9IHsKKwkuZGVmID0geworCQlbR1NNNDhfSUVfR01NX1RJTUVSX1JFQURZXQk9IHsgVExWX1RZUEVfVFYsIDEgfSwKKwkJW0dTTTQ4X0lFX0dNTV9BTExPQ19QVE1TSV0JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorCQlbR1NNNDhfSUVfR01NX1BUTVNJX1NJR10JPSB7IFRMVl9UWVBFX1RWLCAzIH0sCisJCVtHU000OF9JRV9HTU1fQVVUSF9SQU5EXQk9IHsgVExWX1RZUEVfVFYsIDE2IH0sCisJCVtHU000OF9JRV9HTU1fQVVUSF9TUkVTXQk9IHsgVExWX1RZUEVfVFYsIDQgfSwKKwkJW0dTTTQ4X0lFX0dNTV9JTUVJU1ZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisJCVtHU000OF9JRV9HTU1fRFJYX1BBUkFNXQk9IHsgVExWX1RZUEVfVFYsIDIgfSwKKwkJW0dTTTQ4X0lFX0dNTV9NU19ORVRfQ0FQQV0JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorCQlbR1NNNDhfSUVfR01NX1BEUF9DVFhfU1RBVFVTXQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisJCVtHU000OF9JRV9HTU1fUFNfTENTX0NBUEFdCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKwkJW0dTTTQ4X0lFX0dNTV9HTU1fTUJNU19DVFhfU1RdCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBnc200OF9zbV9hdHRfdGx2ZGVmID0geworCS5kZWYgPSB7CisJCVtHU000OF9JRV9HU01fQVBOXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorCQlbR1NNNDhfSUVfR1NNX1BST1RPX0NPTkZfT1BUXQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisJCVtHU000OF9JRV9HU01fUERQX0FERFJdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisJCVtHU000OF9JRV9HU01fQUFfVE1SXQkJPSB7IFRMVl9UWVBFX1RWLCAxIH0sCisJCVtHU000OF9JRV9HU01fTkFNRV9GVUxMXQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisJCVtHU000OF9JRV9HU01fTkFNRV9TSE9SVF0JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorCQlbR1NNNDhfSUVfR1NNX1RJTUVaT05FXQkJPSB7IFRMVl9UWVBFX1RWLCAxIH0sCisJCVtHU000OF9JRV9HU01fVVRDX0FORF9UWl0JPSB7IFRMVl9UWVBFX1RWLCA3IH0sCisJCVtHU000OF9JRV9HU01fTFNBX0lEXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorCX0sCit9OworCisvKiBPdXIgaW1wbGVtZW50YXRpb24sIHNob3VsZCBiZSBrZXB0IGluIFNHU04gKi8KKworc3RhdGljIHZvaWQgbW1jdHhfdGltZXJfY2Iodm9pZCAqX21tKTsKKworc3RhdGljIHZvaWQgbW1jdHhfdGltZXJfc3RhcnQoc3RydWN0IHNnc25fbW1fY3R4ICptbSwgdW5zaWduZWQgaW50IFQsCisJCQkJdW5zaWduZWQgaW50IHNlY29uZHMpCit7CisJaWYgKGJzY190aW1lcl9wZW5kaW5nKCZtbS0+dGltZXIpKQorCQlMT0dQKERNTSwgTE9HTF9FUlJPUiwgIlN0YXJ0aW5nIE1NIHRpbWVyICV1IHdoaWxlIG9sZCAiCisJCQkidGltZXIgJXUgcGVuZGluZ1xuIiwgVCwgbW0tPlQpOworCW1tLT5UID0gVDsKKwltbS0+bnVtX1RfZXhwID0gMDsKKworCS8qIEZJWE1FOiB3ZSBzaG91bGQgZG8gdGhpcyBvbmx5IG9uY2UgPyAqLworCW1tLT50aW1lci5kYXRhID0gbW07CisJbW0tPnRpbWVyLmNiID0gJm1tY3R4X3RpbWVyX2NiOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZtbS0+dGltZXIsIHNlY29uZHMsIDApOworfQorCitzdGF0aWMgdm9pZCBtbWN0eF90aW1lcl9zdG9wKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sIHVuc2lnbmVkIGludCBUKQoreworCWlmIChtbS0+VCAhPSBUKQorCQlMT0dQKERNTSwgTE9HTF9FUlJPUiwgIlN0b3BwaW5nIE1NIHRpbWVyICV1IGJ1dCAiCisJCQkiJXUgaXMgcnVubmluZ1xuIiwgVCwgbW0tPlQpOworCWJzY19kZWxfdGltZXIoJm1tLT50aW1lcik7Cit9CisKKy8qIFNlbmQgYSBtZXNzYWdlIHRocm91Z2ggdGhlIHVuZGVybHlpbmcgbGF5ZXIgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfZ21tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgaW50IGNvbW1hbmQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0pCit7CisJaWYgKG1tKQorCQlyYXRlX2N0cl9pbmMoJm1tLT5jdHJnLT5jdHJbR01NX0NUUl9QS1RTX1NJR19PVVRdKTsKKworCS8qIGNhbGxlciBuZWVkcyB0byBwcm92aWRlIFRMTEksIEJWQ0kgYW5kIE5TRUkgKi8KKwlyZXR1cm4gZ3Byc19sbGNfdHhfdWkobXNnLCBHUFJTX1NBUElfR01NLCBjb21tYW5kLCBtbSk7Cit9CisKKy8qIGNvcHkgaWRlbnRpZmllcnMgZnJvbSBvbGQgbWVzc2FnZSB0byBuZXcgbWVzc2FnZSwgdGhpcworICogaXMgcmVxdWlyZWQgc28gbG93ZXIgbGF5ZXJzIGNhbiByb3V0ZSBpdCBjb3JyZWN0bHkgKi8KK3N0YXRpYyB2b2lkIGdtbV9jb3B5X2lkKHN0cnVjdCBtc2diICptc2csIGNvbnN0IHN0cnVjdCBtc2diICpvbGQpCit7CisJbXNnYl90bGxpKG1zZykgPSBtc2diX3RsbGkob2xkKTsKKwltc2diX2J2Y2kobXNnKSA9IG1zZ2JfYnZjaShvbGQpOworCW1zZ2JfbnNlaShtc2cpID0gbXNnYl9uc2VpKG9sZCk7Cit9CisKKy8qIFN0b3JlIEJWQ0kvTlNFSSBpbiBNTSBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBtc2dpZDJtbWN0eChzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLCBjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCW1tLT5idmNpID0gbXNnYl9idmNpKG1zZyk7CisJbW0tPm5zZWkgPSBtc2diX25zZWkobXNnKTsKK30KKworLyogU3RvcmUgQlZDSS9OU0VJIGluIE1NIGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkIG1tY3R4Mm1zZ2lkKHN0cnVjdCBtc2diICptc2csIGNvbnN0IHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0pCit7CisJbXNnYl90bGxpKG1zZykgPSBtbS0+dGxsaTsKKwltc2diX2J2Y2kobXNnKSA9IG1tLT5idmNpOworCW1zZ2JfbnNlaShtc2cpID0gbW0tPm5zZWk7Cit9CisKKy8qIENoYXB0ZXIgOS40LjE4ICovCitzdGF0aWMgaW50IF90eF9zdGF0dXMoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBjYXVzZSwKKwkJICAgICAgc3RydWN0IHNnc25fbW1fY3R4ICptbWN0eCwgaW50IHNtKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJLyogTU1DVFggbWlnaHQgYmUgTlVMTCEgKi8KKworCURFQlVHUChETU0sICI8LSBHUFJTIE1NIFNUQVRVUyAoY2F1c2U6ICVzKVxuIiwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhnbW1fY2F1c2VfbmFtZXMsIGNhdXNlKSk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlpZiAoc20pIHsKKwkJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfU01fR1BSUzsKKwkJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR1NNX1NUQVRVUzsKKwl9IGVsc2UgeworCQlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCQlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9HTU1fU1RBVFVTOworCX0KKwlnaC0+ZGF0YVswXSA9IGNhdXNlOworCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCwgbW1jdHgpOworfQorc3RhdGljIGludCBnc200OF90eF9nbW1fc3RhdHVzKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsIHVpbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKworCW1tY3R4Mm1zZ2lkKG1zZywgbW1jdHgpOworCXJldHVybiBfdHhfc3RhdHVzKG1zZywgY2F1c2UsIG1tY3R4LCAwKTsKK307CitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9zdGF0dXNfb2xkbXNnKHN0cnVjdCBtc2diICpvbGRtc2csIHVpbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKworCWdtbV9jb3B5X2lkKG1zZywgb2xkbXNnKTsKKwlyZXR1cm4gX3R4X3N0YXR1cyhtc2csIGNhdXNlLCBOVUxMLCAwKTsKK30KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfc21fc3RhdHVzKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsIHVpbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKworCW1tY3R4Mm1zZ2lkKG1zZywgbW1jdHgpOworCXJldHVybiBfdHhfc3RhdHVzKG1zZywgY2F1c2UsIG1tY3R4LCAxKTsKK307CitzdGF0aWMgaW50IGdzbTQ4X3R4X3NtX3N0YXR1c19vbGRtc2coc3RydWN0IG1zZ2IgKm9sZG1zZywgdWludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCisJZ21tX2NvcHlfaWQobXNnLCBvbGRtc2cpOworCXJldHVybiBfdHhfc3RhdHVzKG1zZywgY2F1c2UsIE5VTEwsIDEpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZ3NtNDhfcW9zIGRlZmF1bHRfcW9zID0geworCS5kZWxheV9jbGFzcyA9IDQsCS8qIGJlc3QgZWZmb3J0ICovCisJLnJlbGlhYl9jbGFzcyA9IEdTTTQ4X1FPU19SQ19MTENfVU5fUkxDX0FDS19EQVRBX1BST1QsCisJLnBlYWtfdHB1dCA9IEdTTTQ4X1FPU19QRUFLX1RQVVRfMzIwMDBicHMsCisJLnByZWNlZF9jbGFzcyA9IEdTTTQ4X1FPU19QQ19OT1JNQUwsCisJLm1lYW5fdHB1dCA9IEdTTTQ4X1FPU19NRUFOX1RQVVRfQkVTVF9FRkZPUlQsCisJLnRyYWZfY2xhc3MgPSBHU000OF9RT1NfVENfSU5URVJBQ1RJVkUsCisJLmRlbGl2X29yZGVyID0gR1NNNDhfUU9TX0RPX1VOT1JERVJFRCwKKwkuZGVsaXZfZXJyX3NkdSA9IEdTTTQ4X1FPU19FUlJTRFVfWUVTLAorCS5tYXhfc2R1X3NpemUgPSBHU000OF9RT1NfTUFYU0RVXzE1MjAsCisJLm1heF9iaXRyYXRlX3VwID0gR1NNNDhfUU9TX01CUkFURV82M2ssCisJLm1heF9iaXRyYXRlX2Rvd24gPSBHU000OF9RT1NfTUJSQVRFXzYzaywKKwkucmVzaWRfYmVyID0gR1NNNDhfUU9TX1JCRVJfNWVfMiwKKwkuc2R1X2Vycl9yYXRpbyA9IEdTTTQ4X1FPU19TRVJSXzFlXzIsCisJLmhhbmRsaW5nX3ByaW8gPSAzLAorCS54ZmVyX2RlbGF5ID0gMHgxMCwJLyogMjAwbXMgKi8KKwkuZ3Vhcl9iaXRyYXRlX3VwID0gR1NNNDhfUU9TX01CUkFURV8waywKKwkuZ3Vhcl9iaXRyYXRlX2Rvd24gPSBHU000OF9RT1NfTUJSQVRFXzBrLAorCS5zaWdfaW5kID0gMCwJLyogbm90IG9wdGltaXNlZCBmb3Igc2lnbmFsbGluZyAqLworCS5tYXhfYml0cmF0ZV9kb3duX2V4dCA9IDAsCS8qIHVzZSBvY3RldCA5ICovCisJLmd1YXJfYml0cmF0ZV9kb3duX2V4dCA9IDAsCS8qIHVzZSBvY3RldCAxMyAqLworfTsKKworLyogQ2hhcHRlciA5LjQuMjogQXR0YWNoIGFjY2VwdCAqLworc3RhdGljIGludCBnc200OF90eF9nbW1fYXR0X2FjayhzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbTQ4X2F0dGFjaF9hY2sgKmFhOworCXVpbnQ4X3QgKnB0c2lnLCAqbWlkOworCisJREVCVUdQKERNTSwgIjwtIEdQUlMgQVRUQUNIIEFDQ0VQVCAobmV3IFAtVE1TST0weCUwOHgpXG4iLCBtbS0+cF90bXNpKTsKKworCW1tY3R4Mm1zZ2lkKG1zZywgbW0pOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dNTV9BVFRBQ0hfQUNLOworCisJYWEgPSAoc3RydWN0IGdzbTQ4X2F0dGFjaF9hY2sgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmFhKSk7CisJYWEtPmZvcmNlX3N0YnkgPSAwOwkvKiBub3QgaW5kaWNhdGVkICovCisJYWEtPmF0dF9yZXN1bHQgPSAxOwkvKiBHUFJTIG9ubHkgKi8KKwlhYS0+cmFfdXBkX3RpbWVyID0gR1BSU19UTVJfTUlOVVRFIHwgMTA7CisJYWEtPnJhZGlvX3ByaW8gPSA0OwkvKiBsb3dlc3QgKi8KKwlnc200OF9jb25zdHJ1Y3RfcmEoYWEtPnJhX2lkLmRpZ2l0cywgJm1tLT5yYSk7CisKKyNpZiAwCisJLyogT3B0aW9uYWw6IFAtVE1TSSBzaWduYXR1cmUgKi8KKwltc2diX3ZfcHV0KG1zZywgR1NNNDhfSUVfR01NX1BUTVNJX1NJRyk7CisJcHRzaWcgPSBtc2diX3B1dChtc2csIDMpOworCXB0c2lnWzBdID0gbW0tPnBfdG1zaV9zaWcgPj4gMTY7CisJcHRzaWdbMV0gPSBtbS0+cF90bXNpX3NpZyA+PiA4OworCXB0c2lnWzJdID0gbW0tPnBfdG1zaV9zaWcgJiAweGZmOworCisJLyogT3B0aW9uYWw6IE5lZ290aWF0ZWQgUmVhZHkgdGltZXIgdmFsdWUgKi8KKyNlbmRpZgorCisjaWZkZWYgUFRNU0lfQUxMT0MKKwkvKiBPcHRpb25hbDogQWxsb2NhdGVkIFAtVE1TSSAqLworCW1pZCA9IG1zZ2JfcHV0KG1zZywgR1NNNDhfTUlEX1RNU0lfTEVOKTsKKwlnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKG1pZCwgbW0tPnBfdG1zaSk7CisJbWlkWzBdID0gR1NNNDhfSUVfR01NX0FMTE9DX1BUTVNJOworI2VuZGlmCisKKwkvKiBPcHRpb25hbDogTVMtaWRlbnRpdHkgKGNvbWJpbmVkIGF0dGFjaCkgKi8KKwkvKiBPcHRpb25hbDogR01NIGNhdXNlIChwYXJ0aWFsIGF0dGFjaCByZXN1bHQgZm9yIGNvbWJpbmVkIGF0dGFjaCkgKi8KKworCXJldHVybiBnc200OF9nbW1fc2VuZG1zZyhtc2csIDAsIG1tKTsKK30KKworLyogQ2hhcHRlciA5LjQuNTogQXR0YWNoIHJlamVjdCAqLworc3RhdGljIGludCBfdHhfZ21tX2F0dF9yZWooc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBnbW1fY2F1c2UpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwlERUJVR1AoRE1NLCAiPC0gR1BSUyBBVFRBQ0ggUkVKRUNUXG4iKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX0FUVEFDSF9SRUo7CisJZ2gtPmRhdGFbMF0gPSBnbW1fY2F1c2U7CisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwLCBOVUxMKTsKK30KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX2F0dF9yZWpfb2xkbXNnKGNvbnN0IHN0cnVjdCBtc2diICpvbGRfbXNnLAorCQkJCQl1aW50OF90IGdtbV9jYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCWdtbV9jb3B5X2lkKG1zZywgb2xkX21zZyk7CisJcmV0dXJuIF90eF9nbW1fYXR0X3Jlaihtc2csIGdtbV9jYXVzZSk7Cit9CitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9hdHRfcmVqKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sCisJCQkJdWludDhfdCBnbW1fY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwltbWN0eDJtc2dpZChtc2csIG1tKTsKKwlyZXR1cm4gX3R4X2dtbV9hdHRfcmVqKG1zZywgZ21tX2NhdXNlKTsKK30KKworLyogQ2hhcHRlciA5LjQuNi4yIERldGFjaCBhY2NlcHQgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX2RldF9hY2soc3RydWN0IHNnc25fbW1fY3R4ICptbSwgdWludDhfdCBmb3JjZV9zdGJ5KQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwlERUJVR1AoRE1NLCAiPC0gR1BSUyBERVRBQ0ggQUNDRVBUXG4iKTsKKworCW1tY3R4Mm1zZ2lkKG1zZywgbW0pOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU1fR1BSUzsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9HTU1fREVUQUNIX0FDSzsKKwlnaC0+ZGF0YVswXSA9IGZvcmNlX3N0Ynk7CisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwLCBtbSk7Cit9CisKKy8qIFRyYW5zbWl0IENoYXB0ZXIgOS40LjEyIElkZW50aXR5IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX2lkX3JlcShzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLCB1aW50OF90IGlkX3R5cGUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCURFQlVHUChETU0sICI8LSBHUFJTIElERU5USVRZIFJFUVVFU1Q6IG1pX3R5cGU9JTAyeFxuIiwgaWRfdHlwZSk7CisKKwltbWN0eDJtc2dpZChtc2csIG1tKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NX0dQUlM7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR01NX0lEX1JFUTsKKwkvKiAxMC41LjUuOSBJRCB0eXBlIDIgKyBpZGVudGl0eSB0eXBlIGFuZCAxMC41LjUuNyAnZm9yY2UgdG8gc3RhbmRieScgSUUgKi8KKwlnaC0+ZGF0YVswXSA9IGlkX3R5cGUgJiAweGY7CisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAxLCBtbSk7Cit9CisKKy8qIENoZWNrIGlmIHdlIGNhbiBhbHJlYWR5IGF1dGhvcml6ZSBhIHN1YnNjcmliZXIgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfZ21tX2F1dGhvcml6ZShzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eCwKKwkJCQllbnVtIGdwcnNfdDMzNTBfbW9kZSB0MzM1MF9tb2RlKQoreworCWlmIChzdHJsZW4oY3R4LT5pbWVpKSAmJiBzdHJsZW4oY3R4LT5pbXNpKSkgeworI2lmZGVmIFBUTVNJX0FMTE9DCisJCS8qIFN0YXJ0IFQzMzUwIGFuZCByZS10cmFuc21pdCB1cCB0byA1IHRpbWVzIHVudGlsIEFUVEFDSCBDT01QTEVURSAqLworCQljdHgtPnQzMzUwX21vZGUgPSB0MzM1MF9tb2RlOworCQltbWN0eF90aW1lcl9zdGFydChjdHgsIDMzNTAsIEdTTTA0MDhfVDMzNTBfU0VDUyk7CisjZW5kaWYKKwkJY3R4LT5tbV9zdGF0ZSA9IEdNTV9SRUdJU1RFUkVEX05PUk1BTDsKKwkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9hdHRfYWNrKGN0eCk7CisJfSAKKwlpZiAoIXN0cmxlbihjdHgtPmltZWkpKSB7CisJCWN0eC0+bW1fc3RhdGUgPSBHTU1fQ09NTU9OX1BST0NfSU5JVDsKKwkJY3R4LT50MzM3MF9pZF90eXBlID0gR1NNX01JX1RZUEVfSU1FSTsKKwkJbW1jdHhfdGltZXJfc3RhcnQoY3R4LCAzMzcwLCBHU00wNDA4X1QzMzcwX1NFQ1MpOworCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX2lkX3JlcShjdHgsIEdTTV9NSV9UWVBFX0lNRUkpOworCX0KKworCWlmICghc3RybGVuKGN0eC0+aW1zaSkpIHsKKwkJY3R4LT5tbV9zdGF0ZSA9IEdNTV9DT01NT05fUFJPQ19JTklUOworCQljdHgtPnQzMzcwX2lkX3R5cGUgPSBHU01fTUlfVFlQRV9JTVNJOworCQltbWN0eF90aW1lcl9zdGFydChjdHgsIDMzNzAsIEdTTTA0MDhfVDMzNzBfU0VDUyk7CisJCXJldHVybiBnc200OF90eF9nbW1faWRfcmVxKGN0eCwgR1NNX01JX1RZUEVfSU1TSSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFBhcnNlIENoYXB0ZXIgOS40LjEzIElkZW50aXR5IFJlc3BvbnNlICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dtbV9pZF9yZXNwKHN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4LCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJdWludDhfdCBtaV90eXBlID0gZ2gtPmRhdGFbMV0gJiBHU01fTUlfVFlQRV9NQVNLOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksICZnaC0+ZGF0YVsxXSwgZ2gtPmRhdGFbMF0pOworCURFQlVHUChETU0sICItPiBHTU0gSURFTlRJVFkgUkVTUE9OU0U6IG1pX3R5cGU9MHglMDJ4IE1JKCVzKSAiLAorCQltaV90eXBlLCBtaV9zdHJpbmcpOworCisJaWYgKCFjdHgpIHsKKwkJREVCVUdQKERNTSwgImZyb20gdW5rbm93biBUTExJIDB4JTA4eD8hP1xuIiwgbXNnYl90bGxpKG1zZykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobWlfdHlwZSA9PSBjdHgtPnQzMzcwX2lkX3R5cGUpCisJCW1tY3R4X3RpbWVyX3N0b3AoY3R4LCAzMzcwKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJLyogd2UgYWxyZWFkeSBoYXZlIGEgbW0gY29udGV4dCB3aXRoIGN1cnJlbnQgVExMSSwgYnV0IG5vCisJCSAqIFAtVE1TSSAvIElNU0kgeWV0LiAgV2hhdCB3ZSBub3cgbmVlZCB0byBkbyBpcyB0byBmaWxsCisJCSAqIHRoaXMgaW5pdGlhbCBjb250ZXh0IHdpdGggZGF0YSBmcm9tIHRoZSBITFIgKi8KKwkJc3RybmNweShjdHgtPmltc2ksIG1pX3N0cmluZywgc2l6ZW9mKGN0eC0+aW1laSkpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUk6CisJCXN0cm5jcHkoY3R4LT5pbWVpLCBtaV9zdHJpbmcsIHNpemVvZihjdHgtPmltZWkpKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJU1Y6CisJCWJyZWFrOworCX0KKworCURFQlVHUEMoRE1NLCAiXG4iKTsKKwkvKiBDaGVjayBpZiB3ZSBjYW4gbGV0IHRoZSBtb2JpbGUgc3RhdGlvbiBlbnRlciAqLworCXJldHVybiBnc200OF9nbW1fYXV0aG9yaXplKGN0eCwgY3R4LT50MzM1MF9tb2RlKTsKK30KKworLyogU2VjdGlvbiA5LjQuMSBBdHRhY2ggcmVxdWVzdCAqLworc3RhdGljIGludCBnc200OF9yeF9nbW1fYXR0X3JlcShzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eCwgc3RydWN0IG1zZ2IgKm1zZywKKwkJCQlzdHJ1Y3QgZ3Byc19sbGNfbGxtZSAqbGxtZSkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCXVpbnQ4X3QgKmN1ciA9IGdoLT5kYXRhLCAqbXNuYywgKm1pLCAqb2xkX3JhX2luZm8sICptc19yYV9hY2NfY2FwOworCXVpbnQ4X3QgbXNuY19sZW4sIGF0dF90eXBlLCBtaV9sZW4sIG1pX3R5cGUsIG1zX3JhX2FjY19jYXBfbGVuOworCXVpbnQxNl90IGRyeF9wYXI7CisJdWludDMyX3QgdG1zaTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYV9pZDsKKwl1aW50MTZfdCBjaWQ7CisKKwlERUJVR1AoRE1NLCAiLT4gR01NIEFUVEFDSCBSRVFVRVNUICIpOworCisJLyogQXMgcGVyIFRTIDA0LjA4IENoYXB0ZXIgNC43LjEuNCwgdGhlIGF0dGFjaCByZXF1ZXN0IGFycml2ZXMgZWl0aGVyCisJICogd2l0aCBhIGZvcmVpZ24gVExMSSAoUC1UTVNJIHRoYXQgd2FzIGFsbG9jYXRlZCB0byB0aGUgTVMgYmVmb3JlKSwKKwkgKiBvciB3aXRoIHJhbmRvbSBUTExJLiAqLworCisJY2lkID0gYnNzZ3BfcGFyc2VfY2VsbF9pZCgmcmFfaWQsIG1zZ2JfYmNpZChtc2cpKTsKKworCS8qIE1TIG5ldHdvcmsgY2FwYWJpbGl0eSAxMC41LjUuMTIgKi8KKwltc25jX2xlbiA9ICpjdXIrKzsKKwltc25jID0gY3VyOworCWlmIChtc25jX2xlbiA+IDIpCisJCWdvdG8gZXJyX2ludmFsOworCWN1ciArPSBtc25jX2xlbjsKKworCS8qIGFUVEFDSCBUeXBlIDEwLjUuNS4yICovCisJYXR0X3R5cGUgPSAqY3VyKysgJiAweDBmOworCisJLyogRFJYIHBhcmFtZXRlciAxMC41LjUuNiAqLworCWRyeF9wYXIgPSAqY3VyKysgPDwgODsKKwlkcnhfcGFyIHw9ICpjdXIrKzsKKworCS8qIE1vYmlsZSBJZGVudGl0eSAoUC1UTVNJIG9yIElNU0kpIDEwLjUuMS40ICovCisJbWlfbGVuID0gKmN1cisrOworCW1pID0gY3VyOworCWlmIChtaV9sZW4gPiA4KQorCQlnb3RvIGVycl9pbnZhbDsKKwltaV90eXBlID0gKm1pICYgR1NNX01JX1RZUEVfTUFTSzsKKwljdXIgKz0gbWlfbGVuOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksIG1pLCBtaV9sZW4pOworCisJREVCVUdQQyhETU0sICJNSSglcykgdHlwZT1cIiVzXCIgIiwgbWlfc3RyaW5nLAorCQlnZXRfdmFsdWVfc3RyaW5nKGdwcnNfYXR0X3Rfc3RycywgYXR0X3R5cGUpKTsKKworCS8qIE9sZCByb3V0aW5nIGFyZWEgaWRlbnRpZmljYXRpb24gMTAuNS41LjE1ICovCisJb2xkX3JhX2luZm8gPSBjdXI7CisJY3VyICs9IDY7CisKKwkvKiBNUyBSYWRpbyBBY2Nlc3MgQ2FwYWJpbGl0eSAxMC41LjUuMTJhICovCisJbXNfcmFfYWNjX2NhcF9sZW4gPSAqY3VyKys7CisJbXNfcmFfYWNjX2NhcCA9IGN1cjsKKworCS8qIE9wdGlvbmFsOiBPbGQgUC1UTVNJIFNpZ25hdHVyZSwgUmVxdWVzdGVkIFJFQURZIHRpbWVyLCBUTVNJIFN0YXR1cyAqLworCisJc3dpdGNoIChtaV90eXBlKSB7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCQkvKiBUcnkgdG8gZmluZCBNTSBjb250ZXh0IGJhc2VkIG9uIElNU0kgKi8KKwkJaWYgKCFjdHgpCisJCQljdHggPSBzZ3NuX21tX2N0eF9ieV9pbXNpKG1pX3N0cmluZyk7CisJCWlmICghY3R4KSB7CisjaWYgMAorCQkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9hdHRfcmVqKG1zZywgR01NX0NBVVNFX0lNU0lfVU5LTk9XTik7CisjZWxzZQorCQkJLyogQXMgYSB0ZW1vcmFyeSBoYWNrLCB3ZSBzaW1wbHkgYXNzdW1lIHRoYXQgdGhlIElNU0kgZXhpc3RzICovCisJCQljdHggPSBzZ3NuX21tX2N0eF9hbGxvYygwLCAmcmFfaWQpOworCQkJaWYgKCFjdHgpCisJCQkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9hdHRfcmVqX29sZG1zZyhtc2csIEdNTV9DQVVTRV9ORVRfRkFJTCk7CisJCQlzdHJuY3B5KGN0eC0+aW1zaSwgbWlfc3RyaW5nLCBzaXplb2YoY3R4LT5pbXNpKSk7CisjZW5kaWYKKwkJfQorCQljdHgtPnRsbGkgPSBtc2diX3RsbGkobXNnKTsKKwkJY3R4LT5sbG1lID0gbGxtZTsKKwkJbXNnaWQybW1jdHgoY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCW1lbWNweSgmdG1zaSwgbWkrMSwgNCk7CisJCXRtc2kgPSBudG9obCh0bXNpKTsKKwkJLyogVHJ5IHRvIGZpbmQgTU0gY29udGV4dCBiYXNlZCBvbiBQLVRNU0kgKi8KKwkJaWYgKCFjdHgpCisJCQljdHggPSBzZ3NuX21tX2N0eF9ieV9wdG1zaSh0bXNpKTsKKwkJaWYgKCFjdHgpIHsKKwkJCWN0eCA9IHNnc25fbW1fY3R4X2FsbG9jKG1zZ2JfdGxsaShtc2cpLCAmcmFfaWQpOworCQkJY3R4LT5wX3Rtc2kgPSB0bXNpOworCQl9CisJCWN0eC0+dGxsaSA9IG1zZ2JfdGxsaShtc2cpOworCQljdHgtPmxsbWUgPSBsbG1lOworCQltc2dpZDJtbWN0eChjdHgsIG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1NLCBMT0dMX05PVElDRSwgIlJlamVjdGluZyBBVFRBQ0ggUkVRVUVTVCB3aXRoICIKKwkJCSJNSSB0eXBlICV1XG4iLCBtaV90eXBlKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9hdHRfcmVqX29sZG1zZyhtc2csIEdNTV9DQVVTRV9NU19JRF9OT1RfREVSSVZFRCk7CisJfQorCS8qIFVwZGF0ZSBNTSBDb250ZXh0IHdpdGggY3VycmllbnQgUkEgYW5kIENlbGwgSUQgKi8KKwljdHgtPnJhID0gcmFfaWQ7CisJY3R4LT5jZWxsX2lkID0gY2lkOworCS8qIFVwZGF0ZSBNTSBDb250ZXh0IHdpdGggb3RoZXIgZGF0YSAqLworCWN0eC0+ZHJ4X3Bhcm1zID0gZHJ4X3BhcjsKKwljdHgtPm1zX3JhZGlvX2FjY2Vzc19jYXBhLmxlbiA9IG1zX3JhX2FjY19jYXBfbGVuOworCW1lbWNweShjdHgtPm1zX3JhZGlvX2FjY2Vzc19jYXBhLmJ1ZiwgbXNfcmFfYWNjX2NhcCwgbXNfcmFfYWNjX2NhcF9sZW4pOworCWN0eC0+bXNfbmV0d29ya19jYXBhLmxlbiA9IG1zbmNfbGVuOworCW1lbWNweShjdHgtPm1zX25ldHdvcmtfY2FwYS5idWYsIG1zbmMsIG1zbmNfbGVuKTsKKworI2lmZGVmIFBUTVNJX0FMTE9DCisJLyogQWxsb2NhdGUgYSBuZXcgUC1UTVNJICgrIFAtVE1TSSBzaWduYXR1cmUpIGFuZCB1cGRhdGUgVExMSSAqLworCWN0eC0+cF90bXNpX29sZCA9IGN0eC0+cF90bXNpOworCWN0eC0+cF90bXNpID0gc2dzbl9hbGxvY19wdG1zaSgpOworI2VuZGlmCisJLyogRXZlbiBpZiB0aGVyZSBpcyBubyBQLVRNU0kgYWxsb2NhdGVkLCB0aGUgTVMgd2lsbCBzd2l0Y2ggZnJvbQorCSAqIGZvcmVpZ24gVExMSSB0byBsb2NhbCBUTExJICovCisJY3R4LT50bGxpX25ldyA9IGdwcnNfdG1zaTJ0bGxpKGN0eC0+cF90bXNpLCBUTExJX0xPQ0FMKTsKKworCS8qIEluZm9ybSBMTEMgbGF5ZXIgYWJvdXQgbmV3IFRMTEkgYnV0IGtlZXAgb2xkIGFjdGl2ZSAqLworCWdwcnNfbGxnbW1fYXNzaWduKGN0eC0+bGxtZSwgY3R4LT50bGxpLCBjdHgtPnRsbGlfbmV3LCAwLCBOVUxMKTsKKworCURFQlVHUEMoRE1NLCAiXG4iKTsKKwlyZXR1cm4gY3R4ID8gZ3NtNDhfZ21tX2F1dGhvcml6ZShjdHgsIEdNTV9UMzM1MF9NT0RFX0FUVCkgOiAwOworCitlcnJfaW52YWw6CisJREVCVUdQQyhETU0sICJcbiIpOworCXJldHVybiBnc200OF90eF9nbW1fYXR0X3Jlal9vbGRtc2cobXNnLCBHTU1fQ0FVU0VfU0VNX0lOQ09SUl9NU0cpOworfQorCisvKiBTZWN0aW9uIDQuNy40LjEgLyA5LjQuNS4yIE1PIERldGFjaCByZXF1ZXN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dtbV9kZXRfcmVxKHN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4LCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJdWludDhfdCBkZXRhY2hfdHlwZSwgcG93ZXJfb2ZmOworCisJZGV0YWNoX3R5cGUgPSBnaC0+ZGF0YVswXSAmIDB4NzsKKwlwb3dlcl9vZmYgPSBnaC0+ZGF0YVswXSAmIDB4ODsKKworCS8qIEZJWE1FOiBJbiAyNC4wMDggdGhlcmUgaXMgYW4gb3B0aW9uYWwgUC1UTVNJIGFuZCBQLVRNU0kgc2lnbmF0dXJlIElFICovCisKKwlERUJVR1AoRE1NLCAiLT4gR01NIERFVEFDSCBSRVFVRVNUIFRMTEk9MHglMDh4IHR5cGU9JXMgJXNcbiIsCisJCW1zZ2JfdGxsaShtc2cpLCBnZXRfdmFsdWVfc3RyaW5nKGdwcnNfZGV0X3RfbW9fc3RycywgZGV0YWNoX3R5cGUpLAorCQlwb3dlcl9vZmYgPyAiUG93ZXItb2ZmIiA6ICIiKTsKKworCS8qIE1hcmsgTU0gc3RhdGUgYXMgZGVyZWdpc3RlcmVkICovCisJY3R4LT5tbV9zdGF0ZSA9IEdNTV9ERVJFR0lTVEVSRUQ7CisKKwkvKiBmb3JjZV9zdGJ5ID0gMCAqLworCXJldHVybiBnc200OF90eF9nbW1fZGV0X2FjayhjdHgsIDApOworfQorCisvKiBDaGFwdGVyIDkuNC4xNTogUm91dGluZyBhcmVhIHVwZGF0ZSBhY2NlcHQgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ21tX3JhX3VwZF9hY2soc3RydWN0IHNnc25fbW1fY3R4ICptbSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc200OF9yYV91cGRfYWNrICpydWE7CisJdWludDhfdCAqbWlkOworCisJREVCVUdQKERNTSwgIjwtIFJPVVRJTkcgQVJFQSBVUERBVEUgQUNDRVBUXG4iKTsKKworCW1tY3R4Mm1zZ2lkKG1zZywgbW0pOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dNTV9SQV9VUERfQUNLOworCisJcnVhID0gKHN0cnVjdCBnc200OF9yYV91cGRfYWNrICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpydWEpKTsKKwlydWEtPmZvcmNlX3N0YnkgPSAwOwkvKiBub3QgaW5kaWNhdGVkICovCisJcnVhLT51cGRfcmVzdWx0ID0gMDsJLyogUkEgdXBkYXRlZCAqLworCXJ1YS0+cmFfdXBkX3RpbWVyID0gR1BSU19UTVJfTUlOVVRFIHwgMTA7CisKKwlnc200OF9jb25zdHJ1Y3RfcmEocnVhLT5yYV9pZC5kaWdpdHMsICZtbS0+cmEpOworCisjaWYgMAorCS8qIE9wdGlvbmFsOiBQLVRNU0kgc2lnbmF0dXJlICovCisJbXNnYl92X3B1dChtc2csIEdTTTQ4X0lFX0dNTV9QVE1TSV9TSUcpOworCXB0c2lnID0gbXNnYl9wdXQobXNnLCAzKTsKKwlwdHNpZ1swXSA9IG1tLT5wX3Rtc2lfc2lnID4+IDE2OworCXB0c2lnWzFdID0gbW0tPnBfdG1zaV9zaWcgPj4gODsKKwlwdHNpZ1syXSA9IG1tLT5wX3Rtc2lfc2lnICYgMHhmZjsKKyNlbmRpZgorCisjaWZkZWYgUFRNU0lfQUxMT0MKKwkvKiBPcHRpb25hbDogQWxsb2NhdGVkIFAtVE1TSSAqLworCW1pZCA9IG1zZ2JfcHV0KG1zZywgR1NNNDhfTUlEX1RNU0lfTEVOKTsKKwlnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKG1pZCwgbW0tPnBfdG1zaSk7CisJbWlkWzBdID0gR1NNNDhfSUVfR01NX0FMTE9DX1BUTVNJOworI2VuZGlmCisKKwkvKiBPcHRpb246IE1TIElELCAuLi4gKi8KKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwLCBtbSk7Cit9CisKKy8qIENoYXB0ZXIgOS40LjE3OiBSb3V0aW5nIGFyZWEgdXBkYXRlIHJlamVjdCAqLworc3RhdGljIGludCBnc200OF90eF9nbW1fcmFfdXBkX3JlaihzdHJ1Y3QgbXNnYiAqb2xkX21zZywgdWludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJREVCVUdQKERNTSwgIjwtIFJPVVRJTkcgQVJFQSBVUERBVEUgUkVKRUNUXG4iKTsKKworCWdtbV9jb3B5X2lkKG1zZywgb2xkX21zZyk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAyKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dNTV9SQV9VUERfUkVKOworCWdoLT5kYXRhWzBdID0gY2F1c2U7CisJZ2gtPmRhdGFbMV0gPSAwOyAvKiA/ICovCisKKwkvKiBPcHRpb246IFAtVE1TSSBzaWduYXR1cmUsIGFsbG9jYXRlZCBQLVRNU0ksIE1TIElELCAuLi4gKi8KKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19tc19jdHhfc3RhdHVzKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsCisJCQkJICB1aW50MTZfdCBwZHBfc3RhdHVzKQoreworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcCwgKnBkcDI7CisJLyogMjQuMDA4IDQuNy41LjEuMzogSWYgdGhlIFBEUCBjb250ZXh0IHN0YXR1cyBpbmZvcm1hdGlvbiBlbGVtZW50IGlzCisJICogaW5jbHVkZWQgaW4gUk9VVElORyBBUkVBIFVQREFURSBSRVFVRVNUIG1lc3NhZ2UsIHRoZW4gdGhlIG5ldHdvcmsKKwkgKiBzaGFsbCBkZWFjdGl2YXRlIGFsbCB0aG9zZSBQRFAgY29udGV4dHMgbG9jYWxseSAod2l0aG91dCBwZWVyIHRvCisJICogcGVlciBzaWduYWxsaW5nIGJldHdlZW4gdGhlIE1TIGFuZCB0aGUgbmV0d29yayksIHdoaWNoIGFyZSBub3QgaW4gU00KKwkgKiBzdGF0ZSBQRFAtSU5BQ1RJVkUgb24gbmV0d29yayBzaWRlIGJ1dCBhcmUgaW5kaWNhdGVkIGJ5IHRoZSBNUyBhcworCSAqIGJlaW5nIGluIHN0YXRlIFBEUC1JTkFDVElWRS4gKi8KKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGRwLCBwZHAyLCAmbW1jdHgtPnBkcF9saXN0LCBsaXN0KSB7CisJCWlmICghKHBkcF9zdGF0dXMgJiAoMSA8PCBwZHAtPm5zYXBpKSkpIHsKKwkJCUxPR1AoRE1NLCBMT0dMX05PVElDRSwgIkRyb3BwaW5nIFBEUCBjb250ZXh0IGZvciBOU0FQST0ldSAiCisJCQkJImR1ZSB0byBQRFAgQ1RYIFNUQVRVUyBJRT0gMHglMDR4XG4iLAorCQkJCXBkcC0+bnNhcGksIHBkcF9zdGF0dXMpOworCQkJc2dzbl9kZWxldGVfcGRwX2N0eChwZHApOworCQl9CisJfQorfQorCisvKiBDaGFwdGVyIDkuNC4xNDogUm91dGluZyBhcmVhIHVwZGF0ZSByZXF1ZXN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dtbV9yYV91cGRfcmVxKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsIHN0cnVjdCBtc2diICptc2csCisJCQkJICAgc3RydWN0IGdwcnNfbGxjX2xsbWUgKmxsbWUpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwl1aW50OF90ICpjdXIgPSBnaC0+ZGF0YTsKKwl1aW50OF90ICptc19yYV9hY2NfY2FwOworCXVpbnQ4X3QgbXNfcmFfYWNjX2NhcF9sZW47CisJc3RydWN0IGdwcnNfcmFfaWQgb2xkX3JhX2lkOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXVpbnQ4X3QgdXBkX3R5cGU7CisJaW50IHJjOworCisJLyogVXBkYXRlIFR5cGUgMTAuNS41LjE4ICovCisJdXBkX3R5cGUgPSAqY3VyKysgJiAweDBmOworCisJREVCVUdQKERNTSwgIi0+IEdNTSBSQSBVUERBVEUgUkVRVUVTVCB0eXBlPVwiJXNcIiAiLAorCQlnZXRfdmFsdWVfc3RyaW5nKGdwcnNfdXBkX3Rfc3RycywgdXBkX3R5cGUpKTsKKworCS8qIE9sZCByb3V0aW5nIGFyZWEgaWRlbnRpZmljYXRpb24gMTAuNS41LjE1ICovCisJZ3NtNDhfcGFyc2VfcmEoJm9sZF9yYV9pZCwgY3VyKTsKKwljdXIgKz0gNjsKKworCS8qIE1TIFJhZGlvIEFjY2VzcyBDYXBhYmlsaXR5IDEwLjUuNS4xMmEgKi8KKwltc19yYV9hY2NfY2FwX2xlbiA9ICpjdXIrKzsKKwltc19yYV9hY2NfY2FwID0gY3VyOworCisJLyogT3B0aW9uYWw6IE9sZCBQLVRNU0kgU2lnbmF0dXJlLCBSZXF1ZXN0ZWQgUkVBRFkgdGltZXIsIFRNU0kgU3RhdHVzLAorCSAqIERSWCBwYXJhbWV0ZXIsIE1TIG5ldHdvcmsgY2FwYWJpbGl0eSAqLworCXJjID0gdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2dtbV9hdHRfdGx2ZGVmLCBjdXIsCisJCQkobXNnLT5kYXRhICsgbXNnLT5sZW4pIC0gY3VyLCAwLCAwKTsKKworCXN3aXRjaCAodXBkX3R5cGUpIHsKKwljYXNlIEdQUlNfVVBEX1RfUkFfTEE6CisJY2FzZSBHUFJTX1VQRF9UX1JBX0xBX0lNU0lfQVRUOgorCQlERUJVR1BDKERNTSwgIiB1bnN1cHBvcnRlZCBpbiBNb2RlIElJSSwgaXMgeW91ciBTSTEzIGNvcnJ1cHQ/XG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9yYV91cGRfcmVqKG1zZywgR01NX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMpOworCQlicmVhazsKKwljYXNlIEdQUlNfVVBEX1RfUkE6CisJY2FzZSBHUFJTX1VQRF9UX1BFUklPRElDOgorCQlicmVhazsKKwl9CisKKwkvKiBMb29rLXVwIHRoZSBNTSBjb250ZXh0IGJhc2VkIG9uIG9sZCBSQS1JRCBhbmQgVExMSSAqLworCWlmICghbW1jdHggfHwgbW1jdHgtPm1tX3N0YXRlID09IEdNTV9ERVJFR0lTVEVSRUQpIHsKKwkJLyogVGhlIE1TIGhhcyB0byBwZXJmb3JtIEdQUlMgYXR0YWNoICovCisJCURFQlVHUEMoRE1NLCAiIFJFSkVDVFxuIik7CisJCS8qIERldmljZSBpcyBzdGlsbCBJTVNJIGF0YWNoZWQgZm9yIENTIGJ1dCBpbml0aWF0ZSBHUFJTIEFUVEFDSCAqLworCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX3JhX3VwZF9yZWoobXNnLCBHTU1fQ0FVU0VfTVNfSURfTk9UX0RFUklWRUQpOworCX0KKworCS8qIFVwZGF0ZSB0aGUgTU0gY29udGV4dCB3aXRoIHRoZSBuZXcgUkEtSUQgKi8KKwlic3NncF9wYXJzZV9jZWxsX2lkKCZtbWN0eC0+cmEsIG1zZ2JfYmNpZChtc2cpKTsKKwkvKiBVcGRhdGUgdGhlIE1NIGNvbnRleHQgd2l0aCB0aGUgbmV3IFRMTEkgKi8KKwltbWN0eC0+dGxsaSA9IG1zZ2JfdGxsaShtc2cpOworCS8qIEZJWE1FOiBVcGRhdGUgdGhlIE1NIGNvbnRleHQgd2l0aCB0aGUgTVMgcmFkaW8gYWNjIGNhcGFiaWxpdGllcyAqLworCS8qIEZJWE1FOiBVcGRhdGUgdGhlIE1NIGNvbnRleHQgd2l0aCB0aGUgTVMgbmV0d29yayBjYXBhYmlsaXRpZXMgKi8KKworCXJhdGVfY3RyX2luYygmbW1jdHgtPmN0cmctPmN0cltHTU1fQ1RSX1JBX1VQREFURV0pOworCisJREVCVUdQQyhETU0sICIgQUNDRVBUXG4iKTsKKyNpZmRlZiBQVE1TSV9BTExPQworCW1tY3R4LT5wX3Rtc2lfb2xkID0gbW1jdHgtPnBfdG1zaTsKKwltbWN0eC0+cF90bXNpID0gc2dzbl9hbGxvY19wdG1zaSgpOworCS8qIFN0YXJ0IFQzMzUwIGFuZCByZS10cmFuc21pdCB1cCB0byA1IHRpbWVzIHVudGlsIEFUVEFDSCBDT01QTEVURSAqLworCW1tY3R4LT50MzM1MF9tb2RlID0gR01NX1QzMzUwX01PREVfUkFVOworCW1tY3R4X3RpbWVyX3N0YXJ0KG1tY3R4LCAzMzUwLCBHU00wNDA4X1QzMzUwX1NFQ1MpOworI2VuZGlmCisJLyogRXZlbiBpZiB0aGVyZSBpcyBubyBQLVRNU0kgYWxsb2NhdGVkLCB0aGUgTVMgd2lsbCBzd2l0Y2ggZnJvbQorCSAqIGZvcmVpZ24gVExMSSB0byBsb2NhbCBUTExJICovCisJbW1jdHgtPnRsbGlfbmV3ID0gZ3Byc190bXNpMnRsbGkobW1jdHgtPnBfdG1zaSwgVExMSV9MT0NBTCk7CisKKwkvKiBJbmZvcm0gTExDIGxheWVyIGFib3V0IG5ldyBUTExJIGJ1dCBrZWVwIG9sZCBhY3RpdmUgKi8KKwlncHJzX2xsZ21tX2Fzc2lnbihtbWN0eC0+bGxtZSwgbW1jdHgtPnRsbGksIG1tY3R4LT50bGxpX25ldywgMCwgTlVMTCk7CisKKwkvKiBMb29rIGF0IFBEUCBDb250ZXh0IFN0YXR1cyBJRSBhbmQgc2VlIGlmIE1TJ3MgdmlldyBvZgorCSAqIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBOU0FQSXMgYWdyZWVzIHdpdGggb3VyIHZpZXcgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfR01NX1BEUF9DVFhfU1RBVFVTKSkgeworCQl1aW50MTZfdCBwZHBfc3RhdHVzID0gbnRvaHMoKih1aW50MTZfdCAqKQorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfR01NX1BEUF9DVFhfU1RBVFVTKSk7CisJCXByb2Nlc3NfbXNfY3R4X3N0YXR1cyhtbWN0eCwgcGRwX3N0YXR1cyk7CisJfQorCisJLyogU2VuZCBSQSBVUERBVEUgQUNDRVBUICovCisJcmV0dXJuIGdzbTQ4X3R4X2dtbV9yYV91cGRfYWNrKG1tY3R4KTsKK30KKworc3RhdGljIGludCBnc200OF9yeF9nbW1fc3RhdHVzKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRE1NLCAiLT4gR1BSUyBNTSBTVEFUVVMgKGNhdXNlOiAlcylcbiIsCisJCWdldF92YWx1ZV9zdHJpbmcoZ21tX2NhdXNlX25hbWVzLCBnaC0+ZGF0YVswXSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdQUlMgTW9iaWxpdHkgTWFuYWdlbWVudCAqLworc3RhdGljIGludCBnc20wNDA4X3Jjdl9nbW0oc3RydWN0IHNnc25fbW1fY3R4ICptbWN0eCwgc3RydWN0IG1zZ2IgKm1zZywKKwkJCSAgIHN0cnVjdCBncHJzX2xsY19sbG1lICpsbG1lKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJaW50IHJjOworCisJLyogTU1DVFggY2FuIGJlIE5VTEwgd2hlbiBjYWxsZWQgKi8KKworCWlmICghbW1jdHggJiYKKwkgICAgZ2gtPm1zZ190eXBlICE9IEdTTTQ4X01UX0dNTV9BVFRBQ0hfUkVRICYmCisJICAgIGdoLT5tc2dfdHlwZSAhPSBHU000OF9NVF9HTU1fUkFfVVBEX1JFUSkgeworCQlMT0dQKERNTSwgTE9HTF9OT1RJQ0UsICJDYW5ub3QgaGFuZGxlIEdNTSBmb3IgdW5rbm93biBNTSBDVFhcbiIpOworCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX3N0YXR1c19vbGRtc2cobXNnLCBHTU1fQ0FVU0VfTVNfSURfTk9UX0RFUklWRUQpOworCX0KKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlKSB7CisJY2FzZSBHU000OF9NVF9HTU1fUkFfVVBEX1JFUToKKwkJcmMgPSBnc200OF9yeF9nbW1fcmFfdXBkX3JlcShtbWN0eCwgbXNnLCBsbG1lKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HTU1fQVRUQUNIX1JFUToKKwkJcmMgPSBnc200OF9yeF9nbW1fYXR0X3JlcShtbWN0eCwgbXNnLCBsbG1lKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HTU1fSURfUkVTUDoKKwkJcmMgPSBnc200OF9yeF9nbW1faWRfcmVzcChtbWN0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HTU1fU1RBVFVTOgorCQlyYyA9IGdzbTQ4X3J4X2dtbV9zdGF0dXMobW1jdHgsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR01NX0RFVEFDSF9SRVE6CisJCXJjID0gZ3NtNDhfcnhfZ21tX2RldF9yZXEobW1jdHgsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR01NX0FUVEFDSF9DT01QTDoKKwkJLyogb25seSBpbiBjYXNlIFNHU04gb2ZmZXJlZCBuZXcgUC1UTVNJICovCisJCURFQlVHUChETU0sICItPiBBVFRBQ0ggQ09NUExFVEVcbiIpOworCQltbWN0eF90aW1lcl9zdG9wKG1tY3R4LCAzMzUwKTsKKwkJbW1jdHgtPnBfdG1zaV9vbGQgPSAwOworCQkvKiBVbmFzc2lnbiB0aGUgb2xkIFRMTEkgKi8KKwkJbW1jdHgtPnRsbGkgPSBtbWN0eC0+dGxsaV9uZXc7CisJCS8vZ3Byc19sbGdtbV9hc3NpZ24obW1jdHgtPmxsbWUsIDB4ZmZmZmZmZmYsIG1tY3R4LT50bGxpX25ldywgMCwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR01NX1JBX1VQRF9DT01QTDoKKwkJLyogb25seSBpbiBjYXNlIFNHU04gb2ZmZXJlZCBuZXcgUC1UTVNJICovCisJCURFQlVHUChETU0sICItPiBST1VURUlORyBBUkVBIFVQREFURSBDT01QTEVURVxuIik7CisJCW1tY3R4X3RpbWVyX3N0b3AobW1jdHgsIDMzNTApOworCQltbWN0eC0+cF90bXNpX29sZCA9IDA7CisJCS8qIFVuYXNzaWduIHRoZSBvbGQgVExMSSAqLworCQltbWN0eC0+dGxsaSA9IG1tY3R4LT50bGxpX25ldzsKKwkJLy9ncHJzX2xsZ21tX2Fzc2lnbihtbWN0eC0+bGxtZSwgMHhmZmZmZmZmZiwgbW1jdHgtPnRsbGlfbmV3LCAwLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HTU1fUFRNU0lfUkVBTExfQ09NUEw6CisJCURFQlVHUChETU0sICItPiBQVE1TSSBSRUFMTExJQ0FUSU9OIENPTVBMRVRFXG4iKTsKKwkJbW1jdHhfdGltZXJfc3RvcChtbWN0eCwgMzM1MCk7CisJCW1tY3R4LT5wX3Rtc2lfb2xkID0gMDsKKwkJLyogVW5hc3NpZ24gdGhlIG9sZCBUTExJICovCisJCW1tY3R4LT50bGxpID0gbW1jdHgtPnRsbGlfbmV3OworCQkvL2dwcnNfbGxnbW1fYXNzaWduKG1tY3R4LT5sbG1lLCAweGZmZmZmZmZmLCBtbWN0eC0+dGxsaV9uZXcsIDAsIE5VTEwpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dNTV9BVVRIX0NJUEhfUkVTUDoKKwkJREVCVUdQKERNTSwgIlVuaW1wbGVtZW50ZWQgR1NNIDA0LjA4IEdNTSBtc2cgdHlwZSAweCUwMnhcbiIsCisJCQlnaC0+bXNnX3R5cGUpOworCQlyYyA9IGdzbTQ4X3R4X2dtbV9zdGF0dXMobW1jdHgsIEdNTV9DQVVTRV9NU0dUX05PVEVYSVNUX05PVElNUEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRE1NLCAiVW5rbm93biBHU00gMDQuMDggR01NIG1zZyB0eXBlIDB4JTAyeFxuIiwKKwkJCWdoLT5tc2dfdHlwZSk7CisJCXJjID0gZ3NtNDhfdHhfZ21tX3N0YXR1cyhtbWN0eCwgR01NX0NBVVNFX01TR1RfTk9URVhJU1RfTk9USU1QTCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbW1jdHhfdGltZXJfY2Iodm9pZCAqX21tKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqbW0gPSBfbW07CisKKwltbS0+bnVtX1RfZXhwKys7CisKKwlzd2l0Y2ggKG1tLT5UKSB7CisJY2FzZSAzMzUwOgkvKiB3YWl0aW5nIGZvciBBVFRBQ0ggQ09NUExFVEUgKi8KKwkJaWYgKG1tLT5udW1fVF9leHAgPj0gNSkgeworCQkJTE9HUChETU0sIExPR0xfTk9USUNFLCAiVDMzNTAgZXhwaXJlZCA+PSA1IHRpbWVzXG4iKTsKKwkJCW1tLT5tbV9zdGF0ZSA9IEdNTV9ERVJFR0lTVEVSRUQ7CisJCQkvKiBGSVhNRTogc2hvdWxkIHdlIHJldHVybiBzb21lIGVycm9yPyAqLworCQkJYnJlYWs7CisJCX0KKwkJLyogcmUtdHJhbnNtaXQgdGhlIHJlc3BlY3RpdmUgbXNnIGFuZCByZS1zdGFydCB0aW1lciAqLworCQlzd2l0Y2ggKG1tLT50MzM1MF9tb2RlKSB7CisJCWNhc2UgR01NX1QzMzUwX01PREVfQVRUOgorCQkJZ3NtNDhfdHhfZ21tX2F0dF9hY2sobW0pOworCQkJYnJlYWs7CisJCWNhc2UgR01NX1QzMzUwX01PREVfUkFVOgorCQkJZ3NtNDhfdHhfZ21tX3JhX3VwZF9hY2sobW0pOworCQkJYnJlYWs7CisJCWNhc2UgR01NX1QzMzUwX01PREVfUFRNU0lfUkVBTEw6CisJCQkvKiBGSVhNRSAqLworCQkJYnJlYWs7CisJCX0KKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZtbS0+dGltZXIsIEdTTTA0MDhfVDMzNTBfU0VDUywgMCk7CisJCWJyZWFrOworCWNhc2UgMzM3MDoJLyogd2FpdGluZyBmb3IgSURFTlRJVFkgUkVTUE9OU0UgKi8KKwkJaWYgKG1tLT5udW1fVF9leHAgPj0gNSkgeworCQkJTE9HUChETU0sIExPR0xfTk9USUNFLCAiVDMzNzAgZXhwaXJlZCA+PSA1IHRpbWVzXG4iKTsKKwkJCWdzbTQ4X3R4X2dtbV9hdHRfcmVqKG1tLCBHTU1fQ0FVU0VfTVNfSURfTk9UX0RFUklWRUQpOworCQkJbW0tPm1tX3N0YXRlID0gR01NX0RFUkVHSVNURVJFRDsKKwkJCWJyZWFrOworCQl9CisJCS8qIHJlLXRyYW5taXQgSURFTlRJVFkgUkVRVUVTVCBhbmQgcmUtc3RhcnQgdGltZXIgKi8KKwkJZ3NtNDhfdHhfZ21tX2lkX3JlcShtbSwgbW0tPnQzMzcwX2lkX3R5cGUpOworCQlic2Nfc2NoZWR1bGVfdGltZXIoJm1tLT50aW1lciwgR1NNMDQwOF9UMzM3MF9TRUNTLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETU0sIExPR0xfRVJST1IsICJ0aW1lciBleHBpcmVkIGluIHVua25vd24gbW9kZSAldVxuIiwKKwkJCW1tLT5UKTsKKwl9Cit9CisKKy8qIEdQUlMgU0VTU0lPTiBNQU5BR0VNRU5UICovCisKK3N0YXRpYyB2b2lkIG1zZ2JfcHV0X3BkcF9hZGRyX2lwdjQoc3RydWN0IG1zZ2IgKm1zZywgdWludDMyX3QgaXBhZGRyKQoreworCXVpbnQ4X3Qgdls2XTsKKworCXZbMF0gPSBQRFBfVFlQRV9PUkdfSUVURjsKKwl2WzFdID0gUERQX1RZUEVfTl9JRVRGX0lQdjQ7CisJKih1aW50MzJfdCAqKSh2KzIpID0gaHRvbmwoaXBhZGRyKTsKKworCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0dTTV9QRFBfQUREUiwgc2l6ZW9mKHYpLCB2KTsKK30KKworc3RhdGljIHZvaWQgbXNnYl9wdXRfcGRwX2FkZHJfcHBwKHN0cnVjdCBtc2diICptc2cpCit7CisJdWludDhfdCB2WzJdOworCisJdlswXSA9IFBEUF9UWVBFX09SR19FVFNJOworCXZbMV0gPSBQRFBfVFlQRV9OX0VUU0lfUFBQOworCisJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfR1NNX1BEUF9BRERSLCBzaXplb2YodiksIHYpOworfQorCisvKiBTZWN0aW9uIDkuNS4yOiBBdGl2YXRlIFBEUCBDb250ZXh0IEFjY2VwdCAqLworaW50IGdzbTQ4X3R4X2dzbV9hY3RfcGRwX2FjYyhzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHApCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1aW50OF90IHRyYW5zYWN0aW9uX2lkID0gcGRwLT50aSBeIDB4ODsgLyogZmxpcCAqLworCisJREVCVUdQKERNTSwgIjwtIEFDVElWQVRFIFBEUCBDT05URVhUIEFDS1xuIik7CisKKwltbWN0eDJtc2dpZChtc2csIHBkcC0+bW0pOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19TTV9HUFJTIHwgKHRyYW5zYWN0aW9uX2lkIDw8IDQpOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dTTV9BQ1RfUERQX0FDSzsKKworCS8qIE5lZ290aWF0ZWQgTExDIFNBUEkgKi8KKwltc2diX3ZfcHV0KG1zZywgcGRwLT5zYXBpKTsKKworCS8qIEZJWE1FOiBjb3B5IFFvUyBwYXJhbWV0ZXJzIGZyb20gb3JpZ2luYWwgcmVxdWVzdCAqLworCS8vbXNnYl9sdl9wdXQobXNnLCBwZHAtPmxpYi0+cW9zX25lZy5sLCBwZHAtPmxpYi0+cW9zX25lZy52KTsKKwltc2diX2x2X3B1dChtc2csIHNpemVvZihkZWZhdWx0X3FvcyksICh1aW50OF90ICopJmRlZmF1bHRfcW9zKTsKKworCS8qIFJhZGlvIHByaW9yaXR5IDEwLjUuNy4yICovCisJbXNnYl92X3B1dChtc2csIHBkcC0+bGliLT5yYWRpb19wcmkpOworCisJLyogUERQIGFkZHJlc3MgKi8KKwkvKiBIaWdoZXN0IDQgYml0cyBvZiBmaXJzdCBieXRlIG5lZWQgdG8gYmUgc2V0IHRvIDEsIG90aGVyd2lzZQorCSAqIHRoZSBJRSBpcyBpZGVudGljYWwgd2l0aCB0aGUgMDQuMDggUERQIEFkZHJlc3MgSUUgKi8KKwlwZHAtPmxpYi0+ZXVhLnZbMF0gJj0gfjB4ZjA7CisJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfR1NNX1BEUF9BRERSLAorCQkgICAgIHBkcC0+bGliLT5ldWEubCwgcGRwLT5saWItPmV1YS52KTsKKwlwZHAtPmxpYi0+ZXVhLnZbMF0gfD0gMHhmMDsKKworCS8qIE9wdGlvbmFsOiBQcm90b2NvbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgKEZJWE1FOiB3aHkgJ3JlcScpICovCisJaWYgKHBkcC0+bGliLT5wY29fcmVxLmwgJiYgcGRwLT5saWItPnBjb19yZXEudikKKwkJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfR1NNX1BST1RPX0NPTkZfT1BULAorCQkJICAgICBwZHAtPmxpYi0+cGNvX3JlcS5sLCBwZHAtPmxpYi0+cGNvX3JlcS52KTsKKworCS8qIE9wdGlvbmFsOiBQYWNrZXQgRmxvdyBJZGVudGlmaWVyICovCisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwLCBwZHAtPm1tKTsKK30KKworLyogU2VjdGlvbiA5LjUuMzogQWN0aXZhdGUgUERQIENvbnRleHQgcmVqZWN0ICovCitpbnQgZ3NtNDhfdHhfZ3NtX2FjdF9wZHBfcmVqKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sIHVpbnQ4X3QgdGlkLAorCQkJICAgICB1aW50OF90IGNhdXNlLCB1aW50OF90IHBjb19sZW4sIHVpbnQ4X3QgKnBjb192KQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJdWludDhfdCB0cmFuc2FjdGlvbl9pZCA9IHRpZCBeIDB4ODsgLyogZmxpcCAqLworCisJREVCVUdQKERNTSwgIjwtIEFDVElWQVRFIFBEUCBDT05URVhUIFJFSihjYXVzZT0ldSlcbiIsIGNhdXNlKTsKKworCW1tY3R4Mm1zZ2lkKG1zZywgbW0pOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19TTV9HUFJTIHwgKHRyYW5zYWN0aW9uX2lkIDw8IDQpOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dTTV9BQ1RfUERQX1JFSjsKKworCW1zZ2Jfdl9wdXQobXNnLCBjYXVzZSk7CisJaWYgKHBjb19sZW4gJiYgcGNvX3YpCisJCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0dTTV9QUk9UT19DT05GX09QVCwgcGNvX2xlbiwgcGNvX3YpOworCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCwgbW0pOworfQorCisvKiBTZWN0aW9uIDkuNS45OiBEZWFjdGl2YXRlIFBEUCBDb250ZXh0IEFjY2VwdCAqLworc3RhdGljIGludCBfZ3NtNDhfdHhfZ3NtX2RlYWN0X3BkcF9hY2Moc3RydWN0IHNnc25fbW1fY3R4ICptbSwgdWludDhfdCB0aWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1aW50OF90IHRyYW5zYWN0aW9uX2lkID0gdGlkIF4gMHg4OyAvKiBmbGlwICovCisKKwlERUJVR1AoRE1NLCAiPC0gREVBQ1RJVkFURSBQRFAgQ09OVEVYVCBBQ0tcbiIpOworCisJbW1jdHgybXNnaWQobXNnLCBtbSk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1NNX0dQUlMgfCAodHJhbnNhY3Rpb25faWQgPDwgNCk7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfR1NNX0RFQUNUX1BEUF9BQ0s7CisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwLCBtbSk7Cit9CitpbnQgZ3NtNDhfdHhfZ3NtX2RlYWN0X3BkcF9hY2Moc3RydWN0IHNnc25fcGRwX2N0eCAqcGRwKQoreworCXJldHVybiBfZ3NtNDhfdHhfZ3NtX2RlYWN0X3BkcF9hY2MocGRwLT5tbSwgcGRwLT50aSk7Cit9CisKKy8qIFNlY3Rpb24gOS41LjE6IEFjdGl2YXRlIFBEUCBDb250ZXh0IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfZ3NtX2FjdF9wZHBfcmVxKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsCisJCQkJICAgIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfYWN0X3BkcF9jdHhfcmVxICphY3RfcmVxID0gKHN0cnVjdCBnc200OF9hY3RfcGRwX2N0eF9yZXEgKikgZ2gtPmRhdGE7CisJdWludDhfdCByZXFfcW9zX2xlbiwgcmVxX3BkcGFfbGVuOworCXVpbnQ4X3QgKnJlcV9xb3MsICpyZXFfcGRwYTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwl1aW50OF90IHRyYW5zYWN0aW9uX2lkID0gKGdoLT5wcm90b19kaXNjciA+PiA0KTsKKwlzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHA7CisKKwltZW1zZXQoJnRwLCAwLCBzaXplb2YodHApKTsKKworCURFQlVHUChETU0sICItPiBBQ1RJVkFURSBQRFAgQ09OVEVYVCBSRVE6IFNBUEk9JXUgTlNBUEk9JXUgIiwKKwkJYWN0X3JlcS0+cmVxX2xsY19zYXBpLCBhY3RfcmVxLT5yZXFfbnNhcGkpOworCisJcmF0ZV9jdHJfaW5jKCZtbWN0eC0+Y3RyZy0+Y3RyW0dNTV9DVFJfUERQX0NUWF9BQ1RdKTsKKworCXJlcV9xb3NfbGVuID0gYWN0X3JlcS0+ZGF0YVswXTsKKwlyZXFfcW9zID0gYWN0X3JlcS0+ZGF0YSArIDE7CS8qIDEwLjUuNi41ICovCisJcmVxX3BkcGFfbGVuID0gYWN0X3JlcS0+ZGF0YVsxICsgcmVxX3Fvc19sZW5dOworCXJlcV9wZHBhID0gYWN0X3JlcS0+ZGF0YSArIDEgKyByZXFfcW9zX2xlbiArIDE7CS8qIDEwLjUuNi40ICovCisKKwlzd2l0Y2ggKHJlcV9wZHBhWzBdICYgMHhmKSB7CisJY2FzZSAweDA6CisJCURFQlVHUEMoRE1NLCAiRVRTSSAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDE6CisJCURFQlVHUEMoRE1NLCAiSUVURiAiKTsKKwkJYnJlYWs7CisJY2FzZSAweGY6CisJCURFQlVHUEMoRE1NLCAiRW1wdHkgIik7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAocmVxX3BkcGFbMV0pIHsKKwljYXNlIDB4MjE6CisJCURFQlVHUEMoRE1NLCAiSVB2NCAiKTsKKwkJaWYgKHJlcV9wZHBhX2xlbiA+PSA2KSB7CisJCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKwkJCWlhLnNfYWRkciA9IG50b2hsKCooKHVpbnQzMl90ICopIChyZXFfcGRwYSsyKSkpOworCQkJREVCVUdQQyhETU0sICIlcyAiLCBpbmV0X250b2EoaWEpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4NTc6CisJCURFQlVHUEMoRE1NLCAiSVB2NiAiKTsKKwkJaWYgKHJlcV9wZHBhX2xlbiA+PSAxOCkgeworCQkJLyogRklYTUU6IHByaW50IElQdjYgYWRkcmVzcyAqLworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CQorCQlERUJVR1BDKERNTSwgIjB4JTAyeCAiLCByZXFfcGRwYVsxXSk7CisJCWJyZWFrOworCX0KKworCURFQlVHUEMoRE1NLCAiXG4iKTsKKworCS8qIHB1dCB0aGUgbm9uLVRMViBlbGVtZW50cyBpbiB0aGUgVExWIHBhcnNlciBzdHJ1Y3R1cmUgdG8KKwkgKiBwYXNzIHRoZW0gb24gdG8gdGhlIFNHU04gLyBHVFAgY29kZSAqLworCXRwLmx2W09TTU9fSUVfR1NNX1JFUV9RT1NdLmxlbiA9IHJlcV9xb3NfbGVuOworCXRwLmx2W09TTU9fSUVfR1NNX1JFUV9RT1NdLnZhbCA9IHJlcV9xb3M7CisJdHAubHZbT1NNT19JRV9HU01fUkVRX1BEUF9BRERSXS5sZW4gPSByZXFfcGRwYV9sZW47CisJdHAubHZbT1NNT19JRV9HU01fUkVRX1BEUF9BRERSXS52YWwgPSByZXFfcGRwYTsKKworCS8qIEZJWE1FOiAgZGV0ZXJtaW5lIEdHU04gYmFzZWQgb24gQVBOIGFuZCBzdWJzY3JpcHRpb24gb3B0aW9ucyAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9HU01fQVBOKSkge30KKworCS8qIENoZWNrIGlmIE5TQVBJIGlzIG91dCBvZiByYW5nZSAoVFMgMDQuNjUgLyA3LjIpICovCisJaWYgKGFjdF9yZXEtPnJlcV9uc2FwaSA8IDUgfHwgYWN0X3JlcS0+cmVxX25zYXBpID4gMTUpIHsKKwkJLyogU2VuZCByZWplY3Qgd2l0aCBHU01fQ0FVU0VfSU5WX01BTkRfSU5GTyAqLworCQlyZXR1cm4gZ3NtNDhfdHhfZ3NtX2FjdF9wZHBfcmVqKG1tY3R4LCB0cmFuc2FjdGlvbl9pZCwKKwkJCQkJCUdTTV9DQVVTRV9JTlZfTUFORF9JTkZPLAorCQkJCQkJMCwgTlVMTCk7CisJfQorCisJLyogQ2hlY2sgaWYgTlNBUEkgaXMgYWxyZWFkeSBpbiB1c2UgKi8KKwlpZiAoc2dzbl9wZHBfY3R4X2J5X25zYXBpKG1tY3R4LCBhY3RfcmVxLT5yZXFfbnNhcGkpKSB7CisJCS8qIEZJWE1FOiBzZW5kIHJlamVjdCB3aXRoIEdTTV9DQVVTRV9OU0FQSV9JTl9VU0UgKi8KKwkJcmV0dXJuIGdzbTQ4X3R4X2dzbV9hY3RfcGRwX3JlaihtbWN0eCwgdHJhbnNhY3Rpb25faWQsCisJCQkJCQlHU01fQ0FVU0VfTlNBUElfSU5fVVNFLAorCQkJCQkJMCwgTlVMTCk7CisJfQorCisjaWYgMQorCXsKKwkJc3RydWN0IHNnc25fZ2dzbl9jdHggKmdnc24gPSBzZ3NuX2dnc25fY3R4X2J5X2lkKDApOworCQlpZiAoIWdnc24pIHsKKwkJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJObyBHR1NOIGNvbnRleHQgMCBmb3VuZCFcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJZ2dzbi0+Z3NuID0gc2dzbi0+Z3NuOworCQlwZHAgPSBzZ3NuX2NyZWF0ZV9wZHBfY3R4KGdnc24sIG1tY3R4LCBhY3RfcmVxLT5yZXFfbnNhcGksICZ0cCk7CisJCWlmICghcGRwKQorCQkJcmV0dXJuIC0xOworCQlwZHAtPnNhcGkgPSBhY3RfcmVxLT5yZXFfbGxjX3NhcGk7CisJCXBkcC0+dGkgPSB0cmFuc2FjdGlvbl9pZDsKKwkJCisJfQorCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gZ3NtNDhfdHhfZ3NtX2FjdF9wZHBfYWNjKG1tY3R4LCB0cmFuc2FjdGlvbl9pZCwgYWN0X3JlcSk7CisjZW5kaWYKK30KKworLyogU2VjdGlvbiA5LjUuODogRGVhY3RpdmF0ZSBQRFAgQ29udGV4dCBSZXF1ZXN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dzbV9kZWFjdF9wZHBfcmVxKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwl1aW50OF90IHRyYW5zYWN0aW9uX2lkID0gKGdoLT5wcm90b19kaXNjciA+PiA0KTsKKwlzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHA7CisKKwlERUJVR1AoRE1NLCAiLT4gREVBQ1RJVkFURSBQRFAgQ09OVEVYVCBSRVEgKGNhdXNlOiAlcylcbiIsCisJCWdldF92YWx1ZV9zdHJpbmcoZ3NtX2NhdXNlX25hbWVzLCBnaC0+ZGF0YVswXSkpOworCisJcGRwID0gc2dzbl9wZHBfY3R4X2J5X3RpZChtbSwgdHJhbnNhY3Rpb25faWQpOworCWlmICghcGRwKSB7CisJCUxPR1AoRE1NLCBMT0dMX05PVElDRSwgIkRlYWN0aXZhdGUgUERQIENvbnRleHQgUmVxdWVzdCBmb3IgIgorCQkJIm5vbi1leGlzdGluZyBQRFAgQ29udGV4dCAoSU1TST0lcywgVEk9JXUpXG4iLAorCQkJbW0tPmltc2ksIHRyYW5zYWN0aW9uX2lkKTsKKwkJcmV0dXJuIF9nc200OF90eF9nc21fZGVhY3RfcGRwX2FjYyhtbSwgdHJhbnNhY3Rpb25faWQpOworCX0KKworCXJldHVybiBzZ3NuX2RlbGV0ZV9wZHBfY3R4KHBkcCk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfZ3NtX3N0YXR1cyhzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eCwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChETU0sICItPiBHUFJTIFNNIFNUQVRVUyAoY2F1c2U6ICVzKVxuIiwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhnc21fY2F1c2VfbmFtZXMsIGdoLT5kYXRhWzBdKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR1BSUyBTZXNzaW9uIE1hbmFnZW1lbnQgKi8KK3N0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfZ3NtKHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsIHN0cnVjdCBtc2diICptc2csCisJCQkgICBzdHJ1Y3QgZ3Byc19sbGNfbGxtZSAqbGxtZSkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCWludCByYzsKKworCS8qIE1NQ1RYIGNhbiBiZSBOVUxMIHdoZW4gY2FsbGVkICovCisKKwlpZiAoIW1tY3R4KSB7CisJCUxPR1AoRE1NLCBMT0dMX05PVElDRSwgIkNhbm5vdCBoYW5kbGUgU00gZm9yIHVua25vd24gTU0gQ1RYXG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9zdGF0dXNfb2xkbXNnKG1zZywgR1NNX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMpOworCX0KKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlKSB7CisJY2FzZSBHU000OF9NVF9HU01fQUNUX1BEUF9SRVE6CisJCXJjID0gZ3NtNDhfcnhfZ3NtX2FjdF9wZHBfcmVxKG1tY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dTTV9ERUFDVF9QRFBfUkVROgorCQlyYyA9IGdzbTQ4X3J4X2dzbV9kZWFjdF9wZHBfcmVxKG1tY3R4LCBtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dTTV9TVEFUVVM6CisJCXJjID0gZ3NtNDhfcnhfZ3NtX3N0YXR1cyhtbWN0eCwgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HU01fUkVRX1BEUF9BQ1RfUkVKOgorCWNhc2UgR1NNNDhfTVRfR1NNX0FDVF9BQV9QRFBfUkVROgorCWNhc2UgR1NNNDhfTVRfR1NNX0RFQUNUX0FBX1BEUF9SRVE6CisJCURFQlVHUChETU0sICJVbmltcGxlbWVudGVkIEdTTSAwNC4wOCBHU00gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJcmMgPSBnc200OF90eF9zbV9zdGF0dXMobW1jdHgsIEdTTV9DQVVTRV9NU0dUX05PVEVYSVNUX05PVElNUEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRE1NLCAiVW5rbm93biBHU00gMDQuMDggR1NNIG1zZyB0eXBlIDB4JTAyeFxuIiwKKwkJCWdoLT5tc2dfdHlwZSk7CisJCXJjID0gZ3NtNDhfdHhfc21fc3RhdHVzKG1tY3R4LCBHU01fQ0FVU0VfTVNHVF9OT1RFWElTVF9OT1RJTVBMKTsKKwkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIE1haW4gZW50cnkgcG9pbnQgZm9yIGluY29taW5nIDA0LjA4IEdQUlMgbWVzc2FnZXMgKi8KK2ludCBnc20wNDA4X2dwcnNfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBncHJzX2xsY19sbG1lICpsbG1lKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJdWludDhfdCBwZGlzYyA9IGdoLT5wcm90b19kaXNjciAmIDB4MGY7CisJc3RydWN0IHNnc25fbW1fY3R4ICptbWN0eDsKKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYV9pZDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJYnNzZ3BfcGFyc2VfY2VsbF9pZCgmcmFfaWQsIG1zZ2JfYmNpZChtc2cpKTsKKwltbWN0eCA9IHNnc25fbW1fY3R4X2J5X3RsbGkobXNnYl90bGxpKG1zZyksICZyYV9pZCk7CisJaWYgKG1tY3R4KSB7CisJCW1zZ2lkMm1tY3R4KG1tY3R4LCBtc2cpOworCQlyYXRlX2N0cl9pbmMoJm1tY3R4LT5jdHJnLT5jdHJbR01NX0NUUl9QS1RTX1NJR19JTl0pOworCQltbWN0eC0+bGxtZSA9IGxsbWU7CisJfQorCisJLyogTU1DVFggY2FuIGJlIE5VTEwgKi8KKworCXN3aXRjaCAocGRpc2MpIHsKKwljYXNlIEdTTTQ4X1BESVNDX01NX0dQUlM6CisJCXJjID0gZ3NtMDQwOF9yY3ZfZ21tKG1tY3R4LCBtc2csIGxsbWUpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1NNX0dQUlM6CisJCXJjID0gZ3NtMDQwOF9yY3ZfZ3NtKG1tY3R4LCBtc2csIGxsbWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRE1NLCAiVW5rbm93biBHU00gMDQuMDggZGlzY3JpbWluYXRvciAweCUwMnhcbiIsCisJCQlwZGlzYyk7CisJCS8qIEZJWE1FOiByZXR1cm4gc3RhdHVzIG1lc3NhZ2UgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgZ3Byc19nbW1fcnhfc3VzcGVuZChzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgdWludDMyX3QgdGxsaSkKK3sKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tY3R4OworCisJbW1jdHggPSBzZ3NuX21tX2N0eF9ieV90bGxpKHRsbGksIHJhaWQpOworCWlmICghbW1jdHgpIHsKKwkJTE9HUChETU0sIExPR0xfTk9USUNFLCAiU1VTUEVORCByZXF1ZXN0IGZvciB1bmtub3duICIKKwkJCSJUTExJPSUwOHhcbiIsIHRsbGkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobW1jdHgtPm1tX3N0YXRlICE9IEdNTV9SRUdJU1RFUkVEX05PUk1BTCkgeworCQlMT0dQKERNTSwgTE9HTF9OT1RJQ0UsICJTVVNQRU5EIHJlcXVlc3Qgd2hpbGUgc3RhdGUgIgorCQkJIiE9IFJFR0lTVEVSRUQgKFRMTEk9JTA4eClcbiIsIHRsbGkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBUcmFuc2l0aW9uIGZyb20gUkVHSVNURVJFRF9OT1JNQUwgdG8gUkVHSVNURVJFRF9TVVNQRU5ERUQgKi8KKwltbWN0eC0+bW1fc3RhdGUgPSBHTU1fUkVHSVNURVJFRF9TVVNQRU5ERUQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBncHJzX2dtbV9yeF9yZXN1bWUoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIHVpbnQzMl90IHRsbGksCisJCSAgICAgICB1aW50OF90IHN1c3BlbmRfcmVmKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHg7CisKKwkvKiBGSVhNRTogbWFrZSB1c2Ugb2Ygc3VzcGVuZCByZWZlcmVuY2U/ICovCisKKwltbWN0eCA9IHNnc25fbW1fY3R4X2J5X3RsbGkodGxsaSwgcmFpZCk7CisJaWYgKCFtbWN0eCkgeworCQlMT0dQKERNTSwgTE9HTF9OT1RJQ0UsICJSRVNVTUUgcmVxdWVzdCBmb3IgdW5rbm93biAiCisJCQkiVExMST0lMDh4XG4iLCB0bGxpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1tY3R4LT5tbV9zdGF0ZSAhPSBHTU1fUkVHSVNURVJFRF9TVVNQRU5ERUQpIHsKKwkJTE9HUChETU0sIExPR0xfTk9USUNFLCAiUkVTVU1FIHJlcXVlc3Qgd2hpbGUgc3RhdGUgIgorCQkJIiE9IFNVU1BFTkRFRCAoVExMST0lMDh4KVxuIiwgdGxsaSk7CisJCS8qIEZJWE1FOiBzaG91bGQgd2Ugbm90IHNpbXBseSBpZ25vcmUgaXQ/ICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRyYW5zaXRpb24gZnJvbSBTVVNQRU5ERUQgdG8gTk9STUFMICovCisJbW1jdHgtPm1tX3N0YXRlID0gR01NX1JFR0lTVEVSRURfTk9STUFMOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2xsYy5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2xsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZjA2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbGxjLmMKQEAgLTAsMCArMSw3MzggQEAKKy8qIEdQUlMgTExDIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGFzIHBlciAzR1BQIFRTIDA0LjY0ICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX3Nnc24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfZ21tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2xsYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY3JjMjQuaD4KKworLyogU2VjdGlvbiA4LjkuOSBMTEMgbGF5ZXIgcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwcnNfbGxjX3BhcmFtcyBsbGNfZGVmYXVsdF9wYXJhbXNbXSA9IHsKKwlbMV0gPSB7CisJCS50MjAwXzIwMQk9IDUsCisJCS5uMjAwCQk9IDMsCisJCS5uMjAxX3UJCT0gNDAwLAorCX0sCisJWzJdID0geworCQkudDIwMF8yMDEJPSA1LAorCQkubjIwMAkJPSAzLAorCQkubjIwMV91CQk9IDI3MCwKKwl9LAorCVszXSA9IHsKKwkJLmlvdl9pX2V4cAk9IDI3LAorCQkudDIwMF8yMDEJPSA1LAorCQkubjIwMAkJPSAzLAorCQkubjIwMV91CQk9IDUwMCwKKwkJLm4yMDFfaQkJPSAxNTAzLAorCQkubUQJCT0gMTUyMCwKKwkJLm1VCQk9IDE1MjAsCisJCS5rRAkJPSAxNiwKKwkJLmtVCQk9IDE2LAorCX0sCisJWzVdID0geworCQkuaW92X2lfZXhwCT0gMjcsCisJCS50MjAwXzIwMQk9IDEwLAorCQkubjIwMAkJPSAzLAorCQkubjIwMV91CQk9IDUwMCwKKwkJLm4yMDFfaQkJPSAxNTAzLAorCQkubUQJCT0gNzYwLAorCQkubVUJCT0gNzYwLAorCQkua0QJCT0gOCwKKwkJLmtVCQk9IDgsCisJfSwKKwlbN10gPSB7CisJCS50MjAwXzIwMQk9IDIwLAorCQkubjIwMAkJPSAzLAorCQkubjIwMV91CQk9IDI3MCwKKwl9LAorCVs4XSA9IHsKKwkJLnQyMDBfMjAxCT0gMjAsCisJCS5uMjAwCQk9IDMsCisJCS5uMjAxX3UJCT0gMjcwLAorCX0sCisJWzldID0geworCQkuaW92X2lfZXhwCT0gMjcsCisJCS50MjAwXzIwMQk9IDIwLAorCQkubjIwMAkJPSAzLAorCQkubjIwMV91CQk9IDUwMCwKKwkJLm4yMDFfaQkJPSAxNTAzLAorCQkubUQJCT0gMzgwLAorCQkubVUJCT0gMzgwLAorCQkua0QJCT0gNCwKKwkJLmtVCQk9IDQsCisJfSwKKwlbMTFdID0geworCQkuaW92X2lfZXhwCT0gMjcsCisJCS50MjAwXzIwMQk9IDQwLAorCQkubjIwMAkJPSAzLAorCQkubjIwMV91CQk9IDUwMCwKKwkJLm4yMDFfaQkJPSAxNTAzLAorCQkubUQJCT0gMTkwLAorCQkubVUJCT0gMTkwLAorCQkua0QJCT0gMiwKKwkJLmtVCQk9IDIsCisJfSwKK307CisKK0xMSVNUX0hFQUQoZ3Byc19sbGNfbGxtZXMpOwordm9pZCAqbGxjX3RhbGxfY3R4OworCisvKiBsb29rdXAgTExDIEVudGl0eSBiYXNlZCBvbiBETENJIChUTExJK1NBUEkgdHVwbGUpICovCitzdGF0aWMgc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlX2J5X3RsbGlfc2FwaSh1aW50MzJfdCB0bGxpLCB1aW50OF90IHNhcGkpCit7CisJc3RydWN0IGdwcnNfbGxjX2xsbWUgKmxsbWU7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShsbG1lLCAmZ3Byc19sbGNfbGxtZXMsIGxpc3QpIHsKKwkJaWYgKGxsbWUtPnRsbGkgPT0gdGxsaSB8fCBsbG1lLT5vbGRfdGxsaSA9PSB0bGxpKQorCQkJcmV0dXJuICZsbG1lLT5sbGVbc2FwaV07CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBsbGVfaW5pdChzdHJ1Y3QgZ3Byc19sbGNfbGxtZSAqbGxtZSwgdWludDhfdCBzYXBpKQoreworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSA9ICZsbG1lLT5sbGVbc2FwaV07CisKKwlsbGUtPmxsbWUgPSBsbG1lOworCWxsZS0+c2FwaSA9IHNhcGk7CisJbGxlLT5zdGF0ZSA9IEdQUlNfTExFU19VTkFTU0lHTkVEOworCisJLyogSW5pdGlhbGl6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyAqLworCW1lbWNweSgmbGxlLT5wYXJhbXMsICZsbGNfZGVmYXVsdF9wYXJhbXNbc2FwaV0sIHNpemVvZihsbGUtPnBhcmFtcykpOworfQorCitzdGF0aWMgc3RydWN0IGdwcnNfbGxjX2xsbWUgKmxsbWVfYWxsb2ModWludDMyX3QgdGxsaSkKK3sKKwlzdHJ1Y3QgZ3Byc19sbGNfbGxtZSAqbGxtZTsKKwl1aW50MzJfdCBpOworCisJbGxtZSA9IHRhbGxvY196ZXJvKGxsY190YWxsX2N0eCwgc3RydWN0IGdwcnNfbGxjX2xsbWUpOworCWlmICghbGxtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsbG1lLT50bGxpID0gdGxsaTsKKwlsbG1lLT5zdGF0ZSA9IEdQUlNfTExNU19VTkFTU0lHTkVEOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGxtZS0+bGxlKTsgaSsrKQorCQlsbGVfaW5pdChsbG1lLCBpKTsKKworCWxsaXN0X2FkZCgmbGxtZS0+bGlzdCwgJmdwcnNfbGxjX2xsbWVzKTsKKworCXJldHVybiBsbG1lOworfQorCitlbnVtIGdwcnNfbGxjX2NtZCB7CisJR1BSU19MTENfTlVMTCwKKwlHUFJTX0xMQ19SUiwKKwlHUFJTX0xMQ19BQ0ssCisJR1BSU19MTENfUk5SLAorCUdQUlNfTExDX1NBQ0ssCisJR1BSU19MTENfRE0sCisJR1BSU19MTENfRElTQywKKwlHUFJTX0xMQ19VQSwKKwlHUFJTX0xMQ19TQUJNLAorCUdQUlNfTExDX0ZSTVIsCisJR1BSU19MTENfWElELAorCUdQUlNfTExDX1VJLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbGxjX2NtZF9zdHJzW10gPSB7CisJeyBHUFJTX0xMQ19OVUxMLAkiTlVMTCIgfSwKKwl7IEdQUlNfTExDX1JSLAkJIlJSIiB9LAorCXsgR1BSU19MTENfQUNLLAkJIkFDSyIgfSwKKwl7IEdQUlNfTExDX1JOUiwJCSJSTlIiIH0sCisJeyBHUFJTX0xMQ19TQUNLLAkiU0FDSyIgfSwKKwl7IEdQUlNfTExDX0RNLAkJIkRNIiB9LAorCXsgR1BSU19MTENfRElTQywJIkRJU0MiIH0sCisJeyBHUFJTX0xMQ19VQSwJCSJVQSIgfSwKKwl7IEdQUlNfTExDX1NBQk0sCSJTQUJNIiB9LAorCXsgR1BSU19MTENfRlJNUiwJIkZSTVIiIH0sCisJeyBHUFJTX0xMQ19YSUQsCQkiWElEIiB9LAorCXsgR1BSU19MTENfVUksCQkiVUkiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0cnVjdCBncHJzX2xsY19oZHJfcGFyc2VkIHsKKwl1aW50OF90IHNhcGk7CisJdWludDhfdCBpc19jbWQ6MSwKKwkJIGFja19yZXE6MSwKKwkJIGlzX2VuY3J5cHRlZDoxOworCXVpbnQzMl90IHNlcV9yeDsKKwl1aW50MzJfdCBzZXFfdHg7CisJdWludDMyX3QgZmNzOworCXVpbnQzMl90IGZjc19jYWxjOworCXVpbnQ4X3QgKmRhdGE7CisJdWludDE2X3QgZGF0YV9sZW47CisJZW51bSBncHJzX2xsY19jbWQgY21kOworfTsKKworI2RlZmluZSBMTENfQUxMT0NfU0laRSAxNjM4NAorI2RlZmluZSBVSV9IRFJfTEVOCTMKKyNkZWZpbmUgTjIwMgkJNAorI2RlZmluZSBDUkMyNF9MRU5HVEgJMworCitzdGF0aWMgaW50IGdwcnNfbGxjX2Zjcyh1aW50OF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVpbnQzMl90IGZjc19jYWxjOworCisJZmNzX2NhbGMgPSBjcmMyNF9jYWxjKElOSVRfQ1JDMjQsIGRhdGEsIGxlbik7CisJZmNzX2NhbGMgPSB+ZmNzX2NhbGM7CisJZmNzX2NhbGMgJj0gMHhmZmZmZmY7CisKKwlyZXR1cm4gZmNzX2NhbGM7Cit9CisKK3N0YXRpYyB2b2lkIHQyMDBfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSA9IGRhdGE7CisKKwkvKiA4LjUuMS4zOiBFeHBpcnkgb2YgVDIwMCAqLworCisJaWYgKGxsZS0+cmV0cmFuc19jdHIgPj0gbGxlLT5wYXJhbXMubjIwMCkgeworCQkvKiBGSVhNRTogTExHTS1TVEFUVVMtSU5ELCBMTC1SRUxFQVNFLUlORC9DTkYgKi8KKwkJbGxlLT5zdGF0ZSA9IEdQUlNfTExFU19BU1NJR05FRF9BRE07CisJfQorCisJc3dpdGNoIChsbGUtPnN0YXRlKSB7CisJY2FzZSBHUFJTX0xMRVNfTE9DQUxfRVNUOgorCQkvKiBGSVhNRTogcmV0cmFuc21pdCBTQUJNICovCisJCS8qIEZJWE1FOiByZS1zdGFydCBUMjAwICovCisJCWxsZS0+cmV0cmFuc19jdHIrKzsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMRVNfTE9DQUxfUkVMOgorCQkvKiBGSVhNRTogcmV0cmFuc21pdCBESVNDICovCisJCS8qIEZJWE1FOiByZS1zdGFydCBUMjAwICovCisJCWxsZS0+cmV0cmFuc19jdHIrKzsKKwkJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHQyMDFfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSA9IGRhdGE7CisKKwlpZiAobGxlLT5yZXRyYW5zX2N0ciA8IGxsZS0+cGFyYW1zLm4yMDApIHsKKwkJLyogRklYTUU6IHRyYW5zbWl0IGFwcm9wcmlhdGUgc3VwZXJ2aXNvcnkgZnJhbWUgKDguNi40LjEpICovCisJCS8qIEZJWE1FOiBzZXQgdGltZXIgVDIwMSAqLworCQlsbGUtPnJldHJhbnNfY3RyKys7CisJfQorfQorCitpbnQgZ3Byc19sbGNfdHhfdShzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHNhcGksIGludCBjb21tYW5kLAorCQkgIGVudW0gZ3Byc19sbGNfdV9jbWQgdV9jbWQsIGludCBwZl9iaXQpCit7CisJdWludDhfdCAqZmNzLCAqbGxjaDsKKwl1aW50OF90IGFkZHIsIGN0cmw7CisJdWludDMyX3QgZmNzX2NhbGM7CisKKwkvKiBJZGVudGlmaWVycyBmcm9tIFVQOiAoVExMSSwgU0FQSSkgKyAoQlZDSSwgTlNFSSkgKi8KKworCS8qIEFkZHJlc3MgRmllbGQgKi8KKwlhZGRyID0gc2FwaSAmIDB4ZjsKKwlpZiAoY29tbWFuZCkKKwkJYWRkciB8PSAweDQwOworCisJLyogNi4zIEZpZ3VyZSA4ICovCisJY3RybCA9IDB4ZTAgfCB1X2NtZDsKKwlpZiAocGZfYml0KQorCQljdHJsIHw9IDB4MTA7CisKKwkvKiBwcmVwZW5kIExMQyBVSSBoZWFkZXIgKi8KKwlsbGNoID0gbXNnYl9wdXNoKG1zZywgMik7CisJbGxjaFswXSA9IGFkZHI7CisJbGxjaFsxXSA9IGN0cmw7CisKKwkvKiBhcHBlbmQgRkNTIHRvIGVuZCBvZiBmcmFtZSAqLworCWZjcyA9IG1zZ2JfcHV0KG1zZywgMyk7CisJZmNzX2NhbGMgPSBncHJzX2xsY19mY3MobGxjaCwgZmNzIC0gbGxjaCk7CisJZmNzWzBdID0gZmNzX2NhbGMgJiAweGZmOworCWZjc1sxXSA9IChmY3NfY2FsYyA+PiA4KSAmIDB4ZmY7CisJZmNzWzJdID0gKGZjc19jYWxjID4+IDE2KSAmIDB4ZmY7CisKKwkvKiBJZGVudGlmaWVycyBwYXNzZWQgZG93bjogKEJWQ0ksIE5TRUkpICovCisKKwkvKiBTZW5kIEJTU0dQLURMLVVOSVREQVRBLnJlcSAqLworCXJldHVybiBncHJzX2Jzc2dwX3R4X2RsX3VkKG1zZywgTlVMTCk7Cit9CisKKy8qIFNlbmQgWElEIHJlc3BvbnNlIHRvIExMRSAqLworc3RhdGljIGludCBncHJzX2xsY190eF94aWQoc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCS8qIGNvcHkgaWRlbnRpZmllcnMgZnJvbSBMTEUgdG8gZW5zdXJlIGxvd2VyIGxheWVycyBjYW4gcm91dGUgKi8KKwltc2diX3RsbGkobXNnKSA9IGxsZS0+bGxtZS0+dGxsaTsKKwltc2diX2J2Y2kobXNnKSA9IGxsZS0+bGxtZS0+YnZjaTsKKwltc2diX25zZWkobXNnKSA9IGxsZS0+bGxtZS0+bnNlaTsKKworCXJldHVybiBncHJzX2xsY190eF91KG1zZywgbGxlLT5zYXBpLCAwLCBHUFJTX0xMQ19VX1hJRCwgMSk7Cit9CisKKy8qIFRyYW5zbWl0IGEgVUkgZnJhbWUgb3ZlciB0aGUgZ2l2ZW4gU0FQSSAqLworaW50IGdwcnNfbGxjX3R4X3VpKHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3Qgc2FwaSwgaW50IGNvbW1hbmQsCisJCSAgIHZvaWQgKm1tY3R4KQoreworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZTsKKwl1aW50OF90ICpmY3MsICpsbGNoOworCXVpbnQ4X3QgYWRkciwgY3RybFsyXTsKKwl1aW50MzJfdCBmY3NfY2FsYzsKKwl1aW50MTZfdCBudSA9IDA7CisKKwkvKiBJZGVudGlmaWVycyBmcm9tIFVQOiAoVExMSSwgU0FQSSkgKyAoQlZDSSwgTlNFSSkgKi8KKworCS8qIGxvb2stdXAgb3IgY3JlYXRlIHRoZSBMTCBFbnRpdHkgZm9yIHRoaXMgKFRMTEksIFNBUEkpIHR1cGxlICovCisJbGxlID0gbGxlX2J5X3RsbGlfc2FwaShtc2diX3RsbGkobXNnKSwgc2FwaSk7CisJaWYgKCFsbGUpIHsKKwkJc3RydWN0IGdwcnNfbGxjX2xsbWUgKmxsbWU7CisJCWxsbWUgPSBsbG1lX2FsbG9jKG1zZ2JfdGxsaShtc2cpKTsKKwkJbGxlID0gJmxsbWUtPmxsZVtzYXBpXTsKKwl9CisKKwlpZiAobXNnLT5sZW4gPiBsbGUtPnBhcmFtcy5uMjAxX3UpIHsKKwkJTE9HUChETExDLCBMT0dMX0VSUk9SLCAiQ2Fubm90IFR4ICV1IGJ5dGVzIChOMjAxLVU9JXUpXG4iLAorCQkJbXNnLT5sZW4sIGxsZS0+cGFyYW1zLm4yMDFfdSk7CisJCXJldHVybiAtRUZCSUc7CisJfQorCisJLyogVXBkYXRlIExMRSdzIChCVkNJLCBOU0VJKSB0dXBsZSAqLworCWxsZS0+bGxtZS0+YnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCWxsZS0+bGxtZS0+bnNlaSA9IG1zZ2JfbnNlaShtc2cpOworCisJLyogSW5jcmVtZW50IFYoVSkgKi8KKwludSA9IGxsZS0+dnVfc2VuZDsKKwlsbGUtPnZ1X3NlbmQgPSAobGxlLT52dV9zZW5kICsgMSkgJSA1MTI7CisKKwkvKiBBZGRyZXNzIEZpZWxkICovCisJYWRkciA9IHNhcGkgJiAweGY7CisJaWYgKGNvbW1hbmQpCisJCWFkZHIgfD0gMHg0MDsKKworCS8qIENvbnRyb2wgRmllbGQgKi8KKwljdHJsWzBdID0gMHhjMDsKKwljdHJsWzBdIHw9IG51ID4+IDY7CisJY3RybFsxXSA9IChudSA8PCAyKSAmIDB4ZmM7CisJY3RybFsxXSB8PSAweDAxOyAvKiBQcm90ZWN0ZWQgTW9kZSAqLworCisJLyogcHJlcGVuZCBMTEMgVUkgaGVhZGVyICovCisJbGxjaCA9IG1zZ2JfcHVzaChtc2csIDMpOworCWxsY2hbMF0gPSBhZGRyOworCWxsY2hbMV0gPSBjdHJsWzBdOworCWxsY2hbMl0gPSBjdHJsWzFdOworCisJLyogYXBwZW5kIEZDUyB0byBlbmQgb2YgZnJhbWUgKi8KKwlmY3MgPSBtc2diX3B1dChtc2csIDMpOworCWZjc19jYWxjID0gZ3Byc19sbGNfZmNzKGxsY2gsIGZjcyAtIGxsY2gpOworCWZjc1swXSA9IGZjc19jYWxjICYgMHhmZjsKKwlmY3NbMV0gPSAoZmNzX2NhbGMgPj4gOCkgJiAweGZmOworCWZjc1syXSA9IChmY3NfY2FsYyA+PiAxNikgJiAweGZmOworCisJLyogSWRlbnRpZmllcnMgcGFzc2VkIGRvd246IChCVkNJLCBOU0VJKSAqLworCisJLyogU2VuZCBCU1NHUC1ETC1VTklUREFUQS5yZXEgKi8KKwlyZXR1cm4gZ3Byc19ic3NncF90eF9kbF91ZChtc2csIG1tY3R4KTsKK30KKworc3RhdGljIHZvaWQgZ3Byc19sbGNfaGRyX2R1bXAoc3RydWN0IGdwcnNfbGxjX2hkcl9wYXJzZWQgKmdwaCkKK3sKKwlERUJVR1AoRExMQywgIkxMQyBTQVBJPSV1ICVjICVjIEZDUz0weCUwNngoJXMpICIsCisJCWdwaC0+c2FwaSwgZ3BoLT5pc19jbWQgPyAnQycgOiAnUicsIGdwaC0+YWNrX3JlcSA/ICdBJyA6ICcgJywKKwkJZ3BoLT5mY3MsIGdwaC0+ZmNzX2NhbGMgPT0gZ3BoLT5mY3MgPyAiY29ycmVjdCIgOiAiV1JPTkciKTsKKworCWlmIChncGgtPmNtZCkKKwkJREVCVUdQQyhETExDLCAiQ01EPSVzICIsIGdldF92YWx1ZV9zdHJpbmcobGxjX2NtZF9zdHJzLCBncGgtPmNtZCkpOworCisJaWYgKGdwaC0+ZGF0YSkKKwkJREVCVUdQQyhETExDLCAiREFUQSAiKTsKKworCURFQlVHUEMoRExMQywgIlxuIik7Cit9CitzdGF0aWMgaW50IGdwcnNfbGxjX2hkcl9yeChzdHJ1Y3QgZ3Byc19sbGNfaGRyX3BhcnNlZCAqZ3BoLAorCQkJICAgc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlKQoreworCXN3aXRjaCAoZ3BoLT5jbWQpIHsKKwljYXNlIEdQUlNfTExDX1NBQk06IC8qIFNlY3Rpb24gNi40LjEuMSAqLworCQlsbGUtPnZfc2VudCA9IGxsZS0+dl9hY2sgPSBsbGUtPnZfcmVjdiA9IDA7CisJCWlmIChsbGUtPnN0YXRlID09IEdQUlNfTExFU19BU1NJR05FRF9BRE0pIHsKKwkJCS8qIHN0YXJ0IHJlLWVzdGFibGlzaG1lbnQgKDguNy4xKSAqLworCQl9CisJCWxsZS0+c3RhdGUgPSBHUFJTX0xMRVNfUkVNT1RFX0VTVDsKKwkJLyogRklYTUU6IFNlbmQgVUEgKi8KKwkJbGxlLT5zdGF0ZSA9IEdQUlNfTExFU19BQk07CisJCS8qIEZJWE1FOiBwcm9jZXNzIGRhdGEgKi8KKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19ESVNDOiAvKiBTZWN0aW9uIDYuNC4xLjIgKi8KKwkJLyogRklYTUU6IFNlbmQgVUEgKi8KKwkJLyogdGVybWluYXRlIEFCTSAqLworCQlsbGUtPnN0YXRlID0gR1BSU19MTEVTX0FTU0lHTkVEX0FETTsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19VQTogLyogU2VjdGlvbiA2LjQuMS4zICovCisJCWlmIChsbGUtPnN0YXRlID09IEdQUlNfTExFU19MT0NBTF9FU1QpCisJCQlsbGUtPnN0YXRlID0gR1BSU19MTEVTX0FCTTsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19ETTogLyogU2VjdGlvbiA2LjQuMS40OiBBQk0gY2Fubm90IGJlIHBlcmZvcm1lZCAqLworCQlpZiAobGxlLT5zdGF0ZSA9PSBHUFJTX0xMRVNfTE9DQUxfRVNUKQorCQkJbGxlLT5zdGF0ZSA9IEdQUlNfTExFU19BU1NJR05FRF9BRE07CisJCWJyZWFrOworCWNhc2UgR1BSU19MTENfRlJNUjogLyogU2VjdGlvbiA2LjQuMS41ICovCisJCWJyZWFrOworCWNhc2UgR1BSU19MTENfWElEOiAvKiBTZWN0aW9uIDYuNC4xLjYgKi8KKwkJLyogRklYTUU6IGltcGxlbWVudCBYSUQgbmVnb3RpYXRpb24gdXNpbmcgU05EQ1AgKi8KKwkJeworCQkJc3RydWN0IG1zZ2IgKnJlc3A7CisJCQl1aW50OF90ICp4aWQ7CisJCQlyZXNwID0gbXNnYl9hbGxvY19oZWFkcm9vbSg0MDk2LCAxMDI0LCAiTExDX1hJRCIpOworCQkJeGlkID0gbXNnYl9wdXQocmVzcCwgZ3BoLT5kYXRhX2xlbik7CisJCQltZW1jcHkoeGlkLCBncGgtPmRhdGEsIGdwaC0+ZGF0YV9sZW4pOworCQkJZ3Byc19sbGNfdHhfeGlkKGxsZSwgcmVzcCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19VSToKKwkJaWYgKGdwaC0+c2VxX3R4IDwgbGxlLT52dV9yZWN2KSB7CisJCQlMT0dQKERMTEMsICJUTExJPSUwOHggZHJvcHBpbmcgVUksIHZ1cmVjdiAldSA8PSAldVxuIiwKKwkJCQlncGgtPnNlcV90eCwgbGxlLT52dV9yZWN2KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCS8qIEluY3JlbWVudCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRoYXQgd2UgZXhwZWN0IGluIHRoZSBuZXh0IGZyYW1lICovCisJCWxsZS0+dnVfcmVjdiA9IChncGgtPnNlcV90eCArIDEpICUgNTEyOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcGFyc2UgYSBHUFJTIExMQyBoZWFkZXIsIGFsc28gY2hlY2sgZm9yIGludmFsaWQgZnJhbWVzICovCitzdGF0aWMgaW50IGdwcnNfbGxjX2hkcl9wYXJzZShzdHJ1Y3QgZ3Byc19sbGNfaGRyX3BhcnNlZCAqZ2hwLAorCQkJICAgICAgdWludDhfdCAqbGxjX2hkciwgaW50IGxlbikKK3sKKwl1aW50OF90ICpjdHJsID0gbGxjX2hkcisxOworCWludCBpc19zYWNrID0gMDsKKwl1bnNpZ25lZCBpbnQgY3JjX2xlbmd0aDsKKwl1aW50MzJfdCBmY3NfY2FsYzsKKworCWlmIChsZW4gPD0gQ1JDMjRfTEVOR1RIKQorCQlyZXR1cm4gLUVJTzsKKworCWNyY19sZW5ndGggPSBsZW4gLSBDUkMyNF9MRU5HVEg7CisKKwlnaHAtPmFja19yZXEgPSAwOworCisJLyogU2VjdGlvbiA1LjU6IEZDUyAqLworCWdocC0+ZmNzID0gKihsbGNfaGRyICsgbGVuIC0gMyk7CisJZ2hwLT5mY3MgfD0gKihsbGNfaGRyICsgbGVuIC0gMikgPDwgODsKKwlnaHAtPmZjcyB8PSAqKGxsY19oZHIgKyBsZW4gLSAxKSA8PCAxNjsKKworCS8qIFNlY3Rpb24gNi4yLjE6IGludmFsaWQgUEQgZmllbGQgKi8KKwlpZiAobGxjX2hkclswXSAmIDB4ODApCisJCXJldHVybiAtRUlPOworCisJLyogVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgTVMtPlNHU04gZGlyZWN0aW9uICovCisJaWYgKGxsY19oZHJbMF0gJiAweDQwKQorCQlnaHAtPmlzX2NtZCA9IDA7CisJZWxzZQorCQlnaHAtPmlzX2NtZCA9IDE7CisKKwlnaHAtPnNhcGkgPSBsbGNfaGRyWzBdICYgMHhmOworCisJLyogU2VjdGlvbiA2LjIuMzogY2hlY2sgZm9yIHJlc2VydmVkIFNBUEkgKi8KKwlzd2l0Y2ggKGdocC0+c2FwaSkgeworCWNhc2UgMDoKKwljYXNlIDQ6CisJY2FzZSA2OgorCWNhc2UgMHhhOgorCWNhc2UgMHhjOgorCWNhc2UgMHhkOgorCWNhc2UgMHhmOgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGN0cmxbMF0gJiAweDgwKSA9PSAwKSB7CisJCS8qIEkgKEluZm9ybWF0aW9uIHRyYW5zZmVyICsgU3VwZXJ2aXNvcnkpIGZvcm1hdCAqLworCQl1aW50OF90IGs7CisKKwkJZ2hwLT5kYXRhID0gY3RybCArIDM7CisKKwkJaWYgKGN0cmxbMF0gJiAweDQwKQorCQkJZ2hwLT5hY2tfcmVxID0gMTsKKworCQlnaHAtPnNlcV90eCAgPSAoY3RybFswXSAmIDB4MWYpIDw8IDQ7CisJCWdocC0+c2VxX3R4IHw9IChjdHJsWzFdID4+IDQpOworCisJCWdocC0+c2VxX3J4ICA9IChjdHJsWzFdICYgMHg3KSA8PCA2OworCQlnaHAtPnNlcV9yeCB8PSAoY3RybFsyXSA+PiAyKTsKKworCQlzd2l0Y2ggKGN0cmxbMl0gJiAweDAzKSB7CisJCWNhc2UgMDoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfUlI7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19BQ0s7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19STlI7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19TQUNLOworCQkJayA9IGN0cmxbM10gJiAweDFmOworCQkJZ2hwLT5kYXRhICs9IDEgKyBrOworCQkJYnJlYWs7CisJCX0KKwkJZ2hwLT5kYXRhX2xlbiA9IChsbGNfaGRyICsgbGVuIC0gMykgLSBnaHAtPmRhdGE7CisJfSBlbHNlIGlmICgoY3RybFswXSAmIDB4YzApID09IDB4ODApIHsKKwkJLyogUyAoU3VwZXJ2aXNvcnkpIGZvcm1hdCAqLworCQlnaHAtPmRhdGEgPSBOVUxMOworCQlnaHAtPmRhdGFfbGVuID0gMDsKKworCQlpZiAoY3RybFswXSAmIDB4MjApCisJCQlnaHAtPmFja19yZXEgPSAxOworCQlnaHAtPnNlcV9yeCAgPSAoY3RybFswXSAmIDB4NykgPDwgNjsKKwkJZ2hwLT5zZXFfcnggfD0gKGN0cmxbMV0gPj4gMik7CisKKwkJc3dpdGNoIChjdHJsWzFdICYgMHgwMykgeworCQljYXNlIDA6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1JSOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWdocC0+Y21kID0gR1BSU19MTENfQUNLOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfUk5SOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfU0FDSzsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICgoY3RybFswXSAmIDB4ZTApID09IDB4YzApIHsKKwkJLyogVUkgKFVuY29uZmlybWVkIEluZm9yYW10aW9uKSBmb3JtYXQgKi8KKwkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19VSTsKKwkJZ2hwLT5kYXRhID0gY3RybCArIDI7CisJCWdocC0+ZGF0YV9sZW4gPSAobGxjX2hkciArIGxlbiAtIDMpIC0gZ2hwLT5kYXRhOworCisJCWdocC0+c2VxX3R4ICA9IChjdHJsWzBdICYgMHg3KSA8PCA2OworCQlnaHAtPnNlcV90eCB8PSAoY3RybFsxXSA+PiAyKTsKKwkJaWYgKGN0cmxbMV0gJiAweDAyKSB7CisJCQlnaHAtPmlzX2VuY3J5cHRlZCA9IDE7CisJCQkvKiBGSVhNRTogZW5jcnlwdGlvbiAqLworCQl9CisJCWlmIChjdHJsWzFdICYgMHgwMSkgeworCQkJLyogRkNTIG92ZXIgaGRyICsgYWxsIGluZiBmaWVsZHMgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIEZDUyBvdmVyIGhkciArIE4yMDIgb2N0ZXRzICg0KSAqLworCQkJaWYgKGNyY19sZW5ndGggPiBVSV9IRFJfTEVOICsgTjIwMikKKwkJCQljcmNfbGVuZ3RoID0gVUlfSERSX0xFTiArIE4yMDI7CisJCX0KKwl9IGVsc2UgeworCQkvKiBVIChVbm51bWJlcmVkKSBmb3JtYXQ6IDEgMSAxIFAvRiBNNCBNMyBNMiBNMSAqLworCQlnaHAtPmRhdGEgPSBOVUxMOworCQlnaHAtPmRhdGFfbGVuID0gMDsKKworCQlzd2l0Y2ggKGN0cmxbMF0gJiAweGYpIHsKKwkJY2FzZSBHUFJTX0xMQ19VX05VTExfQ01EOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19OVUxMOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9ETV9SRVNQOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19ETTsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfTExDX1VfRElTQ19DTUQ6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX0RJU0M7CisJCQlicmVhazsKKwkJY2FzZSBHUFJTX0xMQ19VX1VBX1JFU1A6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1VBOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9TQUJNX0NNRDoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfU0FCTTsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfTExDX1VfRlJNUl9SRVNQOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19GUk1SOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9YSUQ6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1hJRDsKKwkJCWdocC0+ZGF0YSA9IGN0cmwgKyAxOworCQkJZ2hwLT5kYXRhX2xlbiA9IChsbGNfaGRyICsgbGVuIC0gMykgLSBnaHAtPmRhdGE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJLyogY2FsY3VsYXRlIHdoYXQgRkNTIHdlIGV4cGVjdCAqLworCWdocC0+ZmNzX2NhbGMgPSBncHJzX2xsY19mY3MobGxjX2hkciwgY3JjX2xlbmd0aCk7CisKKwkvKiBGSVhNRTogcGFyc2Ugc2FjayBmcmFtZSAqLworCWlmIChnaHAtPmNtZCA9PSBHUFJTX0xMQ19TQUNLKSB7CisJCUxPR1AoRExMQywgTE9HTF9OT1RJQ0UsICJVbnN1cHBvcnRlZCBTQUNLIGZyYW1lXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlY2VpdmUgYW4gaW5jb21pbmcgTExDIFBEVSAoQlNTR1AtVUwtVU5JVERBVEEtSU5ELCA3LjIuNC4yKSAqLworaW50IGdwcnNfbGxjX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHYpCit7CisJc3RydWN0IGJzc2dwX3VkX2hkciAqdWRoID0gKHN0cnVjdCBic3NncF91ZF9oZHIgKikgbXNnYl9ic3NncGgobXNnKTsKKwlzdHJ1Y3QgZ3Byc19sbGNfaGRyICpsaCA9IG1zZ2JfbGxjaChtc2cpOworCXN0cnVjdCBncHJzX2xsY19oZHJfcGFyc2VkIGxsaHA7CisJc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlOworCWludCByYyA9IDA7CisKKwkvKiBJZGVudGlmaWVycyBmcm9tIERPV046IE5TRUksIEJWQ0ksIFRMTEkgKi8KKworCW1lbXNldCgmbGxocCwgMCwgc2l6ZW9mKGxsaHApKTsKKwlyYyA9IGdwcnNfbGxjX2hkcl9wYXJzZSgmbGxocCwgKHVpbnQ4X3QgKikgbGgsIFRMVlBfTEVOKHR2LCBCU1NHUF9JRV9MTENfUERVKSk7CisJZ3Byc19sbGNfaGRyX2R1bXAoJmxsaHApOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETExDLCBMT0dMX05PVElDRSwgIkVycm9yIGR1cmluZyBMTEMgaGVhZGVyIHBhcnNpbmdcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKGxsaHAuZmNzICE9IGxsaHAuZmNzX2NhbGMpIHsKKwkJTE9HUChETExDLCBMT0dMX0lORk8sICJEcm9wcGluZyBmcmFtZSB3aXRoIGludmFsaWQgRkNTXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3dpdGNoIChncHJzX3RsbGlfdHlwZShtc2diX3RsbGkobXNnKSkpIHsKKwljYXNlIFRMTElfTE9DQUw6CisJY2FzZSBUTExJX0ZPUkVJR046CisJY2FzZSBUTExJX1JBTkRPTToKKwljYXNlIFRMTElfQVVYSUxJQVJZOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERMTEMsIExPR0xfRVJST1IsCisJCQkiRGlzY2FyZGluZyBmcmFtZSB3aXRoIHN0cmFuZ2UgVExMSSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJfQorCisJLyogZmluZCB0aGUgTExDIEVudGl0eSBmb3IgdGhpcyBUTExJK1NBUEkgdHVwbGUgKi8KKwlsbGUgPSBsbGVfYnlfdGxsaV9zYXBpKG1zZ2JfdGxsaShtc2cpLCBsbGhwLnNhcGkpOworCisJLyogNy4yLjEuMSBMTEMgYmVsb25naW5nIHRvIHVuYXNzaWduZWQgVExMSStTQVBJIHNoYWxsIGJlIGRpc2NhcmRlZCwKKwkgKiBleGNlcHQgVUlEIGFuZCBYSUQgZnJhbWVzIHdpdGggU0FQST0xICovCisJaWYgKCFsbGUpIHsKKwkJaWYgKGxsaHAuc2FwaSA9PSBHUFJTX1NBUElfR01NICYmCisJCSAgICAobGxocC5jbWQgPT0gR1BSU19MTENfWElEIHx8IGxsaHAuY21kID09IEdQUlNfTExDX1VJKSkgeworCQkJc3RydWN0IGdwcnNfbGxjX2xsbWUgKmxsbWU7CisJCQkvKiBGSVhNRTogZG9uJ3QgdXNlIHRoZSBUTExJIGJ1dCB0aGUgMHhGRkZGIHVuYXNzaWduZWQ/ICovCisJCQlsbG1lID0gbGxtZV9hbGxvYyhtc2diX3RsbGkobXNnKSk7CisJCQlsbGUgPSAmbGxtZS0+bGxlW2xsaHAuc2FwaV07CisJCX0gZWxzZSB7CisJCQlMT0dQKERMTEMsIExPR0xfTk9USUNFLAorCQkJCSJ1bmtub3duIFRMTEkvU0FQSTogU2lsZW50bHkgZHJvcHBpbmdcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgTExFJ3MgKEJWQ0ksIE5TRUkpIHR1cGxlICovCisJbGxlLT5sbG1lLT5idmNpID0gbXNnYl9idmNpKG1zZyk7CisJbGxlLT5sbG1lLT5uc2VpID0gbXNnYl9uc2VpKG1zZyk7CisKKwkvKiBSZWNlaXZlIGFuZCBQcm9jZXNzIHRoZSBhY3R1YWwgTExDIGZyYW1lICovCisJcmMgPSBncHJzX2xsY19oZHJfcngoJmxsaHAsIGxsZSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogbGxocC5kYXRhIGlzIG9ubHkgc2V0IHdoZW4gd2UgbmVlZCB0byBzZW5kIExMX1tVTklUXURBVEFfSU5EIHVwICovCisJaWYgKGxsaHAuZGF0YSkgeworCQltc2diX2dtbWgobXNnKSA9IGxsaHAuZGF0YTsKKwkJc3dpdGNoIChsbGhwLnNhcGkpIHsKKwkJY2FzZSBHUFJTX1NBUElfR01NOgorCQkJLyogc2VuZCBMTF9VTklUREFUQV9JTkQgdG8gR01NICovCisJCQlyYyA9IGdzbTA0MDhfZ3Byc19yY3Ztc2cobXNnLCBsbGUtPmxsbWUpOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19TQVBJX1NORENQMzoKKwkJY2FzZSBHUFJTX1NBUElfU05EQ1A1OgorCQljYXNlIEdQUlNfU0FQSV9TTkRDUDk6CisJCWNhc2UgR1BSU19TQVBJX1NORENQMTE6CisJCQkvKiBzZW5kIExMX0RBVEFfSU5EL0xMX1VOSVREQVRBX0lORCB0byBTTkRDUCAqLworCQkJcmMgPSBzbmRjcF9sbHVuaXRkYXRhX2luZChtc2csIGxsZSwgbGxocC5kYXRhLCBsbGhwLmRhdGFfbGVuKTsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfU0FQSV9TTVM6CisJCQkvKiBGSVhNRSAqLworCQljYXNlIEdQUlNfU0FQSV9UT00yOgorCQljYXNlIEdQUlNfU0FQSV9UT004OgorCQkJLyogRklYTUU6IHNlbmQgTExfREFUQV9JTkQvTExfVU5JVERBVEFfSU5EIHRvIFRPTSAqLworCQlkZWZhdWx0OgorCQkJTE9HUChETExDLCBMT0dMX05PVElDRSwgIlVuc3VwcG9ydGVkIFNBUEkgJXVcbiIsIGxsaHAuc2FwaSk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworLyogMDQuNjQgQ2hhcHRlciA3LjIuMS4xIExMR01NLUFTU0lHTiAqLworaW50IGdwcnNfbGxnbW1fYXNzaWduKHN0cnVjdCBncHJzX2xsY19sbG1lICpsbG1lLAorCQkgICAgICB1aW50MzJfdCBvbGRfdGxsaSwgdWludDMyX3QgbmV3X3RsbGksCisJCSAgICAgIGVudW0gZ3Byc19jaXBoX2FsZ28gYWxnLCBjb25zdCB1aW50OF90ICprYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChvbGRfdGxsaSA9PSAweGZmZmZmZmZmICYmIG5ld190bGxpICE9IDB4ZmZmZmZmZmYpIHsKKwkJLyogVExMSSBBc3NpZ25tZW50IDguMy4xICovCisJCS8qIE5ldyBUTExJIHNoYWxsIGJlIGFzc2lnbmVkIGFuZCB1c2VkIHdoZW4gKHJlKXRyYW5zbWl0dGluZyBMTEMgZnJhbWVzICovCisJCS8qIElmIG9sZCBUTExJICE9IDB4ZmZmZmZmZmYgd2FzIGFzc2lnbmVkIHRvIExMTUUsIHRoZW4gVExMSQorCQkgKiBvbGQgaXMgdW5hc3NpZ25lZC4gIE9ubHkgVExMSSBuZXcgc2hhbGwgYmUgYWNjZXB0ZWQgd2hlbgorCQkgKiByZWNlaXZlZCBmcm9tIHBlZXIuICovCisKKwkJLyogSWYgVExMSSBvbGQgPT0gMHhmZmZmZmZmZiB3YXMgYXNzaWduZWQgdG8gTExNRSwgdGhlbiB0aGlzIGlzCisJCSAqIFRMTEkgYXNzaWdubWVtdCBhY2NvcmRpbmcgdG8gOC4zLjEgKi8KKwkJbGxtZS0+b2xkX3RsbGkgPSAwOworCQlsbG1lLT50bGxpID0gbmV3X3RsbGk7CisJCWxsbWUtPnN0YXRlID0gR1BSU19MTE1TX0FTU0lHTkVEOworCQkvKiA4LjUuMy4xIEZvciBhbGwgTExFJ3MgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGxtZS0+bGxlKTsgaSsrKSB7CisJCQlzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsID0gJmxsbWUtPmxsZVtpXTsKKwkJCWwtPnZ1X3NlbmQgPSBsLT52dV9yZWN2ID0gMDsKKwkJCWwtPnJldHJhbnNfY3RyID0gMDsKKwkJCWwtPnN0YXRlID0gR1BSU19MTEVTX0FTU0lHTkVEX0FETTsKKwkJCS8qIEZJWE1FIFNldCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byB0YWJsZSA5ICovCisJCX0KKwl9IGVsc2UgaWYgKG9sZF90bGxpICE9IDB4ZmZmZmZmZmYgJiYgbmV3X3RsbGkgIT0gMHhmZmZmZmZmZikgeworCQkvKiBUTExJIENoYW5nZSA4LjMuMiAqLworCQkvKiBCb3RoIFRMTEkgT2xkIGFuZCBUTExJIE5ldyBhcmUgYXNzaWduZWQ7IHVzZSBOZXcgd2hlbgorCQkgKiAocmUpdHJhbnNtaXR0aW5nLiAgQWNjZXB0IHRvdGggT2xkIGFuZCBOZXcgb24gUnggKi8KKwkJbGxtZS0+b2xkX3RsbGkgPSBsbG1lLT50bGxpOworCQlsbG1lLT50bGxpID0gbmV3X3RsbGk7CisJCWxsbWUtPnN0YXRlID0gR1BSU19MTE1TX0FTU0lHTkVEOworCX0gZWxzZSBpZiAob2xkX3RsbGkgIT0gMHhmZmZmZmZmZiAmJiBuZXdfdGxsaSA9PSAweGZmZmZmZmZmKSB7CisJCS8qIFRMTEkgVW5hc3NpZ25tZW50IDguMy4zKSAqLworCQlsbG1lLT50bGxpID0gbGxtZS0+b2xkX3RsbGkgPSAwOworCQlsbG1lLT5zdGF0ZSA9IEdQUlNfTExNU19VTkFTU0lHTkVEOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsbG1lLT5sbGUpOyBpKyspIHsKKwkJCXN0cnVjdCBncHJzX2xsY19sbGUgKmwgPSAmbGxtZS0+bGxlW2ldOworCQkJbC0+c3RhdGUgPSBHUFJTX0xMRVNfVU5BU1NJR05FRDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2xsY192dHkuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19sbGNfdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5MWEzYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19sbGNfdnR5LmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qIFZUWSBpbnRlcmZhY2UgZm9yIG91ciBHUFJTIExMQyBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19sbGMuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKworc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX2xsY19zdGF0ZV9zdHJzW10gPSB7CisJeyBHUFJTX0xMRVNfVU5BU1NJR05FRCwgCSJUTExJIFVuYXNzaWduZWQiIH0sCisJeyBHUFJTX0xMRVNfQVNTSUdORURfQURNLAkiVExMSSBBc3NpZ25lZCIgfSwKKwl7IEdQUlNfTExFU19MT0NBTF9FU1QsCQkiTG9jYWwgRXN0YWJsaXNobWVudCIgfSwKKwl7IEdQUlNfTExFU19SRU1PVEVfRVNULAkJIlJlbW90ZSBFc3RhYmxpc2htZW50IiB9LAorCXsgR1BSU19MTEVTX0FCTSwJCSJBc3luY2hyb25vdXMgQmFsYW5jZWQgTW9kZSIgfSwKKwl7IEdQUlNfTExFU19MT0NBTF9SRUwsCQkiTG9jYWwgUmVsZWFzZSIgfSwKKwl7IEdQUlNfTExFU19USU1FUl9SRUMsCQkiVGltZXIgUmVjb3ZlcnkiIH0sCit9OworCitzdGF0aWMgdm9pZCB2dHlfZHVtcF9sbGUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGUpCit7CisJc3RydWN0IGdwcnNfbGxjX3BhcmFtcyAqcGFyID0gJmxsZS0+cGFyYW1zOworCXZ0eV9vdXQodnR5LCAiIFNBUEkgJTJ1IFN0YXRlICVzIFZVc2VuZD0ldSwgVlVyZWN2PSV1IiwgbGxlLT5zYXBpLCAKKwkJZ2V0X3ZhbHVlX3N0cmluZyhncHJzX2xsY19zdGF0ZV9zdHJzLCBsbGUtPnN0YXRlKSwKKwkJbGxlLT52dV9zZW5kLCBsbGUtPnZ1X3JlY3YpOworCXZ0eV9vdXQodnR5LCAiIFZzZW50PSV1IFZhY2s9JXUgVnJlY3Y9JXUsIFJldHJhbnNDdHI9JXUlcyIsCisJCWxsZS0+dl9zZW50LCBsbGUtPnZfYWNrLCBsbGUtPnZfcmVjdiwKKwkJbGxlLT5yZXRyYW5zX2N0ciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBUMjAwPSV1LCBOMjAwPSV1LCBOMjAxLVU9JXUsIE4yMDEtST0ldSwgbUQ9JXUsICIKKwkJIm1VPSV1LCBrRD0ldSwga1U9JXUlcyIsIHBhci0+dDIwMF8yMDEsIHBhci0+bjIwMCwKKwkJcGFyLT5uMjAxX3UsIHBhci0+bjIwMV9pLCBwYXItPm1ELCBwYXItPm1VLCBwYXItPmtELAorCQlwYXItPmtVLCBWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB1aW50OF90IHZhbGlkX3NhcGlzW10gPSB7IDEsIDIsIDMsIDUsIDcsIDgsIDksIDExIH07CisKK3N0YXRpYyB2b2lkIHZ0eV9kdW1wX2xsbWUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3Byc19sbGNfbGxtZSAqbGxtZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXZ0eV9vdXQodnR5LCAiVExMSSAlMDh4IChPbGQgVExMSSAlMDh4KSBCVkNJPSV1IE5TRUk9JXU6IFN0YXRlICVzJXMiLAorCQlsbG1lLT50bGxpLCBsbG1lLT5vbGRfdGxsaSwgbGxtZS0+YnZjaSwgbGxtZS0+bnNlaSwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhncHJzX2xsY19zdGF0ZV9zdHJzLCBsbG1lLT5zdGF0ZSksIFZUWV9ORVdMSU5FKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbGlkX3NhcGlzKTsgaSsrKSB7CisJCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZTsKKwkJdWludDhfdCBzYXBpID0gdmFsaWRfc2FwaXNbaV07CisKKwkJaWYgKHNhcGkgPj0gQVJSQVlfU0laRShsbG1lLT5sbGUpKQorCQkJY29udGludWU7CisKKwkJbGxlID0gJmxsbWUtPmxsZVtzYXBpXTsKKwkJdnR5X2R1bXBfbGxlKHZ0eSwgbGxlKTsKKwl9Cit9CisKKworREVGVU4oc2hvd19sbGMsIHNob3dfbGxjX2NtZCwKKwkic2hvdyBsbGMiLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBMTEMgcHJvdG9jb2wiKQoreworCXN0cnVjdCBncHJzX2xsY19sbG1lICpsbG1lOworCisJdnR5X291dCh2dHksICJTdGF0ZSBvZiBMTEMgRW50aXRpZXMlcyIsIFZUWV9ORVdMSU5FKTsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShsbG1lLCAmZ3Byc19sbGNfbGxtZXMsIGxpc3QpIHsKKwkJdnR5X2R1bXBfbGxtZSh2dHksIGxsbWUpOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBncHJzX2xsY192dHlfaW5pdCh2b2lkKQoreworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19sbGNfY21kKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX25zLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGIxZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX25zLmMKQEAgLTAsMCArMSw5ODkgQEAKKy8qIEdQUlMgTmV0d29ya3MgU2VydmljZSAoTlMpIG1lc3NhZ2VzIG9uIHRoZSBHYiBpbnRlcmZhY2VidmNpID0gbXNnYl9idmNpKG1zZyk7CisgKiAzR1BQIFRTIDA4LjE2IHZlcnNpb24gOC4wLjEgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDEgMjk5IFY4LjAuMSAoMjAwMi0wNSkgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisvKiBTb21lIGludHJvZHVjdGlvbiBpbnRvIE5TOiAgTlMgaXMgdXNlZCB0eXBpY2FsbHkgb24gdG9wIG9mIGZyYW1lIHJlbGF5LAorICogYnV0IGluIHRoZSBpcC5hY2Nlc3Mgd29ybGQgaXQgaXMgZW5jYXBzdWxhdGVkIGluIFVEUCBwYWNrZXRzLiAgSXQgc2VydmVzCisgKiBhcyBhbiBpbnRlcm1lZGlhdGUgc2hpbSBiZXR3ZW4gQlNTR1AgYW5kIHRoZSB1bmRlcmx5aW5nIG1lZGl1bS4gIEl0IGRvZXNuJ3QKKyAqIGRvIG11Y2gsIGFwYXJ0IGZyb20gcHJvdmlkaW5nIGNvbmdlc3Rpb24gbm90aWZpY2F0aW9uIGFuZCBzdGF0dXMgaW5kaWNhdGlvbi4KKyAqCisgKiBUZXJtczoKKyAqIAlOUwkJTmV0d29yayBTZXJ2aWNlCisgKglOU1ZDCQlOUyBWaXJ0dWFsIENvbm5lY3Rpb24KKyAqCU5TRUkJCU5TIEVudGl0eSBJZGVudGlmaWVyCisgKglOU1ZMCQlOUyBWaXJ0dWFsIExpbmsKKyAqCU5TVkxJCQlOUyBWaXJ0dWFsIExpbmsgSWRlbnRpZmllcgorICoJQlZDCQlCU1NHUCBWaXJ0dWFsIENvbm5lY3Rpb24KKyAqCUJWQ0kJCUJTU0dQIFZpcnR1YWwgQ29ubmVjdGlvbiBJZGVudGlmaWVyCisgKglOU1ZDRwkJTlMgVmlydHVhbCBDb25uZWN0aW9uIEdvdXAKKyAqCUJsb2NrZWQJCU5TLVZDIGNhbm5vdCBiZSB1c2VkIGZvciB1c2VyIHRyYWZmaWMKKyAqCUFsaXZlCQlBYmlsaXR5IG9mIGEgTlMtVkMgdG8gcHJvdmlkZSBjb21tdW5pY2F0aW9uCisgKgorICogIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBCU1NHUCB2aXJ0dWFsIGNvbm5lY3Rpb25zIG92ZXIgb25lIChncm91cCBvZikgTlNWQydzLiAgQlNTR1Agd2lsbAorICogdGhlcmVmb3JlIGlkZW50aWZ5IHRoZSBCU1NHUCB2aXJ0dWFsIGNvbm5lY3Rpb24gYnkgYSBCVkNJIHBhc3NlZCBkb3duIHRvIE5TLgorICogTlMgdGhlbiBoYXMgdG8gZmlyZ3VyZSBvdXQgd2hpY2ggTlNWQydzIGFyZSByZXNwb25zaWJsZSBmb3IgdGhpcyBCVkNJLgorICogVGhvc2UgbWFwcGluZ3MgYXJlIGFkbWluaXN0cmF0aXZlbHkgY29uZmlndXJlZC4KKyAqLworCisvKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOgorICogIG8gT25seSBvbmUgTlMtVkMgZm9yIGVhY2ggTlNFOiBObyBsb2FkLXNoYXJpbmcgZnVuY3Rpb24KKyAqICBvIE5TVkNJIDY1NTM1IGFuZCA2NTUzNCBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZQorICogIG8gT25seSBVRFAgaXMgc3VwcG9ydGVkIGFzIG9mIG5vdywgbm8gZnJhbWUgcmVsYXkgc3VwcG9ydAorICogIG8gVGhlIElQIFN1Yi1OZXR3b3JrLVNlcnZpY2UgKFNOUykgYXMgc3BlY2lmaWVkIGluIDQ4LjAxNiBpcyBub3QgaW1wbGVtZW50ZWQKKyAqICBvIFRoZXJlIGFyZSBubyBCTE9DSyBhbmQgVU5CTE9DSyB0aW1lcnMgKHlldD8pCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcmF0ZV9jdHIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnNfZnJncmUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NvY2tldC5oPgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIG5zX2F0dF90bHZkZWYgPSB7CisJLmRlZiA9IHsKKwkJW05TX0lFX0NBVVNFXQk9IHsgVExWX1RZUEVfVHZMViwgMCB9LAorCQlbTlNfSUVfVkNJXQk9IHsgVExWX1RZUEVfVHZMViwgMCB9LAorCQlbTlNfSUVfUERVXQk9IHsgVExWX1RZUEVfVHZMViwgMCB9LAorCQlbTlNfSUVfQlZDSV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX05TRUldCT0geyBUTFZfVFlQRV9UdkxWLCAwIH0sCisJfSwKK307CisKK2VudW0gbnNfY3RyIHsKKwlOU19DVFJfUEtUU19JTiwKKwlOU19DVFJfUEtUU19PVVQsCisJTlNfQ1RSX0JZVEVTX0lOLAorCU5TX0NUUl9CWVRFU19PVVQsCisJTlNfQ1RSX0JMT0NLRUQsCisJTlNfQ1RSX0RFQUQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2Rlc2MgbnN2Y19jdHJfZGVzY3JpcHRpb25bXSA9IHsKKwl7ICJwYWNrZXRzLmluIiwgIlBhY2tldHMgYXQgTlMgTGV2ZWwgKCBJbikiIH0sCisJeyAicGFja2V0cy5vdXQiLCJQYWNrZXRzIGF0IE5TIExldmVsIChPdXQpIiB9LAorCXsgImJ5dGVzLmluIiwJIkJ5dGVzIGF0IE5TIExldmVsICAgKCBJbikiIH0sCisJeyAiYnl0ZXMub3V0IiwJIkJ5dGVzIGF0IE5TIExldmVsICAgKE91dCkiIH0sCisJeyAiYmxvY2tlZCIsCSJOUy1WQyBCbG9jayBjb3VudCAgICAgICAgIiB9LAorCXsgImRlYWQiLAkiTlMtVkMgZ29uZSBkZWFkIGNvdW50ICAgICIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXBfZGVzYyBuc3ZjX2N0cmdfZGVzYyA9IHsKKwkuZ3JvdXBfbmFtZV9wcmVmaXggPSAibnMubnN2YyIsCisJLmdyb3VwX2Rlc2NyaXB0aW9uID0gIk5TVkMgUGVlciBTdGF0aXN0aWNzIiwKKwkubnVtX2N0ciA9IEFSUkFZX1NJWkUobnN2Y19jdHJfZGVzY3JpcHRpb24pLAorCS5jdHJfZGVzYyA9IG5zdmNfY3RyX2Rlc2NyaXB0aW9uLAorfTsKKworLyogTG9va3VwIHN0cnVjdCBncHJzX25zdmMgYmFzZWQgb24gTlNWQ0kgKi8KK3N0cnVjdCBncHJzX25zdmMgKm5zdmNfYnlfbnN2Y2koc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCB1aW50MTZfdCBuc3ZjaSkKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zdmMsICZuc2ktPmdwcnNfbnN2Y3MsIGxpc3QpIHsKKwkJaWYgKG5zdmMtPm5zdmNpID09IG5zdmNpKQorCQkJcmV0dXJuIG5zdmM7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBMb29rdXAgc3RydWN0IGdwcnNfbnN2YyBiYXNlZCBvbiBOU1ZDSSAqLworc3RydWN0IGdwcnNfbnN2YyAqbnN2Y19ieV9uc2VpKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgdWludDE2X3QgbnNlaSkKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zdmMsICZuc2ktPmdwcnNfbnN2Y3MsIGxpc3QpIHsKKwkJaWYgKG5zdmMtPm5zZWkgPT0gbnNlaSkKKwkJCXJldHVybiBuc3ZjOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogTG9va3VwIHN0cnVjdCBncHJzX25zdmMgYmFzZWQgb24gcmVtb3RlIHBlZXIgc29ja2V0IGFkZHIgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjX2J5X3JlbV9hZGRyKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwKKwkJCQkJICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbikKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zdmMsICZuc2ktPmdwcnNfbnN2Y3MsIGxpc3QpIHsKKwkJaWYgKG5zdmMtPmlwLmJ0c19hZGRyLnNpbl9hZGRyLnNfYWRkciA9PQorCQkJCQlzaW4tPnNpbl9hZGRyLnNfYWRkciAmJgorCQkgICAgbnN2Yy0+aXAuYnRzX2FkZHIuc2luX3BvcnQgPT0gc2luLT5zaW5fcG9ydCkKKwkJCXJldHVybiBuc3ZjOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZ3Byc19uc190aW1lcl9jYih2b2lkICpkYXRhKTsKKworc3RydWN0IGdwcnNfbnN2YyAqbnN2Y19jcmVhdGUoc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCB1aW50MTZfdCBuc3ZjaSkKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TVkNJPSV1IENyZWF0aW5nIE5TLVZDXG4iLCBuc3ZjaSk7CisKKwluc3ZjID0gdGFsbG9jX3plcm8obnNpLCBzdHJ1Y3QgZ3Byc19uc3ZjKTsKKwluc3ZjLT5uc3ZjaSA9IG5zdmNpOworCS8qIGJlZm9yZSBSRVNFVCBwcm9jZWR1cmU6IEJMT0NLRUQgYW5kIERFQUQgKi8KKwluc3ZjLT5zdGF0ZSA9IE5TRV9TX0JMT0NLRUQ7CisJbnN2Yy0+bnNpID0gbnNpOworCW5zdmMtPnRpbWVyLmNiID0gZ3Byc19uc190aW1lcl9jYjsKKwluc3ZjLT50aW1lci5kYXRhID0gbnN2YzsKKwluc3ZjLT5jdHJnID0gcmF0ZV9jdHJfZ3JvdXBfYWxsb2MobnN2YywgJm5zdmNfY3RyZ19kZXNjLCBuc3ZjaSk7CisKKwlsbGlzdF9hZGQoJm5zdmMtPmxpc3QsICZuc2ktPmdwcnNfbnN2Y3MpOworCisJcmV0dXJuIG5zdmM7Cit9CisKK3ZvaWQgbnN2Y19kZWxldGUoc3RydWN0IGdwcnNfbnN2YyAqbnN2YykKK3sKKwlpZiAoYnNjX3RpbWVyX3BlbmRpbmcoJm5zdmMtPnRpbWVyKSkKKwkJYnNjX2RlbF90aW1lcigmbnN2Yy0+dGltZXIpOworCWxsaXN0X2RlbCgmbnN2Yy0+bGlzdCk7CisJdGFsbG9jX2ZyZWUobnN2Yyk7Cit9CisKK3N0YXRpYyB2b2lkIG5zX2Rpc3BhdGNoX3NpZ25hbChzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJICAgICAgIHVpbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG5zX3NpZ25hbF9kYXRhIG5zc2Q7CisKKwluc3NkLm5zdmMgPSBuc3ZjOworCW5zc2QuY2F1c2UgPSBjYXVzZTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19OUywgc2lnbmFsLCAmbnNzZCk7Cit9CisKKy8qIFNlY3Rpb24gMTAuMy4yLCBUYWJsZSAxMyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbnNfY2F1c2Vfc3RyW10gPSB7CisJeyBOU19DQVVTRV9UUkFOU0lUX0ZBSUwsCSJUcmFuc2l0IG5ldHdvcmsgZmFpbHVyZSIgfSwKKwl7IE5TX0NBVVNFX09NX0lOVEVSVkVOVElPTiwgCSJPJk0gaW50ZXJ2ZW50aW9uIiB9LAorCXsgTlNfQ0FVU0VfRVFVSVBfRkFJTCwJCSJFcXVpcG1lbnQgZmFpbHVyZSIgfSwKKwl7IE5TX0NBVVNFX05TVkNfQkxPQ0tFRCwJIk5TLVZDIGJsb2NrZWQiIH0sCisJeyBOU19DQVVTRV9OU1ZDX1VOS05PV04sCSJOUy1WQyB1bmtub3duIiB9LAorCXsgTlNfQ0FVU0VfQlZDSV9VTktOT1dOLAkiQlZDSSB1bmtub3duIiB9LAorCXsgTlNfQ0FVU0VfU0VNX0lOQ09SUl9QRFUsCSJTZW1hbnRpY2FsbHkgaW5jb3JyZWN0IFBEVSIgfSwKKwl7IE5TX0NBVVNFX1BEVV9JTkNPTVBfUFNUQVRFLAkiUERVIG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUiIH0sCisJeyBOU19DQVVTRV9QUk9UT19FUlJfVU5TUEVDLAkiUHJvdG9jb2wgZXJyb3IsIHVuc3BlY2lmaWVkIiB9LAorCXsgTlNfQ0FVU0VfSU5WQUxfRVNTRU5UX0lFLAkiSW52YWxpZCBlc3NlbnRpYWwgSUUiIH0sCisJeyBOU19DQVVTRV9NSVNTSU5HX0VTU0VOVF9JRSwJIk1pc3NpbmcgZXNzZW50aWFsIElFIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpncHJzX25zX2NhdXNlX3N0cihlbnVtIG5zX2NhdXNlIGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKG5zX2NhdXNlX3N0ciwgY2F1c2UpOworfQorCitzdGF0aWMgaW50IG5zaXBfc2VuZG1zZyhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK2V4dGVybiBpbnQgZ3Jwc19uc19mcmdyZV9zZW5kbXNnKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpOworCitzdGF0aWMgaW50IGdwcnNfbnNfdHgoc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpbnQgcmV0OworCisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisKKwkvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIFVwbGluayBieXRlcyAqLworCXJhdGVfY3RyX2luYygmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9QS1RTX09VVF0pOworCXJhdGVfY3RyX2FkZCgmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9CWVRFU19PVVRdLCBtc2diX2wybGVuKG1zZykpOworCisJc3dpdGNoIChuc3ZjLT5sbCkgeworCWNhc2UgR1BSU19OU19MTF9VRFA6CisJCXJldCA9IG5zaXBfc2VuZG1zZyhuc3ZjLCBtc2cpOworCQlicmVhazsKKwljYXNlIEdQUlNfTlNfTExfRlJfR1JFOgorCQlyZXQgPSBncHJzX25zX2ZyZ3JlX3NlbmRtc2cobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZCBOUyBsaW5rbGF5ZXIgJXVcbiIsIG5zdmMtPmxsKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldCA9IC1FSU87CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdwcnNfbnNfdHhfc2ltcGxlKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgcGR1X3R5cGUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdwcnNfbnNfbXNnYl9hbGxvYygpOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpuc2gpKTsKKwluc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCisJbnNoLT5wZHVfdHlwZSA9IHBkdV90eXBlOworCisJcmV0dXJuIGdwcnNfbnNfdHgobnN2YywgbXNnKTsKK30KKworaW50IGdwcnNfbnNfdHhfcmVzZXQoc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3Byc19uc19tc2diX2FsbG9jKCk7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2g7CisJdWludDE2X3QgbnN2Y2kgPSBodG9ucyhuc3ZjLT5uc3ZjaSk7CisJdWludDE2X3QgbnNlaSA9IGh0b25zKG5zdmMtPm5zZWkpOworCisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBUeCBOUyBSRVNFVCAoTlNWQ0k9JXUsIGNhdXNlPSVzKVxuIiwKKwkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2ksIGdwcnNfbnNfY2F1c2Vfc3RyKGNhdXNlKSk7CisKKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpuc2gpKTsKKwluc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCW5zaC0+cGR1X3R5cGUgPSBOU19QRFVUX1JFU0VUOworCisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX0NBVVNFLCAxLCAmY2F1c2UpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9WQ0ksIDIsICh1aW50OF90ICopICZuc3ZjaSk7CisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX05TRUksIDIsICh1aW50OF90ICopICZuc2VpKTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7CisKK30KKworaW50IGdwcnNfbnNfdHhfc3RhdHVzKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UsCisJCSAgICAgIHVpbnQxNl90IGJ2Y2ksIHN0cnVjdCBtc2diICpvcmlnX21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3Byc19uc19tc2diX2FsbG9jKCk7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2g7CisJdWludDE2X3QgbnN2Y2kgPSBodG9ucyhuc3ZjLT5uc3ZjaSk7CisKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9OU1ZDLCBuc3ZjKTsKKworCWJ2Y2kgPSBodG9ucyhidmNpKTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUxPR1AoRE5TLCBMT0dMX05PVElDRSwgIk5TRUk9JXUgVHggTlMgU1RBVFVTIChOU1ZDST0ldSwgY2F1c2U9JXMpXG4iLAorCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSwgZ3Byc19uc19jYXVzZV9zdHIoY2F1c2UpKTsKKworCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBzaXplb2YoKm5zaCkpOworCW5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJbnNoLT5wZHVfdHlwZSA9IE5TX1BEVVRfU1RBVFVTOworCisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX0NBVVNFLCAxLCAmY2F1c2UpOworCisJLyogU2VjdGlvbiA5LjIuNy4xOiBTdGF0aWMgY29uZGl0aW9ucyBmb3IgTlMtVkNJICovCisJaWYgKGNhdXNlID09IE5TX0NBVVNFX05TVkNfQkxPQ0tFRCB8fAorCSAgICBjYXVzZSA9PSBOU19DQVVTRV9OU1ZDX1VOS05PV04pCisJCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9WQ0ksIDIsICh1aW50OF90ICopJm5zdmNpKTsKKworCS8qIFNlY3Rpb24gOS4yLjcuMjogU3RhdGljIGNvbmRpdGlvbnMgZm9yIE5TIFBEVSAqLworCXN3aXRjaCAoY2F1c2UpIHsKKwljYXNlIE5TX0NBVVNFX1NFTV9JTkNPUlJfUERVOgorCWNhc2UgTlNfQ0FVU0VfUERVX0lOQ09NUF9QU1RBVEU6CisJY2FzZSBOU19DQVVTRV9QUk9UT19FUlJfVU5TUEVDOgorCWNhc2UgTlNfQ0FVU0VfSU5WQUxfRVNTRU5UX0lFOgorCWNhc2UgTlNfQ0FVU0VfTUlTU0lOR19FU1NFTlRfSUU6CisJCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9QRFUsIG1zZ2JfbDJsZW4ob3JpZ19tc2cpLAorCQkJICAgICAgb3JpZ19tc2ctPmwyaCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIFNlY3Rpb24gOS4yLjcuMzogU3RhdGljIGNvbmRpdGlvbnMgZm9yIEJWQ0kgKi8KKwlpZiAoY2F1c2UgPT0gTlNfQ0FVU0VfQlZDSV9VTktOT1dOKQorCQltc2diX3R2bHZfcHV0KG1zZywgTlNfSUVfVkNJLCAyLCAodWludDhfdCAqKSZidmNpKTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7Cit9CisKK2ludCBncHJzX25zX3R4X2Jsb2NrKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdwcnNfbnNfbXNnYl9hbGxvYygpOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCXVpbnQxNl90IG5zdmNpID0gaHRvbnMobnN2Yy0+bnN2Y2kpOworCisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBUeCBOUyBCTE9DSyAoTlNWQ0k9JXUsIGNhdXNlPSVzKVxuIiwKKwkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2ksIGdwcnNfbnNfY2F1c2Vfc3RyKGNhdXNlKSk7CisKKwkvKiBiZSBjb25zZXJ2YXRpdmUgYW5kIG1hcmsgaXQgYXMgYmxvY2tlZCBldmVuIG5vdyEgKi8KKwluc3ZjLT5zdGF0ZSB8PSBOU0VfU19CTE9DS0VEOworCXJhdGVfY3RyX2luYygmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9CTE9DS0VEXSk7CisKKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpuc2gpKTsKKwluc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCW5zaC0+cGR1X3R5cGUgPSBOU19QRFVUX0JMT0NLOworCisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX0NBVVNFLCAxLCAmY2F1c2UpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9WQ0ksIDIsICh1aW50OF90ICopICZuc3ZjaSk7CisKKwlyZXR1cm4gZ3Byc19uc190eChuc3ZjLCBtc2cpOworfQorCitpbnQgZ3Byc19uc190eF91bmJsb2NrKHN0cnVjdCBncHJzX25zdmMgKm5zdmMpCit7CisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgVHggTlMgVU5CTE9DSyAoTlNWQ0k9JXUpXG4iLAorCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSk7CisKKwlyZXR1cm4gZ3Byc19uc190eF9zaW1wbGUobnN2YywgTlNfUERVVF9VTkJMT0NLKTsKK30KKworaW50IGdwcnNfbnNfdHhfYWxpdmUoc3RydWN0IGdwcnNfbnN2YyAqbnN2YykKK3sKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9OU1ZDLCBuc3ZjKTsKKwlMT0dQKEROUywgTE9HTF9ERUJVRywgIk5TRUk9JXUgVHggTlMgQUxJVkUgKE5TVkNJPSV1KVxuIiwKKwkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2kpOworCisJcmV0dXJuIGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfQUxJVkUpOworfQorCitpbnQgZ3Byc19uc190eF9hbGl2ZV9hY2soc3RydWN0IGdwcnNfbnN2YyAqbnN2YykKK3sKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9OU1ZDLCBuc3ZjKTsKKwlMT0dQKEROUywgTE9HTF9ERUJVRywgIk5TRUk9JXUgVHggTlMgQUxJVkVfQUNLIChOU1ZDST0ldSlcbiIsCisJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpKTsKKworCXJldHVybiBncHJzX25zX3R4X3NpbXBsZShuc3ZjLCBOU19QRFVUX0FMSVZFX0FDSyk7Cit9CisKK3N0YXRpYyBjb25zdCBlbnVtIG5zX3RpbWVvdXQgdGltZXJfbW9kZV90b3V0W19OU1ZDX1RJTUVSX05SXSA9IHsKKwlbTlNWQ19USU1FUl9UTlNfUkVTRVRdCT0gTlNfVE9VVF9UTlNfUkVTRVQsCisJW05TVkNfVElNRVJfVE5TX0FMSVZFXQk9IE5TX1RPVVRfVE5TX0FMSVZFLAorCVtOU1ZDX1RJTUVSX1ROU19URVNUXQk9IE5TX1RPVVRfVE5TX1RFU1QsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyB0aW1lcl9tb2RlX3N0cnNbXSA9IHsKKwl7IE5TVkNfVElNRVJfVE5TX1JFU0VULCAidG5zLXJlc2V0IiB9LAorCXsgTlNWQ19USU1FUl9UTlNfQUxJVkUsICJ0bnMtYWxpdmUiIH0sCisJeyBOU1ZDX1RJTUVSX1ROU19URVNULCAidG5zLXRlc3QiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0YXRpYyB2b2lkIG5zdmNfc3RhcnRfdGltZXIoc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgZW51bSBuc3ZjX3RpbWVyX21vZGUgbW9kZSkKK3sKKwllbnVtIG5zX3RpbWVvdXQgdG91dCA9IHRpbWVyX21vZGVfdG91dFttb2RlXTsKKwl1bnNpZ25lZCBpbnQgc2Vjb25kcyA9IG5zdmMtPm5zaS0+dGltZW91dFt0b3V0XTsKKworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCURFQlVHUChETlMsICJOU0VJPSV1IFN0YXJ0aW5nIHRpbWVyIGluIG1vZGUgJXMgKCV1IHNlY29uZHMpXG4iLAorCQluc3ZjLT5uc2VpLCBnZXRfdmFsdWVfc3RyaW5nKHRpbWVyX21vZGVfc3RycywgbW9kZSksCisJCXNlY29uZHMpOworCQkKKwlpZiAoYnNjX3RpbWVyX3BlbmRpbmcoJm5zdmMtPnRpbWVyKSkKKwkJYnNjX2RlbF90aW1lcigmbnN2Yy0+dGltZXIpOworCisJbnN2Yy0+dGltZXJfbW9kZSA9IG1vZGU7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZuc3ZjLT50aW1lciwgc2Vjb25kcywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGdwcnNfbnNfdGltZXJfY2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjID0gZGF0YTsKKwllbnVtIG5zX3RpbWVvdXQgdG91dCA9IHRpbWVyX21vZGVfdG91dFtuc3ZjLT50aW1lcl9tb2RlXTsKKwl1bnNpZ25lZCBpbnQgc2Vjb25kcyA9IG5zdmMtPm5zaS0+dGltZW91dFt0b3V0XTsKKworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCURFQlVHUChETlMsICJOU0VJPSV1IFRpbWVyIGV4cGlyZWQgaW4gbW9kZSAlcyAoJXUgc2Vjb25kcylcbiIsCisJCW5zdmMtPm5zZWksIGdldF92YWx1ZV9zdHJpbmcodGltZXJfbW9kZV9zdHJzLCBuc3ZjLT50aW1lcl9tb2RlKSwKKwkJc2Vjb25kcyk7CisJCQorCXN3aXRjaCAobnN2Yy0+dGltZXJfbW9kZSkgeworCWNhc2UgTlNWQ19USU1FUl9UTlNfQUxJVkU6CisJCS8qIFRucy1hbGl2ZSBjYXNlOiB3ZSBleHBpcmVkIHdpdGhvdXQgcmVzcG9uc2UgISAqLworCQluc3ZjLT5hbGl2ZV9yZXRyaWVzKys7CisJCWlmIChuc3ZjLT5hbGl2ZV9yZXRyaWVzID4KKwkJCW5zdmMtPm5zaS0+dGltZW91dFtOU19UT1VUX1ROU19BTElWRV9SRVRSSUVTXSkgeworCQkJLyogbWFyayBhcyBkZWFkIGFuZCBibG9ja2VkICovCisJCQluc3ZjLT5zdGF0ZSA9IE5TRV9TX0JMT0NLRUQ7CisJCQlyYXRlX2N0cl9pbmMoJm5zdmMtPmN0cmctPmN0cltOU19DVFJfQkxPQ0tFRF0pOworCQkJcmF0ZV9jdHJfaW5jKCZuc3ZjLT5jdHJnLT5jdHJbTlNfQ1RSX0RFQURdKTsKKwkJCUxPR1AoRE5TLCBMT0dMX05PVElDRSwKKwkJCQkiTlNFST0ldSBUbnMtYWxpdmUgZXhwaXJlZCBtb3JlIHRoZW4gIgorCQkJCSIldSB0aW1lcywgYmxvY2tpbmcgTlMtVkNcbiIsIG5zdmMtPm5zZWksCisJCQkJbnN2Yy0+bnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX0FMSVZFX1JFVFJJRVNdKTsKKwkJCW5zX2Rpc3BhdGNoX3NpZ25hbChuc3ZjLCBTX05TX0FMSVZFX0VYUCwgMCk7CisJCQluc19kaXNwYXRjaF9zaWduYWwobnN2YywgU19OU19CTE9DSywgTlNfQ0FVU0VfTlNWQ19CTE9DS0VEKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBUbnMtdGVzdCBjYXNlOiBzZW5kIE5TLUFMSVZFIFBEVSAqLworCQlncHJzX25zX3R4X2FsaXZlKG5zdmMpOworCQkvKiBzdGFydCBUbnMtYWxpdmUgdGltZXIgKi8KKwkJbnN2Y19zdGFydF90aW1lcihuc3ZjLCBOU1ZDX1RJTUVSX1ROU19BTElWRSk7CisJCWJyZWFrOworCWNhc2UgTlNWQ19USU1FUl9UTlNfVEVTVDoKKwkJLyogVG5zLXRlc3QgY2FzZTogc2VuZCBOUy1BTElWRSBQRFUgKi8KKwkJZ3Byc19uc190eF9hbGl2ZShuc3ZjKTsKKwkJLyogc3RhcnQgVG5zLWFsaXZlIHRpbWVyICh0cmFuc2l0aW9uIGludG8gZmFzdGVyCisJCSAqIGFsaXZlIHJldHJhbnNtaXNzaW9ucykgKi8KKwkJbnN2Yy0+YWxpdmVfcmV0cmllcyA9IDA7CisJCW5zdmNfc3RhcnRfdGltZXIobnN2YywgTlNWQ19USU1FUl9UTlNfQUxJVkUpOworCQlicmVhazsKKwljYXNlIE5TVkNfVElNRVJfVE5TX1JFU0VUOgorCQkvKiBDaGFwdGVyIDcuMzogUmUtc2VuZCB0aGUgUkVTRVQgKi8KKwkJZ3Byc19uc190eF9yZXNldChuc3ZjLCBOU19DQVVTRV9PTV9JTlRFUlZFTlRJT04pOworCQkvKiBSZS1zdGFydCBUbnMtcmVzZXQgdGltZXIgKi8KKwkJbnN2Y19zdGFydF90aW1lcihuc3ZjLCBOU1ZDX1RJTUVSX1ROU19SRVNFVCk7CisJCWJyZWFrOworCWNhc2UgX05TVkNfVElNRVJfTlI6CisJCWJyZWFrOworCX0KK30KKworLyogU2VjdGlvbiA5LjIuNiAqLworc3RhdGljIGludCBncHJzX25zX3R4X3Jlc2V0X2FjayhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKQoreworCXN0cnVjdCBtc2diICptc2cgPSBncHJzX25zX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaDsKKwl1aW50MTZfdCBuc3ZjaSwgbnNlaTsKKworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5zdmNpID0gaHRvbnMobnN2Yy0+bnN2Y2kpOworCW5zZWkgPSBodG9ucyhuc3ZjLT5uc2VpKTsKKworCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBzaXplb2YoKm5zaCkpOworCW5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisKKwluc2gtPnBkdV90eXBlID0gTlNfUERVVF9SRVNFVF9BQ0s7CisKKwlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBUeCBOUyBSRVNFVCBBQ0sgKE5TVkNJPSV1KVxuIiwKKwkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2kpOworCisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX1ZDSSwgMiwgKHVpbnQ4X3QgKikmbnN2Y2kpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9OU0VJLCAyLCAodWludDhfdCAqKSZuc2VpKTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjEwOiB0cmFuc21pdCBzaWRlIC8gTlMtVU5JVERBVEEtUkVRVUVTVCBwcmltaXRpdmUgKi8KK2ludCBncHJzX25zX3NlbmRtc2coc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2g7CisJdWludDE2X3QgYnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaShuc2ksIG1zZ2JfbnNlaShtc2cpKTsKKwlpZiAoIW5zdmMpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJVbmFibGUgdG8gcmVzb2x2ZSBOU0VJICV1ICIKKwkJCSJ0byBOUy1WQyFcbiIsIG1zZ2JfbnNlaShtc2cpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX05TVkMsIG5zdmMpOworCisJaWYgKCEobnN2Yy0+c3RhdGUgJiBOU0VfU19BTElWRSkpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJOU0VJPSV1IGlzIG5vdCBhbGl2ZSwgY2Fubm90IHNlbmRcbiIsCisJCQluc3ZjLT5uc2VpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKG5zdmMtPnN0YXRlICYgTlNFX1NfQkxPQ0tFRCkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUgaXMgYmxvY2tlZCwgY2Fubm90IHNlbmRcbiIsCisJCQluc3ZjLT5uc2VpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwltc2ctPmwyaCA9IG1zZ2JfcHVzaChtc2csIHNpemVvZigqbnNoKSArIDMpOworCW5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJaWYgKCFuc2gpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJOb3QgZW5vdWdoIGhlYWRyb29tIGZvciBOUyBoZWFkZXJcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwluc2gtPnBkdV90eXBlID0gTlNfUERVVF9VTklUREFUQTsKKwkvKiBzcGFyZSBvY3RldCBpbiBkYXRhWzBdICovCisJbnNoLT5kYXRhWzFdID0gYnZjaSA+PiA4OworCW5zaC0+ZGF0YVsyXSA9IGJ2Y2kgJiAweGZmOworCisJcmV0dXJuIGdwcnNfbnNfdHgobnN2YywgbXNnKTsKK30KKworLyogU2VjdGlvbiA5LjIuMTA6IHJlY2VpdmUgc2lkZSAqLworc3RhdGljIGludCBncHJzX25zX3J4X3VuaXRkYXRhKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopbXNnLT5sMmg7CisJdWludDE2X3QgYnZjaTsKKworCWlmIChuc3ZjLT5zdGF0ZSAmIE5TRV9TX0JMT0NLRUQpCisJCXJldHVybiBncHJzX25zX3R4X3N0YXR1cyhuc3ZjLCBOU19DQVVTRV9OU1ZDX0JMT0NLRUQsCisJCQkJCSAwLCBtc2cpOworCisJLyogc3BhcmUgb2N0ZXQgaW4gZGF0YVswXSAqLworCWJ2Y2kgPSBuc2gtPmRhdGFbMV0gPDwgOCB8IG5zaC0+ZGF0YVsyXTsKKwltc2diX2Jzc2dwaChtc2cpID0gJm5zaC0+ZGF0YVszXTsKKwltc2diX2J2Y2kobXNnKSA9IGJ2Y2k7CisKKwkvKiBjYWxsIHVwcGVyIGxheWVyIChCU1NHUCkgKi8KKwlyZXR1cm4gbnN2Yy0+bnNpLT5jYihHUFJTX05TX0VWVF9VTklUX0RBVEEsIG5zdmMsIG1zZywgYnZjaSk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjcgKi8KK3N0YXRpYyBpbnQgZ3Byc19uc19yeF9zdGF0dXMoc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCBjYXVzZTsKKwlpbnQgcmM7CisKKwlMT0dQKEROUywgTE9HTF9OT1RJQ0UsICJOU0VJPSV1IFJ4IE5TIFNUQVRVUyAiLCBuc3ZjLT5uc2VpKTsKKworCXJjID0gdGx2X3BhcnNlKCZ0cCwgJm5zX2F0dF90bHZkZWYsIG5zaC0+ZGF0YSwKKwkJCW1zZ2JfbDJsZW4obXNnKSAtIHNpemVvZigqbnNoKSwgMCwgMCk7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQQyhETlMsIExPR0xfTk9USUNFLCAiRXJyb3IgZHVyaW5nIFRMViBQYXJzZVxuIik7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiTlNFST0ldSBSeCBOUyBTVEFUVVM6ICIKKwkJCSJFcnJvciBkdXJpbmcgVExWIFBhcnNlXG4iLCBuc3ZjLT5uc2VpKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfQ0FVU0UpKSB7CisJCUxPR1BDKEROUywgTE9HTF9JTkZPLCAibWlzc2luZyBjYXVzZSBJRVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhdXNlID0gKlRMVlBfVkFMKCZ0cCwgTlNfSUVfQ0FVU0UpOworCUxPR1BDKEROUywgTE9HTF9OT1RJQ0UsICJjYXVzZT0lc1xuIiwgZ3Byc19uc19jYXVzZV9zdHIoY2F1c2UpKTsKKworCXJldHVybiAwOworfQorCisvKiBTZWN0aW9uIDcuMyAqLworc3RhdGljIGludCBncHJzX25zX3J4X3Jlc2V0KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXVpbnQ4X3QgKmNhdXNlOworCXVpbnQxNl90ICpuc3ZjaSwgKm5zZWk7CisJaW50IHJjOworCisJcmMgPSB0bHZfcGFyc2UoJnRwLCAmbnNfYXR0X3RsdmRlZiwgbnNoLT5kYXRhLAorCQkJbXNnYl9sMmxlbihtc2cpIC0gc2l6ZW9mKCpuc2gpLCAwLCAwKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiTlNFST0ldSBSeCBOUyBSRVNFVCAiCisJCQkiRXJyb3IgZHVyaW5nIFRMViBQYXJzZVxuIiwgbnN2Yy0+bnNlaSk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIE5TX0lFX0NBVVNFKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfVkNJKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfTlNFSSkpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJOUyBSRVNFVCBNaXNzaW5nIG1hbmRhdG9yeSBJRVxuIik7CisJCWdwcnNfbnNfdHhfc3RhdHVzKG5zdmMsIE5TX0NBVVNFX01JU1NJTkdfRVNTRU5UX0lFLCAwLCBtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYXVzZSA9ICh1aW50OF90ICopIFRMVlBfVkFMKCZ0cCwgTlNfSUVfQ0FVU0UpOworCW5zdmNpID0gKHVpbnQxNl90ICopIFRMVlBfVkFMKCZ0cCwgTlNfSUVfVkNJKTsKKwluc2VpID0gKHVpbnQxNl90ICopIFRMVlBfVkFMKCZ0cCwgTlNfSUVfTlNFSSk7CisKKwlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBSeCBOUyBSRVNFVCAoTlNWQ0k9JXUsIGNhdXNlPSVzKVxuIiwKKwkJbnN2Yy0+bnN2Y2ksIG5zdmMtPm5zZWksIGdwcnNfbnNfY2F1c2Vfc3RyKCpjYXVzZSkpOworCisJLyogTWFyayBOUy1WQyBhcyBibG9ja2VkIGFuZCBhbGl2ZSAqLworCW5zdmMtPnN0YXRlID0gTlNFX1NfQkxPQ0tFRCB8IE5TRV9TX0FMSVZFOworCisJbnN2Yy0+bnNlaSA9IG50b2hzKCpuc2VpKTsKKwluc3ZjLT5uc3ZjaSA9IG50b2hzKCpuc3ZjaSk7CisKKwkvKiBzdGFydCB0aGUgdGVzdCBwcm9jZWR1cmUgKi8KKwlncHJzX25zX3R4X3NpbXBsZShuc3ZjLCBOU19QRFVUX0FMSVZFKTsKKwluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX1RFU1QpOworCisJLyogaW5mb3JtIGludGVyZXN0ZWQgcGFydGllcyBhYm91dCB0aGUgZmFjdCB0aGF0IHRoaXMgTlNWQworCSAqIGhhcyByZWNlaXZlZCBSRVNFVCAqLworCW5zX2Rpc3BhdGNoX3NpZ25hbChuc3ZjLCBTX05TX1JFU0VULCAqY2F1c2UpOworCisJcmV0dXJuIGdwcnNfbnNfdHhfcmVzZXRfYWNrKG5zdmMpOworfQorCitzdGF0aWMgaW50IGdwcnNfbnNfcnhfYmxvY2soc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCAqY2F1c2U7CisJaW50IHJjOworCisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUnggTlMgQkxPQ0tcbiIsIG5zdmMtPm5zZWkpOworCisJbnN2Yy0+c3RhdGUgfD0gTlNFX1NfQkxPQ0tFRDsKKworCXJjID0gdGx2X3BhcnNlKCZ0cCwgJm5zX2F0dF90bHZkZWYsIG5zaC0+ZGF0YSwKKwkJCW1zZ2JfbDJsZW4obXNnKSAtIHNpemVvZigqbnNoKSwgMCwgMCk7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUgUnggTlMgQkxPQ0sgIgorCQkJIkVycm9yIGR1cmluZyBUTFYgUGFyc2VcbiIsIG5zdmMtPm5zZWkpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9DQVVTRSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIE5TX0lFX1ZDSSkpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJOUyBSRVNFVCBNaXNzaW5nIG1hbmRhdG9yeSBJRVxuIik7CisJCWdwcnNfbnNfdHhfc3RhdHVzKG5zdmMsIE5TX0NBVVNFX01JU1NJTkdfRVNTRU5UX0lFLCAwLCBtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYXVzZSA9ICh1aW50OF90ICopIFRMVlBfVkFMKCZ0cCwgTlNfSUVfQ0FVU0UpOworCS8vbnN2Y2kgPSAodWludDE2X3QgKikgVExWUF9WQUwoJnRwLCBOU19JRV9WQ0kpOworCisJbnNfZGlzcGF0Y2hfc2lnbmFsKG5zdmMsIFNfTlNfQkxPQ0ssICpjYXVzZSk7CisJcmF0ZV9jdHJfaW5jKCZuc3ZjLT5jdHJnLT5jdHJbTlNfQ1RSX0JMT0NLRURdKTsKKworCXJldHVybiBncHJzX25zX3R4X3NpbXBsZShuc3ZjLCBOU19QRFVUX0JMT0NLX0FDSyk7Cit9CisKKy8qIG1haW4gZW50cnkgcG9pbnQsIGhlcmUgaW5jb21pbmcgTlMgZnJhbWVzIGVudGVyICovCitpbnQgZ3Byc19uc19yY3Ztc2coc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhZGRyLCBlbnVtIGdwcnNfbnNfbGwgbGwpCit7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJaW50IHJjID0gMDsKKworCS8qIGxvb2sgdXAgdGhlIE5TVkMgYmFzZWQgb24gc291cmNlIGFkZHJlc3MgKi8KKwluc3ZjID0gbnN2Y19ieV9yZW1fYWRkcihuc2ksIHNhZGRyKTsKKwlpZiAoIW5zdmMpIHsKKwkJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJCXVpbnQxNl90IG5zZWk7CisJCWlmIChuc2gtPnBkdV90eXBlID09IE5TX1BEVVRfU1RBVFVTKSB7CisJCQlMT0dQKEROUywgTE9HTF9JTkZPLCAiSWdub3JpbmcgTlMgU1RBVFVTIGZyb20gJXM6JXUgIgorCQkJICAgICAiZm9yIG5vbi1leGlzdGluZyBOUy1WQ1xuIiwKKwkJCSAgICAgaW5ldF9udG9hKHNhZGRyLT5zaW5fYWRkciksIG50b2hzKHNhZGRyLT5zaW5fcG9ydCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogT25seSB0aGUgUkVTRVQgcHJvY2VkdXJlIGNyZWF0ZXMgYSBuZXcgTlNWQyAqLworCQlpZiAobnNoLT5wZHVfdHlwZSAhPSBOU19QRFVUX1JFU0VUKSB7CisJCQkvKiBTaW5jZSB3ZSBoYXZlIG5vIE5TVkMsIHdlIGhhdmUgdG8gdXNlIGEgZmFrZSAqLworCQkJbnN2YyA9IG5zaS0+dW5rbm93bl9uc3ZjOworCQkJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisJCQlMT0dQKEROUywgTE9HTF9JTkZPLCAiUmVqZWN0aW5nIE5TIFBEVSB0eXBlIDB4JTB4ICIKKwkJCQkiZnJvbSAlczoldSBmb3Igbm9uLWV4aXN0aW5nIE5TLVZDXG4iLAorCQkJCW5zaC0+cGR1X3R5cGUsIGluZXRfbnRvYShzYWRkci0+c2luX2FkZHIpLAorCQkJCW50b2hzKHNhZGRyLT5zaW5fcG9ydCkpOworCQkJbnN2Yy0+bnN2Y2kgPSBuc3ZjLT5uc2VpID0gMHhmZmZlOworCQkJbnN2Yy0+aXAuYnRzX2FkZHIgPSAqc2FkZHI7CisJCQluc3ZjLT5zdGF0ZSA9IE5TRV9TX0FMSVZFOworCQkJbnN2Yy0+bGwgPSBsbDsKKyNpZiAwCisJCQlyZXR1cm4gZ3Byc19uc190eF9yZXNldChuc3ZjLCBOU19DQVVTRV9QRFVfSU5DT01QX1BTVEFURSk7CisjZWxzZQorCQkJcmV0dXJuIGdwcnNfbnNfdHhfc3RhdHVzKG5zdmMsCisJCQkJCQlOU19DQVVTRV9QRFVfSU5DT01QX1BTVEFURSwgMCwKKwkJCQkJCW1zZyk7CisjZW5kaWYKKwkJfQorCQlyYyA9IHRsdl9wYXJzZSgmdHAsICZuc19hdHRfdGx2ZGVmLCBuc2gtPmRhdGEsCisJCQkJbXNnYl9sMmxlbihtc2cpIC0gc2l6ZW9mKCpuc2gpLCAwLCAwKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJTE9HUChETlMsIExPR0xfRVJST1IsICJSeCBOUyBSRVNFVCBFcnJvciAlZCBkdXJpbmcgIgorCQkJCSJUTFYgUGFyc2VcbiIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIE5TX0lFX0NBVVNFKSB8fAorCQkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIE5TX0lFX1ZDSSkgfHwKKwkJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9OU0VJKSkgeworCQkJTE9HUChETlMsIExPR0xfRVJST1IsICJOUyBSRVNFVCBNaXNzaW5nIG1hbmRhdG9yeSBJRVxuIik7CisJCQlncHJzX25zX3R4X3N0YXR1cyhuc3ZjLCBOU19DQVVTRV9NSVNTSU5HX0VTU0VOVF9JRSwgMCwKKwkJCQkJICBtc2cpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbnNlaSA9IG50b2hzKCoodWludDE2X3QgKilUTFZQX1ZBTCgmdHAsIE5TX0lFX05TRUkpKTsKKwkJLyogQ2hlY2sgaWYgd2UgYWxyZWFkeSBrbm93IHRoaXMgTlNFSSwgdGhlIHJlbW90ZSBlbmQgbWlnaHQKKwkJICogc2ltcGx5IGhhdmUgY2hhbmdlZCBhZGRyZXNzZXMsIG9yIGl0IGlzIGEgU0dTTiAqLworCQluc3ZjID0gbnN2Y19ieV9uc2VpKG5zaSwgbnNlaSk7CisJCWlmICghbnN2YykgeworCQkJbnN2YyA9IG5zdmNfY3JlYXRlKG5zaSwgMHhmZmZmKTsKKwkJCW5zdmMtPmxsID0gbGw7CisJCQlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9OU1ZDLCBuc3ZjKTsKKwkJCUxPR1AoRE5TLCBMT0dMX0lORk8sICJDcmVhdGluZyBOUy1WQyBmb3IgQlNTIGF0ICVzOiV1XG4iLAorCQkJCWluZXRfbnRvYShzYWRkci0+c2luX2FkZHIpLCBudG9ocyhzYWRkci0+c2luX3BvcnQpKTsKKwkJfQorCQkvKiBVcGRhdGUgdGhlIHJlbW90ZSBwZWVyIElQIGFkZHJlc3MvcG9ydCAqLworCQluc3ZjLT5pcC5idHNfYWRkciA9ICpzYWRkcjsKKwl9IGVsc2UKKwkJbXNnYl9uc2VpKG1zZykgPSBuc3ZjLT5uc2VpOworCisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTlNWQywgbnN2Yyk7CisKKwkvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIEluY29taW5nIGJ5dGVzICovCisJcmF0ZV9jdHJfaW5jKCZuc3ZjLT5jdHJnLT5jdHJbTlNfQ1RSX1BLVFNfSU5dKTsKKwlyYXRlX2N0cl9hZGQoJm5zdmMtPmN0cmctPmN0cltOU19DVFJfQllURVNfSU5dLCBtc2diX2wybGVuKG1zZykpOworCisJc3dpdGNoIChuc2gtPnBkdV90eXBlKSB7CisJY2FzZSBOU19QRFVUX0FMSVZFOgorCQkvKiBJZiB3ZSdyZSBkZWFkIGFuZCBibG9ja2VkIGFuZCBzdWRkZW5seSByZWNlaXZlIGEKKwkJICogTlMtQUxJVkUgb3V0IG9mIHRoZSBibHVlLCB3ZSBtaWdodCBoYXZlIGJlZW4gcmUtc3RhcnRlZAorCQkgKiBhbmQgc2hvdWxkIHNlbmQgYSBOUy1SRVNFVCB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyByZWNvdmVycworCQkgKiBmaW5lLiAqLworCQlpZiAobnN2Yy0+c3RhdGUgPT0gTlNFX1NfQkxPQ0tFRCkKKwkJCXJjID0gZ3Byc19uc190eF9yZXNldChuc3ZjLCBOU19DQVVTRV9QRFVfSU5DT01QX1BTVEFURSk7CisJCWVsc2UKKwkJCXJjID0gZ3Byc19uc190eF9hbGl2ZV9hY2sobnN2Yyk7CisJCWJyZWFrOworCWNhc2UgTlNfUERVVF9BTElWRV9BQ0s6CisJCS8qIHN0b3AgVG5zLWFsaXZlIGFuZCBzdGFydCBUbnMtdGVzdCAqLworCQluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX1RFU1QpOworCQlpZiAobnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuKSB7CisJCQkvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgb25lIGxldmVsIGhpZ2hlciAqLworCQkJaWYgKG5zdmMtPnN0YXRlICYgTlNFX1NfQkxPQ0tFRCkKKwkJCQlyYyA9IGdwcnNfbnNfdHhfdW5ibG9jayhuc3ZjKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5TX1BEVVRfVU5JVERBVEE6CisJCS8qIGFjdHVhbCB1c2VyIGRhdGEgKi8KKwkJcmMgPSBncHJzX25zX3J4X3VuaXRkYXRhKG5zdmMsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgTlNfUERVVF9TVEFUVVM6CisJCXJjID0gZ3Byc19uc19yeF9zdGF0dXMobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1JFU0VUOgorCQlyYyA9IGdwcnNfbnNfcnhfcmVzZXQobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1JFU0VUX0FDSzoKKwkJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUnggTlMgUkVTRVQgQUNLXG4iLCBuc3ZjLT5uc2VpKTsKKwkJLyogbWFyayBOUy1WQyBhcyBibG9ja2VkICsgYWN0aXZlICovCisJCW5zdmMtPnN0YXRlID0gTlNFX1NfQkxPQ0tFRCB8IE5TRV9TX0FMSVZFOworCQluc3ZjLT5yZW1vdGVfc3RhdGUgPSBOU0VfU19CTE9DS0VEIHwgTlNFX1NfQUxJVkU7CisJCXJhdGVfY3RyX2luYygmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9CTE9DS0VEXSk7CisJCWlmIChuc3ZjLT5wZXJzaXN0ZW50IHx8IG5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbikgeworCQkJLyogc3RvcCBSRVNFVCB0aW1lciAqLworCQkJYnNjX2RlbF90aW1lcigmbnN2Yy0+dGltZXIpOworCQl9CisJCS8qIEluaXRpYXRlIFRFU1QgcHJvYy46IFNlbmQgQUxJVkUgYW5kIHN0YXJ0IHRpbWVyICovCisJCXJjID0gZ3Byc19uc190eF9zaW1wbGUobnN2YywgTlNfUERVVF9BTElWRSk7CisJCW5zdmNfc3RhcnRfdGltZXIobnN2YywgTlNWQ19USU1FUl9UTlNfVEVTVCk7CisJCWJyZWFrOworCWNhc2UgTlNfUERVVF9VTkJMT0NLOgorCQkvKiBTZWN0aW9uIDcuMjogdW5ibG9ja2luZyBwcm9jZWR1cmUgKi8KKwkJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUnggTlMgVU5CTE9DS1xuIiwgbnN2Yy0+bnNlaSk7CisJCW5zdmMtPnN0YXRlICY9IH5OU0VfU19CTE9DS0VEOworCQluc19kaXNwYXRjaF9zaWduYWwobnN2YywgU19OU19VTkJMT0NLLCAwKTsKKwkJcmMgPSBncHJzX25zX3R4X3NpbXBsZShuc3ZjLCBOU19QRFVUX1VOQkxPQ0tfQUNLKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1VOQkxPQ0tfQUNLOgorCQlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBSeCBOUyBVTkJMT0NLIEFDS1xuIiwgbnN2Yy0+bnNlaSk7CisJCS8qIG1hcmsgTlMtVkMgYXMgdW5ibG9ja2VkICsgYWN0aXZlICovCisJCW5zdmMtPnN0YXRlID0gTlNFX1NfQUxJVkU7CisJCW5zdmMtPnJlbW90ZV9zdGF0ZSA9IE5TRV9TX0FMSVZFOworCQluc19kaXNwYXRjaF9zaWduYWwobnN2YywgU19OU19VTkJMT0NLLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX0JMT0NLOgorCQlyYyA9IGdwcnNfbnNfcnhfYmxvY2sobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX0JMT0NLX0FDSzoKKwkJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUnggTlMgQkxPQ0sgQUNLXG4iLCBuc3ZjLT5uc2VpKTsKKwkJLyogbWFyayByZW1vdGUgTlMtVkMgYXMgYmxvY2tlZCArIGFjdGl2ZSAqLworCQluc3ZjLT5yZW1vdGVfc3RhdGUgPSBOU0VfU19CTE9DS0VEIHwgTlNFX1NfQUxJVkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5TLCBMT0dMX05PVElDRSwgIk5TRUk9JXUgUnggVW5rbm93biBOUyBQRFUgdHlwZSAweCUwMnhcbiIsCisJCQluc3ZjLT5uc2VpLCBuc2gtPnBkdV90eXBlKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgZ3Byc19uc19pbnN0ICpncHJzX25zX2luc3RhbnRpYXRlKGdwcnNfbnNfY2JfdCAqY2IpCit7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZ3Byc19uc19pbnN0KTsKKworCW5zaS0+Y2IgPSBjYjsKKwlJTklUX0xMSVNUX0hFQUQoJm5zaS0+Z3Byc19uc3Zjcyk7CisJbnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX0JMT0NLXSA9IDM7CisJbnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX0JMT0NLX1JFVFJJRVNdID0gMzsKKwluc2ktPnRpbWVvdXRbTlNfVE9VVF9UTlNfUkVTRVRdID0gMzsKKwluc2ktPnRpbWVvdXRbTlNfVE9VVF9UTlNfUkVTRVRfUkVUUklFU10gPSAzOworCW5zaS0+dGltZW91dFtOU19UT1VUX1ROU19URVNUXSA9IDMwOworCW5zaS0+dGltZW91dFtOU19UT1VUX1ROU19BTElWRV0gPSAzOworCW5zaS0+dGltZW91dFtOU19UT1VUX1ROU19BTElWRV9SRVRSSUVTXSA9IDEwOworCisJLyogQ3JlYXRlIHRoZSBkdW1teSBOU1ZDIHRoYXQgd2UgdXNlIGZvciBzZW5kaW5nCisJICogbWVzc2FnZXMgdG8gbm9uLWV4aXN0YW50L3Vua25vd24gTlMtVkMncyAqLworCW5zaS0+dW5rbm93bl9uc3ZjID0gbnN2Y19jcmVhdGUobnNpLCAweGZmZmUpOworCWxsaXN0X2RlbCgmbnNpLT51bmtub3duX25zdmMtPmxpc3QpOworCisJcmV0dXJuIG5zaTsKK30KKwordm9pZCBncHJzX25zX2Rlc3Ryb3koc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKQoreworCS8qIEZJWE1FOiBjbGVhciBhbGwgdGltZXJzICovCisKKwkvKiByZWN1cnNpdmVseSBmcmVlIHRoZSBOU0kgYW5kIGFsbCBpdHMgTlNWQ3MgKi8KKwl0YWxsb2NfZnJlZShuc2kpOworfQorCisKKy8qIE5TLW92ZXItSVAgY29kZSwgYWNjb3JkaW5nIHRvIDNHUFAgVFMgNDguMDE2IENoYXB0ZXIgNi4yCisgKiBXZSBkb24ndCBzdXBwb3J0IFNpemUgUHJvY2VkdXJlLCBDb25maWd1cmF0aW9uIFByb2NlZHVyZSwgQ2hhbmdlV2VpZ2h0IFByb2NlZHVyZSAqLworCisvKiBSZWFkIGEgc2luZ2xlIE5TLW92ZXItSVAgbWVzc2FnZSAqLworc3RhdGljIHN0cnVjdCBtc2diICpyZWFkX25zaXBfbXNnKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50ICplcnJvciwKKwkJCQkgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdwcnNfbnNfbXNnYl9hbGxvYygpOworCWludCByZXQgPSAwOworCXNvY2tsZW5fdCBzYWRkcl9sZW4gPSBzaXplb2YoKnNhZGRyKTsKKworCWlmICghbXNnKSB7CisJCSplcnJvciA9IC1FTk9NRU07CisJCXJldHVybiBOVUxMOworCX0KKworCXJldCA9IHJlY3Zmcm9tKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgTlNfQUxMT0NfU0laRSAtIE5TX0FMTE9DX0hFQURST09NLCAwLAorCQkJKHN0cnVjdCBzb2NrYWRkciAqKXNhZGRyLCAmc2FkZHJfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3IgJXMgZHVyaW5nIE5TSVAgcmVjdlxuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisJbXNnYl9wdXQobXNnLCByZXQpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RhdGljIGludCBoYW5kbGVfbnNpcF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcmVhZF9uc2lwX21zZyhiZmQsICZlcnJvciwgJnNhZGRyKTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGdwcnNfbnNfcmN2bXNnKG5zaSwgbXNnLCAmc2FkZHIsIEdQUlNfTlNfTExfVURQKTsKKworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9uc2lwX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwkvKiBGSVhNRTogYWN0dWFsbHkgc2VuZCB0aGUgZGF0YSBoZXJlIGluc3RlYWQgb2YgbnNpcF9zZW5kbXNnKCkgKi8KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBuc2lwX3NlbmRtc2coc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gbnN2Yy0+bnNpOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqZGFkZHIgPSAmbnN2Yy0+aXAuYnRzX2FkZHI7CisKKwlyYyA9IHNlbmR0byhuc2ktPm5zaXAuZmQuZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4sIDAsCisJCSAgKHN0cnVjdCBzb2NrYWRkciAqKWRhZGRyLCBzaXplb2YoKmRhZGRyKSk7CisKKwl0YWxsb2NfZnJlZShtc2cpOworCisJcmV0dXJuIHJjOworfQorCisvKiBVRFAgUG9ydCAyMzAwMCBjYXJyaWVzIHRoZSBMTEMtaW4tQlNTR1AtaW4tTlMgcHJvdG9jb2wgc3RhY2sgKi8KK3N0YXRpYyBpbnQgbnNpcF9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQlyYyA9IGhhbmRsZV9uc2lwX3JlYWQoYmZkKTsKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJcmMgPSBoYW5kbGVfbnNpcF93cml0ZShiZmQpOworCisJcmV0dXJuIHJjOworfQorCisvKiBMaXN0ZW4gZm9yIGluY29taW5nIEdQUlMgcGFja2V0cyAqLworaW50IGdwcnNfbnNfbnNpcF9saXN0ZW4oc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtYWtlX3NvY2soJm5zaS0+bnNpcC5mZCwgSVBQUk9UT19VRFAsIG5zaS0+bnNpcC5sb2NhbF9pcCwKKwkJCW5zaS0+bnNpcC5sb2NhbF9wb3J0LCBuc2lwX2ZkX2NiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW5zaS0+bnNpcC5mZC5kYXRhID0gbnNpOworCisJcmV0dXJuIHJldDsKK30KKworLyogSW5pdGlhdGUgYSBSRVNFVCBwcm9jZWR1cmUgKi8KK3ZvaWQgZ3Byc19uc3ZjX3Jlc2V0KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpCit7CisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUkVTRVQgcHJvY2VkdXJlIGJhc2VkIG9uIEFQSSByZXF1ZXN0XG4iLAorCQluc3ZjLT5uc2VpKTsKKworCS8qIE1hcmsgTlMtVkMgbG9jYWxseSBhcyBibG9ja2VkIGFuZCBkZWFkICovCisJbnN2Yy0+c3RhdGUgPSBOU0VfU19CTE9DS0VEOworCS8qIFNlbmQgTlMtUkVTRVQgUERVICovCisJaWYgKGdwcnNfbnNfdHhfcmVzZXQobnN2YywgY2F1c2UpIDwgMCkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUsIGVycm9yIHJlc2V0dGluZyBOUy1WQ1xuIiwKKwkJCW5zdmMtPm5zZWkpOworCX0KKwkvKiBTdGFydCBUbnMtcmVzZXQgKi8KKwluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX1JFU0VUKTsKK30KKworLyogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiAoZnJvbSB0aGUgQlNTKSB0byB0aGUgU0dTTiAqLworc3RydWN0IGdwcnNfbnN2YyAqbnNpcF9jb25uZWN0KHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRlc3QsIHVpbnQxNl90IG5zZWksCisJCQkJdWludDE2X3QgbnN2Y2kpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X3JlbV9hZGRyKG5zaSwgZGVzdCk7CisJaWYgKCFuc3ZjKQorCQluc3ZjID0gbnN2Y19jcmVhdGUobnNpLCBuc3ZjaSk7CisJbnN2Yy0+aXAuYnRzX2FkZHIgPSAqZGVzdDsKKwluc3ZjLT5uc2VpID0gbnNlaTsKKwluc3ZjLT5uc3ZjaSA9IG5zdmNpOworCW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA9IDE7CisKKwlncHJzX25zdmNfcmVzZXQobnN2YywgTlNfQ0FVU0VfT01fSU5URVJWRU5USU9OKTsKKwlyZXR1cm4gbnN2YzsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19uc19mcmdyZS5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX25zX2ZyZ3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzNmQwZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19uc19mcmdyZS5jCkBAIC0wLDAgKzEsMzA1IEBACisvKiBHUFJTIE5ldHdvcmtzIFNlcnZpY2UgKE5TKSBtZXNzYWdlcyBvbiB0aGUgR2IgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA4LjE2IHZlcnNpb24gOC4wLjEgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDEgMjk5IFY4LjAuMSAoMjAwMi0wNSkgKi8KKworLyogTlMtb3Zlci1GUi1vdmVyLUdSRSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3NvY2tldC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKworI2RlZmluZSBHUkVfUFRZUEVfRlIJMHg2NTU5CisjZGVmaW5lIEdSRV9QVFlQRV9JUHY0CTB4MDgwMAorI2RlZmluZSBHUkVfUFRZUEVfS0FSCTB4MDAwMAkvKiBrZWVwYWxpdmUgcmVzcG9uc2UgKi8KKworc3RydWN0IGdyZV9oZHIgeworCXVpbnQxNl90IGZsYWdzOworCXVpbnQxNl90IHB0eXBlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIElQdjQgbWVzc2FnZXMgaW5zaWRlIHRoZSBHUkUgdHVubmVsIG1pZ2h0IGJlIEdSRSBrZWVwYWxpdmVzICovCitzdGF0aWMgaW50IGhhbmRsZV9yeF9ncmVfaXB2NChzdHJ1Y3QgYnNjX2ZkICpiZmQsIHN0cnVjdCBtc2diICptc2csCisJCQkJc3RydWN0IGlwaGRyICppcGgsIHN0cnVjdCBncmVfaGRyICpncmVoKQoreworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IGJmZC0+ZGF0YTsKKwlpbnQgZ3JlX3BheWxvYWRfbGVuOworCXN0cnVjdCBpcGhkciAqaW5uZXJfaXBoOworCXN0cnVjdCBncmVfaGRyICppbm5lcl9ncmVoOworCXN0cnVjdCBzb2NrYWRkcl9pbiBkYWRkcjsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWdyZV9wYXlsb2FkX2xlbiA9IG1zZy0+bGVuIC0gKGlwaC0+aWhsKjQgKyBzaXplb2YoKmdyZWgpKTsKKworCWlubmVyX2lwaCA9IChzdHJ1Y3QgaXBoZHIgKikgKCh1aW50OF90ICopZ3JlaCArIHNpemVvZigqZ3JlaCkpOworCisJaWYgKGdyZV9wYXlsb2FkX2xlbiA8IGlubmVyX2lwaC0+aWhsKjQgKyBzaXplb2YoKmlubmVyX2dyZWgpKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiR1JFIGtlZXBhbGl2ZSB0b28gc2hvcnRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoaW5uZXJfaXBoLT5zYWRkciAhPSBpcGgtPmRhZGRyIHx8CisJICAgIGlubmVyX2lwaC0+ZGFkZHIgIT0gaXBoLT5zYWRkcikgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwKKwkJCSJHUkUga2VlcGFsaXZlIHdpdGggd3JvbmcgdHVubmVsIGFkZHJlc3Nlc1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChpbm5lcl9pcGgtPnByb3RvY29sICE9IElQUFJPVE9fR1JFKSB7CisJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiR1JFIGtlZXBhbGl2ZSB3aXRoIHdyb25nIHByb3RvY29sXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaW5uZXJfZ3JlaCA9IChzdHJ1Y3QgZ3JlX2hkciAqKSAoKHVpbnQ4X3QgKilpbm5lcl9pcGggKyBpcGgtPmlobCo0KTsKKwlpZiAoaW5uZXJfZ3JlaC0+cHR5cGUgIT0gaHRvbnMoR1JFX1BUWVBFX0tBUikpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJHUkUga2VlcGFsaXZlIGlubmVyIEdSRSB0eXBlICE9IDBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBBY3R1YWxseSBzZW5kIHRoZSByZXNwb25zZSBiYWNrICovCisKKwlkYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlkYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbm5lcl9pcGgtPmRhZGRyOworCWRhZGRyLnNpbl9wb3J0ID0gSVBQUk9UT19HUkU7CisKKwlpYS5zX2FkZHIgPSBpcGgtPnNhZGRyOworCUxPR1AoRE5TLCBMT0dMX0RFQlVHLCAiR1JFIGtlZXBhbGl2ZSBmcm9tICVzLCByZXNwb25kaW5nXG4iLAorCQlpbmV0X250b2EoaWEpKTsKKworCXJldHVybiBzZW5kdG8obnNpLT5mcmdyZS5mZC5mZCwgaW5uZXJfZ3JlaCwKKwkJICAgICAgZ3JlX3BheWxvYWRfbGVuIC0gaW5uZXJfaXBoLT5paGwqNCwgMCwKKwkJICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZkYWRkciwgc2l6ZW9mKGRhZGRyKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqcmVhZF9uc2ZyZ3JlX21zZyhzdHJ1Y3QgYnNjX2ZkICpiZmQsIGludCAqZXJyb3IsCisJCQkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoTlNfQUxMT0NfU0laRSwgIkdiL05TL0ZSL0dSRSBSeCIpOworCWludCByZXQgPSAwOworCXNvY2tsZW5fdCBzYWRkcl9sZW4gPSBzaXplb2YoKnNhZGRyKTsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgZ3JlX2hkciAqZ3JlaDsKKwl1aW50OF90ICpmcmg7CisJdWludDE2X3QgZGxjaTsKKworCWlmICghbXNnKSB7CisJCSplcnJvciA9IC1FTk9NRU07CisJCXJldHVybiBOVUxMOworCX0KKworCXJldCA9IHJlY3Zmcm9tKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgTlNfQUxMT0NfU0laRSwgMCwKKwkJCShzdHJ1Y3Qgc29ja2FkZHIgKilzYWRkciwgJnNhZGRyX2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJyZWN2IGVycm9yICVzIGR1cmluZyBOUy1GUi1HUkUgcmVjdlxuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCSplcnJvciA9IHJldDsKKwkJZ290byBvdXRfZXJyOworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJKmVycm9yID0gcmV0OworCQlnb3RvIG91dF9lcnI7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCisJaWYgKG1zZy0+bGVuIDwgc2l6ZW9mKCppcGgpICsgc2l6ZW9mKCpncmVoKSArIDIpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJTaG9ydCBJUCBwYWNrZXQ6ICV1IGJ5dGVzXG4iLCBtc2ctPmxlbik7CisJCSplcnJvciA9IC1FSU87CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpcGggPSAoc3RydWN0IGlwaGRyICopIG1zZy0+ZGF0YTsKKwlpZiAobXNnLT5sZW4gPCAoaXBoLT5paGwqNCArIHNpemVvZigqZ3JlaCkgKyAyKSkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgIlNob3J0IElQIHBhY2tldDogJXUgYnl0ZXNcbiIsIG1zZy0+bGVuKTsKKwkJKmVycm9yID0gLUVJTzsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWdyZWggPSAoc3RydWN0IGdyZV9oZHIgKikgKG1zZy0+ZGF0YSArIGlwaC0+aWhsKjQpOworCWlmIChncmVoLT5mbGFncykgeworCQlMT0dQKEROUywgTE9HTF9OT1RJQ0UsICJVbmtub3duIEdSRSBmbGFncyAweCUwNHhcbiIsCisJCQludG9ocyhncmVoLT5mbGFncykpOworCX0KKworCXN3aXRjaCAobnRvaHMoZ3JlaC0+cHR5cGUpKSB7CisJY2FzZSBHUkVfUFRZUEVfSVB2NDoKKwkJLyogSVB2NCBtZXNzYWdlcyBtaWdodCBiZSBHUkUga2VlcGFsaXZlcyAqLworCQkqZXJyb3IgPSBoYW5kbGVfcnhfZ3JlX2lwdjQoYmZkLCBtc2csIGlwaCwgZ3JlaCk7CisJCWdvdG8gb3V0X2VycjsKKwkJYnJlYWs7CisJY2FzZSBHUkVfUFRZUEVfRlI6CisJCS8qIGNvbnRpbnVlIGFzIHVzdWFsICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5TLCBMT0dMX05PVElDRSwgIlVua25vd24gR1JFIHByb3RvY29sIDB4JTA0eCAhPSBGUlxuIiwKKwkJCW50b2hzKGdyZWgtPnB0eXBlKSk7CisJCSplcnJvciA9IC1FSU87CisJCWdvdG8gb3V0X2VycjsKKwkJYnJlYWs7CisJfQorCisJaWYgKG1zZy0+bGVuIDwgc2l6ZW9mKCpncmVoKSArIDIpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJTaG9ydCBGUiBoZWFkZXI6ICV1IGJ5dGVzXG4iLCBtc2ctPmxlbik7CisJCSplcnJvciA9IC1FSU87CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlmcmggPSAodWludDhfdCAqKWdyZWggKyBzaXplb2YoKmdyZWgpOworCWlmIChmcmhbMF0gJiAweDAxKSB7CisJCUxPR1AoRE5TLCBMT0dMX05PVElDRSwgIlVuc3VwcG9ydGVkIHNpbmdsZS1ieXRlIEZSIGFkZHJlc3NcbiIpOworCQkqZXJyb3IgPSAtRUlPOworCQlnb3RvIG91dF9lcnI7CisJfQorCWRsY2kgPSAoKGZyaFswXSAmIDB4ZmMpIDw8IDIpOworCWlmICgoZnJoWzFdICYgMHgwZikgIT0gMHgwMSkgeworCQlMT0dQKEROUywgTE9HTF9OT1RJQ0UsICJVbmtub3duIHNlY29uZCBGUiBvY3RldCAweCUwMnhcbiIsCisJCQlmcmhbMV0pOworCQkqZXJyb3IgPSAtRUlPOworCQlnb3RvIG91dF9lcnI7CisJfQorCWRsY2kgfD0gKGZyaFsxXSA+PiA0KTsKKworCW1zZy0+bDJoID0gZnJoKzI7CisKKwkvKiBTdG9yZSBETENJIGluIE5FVFdPUksgQllURU9SREVSIGluIHNvY2thZGRyIHBvcnQgbWVtYmVyICovCisJc2FkZHItPnNpbl9wb3J0ID0gaHRvbnMoZGxjaSk7CisKKwlyZXR1cm4gbXNnOworCitvdXRfZXJyOgorCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiBOVUxMOworfQorCitpbnQgZ3Byc19uc19yY3Ztc2coc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhZGRyLCBlbnVtIGdwcnNfbnNfbGwgbGwpOworCitzdGF0aWMgaW50IGhhbmRsZV9uc2ZyZ3JlX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gYmZkLT5kYXRhOworCXN0cnVjdCBtc2diICptc2c7CisJdWludDE2X3QgZGxjaTsKKworCW1zZyA9IHJlYWRfbnNmcmdyZV9tc2coYmZkLCAmcmMsICZzYWRkcik7CisJaWYgKCFtc2cpCisJCXJldHVybiByYzsKKworCWRsY2kgPSBudG9ocyhzYWRkci5zaW5fcG9ydCk7CisJaWYgKGRsY2kgPT0gMCB8fCBkbGNpID09IDEwMjMpIHsKKwkJTE9HUChETlMsIExPR0xfSU5GTywgIlJlY2VpdmVkIEZSIG9uIExNSSBETENJICV1IC0gaWdub3JpbmdcbiIsCisJCQlkbGNpKTsKKwkJcmMgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IGdwcnNfbnNfcmN2bXNnKG5zaSwgbXNnLCAmc2FkZHIsIEdQUlNfTlNfTExfRlJfR1JFKTsKK291dDoKKwltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBoYW5kbGVfbnNmcmdyZV93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJLyogRklYTUU6IGFjdHVhbGx5IHNlbmQgdGhlIGRhdGEgaGVyZSBpbnN0ZWFkIG9mIG5zaXBfc2VuZG1zZygpICovCisJcmV0dXJuIC1FSU87Cit9CisKK2ludCBncHJzX25zX2ZyZ3JlX3NlbmRtc2coc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gbnN2Yy0+bnNpOworCXN0cnVjdCBzb2NrYWRkcl9pbiBkYWRkcjsKKwl1aW50MTZfdCBkbGNpID0gbnRvaHMobnN2Yy0+ZnJncmUuYnRzX2FkZHIuc2luX3BvcnQpOworCXVpbnQ4X3QgKmZyaDsKKwlzdHJ1Y3QgZ3JlX2hkciAqZ3JlaDsKKworCS8qIEJ1aWxkIHNvY2tldCBhZGRyZXNzIGZvciB0aGUgcGFja2V0IGRlc3Rpb25hdGlvbiAqLworCWRhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWRhZGRyLnNpbl9hZGRyID0gbnN2Yy0+ZnJncmUuYnRzX2FkZHIuc2luX2FkZHI7CisJZGFkZHIuc2luX3BvcnQgPSBJUFBST1RPX0dSRTsKKworCS8qIFByZXBlbmQgdGhlIEZSIGhlYWRlciAqLworCWZyaCA9IG1zZ2JfcHVzaChtc2csIDIpOworCWZyaFswXSA9IChkbGNpID4+IDIpICYgMHhmYzsKKwlmcmhbMV0gPSAoKGRsY2kgJiAweGYpPDw0KSB8IDB4MDE7CisKKwkvKiBQcmVwZW5kIHRoZSBHUkUgaGVhZGVyICovCisJZ3JlaCA9IChzdHJ1Y3QgZ3JlX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmdyZWgpKTsKKwlncmVoLT5mbGFncyA9IDA7CisJZ3JlaC0+cHR5cGUgPSBodG9ucyhHUkVfUFRZUEVfRlIpOworCisJcmMgPSBzZW5kdG8obnNpLT5mcmdyZS5mZC5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbiwgMCwKKwkJICAoc3RydWN0IHNvY2thZGRyICopJmRhZGRyLCBzaXplb2YoZGFkZHIpKTsKKworCXRhbGxvY19mcmVlKG1zZyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbnNmcmdyZV9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQlyYyA9IGhhbmRsZV9uc2ZyZ3JlX3JlYWQoYmZkKTsKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJcmMgPSBoYW5kbGVfbnNmcmdyZV93cml0ZShiZmQpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgZ3Byc19uc19mcmdyZV9saXN0ZW4oc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKQoreworCWludCByYzsKKworCS8qIE1ha2Ugc3VyZSB3ZSBjbG9zZSBhbnkgZXhpc3Rpbmcgc29ja2V0IGJlZm9yZSBjaGFuZ2luZyBpdCAqLworCWlmIChuc2ktPmZyZ3JlLmZkLmZkKQorCQljbG9zZShuc2ktPmZyZ3JlLmZkLmZkKTsKKworCWlmICghbnNpLT5mcmdyZS5lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCXJjID0gbWFrZV9zb2NrKCZuc2ktPmZyZ3JlLmZkLCBJUFBST1RPX0dSRSwgbnNpLT5mcmdyZS5sb2NhbF9pcCwKKwkJCTAsIG5zZnJncmVfZmRfY2IpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJFcnJvciBjcmVhdGluZyBHUkUgc29ja2V0ICglcylcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gcmM7CisJfQorCW5zaS0+ZnJncmUuZmQuZGF0YSA9IG5zaTsKKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19uc192dHkuYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19uc192dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzk1ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX25zX3Z0eS5jCkBAIC0wLDAgKzEsNTcxIEBACisvKiBWVFkgaW50ZXJmYWNlIGZvciBvdXIgR1BSUyBOZXR3b3JrcyBTZXJ2aWNlIChOUykgaW1wbGVtZW50YXRpb24gKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdnR5Lmg+CisKKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvbG9nZ2luZy5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L3RlbG5ldF9pbnRlcmZhY2UuaD4KKworc3RhdGljIHN0cnVjdCBncHJzX25zX2luc3QgKnZ0eV9uc2kgPSBOVUxMOworCisvKiBGSVhNRTogdGhpcyBzaG91bGQgZ28gdG8gc29tZSBjb21tb24gZmlsZSBhcyBpdCBpcyBjb3BpZWQKKyAqIGluIHZ0eV9pbnRlcmZhY2UuYyBvZiB0aGUgQlNDICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX25zX3RpbWVyX3N0cnNbXSA9IHsKKwl7IDAsICJ0bnMtYmxvY2siIH0sCisJeyAxLCAidG5zLWJsb2NrLXJldHJpZXMiIH0sCisJeyAyLCAidG5zLXJlc2V0IiB9LAorCXsgMywgInRucy1yZXNldC1yZXRyaWVzIiB9LAorCXsgNCwgInRucy10ZXN0IiB9LAorCXsgNSwgInRucy1hbGl2ZSIgfSwKKwl7IDYsICJ0bnMtYWxpdmUtcmV0cmllcyIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbWRfbm9kZSBuc19ub2RlID0geworCU5TX05PREUsCisJIiVzKG5zKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9ucyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCXZ0eV9vdXQodnR5LCAibnMlcyIsIFZUWV9ORVdMSU5FKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zdmMsICZ2dHlfbnNpLT5ncHJzX25zdmNzLCBsaXN0KSB7CisJCWlmICghbnN2Yy0+cGVyc2lzdGVudCkKKwkJCWNvbnRpbnVlOworCQl2dHlfb3V0KHZ0eSwgIiBuc2UgJXUgbnN2Y2kgJXUlcyIsCisJCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiBuc2UgJXUgcmVtb3RlLXJvbGUgJXMlcyIsCisJCQluc3ZjLT5uc2VpLCBuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24gPyAic2dzbiIgOiAiYnNzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJc3dpdGNoIChuc3ZjLT5sbCkgeworCQljYXNlIEdQUlNfTlNfTExfVURQOgorCQkJdnR5X291dCh2dHksICIgbnNlICV1IGVuY2Fwc3VsYXRpb24gdWRwJXMiLCBuc3ZjLT5uc2VpLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiIG5zZSAldSByZW1vdGUtaXAgJXMlcyIsCisJCQkJbnN2Yy0+bnNlaSwKKwkJCQlpbmV0X250b2EobnN2Yy0+aXAuYnRzX2FkZHIuc2luX2FkZHIpLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiIG5zZSAldSByZW1vdGUtcG9ydCAldSVzIiwKKwkJCQluc3ZjLT5uc2VpLCBudG9ocyhuc3ZjLT5pcC5idHNfYWRkci5zaW5fcG9ydCksCisJCQkJVlRZX05FV0xJTkUpOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19OU19MTF9GUl9HUkU6CisJCQl2dHlfb3V0KHZ0eSwgIiBuc2UgJXUgZW5jYXBzdWxhdGlvbiBmcmFtZXJlbGF5LWdyZSVzIiwKKwkJCQluc3ZjLT5uc2VpLCBWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiBuc2UgJXUgcmVtb3RlLWlwICVzJXMiLAorCQkJCW5zdmMtPm5zZWksCisJCQkJaW5ldF9udG9hKG5zdmMtPmZyZ3JlLmJ0c19hZGRyLnNpbl9hZGRyKSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiBuc2UgJXUgZnItZGxjaSAldSVzIiwKKwkJCQluc3ZjLT5uc2VpLCBudG9ocyhuc3ZjLT5mcmdyZS5idHNfYWRkci5zaW5fcG9ydCksCisJCQkJVlRZX05FV0xJTkUpOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2dHlfbnNpLT50aW1lb3V0KTsgaSsrKQorCQl2dHlfb3V0KHZ0eSwgIiB0aW1lciAlcyAldSVzIiwKKwkJCWdldF92YWx1ZV9zdHJpbmcoZ3Byc19uc190aW1lcl9zdHJzLCBpKSwKKwkJCXZ0eV9uc2ktPnRpbWVvdXRbaV0sIFZUWV9ORVdMSU5FKTsKKworCWlmICh2dHlfbnNpLT5uc2lwLmxvY2FsX2lwKSB7CisJCWlhLnNfYWRkciA9IGh0b25sKHZ0eV9uc2ktPm5zaXAubG9jYWxfaXApOworCQl2dHlfb3V0KHZ0eSwgIiBlbmNhcHN1bGF0aW9uIHVkcCBsb2NhbC1pcCAlcyVzIiwKKwkJCWluZXRfbnRvYShpYSksIFZUWV9ORVdMSU5FKTsKKwl9CisJaWYgKHZ0eV9uc2ktPm5zaXAubG9jYWxfcG9ydCkKKwkJdnR5X291dCh2dHksICIgZW5jYXBzdWxhdGlvbiB1ZHAgbG9jYWwtcG9ydCAldSVzIiwKKwkJCXZ0eV9uc2ktPm5zaXAubG9jYWxfcG9ydCwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICIgZW5jYXBzdWxhdGlvbiBmcmFtZXJlbGF5LWdyZSBlbmFibGVkICV1JXMiLAorCQl2dHlfbnNpLT5mcmdyZS5lbmFibGVkID8gMSA6IDAsIFZUWV9ORVdMSU5FKTsKKwlpZiAodnR5X25zaS0+ZnJncmUubG9jYWxfaXApIHsKKwkJaWEuc19hZGRyID0gaHRvbmwodnR5X25zaS0+ZnJncmUubG9jYWxfaXApOworCQl2dHlfb3V0KHZ0eSwgIiBlbmNhcHN1bGF0aW9uIGZyYW1lcmVsYXktZ3JlIGxvY2FsLWlwICVzJXMiLAorCQkJaW5ldF9udG9hKGlhKSwgVlRZX05FV0xJTkUpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zLCBjZmdfbnNfY21kLAorICAgICAgIm5zIiwKKyAgICAgICJDb25maWd1cmUgdGhlIEdQUlMgTmV0d29yayBTZXJ2aWNlIikKK3sKKwl2dHktPm5vZGUgPSBOU19OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZHVtcF9uc2Uoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBpbnQgc3RhdHMpCit7CisJdnR5X291dCh2dHksICJOU0VJICU1dSwgTlMtVkMgJTV1LCBSZW1vdGU6ICUtNHMsICU1cyAlOXMiLAorCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSwKKwkJbnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuID8gIlNHU04iIDogIkJTUyIsCisJCW5zdmMtPnN0YXRlICYgTlNFX1NfQUxJVkUgPyAiQUxJVkUiIDogIkRFQUQiLAorCQluc3ZjLT5zdGF0ZSAmIE5TRV9TX0JMT0NLRUQgPyAiQkxPQ0tFRCIgOiAiVU5CTE9DS0VEIik7CisJaWYgKG5zdmMtPmxsID09IEdQUlNfTlNfTExfVURQIHx8IG5zdmMtPmxsID09IEdQUlNfTlNfTExfRlJfR1JFKQorCQl2dHlfb3V0KHZ0eSwgIiwgJXMgJTE1czoldSIsCisJCQluc3ZjLT5sbCA9PSBHUFJTX05TX0xMX1VEUCA/ICJVRFAgICAiIDogIkZSLUdSRSIsCisJCQlpbmV0X250b2EobnN2Yy0+aXAuYnRzX2FkZHIuc2luX2FkZHIpLAorCQkJbnRvaHMobnN2Yy0+aXAuYnRzX2FkZHIuc2luX3BvcnQpKTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCWlmIChzdGF0cykKKwkJdnR5X291dF9yYXRlX2N0cl9ncm91cCh2dHksICIgIiwgbnN2Yy0+Y3RyZyk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfbnMoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIGludCBzdGF0cykKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaWEuc19hZGRyID0gaHRvbmwodnR5X25zaS0+bnNpcC5sb2NhbF9pcCk7CisJdnR5X291dCh2dHksICJFbmNhcHN1bGF0aW9uIE5TLVVEUC1JUCAgICAgTG9jYWwgSVA6ICVzLCBVRFAgUG9ydDogJXUlcyIsCisJCWluZXRfbnRvYShpYSksIHZ0eV9uc2ktPm5zaXAubG9jYWxfcG9ydCwgVlRZX05FV0xJTkUpOworCisJaWEuc19hZGRyID0gaHRvbmwodnR5X25zaS0+ZnJncmUubG9jYWxfaXApOworCXZ0eV9vdXQodnR5LCAiRW5jYXBzdWxhdGlvbiBOUy1GUi1HUkUtSVAgIExvY2FsIElQOiAlcyVzIiwKKwkJaW5ldF9udG9hKGlhKSwgVlRZX05FV0xJTkUpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobnN2YywgJm5zaS0+Z3Byc19uc3ZjcywgbGlzdCkgeworCQlpZiAobnN2YyA9PSBuc2ktPnVua25vd25fbnN2YykKKwkJCWNvbnRpbnVlOworCQlkdW1wX25zZSh2dHksIG5zdmMsIHN0YXRzKTsKKwl9Cit9CisKK0RFRlVOKHNob3dfbnMsIHNob3dfbnNfY21kLCAic2hvdyBucyIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE5TIHByb3RvY29sIikKK3sKKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kgPSB2dHlfbnNpOworCWR1bXBfbnModnR5LCBuc2ksIDApOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19uc19zdGF0cywgc2hvd19uc19zdGF0c19jbWQsICJzaG93IG5zIHN0YXRzIiwKKwlTSE9XX1NUUgorCSJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBOUyBwcm90b2NvbFxuIgorCSJJbmNsdWRlIHN0YXRpc3RpY3NcbiIpCit7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gdnR5X25zaTsKKwlkdW1wX25zKHZ0eSwgbnNpLCAxKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfbnNlLCBzaG93X25zZV9jbWQsICJzaG93IG5zIChuc2VpfG5zdmMpIDwwLTY1NTM1PiBbc3RhdHNdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTlMgcHJvdG9jb2xcbiIKKwkiU2VsZWN0IG9uZSBOU0UgYnkgaXRzIE5TRSBJZGVudGlmaWVyXG4iCisJIlNlbGVjdCBvbmUgTlNFIGJ5IGl0cyBOUy1WQyBJZGVudGlmaWVyXG4iCisJIlRoZSBJZGVudGlmaWVyIG9mIHNlbGVjdGVkIHR5cGVcbiIKKwkiSW5jbHVkZSBTdGF0aXN0aWNzXG4iKQoreworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IHZ0eV9uc2k7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKwl1aW50MTZfdCBpZCA9IGF0b2koYXJndlsxXSk7CisJaW50IHNob3dfc3RhdHMgPSAwOworCisJaWYgKCFzdHJjbXAoYXJndlswXSwgIm5zZWkiKSkKKwkJbnN2YyA9IG5zdmNfYnlfbnNlaShuc2ksIGlkKTsKKwllbHNlCisJCW5zdmMgPSBuc3ZjX2J5X25zdmNpKG5zaSwgaWQpOworCisJaWYgKCFuc3ZjKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gc3VjaCBOUyBFbnRpdHklcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChhcmdjID49IDMpCisJCXNob3dfc3RhdHMgPSAxOworCisJZHVtcF9uc2UodnR5LCBuc3ZjLCBzaG93X3N0YXRzKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgTlNFX0NNRF9TVFIgIlBlcnNpc3RlbnQgTlMgRW50aXR5XG4iICJOUyBFbnRpdHkgSUQgKE5TRUkpXG4iCisKK0RFRlVOKGNmZ19uc2VfbnN2YywgY2ZnX25zZV9uc3ZjaV9jbWQsCisJIm5zZSA8MC02NTUzNT4gbnN2Y2kgPDAtNjU1MzQ+IiwKKwlOU0VfQ01EX1NUUgorCSJOUyBWaXJ0dWFsIENvbm5lY3Rpb25cbiIKKwkiTlMgVmlydHVhbCBDb25uZWN0aW9uIElEIChOU1ZDSSlcbiIKKwkpCit7CisJdWludDE2X3QgbnNlaSA9IGF0b2koYXJndlswXSk7CisJdWludDE2X3QgbnN2Y2kgPSBhdG9pKGFyZ3ZbMV0pOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwluc3ZjID0gbnN2Y19ieV9uc2VpKHZ0eV9uc2ksIG5zZWkpOworCWlmICghbnN2YykgeworCQluc3ZjID0gbnN2Y19jcmVhdGUodnR5X25zaSwgbnN2Y2kpOworCQluc3ZjLT5uc2VpID0gbnNlaTsKKwl9CisJbnN2Yy0+bnN2Y2kgPSBuc3ZjaTsKKwkvKiBBbGwgTlNWQ3MgdGhhdCBhcmUgZXhwbGljaXRseSBjb25maWd1cmVkIGJ5IFZUWSBhcmUKKwkgKiBtYXJrZWQgYXMgcGVyc2lzdGVudCBzbyB3ZSBjYW4gd3JpdGUgdGhlbSB0byB0aGUgY29uZmlnCisJICogZmlsZSBhdCBzb21lIGxhdGVyIHBvaW50ICovCisJbnN2Yy0+cGVyc2lzdGVudCA9IDE7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2VfcmVtb3RlaXAsIGNmZ19uc2VfcmVtb3RlaXBfY21kLAorCSJuc2UgPDAtNjU1MzU+IHJlbW90ZS1pcCBBLkIuQy5EIiwKKwlOU0VfQ01EX1NUUgorCSJSZW1vdGUgSVAgQWRkcmVzc1xuIgorCSJSZW1vdGUgSVAgQWRkcmVzc1xuIikKK3sKKwl1aW50MTZfdCBuc2VpID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaSh2dHlfbnNpLCBuc2VpKTsKKwlpZiAoIW5zdmMpIHsKKwkJdnR5X291dCh2dHksICJObyBzdWNoIE5TRSAoJXUpJXMiLCBuc2VpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJaW5ldF9hdG9uKGFyZ3ZbMV0sICZuc3ZjLT5pcC5idHNfYWRkci5zaW5fYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7CisKK30KKworREVGVU4oY2ZnX25zZV9yZW1vdGVwb3J0LCBjZmdfbnNlX3JlbW90ZXBvcnRfY21kLAorCSJuc2UgPDAtNjU1MzU+IHJlbW90ZS1wb3J0IDwwLTY1NTM1PiIsCisJTlNFX0NNRF9TVFIKKwkiUmVtb3RlIFVEUCBQb3J0XG4iCisJIlJlbW90ZSBVRFAgUG9ydCBOdW1iZXJcbiIpCit7CisJdWludDE2X3QgbnNlaSA9IGF0b2koYXJndlswXSk7CisJdWludDE2X3QgcG9ydCA9IGF0b2koYXJndlsxXSk7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X25zZWkodnR5X25zaSwgbnNlaSk7CisJaWYgKCFuc3ZjKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gc3VjaCBOU0UgKCV1KSVzIiwgbnNlaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKG5zdmMtPmxsICE9IEdQUlNfTlNfTExfVURQKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2Fubm90IHNldCBVRFAgUG9ydCBvbiBub24tVURQIE5TRSVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCW5zdmMtPmlwLmJ0c19hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2VfZnJfZGxjaSwgY2ZnX25zZV9mcl9kbGNpX2NtZCwKKwkibnNlIDwwLTY1NTM1PiBmci1kbGNpIDwxNi0xMDA3PiIsCisJTlNFX0NNRF9TVFIKKwkiRnJhbWUgUmVsYXkgRExDSVxuIgorCSJGcmFtZSBSZWxheSBETENJIE51bWJlclxuIikKK3sKKwl1aW50MTZfdCBuc2VpID0gYXRvaShhcmd2WzBdKTsKKwl1aW50MTZfdCBkbGNpID0gYXRvaShhcmd2WzFdKTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaSh2dHlfbnNpLCBuc2VpKTsKKwlpZiAoIW5zdmMpIHsKKwkJdnR5X291dCh2dHksICJObyBzdWNoIE5TRSAoJXUpJXMiLCBuc2VpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAobnN2Yy0+bGwgIT0gR1BSU19OU19MTF9GUl9HUkUpIHsKKwkJdnR5X291dCh2dHksICJDYW5ub3Qgc2V0IEZSIERMQ0kgb24gbm9uLUZSIE5TRSVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCW5zdmMtPmZyZ3JlLmJ0c19hZGRyLnNpbl9wb3J0ID0gaHRvbnMoZGxjaSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2VfZW5jYXBzLCBjZmdfbnNlX2VuY2Fwc19jbWQsCisJIm5zZSA8MC02NTUzNT4gZW5jYXBzdWxhdGlvbiAodWRwfGZyYW1lcmVsYXktZ3JlKSIsCisJTlNFX0NNRF9TVFIKKwkiRW5jYXBzdWxhdGlvbiBmb3IgTlNcbiIKKwkiVURQL0lQIEVuY2Fwc3VsYXRpb25cbiIgIkZyYW1lLVJlbGF5L0dSRS9JUCBFbmNhcHN1bGF0aW9uXG4iKQoreworCXVpbnQxNl90IG5zZWkgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwluc3ZjID0gbnN2Y19ieV9uc2VpKHZ0eV9uc2ksIG5zZWkpOworCWlmICghbnN2YykgeworCQl2dHlfb3V0KHZ0eSwgIk5vIHN1Y2ggTlNFICgldSklcyIsIG5zZWksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmICghc3RyY21wKGFyZ3ZbMV0sICJ1ZHAiKSkKKwkJbnN2Yy0+bGwgPSBHUFJTX05TX0xMX1VEUDsKKwllbHNlCisJCW5zdmMtPmxsID0gR1BSU19OU19MTF9GUl9HUkU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX25zZV9yZW1vdGVyb2xlLCBjZmdfbnNlX3JlbW90ZXJvbGVfY21kLAorCSJuc2UgPDAtNjU1MzU+IHJlbW90ZS1yb2xlIChzZ3NufGJzcykiLAorCU5TRV9DTURfU1RSCisJIlJlbW90ZSBOU0UgUm9sZVxuIgorCSJSZW1vdGUgUGVlciBpcyBTR1NOXG4iCisJIlJlbW90ZSBQZWVyIGlzIEJTU1xuIikKK3sKKwl1aW50MTZfdCBuc2VpID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaSh2dHlfbnNpLCBuc2VpKTsKKwlpZiAoIW5zdmMpIHsKKwkJdnR5X291dCh2dHksICJObyBzdWNoIE5TRSAoJXUpJXMiLCBuc2VpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoIXN0cmNtcChhcmd2WzFdLCAic2dzbiIpKQorCQluc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24gPSAxOworCWVsc2UKKwkJbnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuID0gMDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25vX25zZSwgY2ZnX25vX25zZV9jbWQsCisJIm5vIG5zZSA8MC02NTUzNT4iLAorCSJEZWxldGUgUGVyc2lzdGVudCBOUyBFbnRpdHlcbiIKKwkiRGVsZXRlICIgTlNFX0NNRF9TVFIpCit7CisJdWludDE2X3QgbnNlaSA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X25zZWkodnR5X25zaSwgbnNlaSk7CisJaWYgKCFuc3ZjKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gc3VjaCBOU0UgKCV1KSVzIiwgbnNlaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKCFuc3ZjLT5wZXJzaXN0ZW50KSB7CisJCXZ0eV9vdXQodnR5LCAiTlNFSSAldSBpcyBub3QgYSBwZXJzaXN0ZW50IE5TRSVzIiwKKwkJCW5zZWksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCW5zdmMtPnBlcnNpc3RlbnQgPSAwOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbnNfdGltZXIsIGNmZ19uc190aW1lcl9jbWQsCisJInRpbWVyICIgTlNfVElNRVJTICIgPDAtNjU1MzU+IiwKKwkiTmV0d29yayBTZXJ2aWNlIFRpbWVyXG4iCisJTlNfVElNRVJTX0hFTFAgIlRpbWVyIFZhbHVlXG4iKQoreworCWludCBpZHggPSBnZXRfc3RyaW5nX3ZhbHVlKGdwcnNfbnNfdGltZXJfc3RycywgYXJndlswXSk7CisJaW50IHZhbCA9IGF0b2koYXJndlsxXSk7CisKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gQVJSQVlfU0laRSh2dHlfbnNpLT50aW1lb3V0KSkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJdnR5X25zaS0+dGltZW91dFtpZHhdID0gdmFsOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIEVOQ0FQU19TVFIgIk5TIGVuY2Fwc3VsYXRpb24gb3B0aW9uc1xuIgorCitERUZVTihjZmdfbnNpcF9sb2NhbF9pcCwgY2ZnX25zaXBfbG9jYWxfaXBfY21kLAorICAgICAgImVuY2Fwc3VsYXRpb24gdWRwIGxvY2FsLWlwIEEuQi5DLkQiLAorCUVOQ0FQU19TVFIgIk5TIG92ZXIgVURQIEVuY2Fwc3VsYXRpb25cbiIKKwkiU2V0IHRoZSBJUCBhZGRyZXNzIG9uIHdoaWNoIHdlIGxpc3RlbiBmb3IgTlMvVURQXG4iCisJIklQIEFkZHJlc3NcbiIpCit7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpbmV0X2F0b24oYXJndlswXSwgJmlhKTsKKwl2dHlfbnNpLT5uc2lwLmxvY2FsX2lwID0gbnRvaGwoaWEuc19hZGRyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zaXBfbG9jYWxfcG9ydCwgY2ZnX25zaXBfbG9jYWxfcG9ydF9jbWQsCisgICAgICAiZW5jYXBzdWxhdGlvbiB1ZHAgbG9jYWwtcG9ydCA8MC02NTUzNT4iLAorCUVOQ0FQU19TVFIgIk5TIG92ZXIgVURQIEVuY2Fwc3VsYXRpb25cbiIKKwkiU2V0IHRoZSBVRFAgcG9ydCBvbiB3aGljaCB3ZSBsaXN0ZW4gZm9yIE5TL1VEUFxuIgorCSJVRFAgcG9ydCBudW1iZXJcbiIpCit7CisJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCisJdnR5X25zaS0+bnNpcC5sb2NhbF9wb3J0ID0gcG9ydDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2ZyZ3JlX2xvY2FsX2lwLCBjZmdfZnJncmVfbG9jYWxfaXBfY21kLAorICAgICAgImVuY2Fwc3VsYXRpb24gZnJhbWVyZWxheS1ncmUgbG9jYWwtaXAgQS5CLkMuRCIsCisJRU5DQVBTX1NUUiAiTlMgb3ZlciBGcmFtZSBSZWxheSBvdmVyIEdSRSBFbmNhcHN1bGF0aW9uXG4iCisJIlNldCB0aGUgSVAgYWRkcmVzcyBvbiB3aGljaCB3ZSBsaXN0ZW4gZm9yIE5TL0ZSL0dSRVxuIgorCSJJUCBBZGRyZXNzXG4iKQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaWYgKCF2dHlfbnNpLT5mcmdyZS5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiRlIvR1JFIGlzIG5vdCBlbmFibGVkJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJaW5ldF9hdG9uKGFyZ3ZbMF0sICZpYSk7CisJdnR5X25zaS0+ZnJncmUubG9jYWxfaXAgPSBudG9obChpYS5zX2FkZHIpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfZnJncmVfZW5hYmxlLCBjZmdfZnJncmVfZW5hYmxlX2NtZCwKKyAgICAgICJlbmNhcHN1bGF0aW9uIGZyYW1lcmVsYXktZ3JlIGVuYWJsZWQgKDF8MCkiLAorCUVOQ0FQU19TVFIgIk5TIG92ZXIgRnJhbWUgUmVsYXkgb3ZlciBHUkUgRW5jYXBzdWxhdGlvblxuIgorCSJFbmFibGUgb3IgZGlzYWJsZSBGcmFtZSBSZWxheSBvdmVyIEdSRVxuIgorCSJFbmFibGVcbiIgIkRpc2FibGVcbiIpCit7CisJaW50IGVuYWJsZWQgPSBhdG9pKGFyZ3ZbMF0pOworCisJdnR5X25zaS0+ZnJncmUuZW5hYmxlZCA9IGVuYWJsZWQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5zdmNfbnNlaSwgbnN2Y19uc2VpX2NtZCwKKwkibnN2YyBuc2VpIDwwLTY1NTM1PiAoYmxvY2t8dW5ibG9ja3xyZXNldCkiLAorCSJQZXJmb3JtIGFuIG9wZXJhdGlvbiBvbiBhIE5TVkNcbiIKKwkiTlMtVkMgSWRlbnRpZmllciAoTlMtVkNJKVxuIgorCSJJbml0aWF0ZSBCTE9DSyBwcm9jZWR1cmVcbiIKKwkiSW5pdGlhdGUgVU5CTE9DSyBwcm9jZWR1cmVcbiIKKwkiSW5pdGlhdGUgUkVTRVQgcHJvY2VkdXJlXG4iKQoreworCXVpbnQxNl90IG5zdmNpID0gYXRvaShhcmd2WzBdKTsKKwljb25zdCBjaGFyICpvcGVyYXRpb24gPSBhcmd2WzFdOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwluc3ZjID0gbnN2Y19ieV9uc2VpKHZ0eV9uc2ksIG5zdmNpKTsKKwlpZiAoIW5zdmMpIHsKKwkJdnR5X291dCh2dHksICJObyBzdWNoIE5TVkNJICgldSklcyIsIG5zdmNpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoIXN0cmNtcChvcGVyYXRpb24sICJibG9jayIpKQorCQlncHJzX25zX3R4X2Jsb2NrKG5zdmMsIE5TX0NBVVNFX09NX0lOVEVSVkVOVElPTik7CisJZWxzZSBpZiAoIXN0cmNtcChvcGVyYXRpb24sICJ1bmJsb2NrIikpCisJCWdwcnNfbnNfdHhfdW5ibG9jayhuc3ZjKTsKKwllbHNlIGlmICghc3RyY21wKG9wZXJhdGlvbiwgInJlc2V0IikpCisJCWdwcnNfbnN2Y19yZXNldChuc3ZjLCBOU19DQVVTRV9PTV9JTlRFUlZFTlRJT04pOworCWVsc2UKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX2ZsdHJfbnN2YywKKyAgICAgIGxvZ2dpbmdfZmx0cl9uc3ZjX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBuc3ZjIChuc2VpfG5zdmNpKSA8MC02NTUzNT4iLAorCUxPR0dJTkdfU1RSIEZJTFRFUl9TVFIKKwkiRmlsdGVyIGJhc2VkIG9uIE5TIFZpcnR1YWwgQ29ubmVjdGlvblxuIgorCSJJZGVudGlmeSBOUy1WQyBieSBOU0VJXG4iCisJIklkZW50aWZ5IE5TLVZDIGJ5IE5TVkNJXG4iCisJIk51bWVyaWMgaWRlbnRpZmllclxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKwl1aW50MTZfdCBpZCA9IGF0b2koYXJndlsxXSk7CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmICghc3RyY21wKGFyZ3ZbMF0sICJuc2VpIikpCisJCW5zdmMgPSBuc3ZjX2J5X25zZWkodnR5X25zaSwgaWQpOworCWVsc2UKKwkJbnN2YyA9IG5zdmNfYnlfbnN2Y2kodnR5X25zaSwgaWQpOworCisJaWYgKCFuc3ZjKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gTlMtVkMgYnkgdGhhdCBpZGVudGlmaWVyJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X25zdmNfZmlsdGVyKGNvbm4tPmRiZywgbnN2Yyk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitpbnQgZ3Byc19uc192dHlfaW5pdChzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpCit7CisJdnR5X25zaSA9IG5zaTsKKworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19uc19jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19uc19zdGF0c19jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19uc2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJmxvZ2dpbmdfZmx0cl9uc3ZjX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfbnNfY21kKTsKKwlpbnN0YWxsX25vZGUoJm5zX25vZGUsIGNvbmZpZ193cml0ZV9ucyk7CisJaW5zdGFsbF9kZWZhdWx0KE5TX05PREUpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZvdXJub2RlX2VuZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmY2ZnX25zZV9uc3ZjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmY2ZnX25zZV9yZW1vdGVpcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmY2ZnX25zZV9yZW1vdGVwb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfbnNlX2ZyX2RsY2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19uc2VfZW5jYXBzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfbnNlX3JlbW90ZXJvbGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19ub19uc2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19uc190aW1lcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmY2ZnX25zaXBfbG9jYWxfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19uc2lwX2xvY2FsX3BvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19mcmdyZV9lbmFibGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19mcmdyZV9sb2NhbF9pcF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmbnN2Y19uc2VpX2NtZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19zZ3NuLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfc2dzbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNzZjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfc2dzbi5jCkBAIC0wLDAgKzEsMzA0IEBACisvKiBHUFJTIFNHU04gZnVuY3Rpb25hbGl0eSAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfc2dzbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2dzbi5oPgorCitleHRlcm4gc3RydWN0IHNnc25faW5zdGFuY2UgKnNnc247CisKK0xMSVNUX0hFQUQoc2dzbl9tbV9jdHh0cyk7CitMTElTVF9IRUFEKHNnc25fZ2dzbl9jdHh0cyk7CitMTElTVF9IRUFEKHNnc25fYXBuX2N0eHRzKTsKK0xMSVNUX0hFQUQoc2dzbl9wZHBfY3R4dHMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2Rlc2MgbW1jdHhfY3RyX2Rlc2NyaXB0aW9uW10gPSB7CisJeyAic2lnbi5wYWNrZXRzLmluIiwJIlNpZ25hbGxpbmcgTWVzc2FnZXMgKCBJbikiIH0sCisJeyAic2lnbi5wYWNrZXRzLm91dCIsCSJTaWduYWxsaW5nIE1lc3NhZ2VzIChPdXQpIiB9LAorCXsgInVkYXRhLnBhY2tldHMuaW4iLAkiVXNlciBEYXRhICBNZXNzYWdlcyAoIEluKSIgfSwKKwl7ICJ1ZGF0YS5wYWNrZXRzLm91dCIsCSJVc2VyIERhdGEgIE1lc3NhZ2VzIChPdXQpIiB9LAorCXsgInVkYXRhLmJ5dGVzLmluIiwJIlVzZXIgRGF0YSAgQnl0ZXMgICAgKCBJbikiIH0sCisJeyAidWRhdGEuYnl0ZXMub3V0IiwJIlVzZXIgRGF0YSAgQnl0ZXMgICAgKE91dCkiIH0sCisJeyAicGRwX2N0eF9hY3QiLAkiUERQIENvbnRleHQgQWN0aXZhdGlvbnMgICIgfSwKKwl7ICJzdXNwZW5kIiwJCSJTVVNQRU5EIENvdW50ICAgICAgICAgICAgIiB9LAorCXsgInBhZ2luZy5wcyIsCQkiUGFnaW5nIFBhY2tldCBTd2l0Y2hlZCAgICIgfSwKKwl7ICJwYWdpbmcuY3MiLAkJIlBhZ2luZyBDaXJjdWl0IFN3aXRjaGVkICAiIH0sCisJeyAicmFfdXBkYXRlIiwJCSJSb3V0aW5nIEFyZWEgVXBkYXRlICAgICAgIiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByYXRlX2N0cl9ncm91cF9kZXNjIG1tY3R4X2N0cmdfZGVzYyA9IHsKKwkuZ3JvdXBfbmFtZV9wcmVmaXggPSAic2dzbi5tbWN0eCIsCisJLmdyb3VwX2Rlc2NyaXB0aW9uID0gIlNHU04gTU0gQ29udGV4dCBTdGF0aXN0aWNzIiwKKwkubnVtX2N0ciA9IEFSUkFZX1NJWkUobW1jdHhfY3RyX2Rlc2NyaXB0aW9uKSwKKwkuY3RyX2Rlc2MgPSBtbWN0eF9jdHJfZGVzY3JpcHRpb24sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2Rlc2MgcGRwY3R4X2N0cl9kZXNjcmlwdGlvbltdID0geworCXsgInVkYXRhLnBhY2tldHMuaW4iLAkiVXNlciBEYXRhICBNZXNzYWdlcyAoIEluKSIgfSwKKwl7ICJ1ZGF0YS5wYWNrZXRzLm91dCIsCSJVc2VyIERhdGEgIE1lc3NhZ2VzIChPdXQpIiB9LAorCXsgInVkYXRhLmJ5dGVzLmluIiwJIlVzZXIgRGF0YSAgQnl0ZXMgICAgKCBJbikiIH0sCisJeyAidWRhdGEuYnl0ZXMub3V0IiwJIlVzZXIgRGF0YSAgQnl0ZXMgICAgKE91dCkiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2dyb3VwX2Rlc2MgcGRwY3R4X2N0cmdfZGVzYyA9IHsKKwkuZ3JvdXBfbmFtZV9wcmVmaXggPSAic2dzbi5wZHBjdHgiLAorCS5ncm91cF9kZXNjcmlwdGlvbiA9ICJTR1NOIFBEUCBDb250ZXh0IFN0YXRpc3RpY3MiLAorCS5udW1fY3RyID0gQVJSQVlfU0laRShwZHBjdHhfY3RyX2Rlc2NyaXB0aW9uKSwKKwkuY3RyX2Rlc2MgPSBwZHBjdHhfY3RyX2Rlc2NyaXB0aW9uLAorfTsKKworc3RhdGljIGludCByYV9pZF9lcXVhbHMoY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKmlkMSwKKwkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICppZDIpCit7CisJcmV0dXJuIChpZDEtPm1jYyA9PSBpZDItPm1jYyAmJiBpZDEtPm1uYyA9PSBpZDItPm1uYyAmJgorCQlpZDEtPmxhYyA9PSBpZDItPmxhYyAmJiBpZDEtPnJhYyA9PSBpZDItPnJhYyk7Cit9CisKKy8qIGxvb2stdXAgYSBTR1NOIE1NIGNvbnRleHQgYmFzZWQgb24gVExMSSArIFJBSSAqLworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9ieV90bGxpKHVpbnQzMl90IHRsbGksCisJCQkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCWludCB0bGxpX3R5cGU7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsICZzZ3NuX21tX2N0eHRzLCBsaXN0KSB7CisJCWlmICh0bGxpID09IGN0eC0+dGxsaSAmJgorCQkgICAgcmFfaWRfZXF1YWxzKHJhaWQsICZjdHgtPnJhKSkKKwkJCXJldHVybiBjdHg7CisJfQorCisJdGxsaV90eXBlID0gZ3Byc190bGxpX3R5cGUodGxsaSk7CisJaWYgKHRsbGlfdHlwZSA9PSBUTExJX0xPQ0FMKSB7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJnNnc25fbW1fY3R4dHMsIGxpc3QpIHsKKwkJCWlmICgoY3R4LT5wX3Rtc2kgfCAweEMwMDAwMDAwKSA9PSB0bGxpIHx8CisJCQkgICAgIChjdHgtPnBfdG1zaV9vbGQgJiYgKGN0eC0+cF90bXNpX29sZCB8IDB4QzAwMDAwMDApID09IHRsbGkpKSB7CisJCQkJY3R4LT50bGxpID0gdGxsaTsKKwkJCQlyZXR1cm4gY3R4OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYnlfcHRtc2kodWludDMyX3QgcF90bXNpKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmc2dzbl9tbV9jdHh0cywgbGlzdCkgeworCQlpZiAocF90bXNpID09IGN0eC0+cF90bXNpIHx8CisJCSAgICAoY3R4LT5wX3Rtc2lfb2xkICYmIGN0eC0+cF90bXNpX29sZCA9PSBwX3Rtc2kpKQorCQkJcmV0dXJuIGN0eDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYnlfaW1zaShjb25zdCBjaGFyICppbXNpKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmc2dzbl9tbV9jdHh0cywgbGlzdCkgeworCQlpZiAoIXN0cmNtcChpbXNpLCBjdHgtPmltc2kpKQorCQkJcmV0dXJuIGN0eDsKKwl9CisJcmV0dXJuIE5VTEw7CisKK30KKworLyogQWxsb2NhdGUgYSBuZXcgU0dTTiBNTSBjb250ZXh0ICovCitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2FsbG9jKHVpbnQzMl90IHRsbGksCisJCQkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCisJY3R4ID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3Qgc2dzbl9tbV9jdHgpOworCWlmICghY3R4KQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweSgmY3R4LT5yYSwgcmFpZCwgc2l6ZW9mKGN0eC0+cmEpKTsKKwljdHgtPnRsbGkgPSB0bGxpOworCWN0eC0+bW1fc3RhdGUgPSBHTU1fREVSRUdJU1RFUkVEOworCWN0eC0+Y3RyZyA9IHJhdGVfY3RyX2dyb3VwX2FsbG9jKGN0eCwgJm1tY3R4X2N0cmdfZGVzYywgdGxsaSk7CisJSU5JVF9MTElTVF9IRUFEKCZjdHgtPnBkcF9saXN0KTsKKworCWxsaXN0X2FkZCgmY3R4LT5saXN0LCAmc2dzbl9tbV9jdHh0cyk7CisKKwlyZXR1cm4gY3R4OworfQorCisKKy8qIGxvb2sgdXAgUERQIGNvbnRleHQgYnkgTU0gY29udGV4dCBhbmQgTlNBUEkgKi8KK3N0cnVjdCBzZ3NuX3BkcF9jdHggKnNnc25fcGRwX2N0eF9ieV9uc2FwaShjb25zdCBzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLAorCQkJCQkgICB1aW50OF90IG5zYXBpKQoreworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBkcCwgJm1tLT5wZHBfbGlzdCwgbGlzdCkgeworCQlpZiAocGRwLT5uc2FwaSA9PSBuc2FwaSkKKwkJCXJldHVybiBwZHA7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBsb29rIHVwIFBEUCBjb250ZXh0IGJ5IE1NIGNvbnRleHQgYW5kIHRyYW5zYWN0aW9uIElEICovCitzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpzZ3NuX3BkcF9jdHhfYnlfdGlkKGNvbnN0IHN0cnVjdCBzZ3NuX21tX2N0eCAqbW0sCisJCQkJCSB1aW50OF90IHRpZCkKK3sKKwlzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHA7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZHAsICZtbS0+cGRwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBkcC0+dGkgPT0gdGlkKQorCQkJcmV0dXJuIHBkcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzZ3NuX3BkcF9jdHggKnNnc25fcGRwX2N0eF9hbGxvYyhzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tLAorCQkJCQl1aW50OF90IG5zYXBpKQoreworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcDsKKworCXBkcCA9IHNnc25fcGRwX2N0eF9ieV9uc2FwaShtbSwgbnNhcGkpOworCWlmIChwZHApCisJCXJldHVybiBOVUxMOworCisJcGRwID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3Qgc2dzbl9wZHBfY3R4KTsKKwlpZiAoIXBkcCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwZHAtPm1tID0gbW07CisJcGRwLT5uc2FwaSA9IG5zYXBpOworCXBkcC0+Y3RyZyA9IHJhdGVfY3RyX2dyb3VwX2FsbG9jKHBkcCwgJnBkcGN0eF9jdHJnX2Rlc2MsIG5zYXBpKTsKKwlsbGlzdF9hZGQoJnBkcC0+bGlzdCwgJm1tLT5wZHBfbGlzdCk7CisJbGxpc3RfYWRkKCZwZHAtPmdfbGlzdCwgJnNnc25fcGRwX2N0eHRzKTsKKworCXJldHVybiBwZHA7Cit9CisKK3ZvaWQgc2dzbl9wZHBfY3R4X2ZyZWUoc3RydWN0IHNnc25fcGRwX2N0eCAqcGRwKQoreworCWxsaXN0X2RlbCgmcGRwLT5saXN0KTsKKwlsbGlzdF9kZWwoJnBkcC0+Z19saXN0KTsKKwl0YWxsb2NfZnJlZShwZHApOworfQorCisvKiBHR1NOIGNvbnRleHRzICovCisKK3N0cnVjdCBzZ3NuX2dnc25fY3R4ICpzZ3NuX2dnc25fY3R4X2FsbG9jKHVpbnQzMl90IGlkKQoreworCXN0cnVjdCBzZ3NuX2dnc25fY3R4ICpnZ2M7CisKKwlnZ2MgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBzZ3NuX2dnc25fY3R4KTsKKwlpZiAoIWdnYykKKwkJcmV0dXJuIE5VTEw7CisKKwlnZ2MtPmlkID0gaWQ7CisJZ2djLT5ndHBfdmVyc2lvbiA9IDE7CisJLyogaWYgd2UgYXJlIGNhbGxlZCBmcm9tIGNvbmZpZyBmaWxlIHBhcnNlLCB0aGlzIGdzbiBkb2Vzbid0IGV4aXN0IHlldCAqLworCWdnYy0+Z3NuID0gc2dzbi0+Z3NuOworCWxsaXN0X2FkZCgmZ2djLT5saXN0LCAmc2dzbl9nZ3NuX2N0eHRzKTsKKworCXJldHVybiBnZ2M7Cit9CisKK3N0cnVjdCBzZ3NuX2dnc25fY3R4ICpzZ3NuX2dnc25fY3R4X2J5X2lkKHVpbnQzMl90IGlkKQoreworCXN0cnVjdCBzZ3NuX2dnc25fY3R4ICpnZ2M7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShnZ2MsICZzZ3NuX2dnc25fY3R4dHMsIGxpc3QpIHsKKwkJaWYgKGlkID09IGdnYy0+aWQpCisJCQlyZXR1cm4gZ2djOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHNnc25fZ2dzbl9jdHggKnNnc25fZ2dzbl9jdHhfZmluZF9hbGxvYyh1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2djOworCisJZ2djID0gc2dzbl9nZ3NuX2N0eF9ieV9pZChpZCk7CisJaWYgKCFnZ2MpCisJCWdnYyA9IHNnc25fZ2dzbl9jdHhfYWxsb2MoaWQpOworCXJldHVybiBnZ2M7Cit9CisKKy8qIEFQTiBjb250ZXh0cyAqLworCisjaWYgMAorc3RydWN0IGFwbl9jdHggKmFwbl9jdHhfYWxsb2MoY29uc3QgY2hhciAqYXBfbmFtZSkKK3sKKwlzdHJ1Y3QgYXBuX2N0eCAqYWN0eDsKKworCWFjdHggPSB0YWxsb2NfemVybyh0YWxsb2NfYnNjX2N0eCwgc3RydWN0IGFwbl9jdHgpOworCWlmICghYWN0eCkKKwkJcmV0dXJuIE5VTEw7CisJYWN0eC0+bmFtZSA9IHRhbGxvY19zdHJkdXAoYWN0eCwgYXBfbmFtZSk7CisKKwlyZXR1cm4gYWN0eDsKK30KKworc3RydWN0IGFwbl9jdHggKmFwbl9jdHhfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhcG5fY3R4ICphY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYWN0eCwgJnNnc25fYXBuX2N0eHRzLCBsaXN0KSB7CisJCWlmICghc3RyY21wKG5hbWUsIGFjdHgtPm5hbWUpKQorCQkJcmV0dXJuIGFjdHg7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgYXBuX2N0eCAqYXBuX2N0eF9maW5kX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFwbl9jdHggKmFjdHg7CisKKwlhY3R4ID0gYXBuX2N0eF9ieV9uYW1lKG5hbWUpOworCWlmICghYWN0eCkKKwkJYWN0eCA9IGFwbl9jdHhfYWxsb2MobmFtZSk7CisKKwlyZXR1cm4gYWN0eDsKK30KKyNlbmRpZgorCit1aW50MzJfdCBzZ3NuX2FsbG9jX3B0bXNpKHZvaWQpCit7CisJc3RydWN0IHNnc25fbW1fY3R4ICptbTsKKwl1aW50MzJfdCBwdG1zaTsKKworcmVzdGFydDoKKwlwdG1zaSA9IHJhbmQoKTsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShtbSwgJnNnc25fbW1fY3R4dHMsIGxpc3QpIHsKKwkJaWYgKG1tLT5wX3Rtc2kgPT0gcHRtc2kpCisJCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJcmV0dXJuIHB0bXNpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX3NuZGNwLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfc25kY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDMzMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX3NuZGNwLmMKQEAgLTAsMCArMSw2MzUgQEAKKy8qIEdQUlMgU05EQ1AgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gYXMgcGVyIDNHUFAgVFMgMDQuNjUgKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19sbGMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Nnc24uaD4KKworLyogQ2hhcHRlciA3LjI6IFNOLVBEVSBGb3JtYXRzICovCitzdHJ1Y3Qgc25kY3BfY29tbW9uX2hkciB7CisJLyogb2N0ZXQgMSAqLworCXVpbnQ4X3QgbnNhcGk6NDsKKwl1aW50OF90IG1vcmU6MTsKKwl1aW50OF90IHR5cGU6MTsKKwl1aW50OF90IGZpcnN0OjE7CisJdWludDhfdCBzcGFyZToxOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogUENPTVAgLyBEQ09NUCBvbmx5IGV4aXN0IGluIGZpcnN0IGZyYWdtZW50ICovCitzdHJ1Y3Qgc25kY3BfY29tcF9oZHIgeworCS8qIG9jdGV0IDIgKi8KKwl1aW50OF90IHBjb21wOjQ7CisJdWludDhfdCBkY29tcDo0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNuZGNwX3VkYXRhX2hkciB7CisJLyogb2N0ZXQgMyAqLworCXVpbnQ4X3QgbnBkdV9oaWdoOjQ7CisJdWludDhfdCBzZWdfbnI6NDsKKwkvKiBvY3RldCA0ICovCisJdWludDhfdCBucGR1X2xvdzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFNlZSA2LjcuMS4yIFJlYXNzZW1ibHkgKi8KK2VudW0gc25kY3Bfcnhfc3RhdGUgeworCVNORENQX1JYX1NfRklSU1QsCisJU05EQ1BfUlhfU19TVUJTRVEsCisJU05EQ1BfUlhfU19ESVNDQVJELAorfTsKKworCitzdGF0aWMgdm9pZCAqdGFsbF9zbmRjcF9jdHg7CisKKy8qIEEgZnJhZ21lbnQgcXVldWUgZW50cnksIGNvbnRhaW5pbmcgb25lIGZyYW1nZW50IG9mIGEgTi1QRFUgKi8KK3N0cnVjdCBkZWZyYWdfcXVldWVfZW50cnkgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJLyogc2VnbWVudCBudW1iZXIgb2YgdGhpcyBmcmFnbWVudCAqLworCXVpbnQzMl90IHNlZ19ucjsKKwkvKiBsZW5ndGggb2YgdGhlIGRhdGEgYXJlYSBvZiB0aGlzIGZyYWdtZW50ICovCisJdWludDMyX3QgZGF0YV9sZW47CisJLyogcG9pbnRlciB0byB0aGUgZGF0YSBvZiB0aGlzIGZyYWdtZW50ICovCisJdWludDhfdCAqZGF0YTsKK307CisKKy8qIEEgZnJhZ21lbnQgcXVldWUgaGVhZGVyLCBtYWludGFpbmluZyBsaXN0IG9mIGZyYWdtZW50cyBmb3Igb25lIE4tUERVICovCitzdHJ1Y3QgZGVmcmFnX3N0YXRlIHsKKwkvKiBQRFUgbnVtYmVyIGZvciB3aGljaCB0aGUgZGVmcmFnbWVudGF0aW9uIHN0YXRlIGFwcGxpZXMgKi8KKwl1aW50MTZfdCBucGR1OworCS8qIGhpZ2hlc3Qgc2VnbWVudCBudW1iZXIgd2UgaGF2ZSByZWNlaXZlZCBzbyBmYXIgKi8KKwl1aW50OF90IGhpZ2hlc3Rfc2VnOworCS8qIGJpdG1hc2sgb2YgdGhlIHNlZ21lbnRzIHdlIGFscmVhZHkgaGF2ZSAqLworCXVpbnQzMl90IHNlZ19oYXZlOworCS8qIGRvIHdlIHN0aWxsIGV4cGVjdCBtb3JlIHNlZ21lbnRzPyAqLworCXVuc2lnbmVkIGludCBub19tb3JlOworCS8qIHRvdGFsIGxlbmd0aCBvZiBhbGwgc2VnbWVudHMgdG9nZXRoZXIgKi8KKwl1bnNpZ25lZCBpbnQgdG90X2xlbjsKKworCS8qIGxpbmtlZCBsaXN0IG9mIGRlZnJhZ19xdWV1ZV9lbnRyeTogb25lIGZvciBlYWNoIGZyYWdtZW50ICAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGZyYWdfbGlzdDsKKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworfTsKKworc3RydWN0IHNuZGNwX2VudGl0eSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCS8qIHJlZmVyZW5jZSB0byB0aGUgTExDIEVudGl0eSBiZWxvdyB0aGlzIFNORENQIGVudGl0eSAqLworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZTsKKwkvKiBUaGUgTlNBUEkgd2Ugc2hhbGwgdXNlIG9uIHRvcCBvZiBMTEMgKi8KKwl1aW50OF90IG5zYXBpOworCisJLyogTlBEVSBudW1iZXIgZm9yIHRoZSBHVFAtPlNORENQIHNpZGUgKi8KKwl1aW50MTZfdCB0eF9ucGR1X25yOworCS8qIFNORENQIGVlY2VpdmVyIHN0YXRlICovCisJZW51bSBzbmRjcF9yeF9zdGF0ZSByeF9zdGF0ZTsKKwkvKiBUaGUgZGVmcmFnbWVudGF0aW9uIHF1ZXVlICovCisJc3RydWN0IGRlZnJhZ19zdGF0ZSBkZWZyYWc7Cit9OworCitMTElTVF9IRUFEKHNuZGNwX2VudGl0aWVzKTsKKworLyogRW5xdWV1ZSBhIGZyYWdtZW50IGludG8gdGhlIGRlZnJhZ21lbnQgcXVldWUgKi8KK3N0YXRpYyBpbnQgZGVmcmFnX2VucXVldWUoc3RydWN0IHNuZGNwX2VudGl0eSAqc25lLCB1aW50OF90IHNlZ19uciwKKwkJCSAgdWludDMyX3QgZGF0YV9sZW4sIHVpbnQ4X3QgKmRhdGEpCit7CisJc3RydWN0IGRlZnJhZ19xdWV1ZV9lbnRyeSAqZHFlOworCisJZHFlID0gdGFsbG9jX3plcm8odGFsbF9zbmRjcF9jdHgsIHN0cnVjdCBkZWZyYWdfcXVldWVfZW50cnkpOworCWlmICghZHFlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkcWUtPmRhdGEgPSB0YWxsb2NfemVyb19zaXplKGRxZSwgZGF0YV9sZW4pOworCWlmICghZHFlLT5kYXRhKSB7CisJCXRhbGxvY19mcmVlKGRxZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkcWUtPnNlZ19uciA9IHNlZ19ucjsKKwlkcWUtPmRhdGFfbGVuID0gZGF0YV9sZW47CisKKwlsbGlzdF9hZGQoJmRxZS0+bGlzdCwgJnNuZS0+ZGVmcmFnLmZyYWdfbGlzdCk7CisKKwlpZiAoc2VnX25yID4gc25lLT5kZWZyYWcuaGlnaGVzdF9zZWcpCisJCXNuZS0+ZGVmcmFnLmhpZ2hlc3Rfc2VnID0gc2VnX25yOworCisJc25lLT5kZWZyYWcuc2VnX2hhdmUgfD0gKDEgPDwgc2VnX25yKTsKKwlzbmUtPmRlZnJhZy50b3RfbGVuICs9IGRhdGFfbGVuOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiBpZiB3ZSBoYXZlIGFsbCBzZWdtZW50cyBvZiB0aGlzIE4tUERVICovCitzdGF0aWMgaW50IGRlZnJhZ19oYXZlX2FsbF9zZWdtZW50cyhzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzbmUpCit7CisJdWludDMyX3Qgc2VnX25lZWRlZCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBjcmVhdGUgYSBiaXRtYXNrIG9mIG5lZWRlZCBzZWdtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBzbmUtPmRlZnJhZy5oaWdoZXN0X3NlZzsgaSsrKQorCQlzZWdfbmVlZGVkIHw9ICgxIDw8IGkpOworCisJaWYgKHNlZ19uZWVkZWQgPT0gc25lLT5kZWZyYWcuc2VnX2hhdmUpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVmcmFnX3F1ZXVlX2VudHJ5ICpkZWZyYWdfZ2V0X3NlZyhzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzbmUsCisJCQkJCQkgdWludDMyX3Qgc2VnX25yKQoreworCXN0cnVjdCBkZWZyYWdfcXVldWVfZW50cnkgKmRxZTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGRxZSwgJnNuZS0+ZGVmcmFnLmZyYWdfbGlzdCwgbGlzdCkgeworCQlpZiAoZHFlLT5zZWdfbnIgPT0gc2VnX25yKSB7CisJCQlsbGlzdF9kZWwoJmRxZS0+bGlzdCk7CisJCQlyZXR1cm4gZHFlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGRlZnJhZ19zZWdtZW50cyhzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzbmUpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1bnNpZ25lZCBpbnQgc2VnX25yOworCXVpbnQ4X3QgKm5wZHU7CisKKwltc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKHNuZS0+ZGVmcmFnLnRvdF9sZW4rMjU2LCAxMjgsICJTTkRDUCBEZWZyYWciKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBGSVhNRTogbWVzc2FnZSBoZWFkZXJzICsgaWRlbnRpZmllcnMgKi8KKworCW5wZHUgPSBtc2ctPmRhdGE7CisKKwlmb3IgKHNlZ19uciA9IDA7IHNlZ19uciA8IHNuZS0+ZGVmcmFnLmhpZ2hlc3Rfc2VnOyBzZWdfbnIrKykgeworCQlzdHJ1Y3QgZGVmcmFnX3F1ZXVlX2VudHJ5ICpkcWU7CisJCXVpbnQ4X3QgKmRhdGE7CisKKwkJZHFlID0gZGVmcmFnX2dldF9zZWcoc25lLCBzZWdfbnIpOworCQlpZiAoIWRxZSkgeworCQkJTE9HUChEU05EQ1AsIExPR0xfRVJST1IsICJTZWdtZW50ICV1IG1pc3NpbmdcbiIsIHNlZ19ucik7CisJCQl0YWxsb2NfZnJlZShtc2cpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJLyogYWN0dWFsbHkgYXBwZW5kIHRoZSBzZWdtZW50IHRvIHRoZSBOLVBEVSAqLworCQlkYXRhID0gbXNnYl9wdXQobXNnLCBkcWUtPmRhdGFfbGVuKTsKKwkJbWVtY3B5KGRhdGEsIGRxZS0+ZGF0YSwgZHFlLT5kYXRhX2xlbik7CisKKwkJLyogcmVsZWFzZSBtZW1vcnkgZm9yIHRoZSBmcmFnbWVudCBxdWV1ZSBlbnRyeSAqLworCQl0YWxsb2NfZnJlZShkcWUpOworCX0KKworCS8qIGFjdHVhbGx5IHNlbmQgdGhlIE4tUERVIHRvIHRoZSBTR1NOIGNvcmUgY29kZSwgd2hpY2ggdGhlbgorCSAqIGhhbmRzIGl0IG9mZiB0byB0aGUgY29ycmVjdCBHVFAgdHVubmVsICsgR0dTTiB2aWEgZ3RwX2RhdGFfcmVxKCkgKi8KKwlyZXR1cm4gc2dzbl9yeF9zbmRjcF91ZF9pbmQoc25lLT5sbGUtPmxsbWUtPnRsbGksIHNuZS0+bnNhcGksIG1zZywKKwkJCQkgICAgc25lLT5kZWZyYWcudG90X2xlbiwgbnBkdSk7Cit9CisKK3N0YXRpYyBpbnQgZGVmcmFnX2lucHV0KHN0cnVjdCBzbmRjcF9lbnRpdHkgKnNuZSwgc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCAqaGRyKQoreworCXN0cnVjdCBzbmRjcF9jb21tb25faGRyICpzY2g7CisJc3RydWN0IHNuZGNwX2NvbXBfaGRyICpzY29tcGggPSBOVUxMOworCXN0cnVjdCBzbmRjcF91ZGF0YV9oZHIgKnN1aDsKKwl1aW50MTZfdCBucGR1X251bTsKKwl1aW50OF90ICpkYXRhOworCWludCByYzsKKworCXNjaCA9IChzdHJ1Y3Qgc25kY3BfY29tbW9uX2hkciAqKSBoZHI7CisJaWYgKHNjaC0+Zmlyc3QpIHsKKwkJc2NvbXBoID0gKHN0cnVjdCBzbmRjcF9jb21wX2hkciAqKSAoaGRyICsgMSk7CisJCXN1aCA9IChzdHJ1Y3Qgc25kY3BfdWRhdGFfaGRyICopIChoZHIgKyAxICsgc2l6ZW9mKHN0cnVjdCBzbmRjcF9jb21tb25faGRyKSk7CisJfSBlbHNlCisJCXN1aCA9IChzdHJ1Y3Qgc25kY3BfdWRhdGFfaGRyICopIChoZHIgKyBzaXplb2Yoc3RydWN0IHNuZGNwX2NvbW1vbl9oZHIpKTsKKworCWRhdGEgPSAodWludDhfdCAqKXN1aCArIHNpemVvZihzdHJ1Y3Qgc25kY3BfdWRhdGFfaGRyKTsKKworCW5wZHVfbnVtID0gKHN1aC0+bnBkdV9oaWdoIDw8IDgpIHwgc3VoLT5ucGR1X2xvdzsKKworCWlmIChzY2gtPmZpcnN0KSB7CisJCS8qIGZpcnN0IHNlZ21lbnQgb2YgYSBuZXcgcGFja2V0LiAgRGlzY2FyZCBhbGwgbGVmdG92ZXIgZnJhZ21lbnRzIG9mCisJCSAqIHByZXZpb3VzIHBhY2tldCAqLworCQlpZiAoIWxsaXN0X2VtcHR5KCZzbmUtPmRlZnJhZy5mcmFnX2xpc3QpKSB7CisJCQlzdHJ1Y3QgZGVmcmFnX3F1ZXVlX2VudHJ5ICpkcWU7CisJCQlMT0dQKERTTkRDUCwgTE9HTF9JTkZPLCAiRHJvcHBpbmcgU04tUERVIGR1ZSB0byAiCisJCQkJImluc3VmZmljaWVudCBzZWdtZW50c1xuIik7CisJCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShkcWUsICZzbmUtPmRlZnJhZy5mcmFnX2xpc3QsIGxpc3QpIHsKKwkJCQlsbGlzdF9kZWwoJmRxZS0+bGlzdCk7CisJCQkJdGFsbG9jX2ZyZWUoZHFlKTsKKwkJCX0KKwkJfQorCQkvKiBzdG9yZSB0aGUgY3VycmVudGx5IGRlLWZyYWdtZW50ZWQgUERVIG51bWJlciAqLworCQlzbmUtPmRlZnJhZy5ucGR1ID0gbnBkdV9udW07CisJCXNuZS0+ZGVmcmFnLm5vX21vcmUgPSBzbmUtPmRlZnJhZy5oaWdoZXN0X3NlZyA9IHNuZS0+ZGVmcmFnLnNlZ19oYXZlID0gMDsKKwkJLyogRklYTUU6IFN0YXJ0IHRpbWVyICovCisJfQorCisJaWYgKHNuZS0+ZGVmcmFnLm5wZHUgIT0gbnBkdV9udW0pIHsKKwkJTE9HUChEU05EQ1AsIExPR0xfSU5GTywgIlNlZ21lbnQgZm9yIGRpZmZlcmVudCBTTi1QRFUgIgorCQkJIigldSAhPSAldSlcbiIsIG5wZHVfbnVtLCBzbmUtPmRlZnJhZy5ucGR1KTsKKwkJLyogRklYTUUgKi8KKwl9CisKKwkvKiBGSVhNRTogY2hlY2sgaWYgc2VnX25yIGFscmVhZHkgZXhpc3RzICovCisJcmMgPSBkZWZyYWdfZW5xdWV1ZShzbmUsIHN1aC0+c2VnX25yLCAobXNnLT5kYXRhICsgbXNnLT5sZW4pIC0gZGF0YSwgZGF0YSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKCFzY2gtPm1vcmUpIHsKKwkJLyogdGhpcyBpcyBzdXBwc2VkIHRvIGJlIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIE4tUERVLCBidXQgaXQKKwkJICogbWlnaHQgd2VsbCBiZSBub3QgdGhlIGxhc3QgdG8gYXJyaXZlICovCisJCXNuZS0+ZGVmcmFnLm5vX21vcmUgPSAxOworCX0KKworCWlmIChzbmUtPmRlZnJhZy5ub19tb3JlKSB7CisJCS8qIHdlIGhhdmUgYWxyZWFkeSByZWNlaXZlZCB0aGUgbGFzdCBzZWdtZW50IGJlZm9yZSwgbGV0J3MgY2hlY2sKKwkJICogaWYgYWxsIHRoZSBwcmV2aW91cyBzZWdtZW50cyBleGlzdCAqLworCQlpZiAoZGVmcmFnX2hhdmVfYWxsX3NlZ21lbnRzKHNuZSkpCisJCQlyZXR1cm4gZGVmcmFnX3NlZ21lbnRzKHNuZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzbmRjcF9lbnRpdHlfYnlfbGxlKGNvbnN0IHN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSwKKwkJCQkJCXVpbnQ4X3QgbnNhcGkpCit7CisJc3RydWN0IHNuZGNwX2VudGl0eSAqc25lOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc25lLCAmc25kY3BfZW50aXRpZXMsIGxpc3QpIHsKKwkJaWYgKHNuZS0+bGxlID09IGxsZSAmJiBzbmUtPm5zYXBpID09IG5zYXBpKQorCQkJcmV0dXJuIHNuZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzbmRjcF9lbnRpdHlfYWxsb2Moc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlLAorCQkJCQkJdWludDhfdCBuc2FwaSkKK3sKKwlzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzbmU7CisKKwlzbmUgPSB0YWxsb2NfemVybyh0YWxsX3NuZGNwX2N0eCwgc3RydWN0IHNuZGNwX2VudGl0eSk7CisJaWYgKCFzbmUpCisJCXJldHVybiBOVUxMOworCisJc25lLT5sbGUgPSBsbGU7CisJc25lLT5uc2FwaSA9IG5zYXBpOworCXNuZS0+ZGVmcmFnLnRpbWVyLmRhdGEgPSBzbmU7CisJLy9zbmUtPmZxdWV1ZS50aW1lci5jYiA9IEZJWE1FOworCXNuZS0+cnhfc3RhdGUgPSBTTkRDUF9SWF9TX0ZJUlNUOworCisJbGxpc3RfYWRkKCZzbmUtPmxpc3QsICZzbmRjcF9lbnRpdGllcyk7CisKKwlyZXR1cm4gc25lOworfQorCisvKiBFbnRyeSBwb2ludCBmb3IgdGhlIFNOU00tQUNUSVZBVEUuaW5kaWNhdGlvbiAqLworaW50IHNuZGNwX3NtX2FjdGl2YXRlX2luZChzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGUsIHVpbnQ4X3QgbnNhcGkpCit7CisJTE9HUChEU05EQ1AsIExPR0xfSU5GTywgIlNOU00tQUNUSVZBVEUuaW5kIChsbGU9JXAgVExMST0lMDh4LCAiCisJICAgICAiU0FQST0ldSwgTlNBUEk9JXUpXG4iLCBsbGUsIGxsZS0+bGxtZS0+dGxsaSwgbGxlLT5zYXBpLCBuc2FwaSk7CisKKwlpZiAoc25kY3BfZW50aXR5X2J5X2xsZShsbGUsIG5zYXBpKSkgeworCQlMT0dQKERTTkRDUCwgTE9HTF9FUlJPUiwgIlRyeWluZyB0byBBQ1RJVkFURSAiCisJCQkiYWxyZWFkeS1leGlzdGluZyBlbnRpdHkgKFRMTEk9JTA4eCwgTlNBUEk9JXUpXG4iLAorCQkJbGxlLT5sbG1lLT50bGxpLCBuc2FwaSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCWlmICghc25kY3BfZW50aXR5X2FsbG9jKGxsZSwgbnNhcGkpKSB7CisJCUxPR1AoRFNORENQLCBMT0dMX0VSUk9SLCAiT3V0IG9mIG1lbW9yeSBkdXJpbmcgQUNUSVZBVEVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRW50cnkgcG9pbnQgZm9yIHRoZSBTTlNNLURFQUNUSVZBVEUuaW5kaWNhdGlvbiAqLworaW50IHNuZGNwX3NtX2RlYWN0aXZhdGVfaW5kKHN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSwgdWludDhfdCBuc2FwaSkKK3sKKwlzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzbmU7CisKKwlMT0dQKERTTkRDUCwgTE9HTF9JTkZPLCAiU05TTS1ERUFDVElWQVRFLmluZCAobGxlPSVwLCBUTExJPSUwOHgsICIKKwkgICAgICJTQVBJPSV1LCBOU0FQST0ldSlcbiIsIGxsZSwgbGxlLT5sbG1lLT50bGxpLCBsbGUtPnNhcGksIG5zYXBpKTsKKworCXNuZSA9IHNuZGNwX2VudGl0eV9ieV9sbGUobGxlLCBuc2FwaSk7CisJaWYgKCFzbmUpIHsKKwkJTE9HUChEU05EQ1AsIExPR0xfRVJST1IsICJTTlNNLURFQUNUSVZBVEUuaW5kIGZvciBub24tIgorCQkgICAgICJleGlzdGluZyBUTExJPSUwOHggU0FQST0ldSBOU0FQST0ldVxuIiwgbGxlLT5sbG1lLT50bGxpLAorCQkgICAgIGxsZS0+c2FwaSwgbnNhcGkpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJbGxpc3RfZGVsKCZzbmUtPmxpc3QpOworCS8qIGZyYWcgcXVldWUgZW50cmllcyBhcmUgaGllcmFyY2hpY2FsbHkgYWxsb2NhdGVkLCBzbyBubyBuZWVkIHRvCisJICogZnJlZSB0aGVtIGV4cGxpY2l0bHkgaGVyZSAqLworCXRhbGxvY19mcmVlKHNuZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRnJhZ21lbnRlciBzdGF0ZSAqLworc3RydWN0IHNuZGNwX2ZyYWdfc3RhdGUgeworCXVpbnQ4X3QgZnJhZ19ucjsKKwlzdHJ1Y3QgbXNnYiAqbXNnOwkvKiBvcmlnaW5hbCBtZXNzYWdlICovCisJdWludDhfdCAqbmV4dF9ieXRlOwkvKiBmaXJzdCBieXRlIG9mIG5leHQgZnJhZ21lbnQgKi8KKworCXN0cnVjdCBzbmRjcF9lbnRpdHkgKnNuZTsKKwl2b2lkICptbWNvbnRleHQ7Cit9OworCisvKiByZXR1cm5zICcxJyBpZiB0aGVyZSBhcmUgbW9yZSBmcmFnbWVudHMgdG8gc2VuZCwgJzAnIGlmIG5vbmUgKi8KK3N0YXRpYyBpbnQgc25kY3Bfc2VuZF91ZF9mcmFnKHN0cnVjdCBzbmRjcF9mcmFnX3N0YXRlICpmcykKK3sKKwlzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzbmUgPSBmcy0+c25lOworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSA9IHNuZS0+bGxlOworCXN0cnVjdCBzbmRjcF9jb21tb25faGRyICpzY2g7CisJc3RydWN0IHNuZGNwX2NvbXBfaGRyICpzY29tcGg7CisJc3RydWN0IHNuZGNwX3VkYXRhX2hkciAqc3VoOworCXN0cnVjdCBtc2diICpmbXNnOworCXVuc2lnbmVkIGludCBtYXhfcGF5bG9hZF9sZW47CisJdW5zaWduZWQgaW50IGxlbjsKKwl1aW50OF90ICpkYXRhOworCWludCByYywgbW9yZTsKKworCWZtc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKGZzLT5zbmUtPmxsZS0+cGFyYW1zLm4yMDFfdSsyNTYsIDEyOCwKKwkJCQkgICAiU05EQ1AgRnJhZyIpOworCWlmICghZm1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBtYWtlIHN1cmUgbG93ZXIgbGF5ZXJzIHJvdXRlIHRoZSBmcmFnbWVudCBsaWtlIHRoZSBvcmlnaW5hbCAqLworCW1zZ2JfdGxsaShmbXNnKSA9IG1zZ2JfdGxsaShmcy0+bXNnKTsKKwltc2diX2J2Y2koZm1zZykgPSBtc2diX2J2Y2koZnMtPm1zZyk7CisJbXNnYl9uc2VpKGZtc2cpID0gbXNnYl9uc2VpKGZzLT5tc2cpOworCisJLyogcHJlcGVuZCBjb21tb24gU05EQ1AgaGVhZGVyICovCisJc2NoID0gKHN0cnVjdCBzbmRjcF9jb21tb25faGRyICopIG1zZ2JfcHV0KGZtc2csIHNpemVvZigqc2NoKSk7CisJc2NoLT5uc2FwaSA9IHNuZS0+bnNhcGk7CisJLyogU2V0IEZJUlNUIGJpdCBpZiB3ZSBhcmUgdGhlIGZpcnN0IGZyYWdtZW50IGluIGEgc2VyaWVzICovCisJaWYgKGZzLT5mcmFnX25yID09IDApCisJCXNjaC0+Zmlyc3QgPSAxOworCXNjaC0+dHlwZSA9IDE7CisKKwkvKiBhcHBlbmQgdGhlIGNvbXByZXNzaW9uIGhlYWRlciBmb3IgZmlyc3QgZnJhZ21lbnQgKi8KKwlpZiAoc2NoLT5maXJzdCkgeworCQlzY29tcGggPSAoc3RydWN0IHNuZGNwX2NvbXBfaGRyICopCisJCQkJbXNnYl9wdXQoZm1zZywgc2l6ZW9mKCpzY29tcGgpKTsKKwkJc2NvbXBoLT5wY29tcCA9IDA7CisJCXNjb21waC0+ZGNvbXAgPSAwOworCX0KKworCS8qIGFwcGVuZCB0aGUgdXNlci1kYXRhIGhlYWRlciAqLworCXN1aCA9IChzdHJ1Y3Qgc25kY3BfdWRhdGFfaGRyICopIG1zZ2JfcHV0KGZtc2csIHNpemVvZigqc3VoKSk7CisJc3VoLT5ucGR1X2xvdyA9IHNuZS0+dHhfbnBkdV9uciAmIDB4ZmY7CisJc3VoLT5ucGR1X2hpZ2ggPSAoc25lLT50eF9ucGR1X25yID4+IDgpICYgMHhmOworCXN1aC0+c2VnX25yID0gZnMtPmZyYWdfbnIgJSAweGY7CisKKwkvKiBjYWxjdWxhdGUgcmVtYWluaW5nIGxlbmd0aCB0byBiZSBzZW50ICovCisJbGVuID0gKGZzLT5tc2ctPmRhdGEgKyBmcy0+bXNnLT5sZW4pIC0gZnMtPm5leHRfYnl0ZTsKKwkvKiBob3cgbXVjaCBwYXlsb2FkIGNhbiB3ZSBhY3R1YWxseSBzZW5kIHZpYSBMTEM/ICovCisJbWF4X3BheWxvYWRfbGVuID0gbGxlLT5wYXJhbXMubjIwMV91IC0gKHNpemVvZigqc2NoKSArIHNpemVvZigqc3VoKSk7CisJaWYgKHNjaC0+Zmlyc3QpCisJCW1heF9wYXlsb2FkX2xlbiAtPSBzaXplb2YoKnNjb21waCk7CisJLyogY2hlY2sgaWYgd2UncmUgZXhjZWVkaW5nIHRoZSBtYXggKi8KKwlpZiAobGVuID4gbWF4X3BheWxvYWRfbGVuKQorCQlsZW4gPSBtYXhfcGF5bG9hZF9sZW47CisKKwkvKiBjb3B5IHRoZSBhY3R1YWwgZnJhZ21lbnQgZGF0YSBpbnRvIG91ciBmbXNnICovCisJZGF0YSA9IG1zZ2JfcHV0KGZtc2csIGxlbik7CisJbWVtY3B5KGRhdGEsIGZzLT5uZXh0X2J5dGUsIGxlbik7CisKKwkvKiBJbmNyZW1lbnQgZnJhZ21lbnQgbnVtYmVyIGFuZCBkYXRhIHBvaW50ZXIgdG8gbmV4dCBmcmFnbWVudCAqLworCWZzLT5mcmFnX25yKys7CisJZnMtPm5leHRfYnl0ZSArPSBsZW47CisKKwkvKiBkZXRlcm1pbmUgaWYgd2UgaGF2ZSBtb3JlIGZyYWdlbW50cyB0byBzZW5kICovCisJaWYgKChmcy0+bXNnLT5kYXRhICsgZnMtPm1zZy0+bGVuKSA8PSBmcy0+bmV4dF9ieXRlKQorCQltb3JlID0gMDsKKwllbHNlCisJCW1vcmUgPSAxOworCisJLyogc2V0IHRoZSBNT1JFIGJpdCBvZiB0aGUgU05EQ1AgaGVhZGVyIGFjY29yZGluZ2x5ICovCisJc2NoLT5tb3JlID0gbW9yZTsKKworCXJjID0gZ3Byc19sbGNfdHhfdWkoZm1zZywgbGxlLT5zYXBpLCAwLCBmcy0+bW1jb250ZXh0KTsKKwlpZiAocmMgPCAwKSB7CisJCS8qIGFib3J0IGluIGNhc2Ugb2YgZXJyb3IsIGRvIG5vdCBhZHZhbmNlIGZyYWdfbnIgLyBuZXh0X2J5dGUgKi8KKwkJbXNnYl9mcmVlKGZtc2cpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKCFtb3JlKSB7CisJCS8qIHdlJ3ZlIHNlbnQgYWxsIGZyYWdtZW50cyAqLworCQltc2diX2ZyZWUoZnMtPm1zZyk7CisJCW1lbXNldChmcywgMCwgc2l6ZW9mKCpmcykpOworCQkvKiBpbmNyZW1lbnQgTlBEVSBudW1iZXIgZm9yIG5leHQgZnJhbWUgKi8KKwkJc25lLT50eF9ucGR1X25yID0gKHNuZS0+dHhfbnBkdV9uciArIDEpICUgMHhmZmY7CisJCXJldHVybiAwOworCX0KKworCS8qIGRlZmF1bHQ6IG1vcmUgZnJhZ21lbnRzIHRvIHNlbmQgKi8KKwlyZXR1cm4gMTsKK30KKworLyogUmVxdWVzdCB0cmFuc21pc3Npb24gb2YgYSBTTi1QRFUgb3ZlciBzcGVjaWZpZWQgTExDIEVudGl0eSArIFNBUEkgKi8KK2ludCBzbmRjcF91bml0ZGF0YV9yZXEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlLCB1aW50OF90IG5zYXBpLAorCQkJdm9pZCAqbW1jb250ZXh0KQoreworCXN0cnVjdCBzbmRjcF9lbnRpdHkgKnNuZTsKKwlzdHJ1Y3Qgc25kY3BfY29tbW9uX2hkciAqc2NoOworCXN0cnVjdCBzbmRjcF9jb21wX2hkciAqc2NvbXBoOworCXN0cnVjdCBzbmRjcF91ZGF0YV9oZHIgKnN1aDsKKwlzdHJ1Y3Qgc25kY3BfZnJhZ19zdGF0ZSBmczsKKworCS8qIElkZW50aWZpZXJzIGZyb20gVVA6IChUTExJLCBTQVBJKSArIChCVkNJLCBOU0VJKSAqLworCisJc25lID0gc25kY3BfZW50aXR5X2J5X2xsZShsbGUsIG5zYXBpKTsKKwlpZiAoIXNuZSkgeworCQlMT0dQKERTTkRDUCwgTE9HTF9FUlJPUiwgIkNhbm5vdCBmaW5kIFNORENQIEVudGl0eVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gZnJhZ21lbnQgdGhpcyBOLVBEVSBpbnRvIG11bHRpcGxlIFNOLVBEVXMgKi8KKwlpZiAobXNnLT5sZW4gPiBsbGUtPnBhcmFtcy5uMjAxX3UgLSAKKwkJCShzaXplb2YoKnNjaCkgKyBzaXplb2YoKnN1aCkgKyBzaXplb2YoKnNjb21waCkpKSB7CisJCS8qIGluaXRpYWxpemUgdGhlIGZyYWdtZW50ZXIgc3RhdGUgKi8KKwkJZnMubXNnID0gbXNnOworCQlmcy5mcmFnX25yID0gMDsKKwkJZnMubmV4dF9ieXRlID0gbXNnLT5kYXRhOworCQlmcy5zbmUgPSBzbmU7CisJCWZzLm1tY29udGV4dCA9IG1tY29udGV4dDsKKworCQkvKiBjYWxsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuZCBzZW5kIGZyYWdtZW50cyB1bnRpbCBhbGwKKwkJICogb2YgdGhlIE4tUERVIGhhcyBiZWVuIHNlbnQgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCWludCByYyA9IHNuZGNwX3NlbmRfdWRfZnJhZygmZnMpOworCQkJaWYgKHJjID09IDApCisJCQkJcmV0dXJuIDA7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCQkvKiBub3QgcmVhY2hlZCAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aGlzIGlzIHRoZSBub24tZnJhZ21lbnRpbmcgY2FzZSB3aGVyZSB3ZSBvbmx5IGJ1aWxkIDEgU04tUERVICovCisKKwkvKiBwcmVwZW5kIHRoZSB1c2VyLWRhdGEgaGVhZGVyICovCisJc3VoID0gKHN0cnVjdCBzbmRjcF91ZGF0YV9oZHIgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpzdWgpKTsKKwlzdWgtPm5wZHVfbG93ID0gc25lLT50eF9ucGR1X25yICYgMHhmZjsKKwlzdWgtPm5wZHVfaGlnaCA9IChzbmUtPnR4X25wZHVfbnIgPj4gOCkgJiAweGY7CisJc3VoLT5zZWdfbnIgPSAwOworCXNuZS0+dHhfbnBkdV9uciA9IChzbmUtPnR4X25wZHVfbnIgKyAxKSAlIDB4ZmZmOworCisJc2NvbXBoID0gKHN0cnVjdCBzbmRjcF9jb21wX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKnNjb21waCkpOworCXNjb21waC0+cGNvbXAgPSAwOworCXNjb21waC0+ZGNvbXAgPSAwOworCisJLyogcHJlcGVuZCBjb21tb24gU05EQ1AgaGVhZGVyICovCisJc2NoID0gKHN0cnVjdCBzbmRjcF9jb21tb25faGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqc2NoKSk7CisJc2NoLT5maXJzdCA9IDE7CisJc2NoLT50eXBlID0gMTsKKwlzY2gtPm5zYXBpID0gbnNhcGk7CisKKwlyZXR1cm4gZ3Byc19sbGNfdHhfdWkobXNnLCBsbGUtPnNhcGksIDAsIG1tY29udGV4dCk7Cit9CisKKy8qIFNlY3Rpb24gNS4xLjIuMTcgTEwtVU5JVERBVEEuaW5kICovCitpbnQgc25kY3BfbGx1bml0ZGF0YV9pbmQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlLCB1aW50OF90ICpoZHIsIHVpbnQ4X3QgbGVuKQoreworCXN0cnVjdCBzbmRjcF9lbnRpdHkgKnNuZTsKKwlzdHJ1Y3Qgc25kY3BfY29tbW9uX2hkciAqc2NoID0gKHN0cnVjdCBzbmRjcF9jb21tb25faGRyICopaGRyOworCXN0cnVjdCBzbmRjcF9jb21wX2hkciAqc2NvbXBoID0gTlVMTDsKKwlzdHJ1Y3Qgc25kY3BfdWRhdGFfaGRyICpzdWg7CisJdWludDhfdCAqbnBkdTsKKwl1aW50MTZfdCBucGR1X251bTsKKwlpbnQgbnBkdV9sZW47CisKKwlzY2ggPSAoc3RydWN0IHNuZGNwX2NvbW1vbl9oZHIgKikgaGRyOworCWlmIChzY2gtPmZpcnN0KSB7CisJCXNjb21waCA9IChzdHJ1Y3Qgc25kY3BfY29tcF9oZHIgKikgKGhkciArIDEpOworCQlzdWggPSAoc3RydWN0IHNuZGNwX3VkYXRhX2hkciAqKSAoaGRyICsgMSArIHNpemVvZihzdHJ1Y3Qgc25kY3BfY29tbW9uX2hkcikpOworCX0gZWxzZQorCQlzdWggPSAoc3RydWN0IHNuZGNwX3VkYXRhX2hkciAqKSAoaGRyICsgc2l6ZW9mKHN0cnVjdCBzbmRjcF9jb21tb25faGRyKSk7CisKKwlpZiAoc2NoLT50eXBlID09IDApIHsKKwkJTE9HUChEU05EQ1AsIExPR0xfRVJST1IsICJTTi1EQVRBIFBEVSBhdCB1bml0ZGF0YV9pbmQoKSBmdW5jdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsZW4gPCBzaXplb2YoKnNjaCkgKyBzaXplb2YoKnN1aCkpIHsKKwkJTE9HUChEU05EQ1AsIExPR0xfRVJST1IsICJTTi1VTklUREFUQSBQRFUgdG9vIHNob3J0ICgldSlcbiIsIGxlbik7CisJCXJldHVybiAtRUlPOworCX0KKworCXNuZSA9IHNuZGNwX2VudGl0eV9ieV9sbGUobGxlLCBzY2gtPm5zYXBpKTsKKwlpZiAoIXNuZSkgeworCQlMT0dQKERTTkRDUCwgTE9HTF9FUlJPUiwgIk1lc3NhZ2UgZm9yIG5vbi1leGlzdGluZyBTTkRDUCBFbnRpdHkgIgorCQkJIihsbGU9JXAsIFRMTEk9JTA4eCwgU0FQST0ldSwgTlNBUEk9JXUpXG4iLCBsbGUsCisJCQlsbGUtPmxsbWUtPnRsbGksIGxsZS0+c2FwaSwgc2NoLT5uc2FwaSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghc2NoLT5maXJzdCB8fCBzY2gtPm1vcmUpIHsKKwkJLyogRklYTUU6IGltcGxlbWVudCBmcmFnbWVudCByZS1hc3NlbWJseSAqLworCQlMT0dQKERTTkRDUCwgTE9HTF9FUlJPUiwgIldlIGRvbid0IHN1cHBvcnQgcmVhc3NlbWJseSB5ZXRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoc2NvbXBoICYmIChzY29tcGgtPnBjb21wIHx8IHNjb21waC0+ZGNvbXApKSB7CisJCUxPR1AoRFNORENQLCBMT0dMX0VSUk9SLCAiV2UgZG9uJ3Qgc3VwcG9ydCBjb21wcmVzc2lvbiB5ZXRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlucGR1X251bSA9IChzdWgtPm5wZHVfaGlnaCA8PCA4KSB8IHN1aC0+bnBkdV9sb3c7CisJbnBkdSA9ICh1aW50OF90ICopc3VoICsgc2l6ZW9mKCpzdWgpOworCW5wZHVfbGVuID0gKG1zZy0+ZGF0YSArIG1zZy0+bGVuKSAtIG5wZHU7CisJaWYgKG5wZHVfbGVuIDw9IDApIHsKKwkJTE9HUChEU05EQ1AsIExPR0xfRVJST1IsICJTaG9ydCBTTkRDUCBOLVBEVTogJWRcbiIsIG5wZHVfbGVuKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8qIGFjdHVhbGx5IHNlbmQgdGhlIE4tUERVIHRvIHRoZSBTR1NOIGNvcmUgY29kZSwgd2hpY2ggdGhlbgorCSAqIGhhbmRzIGl0IG9mZiB0byB0aGUgY29ycmVjdCBHVFAgdHVubmVsICsgR0dTTiB2aWEgZ3RwX2RhdGFfcmVxKCkgKi8KKwlyZXR1cm4gc2dzbl9yeF9zbmRjcF91ZF9pbmQobGxlLT5sbG1lLT50bGxpLCBzbmUtPm5zYXBpLCBtc2csIG5wZHVfbGVuLCBucGR1KTsKK30KKworLyogU2VjdGlvbiA1LjEuMi4xIExMLVJFU0VULmluZCAqLworc3RhdGljIGludCBzbmRjcF9sbF9yZXNldF9pbmQoc3RydWN0IHNuZGNwX2VudGl0eSAqc2UpCit7CisJLyogdHJlYXQgYWxsIG91dHN0YW5kaW5nIFNORENQLUxMQyByZXF1ZXN0IHR5cGUgcHJpbWl0aXZlcyBhcyBub3Qgc2VudCAqLworCS8qIHJlc2V0IGFsbCBTTkRDUCBYSUQgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcyAqLworfQorCitzdGF0aWMgaW50IHNuZGNwX2xsX3N0YXR1c19pbmQoKQoreworCS8qIGluZm9ybSB0aGUgU00gc3ViLWxheWVyIGJ5IG1lYW5zIG9mIFNOU00tU1RBVFVTLnJlcSAqLworfQorCisjaWYgMAorc3RhdGljIHN0cnVjdCBzbmRjcF9zdGF0ZV9saXN0IHt7CisJdWludDMyX3QJc3RhdGVzOworCXVuc2lnbmVkIGludAl0eXBlOworCWludAkJKCpyb3V0KShzdHJ1Y3Qgc25kY3BfZW50aXR5ICpzZSwgc3RydWN0IG1zZ2IgKm1zZyk7Cit9IHNuZGNwX3N0YXRlX2xpc3RbXSA9IHsKKwl7IEFMTF9TVEFURVMsCisJICBMTF9SRVNFVF9JTkQsIHNuZGNwX2xsX3Jlc2V0X2luZCB9LAorCXsgQUxMX1NUQVRFUywKKwkgIExMX0VTVEFCTElTSF9JTkQsIHNuZGNwX2xsX2VzdF9pbmQgfSwKKwl7IFNCSVQoU05EQ1BfU19FU1RfUlFEKSwKKwkgIExMX0VTVEFCTElTSF9SRVNQLCBzbmRjcF9sbF9lc3RfaW5kIH0sCisJeyBTQklUKFNORENQX1NfRVNUX1JRRCksCisJICBMTF9FU1RBQkxJU0hfQ09ORiwgc25kY3BfbGxfZXN0X2NvbmYgfSwKKwl7IFNCSVQoU05EQ1BfU18KK307CisKK3N0YXRpYyBpbnQgc25kY3BfcnhfbGxjX3ByaW0oKQoreworCWNhc2UgTExfRVNUQUJMSVNIX1JFUToKKwljYXNlIExMX1JFTEVBU0VfUkVROgorCWNhc2UgTExfWElEX1JFUToKKwljYXNlIExMX0RBVEFfUkVROgorCUxMX1VOSVREQVRBX1JFUSwJLyogVExMSSwgU04tUERVLCBSZWYsIFFvUywgUmFkaW8gUHJpbywgQ2lwaCAqLworCisJc3dpdGNoIChwcmltKSB7CisJY2FzZSBMTF9SRVNFVF9JTkQ6CisJY2FzZSBMTF9FU1RBQkxJU0hfSU5EOgorCWNhc2UgTExfRVNUQUJMSVNIX1JFU1A6CisJY2FzZSBMTF9FU1RBQkxJU0hfQ09ORjoKKwljYXNlIExMX1JFTEVBU0VfSU5EOgorCWNhc2UgTExfUkVMRUFTRV9DT05GOgorCWNhc2UgTExfWElEX0lORDoKKwljYXNlIExMX1hJRF9SRVNQOgorCWNhc2UgTExfWElEX0NPTkY6CisJY2FzZSBMTF9EQVRBX0lORDoKKwljYXNlIExMX0RBVEFfQ09ORjoKKwljYXNlIExMX1VOSVREQVRBX0lORDoKKwljYXNlIExMX1NUQVRVU19JTkQ6Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvb3Ntb19nYnByb3h5LmNmZyBiL29wZW5ic2Mvc3JjL2dwcnMvb3Ntb19nYnByb3h5LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI1NjE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9vc21vX2dicHJveHkuY2ZnCkBAIC0wLDAgKzEsMjQgQEAKKyEKKyEgT3Ntb2NvbSBHYiBQcm94eSAoMC45LjAuNDA0LTY0NjMpIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEhCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCitnYnByb3h5Cisgc2dzbiBuc2VpIDEwMQorbnMKKyBuc2UgMTAxIG5zdmNpIDEwMQorIG5zZSAxMDEgcmVtb3RlLXJvbGUgc2dzbgorIG5zZSAxMDEgZW5jYXBzdWxhdGlvbiB1ZHAKKyBuc2UgMTAxIHJlbW90ZS1pcCAxOTIuMTY4LjEwMC4yMzkKKyBuc2UgMTAxIHJlbW90ZS1wb3J0IDc3NzcKKyB0aW1lciB0bnMtYmxvY2sgMworIHRpbWVyIHRucy1ibG9jay1yZXRyaWVzIDMKKyB0aW1lciB0bnMtcmVzZXQgMworIHRpbWVyIHRucy1yZXNldC1yZXRyaWVzIDMKKyB0aW1lciB0bnMtdGVzdCAzMAorIHRpbWVyIHRucy1hbGl2ZSAzCisgdGltZXIgdG5zLWFsaXZlLXJldHJpZXMgMTAKKyBlbmNhcHN1bGF0aW9uIGZyYW1lcmVsYXktZ3JlIGVuYWJsZWQgMQorIGVuY2Fwc3VsYXRpb24gZnJhbWVyZWxheS1ncmUgbG9jYWwtaXAgMC4wLjAuMApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9vc21vX3Nnc24uY2ZnIGIvb3BlbmJzYy9zcmMvZ3Bycy9vc21vX3Nnc24uY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YzllYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL29zbW9fc2dzbi5jZmcKQEAgLTAsMCArMSwyMyBAQAorIQorISBPc21vY29tIFNHU04gKDAuOS4wLjQ3NC0wZWRlMikgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISEKKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK3Nnc24KKyBndHAgbG9jYWwtaXAgMTkyLjE2OC4xMDAuMTEKKyBnZ3NuIDAgcmVtb3RlLWlwIDE5Mi4xNjguMTAwLjIzOQorIGdnc24gMCBndHAtdmVyc2lvbiAxCitucworIHRpbWVyIHRucy1ibG9jayAzCisgdGltZXIgdG5zLWJsb2NrLXJldHJpZXMgMworIHRpbWVyIHRucy1yZXNldCAzCisgdGltZXIgdG5zLXJlc2V0LXJldHJpZXMgMworIHRpbWVyIHRucy10ZXN0IDMwCisgdGltZXIgdG5zLWFsaXZlIDMKKyB0aW1lciB0bnMtYWxpdmUtcmV0cmllcyAxMAorIGVuY2Fwc3VsYXRpb24gdWRwIGxvY2FsLWlwIDE5Mi4xNjguMTAwLjExCisgZW5jYXBzdWxhdGlvbiB1ZHAgbG9jYWwtcG9ydCAyMzAwMAorIGVuY2Fwc3VsYXRpb24gZnJhbWVyZWxheS1ncmUgZW5hYmxlZCAwCitic3NncApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3Bycy9zZ3NuX2xpYmd0cC5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9zZ3NuX2xpYmd0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZmFjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbGliZ3RwLmMKQEAgLTAsMCArMSw1NTcgQEAKKy8qIEdQUlMgU0dTTiBpbnRlZ3JhdGlvbiB3aXRoIGxpYmd0cCBvZiBPcGVuR0dTTiAqLworLyogbGliZ3RwIGltcGxlbWVudHMgdGhlIEdQUlMgVHVuZWxsaW5nIFByb3RvY29sIEdUUCBwZXIgVFMgMDkuNjAgLyAyOS4wNjAgKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4X2dwcnMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2dzbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19sbGMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfc2dzbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19nbW0uaD4KKworI2luY2x1ZGUgPGd0cC5oPgorI2luY2x1ZGUgPHBkcC5oPgorCitjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGd0cF9jYXVzZV9zdHJzW10gPSB7CisJeyBHVFBDQVVTRV9SRVFfSU1TSSwgIlJlcXVlc3QgSU1TSSIgfSwKKwl7IEdUUENBVVNFX1JFUV9JTUVJLCAiUmVxdWVzdCBJTUVJIiB9LAorCXsgR1RQQ0FVU0VfUkVRX0lNU0lfSU1FSSwgIlJlcXVlc3QgSU1TSSBhbmQgSU1FSSIgfSwKKwl7IEdUUENBVVNFX05PX0lEX05FRURFRCwgIk5vIGlkZW50aXR5IG5lZWRlZCIgfSwKKwl7IEdUUENBVVNFX01TX1JFRlVTRVNfWCwgIk1TIHJlZnVzZXMiIH0sCisJeyBHVFBDQVVTRV9NU19OT1RfUkVTUF9YLCAiTVMgaXMgbm90IEdQUlMgcmVzcG9uZGluZyIgfSwKKwl7IEdUUENBVVNFX0FDQ19SRVEsICJSZXF1ZXN0IGFjY2VwdGVkIiB9LAorCXsgR1RQQ0FVU0VfTk9OX0VYSVNULCAiTm9uLWV4aXN0ZW50IiB9LAorCXsgR1RQQ0FVU0VfSU5WQUxJRF9NRVNTQUdFLCAiSW52YWxpZCBtZXNzYWdlIGZvcm1hdCIgfSwKKwl7IEdUUENBVVNFX0lNU0lfTk9UX0tOT1dOLCAiSU1TSSBub3Qga25vd24iIH0sCisJeyBHVFBDQVVTRV9NU19ERVRBQ0hFRCwgIk1TIGlzIEdQUlMgZGV0YWNoZWQiIH0sCisJeyBHVFBDQVVTRV9NU19OT1RfUkVTUCwgIk1TIGlzIG5vdCBHUFJTIHJlc3BvbmRpbmciIH0sCisJeyBHVFBDQVVTRV9NU19SRUZVU0VTLCAiTVMgcmVmdXNlcyIgfSwKKwl7IEdUUENBVVNFX05PX1JFU09VUkNFUywgIk5vIHJlc291cmNlcyBhdmFpbGFibGUiIH0sCisJeyBHVFBDQVVTRV9OT1RfU1VQUE9SVEVELCAiU2VydmljZSBub3Qgc3VwcG9ydGVkIiB9LAorCXsgR1RQQ0FVU0VfTUFOX0lFX0lOQ09SUkVDVCwgIk1hbmRhdG9yeSBJRSBpbmNvcnJlY3QiIH0sCisJeyBHVFBDQVVTRV9NQU5fSUVfTUlTU0lORywgIk1hbmRhdG9yeSBJRSBtaXNzaW5nIiB9LAorCXsgR1RQQ0FVU0VfT1BUX0lFX0lOQ09SUkVDVCwgIk9wdGlvbmFsIElFIGluY29ycmVjdCIgfSwKKwl7IEdUUENBVVNFX1NZU19GQUlMLCAiU3lzdGVtIGZhaWx1cmUiIH0sCisJeyBHVFBDQVVTRV9ST0FNSU5HX1JFU1QsICJSb2FtaW5nIHJlc3RyaWN0aW9ucyIgfSwKKwl7IEdUUENBVVNFX1BUSU1TSV9NSVNNQVRDSCwgIlAtVE1TSSBTaWduYXR1cmUgbWlzbWF0Y2giIH0sCisJeyBHVFBDQVVTRV9DT05OX1NVU1AsICJHUFJTIGNvbm5lY3Rpb24gc3VzcGVuZGVkIiB9LAorCXsgR1RQQ0FVU0VfQVVUSF9GQUlMLCAiQXV0aGVudGljYXRpb24gZmFpbHVyZSIgfSwKKwl7IEdUUENBVVNFX1VTRVJfQVVUSF9GQUlMLCAiVXNlciBhdXRoZW50aWNhdGlvbiBmYWlsZWQiIH0sCisJeyBHVFBDQVVTRV9DT05URVhUX05PVF9GT1VORCwgIkNvbnRleHQgbm90IGZvdW5kIiB9LAorCXsgR1RQQ0FVU0VfQUREUl9PQ0NVUElFRCwgIkFsbCBkeW5hbWljIFBEUCBhZGRyZXNzZXMgb2NjdXBpZWQiIH0sCisJeyBHVFBDQVVTRV9OT19NRU1PUlksICJObyBtZW1vcnkgaXMgYXZhaWxhYmxlIiB9LAorCXsgR1RQQ0FVU0VfUkVMT0NfRkFJTCwgIlJlbG9jYXRpb24gZmFpbHVyZSIgfSwKKwl7IEdUUENBVVNFX1VOS05PV05fTUFOX0VYVEhFQURFUiwgIlVua25vd24gbWFuZGF0b3J5IGV4dC4gaGVhZGVyIiB9LAorCXsgR1RQQ0FVU0VfU0VNX0VSUl9URlQsICJTZW1hbnRpYyBlcnJvciBpbiBURlQgb3BlcmF0aW9uIiB9LAorCXsgR1RQQ0FVU0VfU1lOX0VSUl9URlQsICJTeW50YWN0aWMgZXJyb3IgaW4gVEZUIG9wZXJhdGlvbiIgfSwKKwl7IEdUUENBVVNFX1NFTV9FUlJfRklMVEVSLCAiU2VtYW50aWMgZXJyb3JzIGluIHBhY2tldCBmaWx0ZXIiIH0sCisJeyBHVFBDQVVTRV9TWU5fRVJSX0ZJTFRFUiwgIlN5bnRhY3RpYyBlcnJvcnMgaW4gcGFja2V0IGZpbHRlciIgfSwKKwl7IEdUUENBVVNFX01JU1NJTkdfQVBOLCAiTWlzc2luZyBvciB1bmtub3duIEFQTiIgfSwKKwl7IEdUUENBVVNFX1VOS05PV05fUERQLCAiVW5rbm93biBQRFAgYWRkcmVzcyBvciBQRFAgdHlwZSIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworLyogZ2VuZXJhdGUgYSBQRFAgY29udGV4dCBiYXNlZCBvbiB0aGUgSUUncyBmcm9tIHRoZSAwNC4wOCBtZXNzYWdlLAorICogYW5kIHNlbmQgdGhlIEdUUCBjcmVhdGUgcGRwIGNvbnRleHQgcmVxdWVzdCB0byB0aGUgR0dTTiAqLworc3RydWN0IHNnc25fcGRwX2N0eCAqc2dzbl9jcmVhdGVfcGRwX2N0eChzdHJ1Y3Qgc2dzbl9nZ3NuX2N0eCAqZ2dzbiwKKwkJCQkJIHN0cnVjdCBzZ3NuX21tX2N0eCAqbW1jdHgsCisJCQkJCSB1aW50MTZfdCBuc2FwaSwKKwkJCQkJIHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKwlzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwY3R4OworCXN0cnVjdCBwZHBfdCAqcGRwOworCXVpbnQ2NF90IGltc2lfdWk2NCA9IDA7CisJaW50IHJjOworCisJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIkNyZWF0ZSBQRFAgQ29udGV4dFxuIik7CisJcGN0eCA9IHNnc25fcGRwX2N0eF9hbGxvYyhtbWN0eCwgbnNhcGkpOworCWlmICghcGN0eCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiQ291bGRuJ3QgYWxsb2NhdGUgUERQIEN0eFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJjID0gcGRwX25ld3BkcCgmcGRwLCBpbXNpX3VpNjQsIG5zYXBpLCBOVUxMKTsKKwlpZiAocmMpIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIk91dCBvZiBsaWJndHAgUERQIENvbnRleHRzXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXBkcC0+cHJpdiA9IHBjdHg7CisJcGN0eC0+bGliID0gcGRwOworCXBjdHgtPmdnc24gPSBnZ3NuOworCisJLy9wZHAtPnBlZXIgPQkvKiBzb2NrYWRkcl9pbiBvZiBHR1NOIChyZWNlaXZlKSAqLworCS8vcGRwLT5pcGlmID0JLyogbm90IHVzZWQgYnkgbGlicmFyeSAqLworCXBkcC0+dmVyc2lvbiA9IGdnc24tPmd0cF92ZXJzaW9uOworCXBkcC0+aGlzYWRkcjAgPQlnZ3NuLT5yZW1vdGVfYWRkcjsKKwlwZHAtPmhpc2FkZHIxID0gZ2dzbi0+cmVtb3RlX2FkZHI7CisJLy9wZHAtPmNjaF9wZHAgPSA1MTI7CS8qIENoYXJnaW5nIEZsYXQgUmF0ZSAqLworCisJLyogTVMgcHJvdmlkZWQgQVBOLCBzdWJzY3JpcHRpb24gbm90IHZlcmlmaWVkICovCisJcGRwLT5zZWxtb2RlID0gMHgwMTsKKworCS8qIElNU0ksIFRFSUQvVEVJQywgRkxMVS9GTExDLCBUSUQsIE5TQVBJIHNldCBpbiBwZHBfbmV3cGRwICovCisKKwkvKiBGSVhNRTogTVNJU0ROIGluIEJDRCBmb3JtYXQgZnJvbSBtbWN0eCAqLworCS8vcGRwLT5tc2lzZG4ubC8udgorCisJLyogRW5kIFVzZXIgQWRkcmVzcyBmcm9tIEdNTSByZXF1ZXN0ZWQgUERQIGFkZHJlc3MgKi8KKwlwZHAtPmV1YS5sID0gVExWUF9MRU4odHAsIE9TTU9fSUVfR1NNX1JFUV9QRFBfQUREUik7CisJaWYgKHBkcC0+ZXVhLmwgPiBzaXplb2YocGRwLT5ldWEudikpCisJCXBkcC0+ZXVhLmwgPSBzaXplb2YocGRwLT5ldWEudik7CisJbWVtY3B5KHBkcC0+ZXVhLnYsIFRMVlBfVkFMKHRwLCBPU01PX0lFX0dTTV9SRVFfUERQX0FERFIpLAorCQlwZHAtPmV1YS5sKTsKKwkvKiBIaWdoZXN0IDQgYml0cyBvZiBmaXJzdCBieXRlIG5lZWQgdG8gYmUgc2V0IHRvIDEsIG90aGVyd2lzZQorCSAqIHRoZSBJRSBpcyBpZGVudGljYWwgd2l0aCB0aGUgMDQuMDggUERQIEFkZHJlc3MgSUUgKi8KKwlwZHAtPmV1YS52WzBdIHw9IDB4ZjA7CisKKwkvKiBBUE4gbmFtZSBmcm9tIEdNTSAqLworCXBkcC0+YXBuX3VzZS5sID0gVExWUF9MRU4odHAsIEdTTTQ4X0lFX0dTTV9BUE4pOworCWlmIChwZHAtPmFwbl91c2UubCA+IHNpemVvZihwZHAtPmFwbl91c2UudikpCisJCXBkcC0+YXBuX3VzZS5sID0gc2l6ZW9mKHBkcC0+YXBuX3VzZS52KTsKKwltZW1jcHkocGRwLT5hcG5fdXNlLnYsIFRMVlBfVkFMKHRwLCBHU000OF9JRV9HU01fQVBOKSwKKwkJcGRwLT5hcG5fdXNlLmwpOworCisJLyogUHJvdG9jb2wgQ29uZmlndXJhdGlvbiBPcHRpb25zIGZyb20gR01NICovCisJcGRwLT5wY29fcmVxLmwgPSBUTFZQX0xFTih0cCwgR1NNNDhfSUVfR1NNX1BST1RPX0NPTkZfT1BUKTsKKwlpZiAocGRwLT5wY29fcmVxLmwgPiBzaXplb2YocGRwLT5wY29fcmVxLnYpKQorCQlwZHAtPnBjb19yZXEubCA9IHNpemVvZihwZHAtPnBjb19yZXEudik7CisJbWVtY3B5KHBkcC0+cGNvX3JlcS52LCBUTFZQX1ZBTCh0cCwgR1NNNDhfSUVfR1NNX1BST1RPX0NPTkZfT1BUKSwKKwkJcGRwLT5wY29fcmVxLmwpOworCisJLyogUW9TIG9wdGlvbnMgZnJvbSBHTU0gKi8KKwlwZHAtPnFvc19yZXEubCA9IFRMVlBfTEVOKHRwLCBPU01PX0lFX0dTTV9SRVFfUU9TKTsKKwlpZiAocGRwLT5xb3NfcmVxLmwgPiBzaXplb2YocGRwLT5xb3NfcmVxLnYpKQorCQlwZHAtPnFvc19yZXEubCA9IHNpemVvZihwZHAtPnFvc19yZXEudik7CisJbWVtY3B5KHBkcC0+cW9zX3JlcS52LCBUTFZQX1ZBTCh0cCwgT1NNT19JRV9HU01fUkVRX1FPUyksCisJCXBkcC0+cW9zX3JlcS5sKTsKKworCS8qIFNHU04gYWRkcmVzcyBmb3IgY29udHJvbCBwbGFuZSAqLworCXBkcC0+Z3NubGMubCA9IHNpemVvZihzZ3NuLT5jZmcuZ3RwX2xpc3RlbmFkZHIuc2luX2FkZHIpOworCW1lbWNweShwZHAtPmdzbmxjLnYsICZzZ3NuLT5jZmcuZ3RwX2xpc3RlbmFkZHIuc2luX2FkZHIsCisJCXNpemVvZihzZ3NuLT5jZmcuZ3RwX2xpc3RlbmFkZHIuc2luX2FkZHIpKTsKKworCS8qIFNHU04gYWRkcmVzcyBmb3IgdXNlciBwbGFuZSAqLworCXBkcC0+Z3NubHUubCA9IHNpemVvZihzZ3NuLT5jZmcuZ3RwX2xpc3RlbmFkZHIuc2luX2FkZHIpOworCW1lbWNweShwZHAtPmdzbmx1LnYsICZzZ3NuLT5jZmcuZ3RwX2xpc3RlbmFkZHIuc2luX2FkZHIsCisJCXNpemVvZihzZ3NuLT5jZmcuZ3RwX2xpc3RlbmFkZHIuc2luX2FkZHIpKTsKKworCS8qIGNoYW5nZSBwZHAgc3RhdGUgdG8gJ3JlcXVlc3RlZCcgKi8KKwlwY3R4LT5zdGF0ZSA9IFBEUF9TVEFURV9DUl9SRVE7CisKKwlyYyA9IGd0cF9jcmVhdGVfY29udGV4dF9yZXEoZ2dzbi0+Z3NuLCBwZHAsIHBjdHgpOworCS8qIEZJWE1FICovCisKKwlyZXR1cm4gcGN0eDsKK30KKworaW50IHNnc25fZGVsZXRlX3BkcF9jdHgoc3RydWN0IHNnc25fcGRwX2N0eCAqcGN0eCkKK3sKKwlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiRGVsZXRlIFBEUCBDb250ZXh0XG4iKTsKKworCS8qIEZJWE1FOiBkZWNpZGUgaWYgd2UgbmVlZCB0ZWFyZG93biBvciBub3QgISAqLworCXJldHVybiBndHBfZGVsZXRlX2NvbnRleHRfcmVxKHBjdHgtPmdnc24tPmdzbiwgcGN0eC0+bGliLCBwY3R4LCAxKTsKK30KKworc3RydWN0IGNhdXNlX21hcCB7CisJdWludDhfdCBjYXVzZV9pbjsKKwl1aW50OF90IGNhdXNlX291dDsKK307CisKK3N0YXRpYyB1aW50OF90IGNhdXNlX21hcChjb25zdCBzdHJ1Y3QgY2F1c2VfbWFwICptYXAsIHVpbnQ4X3QgaW4sIHVpbnQ4X3QgZGVmbHQpCit7CisJY29uc3Qgc3RydWN0IGNhdXNlX21hcCAqbTsKKworCWZvciAobSA9IG1hcDsgbS0+Y2F1c2VfaW4gJiYgbS0+Y2F1c2Vfb3V0OyBtKyspIHsKKwkJaWYgKG0tPmNhdXNlX2luID09IGluKQorCQkJcmV0dXJuIG0tPmNhdXNlX291dDsKKwl9CisJcmV0dXJuIGRlZmx0OworfQorCisvKiBob3cgZG8gd2UgbWFwIGZyb20gZ3RwIGNhdXNlIHRvIFNNIGNhdXNlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNhdXNlX21hcCBndHAyc21fY2F1c2VfbWFwW10gPSB7CisJeyBHVFBDQVVTRV9OT19SRVNPVVJDRVMsIAlHU01fQ0FVU0VfSU5TVUZGX1JTUkMgfSwKKwl7IEdUUENBVVNFX05PVF9TVVBQT1JURUQsCUdTTV9DQVVTRV9TRVJWX09QVF9OT1RTVVBQIH0sCisJeyBHVFBDQVVTRV9NQU5fSUVfSU5DT1JSRUNULAlHU01fQ0FVU0VfSU5WX01BTkRfSU5GTyB9LAorCXsgR1RQQ0FVU0VfTUFOX0lFX01JU1NJTkcsCUdTTV9DQVVTRV9JTlZfTUFORF9JTkZPIH0sCisJeyBHVFBDQVVTRV9PUFRfSUVfSU5DT1JSRUNULAlHU01fQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQyB9LAorCXsgR1RQQ0FVU0VfU1lTX0ZBSUwsCQlHU01fQ0FVU0VfTkVUX0ZBSUwgfSwKKwl7IEdUUENBVVNFX1JPQU1JTkdfUkVTVCwJR1NNX0NBVVNFX1JFUV9TRVJWX09QVF9OT1RTVUIgfSwKKwl7IEdUUENBVVNFX1BUSU1TSV9NSVNNQVRDSCwJR1NNX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMgfSwKKwl7IEdUUENBVVNFX0NPTk5fU1VTUCwJCUdTTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDIH0sCisJeyBHVFBDQVVTRV9BVVRIX0ZBSUwsCQlHU01fQ0FVU0VfQVVUSF9GQUlMRUQgfSwKKwl7IEdUUENBVVNFX1VTRVJfQVVUSF9GQUlMLAlHU01fQ0FVU0VfQUNUX1JFSl9HR1NOIH0sCisJeyBHVFBDQVVTRV9DT05URVhUX05PVF9GT1VORCwJR1NNX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMgfSwKKwl7IEdUUENBVVNFX0FERFJfT0NDVVBJRUQsCUdTTV9DQVVTRV9JTlNVRkZfUlNSQyB9LAorCXsgR1RQQ0FVU0VfTk9fTUVNT1JZLAkJR1NNX0NBVVNFX0lOU1VGRl9SU1JDIH0sCisJeyBHVFBDQVVTRV9SRUxPQ19GQUlMLAkJR1NNX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMgfSwKKwl7IEdUUENBVVNFX1VOS05PV05fTUFOX0VYVEhFQURFUiwgR1NNX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMgfSwKKwl7IEdUUENBVVNFX01JU1NJTkdfQVBOLAkJR1NNX0NBVVNFX01JU1NJTkdfQVBOIH0sCisJeyBHVFBDQVVTRV9VTktOT1dOX1BEUCwJCUdTTV9DQVVTRV9VTktOT1dOX1BEUCB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgR0dTTiBoYXMgY29uZmlybWVkIHRoZSBjcmVhdGlvbiBvZiBhIFBEUCBDb250ZXh0ICovCitzdGF0aWMgaW50IGNyZWF0ZV9wZHBfY29uZihzdHJ1Y3QgcGRwX3QgKnBkcCwgdm9pZCAqY2JwLCBpbnQgY2F1c2UpCit7CisJc3RydWN0IHNnc25fcGRwX2N0eCAqcGN0eCA9IGNicDsKKwl1aW50OF90IHJlamVjdF9jYXVzZTsKKwlpbnQgcmM7CisKKwlERUJVR1AoREdQUlMsICJSZWNlaXZlZCBDUkVBVEUgUERQIENUWCBDT05GLCBjYXVzZT0lZCglcylcbiIsCisJCWNhdXNlLCBnZXRfdmFsdWVfc3RyaW5nKGd0cF9jYXVzZV9zdHJzLCBjYXVzZSkpOworCisJLyogQ2hlY2sgZm9yIGNhdXNlIHZhbHVlIGlmIGl0IHdhcyByZWFsbHkgc3VjY2Vzc2Z1bCAqLworCWlmIChjYXVzZSA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJDcmVhdGUgUERQIGN0eCByZXEgdGltZWQgb3V0XG4iKTsKKwkJaWYgKHBkcCAmJiBwZHAtPnZlcnNpb24gPT0gMSkgeworCQkJcGRwLT52ZXJzaW9uID0gMDsKKwkJCWd0cF9jcmVhdGVfY29udGV4dF9yZXEoc2dzbi0+Z3NuLCBwZHAsIGNicCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJlamVjdF9jYXVzZSA9IEdTTV9DQVVTRV9ORVRfRkFJTDsKKwkJCWdvdG8gcmVqZWN0OworCQl9CisJfQorCisJLyogQ2hlY2sgZm9yIGNhdXNlIHZhbHVlIGlmIGl0IHdhcyByZWFsbHkgc3VjY2Vzc2Z1bCAqLworCWlmIChjYXVzZSAhPSBHVFBDQVVTRV9BQ0NfUkVRKSB7CisJCXJlamVjdF9jYXVzZSA9IGNhdXNlX21hcChndHAyc21fY2F1c2VfbWFwLCBjYXVzZSwKKwkJCQkJIEdTTV9DQVVTRV9BQ1RfUkVKX0dHU04pOworCQlnb3RvIHJlamVjdDsKKwl9CisKKwkvKiBBY3RpdmF0ZSB0aGUgU05EQ1AgbGF5ZXIgKi8KKwlzbmRjcF9zbV9hY3RpdmF0ZV9pbmQoJnBjdHgtPm1tLT5sbG1lLT5sbGVbcGN0eC0+c2FwaV0sIHBjdHgtPm5zYXBpKTsKKworCS8qIFNlbmQgUERQIENUWCBBQ1QgdG8gTVMgKi8KKwlyZXR1cm4gZ3NtNDhfdHhfZ3NtX2FjdF9wZHBfYWNjKHBjdHgpOworCityZWplY3Q6CisJcGN0eC0+c3RhdGUgPSBQRFBfU1RBVEVfTk9ORTsKKwlpZiAocGRwKQorCQlwZHBfZnJlZXBkcChwZHApOworCS8qIFNlbmQgUERQIENUWCBBQ1QgUkVKIHRvIE1TICovCisJcmMgPSBnc200OF90eF9nc21fYWN0X3BkcF9yZWoocGN0eC0+bW0sIHBjdHgtPnRpLCByZWplY3RfY2F1c2UsCisJCQkJCTAsIE5VTEwpOworCXNnc25fcGRwX2N0eF9mcmVlKHBjdHgpOworCisJcmV0dXJuIEVPRjsKK30KKworLyogQ29uZmlybWF0aW9uIG9mIGEgUERQIENvbnRleHQgRGVsZXRlICovCitzdGF0aWMgaW50IGRlbGV0ZV9wZHBfY29uZihzdHJ1Y3QgcGRwX3QgKnBkcCwgdm9pZCAqY2JwLCBpbnQgY2F1c2UpCit7CisJc3RydWN0IHNnc25fcGRwX2N0eCAqcGN0eCA9IGNicDsKKwlpbnQgcmM7CisKKwlERUJVR1AoREdQUlMsICJSZWNlaXZlZCBERUxFVEUgUERQIENUWCBDT05GLCBjYXVzZT0lZCglcylcbiIsCisJCWNhdXNlLCBnZXRfdmFsdWVfc3RyaW5nKGd0cF9jYXVzZV9zdHJzLCBjYXVzZSkpOworCisJLyogQ29uZmlybSBkZWFjdGl2YXRpb24gb2YgUERQIGNvbnRleHQgdG8gTVMgKi8KKwlyYyA9IGdzbTQ4X3R4X2dzbV9kZWFjdF9wZHBfYWNjKHBjdHgpOworCisJc2dzbl9wZHBfY3R4X2ZyZWUocGN0eCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIENvbmZpcm1hdGlvbiBvZiBhbiBHVFAgRUNITyByZXF1ZXN0ICovCitzdGF0aWMgaW50IGVjaG9fY29uZihpbnQgcmVjb3ZlcnkpCit7CisJaWYgKHJlY292ZXJ5IDwgMCkgeworCQlERUJVR1AoREdQUlMsICJHVFAgRWNobyBSZXF1ZXN0IHRpbWVkIG91dFxuIik7CisJCS8qIEZJWE1FOiBpZiB2ZXJzaW9uID09IDEsIHJldHJ5IHdpdGggdmVyc2lvbiAwICovCisJfSBlbHNlIHsKKwkJREVCVUdQKERHUFJTLCAiR1RQIFJ4IEVjaG8gUmVzcG9uc2VcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogbGliZ3RwIGNhbGxiYWNrIGZvciBjb25maXJtYXRpb25zICovCitzdGF0aWMgaW50IGNiX2NvbmYoaW50IHR5cGUsIGludCBjYXVzZSwgc3RydWN0IHBkcF90ICpwZHAsIHZvaWQgKmNicCkKK3sKKwlERUJVR1AoREdQUlMsICJsaWJndHAgY2JfY29uZih0eXBlPSVkLCBjYXVzZT0lZCwgcGRwPSVwLCBjYnA9JXApXG4iLAorCQl0eXBlLCBjYXVzZSwgcGRwLCBjYnApOworCisJaWYgKGNhdXNlID09IEVPRikKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgImxpYmd0cCBFT0YgKHR5cGU9JXUsIHBkcD0lcCwgY2JwPSVwKVxuIiwKKwkJCXR5cGUsIHBkcCwgY2JwKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR1RQX0VDSE9fUkVROgorCQlyZXR1cm4gZWNob19jb25mKGNhdXNlKTsKKwljYXNlIEdUUF9DUkVBVEVfUERQX1JFUToKKwkJcmV0dXJuIGNyZWF0ZV9wZHBfY29uZihwZHAsIGNicCwgY2F1c2UpOworCWNhc2UgR1RQX0RFTEVURV9QRFBfUkVROgorCQlyZXR1cm4gZGVsZXRlX3BkcF9jb25mKHBkcCwgY2JwLCBjYXVzZSk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbmV2ZXIgYSBQRFAgY29udGV4dCBpcyBkZWxldGVkIGZvciBhbnkgcmVhc29uICovCitzdGF0aWMgaW50IGNiX2RlbGV0ZV9jb250ZXh0KHN0cnVjdCBwZHBfdCAqcGRwKQoreworCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIlBEUCBDb250ZXh0IHdhcyBkZWxldGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIFZlcnNpb24gTm90IFN1cHBvcnRlZCBtZXNzYWdlICovCitzdGF0aWMgaW50IGNiX3Vuc3VwX2luZChzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBlZXIpCit7CisJTE9HUChER1BSUywgTE9HTF9JTkZPLCAiR1RQIFZlcnNpb24gbm90IHN1cHBvcnRlZCBJbmRpY2F0aW9uICIKKwkJImZyb20gJXM6JXVcbiIsIGluZXRfbnRvYShwZWVyLT5zaW5fYWRkciksCisJCW50b2hzKHBlZXItPnNpbl9wb3J0KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSBTdXBwb3J0ZWQgRXh0IEhlYWRlcnMgTm90aWZpY2F0aW9uICovCitzdGF0aWMgaW50IGNiX2V4dGhlYWRlcl9pbmQoc3RydWN0IHNvY2thZGRyX2luICpwZWVyKQoreworCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIkdUUCBTdXBwb3J0ZWQgRXh0IEhlYWRlcnMgTm9maWNpYXRpb24gIgorCQkiZnJvbSAlczoldVxuIiwgaW5ldF9udG9hKHBlZXItPnNpbl9hZGRyKSwKKwkJbnRvaHMocGVlci0+c2luX3BvcnQpKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW5ldmVyIHdlIHJlY2l2ZSBhIERBVEEgcGFja2V0ICovCitzdGF0aWMgaW50IGNiX2RhdGFfaW5kKHN0cnVjdCBwZHBfdCAqbGliLCB2b2lkICpwYWNrZXQsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGJzc2dwX3BhZ2luZ19pbmZvIHBpbmZvOworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcDsKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tOworCXN0cnVjdCBtc2diICptc2c7CisJdWludDhfdCAqdWQ7CisJaW50IHJjOworCisJREVCVUdQKERHUFJTLCAiR1RQIERBVEEgSU5EIGZyb20gR0dTTiwgbGVuZ3RoPSV1XG4iLCBsZW4pOworCisJcGRwID0gbGliLT5wcml2OworCWlmICghcGRwKSB7CisJCURFQlVHUChER1BSUywgIkdUUCBEQVRBIElORCBmcm9tIEdHU04gZm9yIHVua25vd24gUERQXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW1tID0gcGRwLT5tbTsKKworCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20obGVuKzI1NiwgMTI4LCAiR1RQLT5TTkRDUCIpOworCXVkID0gbXNnYl9wdXQobXNnLCBsZW4pOworCW1lbWNweSh1ZCwgcGFja2V0LCBsZW4pOworCisJbXNnYl90bGxpKG1zZykgPSBtbS0+dGxsaTsKKwltc2diX2J2Y2kobXNnKSA9IG1tLT5idmNpOworCW1zZ2JfbnNlaShtc2cpID0gbW0tPm5zZWk7CisKKwlzd2l0Y2ggKG1tLT5tbV9zdGF0ZSkgeworCWNhc2UgR01NX1JFR0lTVEVSRURfU1VTUEVOREVEOgorCQkvKiBpbml0aWF0ZSBQUyBQQUdJTkcgcHJvY2VkdXJlICovCisJCW1lbXNldCgmcGluZm8sIDAsIHNpemVvZihwaW5mbykpOworCQlwaW5mby5tb2RlID0gQlNTR1BfUEFHSU5HX1BTOworCQlwaW5mby5zY29wZSA9IEJTU0dQX1BBR0lOR19CVkNJOworCQlwaW5mby5idmNpID0gbW0tPmJ2Y2k7CisJCXBpbmZvLmltc2kgPSBtbS0+aW1zaTsKKwkJcGluZm8ucHRtc2kgPSBtbS0+cF90bXNpOworCQlwaW5mby5kcnhfcGFyYW1zID0gbW0tPmRyeF9wYXJtczsKKwkJcGluZm8ucW9zWzBdID0gMDsgLy8gRklYTUUKKwkJcmMgPSBncHJzX2Jzc2dwX3R4X3BhZ2luZyhtbS0+bnNlaSwgMCwgJnBpbmZvKTsKKwkJcmF0ZV9jdHJfaW5jKCZtbS0+Y3RyZy0+Y3RyW0dNTV9DVFJfUEFHSU5HX1BTXSk7CisJCS8qIEZJWE1FOiBxdWV1ZSB0aGUgcGFja2V0IHdlIHJlY2VpdmVkIGZyb20gR1RQICovCisJCWJyZWFrOworCWNhc2UgR01NX1JFR0lTVEVSRURfTk9STUFMOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiR1RQIERBVEEgSU5EIGZvciBUTExJICUwOFggaW4gc3RhdGUgIgorCQkJIiV1XG4iLCBtbS0+dGxsaSwgbW0tPm1tX3N0YXRlKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyYXRlX2N0cl9pbmMoJnBkcC0+Y3RyZy0+Y3RyW1BEUF9DVFJfUEtUU19VREFUQV9PVVRdKTsKKwlyYXRlX2N0cl9hZGQoJnBkcC0+Y3RyZy0+Y3RyW1BEUF9DVFJfQllURVNfVURBVEFfT1VUXSwgbGVuKTsKKwlyYXRlX2N0cl9pbmMoJm1tLT5jdHJnLT5jdHJbR01NX0NUUl9QS1RTX1VEQVRBX09VVF0pOworCXJhdGVfY3RyX2FkZCgmbW0tPmN0cmctPmN0cltHTU1fQ1RSX0JZVEVTX1VEQVRBX09VVF0sIGxlbik7CisKKwlyZXR1cm4gc25kY3BfdW5pdGRhdGFfcmVxKG1zZywgJm1tLT5sbG1lLT5sbGVbcGRwLT5zYXBpXSwKKwkJCQkgIHBkcC0+bnNhcGksIG1tKTsKK30KKworLyogQ2FsbGVkIGJ5IFNORENQIHdoZW4gaXQgaGFzIHJlY2VpdmVkL3JlLWFzc2VtYmxlZCBhIE4tUERVICovCitpbnQgc2dzbl9yeF9zbmRjcF91ZF9pbmQodWludDMyX3QgdGxsaSwgdWludDhfdCBuc2FwaSwgc3RydWN0IG1zZ2IgKm1zZywKKwkJCSB1aW50MzJfdCBucGR1X2xlbiwgdWludDhfdCAqbnBkdSkKK3sKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tY3R4OworCXN0cnVjdCBzZ3NuX3BkcF9jdHggKnBkcDsKKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYV9pZDsKKworCS8qIGxvb2stdXAgdGhlIE1NIGNvbnRleHQgZm9yIHRoaXMgbWVzc2FnZSAqLworCWJzc2dwX3BhcnNlX2NlbGxfaWQoJnJhX2lkLCBtc2diX2JjaWQobXNnKSk7CisJbW1jdHggPSBzZ3NuX21tX2N0eF9ieV90bGxpKHRsbGksICZyYV9pZCk7CisJaWYgKCFtbWN0eCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLAorCQkJIkNhbm5vdCBmaW5kIE1NIENUWCBmb3IgVExMSSAlMDh4XG4iLCB0bGxpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8qIGxvb2stdXAgdGhlIFBEUCBjb250ZXh0IGZvciB0aGlzIG1lc3NhZ2UgKi8KKwlwZHAgPSBzZ3NuX3BkcF9jdHhfYnlfbnNhcGkobW1jdHgsIG5zYXBpKTsKKwlpZiAoIXBkcCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGZpbmQgUERQIENUWCBmb3IgIgorCQkJIlRMTEk9JTA4eCwgTlNBUEk9JXVcbiIsIHRsbGksIG5zYXBpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghcGRwLT5saWIpIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIlBEUCBDVFggd2l0aG91dCBsaWJndHBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyYXRlX2N0cl9pbmMoJnBkcC0+Y3RyZy0+Y3RyW1BEUF9DVFJfUEtUU19VREFUQV9JTl0pOworCXJhdGVfY3RyX2FkZCgmcGRwLT5jdHJnLT5jdHJbUERQX0NUUl9CWVRFU19VREFUQV9JTl0sIG5wZHVfbGVuKTsKKwlyYXRlX2N0cl9pbmMoJm1tY3R4LT5jdHJnLT5jdHJbR01NX0NUUl9QS1RTX1VEQVRBX0lOXSk7CisJcmF0ZV9jdHJfYWRkKCZtbWN0eC0+Y3RyZy0+Y3RyW0dNTV9DVFJfQllURVNfVURBVEFfSU5dLCBucGR1X2xlbik7CisKKwlyZXR1cm4gZ3RwX2RhdGFfcmVxKHBkcC0+Z2dzbi0+Z3NuLCBwZHAtPmxpYiwgbnBkdSwgbnBkdV9sZW4pOworCisJcmV0dXJuIGd0cF9kYXRhX3JlcShwZHAtPmdnc24tPmdzbiwgcGRwLT5saWIsIG5wZHUsIG5wZHVfbGVuKTsKK30KKworLyogbGliZ3RwIHNlbGVjdCBsb29wIGludGVncmF0aW9uICovCitzdGF0aWMgaW50IHNnc25fZ3RwX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3Qgc2dzbl9pbnN0YW5jZSAqc2dpID0gZmQtPmRhdGE7CisJaW50IHJjOworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGZkLT5wcml2X25yKSB7CisJY2FzZSAwOgorCQlyYyA9IGd0cF9kZWNhcHMwKHNnaS0+Z3NuKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyYyA9IGd0cF9kZWNhcHMxYyhzZ2ktPmdzbik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcmMgPSBndHBfZGVjYXBzMXUoc2dpLT5nc24pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHNnc25fZ3RwX3Rtcl9zdGFydChzdHJ1Y3Qgc2dzbl9pbnN0YW5jZSAqc2dpKQoreworCXN0cnVjdCB0aW1ldmFsIG5leHQ7CisKKwkvKiBSZXRyaWV2ZSBuZXh0IHJldHJhbnNtaXNzaW9uIGFzIHN0cnVjdCB0aW1ldmFsICovCisJZ3RwX3JldHJhbnN0aW1lb3V0KHNnaS0+Z3NuLCAmbmV4dCk7CisKKwkvKiByZS1zY2hlZHVsZSB0aGUgdGltZXIgKi8KKwlic2Nfc2NoZWR1bGVfdGltZXIoJnNnaS0+Z3RwX3RpbWVyLCBuZXh0LnR2X3NlYywgbmV4dC50dl91c2VjLzEwMDApOworfQorCisvKiB0aW1lciBjYWxsYmFjayBmb3IgbGliZ3RwIHJldHJhbnNtaXNzaW9ucyBhbmQgcGluZyAqLworc3RhdGljIHZvaWQgc2dzbl9ndHBfdG1yX2NiKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNnc25faW5zdGFuY2UgKnNnaSA9IGRhdGE7CisKKwkvKiBEbyBhbGwgdGhlIHJldHJhbnNtaXNzaW9ucyBhcyBuZWVkZWQgKi8KKwlndHBfcmV0cmFucyhzZ2ktPmdzbik7CisKKwlzZ3NuX2d0cF90bXJfc3RhcnQoc2dpKTsKK30KKworaW50IHNnc25fZ3RwX2luaXQoc3RydWN0IHNnc25faW5zdGFuY2UgKnNnaSkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbl90ICpnc247CisKKwlyYyA9IGd0cF9uZXcoJnNnaS0+Z3NuLCBzZ2ktPmNmZy5ndHBfc3RhdGVkaXIsCisJCSAgICAgJnNnaS0+Y2ZnLmd0cF9saXN0ZW5hZGRyLnNpbl9hZGRyLCBHVFBfTU9ERV9TR1NOKTsKKwlpZiAocmMpIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgR1RQOiAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCWdzbiA9IHNnaS0+Z3NuOworCisJc2dpLT5ndHBfZmQwLmZkID0gZ3NuLT5mZDA7CisJc2dpLT5ndHBfZmQwLnByaXZfbnIgPSAwOworCXNnaS0+Z3RwX2ZkMC5kYXRhID0gc2dpOworCXNnaS0+Z3RwX2ZkMC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJc2dpLT5ndHBfZmQwLmNiID0gc2dzbl9ndHBfZmRfY2I7CisJcmMgPSBic2NfcmVnaXN0ZXJfZmQoJnNnaS0+Z3RwX2ZkMCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc2dpLT5ndHBfZmQxYy5mZCA9IGdzbi0+ZmQxYzsKKwlzZ2ktPmd0cF9mZDFjLnByaXZfbnIgPSAxOworCXNnaS0+Z3RwX2ZkMWMuZGF0YSA9IHNnaTsKKwlzZ2ktPmd0cF9mZDFjLndoZW4gPSBCU0NfRkRfUkVBRDsKKwlzZ2ktPmd0cF9mZDFjLmNiID0gc2dzbl9ndHBfZmRfY2I7CisJYnNjX3JlZ2lzdGVyX2ZkKCZzZ2ktPmd0cF9mZDFjKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlzZ2ktPmd0cF9mZDF1LmZkID0gZ3NuLT5mZDF1OworCXNnaS0+Z3RwX2ZkMXUucHJpdl9uciA9IDI7CisJc2dpLT5ndHBfZmQxdS5kYXRhID0gc2dpOworCXNnaS0+Z3RwX2ZkMXUud2hlbiA9IEJTQ19GRF9SRUFEOworCXNnaS0+Z3RwX2ZkMXUuY2IgPSBzZ3NuX2d0cF9mZF9jYjsKKwlic2NfcmVnaXN0ZXJfZmQoJnNnaS0+Z3RwX2ZkMXUpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIFN0YXJ0IEdUUCByZS10cmFuc21pc3Npb24gdGltZXIgKi8KKwlzZ2ktPmd0cF90aW1lci5jYiA9IHNnc25fZ3RwX3Rtcl9jYjsKKwlzZ2ktPmd0cF90aW1lci5kYXRhID0gc2dpOworCXNnc25fZ3RwX3Rtcl9zdGFydChzZ2kpOworCisJLyogUmVnaXN0ZXIgY2FsbGJhY2tjcyB3aXRoIGxpYmd0cCAqLworCWd0cF9zZXRfY2JfZGVsZXRlX2NvbnRleHQoZ3NuLCBjYl9kZWxldGVfY29udGV4dCk7CisJZ3RwX3NldF9jYl9jb25mKGdzbiwgY2JfY29uZik7CisJZ3RwX3NldF9jYl9kYXRhX2luZChnc24sIGNiX2RhdGFfaW5kKTsKKwlndHBfc2V0X2NiX3Vuc3VwX2luZChnc24sIGNiX3Vuc3VwX2luZCk7CisJZ3RwX3NldF9jYl9leHRoZWFkZXJfaW5kKGdzbiwgY2JfZXh0aGVhZGVyX2luZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvc2dzbl9tYWluLmMgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDE1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbWFpbi5jCkBAIC0wLDAgKzEsMjEwIEBACisvKiBHUFJTIFNHU04gSW1wbGVtZW50YXRpb24gKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorCisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvdGVsbmV0X2ludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Nnc24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbGxjLmg+CisKKyNpbmNsdWRlIDxndHAuaD4KKworI2luY2x1ZGUgIi4uLy4uL2JzY2NvbmZpZy5oIgorCisvKiB0aGlzIGlzIGhlcmUgZm9yIHRoZSB2dHkuLi4gaXQgd2lsbCBuZXZlciBiZSBjYWxsZWQgKi8KK3ZvaWQgc3Vic2NyX3B1dCgpIHsgYWJvcnQoKTsgfQorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3ZvaWQgKnRhbGxfYnNjX2N0eDsKKworc3RydWN0IGdwcnNfbnNfaW5zdCAqc2dzbl9uc2k7Citjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodCA9CisJIkNvcHlyaWdodCAoQykgMjAxMCBIYXJhbGQgV2VsdGUgYW5kIE9uLVdhdmVzXG4iCisJIkxpY2Vuc2UgR1BMdjIrOiBHTlUgR1BMIHZlcnNpb24gMiBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+XG4iCisJIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorCSJUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIjsKKworc3RhdGljIHN0cnVjdCBzZ3NuX2luc3RhbmNlIHNnc25faW5zdCA9IHsKKwkuY29uZmlnX2ZpbGUgPSAib3Ntb19zZ3NuLmNmZyIsCisJLmNmZyA9IHsKKwkJLmd0cF9zdGF0ZWRpciA9ICIuLyIsCisJfSwKK307CitzdHJ1Y3Qgc2dzbl9pbnN0YW5jZSAqc2dzbiA9ICZzZ3NuX2luc3Q7CisKKy8qIGNhbGwtYmFjayBmdW5jdGlvbiBmb3IgdGhlIE5TIHByb3RvY29sICovCitzdGF0aWMgaW50IHNnc25fbnNfY2IoZW51bSBncHJzX25zX2V2dCBldmVudCwgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJICAgICAgc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQxNl90IGJ2Y2kpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEdQUlNfTlNfRVZUX1VOSVRfREFUQToKKwkJLyogaGFuZCB0aGUgbWVzc2FnZSBpbnRvIHRoZSBCU1NHUCBpbXBsZW1lbnRhdGlvbiAqLworCQlyYyA9IGdwcnNfYnNzZ3BfcmN2bXNnKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJTR1NOOiBVbmtub3duIGV2ZW50ICV1IGZyb20gTlNcbiIsIGV2ZW50KTsKKwkJaWYgKG1zZykKKwkJCXRhbGxvY19mcmVlKG1zZyk7CisJCXJjID0gLUVJTzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgInNpZ25hbCAldSByZWNlaXZlZFxuIiwgc2lnbmFsKTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTSUdJTlQ6CisJCWRpc3BhdGNoX3NpZ25hbChTU19HTE9CQUwsIFNfR0xPQkFMX1NIVVRET1dOLCBOVUxMKTsKKwkJc2xlZXAoMSk7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgU0lHQUJSVDoKKwkJLyogaW4gY2FzZSBvZiBhYm9ydCwgd2Ugd2FudCB0byBvYnRhaW4gYSB0YWxsb2MgcmVwb3J0CisJCSAqIGFuZCB0aGVuIHJldHVybiB0byB0aGUgY2FsbGVyLCB3aG8gd2lsbCBhYm9ydCB0aGUgcHJvY2VzcyAqLworCWNhc2UgU0lHVVNSMToKKwkJdGFsbG9jX3JlcG9ydCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX2JzY19jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWNhc2UgU0lHVVNSMjoKKwkJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfdnR5X2N0eCwgc3RkZXJyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKiBOU0kgdGhhdCBCU1NHUCB1c2VzIHdoZW4gdHJhbnNtaXR0aW5nIG9uIE5TICovCitleHRlcm4gc3RydWN0IGdwcnNfbnNfaW5zdCAqYnNzZ3BfbnNpOworZXh0ZXJuIHZvaWQgKnRhbGxfbXNnYl9jdHg7CisKK2V4dGVybiBlbnVtIG5vZGVfdHlwZSBic2NfdnR5X2dvX3BhcmVudChzdHJ1Y3QgdnR5ICp2dHkpOworCitzdGF0aWMgc3RydWN0IHZ0eV9hcHBfaW5mbyB2dHlfaW5mbyA9IHsKKwkubmFtZSAJCT0gIk9zbW9jb20gU0dTTiIsCisJLnZlcnNpb24JPSBQQUNLQUdFX1ZFUlNJT04sCisJLmdvX3BhcmVudF9jYgk9IGJzY192dHlfZ29fcGFyZW50LAorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayBkdW1teV9uZXR3b3JrOworCXN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJaW50IHJjOworCisJdGFsbF9ic2NfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDAsICJvc21vX3Nnc24iKTsKKwl0YWxsX21zZ2JfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgIm1zZ2IiKTsKKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjIsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJdnR5X2luZm8uY29weXJpZ2h0ID0gb3BlbmJzY19jb3B5cmlnaHQ7CisJdnR5X2luaXQoJnZ0eV9pbmZvKTsKKwlsb2dnaW5nX3Z0eV9hZGRfY21kcygpOworICAgICAgICBzZ3NuX3Z0eV9pbml0KCk7CisKKwlyYXRlX2N0cl9pbml0KHRhbGxfYnNjX2N0eCk7CisJcmMgPSB0ZWxuZXRfaW5pdCh0YWxsX2JzY19jdHgsICZkdW1teV9uZXR3b3JrLCA0MjQ1KTsKKwlpZiAocmMgPCAwKQorCQlleGl0KDEpOworCisJc2dzbl9uc2kgPSBncHJzX25zX2luc3RhbnRpYXRlKCZzZ3NuX25zX2NiKTsKKwlpZiAoIXNnc25fbnNpKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJVbmFibGUgdG8gaW5zdGFudGlhdGUgTlNcbiIpOworCQlleGl0KDEpOworCX0KKwlic3NncF9uc2kgPSBzZ3NuX2luc3QuY2ZnLm5zaSA9IHNnc25fbnNpOworCWdwcnNfbnNfdnR5X2luaXQoYnNzZ3BfbnNpKTsKKwlncHJzX2Jzc2dwX3Z0eV9pbml0KCk7CisJZ3Byc19sbGNfdnR5X2luaXQoKTsKKwkvKiBGSVhNRTogcmVnaXN0ZXIgc2lnbmFsIGhhbmRsZXIgZm9yIFNTX05TICovCisKKwlyYyA9IHNnc25fcGFyc2VfY29uZmlnKHNnc25faW5zdC5jb25maWdfZmlsZSwgJnNnc25faW5zdC5jZmcpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9GQVRBTCwgIkNhbm5vdCBwYXJzZSBjb25maWcgZmlsZVxuIik7CisJCWV4aXQoMik7CisJfQorCisJcmMgPSBzZ3NuX2d0cF9pbml0KCZzZ3NuX2luc3QpOworCWlmIChyYykgeworCQlMT0dQKERHUFJTLCBMT0dMX0ZBVEFMLCAiQ2Fubm90IGJpbmQvbGlzdGVuIG9uIEdUUCBzb2NrZXRcbiIpOworCQlleGl0KDIpOworCX0KKworCXJjID0gZ3Byc19uc19uc2lwX2xpc3RlbihzZ3NuX25zaSk7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERHUFJTLCBMT0dMX0ZBVEFMLCAiQ2Fubm90IGJpbmQvbGlzdGVuIG9uIE5TSVAgc29ja2V0XG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlyYyA9IGdwcnNfbnNfZnJncmVfbGlzdGVuKHNnc25fbnNpKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRkFUQUwsICJDYW5ub3QgYmluZC9saXN0ZW4gR1JFICIKKwkJCSJzb2NrZXQuIERvIHlvdSBoYXZlIENBUF9ORVRfUkFXP1xuIik7CisJCWV4aXQoMik7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJcmMgPSBic2Nfc2VsZWN0X21haW4oMCk7CisJCWlmIChyYyA8IDApCisJCQlleGl0KDMpOworCX0KKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fdnR5LmMgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczZmEyMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvc2dzbl92dHkuYwpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2dzbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19zZ3NuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKworI2luY2x1ZGUgPHBkcC5oPgorCitzdGF0aWMgc3RydWN0IHNnc25fY29uZmlnICpnX2NmZyA9IE5VTEw7CisKK3N0YXRpYyBzdHJ1Y3QgY21kX25vZGUgc2dzbl9ub2RlID0geworCVNHU05fTk9ERSwKKwkiJXMoc2dzbikjIiwKKwkxLAorfTsKKworc3RhdGljIGludCBjb25maWdfd3JpdGVfc2dzbihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3RydWN0IHNnc25fZ2dzbl9jdHggKmdjdHg7CisKKwl2dHlfb3V0KHZ0eSwgInNnc24lcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiIGd0cCBsb2NhbC1pcCAlcyVzIiwKKwkJaW5ldF9udG9hKGdfY2ZnLT5ndHBfbGlzdGVuYWRkci5zaW5fYWRkciksIFZUWV9ORVdMSU5FKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGdjdHgsICZzZ3NuX2dnc25fY3R4dHMsIGxpc3QpIHsKKwkJdnR5X291dCh2dHksICIgZ2dzbiAldSByZW1vdGUtaXAgJXMlcyIsIGdjdHgtPmlkLAorCQkJaW5ldF9udG9hKGdjdHgtPnJlbW90ZV9hZGRyKSwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiBnZ3NuICV1IGd0cC12ZXJzaW9uICV1JXMiLCBnY3R4LT5pZCwKKwkJCWdjdHgtPmd0cF92ZXJzaW9uLCBWVFlfTkVXTElORSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIFNHU05fU1RSCSJDb25maWd1cmUgdGhlIFNHU04iCisKK0RFRlVOKGNmZ19zZ3NuLCBjZmdfc2dzbl9jbWQsCisJInNnc24iLAorCVNHU05fU1RSKQoreworCXZ0eS0+bm9kZSA9IFNHU05fTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zZ3NuX2JpbmRfYWRkciwgY2ZnX3Nnc25fYmluZF9hZGRyX2NtZCwKKwkiZ3RwIGxvY2FsLWlwIEEuQi5DLkQiLAorCSJHVFAgUGFyYW1ldGVyc1xuIgorCSJTZXQgdGhlIElQIGFkZHJlc3MgZm9yIHRoZSBsb2NhbCBHVFAgYmluZFxuIikKK3sKKwlpbmV0X2F0b24oYXJndlswXSwgJmdfY2ZnLT5ndHBfbGlzdGVuYWRkci5zaW5fYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19nZ3NuX3JlbW90ZV9pcCwgY2ZnX2dnc25fcmVtb3RlX2lwX2NtZCwKKwkiZ2dzbiA8MC0yNTU+IHJlbW90ZS1pcCBBLkIuQy5EIiwKKwkiIikKK3sKKwl1aW50MzJfdCBpZCA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IHNnc25fZ2dzbl9jdHggKmdnYyA9IHNnc25fZ2dzbl9jdHhfZmluZF9hbGxvYyhpZCk7CisKKwlpbmV0X2F0b24oYXJndlsxXSwgJmdnYy0+cmVtb3RlX2FkZHIpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjaWYgMAorREVGVU4oY2ZnX2dnc25fcmVtb3RlX3BvcnQsIGNmZ19nZ3NuX3JlbW90ZV9wb3J0X2NtZCwKKwkiZ2dzbiA8MC0yNTU+IHJlbW90ZS1wb3J0IDwwLTY1NTM1PiIsCisJIiIpCit7CisJdWludDMyX3QgaWQgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBzZ3NuX2dnc25fY3R4ICpnZ2MgPSBzZ3NuX2dnc25fY3R4X2ZpbmRfYWxsb2MoaWQpOworCXVpbnQxNl90IHBvcnQgPSBhdG9pKGFyZ3ZbMV0pOworCit9CisjZW5kaWYKKworREVGVU4oY2ZnX2dnc25fZ3RwX3ZlcnNpb24sIGNmZ19nZ3NuX2d0cF92ZXJzaW9uX2NtZCwKKwkiZ2dzbiA8MC0yNTU+IGd0cC12ZXJzaW9uICgwfDEpIiwKKwkiIikKK3sKKwl1aW50MzJfdCBpZCA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IHNnc25fZ2dzbl9jdHggKmdnYyA9IHNnc25fZ2dzbl9jdHhfZmluZF9hbGxvYyhpZCk7CisKKwlpZiAoYXRvaShhcmd2WzFdKSkKKwkJZ2djLT5ndHBfdmVyc2lvbiA9IDE7CisJZWxzZQorCQlnZ2MtPmd0cF92ZXJzaW9uID0gMDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2lmIDAKK0RFRlVOKGNmZ19hcG5fZ2dzbiwgY2ZnX2Fwbl9nZ3NuX2NtZCwKKwkiYXBuIEFQTkFNRSBnZ3NuIDwwLTI1NT4iLAorCSIiKQoreworCXN0cnVjdCBhcG5fY3R4ICoqCit9CisjZW5kaWYKKworY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBncHJzX21tX3N0X3N0cnNbXSA9IHsKKwl7IEdNTV9ERVJFR0lTVEVSRUQsICJERVJFR0lTVEVSRUQiIH0sCisJeyBHTU1fQ09NTU9OX1BST0NfSU5JVCwgIkNPTU1PTiBQUk9DRURVUkUgKElOSVQpIiB9LAorCXsgR01NX1JFR0lTVEVSRURfTk9STUFMLCAiUkVHSVNURVJFRCAoTk9STUFMKSIgfSwKKwl7IEdNTV9SRUdJU1RFUkVEX1NVU1BFTkRFRCwgIlJFR0lTVEVSRUQgKFNVU1BFTkRFRCkiIH0sCisJeyBHTU1fREVSRUdJU1RFUkVEX0lOSVQsICJERVJFR0lTVEVSRUQgKElOSVQpIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgdm9pZCB2dHlfZHVtcF9wZHAoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpwZngsCisJCQkgc3RydWN0IHNnc25fcGRwX2N0eCAqcGRwKQoreworCXZ0eV9vdXQodnR5LCAiJXNQRFAgQ29udGV4dCBJTVNJOiAlcywgU0FQSTogJXUsIE5TQVBJOiAldSVzIiwKKwkJcGZ4LCBwZHAtPm1tLT5pbXNpLCBwZHAtPnNhcGksIHBkcC0+bnNhcGksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiVzICBBUE46ICVzXG4iLCBwZngsIHBkcC0+bGliLT5hcG5fdXNlLnYpOworCXZ0eV9vdXRfcmF0ZV9jdHJfZ3JvdXAodnR5LCAiICIsIHBkcC0+Y3RyZyk7Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9kdW1wX21tY3R4KHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqcGZ4LAorCQkJICAgc3RydWN0IHNnc25fbW1fY3R4ICptbSwgaW50IHBkcCkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzTU0gQ29udGV4dCBmb3IgSU1TSSAlcywgSU1FSSAlcywgUC1UTVNJICUwOHglcyIsCisJCXBmeCwgbW0tPmltc2ksIG1tLT5pbWVpLCBtbS0+cF90bXNpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyAgTVNJU0ROOiAlcywgVExMSTogJTA4eCVzIiwgcGZ4LCBtbS0+bXNpc2RuLAorCQltbS0+dGxsaSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMgIE1NIFN0YXRlOiAlcywgUm91dGVpbmcgQXJlYTogJXUtJXUtJXUtJXUsICIKKwkJIkNlbGwgSUQ6ICV1JXMiLCBwZngsCisJCWdldF92YWx1ZV9zdHJpbmcoZ3Byc19tbV9zdF9zdHJzLCBtbS0+bW1fc3RhdGUpLAorCQltbS0+cmEubWNjLCBtbS0+cmEubW5jLCBtbS0+cmEubGFjLCBtbS0+cmEucmFjLAorCQltbS0+Y2VsbF9pZCwgVlRZX05FV0xJTkUpOworCisJdnR5X291dF9yYXRlX2N0cl9ncm91cCh2dHksICIgIiwgbW0tPmN0cmcpOworCisJaWYgKHBkcCkgeworCQlzdHJ1Y3Qgc2dzbl9wZHBfY3R4ICpwZHA7CisKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkocGRwLCAmbW0tPnBkcF9saXN0LCBsaXN0KQorCQkJdnR5X2R1bXBfcGRwKHZ0eSwgIiAgIiwgcGRwKTsKKwl9Cit9CisKK0RFRlVOKHNob3dfc2dzbiwgc2hvd19zZ3NuX2NtZCwgInNob3cgc2dzbiIsCisgICAgICBTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU0dTTiIpCit7CisJLyogRklYTUU6IHN0YXRpc3RpY3MgKi8KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgTU1DVFhfU1RSICJNTSBDb250ZXh0XG4iCisjZGVmaW5lIElOQ0xVREVfUERQX1NUUiAiSW5jbHVkZSBQRFAgQ29udGV4dCBJbmZvcm1hdGlvblxuIgorCisjaWYgMAorREVGVU4oc2hvd19tbWN0eF90bGxpLCBzaG93X21tY3R4X3RsbGlfY21kLAorCSJzaG93IG1tLWNvbnRleHQgdGxsaSBIRVggW3BkcF0iLAorCVNIT1dfU1RSIE1NQ1RYX1NUUiAiSWRlbnRpZnkgYnkgVExMSVxuIiAiVExMSVxuIiBJTkNMVURFX1BEUF9TVFIpCit7CisJdWludDMyX3QgdGxsaTsKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tOworCisJdGxsaSA9IHN0cnRvdWwoYXJndlswXSwgTlVMTCwgMTYpOworCW1tID0gc2dzbl9tbV9jdHhfYnlfdGxsaSh0bGxpKTsKKwlpZiAoIW1tKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gTU0gY29udGV4dCBmb3IgVExMSSAlMDh4JXMiLAorCQkJdGxsaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXZ0eV9kdW1wX21tY3R4KHZ0eSwgIiIsIG1tLCBhcmd2WzFdID8gMSA6IDApOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitERUZVTihzd293X21tY3R4X2ltc2ksIHNob3dfbW1jdHhfaW1zaV9jbWQsCisJInNob3cgbW0tY29udGV4dCBpbXNpIElNU0kgW3BkcF0iLAorCVNIT1dfU1RSIE1NQ1RYX1NUUiAiSWRlbnRpZnkgYnkgSU1TSVxuIiAiSU1TSSBvZiB0aGUgTU0gQ29udGV4dFxuIgorCUlOQ0xVREVfUERQX1NUUikKK3sKKwlzdHJ1Y3Qgc2dzbl9tbV9jdHggKm1tOworCisJbW0gPSBzZ3NuX21tX2N0eF9ieV9pbXNpKGFyZ3ZbMF0pOworCWlmICghbW0pIHsKKwkJdnR5X291dCh2dHksICJObyBNTSBjb250ZXh0IGZvciBJTVNJICVzJXMiLAorCQkJYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXZ0eV9kdW1wX21tY3R4KHZ0eSwgIiIsIG1tLCBhcmd2WzFdID8gMSA6IDApOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc3dvd19tbWN0eF9hbGwsIHNob3dfbW1jdHhfYWxsX2NtZCwKKwkic2hvdyBtbS1jb250ZXh0IGFsbCBbcGRwXSIsCisJU0hPV19TVFIgTU1DVFhfU1RSICJBbGwgTU0gQ29udGV4dHNcbiIgSU5DTFVERV9QRFBfU1RSKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqbW07CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShtbSwgJnNnc25fbW1fY3R4dHMsIGxpc3QpCisJCXZ0eV9kdW1wX21tY3R4KHZ0eSwgIiIsIG1tLCBhcmd2WzBdID8gMSA6IDApOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X2dnc24sIHNob3dfZ2dzbl9jbWQsCisJInNob3cgZ2dzbiIsCisJIiIpCit7CisKK30KKworREVGVU4oc2hvd19wZHBjdHhfYWxsLCBzaG93X3BkcGN0eF9hbGxfY21kLAorCSJzaG93IHBkcC1jb250ZXh0IGFsbCIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gb24gUERQIENvbnRleHRcbiIpCit7CisJc3RydWN0IHNnc25fcGRwX2N0eCAqcGRwOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkocGRwLCAmc2dzbl9wZHBfY3R4dHMsIGdfbGlzdCkKKwkJdnR5X2R1bXBfcGRwKHZ0eSwgIiIsIHBkcCk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBzZ3NuX3Z0eV9pbml0KHZvaWQpCit7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X3Nnc25fY21kKTsKKwkvL2luc3RhbGxfZWxlbWVudF92ZSgmc2hvd19tbWN0eF90bGxpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X21tY3R4X2ltc2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbW1jdHhfYWxsX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X3BkcGN0eF9hbGxfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19zZ3NuX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZzZ3NuX25vZGUsIGNvbmZpZ193cml0ZV9zZ3NuKTsKKwlpbnN0YWxsX2RlZmF1bHQoU0dTTl9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoU0dTTl9OT0RFLCAmb3Vybm9kZV9leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNHU05fTk9ERSwgJm91cm5vZGVfZW5kX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNHU05fTk9ERSwgJmNmZ19zZ3NuX2JpbmRfYWRkcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChTR1NOX05PREUsICZjZmdfZ2dzbl9yZW1vdGVfaXBfY21kKTsKKwkvL2luc3RhbGxfZWxlbWVudChTR1NOX05PREUsICZjZmdfZ2dzbl9yZW1vdGVfcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChTR1NOX05PREUsICZjZmdfZ2dzbl9ndHBfdmVyc2lvbl9jbWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzZ3NuX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfZmlsZSwgc3RydWN0IHNnc25fY29uZmlnICpjZmcpCit7CisJaW50IHJjOworCisJZ19jZmcgPSBjZmc7CisJcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSwgTlVMTCk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0aGUgY29uZmlnIGZpbGU6ICclcydcbiIsIGNvbmZpZ19maWxlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4LmMgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDguYwppbmRleCAyZWRhMGJkLi5lM2VhZmU2IDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9nc21fMDRfMDguYworKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDguYwpAQCAtMSw0ICsxLDQgQEAKLS8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQogICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLwogCiAvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KIAorI2luY2x1ZGUgPG9wZW5ic2MvYXV0aC5oPgogI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KICNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CiAjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CkBAIC01MiwxMyArNTMsMTUgQEAKICNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy91c3NkLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9zaWxlbnRfY2FsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX2FwaS5oPgogCiB2b2lkICp0YWxsX2xvY29wX2N0eDsKK3ZvaWQgKnRhbGxfYXV0aGNpcGhvcF9jdHg7CiAKLWludCBnc20wNDA4X2xvY191cGRfYWNjKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgdG1zaSk7CitpbnQgZ3NtMDQwOF9sb2NfdXBkX2FjYyhzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgdV9pbnQzMl90IHRtc2kpOwogc3RhdGljIGludCBnc200OF90eF9zaW1wbGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCiAJCQkgICB1X2ludDhfdCBwZGlzYywgdV9pbnQ4X3QgbXNnX3R5cGUpOwotc3RhdGljIHZvaWQgc2NoZWR1bGVfcmVqZWN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3JlamVjdChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubik7CiAKIHN0cnVjdCBnc21fbGFpIHsKIAl1X2ludDE2X3QgbWNjOwpAQCAtNjgsNiArNzEsMTIyIEBACiAKIHN0YXRpYyB1X2ludDMyX3QgbmV3X2NhbGxyZWYgPSAweDgwMDAwMDAxOwogCitzdGF0aWMgaW50IGdzbTQ4X2Nvbm5fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwKKwkJCSAgICAgIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnLT5kYXRhOworCisJLyogaWYgd2UgZ2V0IHBhc3NlZCBhIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSwgZG8gc29tZSBjb21tb24KKwkgKiB3b3JrIHRoYXQgdGhlIGNhbGxlciBubyBsb25nZXIgaGFzIHRvIGRvICovCisJaWYgKHRyYW5zKSB7CisJCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQgPDwgNCk7CisJCW1zZy0+bGNoYW4gPSB0cmFucy0+Y29ubi0+bGNoYW47CisJfQorCisKKwlpZiAobXNnLT5sY2hhbikgeworCQltc2ctPnRyeCA9IG1zZy0+bGNoYW4tPnRzLT50cng7CisJCWlmICgoZ2gtPnByb3RvX2Rpc2NyICYgR1NNNDhfUERJU0NfTUFTSykgPT0gR1NNNDhfUERJU0NfQ0MpCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJTAyeCkgIgorCQkJCSJTZW5kaW5nICclcycgdG8gTVMuXG4iLCBtc2ctPnRyeC0+YnRzLT5uciwKKwkJCQltc2ctPnRyeC0+bnIsIG1zZy0+bGNoYW4tPnRzLT5uciwKKwkJCQlnaC0+cHJvdG9fZGlzY3IgJiAweGYwLAorCQkJCWdzbTQ4X2NjX21zZ19uYW1lKGdoLT5tc2dfdHlwZSkpOworCQllbHNlCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgcGQgJTAyeCkgIgorCQkJCSJTZW5kaW5nIDB4JTAyeCB0byBNUy5cbiIsIG1zZy0+dHJ4LT5idHMtPm5yLAorCQkJCW1zZy0+dHJ4LT5uciwgbXNnLT5sY2hhbi0+dHMtPm5yLAorCQkJCWdoLT5wcm90b19kaXNjciwgZ2gtPm1zZ190eXBlKTsKKwl9CisKKwltc2ctPmwzaCA9IG1zZy0+ZGF0YTsKKwlyZXR1cm4gZ3NtMDgwOF9zdWJtaXRfZHRhcChjb25uLCBtc2csIDApOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3NlY3VyaXR5X29wZXJhdGlvbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubikKK3sKKwlpZiAoIWNvbm4tPnNlY19vcGVyYXRpb24pCisJCXJldHVybjsKKworCXRhbGxvY19mcmVlKGNvbm4tPnNlY19vcGVyYXRpb24pOworCWNvbm4tPnNlY19vcGVyYXRpb24gPSBOVUxMOworCXB1dF9zdWJzY3JfY29uKGNvbm4pOworfQorCitzdGF0aWMgdm9pZCBhbGxvY2F0ZV9zZWN1cml0eV9vcGVyYXRpb24oc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJdXNlX3N1YnNjcl9jb24oY29ubikKKworCWNvbm4tPnNlY19vcGVyYXRpb24gPSB0YWxsb2NfemVybyh0YWxsX2F1dGhjaXBob3BfY3R4LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3NlY3VyaXR5X29wZXJhdGlvbik7Cit9CisKK2ludCBnc200OF9zZWN1cmVfY2hhbm5lbChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50IGtleV9zZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3NtX2NiZm4gKmNiLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGxjaGFuLT5jb25uLnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX3NlY3VyaXR5X29wZXJhdGlvbiAqb3A7CisJc3RydWN0IGdzbV9hdXRoX3R1cGxlIGF0dXBsZTsKKwlpbnQgc3RhdHVzID0gLTEsIHJjOworCisJLyogQ2hlY2sgaWYgd2UgX2Nhbl8gZW5hYmxlIGVuY3J5cHRpb24uIENhc2VzIHdoZXJlIHdlIGNhbid0OgorCSAqICAtIEVuY3J5cHRpb24gZGlzYWJsZWQgaW4gY29uZmlnCisJICogIC0gQ2hhbm5lbCBhbHJlYWR5IHNlY3VyZWQgKG5vdGhpbmcgdG8gZG8pCisJICogIC0gU3Vic2NyaWJlciBlcXVpcG1lbnQgZG9lc24ndCBzdXBwb3J0IGNvbmZpZ3VyZWQgZW5jcnlwdGlvbgorCSAqLworCWlmICghbmV0LT5hNV9lbmNyeXB0aW9uKSB7CisJCXN0YXR1cyA9IEdTTV9TRUNVUklUWV9OT0FWQUlMOworCX0gZWxzZSBpZiAobGNoYW4tPmVuY3IuYWxnX2lkID4gUlNMX0VOQ19BTEdfQTUoMCkpIHsKKwkJREVCVUdQKERNTSwgIlJlcXVlc3RpbmcgdG8gc2VjdXJlIGFuIGFscmVhZHkgc2VjdXJlIGNoYW5uZWwiKTsKKwkJc3RhdHVzID0gR1NNX1NFQ1VSSVRZX1NVQ0NFRURFRDsKKwl9IGVsc2UgaWYgKCFtc19jbTJfYTVuX3N1cHBvcnQoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LT5hNV9lbmNyeXB0aW9uKSkgeworCQlERUJVR1AoRE1NLCAiU3Vic2NyaWJlciBlcXVpcG1lbnQgZG9lc24ndCBzdXBwb3J0IHJlcXVlc3RlZCBlbmNyeXB0aW9uIik7CisJCXN0YXR1cyA9IEdTTV9TRUNVUklUWV9OT0FWQUlMOworCX0KKworCS8qIElmIG5vdCBkb25lIHlldCwgdHJ5IHRvIGdldCBpbmZvIGZvciB0aGlzIHVzZXIgKi8KKwlpZiAoc3RhdHVzIDwgMCkgeworCQlyYyA9IGF1dGhfZ2V0X3R1cGxlX2Zvcl9zdWJzY3IoJmF0dXBsZSwgc3Vic2NyLCBrZXlfc2VxKTsKKwkJaWYgKHJjIDw9IDApCisJCQlzdGF0dXMgPSBHU01fU0VDVVJJVFlfTk9BVkFJTDsKKwl9CisKKwkvKiBBcmUgd2UgZG9uZSB5ZXQgPyAqLworCWlmIChzdGF0dXMgPj0gMCkKKwkJcmV0dXJuIGNiID8KKwkJCWNiKEdTTV9IT09LX1JSX1NFQ1VSSVRZLCBzdGF0dXMsIE5VTEwsIGxjaGFuLCBjYl9kYXRhKSA6CisJCQkwOworCisJLyogU3RhcnQgYW4gb3BlcmF0aW9uIChjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgcGVuZGluZyAhISEpICovCisJaWYgKGxjaGFuLT5jb25uLnNlY19vcGVyYXRpb24pCisJCXJldHVybiAtRUJVU1k7CisKKwlhbGxvY2F0ZV9zZWN1cml0eV9vcGVyYXRpb24oJmxjaGFuLT5jb25uKTsKKwlvcCA9IGxjaGFuLT5jb25uLnNlY19vcGVyYXRpb247CisJb3AtPmNiID0gY2I7CisJb3AtPmNiX2RhdGEgPSBjYl9kYXRhOworCW1lbWNweSgmb3AtPmF0dXBsZSwgJmF0dXBsZSwgc2l6ZW9mKHN0cnVjdCBnc21fYXV0aF90dXBsZSkpOworCisJCS8qIEZJWE1FOiBTaG91bGQgc3RhcnQgYSB0aW1lciBmb3IgY29tcGxldGlvbiAuLi4gKi8KKworCS8qIFRoZW4gZG8gd2hhdGV2ZXIgaXMgbmVlZGVkIC4uLiAqLworCWlmIChyYyA9PSAxKSB7CisJCS8qIFN0YXJ0IGF1dGhlbnRpY2F0aW9uICovCisJCXJldHVybiBnc200OF90eF9tbV9hdXRoX3JlcShsY2hhbiwgb3AtPmF0dXBsZS5yYW5kLCBvcC0+YXR1cGxlLmtleV9zZXEpOworCX0gZWxzZSBpZiAocmMgPT0gMikgeworCQkvKiBTdGFydCBjaXBoZXJpbmcgZGlyZWN0bHkgKi8KKwkJbGNoYW4tPmVuY3IuYWxnX2lkID0gUlNMX0VOQ19BTEdfQTUobmV0LT5hNV9lbmNyeXB0aW9uKTsKKwkJbGNoYW4tPmVuY3Iua2V5X2xlbiA9IDg7CisJCW1lbWNweShsY2hhbi0+ZW5jci5rZXksIG9wLT5hdHVwbGUua2MsIDgpOworCisJCXJldHVybiBnc200OF9zZW5kX3JyX2NpcGhfbW9kZShsY2hhbiwgMCk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7IC8qIG5vdCByZWFjaGVkICovCit9CisKIHN0YXRpYyBpbnQgYXV0aG9yaXplX3N1YnNjcmliZXIoc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uICpsb2MsCiAJCQkJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQogewpAQCAtOTYsOTAgKzIxNSwxMDQgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3N0YXRpYyB2b2lkIHJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubikKIHsKLQlpZiAoIWxjaGFuLT5sb2Nfb3BlcmF0aW9uKQorCWlmICghY29ubi0+bG9jX29wZXJhdGlvbikKIAkJcmV0dXJuOwogCi0JYnNjX2RlbF90aW1lcigmbGNoYW4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyKTsKLQl0YWxsb2NfZnJlZShsY2hhbi0+bG9jX29wZXJhdGlvbik7Ci0JbGNoYW4tPmxvY19vcGVyYXRpb24gPSAwOwotCXB1dF9sY2hhbihsY2hhbik7CisJYnNjX2RlbF90aW1lcigmY29ubi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIpOworCXRhbGxvY19mcmVlKGNvbm4tPmxvY19vcGVyYXRpb24pOworCWNvbm4tPmxvY19vcGVyYXRpb24gPSAwOworCXB1dF9zdWJzY3JfY29uKGNvbm4pOwogfQogCi1zdGF0aWMgdm9pZCBhbGxvY2F0ZV9sb2NfdXBkYXRpbmdfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQorc3RhdGljIHZvaWQgYWxsb2NhdGVfbG9jX3VwZGF0aW5nX3JlcShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubikKIHsKLQl1c2VfbGNoYW4obGNoYW4pOwotCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShsY2hhbik7CisJdXNlX3N1YnNjcl9jb24oY29ubikKKwlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEoY29ubik7CiAKLQlsY2hhbi0+bG9jX29wZXJhdGlvbiA9IHRhbGxvY196ZXJvKHRhbGxfbG9jb3BfY3R4LAorCWNvbm4tPmxvY19vcGVyYXRpb24gPSB0YWxsb2NfemVybyh0YWxsX2xvY29wX2N0eCwKIAkJCQkJICAgc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uKTsKIH0KIAotc3RhdGljIGludCBnc20wNDA4X2F1dGhvcml6ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IG1zZ2IgKm1zZykKK3N0YXRpYyBpbnQgX2dzbTA0MDhfYXV0aG9yaXplX3NlY19jYih1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtc2diICptc2csIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQogewotCWlmIChhdXRob3JpemVfc3Vic2NyaWJlcihsY2hhbi0+bG9jX29wZXJhdGlvbiwgbGNoYW4tPnN1YnNjcikpIHsKLQkJaW50IHJjOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gZGF0YTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiA9ICZsY2hhbi0+Y29ubjsKKwlpbnQgcmMgPSAwOwogCi0JCWRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShsY2hhbi0+c3Vic2NyKTsKLQkJcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKGxjaGFuKTsKLQkJcmMgPSBnc20wNDA4X2xvY191cGRfYWNjKG1zZy0+bGNoYW4sIGxjaGFuLT5zdWJzY3ItPnRtc2kpOwotCQlpZiAobGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c2VuZF9tbV9pbmZvKSB7Ci0JCQkvKiBzZW5kIE1NIElORk8gd2l0aCBuZXR3b3JrIG5hbWUgKi8KLQkJCXJjID0gZ3NtNDhfdHhfbW1faW5mbyhtc2ctPmxjaGFuKTsKLQkJfQorCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBHU01fU0VDVVJJVFlfQVVUSF9GQUlMRUQ6CisJCQlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEoY29ubik7CisJCQlicmVhazsKIAotCQkvKiBjYWxsIHN1YnNjcl91cGRhdGUgYWZ0ZXIgcHV0dGluZyB0aGUgbG9jX3VwZF9hY2MKLQkJICogaW4gdGhlIHRyYW5zbWl0IHF1ZXVlLCBzaW5jZSBTX1NVQlNDUl9BVFRBQ0hFRCBtaWdodAotCQkgKiB0cmlnZ2VyIGZ1cnRoZXIgYWN0aW9uIGxpa2UgU01TIGRlbGl2ZXJ5ICovCi0JCXN1YnNjcl91cGRhdGUobGNoYW4tPnN1YnNjciwgbXNnLT50cngtPmJ0cywKLQkJCSAgICAgIEdTTV9TVUJTQ1JJQkVSX1VQREFURV9BVFRBQ0hFRCk7Ci0JCS8qIHRyeSB0byBjbG9zZSBjaGFubmVsIEFTQVAgKi8KLQkJbGNoYW5fYXV0b19yZWxlYXNlKGxjaGFuKTsKLQkJcmV0dXJuIHJjOwotCX0KKwkJY2FzZSBHU01fU0VDVVJJVFlfTk9BVkFJTDoKKwkJY2FzZSBHU01fU0VDVVJJVFlfU1VDQ0VFREVEOgorCQkJLyogV2UncmUgYWxsIGdvb2QgKi8KKwkJCWRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShjb25uLT5zdWJzY3IpOworCQkJcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKGNvbm4pOworCQkJcmMgPSBnc20wNDA4X2xvY191cGRfYWNjKGNvbm4sIGNvbm4tPnN1YnNjci0+dG1zaSk7CisJCQlpZiAobGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c2VuZF9tbV9pbmZvKSB7CisJCQkJLyogc2VuZCBNTSBJTkZPIHdpdGggbmV0d29yayBuYW1lICovCisJCQkJcmMgPSBnc200OF90eF9tbV9pbmZvKGNvbm4pOworCQkJfQogCisJCQkvKiBjYWxsIHN1YnNjcl91cGRhdGUgYWZ0ZXIgcHV0dGluZyB0aGUgbG9jX3VwZF9hY2MKKwkJCSAqIGluIHRoZSB0cmFuc21pdCBxdWV1ZSwgc2luY2UgU19TVUJTQ1JfQVRUQUNIRUQgbWlnaHQKKwkJCSAqIHRyaWdnZXIgZnVydGhlciBhY3Rpb24gbGlrZSBTTVMgZGVsaXZlcnkgKi8KKwkJCXN1YnNjcl91cGRhdGUoY29ubi0+c3Vic2NyLCBsY2hhbi0+dHMtPnRyeC0+YnRzLAorCQkJCSAgICAgIEdTTV9TVUJTQ1JJQkVSX1VQREFURV9BVFRBQ0hFRCk7CisKKwkJCS8qIHRyeSB0byBjbG9zZSBjaGFubmVsIEFTQVAgKi8KKwkJCWxjaGFuX2F1dG9fcmVsZWFzZShsY2hhbik7CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyYyA9IC1FSU5WQUw7CisJfTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc20wNDA4X2F1dGhvcml6ZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAoYXV0aG9yaXplX3N1YnNjcmliZXIoY29ubi0+bG9jX29wZXJhdGlvbiwgY29ubi0+c3Vic2NyKSkKKwkJcmV0dXJuIGdzbTQ4X3NlY3VyZV9jaGFubmVsKGNvbm4tPmxjaGFuLAorCQkJY29ubi0+bG9jX29wZXJhdGlvbi0+a2V5X3NlcSwKKwkJCV9nc20wNDA4X2F1dGhvcml6ZV9zZWNfY2IsIE5VTEwpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdzbTA0MDhfaGFuZGxlX2xjaGFuX3NpZ25hbCh1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAotCQkJCQl2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQordm9pZCBnc20wNDA4X2NsZWFyX3JlcXVlc3Qoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24qIGNvbm4sIHVpbnQzMl90IGNhdXNlKQogewogCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCAqdGVtcDsKLQotCWlmIChzdWJzeXMgIT0gU1NfTENIQU4gfHwgc2lnbmFsICE9IFNfTENIQU5fVU5FWFBFQ1RFRF9SRUxFQVNFKQotCQlyZXR1cm4gMDsKLQogCS8qCiAJICogQ2FuY2VsIGFueSBvdXRzdGFuZGluZyBsb2NhdGlvbiB1cGRhdGluZyByZXF1ZXN0Ci0JICogb3BlcmF0aW9uIHRha2luZyBwbGFjZSBvbiB0aGUgbGNoYW4uCisJICogb3BlcmF0aW9uIHRha2luZyBwbGFjZSBvbiB0aGUgc3Vic2NyaWJlciBjb25uZWN0aW9uLgogCSAqLwotCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gKHN0cnVjdCBnc21fbGNoYW4gKilzaWduYWxfZGF0YTsKLQlpZiAoIWxjaGFuKQotCQlyZXR1cm4gMDsKLQotCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShsY2hhbik7CisJcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKGNvbm4pOworCXJlbGVhc2Vfc2VjdXJpdHlfb3BlcmF0aW9uKGNvbm4pOwogCiAJLyogRnJlZSBhbGwgdHJhbnNhY3Rpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZWFzZWQgbGNoYW4gKi8KIAkvKiBGSVhNRTogdGhpcyBpcyBub3QgbmVjY2Vzc2FyaWx5IHRoZSByaWdodCB0aGluZyB0byBkbywgd2Ugc2hvdWxkCiAJICogb25seSBzZXQgdHJhbnMtPmxjaGFuIHRvIE5VTEwgYW5kIHdhaXQgZm9yIGFub3RoZXIgbGNoYW4gdG8gYmUKIAkgKiBlc3RhYmxpc2hlZCB0byB0aGUgc2FtZSBNTSBlbnRpdHkgKHBob25lL3N1YnNjcmliZXIpICovCi0JbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFucywgdGVtcCwgJmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnRyYW5zX2xpc3QsIGVudHJ5KSB7Ci0JCWlmICh0cmFucy0+bGNoYW4gPT0gbGNoYW4pCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFucywgdGVtcCwgJmNvbm4tPmJ0cy0+bmV0d29yay0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHRyYW5zLT5jb25uID09IGNvbm4pCiAJCQl0cmFuc19mcmVlKHRyYW5zKTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyogQ2hhcHRlciA5LjIuMTQgOiBTZW5kIExPQ0FUSU9OIFVQREFUSU5HIFJFSkVDVCAqLwotaW50IGdzbTA0MDhfbG9jX3VwZF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGNhdXNlKQoraW50IGdzbTA0MDhfbG9jX3VwZF9yZWooc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHVfaW50OF90IGNhdXNlKQogewotCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBjb25uLT5idHM7CiAJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKIAlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKIAkKLQltc2ctPmxjaGFuID0gbGNoYW47CisJbXNnLT5sY2hhbiA9IGNvbm4tPmxjaGFuOwogCiAJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CiAJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CkBAIC0xODcsMjUgKzMyMCwyNSBAQAogCWdoLT5kYXRhWzBdID0gY2F1c2U7CiAKIAlMT0dQKERNTSwgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlczogTE9DQVRJT04gVVBEQVRJTkcgUkVKRUNUICIKLQkgICAgICJMQUM9JXUgQlRTPSV1XG4iLCBsY2hhbi0+c3Vic2NyID8KLQkgICAgIAkJCXN1YnNjcl9uYW1lKGxjaGFuLT5zdWJzY3IpIDogInVua25vd24iLAotCSAgICAgbGNoYW4tPnRzLT50cngtPmJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLCBsY2hhbi0+dHMtPnRyeC0+YnRzLT5ucik7CisJICAgICAiTEFDPSV1IEJUUz0ldVxuIiwgY29ubi0+c3Vic2NyID8KKwkgICAgIAkJCXN1YnNjcl9uYW1lKGNvbm4tPnN1YnNjcikgOiAidW5rbm93biIsCisJICAgICBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSwgYnRzLT5ucik7CiAKIAljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfcmVzcC5yZWplY3QpOwogCQotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7CisJcmV0dXJuIGdzbTQ4X2Nvbm5fc2VuZG1zZyhtc2csIGNvbm4sIE5VTEwpOwogfQogCiAvKiBDaGFwdGVyIDkuMi4xMyA6IFNlbmQgTE9DQVRJT04gVVBEQVRFIEFDQ0VQVCAqLwotaW50IGdzbTA0MDhfbG9jX3VwZF9hY2Moc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCB0bXNpKQoraW50IGdzbTA0MDhfbG9jX3VwZF9hY2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHVfaW50MzJfdCB0bXNpKQogewotCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBjb25uLT5idHM7CiAJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKIAlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKIAlzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgKmxhaTsKIAl1X2ludDhfdCAqbWlkOwogCQotCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwltc2ctPmxjaGFuID0gY29ubi0+bGNoYW47CiAKIAlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOwogCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOwpAQCAtMjIyLDI5ICszNTUsMzAgQEAKIAogCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF9yZXNwLmFjY2VwdCk7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCBjb25uLCBOVUxMKTsKIH0KIAogLyogVHJhbnNtaXQgQ2hhcHRlciA5LjIuMTAgSWRlbnRpdHkgUmVxdWVzdCAqLwotc3RhdGljIGludCBtbV90eF9pZGVudGl0eV9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGlkX3R5cGUpCitzdGF0aWMgaW50IG1tX3R4X2lkZW50aXR5X3JlcShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgdV9pbnQ4X3QgaWRfdHlwZSkKIHsKIAlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOwogCXN0cnVjdCBnc200OF9oZHIgKmdoOwogCi0JbXNnLT5sY2hhbiA9IGxjaGFuOworCW1zZy0+bGNoYW4gPSBjb25uLT5sY2hhbjsKIAogCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOwogCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOwogCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0lEX1JFUTsKIAlnaC0+ZGF0YVswXSA9IGlkX3R5cGU7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCBjb25uLCBOVUxMKTsKIH0KIAogCiAvKiBQYXJzZSBDaGFwdGVyIDkuMi4xMSBJZGVudGl0eSBSZXNwb25zZSAqLwogc3RhdGljIGludCBtbV9yeF9pZF9yZXNwKHN0cnVjdCBtc2diICptc2cpCiB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CiAJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CiAJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOwogCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOwpAQCAtMjU2LDUxICszOTAsNTQgQEAKIAlERUJVR1AoRE1NLCAiSURFTlRJVFkgUkVTUE9OU0U6IG1pX3R5cGU9MHglMDJ4IE1JKCVzKVxuIiwKIAkJbWlfdHlwZSwgbWlfc3RyaW5nKTsKIAorCWNvbm4gPSAmbGNoYW4tPmNvbm47CisKIAlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9JREVOVElUWSwgZ2gtPmRhdGEpOwogCiAJc3dpdGNoIChtaV90eXBlKSB7CiAJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgogCQkvKiBsb29rIHVwIHN1YnNjcmliZXIgYmFzZWQgb24gSU1TSSwgY3JlYXRlIGlmIG5vdCBmb3VuZCAqLwotCQlpZiAoIWxjaGFuLT5zdWJzY3IpIHsKLQkJCWxjaGFuLT5zdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2kobmV0LCBtaV9zdHJpbmcpOwotCQkJaWYgKCFsY2hhbi0+c3Vic2NyKQotCQkJCWxjaGFuLT5zdWJzY3IgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihuZXQsIG1pX3N0cmluZyk7CisJCWlmICghY29ubi0+c3Vic2NyKSB7CisJCQljb25uLT5zdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2kobmV0LCBtaV9zdHJpbmcpOworCQkJaWYgKCFjb25uLT5zdWJzY3IpCisJCQkJY29ubi0+c3Vic2NyID0gZGJfY3JlYXRlX3N1YnNjcmliZXIobmV0LCBtaV9zdHJpbmcpOwogCQl9Ci0JCWlmIChsY2hhbi0+bG9jX29wZXJhdGlvbikKLQkJCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbXNpID0gMDsKKwkJaWYgKGNvbm4tPmxvY19vcGVyYXRpb24pCisJCQljb25uLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbXNpID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgogCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgogCQkvKiB1cGRhdGUgc3Vic2NyaWJlIDwtPiBJTUVJIG1hcHBpbmcgKi8KLQkJaWYgKGxjaGFuLT5zdWJzY3IpIHsKLQkJCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShsY2hhbi0+c3Vic2NyLCBtaV9zdHJpbmcpOwotCQkJZGJfc3luY19lcXVpcG1lbnQoJmxjaGFuLT5zdWJzY3ItPmVxdWlwbWVudCk7CisJCWlmIChjb25uLT5zdWJzY3IpIHsKKwkJCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShjb25uLT5zdWJzY3IsIG1pX3N0cmluZyk7CisJCQlkYl9zeW5jX2VxdWlwbWVudCgmY29ubi0+c3Vic2NyLT5lcXVpcG1lbnQpOwogCQl9Ci0JCWlmIChsY2hhbi0+bG9jX29wZXJhdGlvbikKLQkJCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMDsKKwkJaWYgKGNvbm4tPmxvY19vcGVyYXRpb24pCisJCQljb25uLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMDsKIAkJYnJlYWs7CiAJfQogCiAJLyogQ2hlY2sgaWYgd2UgY2FuIGxldCB0aGUgbW9iaWxlIHN0YXRpb24gZW50ZXIgKi8KLQlyZXR1cm4gZ3NtMDQwOF9hdXRob3JpemUobGNoYW4sIG1zZyk7CisJcmV0dXJuIGdzbTA0MDhfYXV0aG9yaXplKGNvbm4sIG1zZyk7CiB9CiAKIAogc3RhdGljIHZvaWQgbG9jX3VwZF9yZWpfY2Iodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGRhdGE7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4gPSBkYXRhOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gY29ubi0+bGNoYW47CiAJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CiAKLQlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEobGNoYW4pOwotCWdzbTA0MDhfbG9jX3VwZF9yZWoobGNoYW4sIGJ0cy0+bmV0d29yay0+cmVqZWN0X2NhdXNlKTsKKwlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEoY29ubik7CisJZ3NtMDQwOF9sb2NfdXBkX3Jlaihjb25uLCBidHMtPm5ldHdvcmstPnJlamVjdF9jYXVzZSk7CiAJbGNoYW5fYXV0b19yZWxlYXNlKGxjaGFuKTsKIH0KIAotc3RhdGljIHZvaWQgc2NoZWR1bGVfcmVqZWN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQorc3RhdGljIHZvaWQgc2NoZWR1bGVfcmVqZWN0KHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uKQogewotCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lci5jYiA9IGxvY191cGRfcmVqX2NiOwotCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lci5kYXRhID0gbGNoYW47Ci0JYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIsIDUsIDApOworCWNvbm4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyLmNiID0gbG9jX3VwZF9yZWpfY2I7CisJY29ubi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIuZGF0YSA9IGNvbm47CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZjb25uLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lciwgNSwgMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpsdXBkX25hbWUodV9pbnQ4X3QgdHlwZSkKQEAgLTMyMCw2ICs0NTcsNyBAQAogLyogQ2hhcHRlciA5LjIuMTU6IFJlY2VpdmUgTG9jYXRpb24gVXBkYXRpbmcgUmVxdWVzdCAqLwogc3RhdGljIGludCBtbV9yeF9sb2NfdXBkX3JlcShzdHJ1Y3QgbXNnYiAqbXNnKQogeworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOwogCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOwogCXN0cnVjdCBnc200OF9sb2NfdXBkX3JlcSAqbHU7CiAJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBOVUxMOwpAQCAtMzMwLDYgKzQ2OCw3IEBACiAJaW50IHJjOwogCiAgCWx1ID0gKHN0cnVjdCBnc200OF9sb2NfdXBkX3JlcSAqKSBnaC0+ZGF0YTsKKwljb25uID0gJmxjaGFuLT5jb25uOwogCiAJbWlfdHlwZSA9IGx1LT5taVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CiAKQEAgLTM1NiwyMSArNDk1LDIzIEBACiAJICogUHNldWRvIFNwb29mIGRldGVjdGlvbjogSnVzdCBkcm9wIGEgc2Vjb25kL2NvbmN1cnJlbnQKIAkgKiBsb2NhdGlvbiB1cGRhdGluZyByZXF1ZXN0LgogCSAqLwotCWlmIChsY2hhbi0+bG9jX29wZXJhdGlvbikgeworCWlmIChjb25uLT5sb2Nfb3BlcmF0aW9uKSB7CiAJCURFQlVHUEMoRE1NLCAiaWdub3JpbmcgcmVxdWVzdCBkdWUgYW4gZXhpc3Rpbmcgb25lOiAlcC5cbiIsCi0JCQlsY2hhbi0+bG9jX29wZXJhdGlvbik7Ci0JCWdzbTA0MDhfbG9jX3VwZF9yZWoobGNoYW4sIEdTTTQ4X1JFSkVDVF9QUk9UT0NPTF9FUlJPUik7CisJCQljb25uLT5sb2Nfb3BlcmF0aW9uKTsKKwkJZ3NtMDQwOF9sb2NfdXBkX3Jlaihjb25uLCBHU000OF9SRUpFQ1RfUFJPVE9DT0xfRVJST1IpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlhbGxvY2F0ZV9sb2NfdXBkYXRpbmdfcmVxKGxjaGFuKTsKKwlhbGxvY2F0ZV9sb2NfdXBkYXRpbmdfcmVxKCZsY2hhbi0+Y29ubik7CisKKwljb25uLT5sb2Nfb3BlcmF0aW9uLT5rZXlfc2VxID0gbHUtPmtleV9zZXE7CiAKIAlzd2l0Y2ggKG1pX3R5cGUpIHsKIAljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CiAJCURFQlVHUEMoRE1NLCAiXG4iKTsKIAkJLyogd2UgYWx3YXlzIHdhbnQgdGhlIElNRUksIHRvbyAqLwotCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1FSSk7Ci0JCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMTsKKwkJcmMgPSBtbV90eF9pZGVudGl0eV9yZXEoY29ubiwgR1NNX01JX1RZUEVfSU1FSSk7CisJCWNvbm4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltZWkgPSAxOwogCiAJCS8qIGxvb2sgdXAgc3Vic2NyaWJlciBiYXNlZCBvbiBJTVNJLCBjcmVhdGUgaWYgbm90IGZvdW5kICovCiAJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CkBAIC0zODAsMTggKzUyMSwxNyBAQAogCQlicmVhazsKIAljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CiAJCURFQlVHUEMoRE1NLCAiXG4iKTsKLQkJLyogd2UgYWx3YXlzIHdhbnQgdGhlIElNRUksIHRvbyAqLwotCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1FSSk7Ci0JCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMTsKLQogCQkvKiBsb29rIHVwIHRoZSBzdWJzY3JpYmVyIGJhc2VkIG9uIFRNU0ksIHJlcXVlc3QgSU1TSSBpZiBpdCBmYWlscyAqLwogCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X3Rtc2koYnRzLT5uZXR3b3JrLAogCQkJCQkgICAgdG1zaV9mcm9tX3N0cmluZyhtaV9zdHJpbmcpKTsKIAkJaWYgKCFzdWJzY3IpIHsKIAkJCS8qIHNlbmQgSURFTlRJVFkgUkVRVUVTVCBtZXNzYWdlIHRvIGdldCBJTVNJICovCi0JCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1TSSk7Ci0JCQlsY2hhbi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1zaSA9IDE7CisJCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShjb25uLCBHU01fTUlfVFlQRV9JTVNJKTsKKwkJCWNvbm4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltc2kgPSAxOwogCQl9CisJCS8qIHdlIGFsd2F5cyB3YW50IHRoZSBJTUVJLCB0b28gKi8KKwkJcmMgPSBtbV90eF9pZGVudGl0eV9yZXEoY29ubiwgR1NNX01JX1RZUEVfSU1FSSk7CisJCWNvbm4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltZWkgPSAxOwogCQlicmVhazsKIAljYXNlIEdTTV9NSV9UWVBFX0lNRUk6CiAJY2FzZSBHU01fTUlfVFlQRV9JTUVJU1Y6CkBAIC00MDQsNyArNTQ0LDcgQEAKIAl9CiAKIAkvKiBzY2hlZHVsZSB0aGUgcmVqZWN0IHRpbWVyICovCi0Jc2NoZWR1bGVfcmVqZWN0KGxjaGFuKTsKKwlzY2hlZHVsZV9yZWplY3QoY29ubik7CiAKIAlpZiAoIXN1YnNjcikgewogCQlERUJVR1BDKERSUiwgIjwtIENhbid0IGZpbmQgYW55IHN1YnNjcmliZXIgZm9yIHRoaXMgSURcbiIpOwpAQCAtNDEyLDEyICs1NTIsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbGNoYW4tPnN1YnNjciA9IHN1YnNjcjsKLQlsY2hhbi0+c3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMSA9IGx1LT5jbGFzc21hcmsxOworCWNvbm4tPnN1YnNjciA9IHN1YnNjcjsKKwljb25uLT5zdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsxID0gbHUtPmNsYXNzbWFyazE7CiAKIAkvKiBjaGVjayBpZiB3ZSBjYW4gbGV0IHRoZSBzdWJzY3JpYmVyIGludG8gb3VyIG5ldHdvcmsgaW1tZWRpYXRlbHkKIAkgKiBvciBpZiB3ZSBuZWVkIHRvIHdhaXQgZm9yIGlkZW50aXR5IHJlc3BvbnNlcy4gKi8KLQlyZXR1cm4gZ3NtMDQwOF9hdXRob3JpemUobGNoYW4sIG1zZyk7CisJcmV0dXJuIGdzbTA0MDhfYXV0aG9yaXplKGNvbm4sIG1zZyk7CiB9CiAKICNpZiAwCkBAIC00MjgsMTEgKzU2OCwxMSBAQAogI2VuZGlmCiAKIC8qIFNlY3Rpb24gOS4yLjE1YSAqLwotaW50IGdzbTQ4X3R4X21tX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCitpbnQgZ3NtNDhfdHhfbW1faW5mbyhzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubikKIHsKIAlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOwogCXN0cnVjdCBnc200OF9oZHIgKmdoOwotCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGNvbm4tPmJ0cy0+bmV0d29yazsKIAl1X2ludDhfdCAqcHRyODsKIAlpbnQgbmFtZV9sZW4sIG5hbWVfcGFkOwogI2lmIDAKQEAgLTQ0MSw3ICs1ODEsNyBAQAogCWludCB0ejE1bWluOwogI2VuZGlmCiAKLQltc2ctPmxjaGFuID0gbGNoYW47CisJbXNnLT5sY2hhbiA9IGNvbm4tPmxjaGFuOwogCiAJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKIAlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKQEAgLTUyNyw3ICs2NjcsNyBAQAogCiAJREVCVUdQKERNTSwgIi0+IE1NIElORk9cbiIpOwogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgY29ubiwgTlVMTCk7CiB9CiAKIC8qIFNlY3Rpb24gOS4yLjIgKi8KQEAgLTU0OSw3ICs2ODksNyBAQAogCWlmIChyYW5kKQogCQltZW1jcHkoYXItPnJhbmQsIHJhbmQsIDE2KTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7CisJcmV0dXJuIGdzbTQ4X2Nvbm5fc2VuZG1zZyhtc2csICZsY2hhbi0+Y29ubiwgTlVMTCk7CiB9CiAKIC8qIFNlY3Rpb24gOS4yLjEgKi8KQEAgLTU2Niw3ICs3MDYsNyBAQAogfQogCiAvKiA5LjIuNiBDTSBzZXJ2aWNlIHJlamVjdCAqLwotc3RhdGljIGludCBnc200OF90eF9tbV9zZXJ2X3JlaihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKK3N0YXRpYyBpbnQgZ3NtNDhfdHhfbW1fc2Vydl9yZWooc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sCiAJCQkJZW51bSBnc200OF9yZWplY3RfdmFsdWUgdmFsdWUpCiB7CiAJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKQEAgLTU3NCwxNSArNzE0LDQzIEBACiAKIAlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKIAotCW1zZy0+bGNoYW4gPSBsY2hhbjsKLQl1c2VfbGNoYW4obGNoYW4pOworCW1zZy0+bGNoYW4gPSBjb25uLT5sY2hhbjsKKwl1c2Vfc3Vic2NyX2Nvbihjb25uKTsKIAogCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOwogCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0NNX1NFUlZfUkVKOwogCWdoLT5kYXRhWzBdID0gdmFsdWU7CiAJREVCVUdQKERNTSwgIi0+IENNIFNFUlZJQ0UgUmVqZWN0IGNhdXNlOiAlZFxuIiwgdmFsdWUpOwogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgY29ubiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX2dzbTQ4X3J4X21tX3NlcnZfcmVxX3NlY19jYigKKwl1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorCXN0cnVjdCBtc2diICptc2csIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChldmVudCkgeworCQljYXNlIEdTTV9TRUNVUklUWV9BVVRIX0ZBSUxFRDoKKwkJCS8qIE5vdGhpbmcgdG8gZG8gKi8KKwkJCWJyZWFrOworCisJCWNhc2UgR1NNX1NFQ1VSSVRZX05PQVZBSUw6CisJCQlyYyA9IGdzbTQ4X3R4X21tX3NlcnZfYWNrKGxjaGFuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgR1NNX1NFQ1VSSVRZX1NVQ0NFRURFRDoKKwkJCS8qIG5vdGhpbmcgdG8gZG8uIENJUEhFUiBNT0RFIENPTU1BTkQgaXMKKwkJCSAqIGltcGxpY2l0IENNIFNFUlYgQUNLICovCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmMgPSAtRUlOVkFMOworCX07CisKKwlyZXR1cm4gcmM7CiB9CiAKIC8qCkBAIC02MDQsNyArNzcyLDcgQEAKIAlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKIAlzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0ICpyZXEgPQogCQkJKHN0cnVjdCBnc200OF9zZXJ2aWNlX3JlcXVlc3QgKilnaC0+ZGF0YTsKLQkvKiB1bmZvcnR1bmF0ZWx5IGluIFBoYXNlMSB0aGUgY2xhc3NtYXIyIGxlbmd0aCBpcyB2YXJpYWJsZSAqLworCS8qIHVuZm9ydHVuYXRlbHkgaW4gUGhhc2UxIHRoZSBjbGFzc21hcmsyIGxlbmd0aCBpcyB2YXJpYWJsZSAqLwogCXVfaW50OF90IGNsYXNzbWFyazJfbGVuID0gZ2gtPmRhdGFbMV07CiAJdV9pbnQ4X3QgKmNsYXNzbWFyazIgPSBnaC0+ZGF0YSsyOwogCXVfaW50OF90IG1pX2xlbiA9ICooY2xhc3NtYXJrMiArIGNsYXNzbWFyazJfbGVuKTsKQEAgLTYxMywyMCArNzgxLDIwIEBACiAJREVCVUdQKERNTSwgIjwtIENNIFNFUlZJQ0UgUkVRVUVTVCAiKTsKIAlpZiAobXNnLT5kYXRhX2xlbiA8IHNpemVvZihzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0KikpIHsKIAkJREVCVUdQQyhETU0sICJ3cm9uZyBzaXplZCBtZXNzYWdlXG4iKTsKLQkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKG1zZy0+bGNoYW4sCisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3JlaigmbXNnLT5sY2hhbi0+Y29ubiwKIAkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTkNPUlJFQ1RfTUVTU0FHRSk7CiAJfQogCiAJaWYgKG1zZy0+ZGF0YV9sZW4gPCByZXEtPm1pX2xlbiArIDYpIHsKIAkJREVCVUdQQyhETU0sICJkb2VzIG5vdCBmaXQgaW4gcGFja2V0XG4iKTsKLQkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKG1zZy0+bGNoYW4sCisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3JlaigmbXNnLT5sY2hhbi0+Y29ubiwKIAkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTkNPUlJFQ1RfTUVTU0FHRSk7CiAJfQogCiAJbWlfdHlwZSA9IG1pWzBdICYgR1NNX01JX1RZUEVfTUFTSzsKIAlpZiAobWlfdHlwZSAhPSBHU01fTUlfVFlQRV9UTVNJKSB7CiAJCURFQlVHUEMoRE1NLCAibWlfdHlwZSBpcyBub3QgVE1TSTogJWRcbiIsIG1pX3R5cGUpOwotCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWoobXNnLT5sY2hhbiwKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKCZtc2ctPmxjaGFuLT5jb25uLAogCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKIAl9CiAKQEAgLTY0NCwxMiArODEyLDEyIEBACiAKIAkvKiBGSVhNRTogaWYgd2UgZG9uJ3Qga25vdyB0aGUgVE1TSSwgaW5xdWlyZSBhYml0IElNU0kgYW5kIGFsbG9jYXRlIG5ldyBUTVNJICovCiAJaWYgKCFzdWJzY3IpCi0JCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3Jlaihtc2ctPmxjaGFuLAorCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWooJm1zZy0+bGNoYW4tPmNvbm4sCiAJCQkJCSAgICBHU000OF9SRUpFQ1RfSU1TSV9VTktOT1dOX0lOX0hMUik7CiAKLQlpZiAoIW1zZy0+bGNoYW4tPnN1YnNjcikKLQkJbXNnLT5sY2hhbi0+c3Vic2NyID0gc3Vic2NyOwotCWVsc2UgaWYgKG1zZy0+bGNoYW4tPnN1YnNjciA9PSBzdWJzY3IpCisJaWYgKCFtc2ctPmxjaGFuLT5jb25uLnN1YnNjcikKKwkJbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPSBzdWJzY3I7CisJZWxzZSBpZiAobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPT0gc3Vic2NyKQogCQlzdWJzY3JfcHV0KHN1YnNjcik7IC8qIGxjaGFuIGFscmVhZHkgaGFzIGEgcmVmLCBkb24ndCBuZWVkIGFub3RoZXIgb25lICovCiAJZWxzZSB7CiAJCURFQlVHUChETU0sICI8LSBDTSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgc29tZW9uZSBlbHNlP1xuIik7CkBAIC02NjAsNyArODI4LDggQEAKIAltZW1jcHkoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMiwgY2xhc3NtYXJrMiwgY2xhc3NtYXJrMl9sZW4pOwogCWRiX3N5bmNfZXF1aXBtZW50KCZzdWJzY3ItPmVxdWlwbWVudCk7CiAKLQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9hY2sobXNnLT5sY2hhbik7CisJcmV0dXJuIGdzbTQ4X3NlY3VyZV9jaGFubmVsKG1zZy0+bGNoYW4sIHJlcS0+Y2lwaGVyX2tleV9zZXEsCisJCQlfZ3NtNDhfcnhfbW1fc2Vydl9yZXFfc2VjX2NiLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBnc200OF9yeF9tbV9pbXNpX2RldGFjaF9pbmQoc3RydWN0IG1zZ2IgKm1zZykKQEAgLTcyNyw2ICs4OTYsNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogQ2hhcHRlciA5LjIuMzogQXV0aGVudGljYXRpb24gUmVzcG9uc2UgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfbW1fYXV0aF9yZXNwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X2F1dGhfcmVzcCAqYXIgPSAoc3RydWN0IGdzbTQ4X2F1dGhfcmVzcCopIGdoLT5kYXRhOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiA9ICZtc2ctPmxjaGFuLT5jb25uOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKworCURFQlVHUChETU0sICJNTSBBVVRIRU5USUNBVElPTiBSRVNQT05TRSAoc3JlcyA9ICVzKTogIiwKKwkJaGV4ZHVtcChhci0+c3JlcywgNCkpOworCisJLyogU2FmZXR5IGNoZWNrICovCisJaWYgKCFjb25uLT5zZWNfb3BlcmF0aW9uKSB7CisJCURFQlVHUChETU0sICJObyBhdXRoZW50aWNhdGlvbi9jaXBoZXIgb3BlcmF0aW9uIGluIHByb2dyZXNzICEhIVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFZhbGlkYXRlIFNSRVMgKi8KKwlpZiAobWVtY21wKGNvbm4tPnNlY19vcGVyYXRpb24tPmF0dXBsZS5zcmVzLCBhci0+c3Jlcyw0KSkgeworCQlnc21fY2JmbiAqY2IgPSBjb25uLT5zZWNfb3BlcmF0aW9uLT5jYjsKKworCQlERUJVR1BDKERNTSwgIkludmFsaWQgKGV4cGVjdGVkICVzKVxuIiwKKwkJCWhleGR1bXAoY29ubi0+c2VjX29wZXJhdGlvbi0+YXR1cGxlLnNyZXMsIDQpKTsKKworCQlpZiAoY2IpCisJCQljYihHU01fSE9PS19SUl9TRUNVUklUWSwgR1NNX1NFQ1VSSVRZX0FVVEhfRkFJTEVELAorCQkJICAgTlVMTCwgbGNoYW4sIGNvbm4tPnNlY19vcGVyYXRpb24tPmNiX2RhdGEpOworCisJCXJlbGVhc2Vfc2VjdXJpdHlfb3BlcmF0aW9uKGNvbm4pOworCQlyZXR1cm4gZ3NtNDhfdHhfbW1fYXV0aF9yZWoobGNoYW4pOworCX0KKworCURFQlVHUEMoRE1NLCAiT0tcbiIpOworCisJLyogU3RhcnQgY2lwaGVyaW5nICovCisJbGNoYW4tPmVuY3IuYWxnX2lkID0gUlNMX0VOQ19BTEdfQTUobmV0LT5hNV9lbmNyeXB0aW9uKTsKKwlsY2hhbi0+ZW5jci5rZXlfbGVuID0gODsKKwltZW1jcHkobXNnLT5sY2hhbi0+ZW5jci5rZXksIGNvbm4tPnNlY19vcGVyYXRpb24tPmF0dXBsZS5rYywgOCk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZF9ycl9jaXBoX21vZGUobXNnLT5sY2hhbiwgMCk7Cit9CisKIC8qIFJlY2VpdmUgYSBHU00gMDQuMDggTW9iaWxpdHkgTWFuYWdlbWVudCAoTU0pIG1lc3NhZ2UgKi8KIHN0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfbW0oc3RydWN0IG1zZ2IgKm1zZykKIHsKQEAgLTc0OSw4ICs5NjEsOCBAQAogCQlicmVhazsKIAljYXNlIEdTTTQ4X01UX01NX1RNU0lfUkVBTExfQ09NUEw6CiAJCURFQlVHUChETU0sICJUTVNJIFJlYWxsb2NhdGlvbiBDb21wbGV0ZWQuIFN1YnNjcmliZXI6ICVzXG4iLAotCQkgICAgICAgbXNnLT5sY2hhbi0+c3Vic2NyID8KLQkJCQlzdWJzY3JfbmFtZShtc2ctPmxjaGFuLT5zdWJzY3IpIDoKKwkJICAgICAgIG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyID8KKwkJCQlzdWJzY3JfbmFtZShtc2ctPmxjaGFuLT5jb25uLnN1YnNjcikgOgogCQkJCSJ1bmtub3duIHN1YnNjcmliZXIiKTsKIAkJYnJlYWs7CiAJY2FzZSBHU000OF9NVF9NTV9JTVNJX0RFVEFDSF9JTkQ6CkBAIC03NjAsNyArOTcyLDcgQEAKIAkJREVCVUdQKERNTSwgIkNNIFJFRVNUQUJMSVNIIFJFUVVFU1Q6IE5vdCBpbXBsZW1lbnRlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgR1NNNDhfTVRfTU1fQVVUSF9SRVNQOgotCQlERUJVR1AoRE1NLCAiQVVUSEVOVElDQVRJT04gUkVTUE9OU0U6IE5vdCBpbXBsZW1lbnRlZFxuIik7CisJCXJjID0gZ3NtNDhfcnhfbW1fYXV0aF9yZXNwKG1zZyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUxPR1AoRE1NLCBMT0dMX05PVElDRSwgIlVua25vd24gR1NNIDA0LjA4IE1NIG1zZyB0eXBlIDB4JTAyeFxuIiwKQEAgLTc3NiwxMyArOTg4LDE2IEBACiB7CiAJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKIAlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfcGFnX3Jlc3AgKnJlc3A7CiAJdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYgPSBnaC0+ZGF0YSArIDE7CiAJdV9pbnQ4X3QgbWlfdHlwZTsKIAljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKIAlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IE5VTEw7CiAJaW50IHJjID0gMDsKIAotCWdzbTQ4X3BhZ2luZ19leHRyYWN0X21pKG1zZywgbWlfc3RyaW5nLCAmbWlfdHlwZSk7CisJcmVzcCA9IChzdHJ1Y3QgZ3NtNDhfcGFnX3Jlc3AgKikgJmdoLT5kYXRhWzBdOworCWdzbTQ4X3BhZ2luZ19leHRyYWN0X21pKHJlc3AsIG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpLAorCQkJCW1pX3N0cmluZywgJm1pX3R5cGUpOwogCURFQlVHUChEUlIsICJQQUdJTkcgUkVTUE9OU0U6IG1pX3R5cGU9MHglMDJ4IE1JKCVzKVxuIiwKIAkJbWlfdHlwZSwgbWlfc3RyaW5nKTsKIApAQCAtODE1LDcgKzEwMzAsNyBAQAogc3RhdGljIGludCBnc200OF9yeF9ycl9jbGFzc21hcmsoc3RydWN0IG1zZ2IgKm1zZykKIHsKIAlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKLQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IG1zZy0+bGNoYW4tPnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyOwogCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOwogCXVfaW50OF90IGNtMl9sZW4sIGNtM19sZW4gPSAwOwogCXVfaW50OF90ICpjbTIsICpjbTMgPSBOVUxMOwpAQCAtODYzLDcgKzEwNzgsNyBAQAogewogCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOwogCi0JREVCVUdQKERSUiwgIlNUQVRVUyBycl9jYXVzZSA9ICVzXG4iLCAKKwlERUJVR1AoRFJSLCAiU1RBVFVTIHJyX2NhdXNlID0gJXNcbiIsCiAJCXJyX2NhdXNlX25hbWUoZ2gtPmRhdGFbMF0pKTsKIAogCXJldHVybiAwOwpAQCAtODk2LDcgKzExMTEsMzggQEAKIAlERUJVR1AoRE5NLCAiUlggQVBQTElDQVRJT04gSU5GTyBpZC9mbGFncz0weCUwMnggYXBkdV9sZW49JXUgYXBkdT0lcyIsCiAJCWFwZHVfaWRfZmxhZ3MsIGFwZHVfbGVuLCBoZXhkdW1wKGFwZHVfZGF0YSwgYXBkdV9sZW4pKTsKIAotCXJldHVybiBkYl9hcGR1X2Jsb2Jfc3RvcmUobXNnLT5sY2hhbi0+c3Vic2NyLCBhcGR1X2lkX2ZsYWdzLCBhcGR1X2xlbiwgYXBkdV9kYXRhKTsKKwlyZXR1cm4gZGJfYXBkdV9ibG9iX3N0b3JlKG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyLCBhcGR1X2lkX2ZsYWdzLCBhcGR1X2xlbiwgYXBkdV9kYXRhKTsKK30KKworLyogQ2hhcHRlciA5LjEuMTAgQ2lwaGVyaW5nIE1vZGUgQ29tcGxldGUgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfY2lwaF9tX2NvbXBsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uID0gJmxjaGFuLT5jb25uOworCWdzbV9jYmZuICpjYjsKKwlpbnQgcmMgPSAwOworCisJREVCVUdQKERSUiwgIkNJUEhFUklORyBNT0RFIENPTVBMRVRFXG4iKTsKKworCS8qIFNhZmV0eSBjaGVjayAqLworCWlmICghY29ubi0+c2VjX29wZXJhdGlvbikgeworCQlERUJVR1AoRFJSLCAiTm8gYXV0aGVudGljYXRpb24vY2lwaGVyIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyAhISFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBGSVhNRTogY2hlY2sgZm9yIE1JIChpZiBhbnkpICovCisKKwkvKiBDYWxsIGJhY2sgd2hhdGV2ZXIgd2FzIGluIHByb2dyZXNzIChpZiBhbnl0aGluZykgLi4uICovCisJY2IgPSBjb25uLT5zZWNfb3BlcmF0aW9uLT5jYjsKKwlpZiAoY2IpIHsKKwkJcmMgPSBjYihHU01fSE9PS19SUl9TRUNVUklUWSwgR1NNX1NFQ1VSSVRZX1NVQ0NFRURFRCwKKwkJCU5VTEwsIGxjaGFuLCBjb25uLT5zZWNfb3BlcmF0aW9uLT5jYl9kYXRhKTsKKwl9CisKKwkvKiBDb21wbGV0ZSB0aGUgb3BlcmF0aW9uICovCisJcmVsZWFzZV9zZWN1cml0eV9vcGVyYXRpb24oY29ubik7CisKKwlyZXR1cm4gcmM7CiB9CiAKIC8qIENoYXB0ZXIgOS4xLjE2IEhhbmRvdmVyIGNvbXBsZXRlICovCkBAIC05NTYsOCArMTIwMiw3IEBACiAJCXJjID0gZ3NtNDhfcnhfcnJfYXBwX2luZm8obXNnKTsKIAkJYnJlYWs7CiAJY2FzZSBHU000OF9NVF9SUl9DSVBIX01fQ09NUEw6Ci0JCURFQlVHUChEUlIsICJDSVBIRVJJTkcgTU9ERSBDT01QTEVURVxuIik7Ci0JCS8qIEZJWE1FOiBjaGVjayBmb3IgTUkgKGlmIGFueSkgKi8KKwkJcmMgPSBnc200OF9yeF9ycl9jaXBoX21fY29tcGwobXNnKTsKIAkJYnJlYWs7CiAJY2FzZSBHU000OF9NVF9SUl9IQU5ET19DT01QTDoKIAkJcmMgPSBnc200OF9yeF9ycl9ob19jb21wbChtc2cpOwpAQCAtOTkyLDcgKzEyMzcsNyBAQAogCWdoLT5kYXRhWzFdID0gYXBkdV9sZW47CiAJbWVtY3B5KGdoLT5kYXRhKzIsIGFwZHUsIGFwZHVfbGVuKTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7CisJcmV0dXJuIGdzbTQ4X2Nvbm5fc2VuZG1zZyhtc2csICZsY2hhbi0+Y29ubiwgTlVMTCk7CiB9CiAKIC8qIENhbGwgQ29udHJvbCAqLwpAQCAtMTAzMCw3ICsxMjc1LDcgQEAKIAljYWxsX3N0YXRlID0gbXNnYl9wdXQobXNnLCAxKTsKIAljYWxsX3N0YXRlWzBdID0gMHhjMCB8IDB4MDA7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgdHJhbnMtPmNvbm4sIHRyYW5zKTsKIH0KIAogc3RhdGljIGludCBnc200OF90eF9zaW1wbGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCkBAIC0xMDQ0LDcgKzEyODksNyBAQAogCWdoLT5wcm90b19kaXNjciA9IHBkaXNjOwogCWdoLT5tc2dfdHlwZSA9IG1zZ190eXBlOwogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgJmxjaGFuLT5jb25uLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgZ3NtNDhfc3RvcF9jY190aW1lcihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKQEAgLTEwNTUsMTkgKzEzMDAsMTkgQEAKIAkJdHJhbnMtPmNjLlRjdXJyZW50ID0gMDsKIAl9CiB9Ci0gCisKIHN0YXRpYyBpbnQgbW5jY19yZWN2bXNnKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKIAkJCWludCBtc2dfdHlwZSwgc3RydWN0IGdzbV9tbmNjICptbmNjKQogewogCXN0cnVjdCBtc2diICptc2c7CiAKIAlpZiAodHJhbnMpCi0JCWlmICh0cmFucy0+bGNoYW4pCisJCWlmICh0cmFucy0+Y29ubikKIAkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAleCBzdWIgJXMpICIKIAkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAotCQkJCXRyYW5zLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwKLQkJCQl0cmFucy0+bGNoYW4tPnRzLT50cngtPm5yLAotCQkJCXRyYW5zLT5sY2hhbi0+dHMtPm5yLCB0cmFucy0+dHJhbnNhY3Rpb25faWQsCisJCQkJdHJhbnMtPmNvbm4tPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLAorCQkJCXRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPnRyeC0+bnIsCisJCQkJdHJhbnMtPmNvbm4tPmxjaGFuLT50cy0+bnIsIHRyYW5zLT50cmFuc2FjdGlvbl9pZCwKIAkJCQkodHJhbnMtPnN1YnNjcik/KHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAogCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpKTsKIAkJZWxzZQpAQCAtMTExNiwxMiArMTM2MSwxMiBAQAogCX0KIAlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfTlVMTCkKIAkJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOwotCWlmICh0cmFucy0+bGNoYW4pCi0JCXRyYXVfbXV4X3VubWFwKCZ0cmFucy0+bGNoYW4tPnRzLT5lMV9saW5rLCB0cmFucy0+Y2FsbHJlZik7CisJaWYgKHRyYW5zLT5jb25uKQorCQl0cmF1X211eF91bm1hcCgmdHJhbnMtPmNvbm4tPmxjaGFuLT50cy0+ZTFfbGluaywgdHJhbnMtPmNhbGxyZWYpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3NldHVwKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpOwotIAorCiAvKiBjYWxsLWJhY2sgZnJvbSBwYWdpbmcgdGhlIEItZW5kIG9mIHRoZSBjb25uZWN0aW9uICovCiBzdGF0aWMgaW50IHNldHVwX3RyaWdfcGFnX2V2dCh1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAogCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqX2xjaGFuLCB2b2lkICpwYXJhbSkKQEAgLTExMzMsNyArMTM3OCw3IEBACiAKIAlpZiAoaG9va251bSAhPSBHU01fSE9PS19SUl9QQUdJTkcpCiAJCXJldHVybiAtRUlOVkFMOwotICAKKwogCWlmICghc3Vic2NyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAluZXQgPSBzdWJzY3ItPm5ldDsKQEAgLTExNDQsNyArMTM4OSw3IEBACiAKIAkvKiBjaGVjayBhbGwgdHJhbmFjdGlvbnMgKHdpdGhvdXQgbGNoYW4pIGZvciBzdWJzY3JpYmVyICovCiAJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFuc3QsIHRtcCwgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKLQkJaWYgKHRyYW5zdC0+c3Vic2NyICE9IHN1YnNjciB8fCB0cmFuc3QtPmxjaGFuKQorCQlpZiAodHJhbnN0LT5zdWJzY3IgIT0gc3Vic2NyIHx8IHRyYW5zdC0+Y29ubikKIAkJCWNvbnRpbnVlOwogCQlzd2l0Y2ggKGV2ZW50KSB7CiAJCWNhc2UgR1NNX1BBR0lOR19TVUNDRUVERUQ6CkBAIC0xMTUzLDkgKzEzOTgsOSBAQAogCQkJREVCVUdQKERDQywgIlBhZ2luZyBzdWJzY3IgJXMgc3VjY2VlZGVkIVxuIiwKIAkJCQlzdWJzY3ItPmV4dGVuc2lvbik7CiAJCQkvKiBBc3NpZ24gbGNoYW4gKi8KLQkJCWlmICghdHJhbnN0LT5sY2hhbikgewotCQkJCXRyYW5zdC0+bGNoYW4gPSBsY2hhbjsKLQkJCQl1c2VfbGNoYW4obGNoYW4pOworCQkJaWYgKCF0cmFuc3QtPmNvbm4pIHsKKwkJCQl0cmFuc3QtPmNvbm4gPSAmbGNoYW4tPmNvbm47CisJCQkJdXNlX3N1YnNjcl9jb24odHJhbnN0LT5jb25uKTsKIAkJCX0KIAkJCS8qIHNlbmQgU0VUVVAgcmVxdWVzdCB0byBjYWxsZWQgcGFydHkgKi8KIAkJCWdzbTQ4X2NjX3R4X3NldHVwKHRyYW5zdCwgJnRyYW5zdC0+Y2MubXNnKTsKQEAgLTEyMDAsNyArMTQ0NSw3IEBACiAJCSAqIGEgdGNoX3JlY3ZfbW5jYyByZXF1ZXN0IHBlbmRpbmcgKi8KIAkJbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKIAkJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7Ci0JCQlpZiAodHJhbnMtPmxjaGFuID09IGxjaGFuICYmIHRyYW5zLT50Y2hfcmVjdikgeworCQkJaWYgKHRyYW5zLT5jb25uICYmIHRyYW5zLT5jb25uLT5sY2hhbiA9PSBsY2hhbiAmJiB0cmFucy0+dGNoX3JlY3YpIHsKIAkJCQlERUJVR1AoRENDLCAicGVuZGluZyB0Y2hfcmVjdl9tbmNjIHJlcXVlc3RcbiIpOwogCQkJCXRjaF9yZWN2X21uY2MobmV0LCB0cmFucy0+Y2FsbHJlZiwgMSk7CiAJCQl9CkBAIC0xMjczLDExICsxNTE4LDExIEBACiAJaWYgKCF0cmFuczEgfHwgIXRyYW5zMikKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoIXRyYW5zMS0+bGNoYW4gfHwgIXRyYW5zMi0+bGNoYW4pCisJaWYgKCF0cmFuczEtPmNvbm4gfHwgIXRyYW5zMi0+Y29ubikKIAkJcmV0dXJuIC1FSU87CiAKIAkvKiB0aHJvdWdoLWNvbm5lY3QgY2hhbm5lbCAqLwotCXJldHVybiB0Y2hfbWFwKHRyYW5zMS0+bGNoYW4sIHRyYW5zMi0+bGNoYW4pOworCXJldHVybiB0Y2hfbWFwKHRyYW5zMS0+Y29ubi0+bGNoYW4sIHRyYW5zMi0+Y29ubi0+bGNoYW4pOwogfQogCiAvKiBlbmFibGUgcmVjZWl2ZSBvZiBjaGFubmVscyB0byBNTkNDIHVwcXVldWUgKi8KQEAgLTEyOTIsOSArMTUzNyw5IEBACiAJdHJhbnMgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCBjYWxscmVmKTsKIAlpZiAoIXRyYW5zKQogCQlyZXR1cm4gLUVJTzsKLQlpZiAoIXRyYW5zLT5sY2hhbikKKwlpZiAoIXRyYW5zLT5jb25uKQogCQlyZXR1cm4gMDsKLQlsY2hhbiA9IHRyYW5zLT5sY2hhbjsKKwlsY2hhbiA9IHRyYW5zLT5jb25uLT5sY2hhbjsKIAlidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOwogCiAJc3dpdGNoIChidHMtPnR5cGUpIHsKQEAgLTE1ODYsNyArMTgzMSw3IEBACiAJCiAJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCk7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgdHJhbnMtPmNvbm4sIHRyYW5zKTsKIH0KIAogc3RhdGljIGludCBnc200OF9jY19yeF9jYWxsX2NvbmYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCkBAIC0xNjU0LDcgKzE4OTksNyBAQAogCWlmIChwcm9jZWVkaW5nLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCiAJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZwcm9jZWVkaW5nLT5wcm9ncmVzcyk7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgdHJhbnMtPmNvbm4sIHRyYW5zKTsKIH0KIAogc3RhdGljIGludCBnc200OF9jY19yeF9hbGVydGluZyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKQEAgLTE3MTYsNyArMTk2MSw3IEBACiAKIAluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ0FMTF9ERUxJVkVSRUQpOwogCQotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3Byb2dyZXNzKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCkBAIC0xNzMzLDcgKzE5NzgsNyBAQAogCWlmIChwcm9ncmVzcy0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQogCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmcHJvZ3Jlc3MtPnVzZXJ1c2VyKTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKQEAgLTE3NjIsNyArMjAwNyw3IEBACiAKIAluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ09OTkVDVF9JTkQpOwogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7CisJcmV0dXJuIGdzbTQ4X2Nvbm5fc2VuZG1zZyhtc2csIHRyYW5zLT5jb25uLCB0cmFucyk7CiB9CiAKIHN0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKQEAgLTE4MzMsNyArMjA3OCw3IEBACiAKIAluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCkBAIC0xOTIxLDcgKzIxNjYsNyBAQAogCiAJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfSU5EKTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3JlbGVhc2Uoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCkBAIC0yMDA5LDcgKzIyNTQsNyBAQAogCWlmICh0cmFucy0+Y2Muc3RhdGUgIT0gR1NNX0NTVEFURV9SRUxFQVNFX1JFUSkKIAkJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3JlbGVhc2VfY29tcGwoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCkBAIC0yMDk5LDcgKzIzNDQsNyBAQAogCiAJdHJhbnNfZnJlZSh0cmFucyk7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgdHJhbnMtPmNvbm4sIHRyYW5zKTsKIH0KIAogc3RhdGljIGludCBnc200OF9jY19yeF9mYWNpbGl0eShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKQEAgLTIxMzksNyArMjM4NCw3IEBACiAJLyogZmFjaWxpdHkgKi8KIAlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAxLCAmZmFjLT5mYWNpbGl0eSk7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgdHJhbnMtPmNvbm4sIHRyYW5zKTsKIH0KIAogc3RhdGljIGludCBnc200OF9jY19yeF9ob2xkKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQpAQCAtMjE1OCw3ICsyNDAzLDcgQEAKIAogCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0hPTERfQUNLOwogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7CisJcmV0dXJuIGdzbTQ4X2Nvbm5fc2VuZG1zZyhtc2csIHRyYW5zLT5jb25uLCB0cmFucyk7CiB9CiAKIHN0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfaG9sZF9yZWooc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKQEAgLTIxNzUsNyArMjQyMCw3IEBACiAJZWxzZQogCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZGVmYXVsdF9jYXVzZSk7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgdHJhbnMtPmNvbm4sIHRyYW5zKTsKIH0KIAogc3RhdGljIGludCBnc200OF9jY19yeF9yZXRyaWV2ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKQEAgLTIxOTUsNyArMjQ0MCw3IEBACiAKIAlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRVRSX0FDSzsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JldHJpZXZlX3JlaihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQpAQCAtMjIxMiw3ICsyNDU3LDcgQEAKIAllbHNlCiAJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3N0YXJ0X2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCkBAIC0yMjQ3LDcgKzI0OTIsNyBAQAogCWlmIChkdG1mLT5maWVsZHMgJiBNTkNDX0ZfS0VZUEFEKQogCQlnc200OF9lbmNvZGVfa2V5cGFkKG1zZywgZHRtZi0+a2V5cGFkKTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3N0YXJ0X2R0bWZfcmVqKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCkBAIC0yMjY0LDcgKzI1MDksNyBAQAogCWVsc2UKIAkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRlZmF1bHRfY2F1c2UpOwogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7CisJcmV0dXJuIGdzbTQ4X2Nvbm5fc2VuZG1zZyhtc2csIHRyYW5zLT5jb25uLCB0cmFucyk7CiB9CiAKIHN0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RvcF9kdG1mX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQpAQCAtMjI3NCw3ICsyNTE5LDcgQEAKIAogCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUT1BfRFRNRl9BQ0s7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgdHJhbnMtPmNvbm4sIHRyYW5zKTsKIH0KIAogc3RhdGljIGludCBnc200OF9jY19yeF9zdG9wX2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCkBAIC0yMzI0LDcgKzI1NjksNyBAQAogCiAJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZKTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X21vZGlmeV9jb21wbGV0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKQEAgLTIzNjQsNyArMjYwOSw3IEBACiAKIAluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X21vZGlmeV9yZWplY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCkBAIC0yNDEyLDcgKzI2NTcsNyBAQAogCiAJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgdHJhbnMtPmNvbm4sIHRyYW5zKTsKIH0KIAogc3RhdGljIGludCBnc200OF9jY190eF9ub3RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKQEAgLTI0MjYsNyArMjY3MSw3IEBACiAJLyogbm90aWZ5ICovCiAJZ3NtNDhfZW5jb2RlX25vdGlmeShtc2csIG5vdGlmeS0+bm90aWZ5KTsKIAotCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworCXJldHVybiBnc200OF9jb25uX3NlbmRtc2cobXNnLCB0cmFucy0+Y29ubiwgdHJhbnMpOwogfQogCiBzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X25vdGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKQEAgLTI0NjAsNyArMjcwNSw3IEBACiAJaWYgKHVzZXItPm1vcmUpCiAJCWdzbTQ4X2VuY29kZV9tb3JlKG1zZyk7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKKwlyZXR1cm4gZ3NtNDhfY29ubl9zZW5kbXNnKG1zZywgdHJhbnMtPmNvbm4sIHRyYW5zKTsKIH0KIAogc3RhdGljIGludCBnc200OF9jY19yeF91c2VyaW5mbyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKQEAgLTI0OTAsNyArMjczNSw3IEBACiB7CiAJc3RydWN0IGdzbV9tbmNjICptb2RlID0gYXJnOwogCi0JcmV0dXJuIGdzbTQ4X2xjaGFuX21vZGlmeSh0cmFucy0+bGNoYW4sIG1vZGUtPmxjaGFuX21vZGUpOworCXJldHVybiBnc200OF9sY2hhbl9tb2RpZnkodHJhbnMtPmNvbm4tPmxjaGFuLCBtb2RlLT5sY2hhbl9tb2RlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkb3duc3RhdGUgewpAQCAtMjU3NiwxOCArMjgyMSwxOCBAQAogCQl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIGRhdGEtPmNhbGxyZWYpOwogCQlpZiAoIXRyYW5zKQogCQkJcmV0dXJuIC1FSU87Ci0JCWlmICghdHJhbnMtPmxjaGFuKQorCQlpZiAoIXRyYW5zLT5jb25uKQogCQkJcmV0dXJuIDA7Ci0JCWlmICh0cmFucy0+bGNoYW4tPnR5cGUgIT0gR1NNX0xDSEFOX1RDSF9GKQorCQlpZiAodHJhbnMtPmNvbm4tPmxjaGFuLT50eXBlICE9IEdTTV9MQ0hBTl9UQ0hfRikKIAkJCXJldHVybiAwOwotCQlidHMgPSB0cmFucy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwkJYnRzID0gdHJhbnMtPmNvbm4tPmxjaGFuLT50cy0+dHJ4LT5idHM7CiAJCXN3aXRjaCAoYnRzLT50eXBlKSB7CiAJCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6Ci0JCQlpZiAoIXRyYW5zLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQkJaWYgKCF0cmFucy0+Y29ubi0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkKIAkJCQlyZXR1cm4gMDsKLQkJCXJldHVybiBydHBfc2VuZF9mcmFtZSh0cmFucy0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwgYXJnKTsKKwkJCXJldHVybiBydHBfc2VuZF9mcmFtZSh0cmFucy0+Y29ubi0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwgYXJnKTsKIAkJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKLQkJCXJldHVybiB0cmF1X3NlbmRfZnJhbWUodHJhbnMtPmxjaGFuLCBhcmcpOworCQkJcmV0dXJuIHRyYXVfc2VuZF9mcmFtZSh0cmFucy0+Y29ubi0+bGNoYW4sIGFyZyk7CiAJCWRlZmF1bHQ6CiAJCQlERUJVR1AoRENDLCAiVW5rbm93biBCVFMgdHlwZSAldVxuIiwgYnRzLT50eXBlKTsKIAkJfQpAQCAtMjY2NSw2ICsyOTEwLDcgQEAKIAkJfQogCQkvKiBGaW5kIGxjaGFuICovCiAJCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCiAJCS8qIElmIHN1YnNjcmliZXIgaGFzIG5vIGxjaGFuICovCiAJCWlmICghbGNoYW4pIHsKIAkJCS8qIGZpbmQgdHJhbnNhY3Rpb24gd2l0aCB0aGlzIHN1YnNjcmliZXIgYWxyZWFkeSBwYWdpbmcgKi8KQEAgLTI2OTIsMTYgKzI5MzgsMTggQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCS8qIEFzc2lnbiBsY2hhbiAqLwotCQl0cmFucy0+bGNoYW4gPSBsY2hhbjsKLQkJdXNlX2xjaGFuKGxjaGFuKTsKKwkJdHJhbnMtPmNvbm4gPSAmbGNoYW4tPmNvbm47CisJCXVzZV9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKIAkJc3Vic2NyX3B1dChzdWJzY3IpOwogCX0KLQlsY2hhbiA9IHRyYW5zLT5sY2hhbjsKKworCWlmICh0cmFucy0+Y29ubikKKwkJbGNoYW4gPSB0cmFucy0+Y29ubi0+bGNoYW47CiAKIAkvKiBpZiBwYWdpbmcgZGlkIG5vdCByZXNwb25kIHlldCAqLwogCWlmICghbGNoYW4pIHsKIAkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgotCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIGluIHBhZ2luZyBzdGF0ZVxuIiwgCisJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0MgaW4gcGFnaW5nIHN0YXRlXG4iLAogCQkJKHRyYW5zLT5zdWJzY3IpPyh0cmFucy0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKIAkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpKTsKIAkJbW5jY19zZXRfY2F1c2UoJnJlbCwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLApAQCAtMjcxOSw3ICsyOTY3LDcgQEAKIAkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIGluIHN0YXRlICVkICglcylcbiIsCiAJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsCiAJCXRyYW5zLT50cmFuc2FjdGlvbl9pZCwKLQkJKGxjaGFuLT5zdWJzY3IpPyhsY2hhbi0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJKHRyYW5zLT5jb25uLT5zdWJzY3IpPyh0cmFucy0+Y29ubi0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKIAkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSksIHRyYW5zLT5jYy5zdGF0ZSwKIAkJZ3NtNDhfY2Nfc3RhdGVfbmFtZSh0cmFucy0+Y2Muc3RhdGUpKTsKIApAQCAtMjc1Niw3ICszMDA0LDcgQEAKIAkgR1NNNDhfTVRfQ0NfQ0FMTF9DT05GLCBnc200OF9jY19yeF9jYWxsX2NvbmZ9LAogCXtTQklUKEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKSB8IFNCSVQoR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORiksIC8qID8/Pz8gfCA1LjIuMi4zLjIgKi8KIAkgR1NNNDhfTVRfQ0NfQUxFUlRJTkcsIGdzbTQ4X2NjX3J4X2FsZXJ0aW5nfSwKLQl7U0JJVChHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fVEVSTV9DQUxMX0NPTkYpIHwgU0JJVChHU01fQ1NUQVRFX0NBTExfUkVDRUlWRUQpLCAvKiAoNS4yLjIuNikgfCA1LjIuMi42IHwgNS4yLjIuNiAqLyAgCisJe1NCSVQoR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQpIHwgU0JJVChHU01fQ1NUQVRFX01PX1RFUk1fQ0FMTF9DT05GKSB8IFNCSVQoR1NNX0NTVEFURV9DQUxMX1JFQ0VJVkVEKSwgLyogKDUuMi4yLjYpIHwgNS4yLjIuNiB8IDUuMi4yLjYgKi8KIAkgR1NNNDhfTVRfQ0NfQ09OTkVDVCwgZ3NtNDhfY2NfcnhfY29ubmVjdH0sCiAJIC8qIHNpZ25hbGxpbmcgZHVyaW5nIGNhbGwgKi8KIAl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSwKQEAgLTI3OTUsNiArMzA0Myw3IEBACiAKIHN0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfY2Moc3RydWN0IG1zZ2IgKm1zZykKIHsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKIAlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKIAl1X2ludDhfdCBtc2dfdHlwZSA9IGdoLT5tc2dfdHlwZSAmIDB4YmY7CiAJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQgPSAoKGdoLT5wcm90b19kaXNjciAmIDB4ZjApIF4gMHg4MCkgPj4gNDsgLyogZmxpcCAqLwpAQCAtMjgwNiwxNCArMzA1NSwxNiBAQAogCQlERUJVR1AoRENDLCAiTVNHIDB4JTJ4IG5vdCBkZWZpbmVkIGZvciBQRCBlcnJvclxuIiwgbXNnX3R5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JCisKKwljb25uID0gJmxjaGFuLT5jb25uOworCiAJLyogRmluZCB0cmFuc2FjdGlvbiAqLwotCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19DQywgdHJhbnNhY3Rpb25faWQpOworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChjb25uLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCB0cmFuc2FjdGlvbl9pZCk7CiAKIAlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJXggc3ViICVzKSAiCiAJCSJSZWNlaXZlZCAnJXMnIGZyb20gTVMgaW4gc3RhdGUgJWQgKCVzKVxuIiwKIAkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKLQkJdHJhbnNhY3Rpb25faWQsIChsY2hhbi0+c3Vic2NyKT8obGNoYW4tPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCXRyYW5zYWN0aW9uX2lkLCAoY29ubi0+c3Vic2NyKT8oY29ubi0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKIAkJZ3NtNDhfY2NfbXNnX25hbWUobXNnX3R5cGUpLCB0cmFucz8odHJhbnMtPmNjLnN0YXRlKTowLAogCQlnc200OF9jY19zdGF0ZV9uYW1lKHRyYW5zPyh0cmFucy0+Y2Muc3RhdGUpOjApKTsKIApAQCAtMjgyMiw3ICszMDczLDcgQEAKIAkJREVCVUdQKERDQywgIlVua25vd24gdHJhbnNhY3Rpb24gSUQgJXgsICIKIAkJCSJjcmVhdGluZyBuZXcgdHJhbnMuXG4iLCB0cmFuc2FjdGlvbl9pZCk7CiAJCS8qIENyZWF0ZSB0cmFuc2FjdGlvbiAqLwotCQl0cmFucyA9IHRyYW5zX2FsbG9jKGxjaGFuLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLAorCQl0cmFucyA9IHRyYW5zX2FsbG9jKGNvbm4tPnN1YnNjciwgR1NNNDhfUERJU0NfQ0MsCiAJCQkJICAgIHRyYW5zYWN0aW9uX2lkLCBuZXdfY2FsbHJlZisrKTsKIAkJaWYgKCF0cmFucykgewogCQkJREVCVUdQKERDQywgIk5vIG1lbW9yeSBmb3IgdHJhbnMuXG4iKTsKQEAgLTI4MzIsOCArMzA4Myw4IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQkvKiBBc3NpZ24gdHJhbnNhY3Rpb24gKi8KLQkJdHJhbnMtPmxjaGFuID0gbGNoYW47Ci0JCXVzZV9sY2hhbihsY2hhbik7CisJCXRyYW5zLT5jb25uID0gJmxjaGFuLT5jb25uOworCQl1c2Vfc3Vic2NyX2Nvbih0cmFucy0+Y29ubik7CiAJfQogCiAJLyogZmluZCBmdW5jdGlvbiBmb3IgY3VycmVudCBzdGF0ZSBhbmQgbWVzc2FnZSAqLwpAQCAtMjg5MSwzMSArMzE0MiwxMSBAQAogCXJldHVybiByYzsKIH0KIAotLyogZGVxdWV1ZSBtZXNzYWdlcyB0byBsYXllciA0ICovCi1pbnQgYnNjX3VwcXVldWUoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCi17Ci0Jc3RydWN0IGdzbV9tbmNjICptbmNjOwotCXN0cnVjdCBtc2diICptc2c7Ci0JaW50IHdvcmsgPSAwOwotCi0JaWYgKG5ldCkKLQkJd2hpbGUgKChtc2cgPSBtc2diX2RlcXVldWUoJm5ldC0+dXBxdWV1ZSkpKSB7Ci0JCQltbmNjID0gKHN0cnVjdCBnc21fbW5jYyAqKW1zZy0+ZGF0YTsKLQkJCWlmIChuZXQtPm1uY2NfcmVjdikKLQkJCQluZXQtPm1uY2NfcmVjdihuZXQsIG1uY2MtPm1zZ190eXBlLCBtbmNjKTsKLQkJCXdvcmsgPSAxOyAvKiB3b3JrIGRvbmUgKi8KLQkJCXRhbGxvY19mcmVlKG1zZyk7Ci0JCX0KLQotCXJldHVybiB3b3JrOwotfQotCiAvKgogICogVGhpcyB3aWxsIGJlIHJhbiBieSB0aGUgbGlua2VyIHdoZW4gbG9hZGluZyB0aGUgRFNPLiBXZSB1c2UgaXQgdG8KICAqIGRvIHN5c3RlbSBpbml0aWFsaXphdGlvbiwgZS5nLiByZWdpc3RyYXRpb24gb2Ygc2lnbmFsIGhhbmRsZXJzLgogICovCiBzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkXzA0MDgodm9pZCkKIHsKLQlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgZ3NtMDQwOF9oYW5kbGVfbGNoYW5fc2lnbmFsLCBOVUxMKTsKIAlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhhbmRsZV9hYmlzaXBfc2lnbmFsLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4X3V0aWxzLmMKaW5kZXggMjQ3MmYxMi4uNWE4ZGVkNyAxMDA2NDQKLS0tIGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4X3V0aWxzLmMKKysrIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4X3V0aWxzLmMKQEAgLTM2LDQ4ICszNiwxNiBAQAogI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KIAotI2RlZmluZSBHU000OF9BTExPQ19TSVpFCTEwMjQKLSNkZWZpbmUgR1NNNDhfQUxMT0NfSEVBRFJPT00JMTI4Ci0KIC8qIHNob3VsZCBpcC5hY2Nlc3MgQlRTIHVzZSBkaXJlY3QgUlRQIHN0cmVhbXMgYmV0d2VlbiBlYWNoIG90aGVyICgxKSwKICAqIG9yIHNob3VsZCBPcGVuQlNDIGFsd2F5cyBhY3QgYXMgUlRQIHJlbGF5L3Byb3h5IGluIGJldHdlZW4gKDApID8gKi8KIGludCBpcGFjY19ydHBfZGlyZWN0ID0gMTsKIAotc3RydWN0IG1zZ2IgKmdzbTQ4X21zZ2JfYWxsb2Modm9pZCkKK3N0YXRpYyBpbnQgZ3NtNDhfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQogewotCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKEdTTTQ4X0FMTE9DX1NJWkUsIEdTTTQ4X0FMTE9DX0hFQURST09NLAotCQkJCSAgICJHU00gMDQuMDgiKTsKLX0KLQotaW50IGdzbTQ4X3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCi17Ci0Jc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2ctPmRhdGE7Ci0KLQkvKiBpZiB3ZSBnZXQgcGFzc2VkIGEgdHJhbnNhY3Rpb24gcmVmZXJlbmNlLCBkbyBzb21lIGNvbW1vbgotCSAqIHdvcmsgdGhhdCB0aGUgY2FsbGVyIG5vIGxvbmdlciBoYXMgdG8gZG8gKi8KLQlpZiAodHJhbnMpIHsKLQkJZ2gtPnByb3RvX2Rpc2NyID0gdHJhbnMtPnByb3RvY29sIHwgKHRyYW5zLT50cmFuc2FjdGlvbl9pZCA8PCA0KTsKLQkJbXNnLT5sY2hhbiA9IHRyYW5zLT5sY2hhbjsKLQl9Ci0KLQlpZiAobXNnLT5sY2hhbikgeworCWlmIChtc2ctPmxjaGFuKQogCQltc2ctPnRyeCA9IG1zZy0+bGNoYW4tPnRzLT50cng7CiAKLQkJaWYgKChnaC0+cHJvdG9fZGlzY3IgJiBHU000OF9QRElTQ19NQVNLKSA9PSBHU000OF9QRElTQ19DQykKLQkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAlMDJ4KSAiCi0JCQkJIlNlbmRpbmcgJyVzJyB0byBNUy5cbiIsIG1zZy0+dHJ4LT5idHMtPm5yLAotCQkJCW1zZy0+dHJ4LT5uciwgbXNnLT5sY2hhbi0+dHMtPm5yLAotCQkJCWdoLT5wcm90b19kaXNjciAmIDB4ZjAsCi0JCQkJZ3NtNDhfY2NfbXNnX25hbWUoZ2gtPm1zZ190eXBlKSk7Ci0JCWVsc2UKLQkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCBwZCAlMDJ4KSAiCi0JCQkJIlNlbmRpbmcgMHglMDJ4IHRvIE1TLlxuIiwgbXNnLT50cngtPmJ0cy0+bnIsCi0JCQkJbXNnLT50cngtPm5yLCBtc2ctPmxjaGFuLT50cy0+bnIsCi0JCQkJZ2gtPnByb3RvX2Rpc2NyLCBnaC0+bXNnX3R5cGUpOwotCX0KLQogCW1zZy0+bDNoID0gbXNnLT5kYXRhOwotCiAJcmV0dXJuIHJzbF9kYXRhX3JlcXVlc3QobXNnLCAwKTsKIH0KIApAQCAtMjI5LDU3ICsxOTcsMTMgQEAKIAkJbGNoYW4tPm5yLCBsY2hhbi0+dHlwZSk7CiAKIAkvKiBTZW5kIGFjdHVhbCByZWxlYXNlIHJlcXVlc3QgdG8gTVMgKi8KLQlnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7CisJZ3NtNDhfc2VuZG1zZyhtc2cpOwogCS8qIEZJWE1FOiBTdGFydCBUaW1lciBUMzEwOSAqLwogCiAJLyogRGVhY3RpdmF0ZSB0aGUgU0FDQ0ggb24gdGhlIEJUUyBzaWRlICovCiAJcmV0dXJuIHJzbF9kZWFjdF9zYWNjaChsY2hhbik7CiB9CiAKLS8qIENvbnZlcnQgTW9iaWxlIElkZW50aXR5ICgxMC41LjEuNCkgdG8gc3RyaW5nICovCi1pbnQgZ3NtNDhfbWlfdG9fc3RyaW5nKGNoYXIgKnN0cmluZywgY29uc3QgaW50IHN0cl9sZW4sIGNvbnN0IHVfaW50OF90ICptaSwgY29uc3QgaW50IG1pX2xlbikKLXsKLQlpbnQgaTsKLQl1X2ludDhfdCBtaV90eXBlOwotCWNoYXIgKnN0cl9jdXIgPSBzdHJpbmc7Ci0JdV9pbnQzMl90IHRtc2k7Ci0KLQltaV90eXBlID0gbWlbMF0gJiBHU01fTUlfVFlQRV9NQVNLOwotCi0Jc3dpdGNoIChtaV90eXBlKSB7Ci0JY2FzZSBHU01fTUlfVFlQRV9OT05FOgotCQlicmVhazsKLQljYXNlIEdTTV9NSV9UWVBFX1RNU0k6Ci0JCS8qIFRhYmxlIDEwLjUuNC4zLCByZXZlcnNlIGdlbmVyYXRlX21pZF9mcm9tX3Rtc2kgKi8KLQkJaWYgKG1pX2xlbiA9PSBHU000OF9UTVNJX0xFTiAmJiBtaVswXSA9PSAoMHhmMCB8IEdTTV9NSV9UWVBFX1RNU0kpKSB7Ci0JCQltZW1jcHkoJnRtc2ksICZtaVsxXSwgNCk7Ci0JCQl0bXNpID0gbnRvaGwodG1zaSk7Ci0JCQlyZXR1cm4gc25wcmludGYoc3RyaW5nLCBzdHJfbGVuLCAiJXUiLCB0bXNpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEdTTV9NSV9UWVBFX0lNU0k6Ci0JY2FzZSBHU01fTUlfVFlQRV9JTUVJOgotCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgotCQkqc3RyX2N1cisrID0gYmNkMmNoYXIobWlbMF0gPj4gNCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWlfbGVuOyBpKyspIHsKLQkJCWlmIChzdHJfY3VyICsgMiA+PSBzdHJpbmcgKyBzdHJfbGVuKQotCQkJCXJldHVybiBzdHJfY3VyIC0gc3RyaW5nOwotCQkJKnN0cl9jdXIrKyA9IGJjZDJjaGFyKG1pW2ldICYgMHhmKTsKLQkJCS8qIHNraXAgbGFzdCBuaWJibGUgaW4gbGFzdCBpbnB1dCBieXRlIHdoZW4gR1NNX0VWRU4gKi8KLQkJCWlmKCAoaSAhPSBtaV9sZW4tMSkgfHwgKG1pWzBdICYgR1NNX01JX09ERCkpCi0JCQkJKnN0cl9jdXIrKyA9IGJjZDJjaGFyKG1pW2ldID4+IDQpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQkqc3RyX2N1cisrID0gJ1wwJzsKLQotCXJldHVybiBzdHJfY3VyIC0gc3RyaW5nOwotfQotCi0KIGludCBzZW5kX3NpZW1lbnNfbXJwY2koc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCiAJCSAgICAgICB1X2ludDhfdCAqY2xhc3NtYXJrMl9sdikKIHsKQEAgLTI5NiwxNiArMjIwLDMwIEBACiAJcmV0dXJuIHJzbF9zaWVtZW5zX21ycGNpKGxjaGFuLCAmbXJwY2kpOwogfQogCi1pbnQgZ3NtNDhfcGFnaW5nX2V4dHJhY3RfbWkoc3RydWN0IG1zZ2IgKm1zZywgY2hhciAqbWlfc3RyaW5nLCB1X2ludDhfdCAqbWlfdHlwZSkKK2ludCBnc200OF9leHRyYWN0X21pKHVpbnQ4X3QgKmNsYXNzbWFyazJfbHYsIGludCBsZW5ndGgsIGNoYXIgKm1pX3N0cmluZywgdWludDhfdCAqbWlfdHlwZSkKIHsKLQlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKLQl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKLQl1X2ludDhfdCAqbWlfbHYgPSBnaC0+ZGF0YSArIDIgKyAqY2xhc3NtYXJrMl9sdjsKLQkqbWlfdHlwZSA9IG1pX2x2WzFdICYgR1NNX01JX1RZUEVfTUFTSzsKKwkvKiBDaGVjayB0aGUgc2l6ZSBmb3IgdGhlIGNsYXNzbWFyayAqLworCWlmIChsZW5ndGggPCAxICsgKmNsYXNzbWFyazJfbHYpCisJCXJldHVybiAtMTsKIAorCXVfaW50OF90ICptaV9sdiA9IGNsYXNzbWFyazJfbHYgKyAqY2xhc3NtYXJrMl9sdiArIDE7CisJaWYgKGxlbmd0aCA8IDIgKyAqY2xhc3NtYXJrMl9sdiArIG1pX2x2WzBdKQorCQlyZXR1cm4gLTI7CisKKwkqbWlfdHlwZSA9IG1pX2x2WzFdICYgR1NNX01JX1RZUEVfTUFTSzsKIAlyZXR1cm4gZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgR1NNNDhfTUlfU0laRSwgbWlfbHYrMSwgKm1pX2x2KTsKIH0KIAoraW50IGdzbTQ4X3BhZ2luZ19leHRyYWN0X21pKHN0cnVjdCBnc200OF9wYWdfcmVzcCAqcmVzcCwgaW50IGxlbmd0aCwKKwkJCSAgICBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKQoreworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBjbGFzc21hcmtfb2Zmc2V0ID0KKwkJb2Zmc2V0b2Yoc3RydWN0IGdzbTQ4X3BhZ19yZXNwLCBjbGFzc21hcmsyKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9ICh1aW50OF90ICopICZyZXNwLT5jbGFzc21hcmsyOworCXJldHVybiBnc200OF9leHRyYWN0X21pKGNsYXNzbWFyazJfbHYsIGxlbmd0aCAtIGNsYXNzbWFya19vZmZzZXQsCisJCQkJbWlfc3RyaW5nLCBtaV90eXBlKTsKK30KKwogaW50IGdzbTQ4X2hhbmRsZV9wYWdpbmdfcmVzcChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKIHsKIAlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOwpAQCAtMzE2LDIzICsyNTQsMjMgQEAKIAlpZiAoaXNfc2llbWVuc19idHMoYnRzKSkKIAkJc2VuZF9zaWVtZW5zX21ycGNpKG1zZy0+bGNoYW4sIGNsYXNzbWFyazJfbHYpOwogCi0JaWYgKCFtc2ctPmxjaGFuLT5zdWJzY3IpIHsKLQkJbXNnLT5sY2hhbi0+c3Vic2NyID0gc3Vic2NyOwotCX0gZWxzZSBpZiAobXNnLT5sY2hhbi0+c3Vic2NyICE9IHN1YnNjcikgeworCWlmICghbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPSBzdWJzY3I7CisJfSBlbHNlIGlmIChtc2ctPmxjaGFuLT5jb25uLnN1YnNjciAhPSBzdWJzY3IpIHsKIAkJTE9HUChEUlIsIExPR0xfRVJST1IsICI8LSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgc29tZW9uZSBlbHNlP1xuIik7CiAJCXN1YnNjcl9wdXQoc3Vic2NyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKIAkJREVCVUdQKERSUiwgIjwtIENoYW5uZWwgYWxyZWFkeSBvd25lZCBieSB1c1xuIik7CiAJCXN1YnNjcl9wdXQoc3Vic2NyKTsKLQkJc3Vic2NyID0gbXNnLT5sY2hhbi0+c3Vic2NyOworCQlzdWJzY3IgPSBtc2ctPmxjaGFuLT5jb25uLnN1YnNjcjsKIAl9CiAKIAlzaWdfZGF0YS5zdWJzY3IgPSBzdWJzY3I7CiAJc2lnX2RhdGEuYnRzCT0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOwogCXNpZ19kYXRhLmxjaGFuCT0gbXNnLT5sY2hhbjsKIAotCWJ0cy0+bmV0d29yay0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCsrOworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCk7CiAKIAlkaXNwYXRjaF9zaWduYWwoU1NfUEFHSU5HLCBTX1BBR0lOR19TVUNDRUVERUQsICZzaWdfZGF0YSk7CiAKQEAgLTQwNyw3ICszNDUsNyBAQAogCiAJLyogRklYTUU6IG9wdGlvbmFsIGJpdHMgZm9yIHR5cGUgb2Ygc3luY2hyb25pemF0aW9uPyAqLwogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2cpOwogfQogCiAvKiBDaGFwdGVyIDkuMS4yOiBBc3NpZ25tZW50IENvbW1hbmQgKi8KQEAgLTQ1MCw3ICszODgsNyBAQAogCQl9CiAJfQogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2cpOwogfQogCiAvKiA5LjEuNSBDaGFubmVsIG1vZGUgbW9kaWZ5OiBNb2RpZnkgdGhlIG1vZGUgb24gdGhlIE1TIHNpZGUgKi8KQEAgLTQ5MSw3ICs0MjksNyBAQAogCQl9CiAJfQogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2cpOwogfQogCiBpbnQgZ3NtNDhfbGNoYW5fbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsY2hhbl9tb2RlKQpAQCAtNjI2LDQgKzU2NCwzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzExLmMgYi9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYwppbmRleCA4ODFjMzc1Li44YTg1OTMzIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYworKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYwpAQCAtNCw2ICs0LDggQEAKIAogLyogKEMpIDIwMDggYnkgRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CiAgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMTAgYnkgT24gV2F2ZXMKICAqCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAgKgpAQCAtMjQsNiArMjYsNyBAQAogICovCiAKIAorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC00NywxMiArNTAsMTEgQEAKICNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgogI2luY2x1ZGUgPG9wZW5ic2MvYnNjX3JsbC5oPgogI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX2FwaS5oPgogCiAjZGVmaW5lIEdTTTQxMV9BTExPQ19TSVpFCTEwMjQKICNkZWZpbmUgR1NNNDExX0FMTE9DX0hFQURST09NCTEyOAogCi0jZGVmaW5lIFVNX1NBUElfU01TIDMJLyogU2VlIEdTTSAwNC4wNS8wNC4wNiAqLwotCiB2b2lkICp0YWxsX2dzbXNfY3R4Owogc3RhdGljIHVfaW50MzJfdCBuZXdfY2FsbHJlZiA9IDB4NDAwMDAwMDE7CiAKQEAgLTYzLDcgKzY1LDcgQEAKIAl7IEdTTTQxMV9DUF9DQVVTRV9TRU1BTlRfSU5DX01TRywgIlNlbWFudGljYWxseSBJbmNvcnJlY3QgTWVzc2FnZSIgfSwKIAl7IEdTTTQxMV9DUF9DQVVTRV9JTlZfTUFORF9JTkYsCSJJbnZhbGlkIE1hbmRhdG9yeSBJbmZvcm1hdGlvbiIgfSwKIAl7IEdTTTQxMV9DUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNULCAiTWVzc2FnZSBUeXBlIGRvZXNuJ3QgZXhpc3QiIH0sCi0JeyBHU000MTFfQ1BfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSwgCisJeyBHU000MTFfQ1BfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSwKIAkJCQkiTWVzc2FnZSBpbmNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKIAl7IEdTTTQxMV9DUF9DQVVTRV9JRV9OT1RFWElTVCwJIklFIGRvZXMgbm90IGV4aXN0IiB9LAogCXsgR1NNNDExX0NQX0NBVVNFX1BST1RPQ09MX0VSUiwJIlByb3RvY29sIEVycm9yIiB9LApAQCAtMTE1LDIyICsxMTcsMzAgQEAKIAl0YWxsb2NfZnJlZShzbXMpOwogfQogCisvKgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIGFsbCBTTVMgdG8gYSBnaXZlbiBzdWJzY3JpYmVyCisgKiBvbiBhIGdpdmVuIGNvbm5lY3Rpb24gaGFzIGJlZW4gc2VudC4gVGhpcyB3aWxsIGluZm9ybSB0aGUgaGlnaGVyCisgKiBsYXllcnMgdGhhdCBhIGNoYW5uZWwgY2FuIGJlIGdpdmVuIHVwLgorICovCitzdGF0aWMgdm9pZCBnc200MTFfcmVsZWFzZV9jb25uKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uKQoreworCWlmICghY29ubi0+bGNoYW4pCisJCXJldHVybjsKKworCXN1YnNjcl9wdXRfY2hhbm5lbChjb25uLT5sY2hhbik7Cit9CisKIHN0cnVjdCBtc2diICpnc200MTFfbXNnYl9hbGxvYyh2b2lkKQogewogCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKEdTTTQxMV9BTExPQ19TSVpFLCBHU000MTFfQUxMT0NfSEVBRFJPT00sCiAJCQkJICAgIkdTTSAwNC4xMSIpOwogfQogCi1zdGF0aWMgaW50IGdzbTQxMV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpCitzdGF0aWMgaW50IGdzbTQxMV9zZW5kbXNnKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQogewotCWlmIChtc2ctPmxjaGFuKQotCQltc2ctPnRyeCA9IG1zZy0+bGNoYW4tPnRzLT50cng7Ci0KLQltc2ctPmwzaCA9IG1zZy0+ZGF0YTsKLQogCURFQlVHUChEU01TLCAiR1NNNC4xMSBUWCAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7Ci0KLQlyZXR1cm4gcnNsX2RhdGFfcmVxdWVzdChtc2csIGxpbmtfaWQpOworCW1zZy0+bDNoID0gbXNnLT5kYXRhOworCXJldHVybiBnc20wODA4X3N1Ym1pdF9kdGFwKGNvbm4sIG1zZywgbGlua19pZCk7CiB9CiAKIC8qIFNNQyBUQzEqIGlzIGV4cGlyZWQgKi8KQEAgLTE1NCw5ICsxNjQsNiBAQAogCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQ8PDQpOwogCWdoLT5tc2dfdHlwZSA9IG1zZ190eXBlOwogCi0JLyogYXNzaWduIHRoZSBvdXRnb2luZyBsY2hhbiAqLwotCW1zZy0+bGNoYW4gPSB0cmFucy0+bGNoYW47Ci0KIAkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgKi8KIAlzd2l0Y2ggKGdoLT5tc2dfdHlwZSkgewogCWNhc2UgR1NNNDExX01UX0NQX0RBVEE6CkBAIC0xNzksNyArMTg2LDcgQEAKIAogCURFQlVHUEMoRFNNUywgInRyYW5zPSV4XG4iLCB0cmFucy0+dHJhbnNhY3Rpb25faWQpOwogCi0JcmV0dXJuIGdzbTQxMV9zZW5kbXNnKG1zZywgdHJhbnMtPnNtcy5saW5rX2lkKTsKKwlyZXR1cm4gZ3NtNDExX3NlbmRtc2codHJhbnMtPmNvbm4sIG1zZywgdHJhbnMtPnNtcy5saW5rX2lkKTsKIH0KIAogLyogUHJlZml4IG1zZyB3aXRoIGEgUlAtREFUQSBoZWFkZXIgYW5kIHNlbmQgYXMgQ1AtREFUQSAqLwpAQCAtMjE1LDcgKzIyMiw3IEBACiAJdV9pbnQ4X3QgcmV0OwogCiAJaWYgKCh2YWx1ZSAmIDB4MEYpID4gOSB8fCAodmFsdWUgPj4gNCkgPiA5KQotCQlMT0dQKERTTVMsIExPR0xfRVJST1IsIAorCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCiAJCSAgICAgInVuYmNkaWZ5IGdvdCB0b28gYmlnIG5pYmJsZTogMHglMDJYXG4iLCB2YWx1ZSk7CiAKIAlyZXQgPSAodmFsdWUmMHgwRikqMTA7CkBAIC0zNzUsOSArMzgyLDExIEBACiAJZW51bSBzbXNfYWxwaGFiZXQgYWxwaGEgPSBEQ1NfTk9ORTsKIAogCWlmICgoY2diaXRzICYgMHhjKSA9PSAwKSB7Ci0JCWlmIChjZ2JpdHMgJiAyKQorCQlpZiAoY2diaXRzICYgMikgewogCQkJTE9HUChEU01TLCBMT0dMX05PVElDRSwKIAkJCSAgICAgIkNvbXByZXNzZWQgU01TIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKKwkJCXJldHVybiAweGZmZmZmZmZmOworCQl9CiAKIAkJc3dpdGNoICgoZGNzID4+IDIpJjB4MDMpIHsKIAkJY2FzZSAwOgpAQCAtNDEyLDggKzQyMSw2IEBACiAJfQogCS8qIGRpc3BhdGNoIGEgc2lnbmFsIHRvIHRlbGwgaGlnaGVyIGxldmVsIGFib3V0IGl0ICovCiAJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgU19TTVNfU1VCTUlUVEVELCBnc21zKTsKLQkvKiB0cnkgZGVsaXZlcmluZyB0aGUgU01TIHJpZ2h0IG5vdyAqLwotCS8vZ3NtNDExX3NlbmRfc21zX3N1YnNjcihnc21zLT5yZWNlaXZlciwgZ3Ntcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1NywxMSArNDY0LDYgQEAKIAkvKiBUUC1VREhJIChpbmRpY2F0aW5nIFRQLVVEIGNvbnRhaW5zIGEgaGVhZGVyKSAqLwogCWlmIChzbXMtPnVkX2hkcl9pbmQpCiAJCSpzbXNwIHw9IDB4NDA7Ci0jaWYgMAotCS8qIFRQLVJQIChpbmRpY2F0aW5nIHRoYXQgYSByZXBseSBwYXRoIGV4aXN0cykgKi8KLQlpZiAoc21zLT4KLQkJKnNtc3AgfD0gMHg4MDsKLSNlbmRpZgogCQogCS8qIGdlbmVyYXRlIG9yaWdpbmF0b3IgYWRkcmVzcyAqLwogCW9hX2xlbiA9IGdzbTM0MF9nZW5fb2Eob2EsIHNpemVvZihvYSksIHNtcy0+c2VuZGVyKTsKQEAgLTUwOSwxMSArNTExLDEwIEBACiAJcmV0dXJuIG1zZy0+bGVuIC0gb2xkX21zZ19sZW47CiB9CiAKLS8qIHByb2Nlc3MgYW4gaW5jb21pbmcgVFBEVSAoY2FsbGVkIGZyb20gUlAtREFUQSkgCi0gKiByZXR1cm4gdmFsdWUgPiAwOiBSUCBDQVVTRSBmb3IgRVJST1I7IDwgMDogc2lsZW50IGVycm9yOyAwID0gc3VjY2VzcyAqLyAKLXN0YXRpYyBpbnQgZ3NtMzQwX3J4X3RwZHUoc3RydWN0IG1zZ2IgKm1zZykKKy8qIHByb2Nlc3MgYW4gaW5jb21pbmcgVFBEVSAoY2FsbGVkIGZyb20gUlAtREFUQSkKKyAqIHJldHVybiB2YWx1ZSA+IDA6IFJQIENBVVNFIGZvciBFUlJPUjsgPCAwOiBzaWxlbnQgZXJyb3I7IDAgPSBzdWNjZXNzICovCitzdGF0aWMgaW50IGdzbTM0MF9yeF90cGR1KHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnKQogewotCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CiAJdV9pbnQ4X3QgKnNtc3AgPSBtc2diX3Ntcyhtc2cpOwogCXN0cnVjdCBnc21fc21zICpnc21zOwogCXVfaW50OF90IHNtc19tdGksIHNtc19tbXMsIHNtc192cGYsIHNtc19hbHBoYWJldCwgc21zX3JwOwpAQCAtNTIyLDcgKzUyMyw3IEBACiAJdV9pbnQ4X3QgYWRkcmVzc19sdlsxMl07IC8qIGFjY29yZGluZyB0byAwMy40MCAvIDkuMS4yLjUgKi8KIAlpbnQgcmMgPSAwOwogCi0JY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5zbXMuc3VibWl0dGVkKTsKKwljb3VudGVyX2luYyhjb25uLT5idHMtPm5ldHdvcmstPnN0YXRzLnNtcy5zdWJtaXR0ZWQpOwogCiAJZ3NtcyA9IHNtc19hbGxvYygpOwogCWlmICghZ3NtcykKQEAgLTU1OCw2ICs1NTksMTAgQEAKIAlnc21zLT5kYXRhX2NvZGluZ19zY2hlbWUgPSAqc21zcCsrOwogCiAJc21zX2FscGhhYmV0ID0gZ3NtMzM4X2dldF9zbXNfYWxwaGFiZXQoZ3Ntcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lKTsKKwlpZiAoc21zX2FscGhhYmV0ID09IDB4ZmZmZmZmZmYpIHsKKwkJc21zX2ZyZWUoZ3Ntcyk7CisJCXJldHVybiBHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUjsKKwl9CiAKIAlzd2l0Y2ggKHNtc192cGYpIHsKIAljYXNlIEdTTTM0MF9UUF9WUEZfUkVMQVRJVkU6CkBAIC01NzUsNyArNTgwLDcgQEAKIAkJc21zX3ZwID0gMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgCisJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsCiAJCSAgICAgIlNNUyBWYWxpZGl0eSBwZXJpb2Qgbm90IGltcGxlbWVudGVkOiAweCUwMnhcbiIsIHNtc192cGYpOwogCQlyZXR1cm4gR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVI7CiAJfQpAQCAtNTk0LDcgKzU5OSw3IEBACiAJCX0KIAl9CiAKLQlnc21zLT5zZW5kZXIgPSBzdWJzY3JfZ2V0KG1zZy0+bGNoYW4tPnN1YnNjcik7CisJZ3Ntcy0+c2VuZGVyID0gc3Vic2NyX2dldChtc2ctPmxjaGFuLT5jb25uLnN1YnNjcik7CiAKIAlMT0dQKERTTVMsIExPR0xfSU5GTywgIlJYIFNNUzogU2VuZGVyOiAlcywgTVRJOiAweCUwMngsIFZQRjogMHglMDJ4LCAiCiAJICAgICAiTVI6IDB4JTAyeCBQSUQ6IDB4JTAyeCwgRENTOiAweCUwMngsIERBOiAlcywgIgpAQCAtNjAyLDcgKzYwNyw3IEBACiAJICAgICBzdWJzY3JfbmFtZShnc21zLT5zZW5kZXIpLCBzbXNfbXRpLCBzbXNfdnBmLCBnc21zLT5tc2dfcmVmLAogCSAgICAgZ3Ntcy0+cHJvdG9jb2xfaWQsIGdzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSwgZ3Ntcy0+ZGVzdF9hZGRyLAogCSAgICAgZ3Ntcy0+dXNlcl9kYXRhX2xlbiwKLQkJCXNtc19hbHBoYWJldCA9PSBEQ1NfN0JJVF9ERUZBVUxUID8gZ3Ntcy0+dGV4dCA6IAorCQkJc21zX2FscGhhYmV0ID09IERDU183QklUX0RFRkFVTFQgPyBnc21zLT50ZXh0IDoKIAkJCQloZXhkdW1wKGdzbXMtPnVzZXJfZGF0YSwgZ3Ntcy0+dXNlcl9kYXRhX2xlbikpOwogCiAJZ3Ntcy0+dmFsaWRpdHlfbWludXRlcyA9IGdzbTM0MF92YWxpZGl0eV9wZXJpb2Qoc21zX3ZwZiwgc21zX3ZwKTsKQEAgLTYxMCwxMCArNjE1LDEwIEBACiAJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgMCwgZ3Ntcyk7CiAKIAkvKiBkZXRlcm1pbmUgZ3Ntcy0+cmVjZWl2ZXIgYmFzZWQgb24gZGlhbGxlZCBudW1iZXIgKi8KLQlnc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKGJ0cy0+bmV0d29yaywgZ3Ntcy0+ZGVzdF9hZGRyKTsKKwlnc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKGNvbm4tPmJ0cy0+bmV0d29yaywgZ3Ntcy0+ZGVzdF9hZGRyKTsKIAlpZiAoIWdzbXMtPnJlY2VpdmVyKSB7CiAJCXJjID0gMTsgLyogY2F1c2UgMTogdW5rbm93biBzdWJzY3JpYmVyICovCi0JCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuc21zLm5vX3JlY2VpdmVyKTsKKwkJY291bnRlcl9pbmMoY29ubi0+YnRzLT5uZXR3b3JrLT5zdGF0cy5zbXMubm9fcmVjZWl2ZXIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTY4MywxMSArNjg4LDExIEBACiAJCQkJICAgICBHU000MTFfUlBfQ0FVU0VfSU5WX01BTkRfSU5GKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCW1zZy0+c21zaCA9IHRwZHU7CisJbXNnLT5sNGggPSB0cGR1OwogCiAJREVCVUdQKERTTVMsICJEU1QoJXUsJXMpXG4iLCBkc3RfbGVuLCBoZXhkdW1wKGRzdCwgZHN0X2xlbikpOwogCi0JcmMgPSBnc20zNDBfcnhfdHBkdShtc2cpOworCXJjID0gZ3NtMzQwX3J4X3RwZHUodHJhbnMtPmNvbm4sIG1zZyk7CiAJaWYgKHJjID09IDApCiAJCXJldHVybiBnc200MTFfc2VuZF9ycF9hY2sodHJhbnMsIHJwaC0+bXNnX3JlZik7CiAJZWxzZSBpZiAocmMgPiAwKQpAQCAtNzUzLDI0ICs3NTgsMjMgQEAKIAl0cmFucy0+c21zLnNtcyA9IE5VTEw7CiAKIAkvKiBjaGVjayBmb3IgbW9yZSBtZXNzYWdlcyBmb3IgdGhpcyBzdWJzY3JpYmVyICovCi0Jc21zID0gZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihtc2ctPmxjaGFuLT5zdWJzY3IpOworCWFzc2VydChtc2ctPmxjaGFuLT5jb25uLnN1YnNjciA9PSB0cmFucy0+c3Vic2NyKTsKKworCXNtcyA9IGRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3IodHJhbnMtPnN1YnNjcik7CiAJaWYgKHNtcykKLQkJZ3NtNDExX3NlbmRfc21zX2xjaGFuKG1zZy0+bGNoYW4sIHNtcyk7CisJCWdzbTQxMV9zZW5kX3Ntc19sY2hhbih0cmFucy0+Y29ubiwgc21zKTsKKwllbHNlCisJCWdzbTQxMV9yZWxlYXNlX2Nvbm4odHJhbnMtPmNvbm4pOwogCiAJLyogZnJlZSB0aGUgdHJhbnNhY3Rpb24gaGVyZSAqLwogCXRyYW5zX2ZyZWUodHJhbnMpOwotCi0JLyogcmVsZWFzZSBjaGFubmVsIGlmIGRvbmUgKi8KLQlpZiAoIXNtcykKLQkJcnNsX3JlbGVhc2VfcmVxdWVzdChtc2ctPmxjaGFuLCB0cmFucy0+c21zLmxpbmtfaWQpOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX2Vycm9yKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAogCQkJICAgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKIHsKLQlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHRyYW5zLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gdHJhbnMtPmNvbm4tPmJ0cy0+bmV0d29yazsKIAlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gdHJhbnMtPnNtcy5zbXM7CiAJdV9pbnQ4X3QgY2F1c2VfbGVuID0gcnBoLT5kYXRhWzBdOwogCXVfaW50OF90IGNhdXNlID0gcnBoLT5kYXRhWzFdOwpAQCAtNzgwLDcgKzc4NCw3IEBACiAJICogdGhlIGNhdXNlIGFuZCB0YWtlIGFjdGlvbiBkZXBlbmRpbmcgb24gaXQgKi8KIAogCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICIlczogUlggU01TIFJQLUVSUk9SLCBjYXVzZSAlZDolZCAoJXMpXG4iLAotCSAgICAgc3Vic2NyX25hbWUobXNnLT5sY2hhbi0+c3Vic2NyKSwgY2F1c2VfbGVuLCBjYXVzZSwKKwkgICAgIHN1YnNjcl9uYW1lKHRyYW5zLT5jb25uLT5zdWJzY3IpLCBjYXVzZV9sZW4sIGNhdXNlLAogCSAgICAgZ2V0X3ZhbHVlX3N0cmluZyhycF9jYXVzZV9zdHJzLCBjYXVzZSkpOwogCiAJaWYgKCF0cmFucy0+c21zLmlzX210KSB7CkBAIC04MTMsOCArODE3LDYgQEAKIAlzbXNfZnJlZShzbXMpOwogCXRyYW5zLT5zbXMuc21zID0gTlVMTDsKIAotCS8vdHJhbnNfZnJlZSh0cmFucyk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODMzLDExICs4MzUsMTIgQEAKIAlkaXNwYXRjaF9zaWduYWwoU1NfU01TLCBTX1NNU19TTU1BLCB0cmFucy0+c3Vic2NyKTsKIAogCS8qIGNoZWNrIGZvciBtb3JlIG1lc3NhZ2VzIGZvciB0aGlzIHN1YnNjcmliZXIgKi8KLQlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKG1zZy0+bGNoYW4tPnN1YnNjcik7CisJYXNzZXJ0KG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyID09IHRyYW5zLT5zdWJzY3IpOworCXNtcyA9IGRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3IodHJhbnMtPnN1YnNjcik7CiAJaWYgKHNtcykKLQkJZ3NtNDExX3NlbmRfc21zX2xjaGFuKG1zZy0+bGNoYW4sIHNtcyk7CisJCWdzbTQxMV9zZW5kX3Ntc19sY2hhbih0cmFucy0+Y29ubiwgc21zKTsKIAllbHNlCi0JCXJzbF9yZWxlYXNlX3JlcXVlc3QobXNnLT5sY2hhbiwgdHJhbnMtPnNtcy5saW5rX2lkKTsKKwkJZ3NtNDExX3JlbGVhc2VfY29ubih0cmFucy0+Y29ubik7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC05MjAsMTYgKzkyMywxNiBAQAogCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOwogCWludCByYyA9IDA7CiAKLQlpZiAoIWxjaGFuLT5zdWJzY3IpCisJaWYgKCFsY2hhbi0+Y29ubi5zdWJzY3IpCiAJCXJldHVybiAtRUlPOwogCQkvKiBGSVhNRTogc2VuZCBzb21lIGVycm9yIG1lc3NhZ2UgKi8KIAogCURFQlVHUChEU01TLCAidHJhbnNfaWQ9JXggIiwgdHJhbnNhY3Rpb25faWQpOwotCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsCisJdHJhbnMgPSB0cmFuc19maW5kX2J5X2lkKGxjaGFuLT5jb25uLnN1YnNjciwgR1NNNDhfUERJU0NfU01TLAogCQkJCSB0cmFuc2FjdGlvbl9pZCk7CiAJaWYgKCF0cmFucykgewogCQlERUJVR1BDKERTTVMsICIobmV3KSAiKTsKLQkJdHJhbnMgPSB0cmFuc19hbGxvYyhsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsCisJCXRyYW5zID0gdHJhbnNfYWxsb2MobGNoYW4tPmNvbm4uc3Vic2NyLCBHU000OF9QRElTQ19TTVMsCiAJCQkJICAgIHRyYW5zYWN0aW9uX2lkLCBuZXdfY2FsbHJlZisrKTsKIAkJaWYgKCF0cmFucykgewogCQkJREVCVUdQQyhEU01TLCAiTm8gbWVtb3J5IGZvciB0cmFuc1xuIik7CkBAIC05NDEsOCArOTQ0LDggQEAKIAkJdHJhbnMtPnNtcy5pc19tdCA9IDA7CiAJCXRyYW5zLT5zbXMubGlua19pZCA9IGxpbmtfaWQ7CiAKLQkJdHJhbnMtPmxjaGFuID0gbGNoYW47Ci0JCXVzZV9sY2hhbihsY2hhbik7CisJCXRyYW5zLT5jb25uID0gJmxjaGFuLT5jb25uOworCQl1c2Vfc3Vic2NyX2Nvbih0cmFucy0+Y29ubik7CiAJfQogCiAJc3dpdGNoKG1zZ190eXBlKSB7CkBAIC05NjEsNyArOTY0LDcgQEAKIAkJCQlpZiAoaSA9PSB0cmFuc2FjdGlvbl9pZCkKIAkJCQkJY29udGludWU7CiAKLQkJCQlwdHJhbnMgPSB0cmFuc19maW5kX2J5X2lkKGxjaGFuLT5zdWJzY3IsCisJCQkJcHRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+Y29ubi5zdWJzY3IsCiAJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBHU000OF9QRElTQ19TTVMsIGkpOwogCQkJCWlmICghcHRyYW5zKQogCQkJCQljb250aW51ZTsKQEAgLTEwMDMsNyArMTAwNiw3IEBACiAJCWJzY19kZWxfdGltZXIoJnRyYW5zLT5zbXMuY3BfdGltZXIpOwogCiAJCWlmICghdHJhbnMtPnNtcy5pc19tdCkgewotCQkJLyogRklYTUU6IHdlIGhhdmUgc29udCBvbmUgQ1AtREFUQSwgd2hpY2ggd2FzIG5vdworCQkJLyogRklYTUU6IHdlIGhhdmUgc2VudCBvbmUgQ1AtREFUQSwgd2hpY2ggd2FzIG5vdwogCQkJICogYWNrbm93bGVkZ2VkLiAgQ2hlY2sgaWYgd2Ugd2FudCB0byB0cmFuc2ZlciBtb3JlLAogCQkJICogaS5lLiBtdWx0aS1wYXJ0IG1lc3NhZ2UgKi8KIAkJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CkBAIC0xMDI4LDIwICsxMDMxLDEwIEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWYgMAotLyogVGVzdCBUUERVIC0gQUxMIFlPVVIgKi8KLXN0YXRpYyB1X2ludDhfdCB0cGR1X3Rlc3RbXSA9IHsKLQkweDA0LCAweDA0LCAweDgxLCAweDMyLCAweDI0LCAweDAwLCAweDAwLCAweDgwLCAweDIxLCAweDAzLCAweDQxLCAweDI0LAotCTB4MzIsIDB4NDAsIDB4MUYsIDB4NDEsIDB4MjYsIDB4MTMsIDB4OTQsIDB4N0QsIDB4NTYsIDB4QTUsIDB4MjAsIDB4MjgsCi0JMHhGMiwgMHhFOSwgMHgyQywgMHg4MiwgMHg4MiwgMHhEMiwgMHgyMiwgMHg0OCwgMHg1OCwgMHg2NCwgMHgzRSwgMHg5RCwKLQkweDQ3LCAweDEwLCAweEY1LCAweDA5LCAweEFBLCAweDRFLCAweDAxCi19OwotI2VuZGlmCi0KIC8qIFRha2UgYSBTTVMgaW4gZ3NtX3NtcyBzdHJ1Y3R1cmUgYW5kIHNlbmQgaXQgdGhyb3VnaCBhbiBhbHJlYWR5CiAgKiBleGlzdGluZyBsY2hhbi4gV2UgYWxzbyBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGVuc3VyZWQgdGhpcyBsY2hhbiBhbHJlYWR5CiAgKiBoYXMgYSBTQVBJMyBSTEwgY29ubmVjdGlvbiEgKi8KLWludCBnc200MTFfc2VuZF9zbXNfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fc21zICpzbXMpCitpbnQgZ3NtNDExX3NlbmRfc21zX2xjaGFuKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgZ3NtX3NtcyAqc21zKQogewogCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOwogCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOwpAQCAtMTA1MCwyMSArMTA0MywyMSBAQAogCWludCB0cmFuc2FjdGlvbl9pZDsKIAlpbnQgcmM7CiAKLQl0cmFuc2FjdGlvbl9pZCA9IHRyYW5zX2Fzc2lnbl90cmFuc19pZChsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsIDApOworCXRyYW5zYWN0aW9uX2lkID0gdHJhbnNfYXNzaWduX3RyYW5zX2lkKGNvbm4tPnN1YnNjciwgR1NNNDhfUERJU0NfU01TLCAwKTsKIAlpZiAodHJhbnNhY3Rpb25faWQgPT0gLTEpIHsKIAkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiTm8gYXZhaWxhYmxlIHRyYW5zYWN0aW9uIGlkc1xuIik7CisJCXNtc19mcmVlKHNtcyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JbXNnLT5sY2hhbiA9IGxjaGFuOwotCiAJREVCVUdQKERTTVMsICJzZW5kX3Ntc19sY2hhbigpXG4iKTsKIAogCS8qIEZJWE1FOiBhbGxvY2F0ZSB0cmFuc2FjdGlvbiB3aXRoIG1lc3NhZ2UgcmVmZXJlbmNlICovCi0JdHJhbnMgPSB0cmFuc19hbGxvYyhsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsCisJdHJhbnMgPSB0cmFuc19hbGxvYyhjb25uLT5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKIAkJCSAgICB0cmFuc2FjdGlvbl9pZCwgbmV3X2NhbGxyZWYrKyk7CiAJaWYgKCF0cmFucykgewogCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJObyBtZW1vcnkgZm9yIHRyYW5zXG4iKTsKKwkJc21zX2ZyZWUoc21zKTsKIAkJLyogRklYTUU6IHNlbmQgc29tZSBlcnJvciBtZXNzYWdlICovCiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTEwNzQsOCArMTA2Nyw4IEBACiAJdHJhbnMtPnNtcy5zbXMgPSBzbXM7CiAJdHJhbnMtPnNtcy5saW5rX2lkID0gVU1fU0FQSV9TTVM7CS8qIEZJWE1FOiBtYWluIG9yIFNBQ0NIID8gKi8KIAotCXRyYW5zLT5sY2hhbiA9IGxjaGFuOwotCXVzZV9sY2hhbihsY2hhbik7CisJdHJhbnMtPmNvbm4gPSBjb25uOworCXVzZV9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKIAogCS8qIEhhcmRjb2RlIFNNU0MgT3JpZ2luYXRpbmcgQWRkcmVzcyBmb3Igbm93ICovCiAJZGF0YSA9ICh1X2ludDhfdCAqKW1zZ2JfcHV0KG1zZywgOCk7CkBAIC0xMDk1LDUxICsxMDg4LDI1IEBACiAJLyogb2J0YWluIGEgcG9pbnRlciBmb3IgdGhlIHJwX3VkX2xlbiwgc28gd2UgY2FuIGZpbGwgaXQgbGF0ZXIgKi8KIAlycF91ZF9sZW4gPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDEpOwogCi0jaWYgMQogCS8qIGdlbmVyYXRlIHRoZSAwMy40MCBUUERVICovCiAJcmMgPSBnc20zNDBfZ2VuX3RwZHUobXNnLCBzbXMpOwogCWlmIChyYyA8IDApIHsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXNtc19mcmVlKHNtcyk7CiAJCW1zZ2JfZnJlZShtc2cpOwogCQlyZXR1cm4gcmM7CiAJfQogCiAJKnJwX3VkX2xlbiA9IHJjOwotI2Vsc2UKLQlkYXRhID0gbXNnYl9wdXQobXNnLCBzaXplb2YodHBkdV90ZXN0KSk7Ci0JbWVtY3B5KGRhdGEsIHRwZHVfdGVzdCwgc2l6ZW9mKHRwZHVfdGVzdCkpOwotCSpycF91ZF9sZW4gPSBzaXplb2YodHBkdV90ZXN0KTsKLSNlbmRpZgogCiAJREVCVUdQKERTTVMsICJUWDogU01TIERFTElWRVJcbiIpOwogCi0JY291bnRlcl9pbmMobGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuc21zLmRlbGl2ZXJlZCk7CisJY291bnRlcl9pbmMoY29ubi0+YnRzLT5uZXR3b3JrLT5zdGF0cy5zbXMuZGVsaXZlcmVkKTsKIAogCXJldHVybiBnc200MTFfcnBfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfUlBfREFUQV9NVCwgbXNnX3JlZik7CiAJLyogRklYTUU6IGVudGVyICd3YWl0IGZvciBSUC1BQ0snIHN0YXRlLCBzdGFydCBUUjFOICovCiB9CiAKLS8qIFJMTCBTQVBJMyBlc3RhYmxpc2ggY2FsbGJhY2suIE5vdyB3ZSBoYXZlIGEgUkxMIGNvbm5lY3Rpb24gYW5kCi0gKiBjYW4gZGVsaXZlciB0aGUgYWN0dWFsIG1lc3NhZ2UgKi8KLXN0YXRpYyB2b2lkIHJsbF9pbmRfY2Ioc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsCi0JCQl2b2lkICpfc21zLCBlbnVtIGJzY19ybGxyX2luZCB0eXBlKQotewotCXN0cnVjdCBnc21fc21zICpzbXMgPSBfc21zOwotCi0JREVCVUdQKERTTVMsICJybGxfaW5kX2NiKGxjaGFuPSVwLCBsaW5rX2lkPSV1LCBzbXM9JXAsIHR5cGU9JXVcbiIsCi0JCWxjaGFuLCBsaW5rX2lkLCBzbXMsIHR5cGUpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBCU0NfUkxMUl9JTkRfRVNUX0NPTkY6Ci0JCWdzbTQxMV9zZW5kX3Ntc19sY2hhbihsY2hhbiwgc21zKTsKLQkJYnJlYWs7Ci0JY2FzZSBCU0NfUkxMUl9JTkRfUkVMX0lORDoKLQljYXNlIEJTQ19STExSX0lORF9FUlJfSU5EOgotCWNhc2UgQlNDX1JMTFJfSU5EX1RJTUVPVVQ6Ci0JCXNtc19mcmVlKHNtcyk7Ci0JCWJyZWFrOwotCX0KLX0KLQogLyogcGFnaW5nIGNhbGxiYWNrLiBIZXJlIHdlIGdldCBjYWxsZWQgaWYgcGFnaW5nIGEgc3Vic2NyaWJlciBoYXMKICAqIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCiBzdGF0aWMgaW50IHBhZ2luZ19jYl9zZW5kX3Ntcyh1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LApAQCAtMTE0Nyw3ICsxMTE0LDcgQEAKIHsKIAlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IF9sY2hhbjsKIAlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gX3NtczsKLQlpbnQgcmM7CisJaW50IHJjID0gMDsKIAogCURFQlVHUChEU01TLCAicGFnaW5nX2NiX3NlbmRfc21zKGhvb2tudW09JXUsIGV2ZW50PSV1LCBtc2c9JXAsIgogCQkibGNoYW49JXAsIHNtcz0lcClcbiIsIGhvb2tudW0sIGV2ZW50LCBtc2csIGxjaGFuLCBzbXMpOwpAQCAtMTE1NywyMiArMTEyNCwxNCBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgR1NNX1BBR0lOR19TVUNDRUVERUQ6Ci0JCS8qIFBhZ2luZyBhYm9ydGVkIHdpdGhvdXQgbGNoYW4gPyE/ICovCi0JCWlmICghbGNoYW4pIHsKLQkJCXNtc19mcmVlKHNtcyk7Ci0JCQlyYyA9IC1FSU87Ci0JCQlicmVhazsKLQkJfQotCQkvKiBFc3RhYmxpc2ggYSBTQVBJMyBSTEwgY29ubmVjdGlvbiBmb3IgU01TICovCi0JCXJjID0gcmxsX2VzdGFibGlzaChsY2hhbiwgVU1fU0FQSV9TTVMsIHJsbF9pbmRfY2IsIHNtcyk7CisJCXVzZV9zdWJzY3JfY29uKCZsY2hhbi0+Y29ubik7CisJCWdzbTQxMV9zZW5kX3Ntc19sY2hhbigmbGNoYW4tPmNvbm4sIHNtcyk7CiAJCWJyZWFrOwogCWNhc2UgR1NNX1BBR0lOR19FWFBJUkVEOgorCWNhc2UgR1NNX1BBR0lOR19PT006CiAJCXNtc19mcmVlKHNtcyk7CiAJCXJjID0gLUVUSU1FRE9VVDsKIAkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0xMTg1LDIxICsxMTQ0LDE3IEBACiAJCQkgICBzdHJ1Y3QgZ3NtX3NtcyAqc21zKQogewogCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOwotCWludCByYzsKIAogCS8qIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBvcGVuIGxjaGFuIHRvIHRoZSBzdWJzY3JpYmVyLgogCSAqIGlmIHllcywgc2VuZCB0aGUgU01TIHRoaXMgd2F5ICovCiAJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7Ci0JaWYgKGxjaGFuKQotCQlyZXR1cm4gcmxsX2VzdGFibGlzaChsY2hhbiwgVU1fU0FQSV9TTVMsCi0JCQkJICAgICBybGxfaW5kX2NiLCBzbXMpOworCWlmIChsY2hhbikgeworCQl1c2Vfc3Vic2NyX2NvbigmbGNoYW4tPmNvbm4pOworCQlnc200MTFfc2VuZF9zbXNfbGNoYW4oJmxjaGFuLT5jb25uLCBzbXMpOworCX0KIAogCS8qIGlmIG5vdCwgd2UgaGF2ZSB0byBzdGFydCBwYWdpbmcgKi8KLQlyYyA9IHBhZ2luZ19yZXF1ZXN0KHN1YnNjci0+bmV0LCBzdWJzY3IsIFJTTF9DSEFOTkVFRF9TRENDSCwKLQkJCSAgICBwYWdpbmdfY2Jfc2VuZF9zbXMsIHNtcyk7Ci0JaWYgKHJjIDw9IDApCi0JCXNtc19mcmVlKHNtcyk7Ci0KKwlzdWJzY3JfZ2V0X2NoYW5uZWwoc3Vic2NyLCBSU0xfQ0hBTk5FRURfU0RDQ0gsIHBhZ2luZ19jYl9zZW5kX3Ntcywgc21zKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIyMSw4ICsxMTc2LDggQEAKIAkJc21zID0gZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihzdWJzY3IpOwogCQlpZiAoIXNtcykKIAkJCWJyZWFrOwotCQkvKiBFc3RhYmxpc2ggYSBTQVBJMyBSTEwgY29ubmVjdGlvbiBmb3IgU01TICovCi0JCXJsbF9lc3RhYmxpc2gobGNoYW4sIFVNX1NBUElfU01TLCBybGxfaW5kX2NiLCBzbXMpOworCQl1c2Vfc3Vic2NyX2NvbigmbGNoYW4tPmNvbm4pOworCQlnc200MTFfc2VuZF9zbXNfbGNoYW4oJmxjaGFuLT5jb25uLCBzbXMpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTEyMzIsOSArMTE4NywzNSBAQAogCiB2b2lkIF9nc200MTFfc21zX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCiB7CisJaWYgKHRyYW5zLT5zbXMuc21zKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlRyYW5zYWN0aW9uIGNvbnRhaW5zIFNNUy5cbiIpOworCQlzbXNfZnJlZSh0cmFucy0+c21zLnNtcyk7CisJCXRyYW5zLT5zbXMuc21zID0gTlVMTDsKKwl9CisKIAlic2NfZGVsX3RpbWVyKCZ0cmFucy0+c21zLmNwX3RpbWVyKTsKIH0KIAordm9pZCBnc200MTFfc2FwaV9uX3JlamVjdChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubikKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgKnRtcDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnMsIHRtcCwgJmNvbm4tPmJ0cy0+bmV0d29yay0+dHJhbnNfbGlzdCwgZW50cnkpCisJCWlmICh0cmFucy0+Y29ubiA9PSBjb25uKSB7CisJCQlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gdHJhbnMtPnNtcy5zbXM7CisJCQlpZiAoIXNtcykgeworCQkJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlNBUEkgUmVqZWN0IGJ1dCBubyBTTVMuXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc21zX2ZyZWUoc21zKTsKKwkJCXRyYW5zLT5zbXMuc21zID0gTlVMTDsKKwkJCXRyYW5zX2ZyZWUodHJhbnMpOworCQl9CisKKwlnc200MTFfcmVsZWFzZV9jb25uKGNvbm4pOworfQorCiBzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Ntcyh2b2lkKQogewogCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NVQlNDUiwgc3Vic2NyX3NpZ19jYiwgTlVMTCk7CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfODAuYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF84MC5jCmluZGV4IDgyNzEyNzQuLjdkNjY3OWIgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL2dzbV8wNF84MC5jCisrKyBiL29wZW5ic2Mvc3JjL2dzbV8wNF84MC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KICNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF84MC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX2FwaS5oPgogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwogc3RhdGljIGludCBwYXJzZV91c3NkKHVfaW50OF90ICp1c3NkLCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOwpAQCAtMjM2LDcgKzIzNyw3IEBACiAJCQkJZ3NtXzdiaXRfZGVjb2RlKHJlcS0+dGV4dCwKIAkJCQkJCSYodXNzX3JlcV9kYXRhWzddKSwgbnVtX2NoYXJzKTsKIAkJCQkvKiBhcHBlbmQgbnVsbC10ZXJtaW5hdG9yICovCi0JCQkJcmVxLT50ZXh0W251bV9jaGFycysxXSA9IDA7ICAKKwkJCQlyZXEtPnRleHRbbnVtX2NoYXJzKzFdID0gMDsKIAkJCQlyYyA9IDE7CiAJCQl9CiAJCX0KQEAgLTI1Nyw3ICsyNTgsNiBAQAogCWlmICgoKHN0cmxlbihyZXNwb25zZV90ZXh0KSAqIDcpICUgOCkgIT0gMCkKIAkJcmVzcG9uc2VfbGVuICs9IDE7CiAKLQltc2ctPmJ0c19saW5rID0gaW5fbXNnLT5idHNfbGluazsKIAltc2ctPmxjaGFuID0gaW5fbXNnLT5sY2hhbjsKIAogCS8qIEZpcnN0IHB1dCB0aGUgcGF5bG9hZCB0ZXh0IGludG8gdGhlIG1lc3NhZ2UgKi8KQEAgLTI5NSw3ICsyOTUsNyBAQAogCQkJCQl8ICgxPDw3KTsgIC8qIFRJIGRpcmVjdGlvbiA9IDEgKi8KIAlnaC0+bXNnX3R5cGUgPSBHU00wNDgwX01UWVBFX1JFTEVBU0VfQ09NUExFVEU7CiAKLQlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworCXJldHVybiBnc20wODA4X3N1Ym1pdF9kdGFwKCZtc2ctPmxjaGFuLT5jb25uLCBtc2csIDApOwogfQogCiBpbnQgZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KGNvbnN0IHN0cnVjdCBtc2diICppbl9tc2csCkBAIC0zMDQsNyArMzA0LDYgQEAKIAlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOwogCXN0cnVjdCBnc200OF9oZHIgKmdoOwogCi0JbXNnLT5idHNfbGluayA9IGluX21zZy0+YnRzX2xpbms7CiAJbXNnLT5sY2hhbiA9IGluX21zZy0+bGNoYW47CiAKIAkvKiBGaXJzdCBpbnNlcnQgdGhlIHByb2JsZW0gY29kZSAqLwpAQCAtMzI2LDUgKzMyNSw1IEBACiAJZ2gtPnByb3RvX2Rpc2NyIHw9IHJlcS0+dHJhbnNhY3Rpb25faWQgfCAoMTw8Nyk7ICAvKiBUSSBkaXJlY3Rpb24gPSAxICovCiAJZ2gtPm1zZ190eXBlID0gR1NNMDQ4MF9NVFlQRV9SRUxFQVNFX0NPTVBMRVRFOwogCi0JcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwlyZXR1cm4gZ3NtMDgwOF9zdWJtaXRfZHRhcCgmbXNnLT5sY2hhbi0+Y29ubiwgbXNnLCAwKTsKIH0KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV9kYXRhLmMgYi9vcGVuYnNjL3NyYy9nc21fZGF0YS5jCmluZGV4IDE3NjM2N2QuLjlkZTRjMWYgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL2dzbV9kYXRhLmMKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYwpAQCAtODgsNiArODgsNyBAQAogCXsgTENIQU5fU19BQ1RJVkUsCSJBQ1RJVkUiIH0sCiAJeyBMQ0hBTl9TX0lOQUNUSVZFLAkiSU5BQ1RJVkUiIH0sCiAJeyBMQ0hBTl9TX1JFTF9SRVEsCSJSRUxFQVNFIFJFUVVFU1RFRCIgfSwKKwl7IExDSEFOX1NfUkVMX0VSUiwJIlJFTEVBU0UgRFVFIEVSUk9SIiB9LAogCXsgMCwJCQlOVUxMIH0KIH07CiAKQEAgLTE3MSw2ICsxNzIsMTAgQEAKIAlyZXR1cm4gdHJ4OwogfQogCitzdGF0aWMgY29uc3QgdWludDhfdCBidHNfbnNlX3RpbWVyX2RlZmF1bHRbXSA9IHsgMywgMywgMywgMywgMzAsIDMsIDEwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBidHNfY2VsbF90aW1lcl9kZWZhdWx0W10gPQorCQkJCXsgMywgMywgMywgMywgMywgMTAsIDMsIDEwLCAzLCAxMCwgMyB9OworCiBzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19hbGxvYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgZW51bSBnc21fYnRzX3R5cGUgdHlwZSwKIAkJCSAgICAgIHVfaW50OF90IHRzYywgdV9pbnQ4X3QgYnNpYykKIHsKQEAgLTIxMiw2ICsyMTcsMTAgQEAKIAkJYnRzLT5ncHJzLm5zdmNbaV0uYnRzID0gYnRzOwogCQlidHMtPmdwcnMubnN2Y1tpXS5pZCA9IGk7CiAJfQorCW1lbWNweSgmYnRzLT5ncHJzLm5zZS50aW1lciwgYnRzX25zZV90aW1lcl9kZWZhdWx0LAorCQlzaXplb2YoYnRzLT5ncHJzLm5zZS50aW1lcikpOworCW1lbWNweSgmYnRzLT5ncHJzLmNlbGwudGltZXIsIGJ0c19jZWxsX3RpbWVyX2RlZmF1bHQsCisJCXNpemVvZihidHMtPmdwcnMuY2VsbC50aW1lcikpOwogCiAJLyogY3JlYXRlIG91ciBwcmltYXJ5IFRSWCAqLwogCWJ0cy0+YzAgPSBnc21fYnRzX3RyeF9hbGxvYyhidHMpOwpAQCAtMjIxLDYgKzIzMCw4IEBACiAJfQogCWJ0cy0+YzAtPnRzWzBdLnBjaGFuID0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OwogCisJYnRzLT5yYWNoX2JfdGhyZXNoID0gLTE7CisJYnRzLT5yYWNoX2xkYXZnX3Nsb3RzID0gLTE7CiAJbGxpc3RfYWRkX3RhaWwoJmJ0cy0+bGlzdCwgJm5ldC0+YnRzX2xpc3QpOwogCiAJcmV0dXJuIGJ0czsKQEAgLTI4MCw2ICsyOTEsMTAgQEAKIAluZXQtPnN0YXRzLmNhbGwuZGlhbGxlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jYWxsLmRpYWxsZWQiKTsKIAluZXQtPnN0YXRzLmNhbGwuYWxlcnRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jYWxsLmFsZXJ0ZWQiKTsKIAluZXQtPnN0YXRzLmNhbGwuY29ubmVjdGVkID0gY291bnRlcl9hbGxvYygibmV0LmNhbGwuY29ubmVjdGVkIik7CisJbmV0LT5zdGF0cy5jaGFuLnJmX2ZhaWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2hhbi5yZl9mYWlsIik7CisJbmV0LT5zdGF0cy5jaGFuLnJsbF9lcnIgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2hhbi5ybGxfZXJyIik7CisJbmV0LT5zdGF0cy5idHMub21sX2ZhaWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuYnRzLm9tbF9mYWlsIik7CisJbmV0LT5zdGF0cy5idHMucnNsX2ZhaWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuYnRzLnJzbF9mYWlsIik7CiAKIAluZXQtPm1uY2NfcmVjdiA9IG1uY2NfcmVjdjsKIApAQCAtNDM2LDMzICs0NTEsNiBAQAogCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGF1dGhfcG9saWN5X25hbWVzLCBwb2xpY3kpOwogfQogCi0vKiB0aGlzIHNob3VsZCBub3QgYmUgaGVyZSBidXQgaW4gZ3NtXzA0XzA4Li4uIGJ1dCB0aGF0IGNyZWF0ZXMKLSAgIGluIHR1cm4gYSBkZXBlbmRlbmN5IG5pZ2h0bWFyZSAoYWJpc19ubSBkZXBlbmRpbmcgb24gMDRfMDgsIC4uLikgKi8KLXN0YXRpYyBpbnQgZ3NtNDhfY29uc3RydWN0X3JhKHVfaW50OF90ICpidWYsIGNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKQotewotCXVfaW50MTZfdCBtY2MgPSByYWlkLT5tY2M7Ci0JdV9pbnQxNl90IG1uYyA9IHJhaWQtPm1uYzsKLQotCWJ1ZlswXSA9ICgobWNjIC8gMTAwKSAlIDEwKSB8ICgoKG1jYyAvIDEwKSAlIDEwKSA8PCA0KTsKLQlidWZbMV0gPSAobWNjICUgMTApOwotCi0JLyogSSB3b25kZXIgd2hvIGNhbWUgdXAgd2l0aCB0aGUgc3R1cGlkaXR5IG9mIGVuY29kaW5nIHRoZSBNTkMKLQkgKiBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGlnaXRzIGl0cyBkZWNpbWFsIG51bWJlciBoYXMhICovCi0JaWYgKG1uYyA8IDEwMCkgewotCQlidWZbMV0gfD0gMHhmMDsKLQkJYnVmWzJdID0gKChtbmMgLyAxMCkgJSAxMCkgfCAoKG1uYyAlIDEwKSA8PCA0KTsKLQl9IGVsc2UgewotCQlidWZbMV0gfD0gKG1uYyAlIDEwKSA8PCA0OwotCQlidWZbMl0gPSAoKG1uYyAvIDEwMCkgJSAxMCkgfCAoKChtY2MgLyAxMCkgJSAxMCkgPDwgNCk7Ci0JfQotCi0JKih1X2ludDE2X3QgKikoYnVmKzMpID0gaHRvbnMocmFpZC0+bGFjKTsKLQotCWJ1Zls1XSA9IHJhaWQtPnJhYzsKLQotCXJldHVybiA2OwotfQotCiB2b2lkIGdwcnNfcmFfaWRfYnlfYnRzKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQogewogCXJhaWQtPm1jYyA9IGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlOwpAQCAtNDk4LDYgKzQ4NiwyMyBAQAogCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKHJybHBfbW9kZV9uYW1lcywgbW9kZSk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGJ0c19ncHJzX21vZGVfbmFtZXNbXSA9IHsKKwl7IEJUU19HUFJTX05PTkUsCSJub25lIiB9LAorCXsgQlRTX0dQUlNfR1BSUywJImdwcnMiIH0sCisJeyBCVFNfR1BSU19FR1BSUywJImVncHJzIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK2VudW0gYnRzX2dwcnNfbW9kZSBidHNfZ3Byc19tb2RlX3BhcnNlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShidHNfZ3Byc19tb2RlX25hbWVzLCBhcmcpOworfQorCitjb25zdCBjaGFyICpidHNfZ3Byc19tb2RlX25hbWUoZW51bSBidHNfZ3Byc19tb2RlIG1vZGUpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoYnRzX2dwcnNfbW9kZV9uYW1lcywgbW9kZSk7Cit9CisKIHN0cnVjdCBnc21fbWVhc19yZXAgKmxjaGFuX25leHRfbWVhc19yZXAoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCiB7CiAJc3RydWN0IGdzbV9tZWFzX3JlcCAqbWVhc19yZXA7CkBAIC01MzAsNiArNTM1LDggQEAKIAkJYnJlYWs7CiAJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKIAkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfVU5LTk9XTjoKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMgYi9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMKaW5kZXggZGVlODljMC4uNDBjM2JiZCAxMDA2NDQKLS0tIGEvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXJfYmFzZS5jCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYwpAQCAtMTg3LDYgKzE4Nyw3IEBACiAKIHZvaWQgc3Vic2NyX3B1dF9jaGFubmVsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQogeworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uID0gJmxjaGFuLT5jb25uOwogCS8qCiAJICogRklYTUU6IENvbnRpbnVlIHdpdGggb3RoZXIgcmVxdWVzdHMgbm93Li4uIGJ5IGNoZWNraW5nCiAJICogdGhlIGdzbV9zdWJzY3JpYmVyIGluc2lkZSB0aGUgZ3NtX2xjaGFuLiBEcm9wIHRoZSByZWYgY291bnQKQEAgLTIwNSw5ICsyMDYsOSBAQAogCSAqIHdpbGwgbGlzdGVuIHRvIHRoZSBwYWdpbmcgcmVxdWVzdHMgYmVmb3JlIHdlIHRpbWVvdXQKIAkgKi8KIAotCXB1dF9sY2hhbihsY2hhbik7CisJcHV0X3N1YnNjcl9jb24oY29ubik7CiAKLQlpZiAobGNoYW4tPnN1YnNjciAmJiAhbGxpc3RfZW1wdHkoJmxjaGFuLT5zdWJzY3ItPnJlcXVlc3RzKSkKLQkJc3Vic2NyX3NlbmRfcGFnaW5nX3JlcXVlc3QobGNoYW4tPnN1YnNjcik7CisJaWYgKGxjaGFuLT5jb25uLnN1YnNjciAmJiAhbGxpc3RfZW1wdHkoJmxjaGFuLT5jb25uLnN1YnNjci0+cmVxdWVzdHMpKQorCQlzdWJzY3Jfc2VuZF9wYWdpbmdfcmVxdWVzdChsY2hhbi0+Y29ubi5zdWJzY3IpOwogfQogCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9sb2dpYy5jIGIvb3BlbmJzYy9zcmMvaGFuZG92ZXJfbG9naWMuYwppbmRleCBiZDRjNTYzLi5iMmZmZTQ2IDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9sb2dpYy5jCisrKyBiL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2xvZ2ljLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCW5ld19sY2hhbi0+YnNfcG93ZXIgPSBvbGRfbGNoYW4tPmJzX3Bvd2VyOwogCW5ld19sY2hhbi0+cnNsX2Ntb2RlID0gb2xkX2xjaGFuLT5yc2xfY21vZGU7CiAJbmV3X2xjaGFuLT50Y2hfbW9kZSA9IG9sZF9sY2hhbi0+dGNoX21vZGU7Ci0JbmV3X2xjaGFuLT5zdWJzY3IgPSBzdWJzY3JfZ2V0KG9sZF9sY2hhbi0+c3Vic2NyKTsKKwluZXdfbGNoYW4tPmNvbm4uc3Vic2NyID0gc3Vic2NyX2dldChvbGRfbGNoYW4tPmNvbm4uc3Vic2NyKTsKIAogCS8qIEZJWE1FOiBkbyB3ZSBoYXZlIGEgYmV0dGVyIGlkZWEgb2YgdGhlIHRpbWluZyBhZHZhbmNlPyAqLwogCXJjID0gcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4obmV3X2xjaGFuLCBSU0xfQUNUX0lOVEVSX0FTWU5DLCAwLApAQCAtMTM0LDYgKzEzNCw3IEBACiAJCXJldHVybiByYzsKIAl9CiAKKwlyc2xfbGNoYW5fc2V0X3N0YXRlKG5ld19sY2hhbiwgTENIQU5fU19BQ1RfUkVRKTsKIAlsbGlzdF9hZGQoJmhvLT5saXN0LCAmYnNjX2hhbmRvdmVycyk7CiAJLyogd2UgY29udGludWUgaW4gdGhlIFNTX0xDSEFOIGhhbmRsZXIgLyBob19jaGFuX2FjdGl2X2FjayAqLwogCkBAIC0yMTgsNyArMjE5LDcgQEAKIAl9CiAKIAlMT0dQKERITywgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyBITyBmcm9tIEJUUyAldS0+JXUgb24gQVJGQ04gIgotCSAgICAgIiV1LT4ldVxuIiwgc3Vic2NyX25hbWUoaG8tPm9sZF9sY2hhbi0+c3Vic2NyKSwKKwkgICAgICIldS0+JXVcbiIsIHN1YnNjcl9uYW1lKGhvLT5vbGRfbGNoYW4tPmNvbm4uc3Vic2NyKSwKIAkgICAgIGhvLT5vbGRfbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIG5ld19sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwKIAkgICAgIGhvLT5vbGRfbGNoYW4tPnRzLT50cngtPmFyZmNuLCBuZXdfbGNoYW4tPnRzLT50cngtPmFyZmNuKTsKIApAQCAtMjI3LDkgKzIyOCw5IEBACiAJYnNjX2RlbF90aW1lcigmaG8tPlQzMTAzKTsKIAogCS8qIHVwZGF0ZSBsY2hhbiBwb2ludGVyIG9mIHRyYW5zYWN0aW9uICovCi0JdHJhbnNfbGNoYW5fY2hhbmdlKGhvLT5vbGRfbGNoYW4sIG5ld19sY2hhbik7CisJdHJhbnNfbGNoYW5fY2hhbmdlKCZoby0+b2xkX2xjaGFuLT5jb25uLCAmbmV3X2xjaGFuLT5jb25uKTsKIAotCWhvLT5vbGRfbGNoYW4tPnN0YXRlID0gTENIQU5fU19JTkFDVElWRTsKKwlyc2xfbGNoYW5fc2V0X3N0YXRlKGhvLT5vbGRfbGNoYW4sIExDSEFOX1NfSU5BQ1RJVkUpOwogCWxjaGFuX2F1dG9fcmVsZWFzZShoby0+b2xkX2xjaGFuKTsKIAogCS8qIGRvIHNvbWV0aGluZyB0byByZS1yb3V0ZSB0aGUgYWN0dWFsIHNwZWVjaCBmcmFtZXMgISAqLwpAQCAtMjQzLDYgKzI0NCw3IEBACiAvKiBHU00gMDQuMDggSEFORE9WRVIgRkFJTCBoYXMgYmVlbiByZWNlaXZlZCAqLwogc3RhdGljIGludCBob19nc200OF9ob19mYWlsKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbikKIHsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKIAlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG9sZF9sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOwogCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOwogCkBAIC0yNTYsNyArMjU4LDggQEAKIAogCWJzY19kZWxfdGltZXIoJmhvLT5UMzEwMyk7CiAJbGxpc3RfZGVsKCZoby0+bGlzdCk7Ci0JcHV0X2xjaGFuKGhvLT5uZXdfbGNoYW4pOworCWNvbm4gPSAmaG8tPm5ld19sY2hhbi0+Y29ubjsKKwlwdXRfc3Vic2NyX2Nvbihjb25uKTsKIAl0YWxsb2NfZnJlZShobyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lucHV0L2lwYWNjZXNzLmMgYi9vcGVuYnNjL3NyYy9pbnB1dC9pcGFjY2Vzcy5jCmluZGV4IDkxZDc1NjMuLjQ5NjhlODAgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL2lucHV0L2lwYWNjZXNzLmMKKysrIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpAQCAtMSw2ICsxLDggQEAKIC8qIE9wZW5CU0MgQWJpcyBpbnB1dCBkcml2ZXIgZm9yIGlwLmFjY2VzcyAqLwogCiAvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCiAgKgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZAogICoKQEAgLTQyLDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KICNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc29ja2V0Lmg+CiAjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CiAKICNkZWZpbmUgUFJJVl9PTUwgMQpAQCAtNTcsMTIgKzYwLDEyIEBACiBzdGF0aWMgc3RydWN0IGlhX2UxX2hhbmRsZSAqZTFoOwogCiAKLSNkZWZpbmUgVFMxX0FMTE9DX1NJWkUJMzAwCisjZGVmaW5lIFRTMV9BTExPQ19TSVpFCTkwMAogCiBzdGF0aWMgY29uc3QgdV9pbnQ4X3QgcG9uZ1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfUE9ORyB9Owogc3RhdGljIGNvbnN0IHVfaW50OF90IGlkX2Fja1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfQUNLIH07CiBzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfcmVxW10gPSB7IDAsIDE3LCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfR0VULAotCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVQsIAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVQsCiAJCQkJCTB4MDEsIElQQUNfSURUQUdfTUFDQUREUiwKIAkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjEsCiAJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04yLApAQCAtMjM0LDYgKzIzNyw4IEBACiAJCX0KIAkJREVCVUdQKERJTlAsICJJZGVudGlmaWVkIEJUUyAldS8ldS8ldVxuIiwgc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOwogCQlpZiAoYmZkLT5wcml2X25yID09IFBSSVZfT01MKSB7CisJCQkvKiBkcm9wIGFueSBvbGQgb21sIGNvbm5lY3Rpb24gKi8KKwkJCWlwYWNjZXNzX2Ryb3Bfb21sKGJ0cyk7CiAJCQlidHMtPm9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZSgmbGluZS0+dHNbUFJJVl9PTUwgLSAxXSwKIAkJCQkJCSAgRTFJTlBfU0lHTl9PTUwsIGJ0cy0+YzAsCiAJCQkJCQkgIGJ0cy0+b21sX3RlaSwgMCk7CkBAIC0yNDEsNyArMjQ2LDE4IEBACiAJCQlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKIAkJCXN0cnVjdCBic2NfZmQgKm5ld2JmZDsKIAkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X2lkKTsKLQkJCQorCisJCQkvKiBkcm9wIGFueSBvbGQgcnNsIGNvbm5lY3Rpb24gKi8KKwkJCWlwYWNjZXNzX2Ryb3BfcnNsKHRyeCk7CisKKwkJCWlmICghYnRzLT5vbWxfbGluaykgeworCQkJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCQkJY2xvc2UoYmZkLT5mZCk7CisJCQkJYmZkLT5mZCA9IC0xOworCQkJCXRhbGxvY19mcmVlKGJmZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKIAkJCWJmZC0+ZGF0YSA9IGxpbmUgPSBidHMtPm9tbF9saW5rLT50cy0+bGluZTsKIAkJCWUxaV90cyA9ICZsaW5lLT50c1tQUklWX1JTTCArIHRyeF9pZCAtIDFdOwogCQkJbmV3YmZkID0gJmUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkOwpAQCAtMjUxLDE5ICsyNjcsMTMgQEAKIAkJCQkJCQlFMUlOUF9TSUdOX1JTTCwgdHJ4LAogCQkJCQkJCXRyeC0+cnNsX3RlaSwgMCk7CiAKLQkJCWlmIChuZXdiZmQtPmZkID49IDApIHsKLQkJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJCVFMgaXMgc3RpbGwgcmVnaXN0ZXJlZC4gQ2xvc2luZyBvbGQgY29ubmVjdGlvbi5cbiIpOwotCQkJCWJzY191bnJlZ2lzdGVyX2ZkKG5ld2JmZCk7Ci0JCQkJY2xvc2UobmV3YmZkLT5mZCk7Ci0JCQkJbmV3YmZkLT5mZCA9IC0xOwotCQkJfQotCiAJCQkvKiBnZXQgcmlkIG9mIG91ciBvbGQgdGVtcG9yYXJ5IGJmZCAqLwogCQkJbWVtY3B5KG5ld2JmZCwgYmZkLCBzaXplb2YoKm5ld2JmZCkpOwogCQkJbmV3YmZkLT5wcml2X25yID0gUFJJVl9SU0wgKyB0cnhfaWQ7CiAJCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOwotCQkJYnNjX3JlZ2lzdGVyX2ZkKG5ld2JmZCk7CisJCQliZmQtPmZkID0gLTE7CiAJCQl0YWxsb2NfZnJlZShiZmQpOworCQkJYnNjX3JlZ2lzdGVyX2ZkKG5ld2JmZCk7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMzI4LDYgKzMzOCwxMDMgQEAKIAlyZXR1cm4gbXNnOwogfQogCitpbnQgaXBhY2Nlc3NfZHJvcF9vbWwoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnRzOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKworCWlmICghYnRzIHx8ICFidHMtPm9tbF9saW5rKQorCQlyZXR1cm4gLTE7CisKKwkvKiBzZW5kIE9NTCBkb3duICovCisJdHMgPSBidHMtPm9tbF9saW5rLT50czsKKwlsaW5lID0gdHMtPmxpbmU7CisJZTFpbnBfZXZlbnQodHMsIEVWVF9FMV9URUlfRE4sIGJ0cy0+b21sX2xpbmstPnRlaSwgYnRzLT5vbWxfbGluay0+c2FwaSk7CisKKwliZmQgPSAmdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCWNsb3NlKGJmZC0+ZmQpOworCWJmZC0+ZmQgPSAtMTsKKworCS8qIGNsZWFuIHVwIE9NTCBhbmQgUlNMICovCisJZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koYnRzLT5vbWxfbGluayk7CisJYnRzLT5vbWxfbGluayA9IE5VTEw7CisJYnRzLT5pcF9hY2Nlc3MuZmxhZ3MgPSAwOworCisJLyogZHJvcCBhbGwgUlNMIGNvbm5lY3Rpb25zIHRvbyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWlwYWNjZXNzX2Ryb3BfcnNsKHRyeCk7CisKKwkvKiBraWxsIHRoZSBFMSBsaW5lIG5vdy4uLiBhcyB3ZSBoYXZlIG5vIG9uZSBsZWZ0IHRvIHVzZSBpdCAqLworCXRhbGxvY19mcmVlKGxpbmUpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGlwYWNjZXNzX2Ryb3Aoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJaW50IGJ0c19ucjsKKworCWlmICghdHMpIHsKKwkJLyoKKwkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIFRTIHRoaXMgbWVhbnMgdGhhdCB0aGlzIGlzIGEgUlNMCisJCSAqIGNvbm5lY3Rpb24gYnV0IHdlIGFyZSBub3QgcGFzdCB0aGUgYXV0aGVudGljYXRpb24KKwkJICogaGFuZGxpbmcgeWV0LiBTbyB3ZSBjYW4gc2FmZWx5IGRlbGV0ZSB0aGlzIGJmZCBhbmQKKwkJICogd2FpdCBmb3IgYSByZWNvbm5lY3QuCisJCSAqLworCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQljbG9zZShiZmQtPmZkKTsKKwkJYmZkLT5mZCA9IC0xOworCQl0YWxsb2NfZnJlZShiZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYXR0ZW1wdCB0byBmaW5kIGEgc2lnbmFsbGluZyBsaW5rICovCisJaWYgKHRzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5rLCAmdHMtPnNpZ24uc2lnbl9saW5rcywgbGlzdCkgeworCQkJYnRzX25yID0gbGluay0+dHJ4LT5idHMtPmJ0c19ucjsKKwkJCS8qIHdlIGhhdmUgaXNzdWVzIGp1c3QgcmVjb25uZWN0aW5nIFJMUyBzbyB3ZSBkcm9wIE9NTCAqLworCQkJaXBhY2Nlc3NfZHJvcF9vbWwobGluay0+dHJ4LT5idHMpOworCQkJcmV0dXJuIGJ0c19ucjsKKwkJfQorCX0KKworCS8qIGVycm9yIGNhc2UgKi8KKwlMT0dQKERJTlAsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gZmluZCBhIHNpZ25hbGxpbmcgbGluayBmb3IgdHM6ICVwXG4iLCB0cyk7CisJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwljbG9zZShiZmQtPmZkKTsKKwliZmQtPmZkID0gLTE7CisJcmV0dXJuIC0xOworfQorCitpbnQgaXBhY2Nlc3NfZHJvcF9yc2woc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3RydWN0IGJzY19mZCAqYmZkOworCXN0cnVjdCBlMWlucF90cyAqdHM7CisKKwlpZiAoIXRyeCB8fCAhdHJ4LT5yc2xfbGluaykKKwkJcmV0dXJuIC0xOworCisJLyogc2VuZCBSU0wgZG93biAqLworCXRzID0gdHJ4LT5yc2xfbGluay0+dHM7CisJZTFpbnBfZXZlbnQodHMsIEVWVF9FMV9URUlfRE4sIHRyeC0+cnNsX2xpbmstPnRlaSwgdHJ4LT5yc2xfbGluay0+c2FwaSk7CisKKwkvKiBjbG9zZSB0aGUgc29ja2V0ICovCisJYmZkID0gJnRzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwljbG9zZShiZmQtPmZkKTsKKwliZmQtPmZkID0gLTE7CisKKwkvKiBkZXN0cm95ICovCisJZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3kodHJ4LT5yc2xfbGluayk7CisJdHJ4LT5yc2xfbGluayA9IE5VTEw7CisKKwlyZXR1cm4gLTE7Cit9CisKIHN0YXRpYyBpbnQgaGFuZGxlX3RzMV9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKIHsKIAlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKQEAgLTM0MSwxOCArNDQ4LDEyIEBACiAJbXNnID0gaXBhY2Nlc3NfcmVhZF9tc2coYmZkLCAmZXJyb3IpOwogCWlmICghbXNnKSB7CiAJCWlmIChlcnJvciA9PSAwKSB7Ci0JCQlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayhlMWlfdHMsIElQQUNfUFJPVE9fT01MLCAwKTsKLQkJCWlmIChsaW5rKSB7Ci0JCQkJbGluay0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyA9IDA7CisJCQlpbnQgcmV0ID0gaXBhY2Nlc3NfZHJvcChlMWlfdHMsIGJmZCk7CisJCQlpZiAocmV0ID49IDApCiAJCQkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgIkJUUyAldSBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIsCi0JCQkJCWxpbmstPnRyeC0+YnRzLT5ucik7Ci0JCQl9IGVsc2UKKwkJCQkJcmV0KTsKKwkJCWVsc2UKIAkJCQlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAidW5rbm93biBCVFMgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iKTsKLQkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgMCwgSVBBQ19QUk9UT19SU0wpOwotCQkJZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX0ROLCAwLCBJUEFDX1BST1RPX09NTCk7Ci0JCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOwotCQkJY2xvc2UoYmZkLT5mZCk7Ci0JCQliZmQtPmZkID0gLTE7CiAJCX0KIAkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTM2MiwxMyArNDYzLDggQEAKIAloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CiAJaWYgKGhoLT5wcm90byA9PSBJUEFDX1BST1RPX0lQQUNDRVNTKSB7CiAJCXJldCA9IGlwYWNjZXNzX3Jjdm1zZyhsaW5lLCBtc2csIGJmZCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIDAsIElQQUNfUFJPVE9fUlNMKTsKLQkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgMCwgSVBBQ19QUk9UT19PTUwpOwotCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKLQkJCWNsb3NlKGJmZC0+ZmQpOwotCQkJYmZkLT5mZCA9IC0xOwotCQl9CisJCWlmIChyZXQgPCAwKQorCQkJaXBhY2Nlc3NfZHJvcChlMWlfdHMsIGJmZCk7CiAJCW1zZ2JfZnJlZShtc2cpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTQ3NSw3ICs1NzEsOSBAQAogCS8qIHNldCB0eCBkZWxheSB0aW1lciBmb3IgbmV4dCBldmVudCAqLwogCWUxaV90cy0+c2lnbi50eF90aW1lci5jYiA9IHRpbWVvdXRfdHMxX3dyaXRlOwogCWUxaV90cy0+c2lnbi50eF90aW1lci5kYXRhID0gZTFpX3RzOwotCWJzY19zY2hlZHVsZV90aW1lcigmZTFpX3RzLT5zaWduLnR4X3RpbWVyLCAwLCAxMDApOworCisJLyogUmVkdWNpbmcgdGhpcyBtaWdodCBicmVhayB0aGUgbmFub0JUUyA5MDAgaW5pdC4gKi8KKwlic2Nfc2NoZWR1bGVfdGltZXIoJmUxaV90cy0+c2lnbi50eF90aW1lciwgMCwgMTAwMDAwKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01MDUsNyArNjAzLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLQogc3RydWN0IGUxaW5wX2RyaXZlciBpcGFjY2Vzc19kcml2ZXIgPSB7CiAJLm5hbWUgPSAiaXAuYWNjZXNzIiwKIAkud2FudF93cml0ZSA9IHRzX3dhbnRfd3JpdGUsCkBAIC02MTEsNTMgKzcwOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgdV9pbnQxNl90IHBvcnQsCi0JCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkpCi17Ci0Jc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci0JaW50IHJldCwgb24gPSAxOwotCQotCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLQliZmQtPmNiID0gY2I7Ci0JYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7Ci0JLy9iZmQtPmRhdGEgPSBsaW5lOwotCi0JaWYgKGJmZC0+ZmQgPCAwKSB7Ci0JCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjcmVhdGUgVENQIHNvY2tldC5cbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0JYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0JYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwotCi0Jc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7Ci0KLQlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGJpbmQgbDIgc29ja2V0ICVzXG4iLAotCQkJc3RyZXJyb3IoZXJybm8pKTsKLQkJY2xvc2UoYmZkLT5mZCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldCA9IGxpc3RlbihiZmQtPmZkLCAxKTsKLQlpZiAocmV0IDwgMCkgewotCQlwZXJyb3IoImxpc3RlbiIpOwotCQljbG9zZShiZmQtPmZkKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcGVycm9yKCJyZWdpc3Rlcl9saXN0ZW5fZmQiKTsKLQkJY2xvc2UoYmZkLT5mZCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldHVybiAwOwotfQotCiAvKiBBY3RpdmVseSBjb25uZWN0IHRvIGEgQlRTLiAgQ3VycmVudGx5IHVzZWQgYnkgaXBhY2Nlc3MtY29uZmlnLmMgKi8KIGludCBpcGFjY2Vzc19jb25uZWN0KHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhKQogewpAQCAtNzE0LDEyICs3NjQsMTYgQEAKIAllMWgtPmdzbW5ldCA9IGdzbW5ldDsKIAogCS8qIExpc3RlbiBmb3IgT01MIGNvbm5lY3Rpb25zICovCi0JcmV0ID0gbWFrZV9zb2NrKCZlMWgtPmxpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX09NTCwgbGlzdGVuX2ZkX2NiKTsKKwlyZXQgPSBtYWtlX3NvY2soJmUxaC0+bGlzdGVuX2ZkLCBJUFBST1RPX1RDUCwgMCwgSVBBX1RDUF9QT1JUX09NTCwKKwkJCWxpc3Rlbl9mZF9jYik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAkvKiBMaXN0ZW4gZm9yIFJTTCBjb25uZWN0aW9ucyAqLwotCXJldCA9IG1ha2Vfc29jaygmZTFoLT5yc2xfbGlzdGVuX2ZkLCBJUEFfVENQX1BPUlRfUlNMLCByc2xfbGlzdGVuX2ZkX2NiKTsKKwlyZXQgPSBtYWtlX3NvY2soJmUxaC0+cnNsX2xpc3Rlbl9mZCwgSVBQUk9UT19UQ1AsIDAsCisJCQlJUEFfVENQX1BPUlRfUlNMLCByc2xfbGlzdGVuX2ZkX2NiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jIGIvb3BlbmJzYy9zcmMvaW5wdXQvbWlzZG4uYwppbmRleCA1NjkzMGQ0Li44M2IwMWYyIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jCisrKyBiL29wZW5ic2Mvc3JjL2lucHV0L21pc2RuLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogCiAJcmV0ID0gc2VuZChiZmQtPmZkLCB0eF9idWYsIHNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTiwgMCk7CiAJaWYgKHJldCA8IHNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTikKLQkJREVCVUdQKERNSUIsICJzZW5kIHJldHVybnMgJWQgaW5zdGVhZCBvZiAlbHVcbiIsIHJldCwKKwkJREVCVUdQKERNSUIsICJzZW5kIHJldHVybnMgJWQgaW5zdGVhZCBvZiAlenVcbiIsIHJldCwKIAkJCXNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTik7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzM5MzIxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMyBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUkkKHRvcF9idWlsZGRpcikKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKExJQk9TTU9DT1JFX0xJQlMpCisKK3NiaW5fUFJPR1JBTVMgPSBpcGFjY2Vzcy1maW5kIGlwYWNjZXNzLWNvbmZpZyBpcGFjY2Vzcy1wcm94eQorCitpcGFjY2Vzc19maW5kX1NPVVJDRVMgPSBpcGFjY2Vzcy1maW5kLmMKKworaXBhY2Nlc3NfY29uZmlnX1NPVVJDRVMgPSBpcGFjY2Vzcy1jb25maWcuYyBpcGFjY2Vzcy1maXJtd2FyZS5jCitpcGFjY2Vzc19jb25maWdfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgXAorCQkJJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKKworaXBhY2Nlc3NfcHJveHlfU09VUkNFUyA9IGlwYWNjZXNzLXByb3h5LmMgLi4vZGVidWcuYwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYwppbmRleCA4NzA5NTBkLi41MmIxOGUyIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYworKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYwpAQCAtMSw4ICsxLDggQEAKIC8qIGlwLmFjY2VzcyBuYW5vQlRTIGNvbmZpZ3VyYXRpb24gdG9vbCAqLwogCiAvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKLSAqIChDKSAyMDA5IGJ5IE9uIFdhdmVzCisgKiAoQykgMjAwOSwyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAwOSwyMDEwIGJ5IE9uIFdhdmVzCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTU5LDYgKzU5LDcgQEAKIHN0YXRpYyBpbnQgb21sX3N0YXRlID0gMDsKIHN0YXRpYyBpbnQgZHVtcF9maWxlcyA9IDA7CiBzdGF0aWMgY2hhciAqZmlybXdhcmVfYW5hbHlzaXMgPSBOVUxMOworc3RhdGljIGludCBmb3VuZF90cnggPSAwOwogCiBzdHJ1Y3Qgc3dfbG9hZCB7CiAJdV9pbnQ4X3QgZmlsZV9pZFsyNTVdOwpAQCAtOTEsMjMgKzkyLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXBhY2NfbXNnX2Fjayh1X2ludDhfdCBtdCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc3RhcnRfb3JfZXhpdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlpZiAocmVzdGFydCkgeworCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQodHJ4KTsKKwl9IGVsc2UgeworCQlleGl0KDApOworCX0KK30KKworc3RhdGljIGludCBpcGFjY19tc2dfYWNrKHVfaW50OF90IG10LCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKIHsKIAlpZiAoc3dfbG9hZF9zdGF0ZSA9PSAxKSB7CiAJCWZwcmludGYoc3RkZXJyLCAiVGhlIG5ldyBzb2Z0d2FyZSBpcyBhY3RpdmFlZC5cbiIpOwotCi0JCWlmIChyZXN0YXJ0KSB7Ci0JCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoYnRzKTsKLQkJfSBlbHNlIHsKLQkJCWV4aXQoMCk7Ci0JCX0KKwkJY2hlY2tfcmVzdGFydF9vcl9leGl0KHRyeCk7CiAJfSBlbHNlIGlmIChvbWxfc3RhdGUgPT0gMSkgewogCQlmcHJpbnRmKHN0ZGVyciwgIlNldCB0aGUgcHJpbWFyeSBPTUwgSVAuXG4iKTsKLQkJaWYgKHJlc3RhcnQpIHsKLQkJCWFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChidHMpOwotCQl9IGVsc2UgewotCQkJZXhpdCgwKTsKLQkJfQorCQljaGVja19yZXN0YXJ0X29yX2V4aXQodHJ4KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIwMiw3ICsyMDMsNyBAQAogCQlyZXR1cm4gaXBhY2NfbXNnX25hY2soaXBhY2NfZGF0YS0+bXNnX3R5cGUpOwogCWNhc2UgU19OTV9JUEFDQ19BQ0s6CiAJCWlwYWNjX2RhdGEgPSBzaWduYWxfZGF0YTsKLQkJcmV0dXJuIGlwYWNjX21zZ19hY2soaXBhY2NfZGF0YS0+bXNnX3R5cGUsIGlwYWNjX2RhdGEtPmJ0cyk7CisJCXJldHVybiBpcGFjY19tc2dfYWNrKGlwYWNjX2RhdGEtPm1zZ190eXBlLCBpcGFjY19kYXRhLT50cngpOwogCWNhc2UgU19OTV9URVNUX1JFUDoKIAkJcmV0dXJuIHRlc3RfcmVwKHNpZ25hbF9kYXRhKTsKIAljYXNlIFNfTk1fSVBBQ0NfUkVTVEFSVF9BQ0s6CkBAIC0yMjcsMTIgKzIyOCwxMiBAQAogCQkgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCiB7CiAJc3RydWN0IG1zZ2IgKm1zZzsKLQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OwogCiAJaWYgKGhvb2sgIT0gR1NNX0hPT0tfTk1fU1dMT0FEKQogCQlyZXR1cm4gMDsKIAotCWJ0cyA9IChzdHJ1Y3QgZ3NtX2J0cyAqKSBkYXRhOworCXRyeCA9IChzdHJ1Y3QgZ3NtX2J0c190cnggKikgZGF0YTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CkBAIC0yNzEsNyArMjcyLDcgQEAKIAkJbXNnLT5sMmhbMV0gPSBtc2diX2wzbGVuKG1zZykgPj4gODsKIAkJbXNnLT5sMmhbMl0gPSBtc2diX2wzbGVuKG1zZykgJiAweGZmOwogCQlwcmludGYoIkZvbyBsMmg6ICVwIGwzaDogJXAuLi4gbGVuZ3RoIGwyOiAldSAgbDM6ICV1XG4iLCBtc2ctPmwyaCwgbXNnLT5sM2gsIG1zZ2JfbDJsZW4obXNnKSwgbXNnYl9sM2xlbihtc2cpKTsKLQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKGJ0cy0+YzAsIG1zZy0+bDJoLCBtc2diX2wybGVuKG1zZykpOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIodHJ4LCBtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKTsKIAkJbXNnYl9mcmVlKG1zZyk7CiAJCWJyZWFrOwogCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKQEAgLTI4NSw3ICsyODYsNyBAQAogCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgogCQlicmVhazsKIAljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKLQkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoYnRzKTsKKwkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXModHJ4LT5idHMpOwogCQlpZiAocGVyY2VudCA+IHBlcmNlbnRfb2xkKQogCQkJcHJpbnRmKCJTb2Z0d2FyZSBEb3dubG9hZCBQcm9ncmVzczogJWQlJVxuIiwgcGVyY2VudCk7CiAJCXBlcmNlbnRfb2xkID0gcGVyY2VudDsKQEAgLTI5OCwxMyArMjk5LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQorc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQogewogCWludCBsZW47CiAJc3RhdGljIHVfaW50OF90IGJ1ZlsxMDI0XTsKIAl1X2ludDhfdCAqY3VyID0gYnVmOwogCi0JcHJpbnRmKCJPTUwgbGluayBlc3RhYmxpc2hlZFxuIik7CisJcHJpbnRmKCJPTUwgbGluayBlc3RhYmxpc2hlZCB1c2luZyBUUlggJWRcbiIsIHRyeC0+bnIpOwogCiAJaWYgKHVuaXRfaWQpIHsKIAkJbGVuID0gc3RybGVuKHVuaXRfaWQpOwpAQCAtMzE2LDcgKzMxNyw3IEBACiAJCW1lbWNweShidWYrMywgdW5pdF9pZCwgbGVuKTsKIAkJYnVmWzMrbGVuXSA9IDA7CiAJCXByaW50Zigic2V0dGluZyBVbml0IElEIHRvICclcydcbiIsIHVuaXRfaWQpOwotCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoYnRzLT5jMCwgYnVmLCAzK2xlbisxKTsKKwkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKHRyeCwgYnVmLCAzK2xlbisxKTsKIAl9CiAJaWYgKHByaW1fb21sX2lwKSB7CiAJCXN0cnVjdCBpbl9hZGRyIGlhOwpAQCAtMzQwLDcgKzM0MSw3IEBACiAJCSpjdXIrKyA9IDA7CiAJCXByaW50Zigic2V0dGluZyBwcmltYXJ5IE9NTCBsaW5rIElQIHRvICclcydcbiIsIGluZXRfbnRvYShpYSkpOwogCQlvbWxfc3RhdGUgPSAxOwotCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoYnRzLT5jMCwgYnVmLCAzK2xlbik7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cih0cngsIGJ1ZiwgMytsZW4pOwogCX0KIAlpZiAobnZfbWFzaykgewogCQlsZW4gPSA0OwpAQCAtMzU0LDEyICszNTUsMTIgQEAKIAkJKmN1cisrID0gbnZfbWFzayA+PiA4OwogCQlwcmludGYoInNldHRpbmcgTlYgRmxhZ3MvTWFzayB0byAweCUwNHgvMHglMDR4XG4iLAogCQkJbnZfZmxhZ3MsIG52X21hc2spOwotCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoYnRzLT5jMCwgYnVmLCAzK2xlbik7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cih0cngsIGJ1ZiwgMytsZW4pOwogCX0KIAogCWlmIChyZXN0YXJ0ICYmICFwcmltX29tbF9pcCAmJiAhc29mdHdhcmUpIHsKIAkJcHJpbnRmKCJyZXN0YXJ0aW5nIEJUU1xuIik7Ci0JCWFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChidHMpOworCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQodHJ4KTsKIAl9CiAKIH0KQEAgLTM3MCw3ICszNzEsNiBAQAogCWNhc2UgRVZUX0UxX1RFSV9VUDoKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgRTFJTlBfU0lHTl9PTUw6Ci0JCQlib290c3RyYXBfb20odHJ4LT5idHMpOwogCQkJYnJlYWs7CiAJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CiAJCQkvKiBGSVhNRSAqLwpAQCAtMzg5LDIyICszODksMjkgQEAKIH0KIAogaW50IG5tX3N0YXRlX2V2ZW50KGVudW0gbm1fZXZ0IGV2dCwgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB2b2lkICpvYmosCi0JCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlKQorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSwKKwkJICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0KQogewotCWlmIChldnQgPT0gRVZUX1NUQVRFQ0hHX09QRVIgJiYKKwlpZiAob2JqX2NsYXNzID09IE5NX09DX0JBU0VCX1RSQU5TQykgeworCQlpZiAoIWZvdW5kX3RyeCAmJiBvYmpfaW5zdC0+dHJ4X25yICE9IDB4ZmYpIHsKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHNfdHJ4LCBiYl90cmFuc2MpOworCQkJYm9vdHN0cmFwX29tKHRyeCk7CisJCQlmb3VuZF90cnggPSAxOworCQl9CisJfSBlbHNlIGlmIChldnQgPT0gRVZUX1NUQVRFQ0hHX09QRVIgJiYKIAkgICAgb2JqX2NsYXNzID09IE5NX09DX1JBRElPX0NBUlJJRVIgJiYKIAkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gMykgewogCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IG9iajsKIAogCQlpZiAobmV0X2xpc3Rlbl90ZXN0bnIpIHsKIAkJCXVfaW50OF90IHBoeXNfY29uZmlnW10gPSB7IDB4MDIsIDB4MGEsIDB4MDAsIDB4MDEsIDB4MDIgfTsKLQkJCWFiaXNfbm1fcGVyZm9ybV90ZXN0KHRyeC0+YnRzLCAyLCAwLCAwLCAweGZmLAorCQkJYWJpc19ubV9wZXJmb3JtX3Rlc3QodHJ4LT5idHMsIDIsIDAsIHRyeC0+bnIsIDB4ZmYsCiAJCQkJCSAgICAgbmV0X2xpc3Rlbl90ZXN0bnIsIDEsCiAJCQkJCSAgICAgcGh5c19jb25maWcsIHNpemVvZihwaHlzX2NvbmZpZykpOwogCQl9IGVsc2UgaWYgKHNvZnR3YXJlKSB7CiAJCQlpbnQgcmM7CiAJCQlwcmludGYoIkF0dGVtcHRpbmcgc29mdHdhcmUgdXBsb2FkIHdpdGggJyVzJ1xuIiwgc29mdHdhcmUpOwotCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQodHJ4LT5idHMsIHNvZnR3YXJlLCAxOSwgMCwgc3dsb2FkX2NiZm4sIHRyeC0+YnRzKTsKKwkJCXJjID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHRyeC0+YnRzLCB0cngtPm5yLCBzb2Z0d2FyZSwgMTksIDAsIHN3bG9hZF9jYmZuLCB0cngpOwogCQkJaWYgKHJjIDwgMCkgewogCQkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHN0YXJ0IHNvZnR3YXJlIGxvYWRcbiIpOwogCQkJCWV4aXQoLTMpOwpAQCAtNTk1LDMxICs2MDIsMzMgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQogewotCXByaW50ZigiICAtdSAtLXVuaXQtaWQgVU5JVF9JRFxuIik7Ci0JcHJpbnRmKCIgIC1vIC0tb21sLWlwIGlwXG4iKTsKLQlwcmludGYoIiAgLXIgLS1yZXN0YXJ0XG4iKTsKLQlwcmludGYoIiAgLW4gZmxhZ3MvbWFza1x0U2V0IE5WUkFNIGF0dHJpYnV0ZXMuXG4iKTsKLQlwcmludGYoIiAgLWwgLS1saXN0ZW4gdGVzdG5yIFx0UGVyZm9ybSBzcGVjaWZpZWQgdGVzdCBudW1iZXJcbiIpOwotCXByaW50ZigiICAtaCAtLWhlbHAgdGhpcyB0ZXh0XG4iKTsKLQlwcmludGYoIiAgLXMgLS1zdHJlYW0taWQgSURcbiIpOwotCXByaW50ZigiICAtZCAtLXNvZnR3YXJlIGZpcm13YXJlXG4iKTsKKwlwcmludGYoIiAgLXUgLS11bml0LWlkIFVOSVRfSURcdFNldCB0aGUgVW5pdCBJRCBvZiB0aGUgQlRTXG4iKTsKKwlwcmludGYoIiAgLW8gLS1vbWwtaXAgSVBcdFNldCBwcmltYXJ5IE9NTCBJUCAoSVAgb2YgeW91ciBCU0MpXG4iKTsKKwlwcmludGYoIiAgLXIgLS1yZXN0YXJ0XHRcdFJlc3RhcnQgdGhlIEJUUyAoYWZ0ZXIgb3RoZXIgb3BlcmF0aW9ucylcbiIpOworCXByaW50ZigiICAtbiBmbGFncy9tYXNrXHRcdFNldCBOVlJBTSBhdHRyaWJ1dGVzLlxuIik7CisJcHJpbnRmKCIgIC1sIC0tbGlzdGVuIHRlc3Ruclx0UGVyZm9ybSBzcGVjaWZpZWQgdGVzdCBudW1iZXJcbiIpOworCXByaW50ZigiICAtaCAtLWhlbHBcdFx0dGhpcyB0ZXh0XG4iKTsKKwlwcmludGYoIiAgLXMgLS1zdHJlYW0taWQgSURcdFNldCB0aGUgSVBBIFN0cmVhbSBJZGVudGlmaWVyIGZvciBPTUxcbiIpOworCXByaW50ZigiICAtZCAtLXNvZnR3YXJlIGZpcm13YXJlIERvd25sb2FkIGZpcm13YXJlIGludG8gQlRTXG4iKTsKIAlwcmludGYoIiAgLWYgLS1maXJtd2FyZSBmaXJtd2FyZSBQcm92aWRlIGZpcm13YXJlIGluZm9ybWF0aW9uXG4iKTsKLQlwcmludGYoIiAgLXcgLS13cml0ZS1maXJtd2FyZS4gVGhpcyB3aWxsIGR1bXAgdGhlIGZpcm13YXJlIHBhcnRzIHRvIHRoZSBmaWxlc3lzdGVtLiBVc2Ugd2l0aCAtZi5cbiIpOworCXByaW50ZigiICAtdyAtLXdyaXRlLWZpcm13YXJlICAgIFRoaXMgd2lsbCBkdW1wIHRoZSBmaXJtd2FyZSBwYXJ0cyB0byB0aGUgZmlsZXN5c3RlbS4gVXNlIHdpdGggLWYuXG4iKTsKIH0KIAorZXh0ZXJuIHZvaWQgYnRzX21vZGVsX25hbm9idHNfaW5pdCgpOworCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJc3RydWN0IGdzbV9idHMgKmJ0czsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwogCWludCByYywgb3B0aW9uX2luZGV4ID0gMCwgc3RyZWFtX2lkID0gMHhmZjsKLQlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCXN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OwogCi0JZGVidWdfaW5pdCgpOwotCXN0ZGVycl90YXJnZXQgPSBkZWJ1Z190YXJnZXRfY3JlYXRlX3N0ZGVycigpOwotCWRlYnVnX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7Ci0JZGVidWdfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7Ci0JZGVidWdfc2V0X2xvZ19sZXZlbChzdGRlcnJfdGFyZ2V0LCAwKTsKLQlkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJETk0sMCIpOworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwlsb2dfc2V0X2xvZ19sZXZlbChzdGRlcnJfdGFyZ2V0LCAwKTsKKwlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRE5NLDAiKTsKIAlidHNfbW9kZWxfbmFub2J0c19pbml0KCk7CiAKIAlwcmludGYoImlwYWNjZXNzLWNvbmZpZyAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGVcbiIpOwpAQCAtNjM5LDYgKzY0OCw3IEBACiAJCQl7ICJzb2Z0d2FyZSIsIDEsIDAsICdkJyB9LAogCQkJeyAiZmlybXdhcmUiLCAxLCAwLCAnZicgfSwKIAkJCXsgIndyaXRlLWZpcm13YXJlIiwgMCwgMCwgJ3cnIH0sCisJCQl7IDAsIDAsIDAsIDAgfSwKIAkJfTsKIAogCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgInU6bzpybjpsOmhzOmQ6Zjp3IiwgbG9uZ19vcHRpb25zLApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jCmluZGV4IDAxZjhhMmQuLmVjNGEwYjcgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYworKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAlyYyA9IGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZXJyOwotI2VuZGlmCQkKKyNlbmRpZgogCXJldHVybiBmZDsKIAogZXJyOgpAQCAtNzksNyArNzksNyBAQAogCXJldHVybiByYzsKIH0KIAotY29uc3QgdW5zaWduZWQgY2hhciBmaW5kX3BrdFtdID0geyAweDAwLCAweDBiKzgsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIDB4MDAsIAorY29uc3QgdW5zaWduZWQgY2hhciBmaW5kX3BrdFtdID0geyAweDAwLCAweDBiKzgsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIDB4MDAsCiAJCQkJSVBBQ19NU0dUX0lEX0dFVCwKIAkJCQkJMHgwMSwgSVBBQ19JRFRBR19NQUNBRERSLAogCQkJCQkweDAxLCBJUEFDX0lEVEFHX0lQQUREUiwKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jCmluZGV4IDIxN2UwYmQuLjAzMTA3NDkgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYwpAQCAtMSw2ICsxLDggQEAKIC8qIE9wZW5CU0MgQWJpcy9JUCBwcm94eSBpcC5hY2Nlc3MgbmFub0JUUyAqLwogCiAvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgT24gV2F2ZXMKKyAqIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KICAqCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAgKgpAQCAtMzQsNiArMzYsOSBAQAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KIAorI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCiAjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgogI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgogI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgpAQCAtNDIsNyArNDcsNyBAQAogI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KICNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KIAotc3RhdGljIHN0cnVjdCBkZWJ1Z190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CitzdGF0aWMgc3RydWN0IGxvZ190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CiAKIC8qIG9uZSBpbnN0YW5jZSBvZiBhbiBpcC5hY2Nlc3MgcHJvdG9jb2wgcHJveHkgKi8KIHN0cnVjdCBpcGFfcHJveHkgewpAQCAtNTQsNiArNTksOSBAQAogCXN0cnVjdCBsbGlzdF9oZWFkIGJ0c19saXN0OwogCS8qIHRoZSBCU0MgcmVjb25uZWN0IHRpbWVyICovCiAJc3RydWN0IHRpbWVyX2xpc3QgcmVjb25uX3RpbWVyOworCS8qIGdsb2JhbCBHUFJTIE5TIGRhdGEgKi8KKwlzdHJ1Y3QgaW5fYWRkciBncHJzX2FkZHI7CisJc3RydWN0IGluX2FkZHIgbGlzdGVuX2FkZHI7CiB9OwogCiAvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgcHJveHkgc3RydWN0dXJlICovCkBAIC02NCw3ICs3Miw2IEBACiAJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7CiAJc3RydWN0IGlwYV9idHNfY29ubiAqYnRzX2Nvbm47CiB9OwotCiAjZGVmaW5lIE1BWF9UUlggNAogCiAvKiByZXByZXNlbnRzIGEgcGFydGljdWxhciBCVFMgaW4gb3VyIHByb3h5ICovCkBAIC05MSw2ICs5OCwxMyBAQAogCXN0cnVjdCBic2NfZmQgdWRwX2J0c19mZDsKIAlzdHJ1Y3QgYnNjX2ZkIHVkcF9ic2NfZmQ7CiAKKwkvKiBOUyBkYXRhICovCisJc3RydWN0IGluX2FkZHIgYnRzX2FkZHI7CisJc3RydWN0IGJzY19mZCBncHJzX25zX2ZkOworCWludCBncHJzX2xvY2FsX3BvcnQ7CisJdWludDE2X3QgZ3Byc19vcmlnX3BvcnQ7CisJdWludDMyX3QgZ3Byc19vcmlnX2lwOworCiAJY2hhciAqaWRfdGFnc1sweGZmXTsKIAl1X2ludDhfdCAqaWRfcmVzcDsKIAl1bnNpZ25lZCBpbnQgaWRfcmVzcF9sZW47CkBAIC0xMTAsOCArMTI0LDEyIEBACiAKIHN0YXRpYyBjaGFyICpsaXN0ZW5faXBhZGRyOwogc3RhdGljIGNoYXIgKmJzY19pcGFkZHI7CitzdGF0aWMgY2hhciAqZ3Byc19uc19pcGFkZHI7CiAKLSNkZWZpbmUgUFJPWFlfQUxMT0NfU0laRQkzMDAKK3N0YXRpYyBpbnQgbWFrZV9ncHJzX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKCpjYikoc3RydWN0IGJzY19mZCosdW5zaWduZWQgaW50KSwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgZ3Byc19uc19jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KTsKKworI2RlZmluZSBQUk9YWV9BTExPQ19TSVpFCTEyMDAKIAogc3RhdGljIGNvbnN0IHVfaW50OF90IHBvbmdbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX1BPTkcgfTsKIHN0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9hY2tbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX0lEX0FDSyB9OwpAQCAtMjY1LDEwICsyODMsMTAgQEAKIAkJCSAgIHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMsIHVfaW50OF90IHRyeF9pZCkKIHsKIAlpZiAoaXBiYykKLQkJZGVidWdwMihzcywgbHZsLCBmaWxlLCBsaW5lLCAwLCAiKCV1LyV1LyV1KSAiLCBpcGJjLT51bml0X2lkLnNpdGVfaWQsCisJCWxvZ3AyKHNzLCBsdmwsIGZpbGUsIGxpbmUsIDAsICIoJXUvJXUvJXUpICIsIGlwYmMtPnVuaXRfaWQuc2l0ZV9pZCwKIAkJICAgICBpcGJjLT51bml0X2lkLmJ0c19pZCwgdHJ4X2lkKTsKIAllbHNlCi0JCWRlYnVncDIoc3MsIGx2bCwgZmlsZSwgbGluZSwgMCwgInVua25vd24gIik7CisJCWxvZ3AyKHNzLCBsdmwsIGZpbGUsIGxpbmUsIDAsICJ1bmtub3duICIpOwogfQogCiAvKiBVRFAgc29ja2V0IGhhbmRsaW5nICovCkBAIC00OTIsNiArNTEwLDI4IEBACiAJCWdvdG8gZXJyX3VkcF9ic2M7CiAJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIENyZWF0ZWQgVURQIHNvY2tldCBmb3IgaW5qZWN0aW9uICIKIAkJInRvd2FyZHMgQlNDIGF0IHBvcnQgJXVcbiIsIHNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkLCB1ZHBfcG9ydCk7CisKKworCS8qIEdQUlMgTlMgcmVsYXRlZCBjb2RlICovCisJaWYgKGdwcnNfbnNfaXBhZGRyKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrOworCQlzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNvY2spOworCQlyZXQgPSBtYWtlX2dwcnNfc29jaygmaXBiYy0+Z3Byc19uc19mZCwgZ3Byc19uc19jYiwgaXBiYyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJDcmVhdGluZyB0aGUgR1BSUyBzb2NrZXQgZmFpbGVkLlxuIik7CisJCQlnb3RvIGVycl91ZHBfYnNjOworCQl9CisKKwkJcmV0ID0gZ2V0c29ja25hbWUoaXBiYy0+Z3Byc19uc19mZC5mZCwgKHN0cnVjdCBzb2NrYWRkciogKSAmc29jaywgJmxlbik7CisJCWlwYmMtPmdwcnNfbG9jYWxfcG9ydCA9IG50b2hzKHNvY2suc2luX3BvcnQpOworCQlMT0dQKERJTlAsIExPR0xfTk9USUNFLAorCQkJIkNyZWF0ZWQgR1BSUyBOUyBTb2NrZXQuIExpc3RlbmluZyBvbjogJXM6JWRcbiIsCisJCQlpbmV0X250b2Eoc29jay5zaW5fYWRkciksIGlwYmMtPmdwcnNfbG9jYWxfcG9ydCk7CisKKwkJcmV0ID0gZ2V0cGVlcm5hbWUoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciogKSAmc29jaywgJmxlbik7CisJCWlwYmMtPmJ0c19hZGRyID0gc29jay5zaW5fYWRkcjsKKwl9CisKIAlsbGlzdF9hZGQoJmlwYmMtPmxpc3QsICZpcHAtPmJ0c19saXN0KTsKIAogCXJldHVybiAwOwpAQCAtNTUwLDYgKzU5MCw3IEBACiAJCX0KIAogCQkvKiBsb29rdXAgQlRTLCBjcmVhdGUgc2lnbl9saW5rLCAuLi4gKi8KKwkJc2l0ZV9pZCA9IGJ0c19pZCA9IHRyeF9pZCA9IDA7CiAJCXBhcnNlX3VuaXRpZCgoY2hhciAqKVRMVlBfVkFMKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpLAogCQkJICAgICAmc2l0ZV9pZCwgJmJ0c19pZCwgJnRyeF9pZCk7CiAJCWlwYmMgPSBmaW5kX2J0c19ieV91bml0aWQoaXBwLCBzaXRlX2lkLCBidHNfaWQpOwpAQCAtNjE2LDYgKzY1NywxMCBAQAogCQlERUJVR1AoRE1JLCAiSURfQUNLPyAtPiBBQ0shXG4iKTsKIAkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaWRfYWNrLCBzaXplb2YoaWRfYWNrKSk7CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAiVW5oYW5kbGVkIElQQSB0eXBlOyAlZFxuIiwgbXNnX3R5cGUpOworCQlyZXR1cm4gMTsKKwkJYnJlYWs7CiAJfQogCXJldHVybiAwOwogfQpAQCAtODA0LDYgKzg0OSw0MiBAQAogCXRhbGxvY19mcmVlKGlwYyk7CiB9CiAKK3N0YXRpYyB2b2lkIHBhdGNoX2dwcnNfbXNnKHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMsIGludCBwcml2X25yLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXVpbnQ4X3QgKm5zdmNpOworCisJaWYgKChwcml2X25yICYgMHhmZikgIT0gT01MX0ZST01fQlRTICYmIChwcml2X25yICYgMHhmZikgIT0gT01MX1RPX0JTQykKKwkJcmV0dXJuOworCisJaWYgKG1zZ2JfbDJsZW4obXNnKSAhPSAzOSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGlzIGlzIGEgSVBBIFNldCBBdHRyaWJ1dGUgb3IgSVBBIFNldCBBdHRyaWJ1dGUgQUNLCisJICogYW5kIGlmIHRoZSBGT00gQ2xhc3MgaXMgR1BSUyBOU1ZDMCBhbmQgdGhlbiB3ZSB3aWxsIHBhdGNoIGl0LgorCSAqCisJICogVGhlIHBhdGNoIGFzc3VtZXMgdGhlIG1lc3NhZ2UgbG9va3MgbGlrZSB0aGUgb25lIGZyb20gdGhlIHRyYWNlCisJICogYnV0IHdlIG9ubHkgbWF0Y2ggbWVzc2FnZXMgd2l0aCBhIHNwZWNpZmljIHNpemUgYW55d2F5Li4uIFNvCisJICogdGhpcyBoYWNrIHNob3VsZCB3b3JrIGp1c3QgZmluZS4KKwkgKi8KKworCWlmIChtc2ctPmwyaFswXSA9PSAweDEwICYmIG1zZy0+bDJoWzFdID09IDB4ODAgJiYKKwkgICAgbXNnLT5sMmhbMl0gPT0gMHgwMCAmJiBtc2ctPmwyaFszXSA9PSAweDE1ICYmCisJICAgIG1zZy0+bDJoWzE4XSA9PSAweGY1ICYmIG1zZy0+bDJoWzE5XSA9PSAweGYyKSB7CisJCW5zdmNpID0gJm1zZy0+bDJoWzIzXTsKKwkJaXBiYy0+Z3Byc19vcmlnX3BvcnQgPSAgKih1X2ludDE2X3QgKikobnN2Y2krOCk7CisJCWlwYmMtPmdwcnNfb3JpZ19pcCA9ICoodV9pbnQzMl90ICopKG5zdmNpKzEwKTsKKwkJKih1X2ludDE2X3QgKikobnN2Y2krOCkgPSBodG9ucyhpcGJjLT5ncHJzX2xvY2FsX3BvcnQpOworCQkqKHVfaW50MzJfdCAqKShuc3ZjaSsxMCkgPSBpcGJjLT5pcHAtPmxpc3Rlbl9hZGRyLnNfYWRkcjsKKwl9IGVsc2UgaWYgKG1zZy0+bDJoWzBdID09IDB4MTAgJiYgbXNnLT5sMmhbMV0gPT0gMHg4MCAmJgorCSAgICBtc2ctPmwyaFsyXSA9PSAweDAwICYmIG1zZy0+bDJoWzNdID09IDB4MTUgJiYKKwkgICAgbXNnLT5sMmhbMThdID09IDB4ZjYgJiYgbXNnLT5sMmhbMTldID09IDB4ZjIpIHsKKwkJbnN2Y2kgPSAmbXNnLT5sMmhbMjNdOworCQkqKHVfaW50MTZfdCAqKShuc3ZjaSs4KSA9IGlwYmMtPmdwcnNfb3JpZ19wb3J0OworCQkqKHVfaW50MzJfdCAqKShuc3ZjaSsxMCkgPSBpcGJjLT5ncHJzX29yaWdfaXA7CisJfQorfQorCiBzdGF0aWMgaW50IGhhbmRsZV90Y3BfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCiB7CiAJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMgPSBiZmQtPmRhdGE7CkBAIC04NDIsMTEgKzkyMywxNCBAQAogCQkJY2xvc2UoYmZkLT5mZCk7CiAJCQliZmQtPmZkID0gLTE7CiAJCQl0YWxsb2NfZnJlZShiZmQpOworCQkJbXNnYl9mcmVlKG1zZyk7CisJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCQkvKiB3ZSBkbyBub3QgZm9yd2FyZCBwYXJ0cyBvZiB0aGUgQ0NNIHByb3RvY29sCisJCQkgKiB0aHJvdWdoIHRoZSBwcm94eSBidXQgcmF0aGVyIHRlcm1pbmF0ZSBpdCBvdXJzZWx2ZXMuICovCisJCQltc2diX2ZyZWUobXNnKTsKKwkJCXJldHVybiByZXQ7CiAJCX0KLQkJLyogd2UgZG8gbm90IGZvcndhcmQgdGhlIENDTSBwcm90b2NvbCB0aHJvdWdoIHRoZQotCQkgKiBwcm94eSBidXQgcmF0aGVyIHRlcm1pbmF0ZSBpdCBvdXJzZWx2ZXMgKi8KLQkJbXNnYl9mcmVlKG1zZyk7Ci0JCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKCFpcGJjKSB7CkBAIC04NTgsNiArOTQyLDggQEAKIAogCWJzY19jb25uID0gaXBjX2J5X3ByaXZfbnIoaXBiYywgYmZkLT5wcml2X25yKTsKIAlpZiAoYnNjX2Nvbm4pIHsKKwkJaWYgKGdwcnNfbnNfaXBhZGRyKQorCQkJcGF0Y2hfZ3Byc19tc2coaXBiYywgYmZkLT5wcml2X25yLCBtc2cpOwogCQkvKiBlbnF1ZXVlIHBhY2tldCB0b3dhcmRzIEJTQyAqLwogCQltc2diX2VucXVldWUoJmJzY19jb25uLT50eF9xdWV1ZSwgbXNnKTsKIAkJLyogbWFyayByZXNwZWN0aXZlIGZpbGVkZXNjcmlwdG9yIGFzICd3ZSB3YW50IHRvIHdyaXRlJyAqLwpAQCAtOTQ2LDcgKzEwMzIsNyBAQAogCQlwZXJyb3IoImFjY2VwdCIpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlERUJVR1AoRElOUCwgImFjY2VwdCgpZWQgbmV3ICVzIGxpbmsgZnJvbSAlc1xuIiwgCisJREVCVUdQKERJTlAsICJhY2NlcHQoKWVkIG5ldyAlcyBsaW5rIGZyb20gJXNcbiIsCiAJCShsaXN0ZW5fYmZkLT5wcml2X25yICYgMHhmZikgPT0gT01MX0ZST01fQlRTID8gIk9NTCIgOiAiUlNMIiwKIAkJaW5ldF9udG9hKHNhLnNpbl9hZGRyKSk7CiAKQEAgLTk3Niw2ICsxMDYyLDU0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHNlbmRfbnMoaW50IGZkLCBjb25zdCBjaGFyICpidWYsIGludCBzaXplLCBzdHJ1Y3QgaW5fYWRkciBpcCwgaW50IHBvcnQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKGFkZHIpOworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWFkZHIuc2luX2FkZHIgPSBpcDsKKworCXJldCA9IHNlbmR0byhmZCwgYnVmLCBzaXplLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBmb3J3YXJkIEdQUlMgbWVzc2FnZS5cbiIpOworCX0KK30KKworc3RhdGljIGludCBncHJzX25zX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IGlwYV9idHNfY29ubiAqYnRzOworCWNoYXIgYnVmWzQwOTZdOworCWludCByZXQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNvY2s7CisJc29ja2xlbl90IGxlbiA9IHNpemVvZihzb2NrKTsKKworCS8qIDEuIGdldCB0aGUgZGF0YS4uLiAqLworCXJldCA9IHJlY3Zmcm9tKGJmZC0+ZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2ssICZsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byByZWN2IEdQUlMgTlMgbXNnOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlidHMgPSBiZmQtPmRhdGE7CisKKwkvKiAyLiBmaWd1cmUgb3V0IHdoZXJlIHRvIHNlbmQgaXQgdG8gKi8KKwlpZiAobWVtY21wKCZzb2NrLnNpbl9hZGRyLCAmaXBwLT5ncHJzX2FkZHIsIHNpemVvZihzb2NrLnNpbl9hZGRyKSkgPT0gMCkgeworCQlMT0dQKERJTlAsIExPR0xfREVCVUcsICJHUFJTIE5TIG1zZyBmcm9tIG5ldHdvcmsuXG4iKTsKKwkJc2VuZF9ucyhiZmQtPmZkLCBidWYsIHJldCwgYnRzLT5idHNfYWRkciwgMjMwMDApOworCX0gZWxzZSBpZiAobWVtY21wKCZzb2NrLnNpbl9hZGRyLCAmYnRzLT5idHNfYWRkciwgc2l6ZW9mKHNvY2suc2luX2FkZHIpKSA9PSAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9ERUJVRywgIkdQUlMgTlMgbXNnIGZyb20gQlRTLlxuIik7CisJCXNlbmRfbnMoYmZkLT5mZCwgYnVmLCByZXQsIGlwcC0+Z3Byc19hZGRyLCAyMzAwMCk7CisJfSBlbHNlIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiVW5rbm93biBHUFJTIHNvdXJjZTogJXNcbiIsIGluZXRfbnRvYShzb2NrLnNpbl9hZGRyKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbWFrZV9saXN0ZW5fc29jayhzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVfaW50MTZfdCBwb3J0LCBpbnQgcHJpdl9uciwKIAkJICAgICBpbnQgKCpjYikoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSkKIHsKQEAgLTk5OSw4ICsxMTMzLDkgQEAKIAogCXJldCA9IGJpbmQoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKIAlpZiAocmV0IDwgMCkgewotCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgYmluZCBsaXN0ZW4gc29ja2V0ICVzXG4iLAotCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLAorCQkJIkNvdWxkIG5vdCBiaW5kIGxpc3RlbiBzb2NrZXQgZm9yIElQICVzIHdpdGggZXJyb3I6ICVzLlxuIiwKKwkJCWxpc3Rlbl9pcGFkZHIsIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTAxOCw2ICsxMTUzLDM3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbWFrZV9ncHJzX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKCpjYikoc3RydWN0IGJzY19mZCosdW5zaWduZWQgaW50KSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgcmV0OworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+ZGF0YSA9IGRhdGE7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gMDsKKwlpbmV0X2F0b24obGlzdGVuX2lwYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwKKwkJCSJDb3VsZCBub3QgYmluZCBuIHNvY2tldCBmb3IgSVAgJXMgd2l0aCBlcnJvcjogJXMuXG4iLAorCQkJbGlzdGVuX2lwYWRkciwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJyZWdpc3Rlcl9saXN0ZW5fZmQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qIEFjdGl2ZWx5IGNvbm5lY3QgdG8gYSBCU0MuICAqLwogc3RhdGljIHN0cnVjdCBpcGFfcHJveHlfY29ubiAqY29ubmVjdF9ic2Moc3RydWN0IHNvY2thZGRyX2luICpzYSwgaW50IHByaXZfbnIsIHZvaWQgKmRhdGEpCiB7CkBAIC0xMDQyLDcgKzEyMDgsOCBAQAogCiAJcmV0ID0gY29ubmVjdChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopIHNhLCBzaXplb2YoKnNhKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNvbm5lY3Qgc29ja2V0XG4iKTsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiQ291bGQgbm90IGNvbm5lY3Qgc29ja2V0OiAlc1xuIiwKKwkJICAgICBpbmV0X250b2Eoc2EtPnNpbl9hZGRyKSk7CiAJCWNsb3NlKGJmZC0+ZmQpOwogCQl0YWxsb2NfZnJlZShpcGMpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTEwODAsNiArMTI0NywxNSBAQAogCXJldCA9IG1ha2VfbGlzdGVuX3NvY2soJmlwcC0+cnNsX2xpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX1JTTCwKIAkJCQlSU0xfRlJPTV9CVFMsIGxpc3Rlbl9mZF9jYik7CiAKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENvbm5lY3QgdGhlIEdQUlMgTlMgU29ja2V0ICovCisJaWYgKGdwcnNfbnNfaXBhZGRyKSB7CisJCWluZXRfYXRvbihncHJzX25zX2lwYWRkciwgJmlwcC0+Z3Byc19hZGRyKTsKKwkJaW5ldF9hdG9uKGxpc3Rlbl9pcGFkZHIsICZpcHAtPmxpc3Rlbl9hZGRyKTsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDk5LDYgKzEyNzUsNzUgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiIGlwYWNjZXNzLXByb3h5IGlzIGEgcHJveHkgQlRTLlxuIik7CisJcHJpbnRmKCIgLWggLS1oZWxwLiBUaGlzIGhlbHAgdGV4dC5cbiIpOworCXByaW50ZigiIC1sIC0tbGlzdGVuIElQLiBUaGUgaXAgdG8gbGlzdGVuIHRvLlxuIik7CisJcHJpbnRmKCIgLWIgLS1ic2MgSVAuIFRoZSBCU0MgSVAgYWRkcmVzcy5cbiIpOworCXByaW50ZigiIC1nIC0tZ3BycyBJUC4gVGFrZSBHUFJTIE5TIGZyb20gdGhhdCBJUC5cbiIpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoIiAtcyAtLWRpc2FibGUtY29sb3IuIERpc2FibGUgdGhlIGNvbG9yIGluc2lkZSB0aGUgbG9nZ2luZyBtZXNzYWdlLlxuIik7CisJcHJpbnRmKCIgLWUgLS1sb2ctbGV2ZWwgbnVtYmVyLiBTZXQgdGhlIGdsb2JhbCBsb2dsZXZlbC5cbiIpOworCXByaW50ZigiIC1UIC0tdGltZXN0YW1wLiBQcmVmaXggZXZlcnkgbG9nIG1lc3NhZ2Ugd2l0aCBhIHRpbWVzdGFtcC5cbiIpOworCXByaW50ZigiIC1WIC0tdmVyc2lvbi4gUHJpbnQgdGhlIHZlcnNpb24gb2YgT3BlbkJTQy5cbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZSgpCit7CisJcHJpbnRmKCJVc2FnZTogaXBhY2Nlc3MtcHJveHlcbiIpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IG9wdGlvbl9pbmRleCA9IDAsIGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyJoZWxwIiwgMCwgMCwgJ2gnfSwKKwkJCXsiZGlzYWJsZS1jb2xvciIsIDAsIDAsICdzJ30sCisJCQl7InRpbWVzdGFtcCIsIDAsIDAsICdUJ30sCisJCQl7ImxvZy1sZXZlbCIsIDEsIDAsICdlJ30sCisJCQl7Imxpc3RlbiIsIDEsIDAsICdsJ30sCisJCQl7ImJzYyIsIDEsIDAsICdiJ30sCisJCQl7InVkcCIsIDEsIDAsICd1J30sCisJCQl7MCwgMCwgMCwgMH0KKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhzVGU6bDpiOmc6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X3VzYWdlKCk7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQljYXNlICdsJzoKKwkJCWxpc3Rlbl9pcGFkZHIgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlic2NfaXBhZGRyID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJZ3Byc19uc19pcGFkZHIgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlsb2dfc2V0X3VzZV9jb2xvcihzdGRlcnJfdGFyZ2V0LCAwKTsKKwkJCWJyZWFrOworCQljYXNlICdUJzoKKwkJCWxvZ19zZXRfcHJpbnRfdGltZXN0YW1wKHN0ZGVycl90YXJnZXQsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJbG9nX3NldF9sb2dfbGV2ZWwoc3RkZXJyX3RhcmdldCwgYXRvaShvcHRhcmcpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogaWdub3JlICovCisJCQlicmVhazsKKwkJfQorCX0KK30KKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCWludCByYzsKQEAgLTExMDgsMTEgKzEzNTMsMTMgQEAKIAogCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAiaXBhY2Nlc3MtcHJveHkiKTsKIAotCWRlYnVnX2luaXQoKTsKLQlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKLQlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOwotCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOwotCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRJTlA6RE1JIik7CisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJESU5QOkRNSSIpOworCisJaGFuZGxlX29wdGlvbnMoYXJnYywgYXJndik7CiAKIAlyYyA9IGlwYWNjZXNzX3Byb3h5X3NldHVwKCk7CiAJaWYgKHJjIDwgMCkKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9tYWluLmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbWFpbi5jCmluZGV4IGU0NWExZTkuLmQ1YjY1MDIgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9tYWluLmMKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX21haW4uYwpAQCAtMzgsNyArMzgsMTEgQEAKICNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CiAjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+Ci0jaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwX2ludGVybmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvL3RlbG5ldF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorCisjaW5jbHVkZSA8b3Ntb2NvbS92dHkvY29tbWFuZC5oPgogCiAjaW5jbHVkZSAiLi4vLi4vYnNjY29uZmlnLmgiCiAKQEAgLTUxLDEwICs1NSwxMCBAQAogI3dhcm5pbmcgIk1ha2UgdXNlIG9mIHRoZSBydHAgcHJveHkgY29kZSIKIAogc3RhdGljIHN0cnVjdCBic2NfZmQgYmZkOwotc3RhdGljIGludCBmaXJzdF9yZXF1ZXN0ID0gMTsKIHN0YXRpYyBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKLWNvbnN0IGNoYXIgKm9wZW5ic2NfdmVyc2lvbiA9ICJPcGVuQlNDIE1HQ1AgIiBQQUNLQUdFX1ZFUlNJT047Ci1jb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodCA9IAorc3RhdGljIGludCByZXNldF9lbmRwb2ludHMgPSAwOworCitjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodCA9CiAJIkNvcHlyaWdodCAoQykgMjAwOS0yMDEwIEhvbGdlciBGcmV5dGhlciBhbmQgT24tV2F2ZXNcbiIKIAkiQ29udHJpYnV0aW9ucyBieSBEYW5pZWwgV2lsbG1hbm4sIEphbiBMw7xiYmUsU3RlZmFuIFNjaG1pZHRcbiIKIAkiRGlldGVyIFNwYWFyLCBBbmRyZWFzIEV2ZXJzYmVyZywgSGFyYWxkIFdlbHRlXG5cbiIKQEAgLTc0LDEyICs3OCw2IEBACiAJcHJpbnRmKCIgLWMgLS1jb25maWctZmlsZSBmaWxlbmFtZSBUaGUgY29uZmlnIGZpbGUgdG8gdXNlLlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24oKQotewotCXByaW50ZigiJXNcblxuIiwgb3BlbmJzY192ZXJzaW9uKTsKLQlwcmludGYob3BlbmJzY19jb3B5cmlnaHQpOwotfQotCiBzdGF0aWMgdm9pZCBoYW5kbGVfb3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiB7CiAJd2hpbGUgKDEpIHsKQEAgLTEwNSw3ICsxMDMsNyBAQAogCQkJY29uZmlnX2ZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfYnNjX2N0eCwgb3B0YXJnKTsKIAkJCWJyZWFrOwogCQljYXNlICdWJzoKLQkJCXByaW50X3ZlcnNpb24oKTsKKwkJCXByaW50X3ZlcnNpb24oMSk7CiAJCQlleGl0KDApOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0xMTUsMTIgKzExMywzMCBAQAogCX0KIH0KIAorLyogc2ltcGx5IHJlbWVtYmVyIHRoaXMgKi8KK3N0YXRpYyBpbnQgbWdjcF9yc2lwX2NiKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCXJlc2V0X2VuZHBvaW50cyA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2NwX2NoYW5nZV9jYihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgaW50IGVuZHBvaW50LCBpbnQgc3RhdGUsIGludCBsb2NhbF9ydHApCit7CisJaWYgKHN0YXRlICE9IE1HQ1BfRU5EUF9NRENYKQorCQlyZXR1cm4gMDsKKworCW1nY3Bfc2VuZF9kdW1teSgmY2ZnLT5lbmRwb2ludHNbZW5kcG9pbnRdKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCByZWFkX2NhbGxfYWdlbnQoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQogewogCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwogCXNvY2tsZW5fdCBzbGVuID0gc2l6ZW9mKGFkZHIpOwogCXN0cnVjdCBtc2diICptc2c7CiAJc3RydWN0IG1zZ2IgKnJlc3A7CisJaW50IGk7CiAKIAltc2cgPSAoc3RydWN0IG1zZ2IgKikgZmQtPmRhdGE7CiAKQEAgLTEzNiwxOCArMTUyLDYgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChmaXJzdF9yZXF1ZXN0KSB7Ci0JCWZpcnN0X3JlcXVlc3QgPSAwOwotCQlyZXNwID0gbWdjcF9jcmVhdGVfcnNpcCgpOwotCi0JCWlmIChyZXNwKSB7Ci0JCQlzZW5kdG8oYmZkLmZkLCByZXNwLT5sMmgsIG1zZ2JfbDJsZW4ocmVzcCksIDAsCi0JCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKLQkJCW1zZ2JfZnJlZShyZXNwKTsKLQkJfQotCQlyZXR1cm4gMDsKLSAgICAgICAgfQotCiAJLyogaGFuZGxlIG1lc3NhZ2Ugbm93ICovCiAJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHJjKTsKIAlyZXNwID0gbWdjcF9oYW5kbGVfbWVzc2FnZShjZmcsIG1zZyk7CkBAIC0xNTcsMzUgKzE2MSw2MyBAQAogCQlzZW5kdG8oYmZkLmZkLCByZXNwLT5sMmgsIG1zZ2JfbDJsZW4ocmVzcCksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CiAJCW1zZ2JfZnJlZShyZXNwKTsKIAl9CisKKwlpZiAocmVzZXRfZW5kcG9pbnRzKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiQXNrZWQgdG8gcmVzZXQgZW5kcG9pbnRzLlxuIik7CisJCXJlc2V0X2VuZHBvaW50cyA9IDA7CisKKwkJLyogaXMgY2hlY2tpbmcgaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX0xPT1BCQUNLIG1ha2luZyBpdCBtb3JlIHNlY3VyZT8gKi8KKwkJZm9yIChpID0gMTsgaSA8IGNmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKQorCQkJbWdjcF9mcmVlX2VuZHAoJmNmZy0+ZW5kcG9pbnRzW2ldKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAorZXh0ZXJuIGVudW0gbm9kZV90eXBlIGJzY192dHlfZ29fcGFyZW50KHN0cnVjdCB2dHkgKnZ0eSk7CisKK3N0YXRpYyBzdHJ1Y3QgdnR5X2FwcF9pbmZvIHZ0eV9pbmZvID0geworCS5uYW1lIAkJPSAiT3BlbkJTQyBNR0NQIiwKKwkudmVyc2lvbgk9IFBBQ0tBR0VfVkVSU0lPTiwKKwkuZ29fcGFyZW50X2NiCT0gYnNjX3Z0eV9nb19wYXJlbnQsCit9OwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiB7CiAJc3RydWN0IGdzbV9uZXR3b3JrIGR1bW15X25ldHdvcms7CiAJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CiAJaW50IG9uID0gMSwgcmM7Ci0Jc3RydWN0IGRlYnVnX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKIAogCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAibWdjcC1jYWxsYWdlbnQiKTsKIAotCWRlYnVnX2luaXQoKTsKLQlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKLQlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOwotCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKIAogCWNmZyA9IG1nY3BfY29uZmlnX2FsbG9jKCk7CiAJaWYgKCFjZmcpCiAJCXJldHVybiAtMTsKIAorCXZ0eV9pbmZvLmNvcHlyaWdodCA9IG9wZW5ic2NfY29weXJpZ2h0OworCXZ0eV9pbml0KCZ2dHlfaW5mbyk7CisJbG9nZ2luZ192dHlfYWRkX2NtZHMoKTsKKwltZ2NwX3Z0eV9pbml0KCk7CisKIAloYW5kbGVfb3B0aW9ucyhhcmdjLCBhcmd2KTsKIAotCXRlbG5ldF9pbml0KCZkdW1teV9uZXR3b3JrLCA0MjQzKTsKICAgICAgICAgcmMgPSBtZ2NwX3BhcnNlX2NvbmZpZyhjb25maWdfZmlsZSwgY2ZnKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKKwlyYyA9IHRlbG5ldF9pbml0KHRhbGxfYnNjX2N0eCwgJmR1bW15X25ldHdvcmssIDQyNDMpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIHNldCBzb21lIGNhbGxiYWNrcyAqLworCWNmZy0+cmVzZXRfY2IgPSBtZ2NwX3JzaXBfY2I7CisJY2ZnLT5jaGFuZ2VfY2IgPSBtZ2NwX2NoYW5nZV9jYjsKIAogICAgICAgICAvKiB3ZSBuZWVkIHRvIGJpbmQgYSBzb2NrZXQgKi8KICAgICAgICAgaWYgKHJjID09IDApIHsKQEAgLTIxNywxMSArMjQ5LDExIEBACiAKIAogCQlpZiAoYnNjX3JlZ2lzdGVyX2ZkKCZiZmQpICE9IDApIHsKLQkJCURFQlVHUChETUdDUCwgIkZhaWxlZCB0byByZWdpc3RlciB0aGUgZmRcbiIpOworCQkJTE9HUChETUdDUCwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byByZWdpc3RlciB0aGUgZmRcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAKLQkJREVCVUdQKERNR0NQLCAiQ29uZmlndXJlZCBmb3IgTUdDUC5cbiIpOworCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNvbmZpZ3VyZWQgZm9yIE1HQ1AuXG4iKTsKIAl9CiAKIAkvKiBpbml0aWFsaXNhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMKaW5kZXggYjc2Y2E0Ny4uMWY1MTIzMyAxMDA2NDQKLS0tIGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYworKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbmV0d29yay5jCkBAIC0yMywxNCArMjMsMTUgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KIAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAogI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KLSNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KICNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KIAogI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KQEAgLTcyLDYgKzczLDggQEAKIAlQUk9UT19SVENQLAogfTsKIAorI2RlZmluZSBEVU1NWV9MT0FEIDB4MjMKKwogCiBzdGF0aWMgaW50IHVkcF9zZW5kKGludCBmZCwgc3RydWN0IGluX2FkZHIgKmFkZHIsIGludCBwb3J0LCBjaGFyICpidWYsIGludCBsZW4pCiB7CkBAIC04Myw2ICs4NiwxNCBAQAogCXJldHVybiBzZW5kdG8oZmQsIGJ1ZiwgbGVuLCAwLCAoc3RydWN0IHNvY2thZGRyICopJm91dCwgc2l6ZW9mKG91dCkpOwogfQogCitpbnQgbWdjcF9zZW5kX2R1bW15KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKQoreworCXN0YXRpYyBjaGFyIGJ1ZltdID0geyBEVU1NWV9MT0FEIH07CisKKwlyZXR1cm4gdWRwX3NlbmQoZW5kcC0+bG9jYWxfcnRwLmZkLCAmZW5kcC0+cmVtb3RlLAorCQkJZW5kcC0+bmV0X3J0cCwgYnVmLCAxKTsKK30KKwogc3RhdGljIHZvaWQgcGF0Y2hfcGF5bG9hZChpbnQgcGF5bG9hZCwgY2hhciAqZGF0YSwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgcnRwX2hkciAqcnRwX2hkcjsKQEAgLTkwLDYgKzEwMSw5IEBACiAJaWYgKGxlbiA8IHNpemVvZigqcnRwX2hkcikpCiAJCXJldHVybjsKIAorCWlmIChwYXlsb2FkIDwgMCkKKwkJcmV0dXJuOworCiAJcnRwX2hkciA9IChzdHJ1Y3QgcnRwX2hkciAqKSBkYXRhOwogCXJ0cF9oZHItPnBheWxvYWRfdHlwZSA9IHBheWxvYWQ7CiB9CkBAIC0xMTksMTYgKzEzMywxNCBAQAogCXJjID0gcmVjdmZyb20oZmQtPmZkLCAmYnVmLCBzaXplb2YoYnVmKSwgMCwKIAkJCSAgICAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCAmc2xlbik7CiAJaWYgKHJjIDwgMCkgewotCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHJlY2VpdmUgbWVzc2FnZSBvbjogMHgleFxuIiwKLQkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcmVjZWl2ZSBtZXNzYWdlIG9uOiAweCV4IGVycm5vOiAlZC8lc1xuIiwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAkvKiBkbyBub3QgZm9yd2FyZCBheW50aGluZy4uLiBtYXliZSB0aGVyZSBpcyBhIHBhY2tldCBmcm9tIHRoZSBidHMgKi8KLQlpZiAoZW5kcC0+Y2kgPT0gQ0lfVU5VU0VEKSB7Ci0JCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJVbmtub3duIG1lc3NhZ2Ugb24gZW5kcG9pbnQ6IDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkKIAkJcmV0dXJuIC0xOwotCX0KIAogCS8qCiAJICogRmlndXJlIG91dCB3aGVyZSB0byBmb3J3YXJkIGl0IHRvLiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHdlCkBAIC0xMzksMTQgKzE1MSwxNiBAQAogCSAqLwogCSN3YXJuaW5nICJTbGlnaHQgc3BlYyB2aW9sYXRpb24uIFdpdGggY29ubmVjdGlvbiBtb2RlIHJlY3Zvbmx5IHdlIHNob3VsZCBhdHRlbXB0IHRvIGZvcndhcmQuIgogCWRlc3QgPSBtZW1jbXAoJmFkZHIuc2luX2FkZHIsICZlbmRwLT5yZW1vdGUsIHNpemVvZihhZGRyLnNpbl9hZGRyKSkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAoZW5kcC0+bmV0X3J0cCA9PSBhZGRyLnNpbl9wb3J0IHx8IGVuZHAtPm5ldF9ydGNwID09IGFkZHIuc2luX3BvcnQpCisJCSAgICAoZW5kcC0+bmV0X3J0cCA9PSBhZGRyLnNpbl9wb3J0IHx8IGVuZHAtPm5ldF9ydGNwID09IGFkZHIuc2luX3BvcnQpCiAJCQk/IERFU1RfQlRTIDogREVTVF9ORVRXT1JLOwogCXByb3RvID0gZmQgPT0gJmVuZHAtPmxvY2FsX3J0cCA/IFBST1RPX1JUUCA6IFBST1RPX1JUQ1A7CiAKIAkvKiBXZSBoYXZlIG5vIGlkZWEgd2hvIGNhbGxlZCB1cywgbWF5YmUgaXQgaXMgdGhlIEJUUy4gKi8KIAlpZiAoZGVzdCA9PSBERVNUX05FVFdPUksgJiYgKGVuZHAtPmJ0c19ydHAgPT0gMCB8fCBjZmctPmZvcndhcmRfaXApKSB7CiAJCS8qIGl0IHdhcyB0aGUgQlRTLi4uICovCi0JCWlmICghY2ZnLT5idHNfaXAgfHwgbWVtY21wKCZhZGRyLnNpbl9hZGRyLCAmY2ZnLT5idHNfaW4sIHNpemVvZihjZmctPmJ0c19pbikpID09IDApIHsKKwkJaWYgKCFjZmctPmJ0c19pcAorCQkgICAgfHwgbWVtY21wKCZhZGRyLnNpbl9hZGRyLCAmY2ZnLT5idHNfaW4sIHNpemVvZihjZmctPmJ0c19pbikpID09IDAKKwkJICAgIHx8IG1lbWNtcCgmYWRkci5zaW5fYWRkciwgJmVuZHAtPmJ0cywgc2l6ZW9mKGVuZHAtPmJ0cykpID09IDApIHsKIAkJCWlmIChmZCA9PSAmZW5kcC0+bG9jYWxfcnRwKSB7CiAJCQkJZW5kcC0+YnRzX3J0cCA9IGFkZHIuc2luX3BvcnQ7CiAJCQl9IGVsc2UgewpAQCAtMTU0LDEyICsxNjgsMjcgQEAKIAkJCX0KIAogCQkJZW5kcC0+YnRzID0gYWRkci5zaW5fYWRkcjsKLQkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRm91bmQgQlRTIGZvciBlbmRwb2ludDogMHgleCBvbiBwb3J0OiAlZC8lZFxuIiwKLQkJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIG50b2hzKGVuZHAtPmJ0c19ydHApLCBudG9ocyhlbmRwLT5idHNfcnRjcCkpOworCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJGb3VuZCBCVFMgZm9yIGVuZHBvaW50OiAweCV4IG9uIHBvcnQ6ICVkLyVkIG9mICVzXG4iLAorCQkJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgbnRvaHMoZW5kcC0+YnRzX3J0cCksIG50b2hzKGVuZHAtPmJ0c19ydGNwKSwKKwkJCQlpbmV0X250b2EoYWRkci5zaW5fYWRkcikpOworCiAJCX0KIAl9CiAKLQkvKiBkaXNwYXRjaCAqLworCS8qIHRocm93IGF3YXkgdGhlIGR1bW15IG1lc3NhZ2UgKi8KKwlpZiAocmMgPT0gMSAmJiBidWZbMF0gPT0gRFVNTVlfTE9BRCkgeworCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkZpbHRlcmVkIGR1bW15IG9uIDB4JXhcbiIsCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkbyB0aGlzIGJlZm9yZSB0aGUgbG9vcCBoYW5kbGluZyAqLworCWlmIChkZXN0ID09IERFU1RfTkVUV09SSykKKwkJKytlbmRwLT5pbl9idHM7CisJZWxzZQorCQkrK2VuZHAtPmluX3JlbW90ZTsKKworCS8qIEZvciBsb29wIHRvZ2dsZSB0aGUgZGVzdGluYXRpb24gYW5kIHRoZW4gZGlzcGF0Y2guICovCiAJaWYgKGNmZy0+YXVkaW9fbG9vcCkKIAkJZGVzdCA9ICFkZXN0OwogCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfcHJvdG9jb2wuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jCmluZGV4IGY3ZWY1NDcuLmQ4MmJkNjggMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jCkBAIC04MCwxMSArODAsNiBAQAogCX0KIAogCi1zdHJ1Y3QgbWdjcF9tc2dfcHRyIHsKLQl1bnNpZ25lZCBpbnQgc3RhcnQ7Ci0JdW5zaWduZWQgaW50IGxlbmd0aDsKLX07Ci0KIHN0cnVjdCBtZ2NwX3JlcXVlc3QgewogCWNoYXIgKm5hbWU7CiAJc3RydWN0IG1zZ2IgKigqaGFuZGxlX3JlcXVlc3QpIChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CkBAIC05OCw2ICs5Myw3IEBACiBzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9jcmVhdGVfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKIHN0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2RlbGV0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOwogc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfbW9kaWZ5X2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9yc2lwKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKIAogc3RhdGljIGludCBnZW5lcmF0ZV9jYWxsX2lkKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQogewpAQCAtMTE5LDEyICsxMTUsNiBAQAogCXJldHVybiBjZmctPmxhc3RfY2FsbF9pZDsKIH0KIAotLyogRklYSU1FL1RPRE86IG5lZWQgdG8gaGF2ZSBhIGxpc3Qgb2YgcGVuZGluZyB0cmFuc2FjdGlvbnMgYW5kIGNoZWNrIHRoYXQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2VuZXJhdGVfdHJhbnNhY3Rpb25faWQoKQotewotCXJldHVybiBhYnMocmFuZCgpKTsKLX0KLQogLyoKICAqIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBoYW5kbGluZyB2YXJpb3VzCiAgKiBtZXNzYWdlcy4gSW4gdGhlIGZ1dHVyZSB0aGlzIG1pZ2h0IGJlIGJpbmFyeSBzb3J0ZWQKQEAgLTEzNSw2ICsxMjUsOSBAQAogCU1HQ1BfUkVRVUVTVCgiQ1JDWCIsIGhhbmRsZV9jcmVhdGVfY29uLCAiQ3JlYXRlQ29ubmVjdGlvbiIpCiAJTUdDUF9SRVFVRVNUKCJETENYIiwgaGFuZGxlX2RlbGV0ZV9jb24sICJEZWxldGVDb25uZWN0aW9uIikKIAlNR0NQX1JFUVVFU1QoIk1EQ1giLCBoYW5kbGVfbW9kaWZ5X2NvbiwgIk1vZGlmaXlDb25uZWN0aW9uIikKKworCS8qIFNQRUMgZXh0ZW5zaW9uICovCisJTUdDUF9SRVFVRVNUKCJSU0lQIiwgaGFuZGxlX3JzaXAsICJSZVNldEluUHJvZ3Jlc3MiKQogfTsKIAogc3RhdGljIHN0cnVjdCBtc2diICptZ2NwX21zZ2JfYWxsb2Modm9pZCkKQEAgLTE5NCwyMyArMTg3LDYgQEAKIAlyZXR1cm4gbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKDIwMCwgbXNnLCB0cmFuc19pZCwgc2RwX3JlY29yZCk7CiB9CiAKLS8qIHNlbmQgYSBzdGF0aWMgcmVjb3JkICovCi1zdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcnNpcCh2b2lkKQotewotCXN0cnVjdCBtc2diICptc2c7Ci0JaW50IGxlbjsKLQotCW1zZyA9IG1nY3BfbXNnYl9hbGxvYygpOwotCWlmICghbXNnKQotCQlyZXR1cm4gTlVMTDsKLQotCWxlbiA9IHNucHJpbnRmKChjaGFyICopIG1zZy0+ZGF0YSwgMjA0OCwKLQkJCSJSU0lQICV1ICpAbWd3IE1HQ1AgMS4wXG4iCi0JCQkiUk06IHJlc3RhcnRcbiIsIGdlbmVyYXRlX3RyYW5zYWN0aW9uX2lkKCkpOwotCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBsZW4pOwotCXJldHVybiBtc2c7Ci19Ci0KIC8qCiAgKiBoYW5kbGUgaW5jb21pbmcgbWVzc2FnZXM6CiAgKiAgIC0gdGhpcyBjYW4gYmUgYSBjb21tYW5kIChmb3VyIGxldHRlcnMsIHNwYWNlLCB0cmFuc2FjdGlvbiBpZCkKQEAgLTIyMSwyNSArMTk3LDI1IEBACiAgICAgICAgIGludCBjb2RlOwogCXN0cnVjdCBtc2diICpyZXNwID0gTlVMTDsKIAotCWlmIChtc2ctPmxlbiA8IDQpIHsKKwlpZiAobXNnYl9sMmxlbihtc2cpIDwgNCkgewogCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAibWdzIHRvbyBzaG9ydDogJWRcbiIsIG1zZy0+bGVuKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAgICAgICAgIC8qIGF0dGVtcHQgdG8gdHJlYXQgaXQgYXMgYSByZXNwb25zZSAqLwotICAgICAgICBpZiAoc3NjYW5mKChjb25zdCBjaGFyICopJm1zZy0+ZGF0YVswXSwgIiUzZCAlKnMiLCAmY29kZSkgPT0gMSkgeworICAgICAgICBpZiAoc3NjYW5mKChjb25zdCBjaGFyICopJm1zZy0+bDJoWzBdLCAiJTNkICUqcyIsICZjb2RlKSA9PSAxKSB7CiAJCUxPR1AoRE1HQ1AsIExPR0xfREVCVUcsICJSZXNwb25zZTogQ29kZTogJWRcbiIsIGNvZGUpOwogCX0gZWxzZSB7CiAJCWludCBpLCBoYW5kbGVkID0gMDsKIAkJbXNnLT5sM2ggPSAmbXNnLT5sMmhbNF07CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1nY3BfcmVxdWVzdHMpOyArK2kpCi0JCQlpZiAoc3RybmNtcChtZ2NwX3JlcXVlc3RzW2ldLm5hbWUsIChjb25zdCBjaGFyICopICZtc2ctPmRhdGFbMF0sIDQpID09IDApIHsKKwkJCWlmIChzdHJuY21wKG1nY3BfcmVxdWVzdHNbaV0ubmFtZSwgKGNvbnN0IGNoYXIgKikgJm1zZy0+bDJoWzBdLCA0KSA9PSAwKSB7CiAJCQkJaGFuZGxlZCA9IDE7CiAJCQkJcmVzcCA9IG1nY3BfcmVxdWVzdHNbaV0uaGFuZGxlX3JlcXVlc3QoY2ZnLCBtc2cpOwogCQkJCWJyZWFrOwogCQkJfQogCQlpZiAoIWhhbmRsZWQpIHsKLQkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTVNHIHdpdGggdHlwZTogJyUuNHMnIG5vdCBoYW5kbGVkXG4iLCAmbXNnLT5kYXRhWzBdKTsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTVNHIHdpdGggdHlwZTogJyUuNHMnIG5vdCBoYW5kbGVkXG4iLCAmbXNnLT5sMmhbMF0pOwogCQl9CiAJfQogCkBAIC0yOTYsOSArMjcyLDkgQEAKIAlyZXR1cm4gJmNmZy0+ZW5kcG9pbnRzW2d3XTsKIH0KIAotc3RhdGljIGludCBhbmFseXplX2hlYWRlcihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZywKLQkJCSAgc3RydWN0IG1nY3BfbXNnX3B0ciAqcHRyLCBpbnQgc2l6ZSwKLQkJCSAgY29uc3QgY2hhciAqKnRyYW5zYWN0aW9uX2lkLCBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqKmVuZHApCitpbnQgbWdjcF9hbmFseXplX2hlYWRlcihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZywKKwkJCXN0cnVjdCBtZ2NwX21zZ19wdHIgKnB0ciwgaW50IHNpemUsCisJCQljb25zdCBjaGFyICoqdHJhbnNhY3Rpb25faWQsIHN0cnVjdCBtZ2NwX2VuZHBvaW50ICoqZW5kcCkKIHsKIAlpbnQgZm91bmQ7CiAKQEAgLTMzNCw4ICszMTAsMTEgQEAKIAl9CiAKIAkqdHJhbnNhY3Rpb25faWQgPSAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMF0uc3RhcnRdOwotCSplbmRwID0gZmluZF9lbmRwb2ludChjZmcsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clsxXS5zdGFydF0pOwotCXJldHVybiAqZW5kcCA9PSBOVUxMOworCWlmIChlbmRwKSB7CisJCSplbmRwID0gZmluZF9lbmRwb2ludChjZmcsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clsxXS5zdGFydF0pOworCQlyZXR1cm4gKmVuZHAgPT0gTlVMTDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdmVyaWZ5X2NhbGxfaWQoY29uc3Qgc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsCkBAIC0zNjksNyArMzQ4LDcgQEAKIAljb25zdCBjaGFyICp0cmFuc19pZDsKIAlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKIAotCWZvdW5kID0gYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlmb3VuZCA9IG1nY3BfYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKIAlpZiAoZm91bmQgIT0gMCkKIAkgICAgcmVzcG9uc2UgPSA1MDA7CiAJZWxzZQpAQCAtNDAyLDEzICszODEsMjAgQEAKIAlpbnQgZXJyb3JfY29kZSA9IDUwMDsKIAlpbnQgcG9ydDsKIAotCWZvdW5kID0gYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlmb3VuZCA9IG1nY3BfYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKIAlpZiAoZm91bmQgIT0gMCkKIAkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJDUkNYIiwgdHJhbnNfaWQpOwogCiAJaWYgKGVuZHAtPmNpICE9IENJX1VOVVNFRCkgewotCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRW5kcG9pbnQgaXMgYWxyZWFkeSB1c2VkLiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOwotCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkNSQ1giLCB0cmFuc19pZCk7CisJCWlmIChjZmctPmZvcmNlX3JlYWxsb2MpIHsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRW5kcG9pbnQgMHgleCBhbHJlYWR5IGFsbG9jYXRlZC4gRm9yY2luZyByZWFsbG9jLlxuIiwKKwkJCSAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJbWdjcF9mcmVlX2VuZHAoZW5kcCk7CisJCX0gZWxzZSB7CisJCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRW5kcG9pbnQgaXMgYWxyZWFkeSB1c2VkLiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJDUkNYIiwgdHJhbnNfaWQpOworCQl9CiAJfQogCiAJLyogcGFyc2UgQ2FsbElEIEM6IGFuZCBMb2NhbFBhcmFtZXRlcnMgTDogKi8KQEAgLTUwMCw4ICs0ODYsOSBAQAogCWNvbnN0IGNoYXIgKnRyYW5zX2lkOwogCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOwogCWludCBlcnJvcl9jb2RlID0gNTAwOworCWludCBzaWxlbnQgPSAwOwogCi0JZm91bmQgPSBhbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWZvdW5kID0gbWdjcF9hbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOwogCWlmIChmb3VuZCAhPSAwKQogCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOwogCkBAIC01MzIsNiArNTE5LDkgQEAKIAkJICAgIGdvdG8gZXJyb3IzOwogCQl9CiAJCWJyZWFrOworCWNhc2UgJ1onOgorCQlzaWxlbnQgPSBzdHJjbXAoIm5vYW5zd2VyIiwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSA9PSAwOworCQlicmVhazsKIAljYXNlICdcMCc6CiAJCS8qIFNEUCBmaWxlIGJlZ2lucyAqLwogCQlicmVhazsKQEAgLTU3Nyw2ICs1NjcsOCBAQAogCQljYXNlIE1HQ1BfUE9MSUNZX1JFSkVDVDoKIAkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTURDWCByZWplY3RlZCBieSBwb2xpY3kgb24gMHgleFxuIiwKIAkJCSAgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCWlmIChzaWxlbnQpCisJCQkJZ290byBvdXRfc2lsZW50OwogCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJNRENYIiwgdHJhbnNfaWQpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUdDUF9QT0xJQ1lfREVGRVI6CkBAIC01OTQsNiArNTg2LDkgQEAKIAkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBpbmV0X250b2EoZW5kcC0+cmVtb3RlKSwgbnRvaHMoZW5kcC0+bmV0X3J0cCkpOwogCWlmIChjZmctPmNoYW5nZV9jYikKIAkJY2ZnLT5jaGFuZ2VfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9NRENYLCBlbmRwLT5ydHBfcG9ydCk7CisJaWYgKHNpbGVudCkKKwkJZ290byBvdXRfc2lsZW50OworCiAJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZV93aXRoX3NkcChlbmRwLCAiTURDWCIsIHRyYW5zX2lkKTsKIAogZXJyb3I6CkBAIC02MDQsNiArNTk5LDEwIEBACiAKIGVycm9yMzoKIAlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOworCisKK291dF9zaWxlbnQ6CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2RlbGV0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCkBAIC02MTMsOCArNjEyLDkgQEAKIAljb25zdCBjaGFyICp0cmFuc19pZDsKIAlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKIAlpbnQgZXJyb3JfY29kZSA9IDUwMDsKKwlpbnQgc2lsZW50ID0gMDsKIAotCWZvdW5kID0gYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlmb3VuZCA9IG1nY3BfYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKIAlpZiAoZm91bmQgIT0gMCkKIAkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKIApAQCAtNjM0LDYgKzYzNCw5IEBACiAJCWlmICh2ZXJpZnlfY2koZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQogCQkJZ290byBlcnJvcjM7CiAJCWJyZWFrOworCWNhc2UgJ1onOgorCQlzaWxlbnQgPSBzdHJjbXAoIm5vYW5zd2VyIiwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSA9PSAwOworCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKIAkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJVbmhhbmRsZWQgb3B0aW9uOiAnJWMnLyVkIG9uIDB4JXhcbiIsCkBAIC02NDksNiArNjUyLDggQEAKIAkJY2FzZSBNR0NQX1BPTElDWV9SRUpFQ1Q6CiAJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkRMQ1ggcmVqZWN0ZWQgYnkgcG9saWN5IG9uIDB4JXhcbiIsCiAJCQkgICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCQlpZiAoc2lsZW50KQorCQkJCWdvdG8gb3V0X3NpbGVudDsKIAkJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiRExDWCIsIHRyYW5zX2lkKTsKIAkJCWJyZWFrOwogCQljYXNlIE1HQ1BfUE9MSUNZX0RFRkVSOgpAQCAtNjYyLDEwICs2NjcsMTQgQEAKIAl9CiAKIAkvKiBmcmVlIHRoZSBjb25uZWN0aW9uICovCisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJEZWxldGVkIGVuZHBvaW50IG9uOiAweCV4IFNlcnZlcjogJXM6JXVcbiIsCisJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgaW5ldF9udG9hKGVuZHAtPnJlbW90ZSksIG50b2hzKGVuZHAtPm5ldF9ydHApKTsKIAltZ2NwX2ZyZWVfZW5kcChlbmRwKTsKIAlpZiAoY2ZnLT5jaGFuZ2VfY2IpCiAJCWNmZy0+Y2hhbmdlX2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfRExDWCwgZW5kcC0+cnRwX3BvcnQpOwogCisJaWYgKHNpbGVudCkKKwkJZ290byBvdXRfc2lsZW50OwogCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoMjUwLCAiRExDWCIsIHRyYW5zX2lkKTsKIAogZXJyb3I6CkBAIC02NzYsNiArNjg1LDE2IEBACiAKIGVycm9yMzoKIAlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCitvdXRfc2lsZW50OgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9yc2lwKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWlmIChjZmctPnJlc2V0X2NiKQorCQljZmctPnJlc2V0X2NiKGNmZyk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0cnVjdCBtZ2NwX2NvbmZpZyAqbWdjcF9jb25maWdfYWxsb2Modm9pZCkKQEAgLTcyMiw3ICs3NDEsNyBAQAogCiB2b2lkIG1nY3BfZnJlZV9lbmRwKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKQogewotCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRGVsZXRpbmcgZW5kcG9pbnQgb246IDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJTE9HUChETUdDUCwgTE9HTF9ERUJVRywgIkRlbGV0aW5nIGVuZHBvaW50IG9uOiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOwogCWVuZHAtPmNpPSBDSV9VTlVTRUQ7CiAKIAlpZiAoZW5kcC0+Y2FsbGlkKSB7CkBAIC03MzIsNyArNzUxLDcgQEAKIAogCWlmIChlbmRwLT5sb2NhbF9vcHRpb25zKSB7CiAJCXRhbGxvY19mcmVlKGVuZHAtPmxvY2FsX29wdGlvbnMpOwotCQllbmRwLT5jYWxsaWQgPSBOVUxMOworCQllbmRwLT5sb2NhbF9vcHRpb25zID0gTlVMTDsKIAl9CiAKIAlpZiAoIWVuZHAtPmNmZy0+ZWFybHlfYmluZCkgewpAQCAtNzQyLDQgKzc2MSw3IEBACiAKIAllbmRwLT5uZXRfcnRwID0gZW5kcC0+bmV0X3J0Y3AgPSBlbmRwLT5idHNfcnRwID0gZW5kcC0+YnRzX3J0Y3AgPSAwOwogCWVuZHAtPm5ldF9wYXlsb2FkX3R5cGUgPSBlbmRwLT5idHNfcGF5bG9hZF90eXBlID0gLTE7CisJZW5kcC0+aW5fYnRzID0gZW5kcC0+aW5fcmVtb3RlID0gMDsKKwltZW1zZXQoJmVuZHAtPnJlbW90ZSwgMCwgc2l6ZW9mKGVuZHAtPnJlbW90ZSkpOworCW1lbXNldCgmZW5kcC0+YnRzLCAwLCBzaXplb2YoZW5kcC0+YnRzKSk7CiB9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfdnR5LmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfdnR5LmMKaW5kZXggZjEzYjNjZi4uZWE1OWFiZiAxMDA2NDQKLS0tIGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Z0eS5jCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF92dHkuYwpAQCAtMjksOSArMjksMTIgQEAKICNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwX2ludGVybmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KIAotI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+Ci0jaW5jbHVkZSA8dnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgogCiBzdGF0aWMgc3RydWN0IG1nY3BfY29uZmlnICpnX2NmZyA9IE5VTEw7CiAKQEAgLTQ4LDIxICs1MSwyNSBAQAogewogCXZ0eV9vdXQodnR5LCAibWdjcCVzIiwgVlRZX05FV0xJTkUpOwogCWlmIChnX2NmZy0+bG9jYWxfaXApCi0JCXZ0eV9vdXQodnR5LCAiIGxvY2FsIGlwICVzJXMiLCBnX2NmZy0+bG9jYWxfaXAsIFZUWV9ORVdMSU5FKTsKLQlpZiAoZ19jZmctPmJ0c19pcCkKKwkJdnR5X291dCh2dHksICIgIGxvY2FsIGlwICVzJXMiLCBnX2NmZy0+bG9jYWxfaXAsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmJ0c19pcCAmJiBzdHJsZW4oZ19jZmctPmJ0c19pcCkgIT0gMCkKIAkJdnR5X291dCh2dHksICIgIGJ0cyBpcCAlcyVzIiwgZ19jZmctPmJ0c19pcCwgVlRZX05FV0xJTkUpOwogCXZ0eV9vdXQodnR5LCAiICBiaW5kIGlwICVzJXMiLCBnX2NmZy0+c291cmNlX2FkZHIsIFZUWV9ORVdMSU5FKTsKIAl2dHlfb3V0KHZ0eSwgIiAgYmluZCBwb3J0ICV1JXMiLCBnX2NmZy0+c291cmNlX3BvcnQsIFZUWV9ORVdMSU5FKTsKIAl2dHlfb3V0KHZ0eSwgIiAgYmluZCBlYXJseSAldSVzIiwgISFnX2NmZy0+ZWFybHlfYmluZCwgVlRZX05FV0xJTkUpOwogCXZ0eV9vdXQodnR5LCAiICBydHAgYmFzZSAldSVzIiwgZ19jZmctPnJ0cF9iYXNlX3BvcnQsIFZUWV9ORVdMSU5FKTsKLQl2dHlfb3V0KHZ0eSwgIiAgc2RwIGF1ZGlvIHBheWxvYWQgbnVtYmVyICV1JXMiLCBnX2NmZy0+YXVkaW9fcGF5bG9hZCwgVlRZX05FV0xJTkUpOwotCXZ0eV9vdXQodnR5LCAiICBzZHAgYXVkaW8gcGF5bG9hZCBuYW1lICVzJXMiLCBnX2NmZy0+YXVkaW9fbmFtZSwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+YXVkaW9fcGF5bG9hZCAhPSAtMSkKKwkJdnR5X291dCh2dHksICIgIHNkcCBhdWRpbyBwYXlsb2FkIG51bWJlciAlZCVzIiwgZ19jZmctPmF1ZGlvX3BheWxvYWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmF1ZGlvX25hbWUpCisJCXZ0eV9vdXQodnR5LCAiICBzZHAgYXVkaW8gcGF5bG9hZCBuYW1lICVzJXMiLCBnX2NmZy0+YXVkaW9fbmFtZSwgVlRZX05FV0xJTkUpOwogCXZ0eV9vdXQodnR5LCAiICBsb29wICV1JXMiLCAhIWdfY2ZnLT5hdWRpb19sb29wLCBWVFlfTkVXTElORSk7Ci0JdnR5X291dCh2dHksICIgIGVuZHBvaW50cyAldSVzIiwgZ19jZmctPm51bWJlcl9lbmRwb2ludHMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbnVtYmVyIGVuZHBvaW50cyAldSVzIiwgZ19jZmctPm51bWJlcl9lbmRwb2ludHMgLSAxLCBWVFlfTkVXTElORSk7CiAJaWYgKGdfY2ZnLT5mb3J3YXJkX2lwKQotCQl2dHlfb3V0KHZ0eSwgIiBmb3J3YXJkIGF1ZGlvIGlwICVzJXMiLCBnX2NmZy0+Zm9yd2FyZF9pcCwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZm9yd2FyZCBhdWRpbyBpcCAlcyVzIiwgZ19jZmctPmZvcndhcmRfaXAsIFZUWV9ORVdMSU5FKTsKIAlpZiAoZ19jZmctPmZvcndhcmRfcG9ydCAhPSAwKQotCQl2dHlfb3V0KHZ0eSwgIiBmb3J3YXJkIGF1ZGlvIHBvcnQgJWQlcyIsIGdfY2ZnLT5mb3J3YXJkX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIGZvcndhcmQgYXVkaW8gcG9ydCAlZCVzIiwgZ19jZmctPmZvcndhcmRfcG9ydCwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+Y2FsbF9hZ2VudF9hZGRyKQorCQl2dHlfb3V0KHZ0eSwgIiAgY2FsbCBhZ2VudCBpcCAlcyVzIiwgZ19jZmctPmNhbGxfYWdlbnRfYWRkciwgVlRZX05FV0xJTkUpOwogCiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQpAQCAtNzUsMTAgKzgyLDEyIEBACiAJdnR5X291dCh2dHksICJNR0NQIGlzIHVwIGFuZCBydW5uaW5nIHdpdGggJXUgZW5kcG9pbnRzOiVzIiwgZ19jZmctPm51bWJlcl9lbmRwb2ludHMgLSAxLCBWVFlfTkVXTElORSk7CiAJZm9yIChpID0gMTsgaSA8IGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKIAkJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAgPSAmZ19jZmctPmVuZHBvaW50c1tpXTsKLQkJdnR5X291dCh2dHksICIgRW5kcG9pbnQgMHglLjJ4OiBDSTogJWQgbmV0OiAldS8ldSBidHM6ICV1LyV1JXMiLAorCQl2dHlfb3V0KHZ0eSwgIiBFbmRwb2ludCAweCUuMng6IENJOiAlZCBuZXQ6ICV1LyV1IGJ0czogJXUvJXUgb24gJXMgdHJhZmZpYyByZWNlaXZlZCBidHM6ICV1ICByZW1vdGU6ICV1JXMiLAogCQkJaSwgZW5kcC0+Y2ksCiAJCQludG9ocyhlbmRwLT5uZXRfcnRwKSwgbnRvaHMoZW5kcC0+bmV0X3J0Y3ApLAotCQkJbnRvaHMoZW5kcC0+YnRzX3J0cCksIG50b2hzKGVuZHAtPmJ0c19ydGNwKSwgVlRZX05FV0xJTkUpOworCQkJbnRvaHMoZW5kcC0+YnRzX3J0cCksIG50b2hzKGVuZHAtPmJ0c19ydGNwKSwKKwkJCWluZXRfbnRvYShlbmRwLT5idHMpLCBlbmRwLT5pbl9idHMsIGVuZHAtPmluX3JlbW90ZSwKKwkJCVZUWV9ORVdMSU5FKTsKIAl9CiAKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CkBAIC05NSw3ICsxMDQsNyBAQAogCiBERUZVTihjZmdfbWdjcF9sb2NhbF9pcCwKICAgICAgIGNmZ19tZ2NwX2xvY2FsX2lwX2NtZCwKLSAgICAgICJsb2NhbCBpcCBJUCIsCisgICAgICAibG9jYWwgaXAgQS5CLkMuRCIsCiAgICAgICAiU2V0IHRoZSBJUCB0byBiZSB1c2VkIGluIFNEUCByZWNvcmRzIikKIHsKIAlpZiAoZ19jZmctPmxvY2FsX2lwKQpAQCAtMTA2LDcgKzExNSw3IEBACiAKIERFRlVOKGNmZ19tZ2NwX2J0c19pcCwKICAgICAgIGNmZ19tZ2NwX2J0c19pcF9jbWQsCi0gICAgICAiYnRzIGlwIElQIiwKKyAgICAgICJidHMgaXAgQS5CLkMuRCIsCiAgICAgICAiU2V0IHRoZSBJUCBvZiB0aGUgQlRTIGZvciBSVFAgZm9yd2FyZGluZyIpCiB7CiAJaWYgKGdfY2ZnLT5idHNfaXApCkBAIC0xMTgsNyArMTI3LDcgQEAKIAogREVGVU4oY2ZnX21nY3BfYmluZF9pcCwKICAgICAgIGNmZ19tZ2NwX2JpbmRfaXBfY21kLAotICAgICAgImJpbmQgaXAgSVAiLAorICAgICAgImJpbmQgaXAgQS5CLkMuRCIsCiAgICAgICAiQmluZCB0aGUgTUdDUCB0byB0aGlzIGxvY2FsIGFkZHIiKQogewogCWlmIChnX2NmZy0+c291cmNlX2FkZHIpCkBAIC0xMzMsMTEgKzE0Miw2IEBACiAgICAgICAiQmluZCB0aGUgTUdDUCB0byB0aGlzIHBvcnQiKQogewogCXVuc2lnbmVkIGludCBwb3J0ID0gYXRvaShhcmd2WzBdKTsKLQlpZiAocG9ydCA+IDY1NTM0KSB7Ci0JCXZ0eV9vdXQodnR5LCAiJSUgd3JvbmcgYmluZCBwb3J0ICclcyclcyIsIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsKLQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCX0KLQogCWdfY2ZnLT5zb3VyY2VfcG9ydCA9IHBvcnQ7CiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQpAQCAtMTQ4LDExICsxNTIsNiBAQAogICAgICAgIkJpbmQgYWxsIFJUUCBwb3J0cyBlYXJseSIpCiB7CiAJdW5zaWduZWQgaW50IGJpbmQgPSBhdG9pKGFyZ3ZbMF0pOwotCWlmIChiaW5kICE9IDAgJiYgYmluZCAhPSAxKSB7Ci0JCXZ0eV9vdXQodnR5LCAiJSUgcGFyYW0gbXVzdCBiZSAwIG9yIDEuJXMiLCBWVFlfTkVXTElORSk7Ci0JCXJldHVybiBDTURfV0FSTklORzsKLQl9Ci0KIAlnX2NmZy0+ZWFybHlfYmluZCA9IGJpbmQgPT0gMTsKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CkBAIC0xNjMsMTEgKzE2Miw2IEBACiAgICAgICAiQmFzZSBwb3J0IHRvIHVzZSIpCiB7CiAJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOwotCWlmIChwb3J0ID4gNjU1MzQpIHsKLQkJdnR5X291dCh2dHksICIlJSB3cm9uZyBiYXNlIHBvcnQgJyVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCiAJZ19jZmctPnJ0cF9iYXNlX3BvcnQgPSBwb3J0OwogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KQEAgLTE3OCwxMSArMTcyLDYgQEAKICAgICAgICJTZXQgdGhlIGF1ZGlvIGNvZGVjIHRvIHVzZSIpCiB7CiAJdW5zaWduZWQgaW50IHBheWxvYWQgPSBhdG9pKGFyZ3ZbMF0pOwotCWlmIChwYXlsb2FkID4gMjU1KSB7Ci0JCXZ0eV9vdXQodnR5LCAiJSUgd3JvbmcgcGF5bG9hZCBudW1iZXIgJyVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCiAJZ19jZmctPmF1ZGlvX3BheWxvYWQgPSBwYXlsb2FkOwogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KQEAgLTIxOSw3ICsyMDgsNyBAQAogCiBERUZVTihjZmdfbWdjcF9mb3J3YXJkX2lwLAogICAgICAgY2ZnX21nY3BfZm9yd2FyZF9pcF9jbWQsCi0gICAgICAiZm9yd2FyZCBhdWRpbyBpcCBJUCIsCisgICAgICAiZm9yd2FyZCBhdWRpbyBpcCBBLkIuQy5EIiwKICAgICAgICJGb3J3YXJkIHBhY2tldHMgZnJvbSBhbmQgdG8gdGhlIElQLiBUaGlzIGRpc2FibGVzIG1vc3Qgb2YgdGhlIE1HQ1AgZmVhdHVyZS4iKQogewogCWlmIChnX2NmZy0+Zm9yd2FyZF9pcCkKQEAgLTIzNywxMyArMjI2LDI2IEBACiAJcmV0dXJuIENNRF9TVUNDRVNTOwogfQogCitERUZVTihjZmdfbWdjcF9hZ2VudF9hZGRyLAorICAgICAgY2ZnX21nY3BfYWdlbnRfYWRkcl9jbWQsCisgICAgICAiY2FsbCBhZ2VudCBpcCBJUCIsCisgICAgICAiU2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsIGFnZW50LiIpCit7CisJaWYgKGdfY2ZnLT5jYWxsX2FnZW50X2FkZHIpCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5jYWxsX2FnZW50X2FkZHIpOworCWdfY2ZnLT5jYWxsX2FnZW50X2FkZHIgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKIGludCBtZ2NwX3Z0eV9pbml0KHZvaWQpCiB7Ci0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfbWdjcF9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19tZ2NwX2NtZCk7CiAKIAlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfbWdjcF9jbWQpOwogCWluc3RhbGxfbm9kZSgmbWdjcF9ub2RlLCBjb25maWdfd3JpdGVfbWdjcCk7CiAJaW5zdGFsbF9kZWZhdWx0KE1HQ1BfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJm91cm5vZGVfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZvdXJub2RlX2VuZF9jbWQpOwogCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9sb2NhbF9pcF9jbWQpOwogCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9idHNfaXBfY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYmluZF9pcF9jbWQpOwpAQCAtMjU2LDYgKzI1OCw3IEBACiAJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX251bWJlcl9lbmRwX2NtZCk7CiAJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2ZvcndhcmRfaXBfY21kKTsKIAlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfZm9yd2FyZF9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2FnZW50X2FkZHJfY21kKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY0LDcgKzI2Nyw3IEBACiAJaW50IGksIHJjOwogCiAJZ19jZmcgPSBjZmc7Ci0JcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSk7CisJcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSwgTlVMTCk7CiAJaWYgKHJjIDwgMCkgewogCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0aGUgY29uZmlnIGZpbGU6ICclcydcbiIsIGNvbmZpZ19maWxlKTsKIAkJcmV0dXJuIHJjOwpAQCAtMjc0LDYgKzI3NywxMSBAQAogCWlmICghZ19jZmctPmJ0c19pcCkKIAkJZnByaW50ZihzdGRlcnIsICJObyBCVFMgaXAgYWRkcmVzcyBzcGVjaWZpZWQuIFRoaXMgd2lsbCBhbGxvdyBldmVyeW9uZSB0byBjb25uZWN0LlxuIik7CiAKKwlpZiAoIWdfY2ZnLT5zb3VyY2VfYWRkcikgeworCQlmcHJpbnRmKHN0ZGVyciwgIllvdSBuZWVkIHRvIHNwZWNpZnkgYSBiaW5kIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCWlmIChtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShnX2NmZykgIT0gMCkgewogCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBlbmRwb2ludHM6ICVkLiBRdWl0dGluZy5cbiIsIGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzKTsKIAkJcmV0dXJuIC0xOwpAQCAtMjgxLDggKzI4OSw4IEBACiAKIAkvKgogCSAqIFRoaXMgYXBwbGljYXRpb24gc3VwcG9ydHMgdHdvIG1vZGVzLgotICAgICAgICAgKiAgICAxLikgYSB0cnVlIE1HQ1AgZ2F0ZXdheSB3aXRoIHN1cHBvcnQgZm9yIEFVRVAsIENSQ1gsIE1EQ1gsIERMQ1gKLSAgICAgICAgICogICAgMi4pIHBsYWluIGZvcndhcmRpbmcgb2YgUlRQIHBhY2tldHMgb24gdGhlIGVuZHBvaW50cy4KKwkgKiAgICAxLikgYSB0cnVlIE1HQ1AgZ2F0ZXdheSB3aXRoIHN1cHBvcnQgZm9yIEFVRVAsIENSQ1gsIE1EQ1gsIERMQ1gKKwkgKiAgICAyLikgcGxhaW4gZm9yd2FyZGluZyBvZiBSVFAgcGFja2V0cyBvbiB0aGUgZW5kcG9pbnRzLgogCSAqIGJvdGggbW9kZXMgYXJlIG11dHVhbCBleGNsdXNpdmUKIAkgKi8KIAlpZiAoZ19jZmctPmZvcndhcmRfaXApIHsKQEAgLTMyNywxMyArMzM1LDMgQEAKIAlyZXR1cm4gISFnX2NmZy0+Zm9yd2FyZF9pcDsKIH0KIAotc3RydWN0IGdzbV9uZXR3b3JrOwotaW50IGJzY192dHlfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKmR1bW15KQotewotCWNtZF9pbml0KDEpOwotCXZ0eV9pbml0KCk7Ci0KLSAgICAgICAgbWdjcF92dHlfaW5pdCgpOwotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tbmNjLmMgYi9vcGVuYnNjL3NyYy9tbmNjLmMKaW5kZXggMDFkNTlhYS4uYWZkNTM2NCAxMDA2NDQKLS0tIGEvb3BlbmJzYy9zcmMvbW5jYy5jCisrKyBiL29wZW5ic2Mvc3JjL21uY2MuYwpAQCAtMzMyLDE2ICszMzIsMTYgQEAKIAlyZW1vdGVfdHJhbnMgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYoY2FsbC0+bmV0LCBjYWxsLT5yZW1vdGVfcmVmKTsKIAogCS8qIHRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKi8KLQlpZiAoIXJlbW90ZV90cmFucyB8fCAhcmVtb3RlX3RyYW5zLT5sY2hhbikgeworCWlmICghcmVtb3RlX3RyYW5zIHx8ICFyZW1vdGVfdHJhbnMtPmNvbm4pIHsKIAkJTE9HUChETU5DQywgTE9HTF9FUlJPUiwgIk5vIHRyYW5zYWN0aW9uIG9yIHRyYW5zYWN0aW9uIHdpdGhvdXQgbGNoYW4/IT9cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBSVFAgc29ja2V0IG9mIHJlbW90ZSBlbmQgaGFzIG1lYW53aGlsZSBkaWVkICovCi0JaWYgKCFyZW1vdGVfdHJhbnMtPmxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpCisJaWYgKCFyZW1vdGVfdHJhbnMtPmNvbm4tPmxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpCiAJCXJldHVybiAtRUlPOwogCi0JcmV0dXJuIHJ0cF9zZW5kX2ZyYW1lKHJlbW90ZV90cmFucy0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwgZGZyKTsKKwlyZXR1cm4gcnRwX3NlbmRfZnJhbWUocmVtb3RlX3RyYW5zLT5jb25uLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0LCBkZnIpOwogfQogCiAKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzCmluZGV4IGExY2VhZWMuLmRhMGJhNzQgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cwpAQCAtMSw2ICsxLDYgQEAKICEKICEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5Ci0hCishICAgIQogcGFzc3dvcmQgZm9vCiAhCiBsaW5lIHZ0eQpAQCAtMTEsMTcgKzExLDUyIEBACiAgbW9iaWxlIG5ldHdvcmsgY29kZSAxCiAgc2hvcnQgbmFtZSBPcGVuQlNDCiAgbG9uZyBuYW1lIE9wZW5CU0MKKyBhdXRoIHBvbGljeSBjbG9zZWQKKyBsb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2UgMTMKKyBlbmNyeXB0aW9uIGE1IDAKKyBuZWNpIDAKKyBycmxwIG1vZGUgbm9uZQorIG1tIGluZm8gMQorIGhhbmRvdmVyIDAKKyBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nIDEwCisgaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgMQorIGhhbmRvdmVyIHdpbmRvdyByeGxldiBuZWlnaGJvciBhdmVyYWdpbmcgMTAKKyBoYW5kb3ZlciBwb3dlciBidWRnZXQgaW50ZXJ2YWwgNgorIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBoeXN0ZXJlc2lzIDMKKyBoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlIDk5OTkKICB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTAzIDAKKyB0aW1lciB0MzEwNSAwCisgdGltZXIgdDMxMDcgMAorIHRpbWVyIHQzMTA5IDAKKyB0aW1lciB0MzExMSAwCiAgdGltZXIgdDMxMTMgNjAKKyB0aW1lciB0MzExNSAwCisgdGltZXIgdDMxMTcgMAorIHRpbWVyIHQzMTE5IDAKKyB0aW1lciB0MzE0MSAwCiAgYnRzIDAKICAgdHlwZSBuYW5vYnRzCi0gIGlwLmFjY2VzcyB1bml0X2lkIDE4MDEgMAotICBiYW5kIEdTTTE4MDAKKyAgYmFuZCBEQ1MxODAwCisgIGNlbGxfaWRlbnRpdHkgMAogICBsb2NhdGlvbl9hcmVhX2NvZGUgMQogICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKICAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgbXMgbWF4IHBvd2VyIDE1CisgIGNlbGwgcmVzZWxlY3Rpb24gaHlzdGVyZXNpcyA0CisgIHJ4bGV2IGFjY2VzcyBtaW4gMAorICBjaGFubmVsIGFsbG9jYXRvciBhc2NlbmRpbmcKKyAgcmFjaCB0eCBpbnRlZ2VyIDkKKyAgcmFjaCBtYXggdHJhbnNtaXNzaW9uIDcKKyAgaXAuYWNjZXNzIHVuaXRfaWQgMTgwMSAwCisgIG9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkIDI1NQorICBncHJzIG1vZGUgbm9uZQogICB0cnggMAorICAgcmZfbG9ja2VkIDAKICAgIGFyZmNuIDUxNAorICAgbm9taW5hbCBwb3dlciAyMworICAgbWF4X3Bvd2VyX3JlZCAyMAorICAgcnNsIGUxIHRlaSAwCiAgICAgdGltZXNsb3QgMAogICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CiAgICAgdGltZXNsb3QgMQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cy5tdWx0aXRyeCBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMubXVsdGl0cngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyN2ZmNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMubXVsdGl0cngKQEAgLTAsMCArMSw5NyBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyBhdXRoIHBvbGljeSBjbG9zZWQKKyBsb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2UgMTMKKyBlbmNyeXB0aW9uIGE1IDAKKyBuZWNpIDAKKyBycmxwIG1vZGUgbm9uZQorIG1tIGluZm8gMAorIGhhbmRvdmVyIDAKKyBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nIDEwCisgaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgMQorIGhhbmRvdmVyIHdpbmRvdyByeGxldiBuZWlnaGJvciBhdmVyYWdpbmcgMTAKKyBoYW5kb3ZlciBwb3dlciBidWRnZXQgaW50ZXJ2YWwgNgorIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBoeXN0ZXJlc2lzIDMKKyBoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlIDk5OTkKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTAzIDAKKyB0aW1lciB0MzEwNSAwCisgdGltZXIgdDMxMDcgMAorIHRpbWVyIHQzMTA5IDAKKyB0aW1lciB0MzExMSAwCisgdGltZXIgdDMxMTMgNjAKKyB0aW1lciB0MzExNSAwCisgdGltZXIgdDMxMTcgMAorIHRpbWVyIHQzMTE5IDAKKyB0aW1lciB0MzE0MSAwCisgYnRzIDAKKyAgdHlwZSBuYW5vYnRzCisgIGJhbmQgRENTMTgwMAorICBjZWxsX2lkZW50aXR5IDAKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG1zIG1heCBwb3dlciAxNQorICBjZWxsIHJlc2VsZWN0aW9uIGh5c3RlcmVzaXMgNAorICByeGxldiBhY2Nlc3MgbWluIDAKKyAgY2hhbm5lbCBhbGxvY2F0b3IgYXNjZW5kaW5nCisgIHJhY2ggdHggaW50ZWdlciA5CisgIHJhY2ggbWF4IHRyYW5zbWlzc2lvbiA3CisgIGlwLmFjY2VzcyB1bml0X2lkIDE4MDAgMAorICBvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCAyNTUKKyAgZ3BycyBtb2RlIG5vbmUKKyAgdHJ4IDAKKyAgIHJmX2xvY2tlZCAwCisgICBhcmZjbiA4NzEKKyAgIG5vbWluYWwgcG93ZXIgMjMKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIHRlaSAwCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICB0cnggMQorICAgcmZfbG9ja2VkIDAKKyAgIGFyZmNuIDg3MworICAgbm9taW5hbCBwb3dlciAyMworICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgdGVpIDAKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vc21vX21zYy5jIGIvb3BlbmJzYy9zcmMvb3Ntb19tc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQ3YTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3Ntb19tc2MuYwpAQCAtMCwwICsxLDUwIEBACisvKiBtYWluIE1TQyBtYW5hZ2VtZW50IGNvZGUuLi4gKi8KKworLyoKKyAqIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uIFdhdmVzCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19hcGkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorCitzdGF0aWMgdm9pZCBtc2Nfc2FwaV9uX3JlamVjdChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiogY29ubiwgaW50IGRsY2kpCit7CisJaW50IHNhcGkgPSBkbGNpICYgMHg3OworCisJaWYgKHNhcGkgPT0gVU1fU0FQSV9TTVMpCisJCWdzbTQxMV9zYXBpX25fcmVqZWN0KGNvbm4pOworfQorCitzdGF0aWMgdm9pZCBtc2NfY2xlYXJfcmVxdWVzdChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiogY29ubiwgdWludDMyX3QgY2F1c2UpCit7CisJZ3NtMDQwOF9jbGVhcl9yZXF1ZXN0KGNvbm4sIGNhdXNlKTsKK30KKworc3RhdGljIHN0cnVjdCBic2NfYXBpIG1zY19oYW5kbGVyID0geworCS5zYXBpX25fcmVqZWN0ID0gbXNjX3NhcGlfbl9yZWplY3QsCisJLmNsZWFyX3JlcXVlc3QgPSBtc2NfY2xlYXJfcmVxdWVzdCwKK307CisKK3N0cnVjdCBic2NfYXBpICptc2NfYnNjX2FwaSgpIHsKKwlyZXR1cm4gJm1zY19oYW5kbGVyOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcGFnaW5nLmMgYi9vcGVuYnNjL3NyYy9wYWdpbmcuYwppbmRleCA3YzM3NTBkLi4xMmVkOTAzIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9wYWdpbmcuYworKysgYi9vcGVuYnNjL3NyYy9wYWdpbmcuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgogI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KIAogdm9pZCAqdGFsbF9wYWdpbmdfY3R4OwogCkBAIC03MCwxNCArNzEsNiBAQAogc3RhdGljIHZvaWQgcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cywKIAkJCQlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICp0b19iZV9kZWxldGVkKQogewotCS8qIFVwZGF0ZSB0aGUgbGFzdF9yZXF1ZXN0IGlmIHRoYXQgaXMgbmVjZXNzYXJ5ICovCi0JaWYgKHRvX2JlX2RlbGV0ZWQgPT0gcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0KSB7Ci0JCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9Ci0JCQkoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqKXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdC0+ZW50cnkubmV4dDsKLQkJaWYgKCZ0b19iZV9kZWxldGVkLT5lbnRyeSA9PSAmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cykKLQkJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9IE5VTEw7Ci0JfQotCiAJYnNjX2RlbF90aW1lcigmdG9fYmVfZGVsZXRlZC0+VDMxMTMpOwogCWxsaXN0X2RlbCgmdG9fYmVfZGVsZXRlZC0+ZW50cnkpOwogCXN1YnNjcl9wdXQodG9fYmVfZGVsZXRlZC0+c3Vic2NyKTsKQEAgLTkwLDcgKzgzLDcgQEAKIAl1bnNpZ25lZCBpbnQgbWlfbGVuOwogCXVuc2lnbmVkIGludCBwYWdlX2dyb3VwOwogCi0JREVCVUdQKERQQUcsICJHb2luZyB0byBzZW5kIHBhZ2luZyBjb21tYW5kczogaW1zaTogJyVzJyB0bXNpOiAnMHgleCdcbiIsCisJTE9HUChEUEFHLCBMT0dMX0lORk8sICJHb2luZyB0byBzZW5kIHBhZ2luZyBjb21tYW5kczogaW1zaTogJyVzJyB0bXNpOiAnMHgleCdcbiIsCiAJCXJlcXVlc3QtPnN1YnNjci0+aW1zaSwgcmVxdWVzdC0+c3Vic2NyLT50bXNpKTsKIAogCWlmIChyZXF1ZXN0LT5zdWJzY3ItPnRtc2kgPT0gR1NNX1JFU0VSVkVEX1RNU0kpCkBAIC0xMDMsMTQgKzk2LDYgQEAKIAkJCXJlcXVlc3QtPmNoYW5fdHlwZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBhZ2luZ19tb3ZlX3RvX25leHQoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpwYWdpbmdfYnRzKQotewotCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9Ci0JCShzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICopcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0LT5lbnRyeS5uZXh0OwotCWlmICgmcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0LT5lbnRyeSA9PSAmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cykKLQkJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0gTlVMTDsKLX0KLQogLyoKICAqIFRoaXMgaXMga2lja2VkIGJ5IHRoZSBwZXJpb2RpYyBQQUdJTkcgTE9BRCBJbmRpY2F0b3IKICAqIGNvbWluZyBmcm9tIGFiaXNfcnNsLmMKQEAgLTEyOCwxNyArMTEzLDI2IEBACiAJICogcmV0dXJuIHRoZW4uCiAJICovCiAJaWYgKGxsaXN0X2VtcHR5KCZwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzKSkgewotCQlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPSBOVUxMOwogCQkvKiBzaW5jZSB0aGUgbGlzdCBpcyBlbXB0eSwgbm8gbmVlZCB0byByZXNjaGVkdWxlIHRoZSB0aW1lciAqLwogCQlyZXR1cm47CiAJfQogCi0JaWYgKCFwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QpCi0JCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9Ci0JCQkoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqKXBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMubmV4dDsKKwkvKgorCSAqIEluIGNhc2UgdGhlIEJUUyBkb2VzIG5vdCBwcm92aWRlIHVzIHdpdGggbG9hZCBpbmRpY2F0aW9uIGp1c3QgZmlsbAorCSAqIHVwIG91ciBzbG90cyBmb3IgdGhpcyByb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcGFnZSAyMCBzdWJzY3JpYmVycworCSAqIGV2ZXJ5IHR3byBzZWNvbmRzLiBTbyB3ZSB3aWxsIGp1c3QgZ2l2ZSB0aGUgQlRTIHNvbWUgZXh0cmEgY3JlZGl0LgorCSAqIFdlIHdpbGwgaGF2ZSB0byBzZWUgaG93IG9mdGVuIHdlIHJ1biBvdXQgb2YgdGhpcyBjcmVkaXQsIHNvIHdlIG1pZ2h0CisJICogbmVlZCBhIGxvdyB3YXRlcm1hcmsgYW5kIHRoZW4gYWRkIGNyZWRpdCBvciBnaXZlIDIwIGV2ZXJ5IHJ1biB3aGVuCisJICogdGhlIGJ0cyBzZXRzIGFuIG9wdGlvbiBmb3IgdGhhdC4KKwkgKi8KKwlpZiAocGFnaW5nX2J0cy0+YXZhaWxhYmxlX3Nsb3RzID09IDApIHsKKwkJTE9HUChEUEFHLCBMT0dMX05PVElDRSwgIk5vIHNsb3RzIGF2YWlsYWJsZSBvbiBidHMgbnIgJWRcbiIsCisJCSAgICAgcGFnaW5nX2J0cy0+YnRzLT5ucik7CisJCXBhZ2luZ19idHMtPmF2YWlsYWJsZV9zbG90cyA9IDIwOworCX0KIAotCWFzc2VydChwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QpOwotCWluaXRpYWxfcmVxdWVzdCA9IHBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdDsKKwlpbml0aWFsX3JlcXVlc3QgPSBsbGlzdF9lbnRyeShwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzLm5leHQsCisJCQkJICAgICAgc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCwgZW50cnkpOwogCWN1cnJlbnRfcmVxdWVzdCA9IGluaXRpYWxfcmVxdWVzdDsKIAogCWRvIHsKQEAgLTE0NiwyMSArMTQwLDE3IEBACiAJCXBhZ2VfbXMoY3VycmVudF9yZXF1ZXN0KTsKIAkJcGFnaW5nX2J0cy0+YXZhaWxhYmxlX3Nsb3RzLS07CiAKLQkJLyoKLQkJICogbW92ZSB0byB0aGUgbmV4dCBpdGVtLiBXZSBtaWdodCB3cmFwIGFyb3VuZAotCQkgKiB0aGlzIG1lYW5zIGxhc3RfcmVxdWVzdCB3aWxsIGJlIE5VTEwgYW5kIHdlIGp1c3QKLQkJICogY2FsbCBwYWdpbmdfcGFnZV90b19uZXh0IGFnYWluLiBJdCBpdCBndXJhbnRlZWQKLQkJICogdGhhdCB0aGUgbGlzdCBpcyBub3QgZW1wdHkuCi0JCSAqLwotCQlwYWdpbmdfbW92ZV90b19uZXh0KHBhZ2luZ19idHMpOwotCQlpZiAoIXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCkKLQkJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9Ci0JCQkJKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKilwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzLm5leHQ7Ci0JCWN1cnJlbnRfcmVxdWVzdCA9IHBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdDsKKwkJLyogdGFrZSB0aGUgY3VycmVudCBhbmQgYWRkIGl0IHRvIHRoZSBiYWNrICovCisJCWxsaXN0X2RlbCgmY3VycmVudF9yZXF1ZXN0LT5lbnRyeSk7CisJCWxsaXN0X2FkZF90YWlsKCZjdXJyZW50X3JlcXVlc3QtPmVudHJ5LCAmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cyk7CisKKwkJLyogdGFrZSB0aGUgbmV4dCByZXF1ZXN0ICovCisJCWN1cnJlbnRfcmVxdWVzdCA9IGxsaXN0X2VudHJ5KHBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMubmV4dCwKKwkJCQkJICAgICAgc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCwgZW50cnkpOwogCX0gd2hpbGUgKHBhZ2luZ19idHMtPmF2YWlsYWJsZV9zbG90cyA+IDAKIAkJICAgICYmICBpbml0aWFsX3JlcXVlc3QgIT0gY3VycmVudF9yZXF1ZXN0KTsKIAotCWJzY19zY2hlZHVsZV90aW1lcigmcGFnaW5nX2J0cy0+d29ya190aW1lciwgMSwgMCk7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZwYWdpbmdfYnRzLT53b3JrX3RpbWVyLCAyLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgcGFnaW5nX3dvcmtlcih2b2lkICpkYXRhKQpAQCAtMTc4LDcgKzE2OCw3IEBACiAJYnRzLT5wYWdpbmcud29ya190aW1lci5kYXRhID0gJmJ0cy0+cGFnaW5nOwogCiAJLyogTGFyZ2UgbnVtYmVyLCB1bnRpbCB3ZSBnZXQgYSBwcm9wZXIgbWVzc2FnZSAqLwotCWJ0cy0+cGFnaW5nLmF2YWlsYWJsZV9zbG90cyA9IDEwMDsKKwlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMgPSAyMDsKIH0KIAogc3RhdGljIGludCBwYWdpbmdfcGVuZGluZ19yZXF1ZXN0KHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqYnRzLApAQCAtMjAwLDcgKzE5MCw3IEBACiAJdm9pZCAqY2Jmbl9wYXJhbTsKIAlnc21fY2JmbiAqY2JmbjsKIAotCURFQlVHUChEUEFHLCAiVDMxMTMgZXhwaXJlZCBmb3IgcmVxdWVzdCAlcCAoJXMpXG4iLAorCUxPR1AoRFBBRywgTE9HTF9JTkZPLCAiVDMxMTMgZXhwaXJlZCBmb3IgcmVxdWVzdCAlcCAoJXMpXG4iLAogCQlyZXEsIHJlcS0+c3Vic2NyLT5pbXNpKTsKIAkKIAlzaWdfZGF0YS5zdWJzY3IgPSByZXEtPnN1YnNjcjsKQEAgLTIwOCwxMSArMTk4LDExIEBACiAJc2lnX2RhdGEubGNoYW4JPSBOVUxMOwogCiAJLyogbXVzdCBiZSBkZXN0cm95ZWQgYmVmb3JlIGNhbGxpbmcgY2JmbiwgdG8gcHJldmVudCBkb3VibGUgZnJlZSAqLworCWNvdW50ZXJfaW5jKHJlcS0+YnRzLT5uZXR3b3JrLT5zdGF0cy5wYWdpbmcuZXhwaXJlZCk7CiAJY2Jmbl9wYXJhbSA9IHJlcS0+Y2Jmbl9wYXJhbTsKIAljYmZuID0gcmVxLT5jYmZuOwogCXBhZ2luZ19yZW1vdmVfcmVxdWVzdCgmcmVxLT5idHMtPnBhZ2luZywgcmVxKTsKIAotCWNvdW50ZXJfaW5jKHJlcS0+YnRzLT5uZXR3b3JrLT5zdGF0cy5wYWdpbmcuZXhwaXJlZCk7CiAKIAlkaXNwYXRjaF9zaWduYWwoU1NfUEFHSU5HLCBTX1BBR0lOR19FWFBJUkVELCAmc2lnX2RhdGEpOwogCWlmIChjYmZuKQpAQCAtMjI3LDExICsyMTcsMTEgQEAKIAlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXE7CiAKIAlpZiAocGFnaW5nX3BlbmRpbmdfcmVxdWVzdChidHNfZW50cnksIHN1YnNjcikpIHsKLQkJREVCVUdQKERQQUcsICJQYWdpbmcgcmVxdWVzdCBhbHJlYWR5IHBlbmRpbmdcbiIpOworCQlMT0dQKERQQUcsIExPR0xfSU5GTywgIlBhZ2luZyByZXF1ZXN0IGFscmVhZHkgcGVuZGluZyBmb3IgJXNcbiIsIHN1YnNjci0+aW1zaSk7CiAJCXJldHVybiAtRUVYSVNUOwogCX0KIAotCURFQlVHUChEUEFHLCAiU3RhcnQgcGFnaW5nIG9mIHN1YnNjcmliZXIgJWxsdSBvbiBidHMgJWQuXG4iLAorCUxPR1AoRFBBRywgTE9HTF9ERUJVRywgIlN0YXJ0IHBhZ2luZyBvZiBzdWJzY3JpYmVyICVsbHUgb24gYnRzICVkLlxuIiwKIAkJc3Vic2NyLT5pZCwgYnRzLT5ucik7CiAJcmVxID0gdGFsbG9jX3plcm8odGFsbF9wYWdpbmdfY3R4LCBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0KTsKIAlyZXEtPnN1YnNjciA9IHN1YnNjcl9nZXQoc3Vic2NyKTsKQEAgLTI0NSw3ICsyMzUsNyBAQAogCWxsaXN0X2FkZF90YWlsKCZyZXEtPmVudHJ5LCAmYnRzX2VudHJ5LT5wZW5kaW5nX3JlcXVlc3RzKTsKIAogCWlmICghYnNjX3RpbWVyX3BlbmRpbmcoJmJ0c19lbnRyeS0+d29ya190aW1lcikpCi0JCWJzY19zY2hlZHVsZV90aW1lcigmYnRzX2VudHJ5LT53b3JrX3RpbWVyLCAxLCAwKTsKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZidHNfZW50cnktPndvcmtfdGltZXIsIDIsIDApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTYsMTEgKzI4NiwxMSBAQAogCQkJCSBlbnRyeSkgewogCQlpZiAocmVxLT5zdWJzY3IgPT0gc3Vic2NyKSB7CiAJCQlpZiAobGNoYW4gJiYgcmVxLT5jYmZuKSB7Ci0JCQkJREVCVUdQKERQQUcsICJTdG9wIHBhZ2luZyBvbiBidHMgJWQsIGNhbGxpbmcgY2Jmbi5cbiIsIGJ0cy0+bnIpOworCQkJCUxPR1AoRFBBRywgTE9HTF9ERUJVRywgIlN0b3AgcGFnaW5nIG9uIGJ0cyAlZCwgY2FsbGluZyBjYmZuLlxuIiwgYnRzLT5ucik7CiAJCQkJcmVxLT5jYmZuKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19TVUNDRUVERUQsCiAJCQkJCSAgTlVMTCwgbGNoYW4sIHJlcS0+Y2Jmbl9wYXJhbSk7CiAJCQl9IGVsc2UKLQkJCQlERUJVR1AoRFBBRywgIlN0b3AgcGFnaW5nIG9uIGJ0cyAlZCBzaWxlbnRseS5cbiIsIGJ0cy0+bnIpOworCQkJCUxPR1AoRFBBRywgTE9HTF9ERUJVRywgIlN0b3AgcGFnaW5nIG9uIGJ0cyAlZCBzaWxlbnRseS5cbiIsIGJ0cy0+bnIpOwogCQkJcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KCZidHMtPnBhZ2luZywgcmVxKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0zMjgsNyArMzE4LDcgQEAKIAkJCWJyZWFrOwogCiAJCS8qIFN0b3AgcGFnaW5nICovCi0gICAgICAgICAgICAgICAgaWYgKGJ0cyAhPSBfYnRzKQorCQlpZiAoYnRzICE9IF9idHMpCiAJCQlfcGFnaW5nX3JlcXVlc3Rfc3RvcChidHMsIHN1YnNjciwgTlVMTCk7CiAJfSB3aGlsZSAoMSk7CiB9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jIGIvb3BlbmJzYy9zcmMvcmVzdF9vY3RldHMuYwppbmRleCAxNjk5NmNlLi5kOWY1ZGE1IDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jCisrKyBiL29wZW5ic2Mvc3JjL3Jlc3Rfb2N0ZXRzLmMKQEAgLTEzMyw2ICsxMzMsNyBAQAogCQkJICAgICBjb25zdCBzdHJ1Y3QgZ3NtNDhfbHNhX3BhcmFtcyAqbHNhX3BhcmFtcykKIHsKIAkvKiBGSVhNRSAqLworCXJldHVybiAtMTsKIH0KIAogLyogR2VuZXJhdGUgU0k0IFJlc3QgT2N0ZXRzIChDaGFwdGVyIDEwLjUuMi4zNSkgKi8KQEAgLTMxNSwxMSArMzE2LDQyIEBACiAJYml0dmVjX3NldF9iaXQoYnYsIDEpOwogCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT5ic19jdl9tYXgsIDQpOwogCi0JLyogaGFyZC1jb2RlIG5vIFBBTl97REVDLElOQyxNQVh9ICovCi0JYml0dmVjX3NldF9iaXQoYnYsIDApOworCWlmICgwKSB7CisJCS8qIGhhcmQtY29kZSBubyBQQU5fe0RFQyxJTkMsTUFYfSAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJfSBlbHNlIHsKKwkJLyogY29waWVkIGZyb20gaXAuYWNjZXNzIEJTQyBwcm90b2NvbCB0cmFjZSAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCWJpdHZlY19zZXRfdWludChidiwgMSwgMyk7CS8qIERFQyAqLworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIDEsIDMpOwkvKiBJTkMgKi8KKwkJYml0dmVjX3NldF91aW50KGJ2LCAxNSwgMyk7CS8qIE1BWCAqLworCX0KIAotCS8qIG5vIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiAoRURHRSkgKi8KLQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJaWYgKCFnY28tPmV4dF9pbmZvX3ByZXNlbnQpIHsKKwkJLyogbm8gZXh0ZW5zaW9uIGluZm9ybWF0aW9uICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKwl9IGVsc2UgeworCQkvKiBleHRlbnNpb24gaW5mb3JtYXRpb24gKi8KKwkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQlpZiAoIWdjby0+ZXh0X2luZm8uZWdwcnNfc3VwcG9ydGVkKSB7CisJCQkvKiA2Yml0IGxlbmd0aCBvZiBleHRlbnNpb24gKi8KKwkJCWJpdHZlY19zZXRfdWludChidiwgKDEgKyAzKS0xLCA2KTsKKwkJCS8qIEVHUFJTIHN1cHBvcnRlZCBpbiB0aGUgY2VsbCAqLworCQkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCQl9IGVsc2UgeworCQkJLyogNmJpdCBsZW5ndGggb2YgZXh0ZW5zaW9uICovCisJCQliaXR2ZWNfc2V0X3VpbnQoYnYsICgxICsgNSArIDMpLTEsIDYpOworCQkJLyogRUdQUlMgc3VwcG9ydGVkIGluIHRoZSBjZWxsICovCisJCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCQkvKiAxYml0IEVHUFJTIFBBQ0tFVCBDSEFOTkVMIFJFUVVFU1QgKi8KKwkJCWJpdHZlY19zZXRfYml0KGJ2LCBnY28tPmV4dF9pbmZvLnVzZV9lZ3Byc19wX2NoX3JlcSk7CisJCQkvKiA0Yml0IEJFUCBQRVJJT0QgKi8KKwkJCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT5leHRfaW5mby5iZXBfcGVyaW9kLCA0KTsKKwkJfQorCQliaXR2ZWNfc2V0X2JpdChidiwgZ2NvLT5leHRfaW5mby5wZmNfc3VwcG9ydGVkKTsKKwkJYml0dmVjX3NldF9iaXQoYnYsIGdjby0+ZXh0X2luZm8uZHRtX3N1cHBvcnRlZCk7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBnY28tPmV4dF9pbmZvLmJzc19wYWdpbmdfY29vcmRpbmF0aW9uKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMzNCw3ICszNjYsNyBAQAogCWJpdHZlY19zZXRfdWludChidiwgcGNwLT5uX2F2Z19pLCA0KTsKIH0KIAotLyogR2VuZXJhdGUgU0kxMyBSZXN0IE9jdGVzdHMgKENoYXB0ZXIgMTAuNS4yLjM3YikgKi8KKy8qIEdlbmVyYXRlIFNJMTMgUmVzdCBPY3Rlc3RzICgwNC4wOCBDaGFwdGVyIDEwLjUuMi4zN2IpICovCiBpbnQgcmVzdF9vY3RldHNfc2kxMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyAqc2kxMykKIHsKIAlzdHJ1Y3QgYml0dmVjIGJ2OwpAQCAtMzkwLDYgKzQyMiwxMSBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9CisJCS8qIDNHUFAgVFMgNDQuMDE4IFJlbGVhc2UgNiAvIDEwLjUuMi4zN2IgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsJLyogYWRkZWQgUmVsZWFzZSA5OSAqLworCQkvKiBjbGFpbSBvdXIgU0dTTiBpcyBjb21wYXRpYmxlIHdpdGggUmVsZWFzZSA5OSwgYXMgRURHRSBhbmQgRUdQUlMKKwkJICogd2FzIG9ubHkgYWRkZWQgaW4gdGhpcyBSZWxlYXNlICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CiAJfQogCWJpdHZlY19zcGFyZV9wYWRkaW5nKCZidiwgKGJ2LmRhdGFfbGVuKjgpLTEpOwogCXJldHVybiBidi5kYXRhX2xlbjsKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3JzMjMyLmMgYi9vcGVuYnNjL3NyYy9yczIzMi5jCmluZGV4IDM2YWY1OWMuLjIyYWRmNTYgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL3JzMjMyLmMKKysrIGIvb3BlbmJzYy9zcmMvcnMyMzIuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGxlbmd0aCBpbiBoZHI6ICV1XG4iLAogCQkJCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyk7CiAJCX0KLQl9IGVsc2UgeyAKKwl9IGVsc2UgewogCQkvKiB0cnkgdG8gcmVhZCBhcyBtYW55IG9mIHRoZSBtaXNzaW5nIGJ5dGVzIGFzIGFyZSBhdmFpbGFibGUgKi8KIAkJcmMgPSByZWFkKHNoLT5mZC5mZCwgbXNnLT50YWlsLCBzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyk7CiAJCWlmIChyYyA8IDApIHsKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3J0cF9wcm94eS5jIGIvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMKaW5kZXggOWYyZTJmZC4uOTI0MTczZCAxMDA2NDQKLS0tIGEvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMKKysrIGIvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMKQEAgLTkxLDkgKzkxLDYgQEAKIAogI2RlZmluZSBSVFBfVkVSU0lPTgkyCiAKLSNkZWZpbmUgUlRQX1BUX0dTTV9GVUxMCTMKLSNkZWZpbmUgUlRQX1BUX0dTTV9FRlIJOTcKLQogLyogZGVjb2RlIGFuIHJ0cCBmcmFtZSBhbmQgY3JlYXRlIGEgbmV3IGJ1ZmZlciB3aXRoIHBheWxvYWQgKi8KIHN0YXRpYyBpbnQgcnRwX2RlY29kZShzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDMyX3QgY2FsbHJlZiwgc3RydWN0IG1zZ2IgKipkYXRhKQogewpAQCAtNTA0LDcgKzUwMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfcnNzKHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzLCAKK3N0YXRpYyB2b2lkIGluaXRfcnNzKHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzLAogCQkgICAgIHN0cnVjdCBydHBfc29ja2V0ICpycywgaW50IGZkLCBpbnQgcHJpdl9ucikKIHsKIAkvKiBpbml0aWFsaXplIGJmZCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc2lsZW50X2NhbGwuYyBiL29wZW5ic2Mvc3JjL3NpbGVudF9jYWxsLmMKaW5kZXggY2FkYTI0ZS4uOGJkNTM0MSAxMDA2NDQKLS0tIGEvb3BlbmJzYy9zcmMvc2lsZW50X2NhbGwuYworKysgYi9vcGVuYnNjL3NyYy9zaWxlbnRfY2FsbC5jCkBAIC0zOCw2ICszOCw3IEBACiBzdGF0aWMgaW50IHBhZ2luZ19jYl9zaWxlbnQodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKIAkJCSAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpfbGNoYW4sIHZvaWQgKl9kYXRhKQogeworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOwogCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOwogCXN0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSBzaWdkYXRhOwogCWludCByYzsKQEAgLTQ3LDYgKzQ4LDggQEAKIAogCURFQlVHUChEU01TLCAicGFnaW5nX2NiX3NpbGVudDogIik7CiAKKwljb25uID0gJmxjaGFuLT5jb25uOworCiAJc2lnZGF0YS5sY2hhbiA9IGxjaGFuOwogCXNpZ2RhdGEuZGF0YSA9IF9kYXRhOwogCkBAIC01NCwxMCArNTcsMTAgQEAKIAljYXNlIEdTTV9QQUdJTkdfU1VDQ0VFREVEOgogCQlERUJVR1BDKERTTVMsICJzdWNjZXNzLCB1c2luZyBUaW1lc2xvdCAldSBvbiBBUkZDTiAldVxuIiwKIAkJCWxjaGFuLT50cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5hcmZjbik7Ci0JCWxjaGFuLT5zaWxlbnRfY2FsbCA9IDE7CisJCWNvbm4tPnNpbGVudF9jYWxsID0gMTsKIAkJLyogaW5jcmVtZW50IGxjaGFuIHJlZmVyZW5jZSBjb3VudCAqLwogCQlkaXNwYXRjaF9zaWduYWwoU1NfU0NBTEwsIFNfU0NBTExfU1VDQ0VTUywgJnNpZ2RhdGEpOwotCQl1c2VfbGNoYW4obGNoYW4pOworCQl1c2Vfc3Vic2NyX2Nvbihjb25uKTsKIAkJYnJlYWs7CiAJY2FzZSBHU01fUEFHSU5HX0VYUElSRUQ6CiAJCURFQlVHUChEU01TLCAiZXhwaXJlZFxuIik7CkBAIC05Nyw3ICsxMDAsNyBAQAogCWludCBpOwogCiAJLyogaWYgd2UncmUgbm90IHBhcnQgb2YgYSBzaWxlbnQgY2FsbCwgbmV2ZXIgcmVyb3V0ZSAqLwotCWlmICghbXNnLT5sY2hhbi0+c2lsZW50X2NhbGwpCisJaWYgKCFtc2ctPmxjaGFuLT5jb25uLnNpbGVudF9jYWxsKQogCQlyZXR1cm4gMDsKIAogCS8qIGNoZWNrIGlmIHdlIGFyZSBhIHNwZWNpYWwgbWVzc2FnZSB0aGF0IGlzIGhhbmRsZWQgaW4gb3BlbmJzYyAqLwpAQCAtMTI2LDE2ICsxMjksMTggQEAKIGludCBnc21fc2lsZW50X2NhbGxfc3RvcChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKIHsKIAlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKIAogCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOwogCWlmICghbGNoYW4pCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogZGlkIHdlIGFjdHVhbGx5IGVzdGFibGlzaCBhIHNpbGVudCBjYWxsIGZvciB0aGlzIGd1eT8gKi8KLQlpZiAoIWxjaGFuLT5zaWxlbnRfY2FsbCkKKwljb25uID0gJmxjaGFuLT5jb25uOworCWlmICghY29ubi0+c2lsZW50X2NhbGwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHV0X2xjaGFuKGxjaGFuKTsKKwlwdXRfc3Vic2NyX2Nvbihjb25uKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc29ja2V0LmMgYi9vcGVuYnNjL3NyYy9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBjNDNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc29ja2V0LmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIE9wZW5CU0Mgc29rY2V0IGNvZGUsIHRha2VuIGZyb20gQWJpcyBpbnB1dCBkcml2ZXIgZm9yIGlwLmFjY2VzcyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCitpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50IHByb3RvLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LAorCSAgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCByZXQsIG9uID0gMTsKKwlpbnQgdHlwZSA9IFNPQ0tfU1RSRUFNOworCisJc3dpdGNoIChwcm90bykgeworCWNhc2UgSVBQUk9UT19UQ1A6CisJCXR5cGUgPSBTT0NLX1NUUkVBTTsKKwkJYnJlYWs7CisJY2FzZSBJUFBST1RPX1VEUDoKKwkJdHlwZSA9IFNPQ0tfREdSQU07CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19HUkU6CisJCXR5cGUgPSBTT0NLX1JBVzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCB0eXBlLCBwcm90byk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCS8vYmZkLT5kYXRhID0gbGluZTsKKworCWlmIChiZmQtPmZkIDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY3JlYXRlIHNvY2tldC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJaWYgKGlwKQorCQlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGlwKTsKKwllbHNlCisJCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIHNvY2tldCAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAocHJvdG8gPT0gSVBQUk9UT19UQ1ApIHsKKwkJcmV0ID0gbGlzdGVuKGJmZC0+ZmQsIDEpOworCQlpZiAocmV0IDwgMCkgeworCQkJcGVycm9yKCJsaXN0ZW4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoInJlZ2lzdGVyX2xpc3Rlbl9mZCIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zeXN0ZW1faW5mb3JtYXRpb24uYyBiL29wZW5ic2Mvc3JjL3N5c3RlbV9pbmZvcm1hdGlvbi5jCmluZGV4IDNmOWQ2MDkuLmViNGFjN2MgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL3N5c3RlbV9pbmZvcm1hdGlvbi5jCisrKyBiL29wZW5ic2Mvc3JjL3N5c3RlbV9pbmZvcm1hdGlvbi5jCkBAIC0zOTcsMTggKzM5NywyOCBAQAogCiBzdGF0aWMgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyBzaTEzX2RlZmF1bHQgPSB7CiAJLmNlbGxfb3B0cyA9IHsKLQkJLm5tbyAJCT0gR1BSU19OTU9fSUlJLAotCQkudDMxNjgJCT0gMTUwMCwKLQkJLnQzMTkyCQk9IDUwMCwKKwkJLm5tbyAJCT0gR1BSU19OTU9fSUksCisJCS50MzE2OAkJPSAyMDAwLAorCQkudDMxOTIJCT0gMjAwLAogCQkuZHJ4X3RpbWVyX21heAk9IDMsCiAJCS5ic19jdl9tYXgJPSAxNSwKKwkJLmV4dF9pbmZvX3ByZXNlbnQgPSAxLAorCQkuZXh0X2luZm8gPSB7CisJCQkvKiBUaGUgdmFsdWVzIGJlbG93IGFyZSBqdXN0IGd1ZXNzZXMgISAqLworCQkJLmVncHJzX3N1cHBvcnRlZCA9IDAsCisJCQkudXNlX2VncHJzX3BfY2hfcmVxID0gMSwKKwkJCS5iZXBfcGVyaW9kID0gNSwKKwkJCS5wZmNfc3VwcG9ydGVkID0gMCwKKwkJCS5kdG1fc3VwcG9ydGVkID0gMCwKKwkJCS5ic3NfcGFnaW5nX2Nvb3JkaW5hdGlvbiA9IDAsCisJCX0sCiAJfSwKIAkucHdyX2N0cmxfcGFycyA9IHsKIAkJLmFscGhhCQk9IDEwLAkvKiBhID0gMS4wICovCi0JCS50X2F2Z193CT0gMjUsCi0JCS50X2F2Z190CT0gMjUsCisJCS50X2F2Z193CT0gMTYsCisJCS50X2F2Z190CT0gMTYsCiAJCS5wY19tZWFzX2NoYW4JPSAwLCAJLyogZG93bmxpbmcgbWVhc3VyZWQgb24gQ0NDSCAqLwotCQkubl9hdmdfaQk9IDE1LAorCQkubl9hdmdfaQk9IDgsCiAJfSwKIAkuYmNjaF9jaGFuZ2VfbWFyawk9IDEsCiAJLnNpX2NoYW5nZV9maWVsZAk9IDAsCkBAIC00NDgsNyArNDU4LDE4IEBACiAKIGludCBnc21fZ2VuZXJhdGVfc2kodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHR5cGUpCiB7Ci0Jc2lfaW5mby5ncHJzX2luZC5wcmVzZW50ID0gYnRzLT5ncHJzLmVuYWJsZWQ7CisJc3dpdGNoIChidHMtPmdwcnMubW9kZSkgeworCWNhc2UgQlRTX0dQUlNfRUdQUlM6CisJCXNpMTNfZGVmYXVsdC5jZWxsX29wdHMuZXh0X2luZm9fcHJlc2VudCA9IDE7CisJCXNpMTNfZGVmYXVsdC5jZWxsX29wdHMuZXh0X2luZm8uZWdwcnNfc3VwcG9ydGVkID0gMTsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIEJUU19HUFJTX0dQUlM6CisJCXNpX2luZm8uZ3Byc19pbmQucHJlc2VudCA9IDE7CisJCWJyZWFrOworCWNhc2UgQlRTX0dQUlNfTk9ORToKKwkJc2lfaW5mby5ncHJzX2luZC5wcmVzZW50ID0gMDsKKwkJYnJlYWs7CisJfQogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBSU0xfU1lTVEVNX0lORk9fMToKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RhbGxvY19jdHguYyBiL29wZW5ic2Mvc3JjL3RhbGxvY19jdHguYwppbmRleCA2Mzc5ZTEzLi44ZTdlYzIzIDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy90YWxsb2NfY3R4LmMKKysrIGIvb3BlbmJzYy9zcmMvdGFsbG9jX2N0eC5jCkBAIC00LDYgKzQsNyBAQAogZXh0ZXJuIHZvaWQgKnRhbGxfbXNnYl9jdHg7CiBleHRlcm4gdm9pZCAqdGFsbF9mbGVfY3R4OwogZXh0ZXJuIHZvaWQgKnRhbGxfbG9jb3BfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfYXV0aGNpcGhvcF9jdHg7CiBleHRlcm4gdm9pZCAqdGFsbF9nc21zX2N0eDsKIGV4dGVybiB2b2lkICp0YWxsX3N1YnNjcl9jdHg7CiBleHRlcm4gdm9pZCAqdGFsbF9zdWJfcmVxX2N0eDsKQEAgLTE5LDkgKzIwLDEwIEBACiB2b2lkIHRhbGxvY19jdHhfaW5pdCh2b2lkKQogewogCXRhbGxfbXNnYl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibXNnYiIpOwotCXRhbGxfZmxlX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsIAorCXRhbGxfZmxlX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsCiAJCQkJCSAgImJzMTFfZmlsZV9saXN0X2VudHJ5Iik7CiAJdGFsbF9sb2NvcF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibG9jX3VwZGF0aW5nX29wZXIiKTsKKwl0YWxsX2F1dGhjaXBob3BfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImF1dGhfY2lwaF9vcGVyIik7CiAJdGFsbF9nc21zX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzbXMiKTsKIAl0YWxsX3N1YnNjcl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic3Vic2NyaWJlciIpOwogCXRhbGxfc3ViX3JlcV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic3Vic2NyX3JlcXVlc3QiKTsKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYyBiL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExMTliNC4uMDAwMDAwMAotLS0gYS9vcGVuYnNjL3NyYy90ZWxuZXRfaW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyogbWluaW1hbGlzdGljIHRlbG5ldC9uZXR3b3JrIGludGVyZmFjZSBpdCBtaWdodCB0dXJuIGludG8gYSB3aXJlIGludGVyZmFjZSAqLwotLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+Ci0jaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+Ci0jaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KLSNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgotI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KLSNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+Ci0jaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KLSNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgotI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgotI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KLQotI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KLQotI2RlZmluZSBXUklURV9DT05ORUNUSU9OKGZkLCBtc2cuLi4pIFwKLQlpbnQgcmV0OyBcCi0JY2hhciBidWZbNDA5Nl07IFwKLQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBtc2cpOyBcCi0JcmV0ID0gd3JpdGUoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotCi0KLS8qIHBlciBjb25uZWN0aW9uIGRhdGEgKi8KLUxMSVNUX0hFQUQoYWN0aXZlX2Nvbm5lY3Rpb25zKTsKLQotc3RhdGljIHZvaWQgKnRhbGxfdGVsbmV0X2N0eDsKLQotLyogcGVyIG5ldHdvcmsgZGF0YSAqLwotc3RhdGljIGludCB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KTsKLQotc3RhdGljIHN0cnVjdCBic2NfZmQgc2VydmVyX3NvY2tldCA9IHsKLQkud2hlbgkgICAgPSBCU0NfRkRfUkVBRCwKLQkuY2IJICAgID0gdGVsbmV0X25ld19jb25uZWN0aW9uLAotCS5wcml2X25yICAgID0gMCwKLX07Ci0KLXZvaWQgdGVsbmV0X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBpbnQgcG9ydCkgewotCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrX2FkZHI7Ci0JaW50IGZkLCBvbiA9IDE7Ci0KLQl0YWxsX3RlbG5ldF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAxLAotCQkJCQkgICAgICJ0ZWxuZXRfY29ubmVjdGlvbiIpOwotCi0JYnNjX3Z0eV9pbml0KG5ldHdvcmspOwotCi0JZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLQotCWlmIChmZCA8IDApIHsKLQkJTE9HUChETk0sIExPR0xfRVJST1IsICJUZWxuZXQgaW50ZXJmYWNlIHNvY2tldCBjcmVhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOwotCi0JbWVtc2V0KCZzb2NrX2FkZHIsIDAsIHNpemVvZihzb2NrX2FkZHIpKTsKLQlzb2NrX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0Jc29ja19hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0Jc29ja19hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7Ci0KLQlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvY2tfYWRkciwgc2l6ZW9mKHNvY2tfYWRkcikpIDwgMCkgewotCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRlbG5ldCBpbnRlcmZhY2UgZmFpbGVkIHRvIGJpbmRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGxpc3RlbihmZCwgMCkgPCAwKSB7Ci0JCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGVsbmV0IGludGVyZmFjZSBmYWlsZWQgdG8gbGlzdGVuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXNlcnZlcl9zb2NrZXQuZGF0YSA9IG5ldHdvcms7Ci0Jc2VydmVyX3NvY2tldC5mZCA9IGZkOwotCWJzY19yZWdpc3Rlcl9mZCgmc2VydmVyX3NvY2tldCk7Ci19Ci0KLWV4dGVybiBjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodDsKLWV4dGVybiBjb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb247Ci0KLXN0YXRpYyB2b2lkIHByaW50X3dlbGNvbWUoaW50IGZkKSB7Ci0JaW50IHJldDsKLQlzdGF0aWMgY2hhciAqbXNnID0KLQkJIldlbGNvbWUgdG8gdGhlIE9wZW5CU0MgQ29udHJvbCBpbnRlcmZhY2VcbiI7Ci0KLQlyZXQgPSB3cml0ZShmZCwgbXNnLCBzdHJsZW4obXNnKSk7Ci0JcmV0ID0gd3JpdGUoZmQsIG9wZW5ic2NfY29weXJpZ2h0LCBzdHJsZW4ob3BlbmJzY19jb3B5cmlnaHQpKTsKLX0KLQotaW50IHRlbG5ldF9jbG9zZV9jbGllbnQoc3RydWN0IGJzY19mZCAqZmQpIHsKLQlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uKilmZC0+ZGF0YTsKLQotCWNsb3NlKGZkLT5mZCk7Ci0JYnNjX3VucmVnaXN0ZXJfZmQoZmQpOwotCi0JaWYgKGNvbm4tPmRiZykgewotCQlkZWJ1Z19kZWxfdGFyZ2V0KGNvbm4tPmRiZyk7Ci0JCXRhbGxvY19mcmVlKGNvbm4tPmRiZyk7Ci0JfQotCi0JbGxpc3RfZGVsKCZjb25uLT5lbnRyeSk7Ci0JdGFsbG9jX2ZyZWUoY29ubik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2xpZW50X2RhdGEoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQotewotCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubiA9IGZkLT5kYXRhOwotCWludCByYyA9IDA7Ci0KLQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKSB7Ci0JCWNvbm4tPmZkLndoZW4gJj0gfkJTQ19GRF9SRUFEOwotCQlyYyA9IHZ0eV9yZWFkKGNvbm4tPnZ0eSk7Ci0JfQotCi0JLyogdnR5IG1pZ2h0IGhhdmUgYmVlbiBjbG9zZWQgZnJvbSB2aXRoaW4gdnR5X3JlYWQoKSAqLwotCWlmICghY29ubi0+dnR5KQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkgewotCQlyYyA9IGJ1ZmZlcl9mbHVzaF9hbGwoY29ubi0+dnR5LT5vYnVmLCBmZC0+ZmQpOwotCQlpZiAocmMgPT0gQlVGRkVSX0VNUFRZKQotCQkJY29ubi0+ZmQud2hlbiAmPSB+QlNDX0ZEX1dSSVRFOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSB7Ci0Jc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwotCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrYWRkcjsKLQlzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNvY2thZGRyKTsKLQlpbnQgbmV3X2Nvbm5lY3Rpb24gPSBhY2NlcHQoZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyKikmc29ja2FkZHIsICZsZW4pOwotCi0JaWYgKG5ld19jb25uZWN0aW9uIDwgMCkgewotCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgInRlbG5ldCBhY2NlcHQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JY29ubmVjdGlvbiA9IHRhbGxvY196ZXJvKHRhbGxfdGVsbmV0X2N0eCwgc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uKTsKLQljb25uZWN0aW9uLT5uZXR3b3JrID0gKHN0cnVjdCBnc21fbmV0d29yayopZmQtPmRhdGE7Ci0JY29ubmVjdGlvbi0+ZmQuZGF0YSA9IGNvbm5lY3Rpb247Ci0JY29ubmVjdGlvbi0+ZmQuZmQgPSBuZXdfY29ubmVjdGlvbjsKLQljb25uZWN0aW9uLT5mZC53aGVuID0gQlNDX0ZEX1JFQUQ7Ci0JY29ubmVjdGlvbi0+ZmQuY2IgPSBjbGllbnRfZGF0YTsKLQlic2NfcmVnaXN0ZXJfZmQoJmNvbm5lY3Rpb24tPmZkKTsKLQlsbGlzdF9hZGRfdGFpbCgmY29ubmVjdGlvbi0+ZW50cnksICZhY3RpdmVfY29ubmVjdGlvbnMpOwotCi0JcHJpbnRfd2VsY29tZShuZXdfY29ubmVjdGlvbik7Ci0KLQljb25uZWN0aW9uLT52dHkgPSB2dHlfY3JlYXRlKG5ld19jb25uZWN0aW9uLCBjb25uZWN0aW9uKTsKLQlpZiAoIWNvbm5lY3Rpb24tPnZ0eSkgewotCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgImNvdWxkbid0IGNyZWF0ZSBWVFlcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGNhbGxiYWNrIGZyb20gVlRZIGNvZGUgKi8KLXZvaWQgdnR5X2V2ZW50KGVudW0gZXZlbnQgZXZlbnQsIGludCBzb2NrLCBzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0Jc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gdnR5LT5wcml2OwotCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZjb25uZWN0aW9uLT5mZDsKLQotCWlmICh2dHktPnR5cGUgIT0gVlRZX1RFUk0pCi0JCXJldHVybjsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFZUWV9SRUFEOgotCQliZmQtPndoZW4gfD0gQlNDX0ZEX1JFQUQ7Ci0JCWJyZWFrOwotCWNhc2UgVlRZX1dSSVRFOgotCQliZmQtPndoZW4gfD0gQlNDX0ZEX1dSSVRFOwotCQlicmVhazsKLQljYXNlIFZUWV9DTE9TRUQ6Ci0JCS8qIHZ0eSBsYXllciBpcyBhYm91dCB0byBmcmVlKCkgdnR5ICovCi0JCWNvbm5lY3Rpb24tPnZ0eSA9IE5VTEw7Ci0JCXRlbG5ldF9jbG9zZV9jbGllbnQoYmZkKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jIGIvb3BlbmJzYy9zcmMvdHJhbnNhY3Rpb24uYwppbmRleCA3NWEyNzlkLi41ZTBkNTA3IDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jCisrKyBiL29wZW5ic2Mvc3JjL3RyYW5zYWN0aW9uLmMKQEAgLTk1LDEwICs5NSwxMCBAQAogCQlicmVhazsKIAl9CiAKLQlpZiAodHJhbnMtPmxjaGFuKQotCQlwdXRfbGNoYW4odHJhbnMtPmxjaGFuKTsKKwlpZiAodHJhbnMtPmNvbm4pCisJCXB1dF9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKIAotCWlmICghdHJhbnMtPmxjaGFuICYmIHRyYW5zLT5zdWJzY3IgJiYgdHJhbnMtPnN1YnNjci0+bmV0KSB7CisJaWYgKCF0cmFucy0+Y29ubiAmJiB0cmFucy0+c3Vic2NyICYmIHRyYW5zLT5zdWJzY3ItPm5ldCkgewogCQkvKiBTdG9wIHBhZ2luZyBvbiBhbGwgYnRzJyAqLwogCQlwYWdpbmdfcmVxdWVzdF9zdG9wKE5VTEwsIHRyYW5zLT5zdWJzY3IsIE5VTEwpOwogCX0KQEAgLTE0OCwyMSArMTQ4LDIyIEBACiAKIC8qIHVwZGF0ZSBhbGwgdHJhbnNhY3Rpb25zIHRvIHVzZSBhIGRpZmZlcmVudCBMQ0hBTiwgZS5nLgogICogYWZ0ZXIgaGFuZG92ZXIgaGFzIHN1Y2NlZWRlZCAqLwotaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9vbGQsCi0JCSAgICAgICBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9uZXcpCitpbnQgdHJhbnNfbGNoYW5fY2hhbmdlKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uX29sZCwKKwkJICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uX25ldykKIHsKLQlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGxjaGFuX29sZC0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gY29ubl9vbGQtPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CiAJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CiAJaW50IG51bSA9IDA7CiAKIAlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKLQkJaWYgKHRyYW5zLT5sY2hhbiA9PSBsY2hhbl9vbGQpIHsKLQkJCS8qIGRyb3Agb2xkIGNoYW5uZWwgdXNlIGNvdW5kICovCi0JCQlwdXRfbGNoYW4odHJhbnMtPmxjaGFuKTsKKwkJaWYgKHRyYW5zLT5jb25uID09IGNvbm5fb2xkKSB7CisKKwkJCS8qIGRyb3Agb2xkIGNoYW5uZWwgdXNlIGNvdW50ICovCisJCQlwdXRfc3Vic2NyX2Nvbihjb25uX29sZCk7CiAJCQkvKiBhc3NpZ24gbmV3IGNoYW5uZWwgKi8KLQkJCXRyYW5zLT5sY2hhbiA9IGxjaGFuX25ldzsKKwkJCXRyYW5zLT5jb25uID0gY29ubl9uZXc7CiAJCQkvKiBidW1wIG5ldyBjaGFubmVsIHVzZSBjb3VudCAqLwotCQkJdXNlX2xjaGFuKHRyYW5zLT5sY2hhbik7CisJCQl1c2Vfc3Vic2NyX2Nvbihjb25uX25ldyk7CiAJCQludW0rKzsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Vzc2QuYyBiL29wZW5ic2Mvc3JjL3Vzc2QuYwppbmRleCBhM2QxMWYwLi41NDc2OTE5IDEwMDY0NAotLS0gYS9vcGVuYnNjL3NyYy91c3NkLmMKKysrIGIvb3BlbmJzYy9zcmMvdXNzZC5jCkBAIC02Miw3ICs2Miw3IEBACiAvKiBBIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxlciBmdW5jdGlvbiAqLwogc3RhdGljIGludCBzZW5kX293bl9udW1iZXIoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQogewotCWNoYXIgKm93bl9udW1iZXIgPSBtc2ctPmxjaGFuLT5zdWJzY3ItPmV4dGVuc2lvbjsKKwljaGFyICpvd25fbnVtYmVyID0gbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3ItPmV4dGVuc2lvbjsKIAljaGFyIHJlc3BvbnNlX3N0cmluZ1tHU01fRVhURU5TSU9OX0xFTkdUSCArIDIwXTsKIAogCS8qIE5lZWQgdHJhaWxpbmcgQ1IgYXMgRU9UIGNoYXJhY3RlciAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L2J1ZmZlci5jIGIvb3BlbmJzYy9zcmMvdnR5L2J1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTVkMDYyLi4wMDAwMDAwCi0tLSBhL29wZW5ic2Mvc3JjL3Z0eS9idWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MyArMCwwIEBACi0vKgotICogQnVmZmVyaW5nIG9mIG91dHB1dCBhbmQgaW5wdXQuCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggS3VuaWhpcm8gSXNoaWd1cm8KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCi0gKgotICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLQotI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgotI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KLSNpbmNsdWRlIDx2dHkvdnR5Lmg+Ci0KLS8qIEJ1ZmZlciBtYXN0ZXIuICovCi1zdHJ1Y3QgYnVmZmVyIHsKLQkvKiBEYXRhIGxpc3QuICovCi0Jc3RydWN0IGJ1ZmZlcl9kYXRhICpoZWFkOwotCXN0cnVjdCBidWZmZXJfZGF0YSAqdGFpbDsKLQotCS8qIFNpemUgb2YgZWFjaCBidWZmZXJfZGF0YSBjaHVuay4gKi8KLQlzaXplX3Qgc2l6ZTsKLX07Ci0KLS8qIERhdGEgY29udGFpbmVyLiAqLwotc3RydWN0IGJ1ZmZlcl9kYXRhIHsKLQlzdHJ1Y3QgYnVmZmVyX2RhdGEgKm5leHQ7Ci0KLQkvKiBMb2NhdGlvbiB0byBhZGQgbmV3IGRhdGEuICovCi0Jc2l6ZV90IGNwOwotCi0JLyogUG9pbnRlciB0byBkYXRhIG5vdCB5ZXQgZmx1c2hlZC4gKi8KLQlzaXplX3Qgc3A7Ci0KLQkvKiBBY3R1YWwgZGF0YSBzdHJlYW0gKHZhcmlhYmxlIGxlbmd0aCkuICovCi0JdW5zaWduZWQgY2hhciBkYXRhWzBdOwkvKiByZWFsIGRpbWVuc2lvbiBpcyBidWZmZXItPnNpemUgKi8KLX07Ci0KLS8qIEl0IHNob3VsZCBhbHdheXMgYmUgdHJ1ZSB0aGF0OiAwIDw9IHNwIDw9IGNwIDw9IHNpemUgKi8KLQotLyogRGVmYXVsdCBidWZmZXIgc2l6ZSAodXNlZCBpZiBub25lIHNwZWNpZmllZCkuICBJdCBpcyByb3VuZGVkIHVwIHRvIHRoZQotICAgbmV4dCBwYWdlIGJvdW5kZXJ5LiAqLwotI2RlZmluZSBCVUZGRVJfU0laRV9ERUZBVUxUCQk0MDk2Ci0KLSNkZWZpbmUgQlVGRkVSX0RBVEFfRlJFRShEKSB0YWxsb2NfZnJlZSgoRCkpCi0KLS8qIE1ha2UgbmV3IGJ1ZmZlci4gKi8KLXN0cnVjdCBidWZmZXIgKmJ1ZmZlcl9uZXcoc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqYjsKLQotCWIgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cnVjdCBidWZmZXIpOwotCi0JaWYgKHNpemUpCi0JCWItPnNpemUgPSBzaXplOwotCWVsc2UgewotCQlzdGF0aWMgc2l6ZV90IGRlZmF1bHRfc2l6ZTsKLQkJaWYgKCFkZWZhdWx0X3NpemUpIHsKLQkJCWxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKLQkJCWRlZmF1bHRfc2l6ZSA9Ci0JCQkgICAgKCgoKEJVRkZFUl9TSVpFX0RFRkFVTFQgLSAxKSAvIHBnc3opICsgMSkgKiBwZ3N6KTsKLQkJfQotCQliLT5zaXplID0gZGVmYXVsdF9zaXplOwotCX0KLQotCXJldHVybiBiOwotfQotCi0vKiBGcmVlIGJ1ZmZlci4gKi8KLXZvaWQgYnVmZmVyX2ZyZWUoc3RydWN0IGJ1ZmZlciAqYikKLXsKLQlidWZmZXJfcmVzZXQoYik7Ci0JdGFsbG9jX2ZyZWUoYik7Ci19Ci0KLS8qIE1ha2Ugc3RyaW5nIGNsb25lLiAqLwotY2hhciAqYnVmZmVyX2dldHN0cihzdHJ1Y3QgYnVmZmVyICpiKQotewotCXNpemVfdCB0b3RsZW4gPSAwOwotCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKLQljaGFyICpzOwotCWNoYXIgKnA7Ci0KLQlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhOyBkYXRhID0gZGF0YS0+bmV4dCkKLQkJdG90bGVuICs9IGRhdGEtPmNwIC0gZGF0YS0+c3A7Ci0JaWYgKCEocyA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsICh0b3RsZW4gKyAxKSwgImJ1ZmZlcl9nZXRzdHIiKSkpCi0JCXJldHVybiBOVUxMOwotCXAgPSBzOwotCWZvciAoZGF0YSA9IGItPmhlYWQ7IGRhdGE7IGRhdGEgPSBkYXRhLT5uZXh0KSB7Ci0JCW1lbWNweShwLCBkYXRhLT5kYXRhICsgZGF0YS0+c3AsIGRhdGEtPmNwIC0gZGF0YS0+c3ApOwotCQlwICs9IGRhdGEtPmNwIC0gZGF0YS0+c3A7Ci0JfQotCSpwID0gJ1wwJzsKLQlyZXR1cm4gczsKLX0KLQotLyogUmV0dXJuIDEgaWYgYnVmZmVyIGlzIGVtcHR5LiAqLwotaW50IGJ1ZmZlcl9lbXB0eShzdHJ1Y3QgYnVmZmVyICpiKQotewotCXJldHVybiAoYi0+aGVhZCA9PSBOVUxMKTsKLX0KLQotLyogQ2xlYXIgYW5kIGZyZWUgYWxsIGFsbG9jYXRlZCBkYXRhLiAqLwotdm9pZCBidWZmZXJfcmVzZXQoc3RydWN0IGJ1ZmZlciAqYikKLXsKLQlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRhdGE7Ci0Jc3RydWN0IGJ1ZmZlcl9kYXRhICpuZXh0OwotCi0JZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YTsgZGF0YSA9IG5leHQpIHsKLQkJbmV4dCA9IGRhdGEtPm5leHQ7Ci0JCUJVRkZFUl9EQVRBX0ZSRUUoZGF0YSk7Ci0JfQotCWItPmhlYWQgPSBiLT50YWlsID0gTlVMTDsKLX0KLQotLyogQWRkIGJ1ZmZlcl9kYXRhIHRvIHRoZSBlbmQgb2YgYnVmZmVyLiAqLwotc3RhdGljIHN0cnVjdCBidWZmZXJfZGF0YSAqYnVmZmVyX2FkZChzdHJ1Y3QgYnVmZmVyICpiKQotewotCXN0cnVjdCBidWZmZXJfZGF0YSAqZDsKLQotCWQgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LAotCQkJIG9mZnNldG9mKHN0cnVjdCBidWZmZXJfZGF0YSwgZGF0YVtiLT5zaXplXSksCi0JCQkgImJ1ZmZlcl9hZGQiKTsKLQlpZiAoIWQpCi0JCXJldHVybiBOVUxMOwotCWQtPmNwID0gZC0+c3AgPSAwOwotCWQtPm5leHQgPSBOVUxMOwotCi0JaWYgKGItPnRhaWwpCi0JCWItPnRhaWwtPm5leHQgPSBkOwotCWVsc2UKLQkJYi0+aGVhZCA9IGQ7Ci0JYi0+dGFpbCA9IGQ7Ci0KLQlyZXR1cm4gZDsKLX0KLQotLyogV3JpdGUgZGF0YSB0byBidWZmZXIuICovCi12b2lkIGJ1ZmZlcl9wdXQoc3RydWN0IGJ1ZmZlciAqYiwgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IGJ1ZmZlcl9kYXRhICpkYXRhID0gYi0+dGFpbDsKLQljb25zdCBjaGFyICpwdHIgPSBwOwotCi0JLyogV2UgdXNlIGV2ZW4gbGFzdCBvbmUgYnl0ZSBvZiBkYXRhIGJ1ZmZlci4gKi8KLQl3aGlsZSAoc2l6ZSkgewotCQlzaXplX3QgY2h1bms7Ci0KLQkJLyogSWYgdGhlcmUgaXMgbm8gZGF0YSBidWZmZXIgYWRkIGl0LiAqLwotCQlpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmNwID09IGItPnNpemUpCi0JCQlkYXRhID0gYnVmZmVyX2FkZChiKTsKLQotCQljaHVuayA9Ci0JCSAgICAoKHNpemUgPD0KLQkJICAgICAgKGItPnNpemUgLSBkYXRhLT5jcCkpID8gc2l6ZSA6IChiLT5zaXplIC0gZGF0YS0+Y3ApKTsKLQkJbWVtY3B5KChkYXRhLT5kYXRhICsgZGF0YS0+Y3ApLCBwdHIsIGNodW5rKTsKLQkJc2l6ZSAtPSBjaHVuazsKLQkJcHRyICs9IGNodW5rOwotCQlkYXRhLT5jcCArPSBjaHVuazsKLQl9Ci19Ci0KLS8qIEluc2VydCBjaGFyYWN0ZXIgaW50byB0aGUgYnVmZmVyLiAqLwotdm9pZCBidWZmZXJfcHV0YyhzdHJ1Y3QgYnVmZmVyICpiLCB1X2NoYXIgYykKLXsKLQlidWZmZXJfcHV0KGIsICZjLCAxKTsKLX0KLQotLyogUHV0IHN0cmluZyB0byB0aGUgYnVmZmVyLiAqLwotdm9pZCBidWZmZXJfcHV0c3RyKHN0cnVjdCBidWZmZXIgKmIsIGNvbnN0IGNoYXIgKmMpCi17Ci0JYnVmZmVyX3B1dChiLCBjLCBzdHJsZW4oYykpOwotfQotCi0vKiBLZWVwIGZsdXNoaW5nIGRhdGEgdG8gdGhlIGZkIHVudGlsIHRoZSBidWZmZXIgaXMgZW1wdHkgb3IgYW4gZXJyb3IgaXMKLSAgIGVuY291bnRlcmVkIG9yIHRoZSBvcGVyYXRpb24gd291bGQgYmxvY2suICovCi1idWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2FsbChzdHJ1Y3QgYnVmZmVyICpiLCBpbnQgZmQpCi17Ci0JYnVmZmVyX3N0YXR1c190IHJldDsKLQlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmhlYWQ7Ci0Jc2l6ZV90IGhlYWRfc3A7Ci0KLQlpZiAoIWItPmhlYWQpCi0JCXJldHVybiBCVUZGRVJfRU1QVFk7Ci0JaGVhZF9zcCA9IChoZWFkID0gYi0+aGVhZCktPnNwOwotCS8qIEZsdXNoIGFsbCBkYXRhLiAqLwotCXdoaWxlICgocmV0ID0gYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZShiLCBmZCkpID09IEJVRkZFUl9QRU5ESU5HKSB7Ci0JCWlmICgoYi0+aGVhZCA9PSBoZWFkKSAmJiAoaGVhZF9zcCA9PSBoZWFkLT5zcCkKLQkJICAgICYmIChlcnJubyAhPSBFSU5UUikpCi0JCQkvKiBObyBkYXRhIHdhcyBmbHVzaGVkLCBzbyBrZXJuZWwgYnVmZmVyIG11c3QgYmUgZnVsbC4gKi8KLQkJCXJldHVybiByZXQ7Ci0JCWhlYWRfc3AgPSAoaGVhZCA9IGItPmhlYWQpLT5zcDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jaWYgMAotLyogRmx1c2ggZW5vdWdoIGRhdGEgdG8gZmlsbCBhIHRlcm1pbmFsIHdpbmRvdyBvZiB0aGUgZ2l2ZW4gc2NlbmUgKHVzZWQgb25seQotICAgYnkgdnR5IHRlbG5ldCBpbnRlcmZhY2UpLiAqLwotYnVmZmVyX3N0YXR1c190Ci1idWZmZXJfZmx1c2hfd2luZG93KHN0cnVjdCBidWZmZXIgKiBiLCBpbnQgZmQsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLQkJICAgIGludCBlcmFzZV9mbGFnLCBpbnQgbm9fbW9yZV9mbGFnKQotewotCWludCBuYnl0ZXM7Ci0JaW50IGlvdl9hbGxvYzsKLQlpbnQgaW92X2luZGV4OwotCXN0cnVjdCBpb3ZlYyAqaW92OwotCXN0cnVjdCBpb3ZlYyBzbWFsbF9pb3ZbM107Ci0JY2hhciBtb3JlW10gPSAiIC0tTW9yZS0tICI7Ci0JY2hhciBlcmFzZVtdID0KLQkgICAgeyAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LAotCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsCi0JCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgKLQl9OwotCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKLQlpbnQgY29sdW1uOwotCi0JaWYgKCFiLT5oZWFkKQotCQlyZXR1cm4gQlVGRkVSX0VNUFRZOwotCi0JaWYgKGhlaWdodCA8IDEpIHsKLQkJemxvZ193YXJuCi0JCSAgICAoIiVzIGNhbGxlZCB3aXRoIG5vbi1wb3NpdGl2ZSB3aW5kb3cgaGVpZ2h0ICVkLCBmb3JjaW5nIHRvIDEiLAotCQkgICAgIF9fZnVuY19fLCBoZWlnaHQpOwotCQloZWlnaHQgPSAxOwotCX0gZWxzZSBpZiAoaGVpZ2h0ID49IDIpCi0JCWhlaWdodC0tOwotCWlmICh3aWR0aCA8IDEpIHsKLQkJemxvZ193YXJuCi0JCSAgICAoIiVzIGNhbGxlZCB3aXRoIG5vbi1wb3NpdGl2ZSB3aW5kb3cgd2lkdGggJWQsIGZvcmNpbmcgdG8gMSIsCi0JCSAgICAgX19mdW5jX18sIHdpZHRoKTsKLQkJd2lkdGggPSAxOwotCX0KLQotCS8qIEZvciBlcmFzZSBhbmQgbW9yZSBkYXRhIGFkZCB0d28gdG8gYidzIGJ1ZmZlcl9kYXRhIGNvdW50LiAqLwotCWlmIChiLT5oZWFkLT5uZXh0ID09IE5VTEwpIHsKLQkJaW92X2FsbG9jID0gc2l6ZW9mKHNtYWxsX2lvdikgLyBzaXplb2Yoc21hbGxfaW92WzBdKTsKLQkJaW92ID0gc21hbGxfaW92OwotCX0gZWxzZSB7Ci0JCWlvdl9hbGxvYyA9ICgoaGVpZ2h0ICogKHdpZHRoICsgMikpIC8gYi0+c2l6ZSkgKyAxMDsKLQkJaW92ID0gWE1BTExPQyhNVFlQRV9UTVAsIGlvdl9hbGxvYyAqIHNpemVvZigqaW92KSk7Ci0JfQotCWlvdl9pbmRleCA9IDA7Ci0KLQkvKiBQcmV2aW91c2x5IHByaW50IG91dCBpcyBwZXJmb3JtZWQuICovCi0JaWYgKGVyYXNlX2ZsYWcpIHsKLQkJaW92W2lvdl9pbmRleF0uaW92X2Jhc2UgPSBlcmFzZTsKLQkJaW92W2lvdl9pbmRleF0uaW92X2xlbiA9IHNpemVvZiBlcmFzZTsKLQkJaW92X2luZGV4Kys7Ci0JfQotCi0JLyogT3V0cHV0IGRhdGEuICovCi0JY29sdW1uID0gMTsJCS8qIENvbHVtbiBwb3NpdGlvbiBvZiBuZXh0IGNoYXJhY3RlciBkaXNwbGF5ZWQuICovCi0JZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YSAmJiAoaGVpZ2h0ID4gMCk7IGRhdGEgPSBkYXRhLT5uZXh0KSB7Ci0JCXNpemVfdCBjcDsKLQotCQljcCA9IGRhdGEtPnNwOwotCQl3aGlsZSAoKGNwIDwgZGF0YS0+Y3ApICYmIChoZWlnaHQgPiAwKSkgewotCQkJLyogQ2FsY3VsYXRlIGxpbmVzIHJlbWFpbmluZyBhbmQgY29sdW1uIHBvc2l0aW9uIGFmdGVyIGRpc3BsYXlpbmcKLQkJCSAgIHRoaXMgY2hhcmFjdGVyLiAqLwotCQkJaWYgKGRhdGEtPmRhdGFbY3BdID09ICdccicpCi0JCQkJY29sdW1uID0gMTsKLQkJCWVsc2UgaWYgKChkYXRhLT5kYXRhW2NwXSA9PSAnXG4nKSB8fCAoY29sdW1uID09IHdpZHRoKSkgewotCQkJCWNvbHVtbiA9IDE7Ci0JCQkJaGVpZ2h0LS07Ci0JCQl9IGVsc2UKLQkJCQljb2x1bW4rKzsKLQkJCWNwKys7Ci0JCX0KLQkJaW92W2lvdl9pbmRleF0uaW92X2Jhc2UgPSAoY2hhciAqKShkYXRhLT5kYXRhICsgZGF0YS0+c3ApOwotCQlpb3ZbaW92X2luZGV4KytdLmlvdl9sZW4gPSBjcCAtIGRhdGEtPnNwOwotCQlkYXRhLT5zcCA9IGNwOwotCi0JCWlmIChpb3ZfaW5kZXggPT0gaW92X2FsbG9jKQotCQkJLyogVGhpcyBzaG91bGQgbm90IG9yZGluYXJpbHkgaGFwcGVuLiAqLwotCQl7Ci0JCQlpb3ZfYWxsb2MgKj0gMjsKLQkJCWlmIChpb3YgIT0gc21hbGxfaW92KSB7Ci0JCQkJemxvZ193YXJuKCIlczogZ3Jvd2luZyBpb3YgYXJyYXkgdG8gJWQ7ICIKLQkJCQkJICAid2lkdGggJWQsIGhlaWdodCAlZCwgc2l6ZSAlbHUiLAotCQkJCQkgIF9fZnVuY19fLCBpb3ZfYWxsb2MsIHdpZHRoLCBoZWlnaHQsCi0JCQkJCSAgKHVfbG9uZykgYi0+c2l6ZSk7Ci0JCQkJaW92ID0KLQkJCQkgICAgWFJFQUxMT0MoTVRZUEVfVE1QLCBpb3YsCi0JCQkJCSAgICAgaW92X2FsbG9jICogc2l6ZW9mKCppb3YpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogVGhpcyBzaG91bGQgYWJzb2x1dGVseSBuZXZlciBvY2N1ci4gKi8KLQkJCQl6bG9nX2VycgotCQkJCSAgICAoIiVzOiBjb3JydXB0aW9uIGRldGVjdGVkOiBpb3Zfc21hbGwgb3ZlcmZsb3dlZDsgIgotCQkJCSAgICAgImhlYWQgJXAsIHRhaWwgJXAsIGhlYWQtPm5leHQgJXAiLAotCQkJCSAgICAgX19mdW5jX18sIGItPmhlYWQsIGItPnRhaWwsIGItPmhlYWQtPm5leHQpOwotCQkJCWlvdiA9Ci0JCQkJICAgIFhNQUxMT0MoTVRZUEVfVE1QLAotCQkJCQkgICAgaW92X2FsbG9jICogc2l6ZW9mKCppb3YpKTsKLQkJCQltZW1jcHkoaW92LCBzbWFsbF9pb3YsIHNpemVvZihzbWFsbF9pb3YpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEluIGNhc2Ugb2YgYG1vcmUnIGRpc3BsYXkgbmVlZC4gKi8KLQlpZiAoYi0+dGFpbCAmJiAoYi0+dGFpbC0+c3AgPCBiLT50YWlsLT5jcCkgJiYgIW5vX21vcmVfZmxhZykgewotCQlpb3ZbaW92X2luZGV4XS5pb3ZfYmFzZSA9IG1vcmU7Ci0JCWlvdltpb3ZfaW5kZXhdLmlvdl9sZW4gPSBzaXplb2YgbW9yZTsKLQkJaW92X2luZGV4Kys7Ci0JfQotI2lmZGVmIElPVl9NQVgKLQkvKiBJT1ZfTUFYIGFyZSBub3JtYWxseSBkZWZpbmVkIGluIDxzeXMvdWlvLmg+ICwgUG9zaXguMWcuCi0JICAgZXhhbXBsZTogU29sYXJpczIuNiBhcmUgZGVmaW5lZCBJT1ZfTUFYIHNpemUgYXQgMTYuICAgICAqLwotCXsKLQkJc3RydWN0IGlvdmVjICpjX2lvdiA9IGlvdjsKLQkJbmJ5dGVzID0gMDsJLyogTWFrZSBzdXJlIGl0J3MgaW5pdGlhbGl6ZWQuICovCi0KLQkJd2hpbGUgKGlvdl9pbmRleCA+IDApIHsKLQkJCWludCBpb3Zfc2l6ZTsKLQotCQkJaW92X3NpemUgPQotCQkJICAgICgoaW92X2luZGV4ID4gSU9WX01BWCkgPyBJT1ZfTUFYIDogaW92X2luZGV4KTsKLQkJCWlmICgobmJ5dGVzID0gd3JpdGV2KGZkLCBjX2lvdiwgaW92X3NpemUpKSA8IDApIHsKLQkJCQl6bG9nX3dhcm4oIiVzOiB3cml0ZXYgdG8gZmQgJWQgZmFpbGVkOiAlcyIsCi0JCQkJCSAgX19mdW5jX18sIGZkLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIG1vdmUgcG9pbnRlciBpby12ZWN0b3IgKi8KLQkJCWNfaW92ICs9IGlvdl9zaXplOwotCQkJaW92X2luZGV4IC09IGlvdl9zaXplOwotCQl9Ci0JfQotI2Vsc2UJCQkJLyogSU9WX01BWCAqLwotCWlmICgobmJ5dGVzID0gd3JpdGV2KGZkLCBpb3YsIGlvdl9pbmRleCkpIDwgMCkKLQkJemxvZ193YXJuKCIlczogd3JpdGV2IHRvIGZkICVkIGZhaWxlZDogJXMiLAotCQkJICBfX2Z1bmNfXywgZmQsIHNhZmVfc3RyZXJyb3IoZXJybm8pKTsKLSNlbmRpZgkJCQkvKiBJT1ZfTUFYICovCi0KLQkvKiBGcmVlIHByaW50ZWQgYnVmZmVyIGRhdGEuICovCi0Jd2hpbGUgKGItPmhlYWQgJiYgKGItPmhlYWQtPnNwID09IGItPmhlYWQtPmNwKSkgewotCQlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRlbDsKLQkJaWYgKCEoYi0+aGVhZCA9IChkZWwgPSBiLT5oZWFkKS0+bmV4dCkpCi0JCQliLT50YWlsID0gTlVMTDsKLQkJQlVGRkVSX0RBVEFfRlJFRShkZWwpOwotCX0KLQotCWlmIChpb3YgIT0gc21hbGxfaW92KQotCQlYRlJFRShNVFlQRV9UTVAsIGlvdik7Ci0KLQlyZXR1cm4gKG5ieXRlcyA8IDApID8gQlVGRkVSX0VSUk9SIDoKLQkgICAgKGItPmhlYWQgPyBCVUZGRVJfUEVORElORyA6IEJVRkZFUl9FTVBUWSk7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiAodW5saWtlIG90aGVyIGJ1ZmZlcl9mbHVzaCogZnVuY3Rpb25zIGFib3ZlKSBpcyBkZXNpZ25lZAotdG8gd29yayB3aXRoIG5vbi1ibG9ja2luZyBzb2NrZXRzLiAgSXQgZG9lcyBub3QgYXR0ZW1wdCB0byB3cml0ZSBvdXQKLWFsbCBvZiB0aGUgcXVldWVkIGRhdGEsIGp1c3QgYSAiYmlnIiBjaHVuay4gIEl0IHJldHVybnMgMCBpZiBpdCB3YXMKLWFibGUgdG8gZW1wdHkgb3V0IHRoZSBidWZmZXJzIGNvbXBsZXRlbHksIDEgaWYgbW9yZSBmbHVzaGluZyBpcwotcmVxdWlyZWQgbGF0ZXIsIG9yIC0xIG9uIGEgZmF0YWwgd3JpdGUgZXJyb3IuICovCi1idWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZShzdHJ1Y3QgYnVmZmVyICogYiwgaW50IGZkKQotewotCi0vKiBUaGVzZSBhcmUganVzdCByZWFzb25hYmxlIHZhbHVlcyB0byBtYWtlIHN1cmUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YKLWRhdGEgaXMgd3JpdHRlbi4gIFRoZXJlJ3Mgbm8gbmVlZCB0byBnbyBjcmF6eSBhbmQgdHJ5IHRvIHdyaXRlIGl0IGFsbAotaW4gb25lIHNob3QuICovCi0jaWZkZWYgSU9WX01BWAotI2RlZmluZSBNQVhfQ0hVTktTICgoSU9WX01BWCA+PSAxNikgPyAxNiA6IElPVl9NQVgpCi0jZWxzZQotI2RlZmluZSBNQVhfQ0hVTktTIDE2Ci0jZW5kaWYKLSNkZWZpbmUgTUFYX0ZMVVNIIDEzMTA3MgotCi0Jc3RydWN0IGJ1ZmZlcl9kYXRhICpkOwotCXNpemVfdCB3cml0dGVuOwotCXN0cnVjdCBpb3ZlYyBpb3ZbTUFYX0NIVU5LU107Ci0Jc2l6ZV90IGlvdmNudCA9IDA7Ci0Jc2l6ZV90IG5ieXRlID0gMDsKLQotCWZvciAoZCA9IGItPmhlYWQ7IGQgJiYgKGlvdmNudCA8IE1BWF9DSFVOS1MpICYmIChuYnl0ZSA8IE1BWF9GTFVTSCk7Ci0JICAgICBkID0gZC0+bmV4dCwgaW92Y250KyspIHsKLQkJaW92W2lvdmNudF0uaW92X2Jhc2UgPSBkLT5kYXRhICsgZC0+c3A7Ci0JCW5ieXRlICs9IChpb3ZbaW92Y250XS5pb3ZfbGVuID0gZC0+Y3AgLSBkLT5zcCk7Ci0JfQotCi0JaWYgKCFuYnl0ZSkKLQkJLyogTm8gZGF0YSB0byBmbHVzaDogc2hvdWxkIHdlIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlPyAqLwotCQlyZXR1cm4gQlVGRkVSX0VNUFRZOwotCi0JLyogb25seSBwbGFjZSB3aGVyZSB3cml0dGVuIHNob3VsZCBiZSBzaWduIGNvbXBhcmVkICovCi0JaWYgKChzc2l6ZV90KSAod3JpdHRlbiA9IHdyaXRldihmZCwgaW92LCBpb3ZjbnQpKSA8IDApIHsKLQkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkKLQkJCS8qIENhbGxpbmcgY29kZSBzaG91bGQgdHJ5IGFnYWluIGxhdGVyLiAqLwotCQkJcmV0dXJuIEJVRkZFUl9QRU5ESU5HOwotCQlyZXR1cm4gQlVGRkVSX0VSUk9SOwotCX0KLQotCS8qIEZyZWUgcHJpbnRlZCBidWZmZXIgZGF0YS4gKi8KLQl3aGlsZSAod3JpdHRlbiA+IDApIHsKLQkJc3RydWN0IGJ1ZmZlcl9kYXRhICpkOwotCQlpZiAoIShkID0gYi0+aGVhZCkpCi0JCQlicmVhazsKLQkJaWYgKHdyaXR0ZW4gPCBkLT5jcCAtIGQtPnNwKSB7Ci0JCQlkLT5zcCArPSB3cml0dGVuOwotCQkJcmV0dXJuIEJVRkZFUl9QRU5ESU5HOwotCQl9Ci0KLQkJd3JpdHRlbiAtPSAoZC0+Y3AgLSBkLT5zcCk7Ci0JCWlmICghKGItPmhlYWQgPSBkLT5uZXh0KSkKLQkJCWItPnRhaWwgPSBOVUxMOwotCQlCVUZGRVJfREFUQV9GUkVFKGQpOwotCX0KLQotCXJldHVybiBiLT5oZWFkID8gQlVGRkVSX1BFTkRJTkcgOiBCVUZGRVJfRU1QVFk7Ci0KLSN1bmRlZiBNQVhfQ0hVTktTCi0jdW5kZWYgTUFYX0ZMVVNICi19Ci0KLWJ1ZmZlcl9zdGF0dXNfdAotYnVmZmVyX3dyaXRlKHN0cnVjdCBidWZmZXIgKiBiLCBpbnQgZmQsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplKQotewotCXNzaXplX3QgbmJ5dGVzOwotCi0jaWYgMAotCS8qIFNob3VsZCB3ZSBhdHRlbXB0IHRvIGRyYWluIGFueSBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGE/ICBUaGlzIGNvdWxkIGhlbHAgcmVkdWNlIGxhdGVuY3kgaW4gcHVzaGluZyBvdXQgdGhlIGRhdGEgaWYgd2UgYXJlIHN0dWNrIGluIGEgbG9uZy1ydW5uaW5nIHRocmVhZCB0aGF0IGlzIHByZXZlbnRpbmcgdGhlIG1haW4gc2VsZWN0IGxvb3AgZnJvbSBjYWxsaW5nIHRoZSBmbHVzaCB0aHJlYWQuLi4gKi8KLQotCWlmIChiLT5oZWFkICYmIChidWZmZXJfZmx1c2hfYXZhaWxhYmxlKGIsIGZkKSA9PSBCVUZGRVJfRVJST1IpKQotCQlyZXR1cm4gQlVGRkVSX0VSUk9SOwotI2VuZGlmCi0JaWYgKGItPmhlYWQpCi0JCS8qIEJ1ZmZlciBpcyBub3QgZW1wdHksIHNvIGRvIG5vdCBhdHRlbXB0IHRvIHdyaXRlIHRoZSBuZXcgZGF0YS4gKi8KLQkJbmJ5dGVzID0gMDsKLQllbHNlIGlmICgobmJ5dGVzID0gd3JpdGUoZmQsIHAsIHNpemUpKSA8IDApIHsKLQkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkKLQkJCW5ieXRlcyA9IDA7Ci0JCWVsc2UKLQkJCXJldHVybiBCVUZGRVJfRVJST1I7Ci0JfQotCS8qIEFkZCBhbnkgcmVtYWluaW5nIGRhdGEgdG8gdGhlIGJ1ZmZlci4gKi8KLQl7Ci0JCXNpemVfdCB3cml0dGVuID0gbmJ5dGVzOwotCQlpZiAod3JpdHRlbiA8IHNpemUpCi0JCQlidWZmZXJfcHV0KGIsICgoY29uc3QgY2hhciAqKXApICsgd3JpdHRlbiwKLQkJCQkgICBzaXplIC0gd3JpdHRlbik7Ci0JfQotCXJldHVybiBiLT5oZWFkID8gQlVGRkVSX1BFTkRJTkcgOiBCVUZGRVJfRU1QVFk7Ci19CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvY2FyZHNoZWxsLmggYi9vcGVuYnNjL3NyYy92dHkvY2FyZHNoZWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MTY0ZDIuLjAwMDAwMDAKLS0tIGEvb3BlbmJzYy9zcmMvdnR5L2NhcmRzaGVsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaW5jbHVkZSAiLi4vLi4vYnNjY29uZmlnLmgiCi0jZGVmaW5lIFFVQUdHQV9QUk9HTkFNRQlQQUNLQUdFX05BTUUKLSNkZWZpbmUgUVVBR0dBX1ZFUlNJT04JUEFDS0FHRV9WRVJTSU9OCi0jZGVmaW5lIFFVQUdHQV9DT1BZUklHSFQgIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+IgotI2RlZmluZSBDT05GSUdGSUxFX01BU0sgMDIyCi0jZGVmaW5lIFNZU0NPTkZESVIgIi91c3IvbG9jYWwvZXRjIgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYyBiL29wZW5ic2Mvc3JjL3Z0eS9jb21tYW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYWVkMzUuLjAwMDAwMDAKLS0tIGEvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MTEgKzAsMCBAQAotLyoKLSAgICRJZDogY29tbWFuZC5jLHYgMS40NyAyMDA1LzA0LzI1IDE2OjI2OjQyIHBhdWwgRXhwICQKLQotICAgQ29tbWFuZCBpbnRlcnByZXRlciByb3V0aW5lIGZvciB2aXJ0dWFsIHRlcm1pbmFsIFtha2EgVGVsZXRZcGVdCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDk4LCA5OSBLdW5paGlybyBJc2hpZ3VybwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCi0KLUdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKLW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJjYXJkc2hlbGwuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzbG9nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNkZWZpbmUgX1hPUEVOX1NPVVJDRQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotLy8jaW5jbHVkZSAibWVtb3J5LmgiCi0vLyNpbmNsdWRlICJsb2cuaCIKLS8vI2luY2x1ZGUgPGxpYi92ZXJzaW9uLmg+Ci0vLyNpbmNsdWRlICJ0aHJlYWQuaCIKLSNpbmNsdWRlIDx2dHkvdmVjdG9yLmg+Ci0jaW5jbHVkZSA8dnR5L3Z0eS5oPgotI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+Ci0vLyNpbmNsdWRlICJ3b3JrcXVldWUuaCIKLQotI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KLSNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+Ci0KLXZvaWQgKnRhbGxfdnR5X2NtZF9jdHg7Ci0KLS8qIENvbW1hbmQgdmVjdG9yIHdoaWNoIGluY2x1ZGVzIHNvbWUgbGV2ZWwgb2YgY29tbWFuZCBsaXN0cy4gTm9ybWFsbHkKLSAgIGVhY2ggZGFlbW9uIG1haW50YWlucyBlYWNoIG93biBjbWR2ZWMuICovCi12ZWN0b3IgY21kdmVjOwotCi0vKiBIb3N0IGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gKi8KLXN0cnVjdCBob3N0IGhvc3Q7Ci0KLS8qIFN0YW5kYXJkIGNvbW1hbmQgbm9kZSBzdHJ1Y3R1cmVzLiAqLwotc3RydWN0IGNtZF9ub2RlIGF1dGhfbm9kZSA9IHsKLQlBVVRIX05PREUsCi0JIlBhc3N3b3JkOiAiLAotfTsKLQotc3RydWN0IGNtZF9ub2RlIHZpZXdfbm9kZSA9IHsKLQlWSUVXX05PREUsCi0JIiVzPiAiLAotfTsKLQotc3RydWN0IGNtZF9ub2RlIGF1dGhfZW5hYmxlX25vZGUgPSB7Ci0JQVVUSF9FTkFCTEVfTk9ERSwKLQkiUGFzc3dvcmQ6ICIsCi19OwotCi1zdHJ1Y3QgY21kX25vZGUgZW5hYmxlX25vZGUgPSB7Ci0JRU5BQkxFX05PREUsCi0JIiVzIyAiLAotfTsKLQotc3RydWN0IGNtZF9ub2RlIGNvbmZpZ19ub2RlID0gewotCUNPTkZJR19OT0RFLAotCSIlcyhjb25maWcpIyAiLAotCTEKLX07Ci0KLS8qIERlZmF1bHQgbW90ZCBzdHJpbmcuICovCi1jb25zdCBjaGFyICpkZWZhdWx0X21vdGQgPSAiXHJcblwKLUhlbGxvLCB0aGlzIGlzICIgUVVBR0dBX1BST0dOQU1FICIgKHZlcnNpb24gIiBRVUFHR0FfVkVSU0lPTiAiKS5cclxuXAotIiBRVUFHR0FfQ09QWVJJR0hUICJcclxuXAotXHJcbiI7Ci0KLSNpZiAwCi1zdGF0aWMgc3RydWN0IGZhY2lsaXR5X21hcCB7Ci0JaW50IGZhY2lsaXR5OwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc2l6ZV90IG1hdGNoOwotfSBzeXNsb2dfZmFjaWxpdGllc1tdID0gewotCXsKLQlMT0dfS0VSTiwgImtlcm4iLCAxfSwgewotCUxPR19VU0VSLCAidXNlciIsIDJ9LCB7Ci0JTE9HX01BSUwsICJtYWlsIiwgMX0sIHsKLQlMT0dfREFFTU9OLCAiZGFlbW9uIiwgMX0sIHsKLQlMT0dfQVVUSCwgImF1dGgiLCAxfSwgewotCUxPR19TWVNMT0csICJzeXNsb2ciLCAxfSwgewotCUxPR19MUFIsICJscHIiLCAyfSwgewotCUxPR19ORVdTLCAibmV3cyIsIDF9LCB7Ci0JTE9HX1VVQ1AsICJ1dWNwIiwgMn0sIHsKLQlMT0dfQ1JPTiwgImNyb24iLCAxfSwKLSNpZmRlZiBMT0dfRlRQCi0JewotCUxPR19GVFAsICJmdHAiLCAxfSwKLSNlbmRpZgotCXsKLQlMT0dfTE9DQUwwLCAibG9jYWwwIiwgNn0sIHsKLQlMT0dfTE9DQUwxLCAibG9jYWwxIiwgNn0sIHsKLQlMT0dfTE9DQUwyLCAibG9jYWwyIiwgNn0sIHsKLQlMT0dfTE9DQUwzLCAibG9jYWwzIiwgNn0sIHsKLQlMT0dfTE9DQUw0LCAibG9jYWw0IiwgNn0sIHsKLQlMT0dfTE9DQUw1LCAibG9jYWw1IiwgNn0sIHsKLQlMT0dfTE9DQUw2LCAibG9jYWw2IiwgNn0sIHsKLQlMT0dfTE9DQUw3LCAibG9jYWw3IiwgNn0sIHsKLTAsIE5VTEwsIDB9LH07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpmYWNpbGl0eV9uYW1lKGludCBmYWNpbGl0eSkKLXsKLQlzdHJ1Y3QgZmFjaWxpdHlfbWFwICpmbTsKLQotCWZvciAoZm0gPSBzeXNsb2dfZmFjaWxpdGllczsgZm0tPm5hbWU7IGZtKyspCi0JCWlmIChmbS0+ZmFjaWxpdHkgPT0gZmFjaWxpdHkpCi0JCQlyZXR1cm4gZm0tPm5hbWU7Ci0JcmV0dXJuICIiOwotfQotCi1zdGF0aWMgaW50IGZhY2lsaXR5X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKLXsKLQlzdHJ1Y3QgZmFjaWxpdHlfbWFwICpmbTsKLQotCWZvciAoZm0gPSBzeXNsb2dfZmFjaWxpdGllczsgZm0tPm5hbWU7IGZtKyspCi0JCWlmICghc3RybmNtcChzdHIsIGZtLT5uYW1lLCBmbS0+bWF0Y2gpKQotCQkJcmV0dXJuIGZtLT5mYWNpbGl0eTsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgbGV2ZWxfbWF0Y2goY29uc3QgY2hhciAqcykKLXsKLQlpbnQgbGV2ZWw7Ci0KLQlmb3IgKGxldmVsID0gMDsgemxvZ19wcmlvcml0eVtsZXZlbF0gIT0gTlVMTDsgbGV2ZWwrKykKLQkJaWYgKCFzdHJuY21wKHMsIHpsb2dfcHJpb3JpdHlbbGV2ZWxdLCAyKSkKLQkJCXJldHVybiBsZXZlbDsKLQlyZXR1cm4gWkxPR19ESVNBQkxFRDsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGlzIGNhbGxlZCBmcm9tIG1haW4gd2hlbiBhIGRhZW1vbiBpcyBpbnZva2VkIHdpdGggLXYgb3IgLS12ZXJzaW9uLiAqLwotdm9pZCBwcmludF92ZXJzaW9uKGNvbnN0IGNoYXIgKnByb2duYW1lKQotewotCXByaW50ZigiJXMgdmVyc2lvbiAlc1xuIiwgcHJvZ25hbWUsIFFVQUdHQV9WRVJTSU9OKTsKLQlwcmludGYoIiVzXG4iLCBRVUFHR0FfQ09QWVJJR0hUKTsKLX0KLQwKLS8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29uY2F0ZW5hdGUgYXJndiBhcmd1bWVudCBpbnRvIGEgc2luZ2xlIHN0cmluZwotICAgd2l0aCBpbnNlcnRpbmcgJyAnIGNoYXJhY3RlciBiZXR3ZWVuIGVhY2ggYXJndW1lbnQuICAqLwotY2hhciAqYXJndl9jb25jYXQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgc2hpZnQpCi17Ci0JaW50IGk7Ci0Jc2l6ZV90IGxlbjsKLQljaGFyICpzdHI7Ci0JY2hhciAqcDsKLQotCWxlbiA9IDA7Ci0JZm9yIChpID0gc2hpZnQ7IGkgPCBhcmdjOyBpKyspCi0JCWxlbiArPSBzdHJsZW4oYXJndltpXSkgKyAxOwotCWlmICghbGVuKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gc3RyID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIGxlbiwgImFydmdfY29uY2F0Iik7Ci0JZm9yIChpID0gc2hpZnQ7IGkgPCBhcmdjOyBpKyspIHsKLQkJc2l6ZV90IGFyZ2xlbjsKLQkJbWVtY3B5KHAsIGFyZ3ZbaV0sIChhcmdsZW4gPSBzdHJsZW4oYXJndltpXSkpKTsKLQkJcCArPSBhcmdsZW47Ci0JCSpwKysgPSAnICc7Ci0JfQotCSoocCAtIDEpID0gJ1wwJzsKLQlyZXR1cm4gc3RyOwotfQotCi0vKiBJbnN0YWxsIHRvcCBub2RlIG9mIGNvbW1hbmQgdmVjdG9yLiAqLwotdm9pZCBpbnN0YWxsX25vZGUoc3RydWN0IGNtZF9ub2RlICpub2RlLCBpbnQgKCpmdW5jKSAoc3RydWN0IHZ0eSAqKSkKLXsKLQl2ZWN0b3Jfc2V0X2luZGV4KGNtZHZlYywgbm9kZS0+bm9kZSwgbm9kZSk7Ci0Jbm9kZS0+ZnVuYyA9IGZ1bmM7Ci0Jbm9kZS0+Y21kX3ZlY3RvciA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7Ci19Ci0KLS8qIENvbXBhcmUgdHdvIGNvbW1hbmQncyBzdHJpbmcuICBVc2VkIGluIHNvcnRfbm9kZSAoKS4gKi8KLXN0YXRpYyBpbnQgY21wX25vZGUoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqcSkKLXsKLQlzdHJ1Y3QgY21kX2VsZW1lbnQgKmEgPSAqKHN0cnVjdCBjbWRfZWxlbWVudCAqKilwOwotCXN0cnVjdCBjbWRfZWxlbWVudCAqYiA9ICooc3RydWN0IGNtZF9lbGVtZW50ICoqKXE7Ci0KLQlyZXR1cm4gc3RyY21wKGEtPnN0cmluZywgYi0+c3RyaW5nKTsKLX0KLQotc3RhdGljIGludCBjbXBfZGVzYyhjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICpxKQotewotCXN0cnVjdCBkZXNjICphID0gKihzdHJ1Y3QgZGVzYyAqKilwOwotCXN0cnVjdCBkZXNjICpiID0gKihzdHJ1Y3QgZGVzYyAqKilxOwotCi0JcmV0dXJuIHN0cmNtcChhLT5jbWQsIGItPmNtZCk7Ci19Ci0KLS8qIFNvcnQgZWFjaCBub2RlJ3MgY29tbWFuZCBlbGVtZW50IGFjY29yZGluZyB0byBjb21tYW5kIHN0cmluZy4gKi8KLXZvaWQgc29ydF9ub2RlKCkKLXsKLQl1bnNpZ25lZCBpbnQgaSwgajsKLQlzdHJ1Y3QgY21kX25vZGUgKmNub2RlOwotCXZlY3RvciBkZXNjdmVjOwotCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCi0JCWlmICgoY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAhPSBOVUxMKSB7Ci0JCQl2ZWN0b3IgY21kX3ZlY3RvciA9IGNub2RlLT5jbWRfdmVjdG9yOwotCQkJcXNvcnQoY21kX3ZlY3Rvci0+aW5kZXgsIHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3RvciksCi0JCQkgICAgICBzaXplb2Yodm9pZCAqKSwgY21wX25vZGUpOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaisrKQotCQkJCWlmICgoY21kX2VsZW1lbnQgPQotCQkJCSAgICAgdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaikpICE9IE5VTEwKLQkJCQkgICAgJiYgdmVjdG9yX2FjdGl2ZShjbWRfZWxlbWVudC0+c3RydmVjKSkgewotCQkJCQlkZXNjdmVjID0KLQkJCQkJICAgIHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT5zdHJ2ZWMsCi0JCQkJCQkJdmVjdG9yX2FjdGl2ZQotCQkJCQkJCShjbWRfZWxlbWVudC0+c3RydmVjKSAtCi0JCQkJCQkJMSk7Ci0JCQkJCXFzb3J0KGRlc2N2ZWMtPmluZGV4LAotCQkJCQkgICAgICB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpLAotCQkJCQkgICAgICBzaXplb2Yodm9pZCAqKSwgY21wX2Rlc2MpOwotCQkJCX0KLQkJfQotfQotCi0vKiBCcmVha2luZyB1cCBzdHJpbmcgaW50byBlYWNoIGNvbW1hbmQgcGllY2UuIEkgYXNzdW1lIGdpdmVuCi0gICBjaGFyYWN0ZXIgaXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyLiBSZXR1cm4gdmFsdWUgaXMgYQotICAgdmVjdG9yIHdoaWNoIGluY2x1ZGVzIGNoYXIgKiogZGF0YSBlbGVtZW50LiAqLwotdmVjdG9yIGNtZF9tYWtlX3N0cnZlYyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0JY29uc3QgY2hhciAqY3AsICpzdGFydDsKLQljaGFyICp0b2tlbjsKLQlpbnQgc3RybGVuOwotCXZlY3RvciBzdHJ2ZWM7Ci0KLQlpZiAoc3RyaW5nID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JY3AgPSBzdHJpbmc7Ci0KLQkvKiBTa2lwIHdoaXRlIHNwYWNlcy4gKi8KLQl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCi0JCWNwKys7Ci0KLQkvKiBSZXR1cm4gaWYgdGhlcmUgaXMgb25seSB3aGl0ZSBzcGFjZXMgKi8KLQlpZiAoKmNwID09ICdcMCcpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCpjcCA9PSAnIScgfHwgKmNwID09ICcjJykKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBQcmVwYXJlIHJldHVybiB2ZWN0b3IuICovCi0Jc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKLQotCS8qIENvcHkgZWFjaCBjb21tYW5kIHBpZWNlIGFuZCBzZXQgaW50byB2ZWN0b3IuICovCi0Jd2hpbGUgKDEpIHsKLQkJc3RhcnQgPSBjcDsKLQkJd2hpbGUgKCEoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdccicgfHwgKmNwID09ICdcbicpICYmCi0JCSAgICAgICAqY3AgIT0gJ1wwJykKLQkJCWNwKys7Ci0JCXN0cmxlbiA9IGNwIC0gc3RhcnQ7Ci0JCXRva2VuID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmxlbiArIDEsICJtYWtlX3N0cnZlYyIpOwotCQltZW1jcHkodG9rZW4sIHN0YXJ0LCBzdHJsZW4pOwotCQkqKHRva2VuICsgc3RybGVuKSA9ICdcMCc7Ci0JCXZlY3Rvcl9zZXQoc3RydmVjLCB0b2tlbik7Ci0KLQkJd2hpbGUgKChpc3NwYWNlKChpbnQpKmNwKSB8fCAqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJ1xyJykgJiYKLQkJICAgICAgICpjcCAhPSAnXDAnKQotCQkJY3ArKzsKLQotCQlpZiAoKmNwID09ICdcMCcpCi0JCQlyZXR1cm4gc3RydmVjOwotCX0KLX0KLQotLyogRnJlZSBhbGxvY2F0ZWQgc3RyaW5nIHZlY3Rvci4gKi8KLXZvaWQgY21kX2ZyZWVfc3RydmVjKHZlY3RvciB2KQotewotCXVuc2lnbmVkIGludCBpOwotCWNoYXIgKmNwOwotCi0JaWYgKCF2KQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQotCQlpZiAoKGNwID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpCi0JCQl0YWxsb2NfZnJlZShjcCk7Ci0KLQl2ZWN0b3JfZnJlZSh2KTsKLX0KLQotLyogRmV0Y2ggbmV4dCBkZXNjcmlwdGlvbi4gIFVzZWQgaW4gY21kX21ha2VfZGVzY3ZlYygpLiAqLwotc3RhdGljIGNoYXIgKmNtZF9kZXNjX3N0cihjb25zdCBjaGFyICoqc3RyaW5nKQotewotCWNvbnN0IGNoYXIgKmNwLCAqc3RhcnQ7Ci0JY2hhciAqdG9rZW47Ci0JaW50IHN0cmxlbjsKLQotCWNwID0gKnN0cmluZzsKLQotCWlmIChjcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIFNraXAgd2hpdGUgc3BhY2VzLiAqLwotCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKLQkJY3ArKzsKLQotCS8qIFJldHVybiBpZiB0aGVyZSBpcyBvbmx5IHdoaXRlIHNwYWNlcyAqLwotCWlmICgqY3AgPT0gJ1wwJykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzdGFydCA9IGNwOwotCi0Jd2hpbGUgKCEoKmNwID09ICdccicgfHwgKmNwID09ICdcbicpICYmICpjcCAhPSAnXDAnKQotCQljcCsrOwotCi0Jc3RybGVuID0gY3AgLSBzdGFydDsKLQl0b2tlbiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJsZW4gKyAxLCAiY21kX2Rlc2Nfc3RyIik7Ci0JbWVtY3B5KHRva2VuLCBzdGFydCwgc3RybGVuKTsKLQkqKHRva2VuICsgc3RybGVuKSA9ICdcMCc7Ci0KLQkqc3RyaW5nID0gY3A7Ci0KLQlyZXR1cm4gdG9rZW47Ci19Ci0KLS8qIE5ldyBzdHJpbmcgdmVjdG9yLiAqLwotc3RhdGljIHZlY3RvciBjbWRfbWFrZV9kZXNjdmVjKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZGVzY3N0cikKLXsKLQlpbnQgbXVsdGlwbGUgPSAwOwotCWNvbnN0IGNoYXIgKnNwOwotCWNoYXIgKnRva2VuOwotCWludCBsZW47Ci0JY29uc3QgY2hhciAqY3A7Ci0JY29uc3QgY2hhciAqZHA7Ci0JdmVjdG9yIGFsbHZlYzsKLQl2ZWN0b3Igc3RydmVjID0gTlVMTDsKLQlzdHJ1Y3QgZGVzYyAqZGVzYzsKLQotCWNwID0gc3RyaW5nOwotCWRwID0gZGVzY3N0cjsKLQotCWlmIChjcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWFsbHZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7Ci0KLQl3aGlsZSAoMSkgewotCQl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCi0JCQljcCsrOwotCi0JCWlmICgqY3AgPT0gJygnKSB7Ci0JCQltdWx0aXBsZSA9IDE7Ci0JCQljcCsrOwotCQl9Ci0JCWlmICgqY3AgPT0gJyknKSB7Ci0JCQltdWx0aXBsZSA9IDA7Ci0JCQljcCsrOwotCQl9Ci0JCWlmICgqY3AgPT0gJ3wnKSB7Ci0JCQlpZiAoIW11bHRpcGxlKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIHBhcnNlIGVycm9yITogJXNcbiIsCi0JCQkJCXN0cmluZyk7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCWNwKys7Ci0JCX0KLQotCQl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCi0JCQljcCsrOwotCi0JCWlmICgqY3AgPT0gJygnKSB7Ci0JCQltdWx0aXBsZSA9IDE7Ci0JCQljcCsrOwotCQl9Ci0KLQkJaWYgKCpjcCA9PSAnXDAnKQotCQkJcmV0dXJuIGFsbHZlYzsKLQotCQlzcCA9IGNwOwotCi0JCXdoaWxlICghCi0JCSAgICAgICAoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdccicgfHwgKmNwID09ICdcbicKLQkJCXx8ICpjcCA9PSAnKScgfHwgKmNwID09ICd8JykgJiYgKmNwICE9ICdcMCcpCi0JCQljcCsrOwotCi0JCWxlbiA9IGNwIC0gc3A7Ci0KLQkJdG9rZW4gPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgbGVuICsgMSwgImNtZF9tYWtlX2Rlc2N2ZWMiKTsKLQkJbWVtY3B5KHRva2VuLCBzcCwgbGVuKTsKLQkJKih0b2tlbiArIGxlbikgPSAnXDAnOwotCi0JCWRlc2MgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJ1Y3QgZGVzYyk7Ci0JCWRlc2MtPmNtZCA9IHRva2VuOwotCQlkZXNjLT5zdHIgPSBjbWRfZGVzY19zdHIoJmRwKTsKLQotCQlpZiAobXVsdGlwbGUpIHsKLQkJCWlmIChtdWx0aXBsZSA9PSAxKSB7Ci0JCQkJc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKLQkJCQl2ZWN0b3Jfc2V0KGFsbHZlYywgc3RydmVjKTsKLQkJCX0KLQkJCW11bHRpcGxlKys7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOwotCQkJdmVjdG9yX3NldChhbGx2ZWMsIHN0cnZlYyk7Ci0JCX0KLQkJdmVjdG9yX3NldChzdHJ2ZWMsIGRlc2MpOwotCX0KLX0KLQotLyogQ291bnQgbWFuZGFudG9yeSBzdHJpbmcgdmVjdG9yIHNpemUuICBUaGlzIGlzIHRvIGRldGVybWluZSBpbnB1dGVkCi0gICBjb21tYW5kIGhhcyBlbm91Z2ggY29tbWFuZCBsZW5ndGguICovCi1zdGF0aWMgaW50IGNtZF9jbWRzaXplKHZlY3RvciBzdHJ2ZWMpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JaW50IHNpemUgPSAwOwotCXZlY3RvciBkZXNjdmVjOwotCXN0cnVjdCBkZXNjICpkZXNjOwotCi0JZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoc3RydmVjKTsgaSsrKQotCQlpZiAoKGRlc2N2ZWMgPSB2ZWN0b3Jfc2xvdChzdHJ2ZWMsIGkpKSAhPSBOVUxMKSB7Ci0JCQlpZiAoKHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYykpID09IDEKLQkJCSAgICAmJiAoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApKSAhPSBOVUxMKSB7Ci0JCQkJaWYgKGRlc2MtPmNtZCA9PSBOVUxMIHx8IENNRF9PUFRJT04oZGVzYy0+Y21kKSkKLQkJCQkJcmV0dXJuIHNpemU7Ci0JCQkJZWxzZQotCQkJCQlzaXplKys7Ci0JCQl9IGVsc2UKLQkJCQlzaXplKys7Ci0JCX0KLQlyZXR1cm4gc2l6ZTsKLX0KLQotLyogUmV0dXJuIHByb21wdCBjaGFyYWN0ZXIgb2Ygc3BlY2lmaWVkIG5vZGUuICovCi1jb25zdCBjaGFyICpjbWRfcHJvbXB0KGVudW0gbm9kZV90eXBlIG5vZGUpCi17Ci0Jc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKLQotCWNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBub2RlKTsKLQlyZXR1cm4gY25vZGUtPnByb21wdDsKLX0KLQotLyogSW5zdGFsbCBhIGNvbW1hbmQgaW50byBhIG5vZGUuICovCi12b2lkIGluc3RhbGxfZWxlbWVudChlbnVtIG5vZGVfdHlwZSBudHlwZSwgc3RydWN0IGNtZF9lbGVtZW50ICpjbWQpCi17Ci0Jc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKLQotCWNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBudHlwZSk7Ci0KLQlpZiAoY25vZGUgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSJDb21tYW5kIG5vZGUgJWQgZG9lc24ndCBleGlzdCwgcGxlYXNlIGNoZWNrIGl0XG4iLAotCQkJbnR5cGUpOwotCQlleGl0KDEpOwotCX0KLQotCXZlY3Rvcl9zZXQoY25vZGUtPmNtZF92ZWN0b3IsIGNtZCk7Ci0KLQljbWQtPnN0cnZlYyA9IGNtZF9tYWtlX2Rlc2N2ZWMoY21kLT5zdHJpbmcsIGNtZC0+ZG9jKTsKLQljbWQtPmNtZHNpemUgPSBjbWRfY21kc2l6ZShjbWQtPnN0cnZlYyk7Ci19Ci0KLSNpZmRlZiBWVFlfQ1JZUFRfUFcKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGl0b2E2NFtdID0KLSAgICAiLi8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7Ci0KLXN0YXRpYyB2b2lkIHRvNjQoY2hhciAqcywgbG9uZyB2LCBpbnQgbikKLXsKLQl3aGlsZSAoLS1uID49IDApIHsKLQkJKnMrKyA9IGl0b2E2NFt2ICYgMHgzZl07Ci0JCXYgPj49IDY7Ci0JfQotfQotCi1zdGF0aWMgY2hhciAqemVuY3J5cHQoY29uc3QgY2hhciAqcGFzc3dkKQotewotCWNoYXIgc2FsdFs2XTsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQljaGFyICpjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0KLQlnZXR0aW1lb2ZkYXkoJnR2LCAwKTsKLQotCXRvNjQoJnNhbHRbMF0sIHJhbmRvbSgpLCAzKTsKLQl0bzY0KCZzYWx0WzNdLCB0di50dl91c2VjLCAzKTsKLQlzYWx0WzVdID0gJ1wwJzsKLQotCXJldHVybiBjcnlwdChwYXNzd2QsIHNhbHQpOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gd3JpdGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIGhvc3QuICovCi1zdGF0aWMgaW50IGNvbmZpZ193cml0ZV9ob3N0KHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQlpZiAoaG9zdC5uYW1lKQotCQl2dHlfb3V0KHZ0eSwgImhvc3RuYW1lICVzJXMiLCBob3N0Lm5hbWUsIFZUWV9ORVdMSU5FKTsKLQotCWlmIChob3N0LmVuY3J5cHQpIHsKLQkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKLQkJCXZ0eV9vdXQodnR5LCAicGFzc3dvcmQgOCAlcyVzIiwgaG9zdC5wYXNzd29yZF9lbmNyeXB0LAotCQkJCVZUWV9ORVdMSU5FKTsKLQkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCi0JCQl2dHlfb3V0KHZ0eSwgImVuYWJsZSBwYXNzd29yZCA4ICVzJXMiLAotCQkJCWhvc3QuZW5hYmxlX2VuY3J5cHQsIFZUWV9ORVdMSU5FKTsKLQl9IGVsc2UgewotCQlpZiAoaG9zdC5wYXNzd29yZCkKLQkJCXZ0eV9vdXQodnR5LCAicGFzc3dvcmQgJXMlcyIsIGhvc3QucGFzc3dvcmQsCi0JCQkJVlRZX05FV0xJTkUpOwotCQlpZiAoaG9zdC5lbmFibGUpCi0JCQl2dHlfb3V0KHZ0eSwgImVuYWJsZSBwYXNzd29yZCAlcyVzIiwgaG9zdC5lbmFibGUsCi0JCQkJVlRZX05FV0xJTkUpOwotCX0KLQotI2lmIDAKLQlpZiAoemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCAhPSBMT0dfREVCVUcpIHsKLQkJdnR5X291dCh2dHksICIhIE4uQi4gVGhlICdsb2cgdHJhcCcgY29tbWFuZCBpcyBkZXByZWNhdGVkLiVzIiwKLQkJCVZUWV9ORVdMSU5FKTsKLQkJdnR5X291dCh2dHksICJsb2cgdHJhcCAlcyVzIiwKLQkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bF0sIFZUWV9ORVdMSU5FKTsKLQl9Ci0KLQlpZiAoaG9zdC5sb2dmaWxlCi0JICAgICYmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gIT0gWkxPR19ESVNBQkxFRCkpIHsKLQkJdnR5X291dCh2dHksICJsb2cgZmlsZSAlcyIsIGhvc3QubG9nZmlsZSk7Ci0JCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gIT0KLQkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCi0JCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCi0JCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgotCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX0ZJTEVdXSk7Ci0JCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7Ci0JfQotCi0JaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9TVERPVVRdICE9IFpMT0dfRElTQUJMRUQpIHsKLQkJdnR5X291dCh2dHksICJsb2cgc3Rkb3V0Iik7Ci0JCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXSAhPQotCQkgICAgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKLQkJCXZ0eV9vdXQodnR5LCAiICVzIiwKLQkJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+Ci0JCQkJCSAgICAgIG1heGx2bFtaTE9HX0RFU1RfU1RET1VUXV0pOwotCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOwotCX0KLQotCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl0gPT0gWkxPR19ESVNBQkxFRCkKLQkJdnR5X291dCh2dHksICJubyBsb2cgbW9uaXRvciVzIiwgVlRZX05FV0xJTkUpOwotCWVsc2UgaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXSAhPQotCQkgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKLQkJdnR5X291dCh2dHksICJsb2cgbW9uaXRvciAlcyVzIiwKLQkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdXSwKLQkJCVZUWV9ORVdMSU5FKTsKLQotCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXSAhPSBaTE9HX0RJU0FCTEVEKSB7Ci0JCXZ0eV9vdXQodnR5LCAibG9nIHN5c2xvZyIpOwotCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR10gIT0KLQkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCi0JCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCi0JCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgotCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX1NZU0xPR11dKTsKLQkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKLQl9Ci0KLQlpZiAoemxvZ19kZWZhdWx0LT5mYWNpbGl0eSAhPSBMT0dfREFFTU9OKQotCQl2dHlfb3V0KHZ0eSwgImxvZyBmYWNpbGl0eSAlcyVzIiwKLQkJCWZhY2lsaXR5X25hbWUoemxvZ19kZWZhdWx0LT5mYWNpbGl0eSksIFZUWV9ORVdMSU5FKTsKLQotCWlmICh6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9PSAxKQotCQl2dHlfb3V0KHZ0eSwgImxvZyByZWNvcmQtcHJpb3JpdHklcyIsIFZUWV9ORVdMSU5FKTsKLSNlbmRpZgotCWlmIChob3N0LmFkdmFuY2VkKQotCQl2dHlfb3V0KHZ0eSwgInNlcnZpY2UgYWR2YW5jZWQtdnR5JXMiLCBWVFlfTkVXTElORSk7Ci0KLQlpZiAoaG9zdC5lbmNyeXB0KQotCQl2dHlfb3V0KHZ0eSwgInNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiVzIiwgVlRZX05FV0xJTkUpOwotCi0JaWYgKGhvc3QubGluZXMgPj0gMCkKLQkJdnR5X291dCh2dHksICJzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCAlZCVzIiwgaG9zdC5saW5lcywKLQkJCVZUWV9ORVdMSU5FKTsKLQotCWlmIChob3N0Lm1vdGRmaWxlKQotCQl2dHlfb3V0KHZ0eSwgImJhbm5lciBtb3RkIGZpbGUgJXMlcyIsIGhvc3QubW90ZGZpbGUsCi0JCQlWVFlfTkVXTElORSk7Ci0JZWxzZSBpZiAoIWhvc3QubW90ZCkKLQkJdnR5X291dCh2dHksICJubyBiYW5uZXIgbW90ZCVzIiwgVlRZX05FV0xJTkUpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGdldHRpbmcgY29tbWFuZCB2ZWN0b3IuICovCi1zdGF0aWMgdmVjdG9yIGNtZF9ub2RlX3ZlY3Rvcih2ZWN0b3IgdiwgZW51bSBub2RlX3R5cGUgbnR5cGUpCi17Ci0Jc3RydWN0IGNtZF9ub2RlICpjbm9kZSA9IHZlY3Rvcl9zbG90KHYsIG50eXBlKTsKLQlyZXR1cm4gY25vZGUtPmNtZF92ZWN0b3I7Ci19Ci0KLSNpZiAwCi0vKiBGaWx0ZXIgY29tbWFuZCB2ZWN0b3IgYnkgc3ltYm9sLiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYWN0dWFsbHkgdXNlZDsKLSAqIHNob3VsZCBpdCBiZSBkZWxldGVkPyAqLwotc3RhdGljIGludCBjbWRfZmlsdGVyX2J5X3N5bWJvbChjaGFyICpjb21tYW5kLCBjaGFyICpzeW1ib2wpCi17Ci0JaW50IGksIGxpbTsKLQotCWlmIChzdHJjbXAoc3ltYm9sLCAiSVBWNF9BRERSRVNTIikgPT0gMCkgewotCQlpID0gMDsKLQkJbGltID0gc3RybGVuKGNvbW1hbmQpOwotCQl3aGlsZSAoaSA8IGxpbSkgewotCQkJaWYgKCEKLQkJCSAgICAoaXNkaWdpdCgoaW50KWNvbW1hbmRbaV0pIHx8IGNvbW1hbmRbaV0gPT0gJy4nCi0JCQkgICAgIHx8IGNvbW1hbmRbaV0gPT0gJy8nKSkKLQkJCQlyZXR1cm4gMTsKLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHN0cmNtcChzeW1ib2wsICJTVFJJTkciKSA9PSAwKSB7Ci0JCWkgPSAwOwotCQlsaW0gPSBzdHJsZW4oY29tbWFuZCk7Ci0JCXdoaWxlIChpIDwgbGltKSB7Ci0JCQlpZiAoIQotCQkJICAgIChpc2FscGhhKChpbnQpY29tbWFuZFtpXSkgfHwgY29tbWFuZFtpXSA9PSAnXycKLQkJCSAgICAgfHwgY29tbWFuZFtpXSA9PSAnLScpKQotCQkJCXJldHVybiAxOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoc3RyY21wKHN5bWJvbCwgIklGTkFNRSIpID09IDApIHsKLQkJaSA9IDA7Ci0JCWxpbSA9IHN0cmxlbihjb21tYW5kKTsKLQkJd2hpbGUgKGkgPCBsaW0pIHsKLQkJCWlmICghaXNhbG51bSgoaW50KWNvbW1hbmRbaV0pKQotCQkJCXJldHVybiAxOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiBDb21wbGV0aW9uIG1hdGNoIHR5cGVzLiAqLwotZW51bSBtYXRjaF90eXBlIHsKLQlub19tYXRjaCwKLQlleHRlbmRfbWF0Y2gsCi0JaXB2NF9wcmVmaXhfbWF0Y2gsCi0JaXB2NF9tYXRjaCwKLQlpcHY2X3ByZWZpeF9tYXRjaCwKLQlpcHY2X21hdGNoLAotCXJhbmdlX21hdGNoLAotCXZhcmFyZ19tYXRjaCwKLQlwYXJ0bHlfbWF0Y2gsCi0JZXhhY3RfbWF0Y2gKLX07Ci0KLXN0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjRfbWF0Y2goY29uc3QgY2hhciAqc3RyKQotewotCWNvbnN0IGNoYXIgKnNwOwotCWludCBkb3RzID0gMCwgbnVtcyA9IDA7Ci0JY2hhciBidWZbNF07Ci0KLQlpZiAoc3RyID09IE5VTEwpCi0JCXJldHVybiBwYXJ0bHlfbWF0Y2g7Ci0KLQlmb3IgKDs7KSB7Ci0JCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQkJc3AgPSBzdHI7Ci0JCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKLQkJCWlmICgqc3RyID09ICcuJykgewotCQkJCWlmIChkb3RzID49IDMpCi0JCQkJCXJldHVybiBub19tYXRjaDsKLQotCQkJCWlmICgqKHN0ciArIDEpID09ICcuJykKLQkJCQkJcmV0dXJuIG5vX21hdGNoOwotCi0JCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKLQkJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKLQotCQkJCWRvdHMrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQotCQkJCXJldHVybiBub19tYXRjaDsKLQotCQkJc3RyKys7Ci0JCX0KLQotCQlpZiAoc3RyIC0gc3AgPiAzKQotCQkJcmV0dXJuIG5vX21hdGNoOwotCi0JCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOwotCQlpZiAoYXRvaShidWYpID4gMjU1KQotCQkJcmV0dXJuIG5vX21hdGNoOwotCi0JCW51bXMrKzsKLQotCQlpZiAoKnN0ciA9PSAnXDAnKQotCQkJYnJlYWs7Ci0KLQkJc3RyKys7Ci0JfQotCi0JaWYgKG51bXMgPCA0KQotCQlyZXR1cm4gcGFydGx5X21hdGNoOwotCi0JcmV0dXJuIGV4YWN0X21hdGNoOwotfQotCi1zdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb25zdCBjaGFyICpzdHIpCi17Ci0JY29uc3QgY2hhciAqc3A7Ci0JaW50IGRvdHMgPSAwOwotCWNoYXIgYnVmWzRdOwotCi0JaWYgKHN0ciA9PSBOVUxMKQotCQlyZXR1cm4gcGFydGx5X21hdGNoOwotCi0JZm9yICg7OykgewotCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JCXNwID0gc3RyOwotCQl3aGlsZSAoKnN0ciAhPSAnXDAnICYmICpzdHIgIT0gJy8nKSB7Ci0JCQlpZiAoKnN0ciA9PSAnLicpIHsKLQkJCQlpZiAoZG90cyA9PSAzKQotCQkJCQlyZXR1cm4gbm9fbWF0Y2g7Ci0KLQkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLicgfHwgKihzdHIgKyAxKSA9PSAnLycpCi0JCQkJCXJldHVybiBub19tYXRjaDsKLQotCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCi0JCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7Ci0KLQkJCQlkb3RzKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQotCQkJCXJldHVybiBub19tYXRjaDsKLQotCQkJc3RyKys7Ci0JCX0KLQotCQlpZiAoc3RyIC0gc3AgPiAzKQotCQkJcmV0dXJuIG5vX21hdGNoOwotCi0JCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOwotCQlpZiAoYXRvaShidWYpID4gMjU1KQotCQkJcmV0dXJuIG5vX21hdGNoOwotCi0JCWlmIChkb3RzID09IDMpIHsKLQkJCWlmICgqc3RyID09ICcvJykgewotCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCi0JCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7Ci0KLQkJCQlzdHIrKzsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoKnN0ciA9PSAnXDAnKQotCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7Ci0JCX0KLQotCQlpZiAoKnN0ciA9PSAnXDAnKQotCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKLQotCQlzdHIrKzsKLQl9Ci0KLQlzcCA9IHN0cjsKLQl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7Ci0JCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQotCQkJcmV0dXJuIG5vX21hdGNoOwotCi0JCXN0cisrOwotCX0KLQotCWlmIChhdG9pKHNwKSA+IDMyKQotCQlyZXR1cm4gbm9fbWF0Y2g7Ci0KLQlyZXR1cm4gZXhhY3RfbWF0Y2g7Ci19Ci0KLSNkZWZpbmUgSVBWNl9BRERSX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUiCi0jZGVmaW5lIElQVjZfUFJFRklYX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUvIgotI2RlZmluZSBTVEFURV9TVEFSVAkJMQotI2RlZmluZSBTVEFURV9DT0xPTgkJMgotI2RlZmluZSBTVEFURV9ET1VCTEUJCTMKLSNkZWZpbmUgU1RBVEVfQUREUgkJNAotI2RlZmluZSBTVEFURV9ET1QgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFNUQVRFX1NMQVNICQk2Ci0jZGVmaW5lIFNUQVRFX01BU0sJCTcKLQotI2lmZGVmIEhBVkVfSVBWNgotCi1zdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY2X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKLXsKLQlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKLQlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7Ci0JY29uc3QgY2hhciAqc3AgPSBOVUxMOwotCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNl9kdW1teTsKLQlpbnQgcmV0OwotCi0JaWYgKHN0ciA9PSBOVUxMKQotCQlyZXR1cm4gcGFydGx5X21hdGNoOwotCi0JaWYgKHN0cnNwbihzdHIsIElQVjZfQUREUl9TVFIpICE9IHN0cmxlbihzdHIpKQotCQlyZXR1cm4gbm9fbWF0Y2g7Ci0KLQkvKiB1c2UgaW5ldF9wdG9uIHRoYXQgaGFzIGEgYmV0dGVyIHN1cHBvcnQsCi0JICogZm9yIGV4YW1wbGUgaW5ldF9wdG9uIGNhbiBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgYWRkcmVzc2VzOgotCSAqICA6OjEuMi4zLjQKLQkgKi8KLQlyZXQgPSBpbmV0X3B0b24oQUZfSU5FVDYsIHN0ciwgJnNpbjZfZHVtbXkuc2luNl9hZGRyKTsKLQotCWlmIChyZXQgPT0gMSkKLQkJcmV0dXJuIGV4YWN0X21hdGNoOwotCi0Jd2hpbGUgKCpzdHIgIT0gJ1wwJykgewotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgU1RBVEVfU1RBUlQ6Ci0JCQlpZiAoKnN0ciA9PSAnOicpIHsKLQkJCQlpZiAoKihzdHIgKyAxKSAhPSAnOicgJiYgKihzdHIgKyAxKSAhPSAnXDAnKQotCQkJCQlyZXR1cm4gbm9fbWF0Y2g7Ci0JCQkJY29sb25zLS07Ci0JCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKLQkJCX0gZWxzZSB7Ci0JCQkJc3AgPSBzdHI7Ci0JCQkJc3RhdGUgPSBTVEFURV9BRERSOwotCQkJfQotCi0JCQljb250aW51ZTsKLQkJY2FzZSBTVEFURV9DT0xPTjoKLQkJCWNvbG9ucysrOwotCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQotCQkJCXN0YXRlID0gU1RBVEVfRE9VQkxFOwotCQkJZWxzZSB7Ci0JCQkJc3AgPSBzdHIgKyAxOwotCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNUQVRFX0RPVUJMRToKLQkJCWlmIChkb3VibGVfY29sb24pCi0JCQkJcmV0dXJuIG5vX21hdGNoOwotCi0JCQlpZiAoKihzdHIgKyAxKSA9PSAnOicpCi0JCQkJcmV0dXJuIG5vX21hdGNoOwotCQkJZWxzZSB7Ci0JCQkJaWYgKCooc3RyICsgMSkgIT0gJ1wwJykKLQkJCQkJY29sb25zKys7Ci0JCQkJc3AgPSBzdHIgKyAxOwotCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKLQkJCX0KLQotCQkJZG91YmxlX2NvbG9uKys7Ci0JCQludW1zKys7Ci0JCQlicmVhazsKLQkJY2FzZSBTVEFURV9BRERSOgotCQkJaWYgKCooc3RyICsgMSkgPT0gJzonIHx8ICooc3RyICsgMSkgPT0gJ1wwJykgewotCQkJCWlmIChzdHIgLSBzcCA+IDMpCi0JCQkJCXJldHVybiBub19tYXRjaDsKLQotCQkJCW51bXMrKzsKLQkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOwotCQkJfQotCQkJaWYgKCooc3RyICsgMSkgPT0gJy4nKQotCQkJCXN0YXRlID0gU1RBVEVfRE9UOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1RBVEVfRE9UOgotCQkJc3RhdGUgPSBTVEFURV9BRERSOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChudW1zID4gOCkKLQkJCXJldHVybiBub19tYXRjaDsKLQotCQlpZiAoY29sb25zID4gNykKLQkJCXJldHVybiBub19tYXRjaDsKLQotCQlzdHIrKzsKLQl9Ci0KLSNpZiAwCi0JaWYgKG51bXMgPCAxMSkKLQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKLSNlbmRpZgkJCQkvKiAwICovCi0KLQlyZXR1cm4gZXhhY3RfbWF0Y2g7Ci19Ci0KLXN0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKLXsKLQlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKLQlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7Ci0JaW50IG1hc2s7Ci0JY29uc3QgY2hhciAqc3AgPSBOVUxMOwotCWNoYXIgKmVuZHB0ciA9IE5VTEw7Ci0KLQlpZiAoc3RyID09IE5VTEwpCi0JCXJldHVybiBwYXJ0bHlfbWF0Y2g7Ci0KLQlpZiAoc3Ryc3BuKHN0ciwgSVBWNl9QUkVGSVhfU1RSKSAhPSBzdHJsZW4oc3RyKSkKLQkJcmV0dXJuIG5vX21hdGNoOwotCi0Jd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiBzdGF0ZSAhPSBTVEFURV9NQVNLKSB7Ci0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJY2FzZSBTVEFURV9TVEFSVDoKLQkJCWlmICgqc3RyID09ICc6JykgewotCQkJCWlmICgqKHN0ciArIDEpICE9ICc6JyAmJiAqKHN0ciArIDEpICE9ICdcMCcpCi0JCQkJCXJldHVybiBub19tYXRjaDsKLQkJCQljb2xvbnMtLTsKLQkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOwotCQkJfSBlbHNlIHsKLQkJCQlzcCA9IHN0cjsKLQkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7Ci0JCQl9Ci0KLQkJCWNvbnRpbnVlOwotCQljYXNlIFNUQVRFX0NPTE9OOgotCQkJY29sb25zKys7Ci0JCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCi0JCQkJcmV0dXJuIG5vX21hdGNoOwotCQkJZWxzZSBpZiAoKihzdHIgKyAxKSA9PSAnOicpCi0JCQkJc3RhdGUgPSBTVEFURV9ET1VCTEU7Ci0JCQllbHNlIHsKLQkJCQlzcCA9IHN0ciArIDE7Ci0JCQkJc3RhdGUgPSBTVEFURV9BRERSOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1RBVEVfRE9VQkxFOgotCQkJaWYgKGRvdWJsZV9jb2xvbikKLQkJCQlyZXR1cm4gbm9fbWF0Y2g7Ci0KLQkJCWlmICgqKHN0ciArIDEpID09ICc6JykKLQkJCQlyZXR1cm4gbm9fbWF0Y2g7Ci0JCQllbHNlIHsKLQkJCQlpZiAoKihzdHIgKyAxKSAhPSAnXDAnICYmICooc3RyICsgMSkgIT0gJy8nKQotCQkJCQljb2xvbnMrKzsKLQkJCQlzcCA9IHN0ciArIDE7Ci0KLQkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCi0JCQkJCXN0YXRlID0gU1RBVEVfU0xBU0g7Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7Ci0JCQl9Ci0KLQkJCWRvdWJsZV9jb2xvbisrOwotCQkJbnVtcyArPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1RBVEVfQUREUjoKLQkJCWlmICgqKHN0ciArIDEpID09ICc6JyB8fCAqKHN0ciArIDEpID09ICcuJwotCQkJICAgIHx8ICooc3RyICsgMSkgPT0gJ1wwJyB8fCAqKHN0ciArIDEpID09ICcvJykgewotCQkJCWlmIChzdHIgLSBzcCA+IDMpCi0JCQkJCXJldHVybiBub19tYXRjaDsKLQotCQkJCWZvciAoOyBzcCA8PSBzdHI7IHNwKyspCi0JCQkJCWlmICgqc3AgPT0gJy8nKQotCQkJCQkJcmV0dXJuIG5vX21hdGNoOwotCi0JCQkJbnVtcysrOwotCi0JCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQotCQkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOwotCQkJCWVsc2UgaWYgKCooc3RyICsgMSkgPT0gJy4nKQotCQkJCQlzdGF0ZSA9IFNUQVRFX0RPVDsKLQkJCQllbHNlIGlmICgqKHN0ciArIDEpID09ICcvJykKLQkJCQkJc3RhdGUgPSBTVEFURV9TTEFTSDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNUQVRFX0RPVDoKLQkJCXN0YXRlID0gU1RBVEVfQUREUjsKLQkJCWJyZWFrOwotCQljYXNlIFNUQVRFX1NMQVNIOgotCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKLQkJCQlyZXR1cm4gcGFydGx5X21hdGNoOwotCi0JCQlzdGF0ZSA9IFNUQVRFX01BU0s7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKG51bXMgPiAxMSkKLQkJCXJldHVybiBub19tYXRjaDsKLQotCQlpZiAoY29sb25zID4gNykKLQkJCXJldHVybiBub19tYXRjaDsKLQotCQlzdHIrKzsKLQl9Ci0KLQlpZiAoc3RhdGUgPCBTVEFURV9NQVNLKQotCQlyZXR1cm4gcGFydGx5X21hdGNoOwotCi0JbWFzayA9IHN0cnRvbChzdHIsICZlbmRwdHIsIDEwKTsKLQlpZiAoKmVuZHB0ciAhPSAnXDAnKQotCQlyZXR1cm4gbm9fbWF0Y2g7Ci0KLQlpZiAobWFzayA8IDAgfHwgbWFzayA+IDEyOCkKLQkJcmV0dXJuIG5vX21hdGNoOwotCi0vKiBJIGRvbid0IGtub3cgd2h5IG1hc2sgPCAxMyBtYWtlcyBjb21tYW5kIG1hdGNoIHBhcnRseS4KLSAgIEZvcmdpdmUgbWUgdG8gbWFrZSB0aGlzIGNvbW1lbnRzLiBJIFdhbnQgdG8gc2V0IHN0YXRpYyBkZWZhdWx0IHJvdXRlCi0gICBiZWNhdXNlIG9mIGxhY2sgb2YgZnVuY3Rpb24gdG8gb3JpZ2luYXRlIGRlZmF1bHQgaW4gb3NwZjZkOyBzb3JyeQotICAgICAgIHlhc3UKLSAgaWYgKG1hc2sgPCAxMykKLSAgICByZXR1cm4gcGFydGx5X21hdGNoOwotKi8KLQotCXJldHVybiBleGFjdF9tYXRjaDsKLX0KLQotI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KLQotI2RlZmluZSBERUNJTUFMX1NUUkxFTl9NQVggMTAKLQotc3RhdGljIGludCBjbWRfcmFuZ2VfbWF0Y2goY29uc3QgY2hhciAqcmFuZ2UsIGNvbnN0IGNoYXIgKnN0cikKLXsKLQljaGFyICpwOwotCWNoYXIgYnVmW0RFQ0lNQUxfU1RSTEVOX01BWCArIDFdOwotCWNoYXIgKmVuZHB0ciA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBtaW4sIG1heCwgdmFsOwotCi0JaWYgKHN0ciA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCXZhbCA9IHN0cnRvdWwoc3RyLCAmZW5kcHRyLCAxMCk7Ci0JaWYgKCplbmRwdHIgIT0gJ1wwJykKLQkJcmV0dXJuIDA7Ci0KLQlyYW5nZSsrOwotCXAgPSBzdHJjaHIocmFuZ2UsICctJyk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHAgLSByYW5nZSA+IERFQ0lNQUxfU1RSTEVOX01BWCkKLQkJcmV0dXJuIDA7Ci0Jc3RybmNweShidWYsIHJhbmdlLCBwIC0gcmFuZ2UpOwotCWJ1ZltwIC0gcmFuZ2VdID0gJ1wwJzsKLQltaW4gPSBzdHJ0b3VsKGJ1ZiwgJmVuZHB0ciwgMTApOwotCWlmICgqZW5kcHRyICE9ICdcMCcpCi0JCXJldHVybiAwOwotCi0JcmFuZ2UgPSBwICsgMTsKLQlwID0gc3RyY2hyKHJhbmdlLCAnPicpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChwIC0gcmFuZ2UgPiBERUNJTUFMX1NUUkxFTl9NQVgpCi0JCXJldHVybiAwOwotCXN0cm5jcHkoYnVmLCByYW5nZSwgcCAtIHJhbmdlKTsKLQlidWZbcCAtIHJhbmdlXSA9ICdcMCc7Ci0JbWF4ID0gc3RydG91bChidWYsICZlbmRwdHIsIDEwKTsKLQlpZiAoKmVuZHB0ciAhPSAnXDAnKQotCQlyZXR1cm4gMDsKLQotCWlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi0vKiBNYWtlIGNvbXBsZXRpb24gbWF0Y2ggYW5kIHJldHVybiBtYXRjaCB0eXBlIGZsYWcuICovCi1zdGF0aWMgZW51bSBtYXRjaF90eXBlCi1jbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIHVuc2lnbmVkIGludCBpbmRleCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQljb25zdCBjaGFyICpzdHI7Ci0Jc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKLQllbnVtIG1hdGNoX3R5cGUgbWF0Y2hfdHlwZTsKLQl2ZWN0b3IgZGVzY3ZlYzsKLQlzdHJ1Y3QgZGVzYyAqZGVzYzsKLQotCW1hdGNoX3R5cGUgPSBub19tYXRjaDsKLQotCS8qIElmIGNvbW1hbmQgYW5kIGNtZF9lbGVtZW50IHN0cmluZyBkb2VzIG5vdCBtYXRjaCBzZXQgTlVMTCB0byB2ZWN0b3IgKi8KLQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQotCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpIHsKLQkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQotCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKLQkJCWVsc2UgewotCQkJCXVuc2lnbmVkIGludCBqOwotCQkJCWludCBtYXRjaGVkID0gMDsKLQotCQkJCWRlc2N2ZWMgPQotCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7Ci0KLQkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQotCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKLQkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKLQotCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgewotCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKLQkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQotCQkJCQkJCQltYXRjaF90eXBlID0KLQkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKLQkJCQkJCQltYXRjaGVkKys7Ci0JCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7Ci0JCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAotCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgewotCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8Ci0JCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKLQkJCQkJCQkJCW1hdGNoX3R5cGUKLQkJCQkJCQkJCSAgICA9Ci0JCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7Ci0KLQkJCQkJCQkJbWF0Y2hlZCsrOwotCQkJCQkJCX0KLQkJCQkJCX0KLSNpZmRlZiBIQVZFX0lQVjYKLQkJCQkJCWVsc2UgaWYgKENNRF9JUFY2KHN0cikpIHsKLQkJCQkJCQlpZiAoY21kX2lwdjZfbWF0Y2gKLQkJCQkJCQkgICAgKGNvbW1hbmQpKSB7Ci0JCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKLQkJCQkJCQkJICAgIGlwdjZfbWF0Y2gpCi0JCQkJCQkJCQltYXRjaF90eXBlCi0JCQkJCQkJCQkgICAgPQotCQkJCQkJCQkJICAgIGlwdjZfbWF0Y2g7Ci0KLQkJCQkJCQkJbWF0Y2hlZCsrOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjZfUFJFRklYKHN0cikpIHsKLQkJCQkJCQlpZiAoY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7Ci0JCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKLQkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoKQotCQkJCQkJCQkJbWF0Y2hfdHlwZQotCQkJCQkJCQkJICAgID0KLQkJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaDsKLQotCQkJCQkJCQltYXRjaGVkKys7Ci0JCQkJCQkJfQotCQkJCQkJfQotI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KLQkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKLQkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKLQkJCQkJCQkgICAgKGNvbW1hbmQpKSB7Ci0JCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKLQkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCi0JCQkJCQkJCQltYXRjaF90eXBlCi0JCQkJCQkJCQkgICAgPQotCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7Ci0KLQkJCQkJCQkJbWF0Y2hlZCsrOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjRfUFJFRklYKHN0cikpIHsKLQkJCQkJCQlpZiAoY21kX2lwdjRfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7Ci0JCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKLQkJCQkJCQkJICAgIGlwdjRfcHJlZml4X21hdGNoKQotCQkJCQkJCQkJbWF0Y2hfdHlwZQotCQkJCQkJCQkJICAgID0KLQkJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaDsKLQkJCQkJCQkJbWF0Y2hlZCsrOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZQotCQkJCQkJCS8qIENoZWNrIGlzIHRoaXMgcG9pbnQncyBhcmd1bWVudCBvcHRpb25hbCA/ICovCi0JCQkJCQlpZiAoQ01EX09QVElPTihzdHIpCi0JCQkJCQkJICAgIHx8Ci0JCQkJCQkJICAgIENNRF9WQVJJQUJMRShzdHIpKSB7Ci0JCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAotCQkJCQkJCSAgICBleHRlbmRfbWF0Y2gpCi0JCQkJCQkJCW1hdGNoX3R5cGUgPQotCQkJCQkJCQkgICAgZXh0ZW5kX21hdGNoOwotCQkJCQkJCW1hdGNoZWQrKzsKLQkJCQkJCX0gZWxzZQotCQkJCQkJICAgIGlmIChzdHJuY21wCi0JCQkJCQkJKGNvbW1hbmQsIHN0ciwKLQkJCQkJCQkgc3RybGVuKGNvbW1hbmQpKSA9PQotCQkJCQkJCTApIHsKLQkJCQkJCQlpZiAoc3RyY21wKGNvbW1hbmQsIHN0cikKLQkJCQkJCQkgICAgPT0gMCkKLQkJCQkJCQkJbWF0Y2hfdHlwZSA9Ci0JCQkJCQkJCSAgICBleGFjdF9tYXRjaDsKLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAotCQkJCQkJCQkgICAgcGFydGx5X21hdGNoKQotCQkJCQkJCQkJbWF0Y2hfdHlwZQotCQkJCQkJCQkJICAgID0KLQkJCQkJCQkJCSAgICBwYXJ0bHlfbWF0Y2g7Ci0JCQkJCQkJfQotCQkJCQkJCW1hdGNoZWQrKzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCWlmICghbWF0Y2hlZCkKLQkJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOwotCQkJfQotCQl9Ci0JcmV0dXJuIG1hdGNoX3R5cGU7Ci19Ci0KLS8qIEZpbHRlciB2ZWN0b3IgYnkgY29tbWFuZCBjaGFyYWN0ZXIgd2l0aCBpbmRleC4gKi8KLXN0YXRpYyBlbnVtIG1hdGNoX3R5cGUKLWNtZF9maWx0ZXJfYnlfc3RyaW5nKGNoYXIgKmNvbW1hbmQsIHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JY29uc3QgY2hhciAqc3RyOwotCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7Ci0JZW51bSBtYXRjaF90eXBlIG1hdGNoX3R5cGU7Ci0JdmVjdG9yIGRlc2N2ZWM7Ci0Jc3RydWN0IGRlc2MgKmRlc2M7Ci0KLQltYXRjaF90eXBlID0gbm9fbWF0Y2g7Ci0KLQkvKiBJZiBjb21tYW5kIGFuZCBjbWRfZWxlbWVudCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggc2V0IE5VTEwgdG8gdmVjdG9yICovCi0JZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKLQkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7Ci0JCQkvKiBJZiBnaXZlbiBpbmRleCBpcyBiaWdnZXIgdGhhbiBtYXggc3RyaW5nIHZlY3RvciBvZiBjb21tYW5kLAotCQkJICAgc2V0IE5VTEwgKi8KLQkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQotCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKLQkJCWVsc2UgewotCQkJCXVuc2lnbmVkIGludCBqOwotCQkJCWludCBtYXRjaGVkID0gMDsKLQotCQkJCWRlc2N2ZWMgPQotCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7Ci0KLQkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQotCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKLQkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKLQotCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgewotCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKLQkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQotCQkJCQkJCQltYXRjaF90eXBlID0KLQkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKLQkJCQkJCQltYXRjaGVkKys7Ci0JCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7Ci0JCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAotCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgewotCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8Ci0JCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKLQkJCQkJCQkJCW1hdGNoX3R5cGUKLQkJCQkJCQkJCSAgICA9Ci0JCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7Ci0JCQkJCQkJCW1hdGNoZWQrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0jaWZkZWYgSEFWRV9JUFY2Ci0JCQkJCQllbHNlIGlmIChDTURfSVBWNihzdHIpKSB7Ci0JCQkJCQkJaWYgKGNtZF9pcHY2X21hdGNoCi0JCQkJCQkJICAgIChjb21tYW5kKSA9PQotCQkJCQkJCSAgICBleGFjdF9tYXRjaCkgewotCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8Ci0JCQkJCQkJCSAgICBpcHY2X21hdGNoKQotCQkJCQkJCQkJbWF0Y2hfdHlwZQotCQkJCQkJCQkJICAgID0KLQkJCQkJCQkJCSAgICBpcHY2X21hdGNoOwotCQkJCQkJCQltYXRjaGVkKys7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChDTURfSVBWNl9QUkVGSVgoc3RyKSkgewotCQkJCQkJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goY29tbWFuZCkgPT0gZXhhY3RfbWF0Y2gpIHsKLQkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAotCQkJCQkJCQkgICAgaXB2Nl9wcmVmaXhfbWF0Y2gpCi0JCQkJCQkJCQltYXRjaF90eXBlCi0JCQkJCQkJCQkgICAgPQotCQkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoOwotCQkJCQkJCQltYXRjaGVkKys7Ci0JCQkJCQkJfQotCQkJCQkJfQotI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KLQkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKLQkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKLQkJCQkJCQkgICAgKGNvbW1hbmQpID09Ci0JCQkJCQkJICAgIGV4YWN0X21hdGNoKSB7Ci0JCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKLQkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCi0JCQkJCQkJCQltYXRjaF90eXBlCi0JCQkJCQkJCQkgICAgPQotCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7Ci0JCQkJCQkJCW1hdGNoZWQrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY0X1BSRUZJWChzdHIpKSB7Ci0JCQkJCQkJaWYgKGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb21tYW5kKSA9PSBleGFjdF9tYXRjaCkgewotCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8Ci0JCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaCkKLQkJCQkJCQkJCW1hdGNoX3R5cGUKLQkJCQkJCQkJCSAgICA9Ci0JCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2g7Ci0JCQkJCQkJCW1hdGNoZWQrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKENNRF9PUFRJT04oc3RyKQotCQkJCQkJCSAgIHx8IENNRF9WQVJJQUJMRShzdHIpKQotCQkJCQkJewotCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKLQkJCQkJCQkgICAgZXh0ZW5kX21hdGNoKQotCQkJCQkJCQltYXRjaF90eXBlID0KLQkJCQkJCQkJICAgIGV4dGVuZF9tYXRjaDsKLQkJCQkJCQltYXRjaGVkKys7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChzdHJjbXAoY29tbWFuZCwgc3RyKQotCQkJCQkJCSAgICA9PSAwKSB7Ci0JCQkJCQkJCW1hdGNoX3R5cGUgPQotCQkJCQkJCQkgICAgZXhhY3RfbWF0Y2g7Ci0JCQkJCQkJCW1hdGNoZWQrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQlpZiAoIW1hdGNoZWQpCi0JCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKLQkJCX0KLQkJfQotCXJldHVybiBtYXRjaF90eXBlOwotfQotCi0vKiBDaGVjayBhbWJpZ3VvdXMgbWF0Y2ggKi8KLXN0YXRpYyBpbnQKLWlzX2NtZF9hbWJpZ3VvdXMoY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIGludCBpbmRleCwgZW51bSBtYXRjaF90eXBlIHR5cGUpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdW5zaWduZWQgaW50IGo7Ci0JY29uc3QgY2hhciAqc3RyID0gTlVMTDsKLQlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OwotCWNvbnN0IGNoYXIgKm1hdGNoZWQgPSBOVUxMOwotCXZlY3RvciBkZXNjdmVjOwotCXN0cnVjdCBkZXNjICpkZXNjOwotCi0JZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKLQkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7Ci0JCQlpbnQgbWF0Y2ggPSAwOwotCi0JCQlkZXNjdmVjID0gdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywgaW5kZXgpOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQotCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgewotCQkJCQllbnVtIG1hdGNoX3R5cGUgcmV0OwotCi0JCQkJCXN0ciA9IGRlc2MtPmNtZDsKLQotCQkJCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQkJY2FzZSBleGFjdF9tYXRjaDoKLQkJCQkJCWlmICghCi0JCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQotCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKLSYmIHN0cmNtcChjb21tYW5kLCBzdHIpID09IDApCi0JCQkJCQkJbWF0Y2grKzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIHBhcnRseV9tYXRjaDoKLQkJCQkJCWlmICghCi0JCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQotCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKLSYmIHN0cm5jbXAoY29tbWFuZCwgc3RyLCBzdHJsZW4oY29tbWFuZCkpID09IDApIHsKLQkJCQkJCQlpZiAobWF0Y2hlZAotCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKLQkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQotCQkJCQkJCQlyZXR1cm4gMTsJLyogVGhlcmUgaXMgYW1iaWd1b3VzIG1hdGNoLiAqLwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJbWF0Y2hlZCA9IHN0cjsKLQkJCQkJCQltYXRjaCsrOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgcmFuZ2VfbWF0Y2g6Ci0JCQkJCQlpZiAoY21kX3JhbmdlX21hdGNoCi0JCQkJCQkgICAgKHN0ciwgY29tbWFuZCkpIHsKLQkJCQkJCQlpZiAobWF0Y2hlZAotCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKLQkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQotCQkJCQkJCQlyZXR1cm4gMTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCW1hdGNoZWQgPSBzdHI7Ci0JCQkJCQkJbWF0Y2grKzsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotI2lmZGVmIEhBVkVfSVBWNgotCQkJCQljYXNlIGlwdjZfbWF0Y2g6Ci0JCQkJCQlpZiAoQ01EX0lQVjYoc3RyKSkKLQkJCQkJCQltYXRjaCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgaXB2Nl9wcmVmaXhfbWF0Y2g6Ci0JCQkJCQlpZiAoKHJldCA9Ci0JCQkJCQkgICAgIGNtZF9pcHY2X3ByZWZpeF9tYXRjaAotCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7Ci0JCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCi0JCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLwotCi0JCQkJCQkJbWF0Y2grKzsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLwotCQkJCQljYXNlIGlwdjRfbWF0Y2g6Ci0JCQkJCQlpZiAoQ01EX0lQVjQoc3RyKSkKLQkJCQkJCQltYXRjaCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgaXB2NF9wcmVmaXhfbWF0Y2g6Ci0JCQkJCQlpZiAoKHJldCA9Ci0JCQkJCQkgICAgIGNtZF9pcHY0X3ByZWZpeF9tYXRjaAotCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7Ci0JCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCi0JCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLwotCi0JCQkJCQkJbWF0Y2grKzsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIGV4dGVuZF9tYXRjaDoKLQkJCQkJCWlmIChDTURfT1BUSU9OKHN0cikKLQkJCQkJCSAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKLQkJCQkJCQltYXRjaCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2Ugbm9fbWF0Y2g6Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCWlmICghbWF0Y2gpCi0JCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOwotCQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIElmIHNyYyBtYXRjaGVzIGRzdCByZXR1cm4gZHN0IHN0cmluZywgb3RoZXJ3aXNlIHJldHVybiBOVUxMICovCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX2VudHJ5X2Z1bmN0aW9uKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0KQotewotCS8qIFNraXAgdmFyaWFibGUgYXJndW1lbnRzLiAqLwotCWlmIChDTURfT1BUSU9OKGRzdCkgfHwgQ01EX1ZBUklBQkxFKGRzdCkgfHwgQ01EX1ZBUkFSRyhkc3QpIHx8Ci0JICAgIENNRF9JUFY0KGRzdCkgfHwgQ01EX0lQVjRfUFJFRklYKGRzdCkgfHwgQ01EX1JBTkdFKGRzdCkpCi0JCXJldHVybiBOVUxMOwotCi0JLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KLQlpZiAoc3JjID09IE5VTEwpCi0JCXJldHVybiBkc3Q7Ci0KLQkvKiBNYXRjaGVkIHdpdGggaW5wdXQgc3RyaW5nLiAqLwotCWlmIChzdHJuY21wKHNyYywgZHN0LCBzdHJsZW4oc3JjKSkgPT0gMCkKLQkJcmV0dXJuIGRzdDsKLQotCXJldHVybiBOVUxMOwotfQotCi0vKiBJZiBzcmMgbWF0Y2hlcyBkc3QgcmV0dXJuIGRzdCBzdHJpbmcsIG90aGVyd2lzZSByZXR1cm4gTlVMTCAqLwotLyogVGhpcyB2ZXJzaW9uIHdpbGwgcmV0dXJuIHRoZSBkc3Qgc3RyaW5nIGFsd2F5cyBpZiBpdCBpcwotICAgQ01EX1ZBUklBQkxFIGZvciAnPycga2V5IHByb2Nlc3NpbmcgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfZW50cnlfZnVuY3Rpb25fZGVzYyhjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCkKLXsKLQlpZiAoQ01EX1ZBUkFSRyhkc3QpKQotCQlyZXR1cm4gZHN0OwotCi0JaWYgKENNRF9SQU5HRShkc3QpKSB7Ci0JCWlmIChjbWRfcmFuZ2VfbWF0Y2goZHN0LCBzcmMpKQotCQkJcmV0dXJuIGRzdDsKLQkJZWxzZQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotI2lmZGVmIEhBVkVfSVBWNgotCWlmIChDTURfSVBWNihkc3QpKSB7Ci0JCWlmIChjbWRfaXB2Nl9tYXRjaChzcmMpKQotCQkJcmV0dXJuIGRzdDsKLQkJZWxzZQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKENNRF9JUFY2X1BSRUZJWChkc3QpKSB7Ci0JCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goc3JjKSkKLQkJCXJldHVybiBkc3Q7Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KLSNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KLQotCWlmIChDTURfSVBWNChkc3QpKSB7Ci0JCWlmIChjbWRfaXB2NF9tYXRjaChzcmMpKQotCQkJcmV0dXJuIGRzdDsKLQkJZWxzZQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKENNRF9JUFY0X1BSRUZJWChkc3QpKSB7Ci0JCWlmIChjbWRfaXB2NF9wcmVmaXhfbWF0Y2goc3JjKSkKLQkJCXJldHVybiBkc3Q7Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCS8qIE9wdGlvbmFsIG9yIHZhcmlhYmxlIGNvbW1hbmRzIGFsd2F5cyBtYXRjaCBvbiAnPycgKi8KLQlpZiAoQ01EX09QVElPTihkc3QpIHx8IENNRF9WQVJJQUJMRShkc3QpKQotCQlyZXR1cm4gZHN0OwotCi0JLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KLQlpZiAoc3JjID09IE5VTEwpCi0JCXJldHVybiBkc3Q7Ci0KLQlpZiAoc3RybmNtcChzcmMsIGRzdCwgc3RybGVuKHNyYykpID09IDApCi0JCXJldHVybiBkc3Q7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQotLyogQ2hlY2sgc2FtZSBzdHJpbmcgZWxlbWVudCBleGlzdGVuY2UuICBJZiBpdCBpc24ndCB0aGVyZSByZXR1cm4KLSAgICAxLiAqLwotc3RhdGljIGludCBjbWRfdW5pcXVlX3N0cmluZyh2ZWN0b3IgdiwgY29uc3QgY2hhciAqc3RyKQotewotCXVuc2lnbmVkIGludCBpOwotCWNoYXIgKm1hdGNoOwotCi0JZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKLQkJaWYgKChtYXRjaCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKQotCQkJaWYgKHN0cmNtcChtYXRjaCwgc3RyKSA9PSAwKQotCQkJCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi0vKiBDb21wYXJlIHN0cmluZyB0byBkZXNjcmlwdGlvbiB2ZWN0b3IuICBJZiB0aGVyZSBpcyBzYW1lIHN0cmluZwotICAgcmV0dXJuIDEgZWxzZSByZXR1cm4gMC4gKi8KLXN0YXRpYyBpbnQgZGVzY191bmlxdWVfc3RyaW5nKHZlY3RvciB2LCBjb25zdCBjaGFyICpzdHIpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGRlc2MgKmRlc2M7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQotCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkKLQkJCWlmIChzdHJjbXAoZGVzYy0+Y21kLCBzdHIpID09IDApCi0JCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY21kX3RyeV9kb19zaG9ydGN1dChlbnVtIG5vZGVfdHlwZSBub2RlLCBjaGFyICpmaXJzdF93b3JkKQotewotCWlmIChmaXJzdF93b3JkICE9IE5VTEwgJiYKLQkgICAgbm9kZSAhPSBBVVRIX05PREUgJiYKLQkgICAgbm9kZSAhPSBWSUVXX05PREUgJiYKLQkgICAgbm9kZSAhPSBBVVRIX0VOQUJMRV9OT0RFICYmCi0JICAgIG5vZGUgIT0gRU5BQkxFX05PREUgJiYgMCA9PSBzdHJjbXAoImRvIiwgZmlyc3Rfd29yZCkpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi0vKiAnPycgZGVzY3JpYmUgY29tbWFuZCBzdXBwb3J0LiAqLwotc3RhdGljIHZlY3RvcgotY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdmVjdG9yIGNtZF92ZWN0b3I7Ci0jZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAotCXZlY3RvciBtYXRjaHZlYzsKLQlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OwotCXVuc2lnbmVkIGludCBpbmRleDsKLQlpbnQgcmV0OwotCWVudW0gbWF0Y2hfdHlwZSBtYXRjaDsKLQljaGFyICpjb21tYW5kOwotCXN0YXRpYyBzdHJ1Y3QgZGVzYyBkZXNjX2NyID0geyAiPGNyPiIsICIiIH07Ci0KLQkvKiBTZXQgaW5kZXguICovCi0JaWYgKHZlY3Rvcl9hY3RpdmUodmxpbmUpID09IDApIHsKLQkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZQotCQlpbmRleCA9IHZlY3Rvcl9hY3RpdmUodmxpbmUpIC0gMTsKLQotCS8qIE1ha2UgY29weSB2ZWN0b3Igb2YgY3VycmVudCBub2RlJ3MgY29tbWFuZCB2ZWN0b3IuICovCi0JY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOwotCi0JLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IgKi8KLQltYXRjaHZlYyA9IHZlY3Rvcl9pbml0KElOSVRfTUFUQ0hWRUNfU0laRSk7Ci0KLQkvKiBGaWx0ZXIgY29tbWFuZHMuICovCi0JLyogT25seSB3b3JkcyBwcmVjZWRlcyBjdXJyZW50IHdvcmQgd2lsbCBiZSBjaGVja2VkIGluIHRoaXMgbG9vcC4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKLQkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgewotCQkJbWF0Y2ggPQotCQkJICAgIGNtZF9maWx0ZXJfYnlfY29tcGxldGlvbihjb21tYW5kLCBjbWRfdmVjdG9yLCBpKTsKLQotCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaCkgewotCQkJCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7Ci0JCQkJdmVjdG9yIGRlc2N2ZWM7Ci0JCQkJdW5zaWduZWQgaW50IGosIGs7Ci0KLQkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaisrKQotCQkJCQlpZiAoKGNtZF9lbGVtZW50ID0KLQkJCQkJICAgICB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBqKSkgIT0gTlVMTAotCQkJCQkgICAgJiYKLQkJCQkJICAgICh2ZWN0b3JfYWN0aXZlCi0JCQkJCSAgICAgKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKSkgewotCQkJCQkJZGVzY3ZlYyA9Ci0JCQkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPgotCQkJCQkJCQlzdHJ2ZWMsCi0JCQkJCQkJCXZlY3Rvcl9hY3RpdmUKLQkJCQkJCQkJKGNtZF9lbGVtZW50LT4KLQkJCQkJCQkJIHN0cnZlYykgLSAxKTsKLQkJCQkJCWZvciAoayA9IDA7Ci0JCQkJCQkgICAgIGsgPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOwotCQkJCQkJICAgICBrKyspIHsKLQkJCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9Ci0JCQkJCQkJICAgIHZlY3Rvcl9zbG90KGRlc2N2ZWMsCi0JCQkJCQkJCQlrKTsKLQkJCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLAotCQkJCQkJCQkgICBkZXNjKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJdmVjdG9yX3NldChtYXRjaHZlYywgJmRlc2NfY3IpOwotCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOwotCi0JCQkJcmV0dXJuIG1hdGNodmVjOwotCQkJfQotCi0JCQlpZiAoKHJldCA9Ci0JCQkgICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaSwKLQkJCQkJICAgICAgbWF0Y2gpKSA9PSAxKSB7Ci0JCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7Ci0JCQkJKnN0YXR1cyA9IENNRF9FUlJfQU1CSUdVT1VTOwotCQkJCXJldHVybiBOVUxMOwotCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgewotCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOwotCQkJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0KLQkvKiBQcmVwYXJlIG1hdGNoIHZlY3RvciAqLwotCS8qICBtYXRjaHZlYyA9IHZlY3Rvcl9pbml0IChJTklUX01BVENIVkVDX1NJWkUpOyAqLwotCi0JLyogTWFrZSBzdXJlIHRoYXQgY21kX3ZlY3RvciBpcyBmaWx0ZXJlZCBiYXNlZCBvbiBjdXJyZW50IHdvcmQgKi8KLQljb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KTsKLQlpZiAoY29tbWFuZCkKLQkJbWF0Y2ggPSBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgpOwotCi0JLyogTWFrZSBkZXNjcmlwdGlvbiB2ZWN0b3IuICovCi0JZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKLQkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpKSAhPSBOVUxMKSB7Ci0JCQljb25zdCBjaGFyICpzdHJpbmcgPSBOVUxMOwotCQkJdmVjdG9yIHN0cnZlYyA9IGNtZF9lbGVtZW50LT5zdHJ2ZWM7Ci0KLQkJCS8qIGlmIGNvbW1hbmQgaXMgTlVMTCwgaW5kZXggbWF5IGJlIGVxdWFsIHRvIHZlY3Rvcl9hY3RpdmUgKi8KLQkJCWlmIChjb21tYW5kICYmIGluZGV4ID49IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkKLQkJCQl2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSA9IE5VTEw7Ci0JCQllbHNlIHsKLQkJCQkvKiBDaGVjayBpZiBjb21tYW5kIGlzIGNvbXBsZXRlZC4gKi8KLQkJCQlpZiAoY29tbWFuZCA9PSBOVUxMCi0JCQkJICAgICYmIGluZGV4ID09IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkgewotCQkJCQlzdHJpbmcgPSAiPGNyPiI7Ci0JCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nCi0JCQkJCSAgICAobWF0Y2h2ZWMsIHN0cmluZykpCi0JCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCAmZGVzY19jcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdW5zaWduZWQgaW50IGo7Ci0JCQkJCXZlY3RvciBkZXNjdmVjID0KLQkJCQkJICAgIHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOwotCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYzsKLQotCQkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsKLQkJCQkJICAgICBqKyspCi0JCQkJCQlpZiAoKGRlc2MgPQotCQkJCQkJICAgICB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKLQkJCQkJCQlzdHJpbmcgPQotCQkJCQkJCSAgICBjbWRfZW50cnlfZnVuY3Rpb25fZGVzYwotCQkJCQkJCSAgICAoY29tbWFuZCwKLQkJCQkJCQkgICAgIGRlc2MtPmNtZCk7Ci0JCQkJCQkJaWYgKHN0cmluZykgewotCQkJCQkJCQkvKiBVbmlxdWVuZXNzIGNoZWNrICovCi0JCQkJCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nKG1hdGNodmVjLCBzdHJpbmcpKQotCQkJCQkJCQkJdmVjdG9yX3NldAotCQkJCQkJCQkJICAgIChtYXRjaHZlYywKLQkJCQkJCQkJCSAgICAgZGVzYyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOwotCi0JaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7Ci0JCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKLQkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7Ci0JfSBlbHNlCi0JCSpzdGF0dXMgPSBDTURfU1VDQ0VTUzsKLQotCXJldHVybiBtYXRjaHZlYzsKLX0KLQotdmVjdG9yIGNtZF9kZXNjcmliZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqIHZ0eSwgaW50ICpzdGF0dXMpCi17Ci0JdmVjdG9yIHJldDsKLQotCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgewotCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKLQkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7Ci0JCXVuc2lnbmVkIGludCBpbmRleDsKLQotCQlvbm9kZSA9IHZ0eS0+bm9kZTsKLQkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7Ci0JCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCi0KLQkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOwotCQkvKiB1c2UgbWVtY3B5PyAqLwotCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgewotCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCi0JCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOwotCQl9Ci0KLQkJcmV0ID0gY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7Ci0KLQkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7Ci0JCXZ0eS0+bm9kZSA9IG9ub2RlOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiBjbWRfZGVzY3JpYmVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Ci19Ci0KLS8qIENoZWNrIExDRCBvZiBtYXRjaGVkIGNvbW1hbmQuICovCi1zdGF0aWMgaW50IGNtZF9sY2QoY2hhciAqKm1hdGNoZWQpCi17Ci0JaW50IGk7Ci0JaW50IGo7Ci0JaW50IGxjZCA9IC0xOwotCWNoYXIgKnMxLCAqczI7Ci0JY2hhciBjMSwgYzI7Ci0KLQlpZiAobWF0Y2hlZFswXSA9PSBOVUxMIHx8IG1hdGNoZWRbMV0gPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGkgPSAxOyBtYXRjaGVkW2ldICE9IE5VTEw7IGkrKykgewotCQlzMSA9IG1hdGNoZWRbaSAtIDFdOwotCQlzMiA9IG1hdGNoZWRbaV07Ci0KLQkJZm9yIChqID0gMDsgKGMxID0gczFbal0pICYmIChjMiA9IHMyW2pdKTsgaisrKQotCQkJaWYgKGMxICE9IGMyKQotCQkJCWJyZWFrOwotCi0JCWlmIChsY2QgPCAwKQotCQkJbGNkID0gajsKLQkJZWxzZSB7Ci0JCQlpZiAobGNkID4gaikKLQkJCQlsY2QgPSBqOwotCQl9Ci0JfQotCXJldHVybiBsY2Q7Ci19Ci0KLS8qIENvbW1hbmQgbGluZSBjb21wbGV0aW9uIHN1cHBvcnQuICovCi1zdGF0aWMgY2hhciAqKmNtZF9jb21wbGV0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCi0JCQkJCWludCAqc3RhdHVzKQotewotCXVuc2lnbmVkIGludCBpOwotCXZlY3RvciBjbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7Ci0jZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAotCXZlY3RvciBtYXRjaHZlYzsKLQlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OwotCXVuc2lnbmVkIGludCBpbmRleDsKLQljaGFyICoqbWF0Y2hfc3RyOwotCXN0cnVjdCBkZXNjICpkZXNjOwotCXZlY3RvciBkZXNjdmVjOwotCWNoYXIgKmNvbW1hbmQ7Ci0JaW50IGxjZDsKLQotCWlmICh2ZWN0b3JfYWN0aXZlKHZsaW5lKSA9PSAwKSB7Ci0JCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UKLQkJaW5kZXggPSB2ZWN0b3JfYWN0aXZlKHZsaW5lKSAtIDE7Ci0KLQkvKiBGaXJzdCwgZmlsdGVyIGJ5IHByZWNlZWRpbmcgY29tbWFuZCBzdHJpbmcgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKLQkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgewotCQkJZW51bSBtYXRjaF90eXBlIG1hdGNoOwotCQkJaW50IHJldDsKLQotCQkJLyogRmlyc3QgdHJ5IGNvbXBsZXRpb24gbWF0Y2gsIGlmIHRoZXJlIGlzIGV4YWN0bHkgbWF0Y2ggcmV0dXJuIDEgKi8KLQkJCW1hdGNoID0KLQkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaSk7Ci0KLQkJCS8qIElmIHRoZXJlIGlzIGV4YWN0IG1hdGNoIHRoZW4gZmlsdGVyIGFtYmlndW91cyBtYXRjaCBlbHNlIGNoZWNrCi0JCQkgICBhbWJpZ3VvdXNuZXNzLiAqLwotCQkJaWYgKChyZXQgPQotCQkJICAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGksCi0JCQkJCSAgICAgIG1hdGNoKSkgPT0gMSkgewotCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOwotCQkJCSpzdGF0dXMgPSBDTURfRVJSX0FNQklHVU9VUzsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCS8qCi0JCQkgICBlbHNlIGlmIChyZXQgPT0gMikKLQkJCSAgIHsKLQkJCSAgIHZlY3Rvcl9mcmVlIChjbWRfdmVjdG9yKTsKLQkJCSAgICpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOwotCQkJICAgcmV0dXJuIE5VTEw7Ci0JCQkgICB9Ci0JCQkgKi8KLQkJfQotCi0JLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IuICovCi0JbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdChJTklUX01BVENIVkVDX1NJWkUpOwotCi0JLyogTm93IHdlIGdvdCBpbnRvIGNvbXBsZXRpb24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQotCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7Ci0JCQljb25zdCBjaGFyICpzdHJpbmc7Ci0JCQl2ZWN0b3Igc3RydmVjID0gY21kX2VsZW1lbnQtPnN0cnZlYzsKLQotCQkJLyogQ2hlY2sgZmllbGQgbGVuZ3RoICovCi0JCQlpZiAoaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShzdHJ2ZWMpKQotCQkJCXZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpID0gTlVMTDsKLQkJCWVsc2UgewotCQkJCXVuc2lnbmVkIGludCBqOwotCi0JCQkJZGVzY3ZlYyA9IHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOwotCQkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOyBqKyspCi0JCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgewotCQkJCQkJaWYgKChzdHJpbmcgPSBjbWRfZW50cnlfZnVuY3Rpb24odmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwgZGVzYy0+Y21kKSkpCi0JCQkJCQkJaWYgKGNtZF91bmlxdWVfc3RyaW5nIChtYXRjaHZlYywgc3RyaW5nKSkKLQkJCQkJCQkJdmVjdG9yX3NldCAobWF0Y2h2ZWMsIHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgc3RyaW5nKSk7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCi0JLyogV2UgZG9uJ3QgbmVlZCBjbWRfdmVjdG9yIGFueSBtb3JlLiAqLwotCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOwotCi0JLyogTm8gbWF0Y2hlZCBjb21tYW5kICovCi0JaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7Ci0JCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKLQotCQkvKiBJbiBjYXNlIG9mICdjb21tYW5kIFx0JyBwYXR0ZXJuLiAgRG8geW91IG5lZWQgJz8nIGNvbW1hbmQgYXQKLQkJICAgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KLQkJaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgPT0gJ1wwJykKLQkJCSpzdGF0dXMgPSBDTURfRVJSX05PVEhJTkdfVE9ETzsKLQkJZWxzZQotCQkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIE9ubHkgb25lIG1hdGNoZWQgKi8KLQlpZiAodmVjdG9yX3Nsb3QobWF0Y2h2ZWMsIDEpID09IE5VTEwpIHsKLQkJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OwotCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOwotCQkqc3RhdHVzID0gQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0g7Ci0JCXJldHVybiBtYXRjaF9zdHI7Ci0JfQotCS8qIE1ha2UgaXQgc3VyZSBsYXN0IGVsZW1lbnQgaXMgTlVMTC4gKi8KLQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBOVUxMKTsKLQotCS8qIENoZWNrIExDRCBvZiBtYXRjaGVkIHN0cmluZ3MuICovCi0JaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgIT0gTlVMTCkgewotCQlsY2QgPSBjbWRfbGNkKChjaGFyICoqKW1hdGNodmVjLT5pbmRleCk7Ci0KLQkJaWYgKGxjZCkgewotCQkJaW50IGxlbiA9IHN0cmxlbih2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpKTsKLQotCQkJaWYgKGxlbiA8IGxjZCkgewotCQkJCWNoYXIgKmxjZHN0cjsKLQotCQkJCWxjZHN0ciA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBsY2QgKyAxLAotCQkJCQkJICAgICAgImNvbXBsZXRlLWxjZHN0ciIpOwotCQkJCW1lbWNweShsY2RzdHIsIG1hdGNodmVjLT5pbmRleFswXSwgbGNkKTsKLQkJCQlsY2RzdHJbbGNkXSA9ICdcMCc7Ci0KLQkJCQkvKiBtYXRjaF9zdHIgPSAoY2hhciAqKikgJmxjZHN0cjsgKi8KLQotCQkJCS8qIEZyZWUgbWF0Y2h2ZWMuICovCi0JCQkJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUobWF0Y2h2ZWMpOyBpKyspIHsKLQkJCQkJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSkKLQkJCQkJCXRhbGxvY19mcmVlKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSk7Ci0JCQkJfQotCQkJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKLQotCQkJCS8qIE1ha2UgbmV3IG1hdGNodmVjLiAqLwotCQkJCW1hdGNodmVjID0gdmVjdG9yX2luaXQoSU5JVF9NQVRDSFZFQ19TSVpFKTsKLQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBsY2RzdHIpOwotCQkJCW1hdGNoX3N0ciA9IChjaGFyICoqKW1hdGNodmVjLT5pbmRleDsKLQkJCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOwotCi0JCQkJKnN0YXR1cyA9IENNRF9DT01QTEVURV9NQVRDSDsKLQkJCQlyZXR1cm4gbWF0Y2hfc3RyOwotCQkJfQotCQl9Ci0JfQotCi0JbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OwotCXZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZShtYXRjaHZlYyk7Ci0JKnN0YXR1cyA9IENNRF9DT01QTEVURV9MSVNUX01BVENIOwotCXJldHVybiBtYXRjaF9zdHI7Ci19Ci0KLWNoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCi17Ci0JY2hhciAqKnJldDsKLQotCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgewotCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKLQkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7Ci0JCXVuc2lnbmVkIGludCBpbmRleDsKLQotCQlvbm9kZSA9IHZ0eS0+bm9kZTsKLQkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7Ci0JCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCi0KLQkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOwotCQkvKiB1c2UgbWVtY3B5PyAqLwotCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgewotCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCi0JCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOwotCQl9Ci0KLQkJcmV0ID0gY21kX2NvbXBsZXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7Ci0KLQkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7Ci0JCXZ0eS0+bm9kZSA9IG9ub2RlOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiBjbWRfY29tcGxldGVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Ci19Ci0KLS8qIHJldHVybiBwYXJlbnQgbm9kZSAqLwotLyogTVVTVCBldmVudHVhbGx5IGNvbnZlcmdlIG9uIENPTkZJR19OT0RFICovCi1lbnVtIG5vZGVfdHlwZSB2dHlfZ29fcGFyZW50KHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQlhc3NlcnQodnR5LT5ub2RlID4gQ09ORklHX05PREUpOwotCi0Jc3dpdGNoICh2dHktPm5vZGUpIHsKLQljYXNlIEdTTU5FVF9OT0RFOgotCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKLQkJdnR5LT5pbmRleCA9IE5VTEw7Ci0JCWJyZWFrOwotCWNhc2UgQlRTX05PREU6Ci0JCXZ0eS0+bm9kZSA9IEdTTU5FVF9OT0RFOwotCQl7Ci0JCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLwotCQkJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7Ci0JCQl2dHktPmluZGV4ID0gYnRzLT5uZXR3b3JrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVFJYX05PREU6Ci0JCXZ0eS0+bm9kZSA9IEJUU19OT0RFOwotCQl7Ci0JCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLwotCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OwotCQkJdnR5LT5pbmRleCA9IHRyeC0+YnRzOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVFNfTk9ERToKLQkJdnR5LT5ub2RlID0gVFJYX05PREU7Ci0JCXsKLQkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCi0JCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKLQkJCXZ0eS0+aW5kZXggPSB0cy0+dHJ4OwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU1VCU0NSX05PREU6Ci0JCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKLQkJc3Vic2NyX3B1dCh2dHktPmluZGV4KTsKLQkJdnR5LT5pbmRleCA9IE5VTEw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOwotCX0KLQotCXJldHVybiB2dHktPm5vZGU7Ci19Ci0KLS8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCB2bGluZSB2ZWN0b3IuICovCi1zdGF0aWMgaW50Ci1jbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCi0JCQkgc3RydWN0IGNtZF9lbGVtZW50ICoqY21kKQotewotCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGludCBpbmRleDsKLQl2ZWN0b3IgY21kX3ZlY3RvcjsKLQlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OwotCXN0cnVjdCBjbWRfZWxlbWVudCAqbWF0Y2hlZF9lbGVtZW50OwotCXVuc2lnbmVkIGludCBtYXRjaGVkX2NvdW50LCBpbmNvbXBsZXRlX2NvdW50OwotCWludCBhcmdjOwotCWNvbnN0IGNoYXIgKmFyZ3ZbQ01EX0FSR0NfTUFYXTsKLQllbnVtIG1hdGNoX3R5cGUgbWF0Y2ggPSAwOwotCWludCB2YXJmbGFnOwotCWNoYXIgKmNvbW1hbmQ7Ci0KLQkvKiBNYWtlIGNvcHkgb2YgY29tbWFuZCBlbGVtZW50cy4gKi8KLQljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKLQkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKLQkJCWludCByZXQ7Ci0KLQkJCW1hdGNoID0KLQkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwKLQkJCQkJCSAgICAgaW5kZXgpOwotCi0JCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoKQotCQkJCWJyZWFrOwotCi0JCQlyZXQgPQotCQkJICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgsIG1hdGNoKTsKLQotCQkJaWYgKHJldCA9PSAxKSB7Ci0JCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7Ci0JCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOwotCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgewotCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOwotCQkJCXJldHVybiBDTURfRVJSX05PX01BVENIOwotCQkJfQotCQl9Ci0KLQkvKiBDaGVjayBtYXRjaGVkIGNvdW50LiAqLwotCW1hdGNoZWRfZWxlbWVudCA9IE5VTEw7Ci0JbWF0Y2hlZF9jb3VudCA9IDA7Ci0JaW5jb21wbGV0ZV9jb3VudCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQotCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7Ci0JCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoCi0JCQkgICAgfHwgaW5kZXggPj0gY21kX2VsZW1lbnQtPmNtZHNpemUpIHsKLQkJCQltYXRjaGVkX2VsZW1lbnQgPSBjbWRfZWxlbWVudDsKLSNpZiAwCi0JCQkJcHJpbnRmKCJERUJVRzogJXNcbiIsIGNtZF9lbGVtZW50LT5zdHJpbmcpOwotI2VuZGlmCi0JCQkJbWF0Y2hlZF9jb3VudCsrOwotCQkJfSBlbHNlIHsKLQkJCQlpbmNvbXBsZXRlX2NvdW50Kys7Ci0JCQl9Ci0JCX0KLQotCS8qIEZpbmlzaCBvZiB1c2luZyBjbWRfdmVjdG9yLiAqLwotCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOwotCi0JLyogVG8gZXhlY3V0ZSBjb21tYW5kLCBtYXRjaGVkX2NvdW50IG11c3QgYmUgMS4gKi8KLQlpZiAobWF0Y2hlZF9jb3VudCA9PSAwKSB7Ci0JCWlmIChpbmNvbXBsZXRlX2NvdW50KQotCQkJcmV0dXJuIENNRF9FUlJfSU5DT01QTEVURTsKLQkJZWxzZQotCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7Ci0JfQotCi0JaWYgKG1hdGNoZWRfY291bnQgPiAxKQotCQlyZXR1cm4gQ01EX0VSUl9BTUJJR1VPVVM7Ci0KLQkvKiBBcmd1bWVudCB0cmVhdG1lbnQgKi8KLQl2YXJmbGFnID0gMDsKLQlhcmdjID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaSsrKSB7Ci0JCWlmICh2YXJmbGFnKQotCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOwotCQllbHNlIHsKLQkJCXZlY3RvciBkZXNjdmVjID0KLQkJCSAgICB2ZWN0b3Jfc2xvdChtYXRjaGVkX2VsZW1lbnQtPnN0cnZlYywgaSk7Ci0KLQkJCWlmICh2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpID09IDEpIHsKLQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApOwotCi0JCQkJaWYgKENNRF9WQVJBUkcoZGVzYy0+Y21kKSkKLQkJCQkJdmFyZmxhZyA9IDE7Ci0KLQkJCQlpZiAodmFyZmxhZyB8fCBDTURfVkFSSUFCTEUoZGVzYy0+Y21kKQotCQkJCSAgICB8fCBDTURfT1BUSU9OKGRlc2MtPmNtZCkpCi0JCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKLQkJCX0gZWxzZQotCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKLQkJfQotCi0JCWlmIChhcmdjID49IENNRF9BUkdDX01BWCkKLQkJCXJldHVybiBDTURfRVJSX0VYRUVEX0FSR0NfTUFYOwotCX0KLQotCS8qIEZvciB2dHlzaCBleGVjdXRpb24uICovCi0JaWYgKGNtZCkKLQkJKmNtZCA9IG1hdGNoZWRfZWxlbWVudDsKLQotCWlmIChtYXRjaGVkX2VsZW1lbnQtPmRhZW1vbikKLQkJcmV0dXJuIENNRF9TVUNDRVNTX0RBRU1PTjsKLQotCS8qIEV4ZWN1dGUgbWF0Y2hlZCBjb21tYW5kLiAqLwotCXJldHVybiAoKm1hdGNoZWRfZWxlbWVudC0+ZnVuYykgKG1hdGNoZWRfZWxlbWVudCwgdnR5LCBhcmdjLCBhcmd2KTsKLX0KLQotaW50Ci1jbWRfZXhlY3V0ZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQsCi0JCSAgICBpbnQgdnR5c2gpCi17Ci0JaW50IHJldCwgc2F2ZWRfcmV0LCB0cmllZCA9IDA7Ci0JZW51bSBub2RlX3R5cGUgb25vZGU7Ci0Jdm9pZCAqb2luZGV4OwotCi0Jb25vZGUgPSB2dHktPm5vZGU7Ci0Jb2luZGV4ID0gdnR5LT5pbmRleDsKLQotCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgewotCQl2ZWN0b3Igc2hpZnRlZF92bGluZTsKLQkJdW5zaWduZWQgaW50IGluZGV4OwotCi0JCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOwotCQkvKiBXZSBjYW4gdHJ5IGl0IG9uIGVuYWJsZSBub2RlLCBjb3MnIHRoZSB2dHkgaXMgYXV0aGVudGljYXRlZCAqLwotCi0JCXNoaWZ0ZWRfdmxpbmUgPSB2ZWN0b3JfaW5pdCh2ZWN0b3JfY291bnQodmxpbmUpKTsKLQkJLyogdXNlIG1lbWNweT8gKi8KLQkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspIHsKLQkJCXZlY3Rvcl9zZXRfaW5kZXgoc2hpZnRlZF92bGluZSwgaW5kZXggLSAxLAotCQkJCQkgdmVjdG9yX2xvb2t1cCh2bGluZSwgaW5kZXgpKTsKLQkJfQotCi0JCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIGNtZCk7Ci0KLQkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7Ci0JCXZ0eS0+bm9kZSA9IG9ub2RlOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXNhdmVkX3JldCA9IHJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBjbWQpOwotCi0JaWYgKHZ0eXNoKQotCQlyZXR1cm4gc2F2ZWRfcmV0OwotCi0JLyogVGhpcyBhc3N1bWVzIGFsbCBub2RlcyBhYm92ZSBDT05GSUdfTk9ERSBhcmUgY2hpbGRzIG9mIENPTkZJR19OT0RFICovCi0Jd2hpbGUgKHJldCAhPSBDTURfU1VDQ0VTUyAmJiByZXQgIT0gQ01EX1dBUk5JTkcKLQkgICAgICAgJiYgdnR5LT5ub2RlID4gQ09ORklHX05PREUpIHsKLQkJdnR5X2dvX3BhcmVudCh2dHkpOwotCQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmxpbmUsIHZ0eSwgY21kKTsKLQkJdHJpZWQgPSAxOwotCQlpZiAocmV0ID09IENNRF9TVUNDRVNTIHx8IHJldCA9PSBDTURfV0FSTklORykgewotCQkJLyogc3VjY2VzZnVsbCBjb21tYW5kLCBsZWF2ZSB0aGUgbm9kZSBhcyBpcyAqLwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQkvKiBubyBjb21tYW5kIHN1Y2NlZWRlZCwgcmVzZXQgdGhlIHZ0eSB0byB0aGUgb3JpZ2luYWwgbm9kZSBhbmQKLQkgICByZXR1cm4gdGhlIGVycm9yIGZvciB0aGlzIG5vZGUgKi8KLQlpZiAodHJpZWQpIHsKLQkJdnR5LT5ub2RlID0gb25vZGU7Ci0JCXZ0eS0+aW5kZXggPSBvaW5kZXg7Ci0JfQotCXJldHVybiBzYXZlZF9yZXQ7Ci19Ci0KLS8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCByZWFkbGluZS4gKi8KLWludAotY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCi0JCQkgICBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdW5zaWduZWQgaW50IGluZGV4OwotCXZlY3RvciBjbWRfdmVjdG9yOwotCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7Ci0Jc3RydWN0IGNtZF9lbGVtZW50ICptYXRjaGVkX2VsZW1lbnQ7Ci0JdW5zaWduZWQgaW50IG1hdGNoZWRfY291bnQsIGluY29tcGxldGVfY291bnQ7Ci0JaW50IGFyZ2M7Ci0JY29uc3QgY2hhciAqYXJndltDTURfQVJHQ19NQVhdOwotCWludCB2YXJmbGFnOwotCWVudW0gbWF0Y2hfdHlwZSBtYXRjaCA9IDA7Ci0JY2hhciAqY29tbWFuZDsKLQotCS8qIE1ha2UgY29weSBvZiBjb21tYW5kIGVsZW1lbnQgKi8KLQljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKLQkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKLQkJCWludCByZXQ7Ci0KLQkJCW1hdGNoID0gY21kX2ZpbHRlcl9ieV9zdHJpbmcodmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwKLQkJCQkJCSAgICAgY21kX3ZlY3RvciwgaW5kZXgpOwotCi0JCQkvKiBJZiBjb21tYW5kIG1lZXRzICcuVkFSQVJHJyB0aGVuIGZpbmlzaCBtYXRjaGluZy4gKi8KLQkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gpCi0JCQkJYnJlYWs7Ci0KLQkJCXJldCA9Ci0JCQkgICAgaXNfY21kX2FtYmlndW91cyhjb21tYW5kLCBjbWRfdmVjdG9yLCBpbmRleCwgbWF0Y2gpOwotCQkJaWYgKHJldCA9PSAxKSB7Ci0JCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7Ci0JCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOwotCQkJfQotCQkJaWYgKHJldCA9PSAyKSB7Ci0JCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7Ci0JCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7Ci0JCQl9Ci0JCX0KLQotCS8qIENoZWNrIG1hdGNoZWQgY291bnQuICovCi0JbWF0Y2hlZF9lbGVtZW50ID0gTlVMTDsKLQltYXRjaGVkX2NvdW50ID0gMDsKLQlpbmNvbXBsZXRlX2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQotCQlpZiAodmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkgIT0gTlVMTCkgewotCQkJY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKTsKLQotCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaAotCQkJICAgIHx8IGluZGV4ID49IGNtZF9lbGVtZW50LT5jbWRzaXplKSB7Ci0JCQkJbWF0Y2hlZF9lbGVtZW50ID0gY21kX2VsZW1lbnQ7Ci0JCQkJbWF0Y2hlZF9jb3VudCsrOwotCQkJfSBlbHNlCi0JCQkJaW5jb21wbGV0ZV9jb3VudCsrOwotCQl9Ci0KLQkvKiBGaW5pc2ggb2YgdXNpbmcgY21kX3ZlY3Rvci4gKi8KLQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKLQotCS8qIFRvIGV4ZWN1dGUgY29tbWFuZCwgbWF0Y2hlZF9jb3VudCBtdXN0IGJlIDEuICovCi0JaWYgKG1hdGNoZWRfY291bnQgPT0gMCkgewotCQlpZiAoaW5jb21wbGV0ZV9jb3VudCkKLQkJCXJldHVybiBDTURfRVJSX0lOQ09NUExFVEU7Ci0JCWVsc2UKLQkJCXJldHVybiBDTURfRVJSX05PX01BVENIOwotCX0KLQotCWlmIChtYXRjaGVkX2NvdW50ID4gMSkKLQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOwotCi0JLyogQXJndW1lbnQgdHJlYXRtZW50ICovCi0JdmFyZmxhZyA9IDA7Ci0JYXJnYyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGkrKykgewotCQlpZiAodmFyZmxhZykKLQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKLQkJZWxzZSB7Ci0JCQl2ZWN0b3IgZGVzY3ZlYyA9Ci0JCQkgICAgdmVjdG9yX3Nsb3QobWF0Y2hlZF9lbGVtZW50LT5zdHJ2ZWMsIGkpOwotCi0JCQlpZiAodmVjdG9yX2FjdGl2ZShkZXNjdmVjKSA9PSAxKSB7Ci0JCQkJc3RydWN0IGRlc2MgKmRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCAwKTsKLQotCQkJCWlmIChDTURfVkFSQVJHKGRlc2MtPmNtZCkpCi0JCQkJCXZhcmZsYWcgPSAxOwotCi0JCQkJaWYgKHZhcmZsYWcgfHwgQ01EX1ZBUklBQkxFKGRlc2MtPmNtZCkKLQkJCQkgICAgfHwgQ01EX09QVElPTihkZXNjLT5jbWQpKQotCQkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7Ci0JCQl9IGVsc2UKLQkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7Ci0JCX0KLQotCQlpZiAoYXJnYyA+PSBDTURfQVJHQ19NQVgpCi0JCQlyZXR1cm4gQ01EX0VSUl9FWEVFRF9BUkdDX01BWDsKLQl9Ci0KLQkvKiBGb3IgdnR5c2ggZXhlY3V0aW9uLiAqLwotCWlmIChjbWQpCi0JCSpjbWQgPSBtYXRjaGVkX2VsZW1lbnQ7Ci0KLQlpZiAobWF0Y2hlZF9lbGVtZW50LT5kYWVtb24pCi0JCXJldHVybiBDTURfU1VDQ0VTU19EQUVNT047Ci0KLQkvKiBOb3cgZXhlY3V0ZSBtYXRjaGVkIGNvbW1hbmQgKi8KLQlyZXR1cm4gKCptYXRjaGVkX2VsZW1lbnQtPmZ1bmMpIChtYXRjaGVkX2VsZW1lbnQsIHZ0eSwgYXJnYywgYXJndik7Ci19Ci0KLS8qIENvbmZpZ3JhdGlvbiBtYWtlIGZyb20gZmlsZS4gKi8KLWludCBjb25maWdfZnJvbV9maWxlKHN0cnVjdCB2dHkgKnZ0eSwgRklMRSAqIGZwKQotewotCWludCByZXQ7Ci0JdmVjdG9yIHZsaW5lOwotCi0Jd2hpbGUgKGZnZXRzKHZ0eS0+YnVmLCBWVFlfQlVGU0laLCBmcCkpIHsKLQkJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOwotCi0JCS8qIEluIGNhc2Ugb2YgY29tbWVudCBsaW5lICovCi0JCWlmICh2bGluZSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCS8qIEV4ZWN1dGUgY29uZmlndXJhdGlvbiBjb21tYW5kIDogdGhpcyBpcyBzdHJpY3QgbWF0Y2ggKi8KLQkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7Ci0KLQkJLyogVHJ5IGFnYWluIHdpdGggc2V0dGluZyBub2RlIHRvIENPTkZJR19OT0RFICovCi0JCXdoaWxlIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCi0JCSAgICAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8KLQkJICAgICAgICYmIHZ0eS0+bm9kZSAhPSBDT05GSUdfTk9ERSkgewotCQkJdnR5X2dvX3BhcmVudCh2dHkpOwotCQkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7Ci0JCX0KLQotCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOwotCi0JCWlmIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCi0JCSAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8pCi0JCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLS8qIENvbmZpZ3JhdGlvbiBmcm9tIHRlcm1pbmFsICovCi1ERUZVTihjb25maWdfdGVybWluYWwsCi0gICAgICBjb25maWdfdGVybWluYWxfY21kLAotICAgICAgImNvbmZpZ3VyZSB0ZXJtaW5hbCIsCi0gICAgICAiQ29uZmlndXJhdGlvbiBmcm9tIHZ0eSBpbnRlcmZhY2VcbiIgIkNvbmZpZ3VyYXRpb24gdGVybWluYWxcbiIpCi17Ci0JaWYgKHZ0eV9jb25maWdfbG9jayh2dHkpKQotCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKLQllbHNlIHsKLQkJdnR5X291dCh2dHksICJWVFkgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYnkgb3RoZXIgVlRZJXMiLAotCQkJVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotLyogRW5hYmxlIGNvbW1hbmQgKi8KLURFRlVOKGVuYWJsZSwgY29uZmlnX2VuYWJsZV9jbWQsICJlbmFibGUiLCAiVHVybiBvbiBwcml2aWxlZ2VkIG1vZGUgY29tbWFuZFxuIikKLXsKLQkvKiBJZiBlbmFibGUgcGFzc3dvcmQgaXMgTlVMTCwgY2hhbmdlIHRvIEVOQUJMRV9OT0RFICovCi0JaWYgKChob3N0LmVuYWJsZSA9PSBOVUxMICYmIGhvc3QuZW5hYmxlX2VuY3J5cHQgPT0gTlVMTCkgfHwKLQkgICAgdnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWKQotCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKLQllbHNlCi0JCXZ0eS0+bm9kZSA9IEFVVEhfRU5BQkxFX05PREU7Ci0KLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLS8qIERpc2FibGUgY29tbWFuZCAqLwotREVGVU4oZGlzYWJsZSwKLSAgICAgIGNvbmZpZ19kaXNhYmxlX2NtZCwgImRpc2FibGUiLCAiVHVybiBvZmYgcHJpdmlsZWdlZCBtb2RlIGNvbW1hbmRcbiIpCi17Ci0JaWYgKHZ0eS0+bm9kZSA9PSBFTkFCTEVfTk9ERSkKLQkJdnR5LT5ub2RlID0gVklFV19OT0RFOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotLyogRG93biB2dHkgbm9kZSBsZXZlbC4gKi8KLURFRlVOKGNvbmZpZ19leGl0LAotICAgICAgY29uZmlnX2V4aXRfY21kLCAiZXhpdCIsICJFeGl0IGN1cnJlbnQgbW9kZSBhbmQgZG93biB0byBwcmV2aW91cyBtb2RlXG4iKQotewotCXN3aXRjaCAodnR5LT5ub2RlKSB7Ci0JY2FzZSBHU01ORVRfTk9ERToKLQkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7Ci0JCXZ0eS0+aW5kZXggPSBOVUxMOwotCQlicmVhazsKLQljYXNlIEJUU19OT0RFOgotCQl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKLQkJewotCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KLQkJCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OwotCQkJdnR5LT5pbmRleCA9IGJ0cy0+bmV0d29yazsKLQkJfQotCQlicmVhazsKLQljYXNlIFRSWF9OT0RFOgotCQl2dHktPm5vZGUgPSBCVFNfTk9ERTsKLQkJewotCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KLQkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKLQkJCXZ0eS0+aW5kZXggPSB0cngtPmJ0czsKLQkJfQotCQlicmVhazsKLQljYXNlIFRTX05PREU6Ci0JCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOwotCQl7Ci0JCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLwotCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7Ci0JCQl2dHktPmluZGV4ID0gdHMtPnRyeDsKLQkJfQotCQlicmVhazsKLQljYXNlIFNVQlNDUl9OT0RFOgotCQl2dHktPm5vZGUgPSBWSUVXX05PREU7Ci0JCXN1YnNjcl9wdXQodnR5LT5pbmRleCk7Ci0JCXZ0eS0+aW5kZXggPSBOVUxMOwotCQlicmVhazsKLQljYXNlIFZJRVdfTk9ERToKLQljYXNlIEVOQUJMRV9OT0RFOgotCQlpZiAoMCkJCS8vdnR5X3NoZWxsICh2dHkpKQotCQkJZXhpdCgwKTsKLQkJZWxzZQotCQkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7Ci0JCWJyZWFrOwotCWNhc2UgQ09ORklHX05PREU6Ci0JCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOwotCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOwotCQlicmVhazsKLQljYXNlIFZUWV9OT0RFOgotCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotLyogcXVpdCBpcyBhbGlhcyBvZiBleGl0LiAqLwotQUxJQVMoY29uZmlnX2V4aXQsCi0gICAgICBjb25maWdfcXVpdF9jbWQsICJxdWl0IiwgIkV4aXQgY3VycmVudCBtb2RlIGFuZCBkb3duIHRvIHByZXZpb3VzIG1vZGVcbiIpCi0KLS8qIEVuZCBvZiBjb25maWd1cmF0aW9uLiAqLwotICAgIERFRlVOKGNvbmZpZ19lbmQsCi0gICAgICBjb25maWdfZW5kX2NtZCwgImVuZCIsICJFbmQgY3VycmVudCBtb2RlIGFuZCBjaGFuZ2UgdG8gZW5hYmxlIG1vZGUuIikKLXsKLQlzd2l0Y2ggKHZ0eS0+bm9kZSkgewotCWNhc2UgVklFV19OT0RFOgotCWNhc2UgRU5BQkxFX05PREU6Ci0JCS8qIE5vdGhpbmcgdG8gZG8uICovCi0JCWJyZWFrOwotCWNhc2UgQ09ORklHX05PREU6Ci0JY2FzZSBWVFlfTk9ERToKLQkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKLQkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLS8qIFNob3cgdmVyc2lvbi4gKi8KLURFRlVOKHNob3dfdmVyc2lvbiwKLSAgICAgIHNob3dfdmVyc2lvbl9jbWQsICJzaG93IHZlcnNpb24iLCBTSE9XX1NUUiAiRGlzcGxheXMgcHJvZ3JhbSB2ZXJzaW9uXG4iKQotewotCXZ0eV9vdXQodnR5LCAiJXMgJXMgKCVzKS4lcyIsIFFVQUdHQV9QUk9HTkFNRSwgUVVBR0dBX1ZFUlNJT04sCi0JCWhvc3QubmFtZSA/IGhvc3QubmFtZSA6ICIiLCBWVFlfTkVXTElORSk7Ci0JdnR5X291dCh2dHksICIlcyVzIiwgUVVBR0dBX0NPUFlSSUdIVCwgVlRZX05FV0xJTkUpOwotCi0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi0vKiBIZWxwIGRpc3BsYXkgZnVuY3Rpb24gZm9yIGFsbCBub2RlLiAqLwotREVGVU4oY29uZmlnX2hlbHAsCi0gICAgICBjb25maWdfaGVscF9jbWQsICJoZWxwIiwgIkRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlcmFjdGl2ZSBoZWxwIHN5c3RlbVxuIikKLXsKLQl2dHlfb3V0KHZ0eSwKLQkJIlRoaXMgVlRZIHByb3ZpZGVzIGFkdmFuY2VkIGhlbHAgZmVhdHVyZXMuICBXaGVuIHlvdSBuZWVkIGhlbHAsJXNcCi1hbnl0aW1lIGF0IHRoZSBjb21tYW5kIGxpbmUgcGxlYXNlIHByZXNzICc/Jy4lc1wKLSVzXAotSWYgbm90aGluZyBtYXRjaGVzLCB0aGUgaGVscCBsaXN0IHdpbGwgYmUgZW1wdHkgYW5kIHlvdSBtdXN0IGJhY2t1cCVzXAotIHVudGlsIGVudGVyaW5nIGEgJz8nIHNob3dzIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4lc1wKLVR3byBzdHlsZXMgb2YgaGVscCBhcmUgcHJvdmlkZWQ6JXNcCi0xLiBGdWxsIGhlbHAgaXMgYXZhaWxhYmxlIHdoZW4geW91IGFyZSByZWFkeSB0byBlbnRlciBhJXNcCi1jb21tYW5kIGFyZ3VtZW50IChlLmcuICdzaG93ID8nKSBhbmQgZGVzY3JpYmVzIGVhY2ggcG9zc2libGUlc1wKLWFyZ3VtZW50LiVzXAotMi4gUGFydGlhbCBoZWxwIGlzIHByb3ZpZGVkIHdoZW4gYW4gYWJicmV2aWF0ZWQgYXJndW1lbnQgaXMgZW50ZXJlZCVzXAotICAgYW5kIHlvdSB3YW50IHRvIGtub3cgd2hhdCBhcmd1bWVudHMgbWF0Y2ggdGhlIGlucHV0JXNcCi0gICAoZS5nLiAnc2hvdyBtZT8nLiklcyVzIiwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwKLQkJVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUpOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotLyogSGVscCBkaXNwbGF5IGZ1bmN0aW9uIGZvciBhbGwgbm9kZS4gKi8KLURFRlVOKGNvbmZpZ19saXN0LCBjb25maWdfbGlzdF9jbWQsICJsaXN0IiwgIlByaW50IGNvbW1hbmQgbGlzdFxuIikKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgY21kX25vZGUgKmNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCB2dHktPm5vZGUpOwotCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kOwotCi0JZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY25vZGUtPmNtZF92ZWN0b3IpOyBpKyspCi0JCWlmICgoY21kID0gdmVjdG9yX3Nsb3QoY25vZGUtPmNtZF92ZWN0b3IsIGkpKSAhPSBOVUxMCi0JCSAgICAmJiAhKGNtZC0+YXR0ciA9PSBDTURfQVRUUl9ERVBSRUNBVEVECi0JCQkgfHwgY21kLT5hdHRyID09IENNRF9BVFRSX0hJRERFTikpCi0JCQl2dHlfb3V0KHZ0eSwgIiAgJXMlcyIsIGNtZC0+c3RyaW5nLCBWVFlfTkVXTElORSk7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi0vKiBXcml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaW50byBmaWxlLiAqLwotREVGVU4oY29uZmlnX3dyaXRlX2ZpbGUsCi0gICAgICBjb25maWdfd3JpdGVfZmlsZV9jbWQsCi0gICAgICAid3JpdGUgZmlsZSIsCi0gICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKLSAgICAgICJXcml0ZSB0byBjb25maWd1cmF0aW9uIGZpbGVcbiIpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JaW50IGZkOwotCXN0cnVjdCBjbWRfbm9kZSAqbm9kZTsKLQljaGFyICpjb25maWdfZmlsZTsKLQljaGFyICpjb25maWdfZmlsZV90bXAgPSBOVUxMOwotCWNoYXIgKmNvbmZpZ19maWxlX3NhdiA9IE5VTEw7Ci0Jc3RydWN0IHZ0eSAqZmlsZV92dHk7Ci0KLQkvKiBDaGVjayBhbmQgc2VlIGlmIHdlIGFyZSBvcGVyYXRpbmcgdW5kZXIgdnR5c2ggY29uZmlndXJhdGlvbiAqLwotCWlmIChob3N0LmNvbmZpZyA9PSBOVUxMKSB7Ci0JCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgc2F2ZSB0byBjb25maWd1cmF0aW9uIGZpbGUsIHVzaW5nIHZ0eXNoLiVzIiwKLQkJCVZUWV9ORVdMSU5FKTsKLQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCX0KLQotCS8qIEdldCBmaWxlbmFtZS4gKi8KLQljb25maWdfZmlsZSA9IGhvc3QuY29uZmlnOwotCi0JY29uZmlnX2ZpbGVfc2F2ID0KLQkgICAgX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsCi0JCQkgc3RybGVuKGNvbmZpZ19maWxlKSArIHN0cmxlbihDT05GX0JBQ0tVUF9FWFQpICsgMSwKLQkJCSAiY29uZmlnX2ZpbGVfc2F2Iik7Ci0Jc3RyY3B5KGNvbmZpZ19maWxlX3NhdiwgY29uZmlnX2ZpbGUpOwotCXN0cmNhdChjb25maWdfZmlsZV9zYXYsIENPTkZfQkFDS1VQX0VYVCk7Ci0KLQljb25maWdfZmlsZV90bXAgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RybGVuKGNvbmZpZ19maWxlKSArIDgsCi0JCQkJCSJjb25maWdfZmlsZV90bXAiKTsKLQlzcHJpbnRmKGNvbmZpZ19maWxlX3RtcCwgIiVzLlhYWFhYWCIsIGNvbmZpZ19maWxlKTsKLQotCS8qIE9wZW4gZmlsZSB0byBjb25maWd1cmF0aW9uIHdyaXRlLiAqLwotCWZkID0gbWtzdGVtcChjb25maWdfZmlsZV90bXApOwotCWlmIChmZCA8IDApIHsKLQkJdnR5X291dCh2dHksICJDYW4ndCBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCi0JCQljb25maWdfZmlsZV90bXAsIFZUWV9ORVdMSU5FKTsKLQkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKLQkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKLQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCX0KLQotCS8qIE1ha2UgdnR5IGZvciBjb25maWd1cmF0aW9uIGZpbGUuICovCi0JZmlsZV92dHkgPSB2dHlfbmV3KCk7Ci0JZmlsZV92dHktPmZkID0gZmQ7Ci0JZmlsZV92dHktPnR5cGUgPSBWVFlfRklMRTsKLQotCS8qIENvbmZpZyBmaWxlIGhlYWRlciBwcmludC4gKi8KLQl2dHlfb3V0KGZpbGVfdnR5LCAiIVxuISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHlcbiEgICAiKTsKLQkvL3Z0eV90aW1lX3ByaW50IChmaWxlX3Z0eSwgMSk7Ci0JdnR5X291dChmaWxlX3Z0eSwgIiFcbiIpOwotCi0JZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQotCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jKSB7Ci0JCQlpZiAoKCpub2RlLT5mdW5jKSAoZmlsZV92dHkpKQotCQkJCXZ0eV9vdXQoZmlsZV92dHksICIhXG4iKTsKLQkJfQotCXZ0eV9jbG9zZShmaWxlX3Z0eSk7Ci0KLQlpZiAodW5saW5rKGNvbmZpZ19maWxlX3NhdikgIT0gMCkKLQkJaWYgKGVycm5vICE9IEVOT0VOVCkgewotCQkJdnR5X291dCh2dHksCi0JCQkJIkNhbid0IHVubGluayBiYWNrdXAgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKLQkJCQljb25maWdfZmlsZV9zYXYsIFZUWV9ORVdMSU5FKTsKLQkJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7Ci0JCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOwotCQkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7Ci0JCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JCX0KLQlpZiAobGluayhjb25maWdfZmlsZSwgY29uZmlnX2ZpbGVfc2F2KSAhPSAwKSB7Ci0JCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgYmFja3VwIG9sZCBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAotCQkJY29uZmlnX2ZpbGVfc2F2LCBWVFlfTkVXTElORSk7Ci0JCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7Ci0JCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7Ci0JCXVubGluayhjb25maWdfZmlsZV90bXApOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCXN5bmMoKTsKLQlpZiAodW5saW5rKGNvbmZpZ19maWxlKSAhPSAwKSB7Ci0JCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgdW5saW5rIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCi0JCQljb25maWdfZmlsZSwgVlRZX05FV0xJTkUpOwotCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOwotCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOwotCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKLQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCX0KLQlpZiAobGluayhjb25maWdfZmlsZV90bXAsIGNvbmZpZ19maWxlKSAhPSAwKSB7Ci0JCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgc2F2ZSBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLCBjb25maWdfZmlsZSwKLQkJCVZUWV9ORVdMSU5FKTsKLQkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKLQkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKLQkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7Ci0JCXJldHVybiBDTURfV0FSTklORzsKLQl9Ci0JdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7Ci0Jc3luYygpOwotCi0JdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKLQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOwotCi0JaWYgKGNobW9kKGNvbmZpZ19maWxlLCAwNjY2ICYgfkNPTkZJR0ZJTEVfTUFTSykgIT0gMCkgewotCQl2dHlfb3V0KHZ0eSwgIkNhbid0IGNobW9kIGNvbmZpZ3VyYXRpb24gZmlsZSAlczogJXMgKCVkKS4lcyIsCi0JCQljb25maWdfZmlsZSwgc3RyZXJyb3IoZXJybm8pLCBlcnJubywgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JdnR5X291dCh2dHksICJDb25maWd1cmF0aW9uIHNhdmVkIHRvICVzJXMiLCBjb25maWdfZmlsZSwgVlRZX05FV0xJTkUpOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCi0gICAgICBjb25maWdfd3JpdGVfY21kLAotICAgICAgIndyaXRlIiwgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iKQotCi0gICAgQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCi0gICAgICBjb25maWdfd3JpdGVfbWVtb3J5X2NtZCwKLSAgICAgICJ3cml0ZSBtZW1vcnkiLAotICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCi0gICAgICAiV3JpdGUgY29uZmlndXJhdGlvbiB0byB0aGUgZmlsZSAoc2FtZSBhcyB3cml0ZSBmaWxlKVxuIikKLQotICAgIEFMSUFTKGNvbmZpZ193cml0ZV9maWxlLAotICAgICAgY29weV9ydW5uaW5nY29uZmlnX3N0YXJ0dXBjb25maWdfY21kLAotICAgICAgImNvcHkgcnVubmluZy1jb25maWcgc3RhcnR1cC1jb25maWciLAotICAgICAgIkNvcHkgY29uZmlndXJhdGlvblxuIgotICAgICAgIkNvcHkgcnVubmluZyBjb25maWcgdG8uLi4gXG4iCi0gICAgICAiQ29weSBydW5uaW5nIGNvbmZpZyB0byBzdGFydHVwIGNvbmZpZyAoc2FtZSBhcyB3cml0ZSBmaWxlKVxuIikKLQotLyogV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGludG8gdGhlIHRlcm1pbmFsLiAqLwotICAgIERFRlVOKGNvbmZpZ193cml0ZV90ZXJtaW5hbCwKLSAgICAgIGNvbmZpZ193cml0ZV90ZXJtaW5hbF9jbWQsCi0gICAgICAid3JpdGUgdGVybWluYWwiLAotICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCi0gICAgICAiV3JpdGUgdG8gdGVybWluYWxcbiIpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGNtZF9ub2RlICpub2RlOwotCi0JaWYgKHZ0eS0+dHlwZSA9PSBWVFlfU0hFTExfU0VSVikgewotCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCi0JCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jCi0JCQkgICAgJiYgbm9kZS0+dnR5c2gpIHsKLQkJCQlpZiAoKCpub2RlLT5mdW5jKSAodnR5KSkKLQkJCQkJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7Ci0JCQl9Ci0JfSBlbHNlIHsKLQkJdnR5X291dCh2dHksICIlc0N1cnJlbnQgY29uZmlndXJhdGlvbjolcyIsIFZUWV9ORVdMSU5FLAotCQkJVlRZX05FV0xJTkUpOwotCQl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCi0JCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jKSB7Ci0JCQkJaWYgKCgqbm9kZS0+ZnVuYykgKHZ0eSkpCi0JCQkJCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOwotCQkJfQotCQl2dHlfb3V0KHZ0eSwgImVuZCVzIiwgVlRZX05FV0xJTkUpOwotCX0KLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLS8qIFdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0ZXJtaW5hbC4gKi8KLUFMSUFTKGNvbmZpZ193cml0ZV90ZXJtaW5hbCwKLSAgICAgIHNob3dfcnVubmluZ19jb25maWdfY21kLAotICAgICAgInNob3cgcnVubmluZy1jb25maWciLCBTSE9XX1NUUiAicnVubmluZyBjb25maWd1cmF0aW9uXG4iKQotCi0vKiBXcml0ZSBzdGFydHVwIGNvbmZpZ3VyYXRpb24gaW50byB0aGUgdGVybWluYWwuICovCi0gICAgREVGVU4oc2hvd19zdGFydHVwX2NvbmZpZywKLSAgICAgIHNob3dfc3RhcnR1cF9jb25maWdfY21kLAotICAgICAgInNob3cgc3RhcnR1cC1jb25maWciLCBTSE9XX1NUUiAiQ29udGVudGVzIG9mIHN0YXJ0dXAgY29uZmlndXJhdGlvblxuIikKLXsKLQljaGFyIGJ1ZltCVUZTSVpdOwotCUZJTEUgKmNvbmZwOwotCi0JY29uZnAgPSBmb3Blbihob3N0LmNvbmZpZywgInIiKTsKLQlpZiAoY29uZnAgPT0gTlVMTCkgewotCQl2dHlfb3V0KHZ0eSwgIkNhbid0IG9wZW4gY29uZmlndXJhdGlvbiBmaWxlIFslc10lcyIsCi0JCQlob3N0LmNvbmZpZywgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0Jd2hpbGUgKGZnZXRzKGJ1ZiwgQlVGU0laLCBjb25mcCkpIHsKLQkJY2hhciAqY3AgPSBidWY7Ci0KLQkJd2hpbGUgKCpjcCAhPSAnXHInICYmICpjcCAhPSAnXG4nICYmICpjcCAhPSAnXDAnKQotCQkJY3ArKzsKLQkJKmNwID0gJ1wwJzsKLQotCQl2dHlfb3V0KHZ0eSwgIiVzJXMiLCBidWYsIFZUWV9ORVdMSU5FKTsKLQl9Ci0KLQlmY2xvc2UoY29uZnApOwotCi0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi0vKiBIb3N0bmFtZSBjb25maWd1cmF0aW9uICovCi1ERUZVTihjb25maWdfaG9zdG5hbWUsCi0gICAgICBob3N0bmFtZV9jbWQsCi0gICAgICAiaG9zdG5hbWUgV09SRCIsCi0gICAgICAiU2V0IHN5c3RlbSdzIG5ldHdvcmsgbmFtZVxuIiAiVGhpcyBzeXN0ZW0ncyBuZXR3b3JrIG5hbWVcbiIpCi17Ci0JaWYgKCFpc2FscGhhKChpbnQpKmFyZ3ZbMF0pKSB7Ci0JCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFiZXQlcyIsCi0JCQlWVFlfTkVXTElORSk7Ci0JCXJldHVybiBDTURfV0FSTklORzsKLQl9Ci0KLQlpZiAoaG9zdC5uYW1lKQotCQl0YWxsb2NfZnJlZShob3N0Lm5hbWUpOwotCi0JaG9zdC5uYW1lID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOKGNvbmZpZ19ub19ob3N0bmFtZSwKLSAgICAgIG5vX2hvc3RuYW1lX2NtZCwKLSAgICAgICJubyBob3N0bmFtZSBbSE9TVE5BTUVdIiwKLSAgICAgIE5PX1NUUiAiUmVzZXQgc3lzdGVtJ3MgbmV0d29yayBuYW1lXG4iICJIb3N0IG5hbWUgb2YgdGhpcyByb3V0ZXJcbiIpCi17Ci0JaWYgKGhvc3QubmFtZSkKLQkJdGFsbG9jX2ZyZWUoaG9zdC5uYW1lKTsKLQlob3N0Lm5hbWUgPSBOVUxMOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotLyogVlRZIGludGVyZmFjZSBwYXNzd29yZCBzZXQuICovCi1ERUZVTihjb25maWdfcGFzc3dvcmQsIHBhc3N3b3JkX2NtZCwKLSAgICAgICJwYXNzd29yZCAoOHwpIFdPUkQiLAotICAgICAgIkFzc2lnbiB0aGUgdGVybWluYWwgY29ubmVjdGlvbiBwYXNzd29yZFxuIgotICAgICAgIlNwZWNpZmllcyBhIEhJRERFTiBwYXNzd29yZCB3aWxsIGZvbGxvd1xuIgotICAgICAgImR1bW15IHN0cmluZyBcbiIgIlRoZSBISURERU4gbGluZSBwYXNzd29yZCBzdHJpbmdcbiIpCi17Ci0JLyogQXJndW1lbnQgY2hlY2suICovCi0JaWYgKGFyZ2MgPT0gMCkgewotCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHBhc3N3b3JkLiVzIiwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JaWYgKGFyZ2MgPT0gMikgewotCQlpZiAoKmFyZ3ZbMF0gPT0gJzgnKSB7Ci0JCQlpZiAoaG9zdC5wYXNzd29yZCkKLQkJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkKTsKLQkJCWhvc3QucGFzc3dvcmQgPSBOVUxMOwotCQkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKLQkJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOwotCQkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzFdKTsKLQkJCXJldHVybiBDTURfU1VDQ0VTUzsKLQkJfSBlbHNlIHsKLQkJCXZ0eV9vdXQodnR5LCAiVW5rbm93biBlbmNyeXB0aW9uIHR5cGUuJXMiLCBWVFlfTkVXTElORSk7Ci0JCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JCX0KLQl9Ci0KLQlpZiAoIWlzYWxudW0oKGludCkqYXJndlswXSkpIHsKLQkJdnR5X291dCh2dHksCi0JCQkiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFudW1lcmljJXMiLAotCQkJVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JaWYgKGhvc3QucGFzc3dvcmQpCi0JCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmQpOwotCWhvc3QucGFzc3dvcmQgPSBOVUxMOwotCi0jaWZkZWYgVlRZX0NSWVBUX1BXCi0JaWYgKGhvc3QuZW5jcnlwdCkgewotCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQotCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKLQkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChhcmd2WzBdKSk7Ci0JfSBlbHNlCi0jZW5kaWYKLQkJaG9zdC5wYXNzd29yZCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7Ci0KLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLUFMSUFTKGNvbmZpZ19wYXNzd29yZCwgcGFzc3dvcmRfdGV4dF9jbWQsCi0gICAgICAicGFzc3dvcmQgTElORSIsCi0gICAgICAiQXNzaWduIHRoZSB0ZXJtaW5hbCBjb25uZWN0aW9uIHBhc3N3b3JkXG4iCi0gICAgICAiVGhlIFVORU5DUllQVEVEIChjbGVhcnRleHQpIGxpbmUgcGFzc3dvcmRcbiIpCi0KLS8qIFZUWSBlbmFibGUgcGFzc3dvcmQgc2V0LiAqLwotICAgIERFRlVOKGNvbmZpZ19lbmFibGVfcGFzc3dvcmQsIGVuYWJsZV9wYXNzd29yZF9jbWQsCi0gICAgICAiZW5hYmxlIHBhc3N3b3JkICg4fCkgV09SRCIsCi0gICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCi0gICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iCi0gICAgICAiU3BlY2lmaWVzIGEgSElEREVOIHBhc3N3b3JkIHdpbGwgZm9sbG93XG4iCi0gICAgICAiZHVtbXkgc3RyaW5nIFxuIiAiVGhlIEhJRERFTiAnZW5hYmxlJyBwYXNzd29yZCBzdHJpbmdcbiIpCi17Ci0JLyogQXJndW1lbnQgY2hlY2suICovCi0JaWYgKGFyZ2MgPT0gMCkgewotCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHBhc3N3b3JkLiVzIiwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCi0JLyogQ3J5cHQgdHlwZSBpcyBzcGVjaWZpZWQuICovCi0JaWYgKGFyZ2MgPT0gMikgewotCQlpZiAoKmFyZ3ZbMF0gPT0gJzgnKSB7Ci0JCQlpZiAoaG9zdC5lbmFibGUpCi0JCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOwotCQkJaG9zdC5lbmFibGUgPSBOVUxMOwotCi0JCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKLQkJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKLQkJCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMV0pOwotCi0JCQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci0JCX0gZWxzZSB7Ci0JCQl2dHlfb3V0KHZ0eSwgIlVua25vd24gZW5jcnlwdGlvbiB0eXBlLiVzIiwgVlRZX05FV0xJTkUpOwotCQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCQl9Ci0JfQotCi0JaWYgKCFpc2FsbnVtKChpbnQpKmFyZ3ZbMF0pKSB7Ci0JCXZ0eV9vdXQodnR5LAotCQkJIlBsZWFzZSBzcGVjaWZ5IHN0cmluZyBzdGFydGluZyB3aXRoIGFscGhhbnVtZXJpYyVzIiwKLQkJCVZUWV9ORVdMSU5FKTsKLQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCX0KLQotCWlmIChob3N0LmVuYWJsZSkKLQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOwotCWhvc3QuZW5hYmxlID0gTlVMTDsKLQotCS8qIFBsYWluIHBhc3N3b3JkIGlucHV0LiAqLwotI2lmZGVmIFZUWV9DUllQVF9QVwotCWlmIChob3N0LmVuY3J5cHQpIHsKLQkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCi0JCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKLQkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoYXJndlswXSkpOwotCX0gZWxzZQotI2VuZGlmCi0JCWhvc3QuZW5hYmxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKLQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotQUxJQVMoY29uZmlnX2VuYWJsZV9wYXNzd29yZCwKLSAgICAgIGVuYWJsZV9wYXNzd29yZF90ZXh0X2NtZCwKLSAgICAgICJlbmFibGUgcGFzc3dvcmQgTElORSIsCi0gICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCi0gICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iCi0gICAgICAiVGhlIFVORU5DUllQVEVEIChjbGVhcnRleHQpICdlbmFibGUnIHBhc3N3b3JkXG4iKQotCi0vKiBWVFkgZW5hYmxlIHBhc3N3b3JkIGRlbGV0ZS4gKi8KLSAgICBERUZVTihub19jb25maWdfZW5hYmxlX3Bhc3N3b3JkLCBub19lbmFibGVfcGFzc3dvcmRfY21kLAotICAgICAgIm5vIGVuYWJsZSBwYXNzd29yZCIsCi0gICAgICBOT19TVFIKLSAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKLSAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIpCi17Ci0JaWYgKGhvc3QuZW5hYmxlKQotCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7Ci0JaG9zdC5lbmFibGUgPSBOVUxMOwotCi0JaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCi0JCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOwotCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSBOVUxMOwotCi0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi0jaWZkZWYgVlRZX0NSWVBUX1BXCi1ERUZVTihzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHQsCi0gICAgICBzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kLAotICAgICAgInNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiIsCi0gICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGVuY3J5cHRlZCBwYXNzd29yZHNcbiIpCi17Ci0JaWYgKGhvc3QuZW5jcnlwdCkKLQkJcmV0dXJuIENNRF9TVUNDRVNTOwotCi0JaG9zdC5lbmNyeXB0ID0gMTsKLQotCWlmIChob3N0LnBhc3N3b3JkKSB7Ci0JCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCi0JCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOwotCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGhvc3QucGFzc3dvcmQpKTsKLQl9Ci0JaWYgKGhvc3QuZW5hYmxlKSB7Ci0JCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQotCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7Ci0JCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGhvc3QuZW5hYmxlKSk7Ci0JfQotCi0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHQsCi0gICAgICBub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kLAotICAgICAgIm5vIHNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiIsCi0gICAgICBOT19TVFIgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBlbmNyeXB0ZWQgcGFzc3dvcmRzXG4iKQotewotCWlmICghaG9zdC5lbmNyeXB0KQotCQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci0KLQlob3N0LmVuY3J5cHQgPSAwOwotCi0JaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKLQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKLQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSBOVUxMOwotCi0JaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCi0JCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOwotCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSBOVUxMOwotCi0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotI2VuZGlmCi0KLURFRlVOKGNvbmZpZ190ZXJtaW5hbF9sZW5ndGgsIGNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kLAotICAgICAgInRlcm1pbmFsIGxlbmd0aCA8MC01MTI+IiwKLSAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCi0gICAgICAiU2V0IG51bWJlciBvZiBsaW5lcyBvbiBhIHNjcmVlblxuIgotICAgICAgIk51bWJlciBvZiBsaW5lcyBvbiBzY3JlZW4gKDAgZm9yIG5vIHBhdXNpbmcpXG4iKQotewotCWludCBsaW5lczsKLQljaGFyICplbmRwdHIgPSBOVUxMOwotCi0JbGluZXMgPSBzdHJ0b2woYXJndlswXSwgJmVuZHB0ciwgMTApOwotCWlmIChsaW5lcyA8IDAgfHwgbGluZXMgPiA1MTIgfHwgKmVuZHB0ciAhPSAnXDAnKSB7Ci0JCXZ0eV9vdXQodnR5LCAibGVuZ3RoIGlzIG1hbGZvcm1lZCVzIiwgVlRZX05FV0xJTkUpOwotCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JfQotCXZ0eS0+bGluZXMgPSBsaW5lczsKLQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4oY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aCwgY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aF9jbWQsCi0gICAgICAidGVybWluYWwgbm8gbGVuZ3RoIiwKLSAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCi0gICAgICBOT19TVFIgIlNldCBudW1iZXIgb2YgbGluZXMgb24gYSBzY3JlZW5cbiIpCi17Ci0JdnR5LT5saW5lcyA9IC0xOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4oc2VydmljZV90ZXJtaW5hbF9sZW5ndGgsIHNlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCwKLSAgICAgICJzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCA8MC01MTI+IiwKLSAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iCi0gICAgICAiU3lzdGVtIHdpZGUgdGVybWluYWwgbGVuZ3RoIGNvbmZpZ3VyYXRpb25cbiIKLSAgICAgICJOdW1iZXIgb2YgbGluZXMgb2YgVlRZICgwIG1lYW5zIG5vIGxpbmUgY29udHJvbClcbiIpCi17Ci0JaW50IGxpbmVzOwotCWNoYXIgKmVuZHB0ciA9IE5VTEw7Ci0KLQlsaW5lcyA9IHN0cnRvbChhcmd2WzBdLCAmZW5kcHRyLCAxMCk7Ci0JaWYgKGxpbmVzIDwgMCB8fCBsaW5lcyA+IDUxMiB8fCAqZW5kcHRyICE9ICdcMCcpIHsKLQkJdnR5X291dCh2dHksICJsZW5ndGggaXMgbWFsZm9ybWVkJXMiLCBWVFlfTkVXTElORSk7Ci0JCXJldHVybiBDTURfV0FSTklORzsKLQl9Ci0JaG9zdC5saW5lcyA9IGxpbmVzOwotCi0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aCwgbm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kLAotICAgICAgIm5vIHNlcnZpY2UgdGVybWluYWwtbGVuZ3RoIFs8MC01MTI+XSIsCi0gICAgICBOT19TVFIKLSAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iCi0gICAgICAiU3lzdGVtIHdpZGUgdGVybWluYWwgbGVuZ3RoIGNvbmZpZ3VyYXRpb25cbiIKLSAgICAgICJOdW1iZXIgb2YgbGluZXMgb2YgVlRZICgwIG1lYW5zIG5vIGxpbmUgY29udHJvbClcbiIpCi17Ci0JaG9zdC5saW5lcyA9IC0xOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU5fSElEREVOKGRvX2VjaG8sCi0JICAgICBlY2hvX2NtZCwKLQkgICAgICJlY2hvIC5NRVNTQUdFIiwKLQkgICAgICJFY2hvIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSB2dHlcbiIgIlRoZSBtZXNzYWdlIHRvIGVjaG9cbiIpCi17Ci0JY2hhciAqbWVzc2FnZTsKLQotCXZ0eV9vdXQodnR5LCAiJXMlcyIsCi0JCSgobWVzc2FnZSA9Ci0JCSAgYXJndl9jb25jYXQoYXJndiwgYXJnYywgMCkpID8gbWVzc2FnZSA6ICIiKSwgVlRZX05FV0xJTkUpOwotCWlmIChtZXNzYWdlKQotCQl0YWxsb2NfZnJlZShtZXNzYWdlKTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLSNpZiAwCi1ERUZVTihjb25maWdfbG9nbXNnLAotICAgICAgY29uZmlnX2xvZ21zZ19jbWQsCi0gICAgICAibG9nbXNnICIgTE9HX0xFVkVMUyAiIC5NRVNTQUdFIiwKLSAgICAgICJTZW5kIGEgbWVzc2FnZSB0byBlbmFibGVkIGxvZ2dpbmcgZGVzdGluYXRpb25zXG4iCi0gICAgICBMT0dfTEVWRUxfREVTQyAiVGhlIG1lc3NhZ2UgdG8gc2VuZFxuIikKLXsKLQlpbnQgbGV2ZWw7Ci0JY2hhciAqbWVzc2FnZTsKLQotCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKLQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7Ci0KLQl6bG9nKE5VTEwsIGxldmVsLAotCSAgICAgKChtZXNzYWdlID0gYXJndl9jb25jYXQoYXJndiwgYXJnYywgMSkpID8gbWVzc2FnZSA6ICIiKSk7Ci0JaWYgKG1lc3NhZ2UpCi0JCXRhbGxvY19mcmVlKG1lc3NhZ2UpOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4oc2hvd19sb2dnaW5nLAotICAgICAgc2hvd19sb2dnaW5nX2NtZCwKLSAgICAgICJzaG93IGxvZ2dpbmciLCBTSE9XX1NUUiAiU2hvdyBjdXJyZW50IGxvZ2dpbmcgY29uZmlndXJhdGlvblxuIikKLXsKLQlzdHJ1Y3QgemxvZyAqemwgPSB6bG9nX2RlZmF1bHQ7Ci0KLQl2dHlfb3V0KHZ0eSwgIlN5c2xvZyBsb2dnaW5nOiAiKTsKLQlpZiAoemwtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXSA9PSBaTE9HX0RJU0FCTEVEKQotCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7Ci0JZWxzZQotCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzLCBmYWNpbGl0eSAlcywgaWRlbnQgJXMiLAotCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddXSwKLQkJCWZhY2lsaXR5X25hbWUoemwtPmZhY2lsaXR5KSwgemwtPmlkZW50KTsKLQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOwotCi0JdnR5X291dCh2dHksICJTdGRvdXQgbG9nZ2luZzogIik7Ci0JaWYgKHpsLT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF0gPT0gWkxPR19ESVNBQkxFRCkKLQkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOwotCWVsc2UKLQkJdnR5X291dCh2dHksICJsZXZlbCAlcyIsCi0JCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF1dKTsKLQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOwotCi0JdnR5X291dCh2dHksICJNb25pdG9yIGxvZ2dpbmc6ICIpOwotCWlmICh6bC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXSA9PSBaTE9HX0RJU0FCTEVEKQotCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7Ci0JZWxzZQotCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzIiwKLQkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl1dKTsKLQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOwotCi0JdnR5X291dCh2dHksICJGaWxlIGxvZ2dpbmc6ICIpOwotCWlmICgoemwtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gPT0gWkxPR19ESVNBQkxFRCkgfHwgIXpsLT5mcCkKLQkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOwotCWVsc2UKLQkJdnR5X291dCh2dHksICJsZXZlbCAlcywgZmlsZW5hbWUgJXMiLAotCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9GSUxFXV0sCi0JCQl6bC0+ZmlsZW5hbWUpOwotCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7Ci0KLQl2dHlfb3V0KHZ0eSwgIlByb3RvY29sIG5hbWU6ICVzJXMiLAotCQl6bG9nX3Byb3RvX25hbWVzW3psLT5wcm90b2NvbF0sIFZUWV9ORVdMSU5FKTsKLQl2dHlfb3V0KHZ0eSwgIlJlY29yZCBwcmlvcml0eTogJXMlcyIsCi0JCSh6bC0+cmVjb3JkX3ByaW9yaXR5ID8gImVuYWJsZWQiIDogImRpc2FibGVkIiksIFZUWV9ORVdMSU5FKTsKLQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4oY29uZmlnX2xvZ19zdGRvdXQsCi0gICAgICBjb25maWdfbG9nX3N0ZG91dF9jbWQsCi0gICAgICAibG9nIHN0ZG91dCIsICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzdGRvdXQgbG9nZ2luZyBsZXZlbFxuIikKLXsKLQl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOKGNvbmZpZ19sb2dfc3Rkb3V0X2xldmVsLAotICAgICAgY29uZmlnX2xvZ19zdGRvdXRfbGV2ZWxfY21kLAotICAgICAgImxvZyBzdGRvdXQgIiBMT0dfTEVWRUxTLAotICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN0ZG91dCBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQotewotCWludCBsZXZlbDsKLQotCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKLQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7Ci0JemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgbGV2ZWwpOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4obm9fY29uZmlnX2xvZ19zdGRvdXQsCi0gICAgICBub19jb25maWdfbG9nX3N0ZG91dF9jbWQsCi0gICAgICAibm8gbG9nIHN0ZG91dCBbTEVWRUxdIiwKLSAgICAgIE5PX1NUUiAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBzdGRvdXRcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCi17Ci0JemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgWkxPR19ESVNBQkxFRCk7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihjb25maWdfbG9nX21vbml0b3IsCi0gICAgICBjb25maWdfbG9nX21vbml0b3JfY21kLAotICAgICAgImxvZyBtb25pdG9yIiwKLSAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nIGxldmVsXG4iKQotewotCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9NT05JVE9SLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOKGNvbmZpZ19sb2dfbW9uaXRvcl9sZXZlbCwKLSAgICAgIGNvbmZpZ19sb2dfbW9uaXRvcl9sZXZlbF9jbWQsCi0gICAgICAibG9nIG1vbml0b3IgIiBMT0dfTEVWRUxTLAotICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgotICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQotewotCWludCBsZXZlbDsKLQotCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKLQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7Ci0JemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIGxldmVsKTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOKG5vX2NvbmZpZ19sb2dfbW9uaXRvciwKLSAgICAgIG5vX2NvbmZpZ19sb2dfbW9uaXRvcl9jbWQsCi0gICAgICAibm8gbG9nIG1vbml0b3IgW0xFVkVMXSIsCi0gICAgICBOT19TVFIKLSAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKLSAgICAgICJEaXNhYmxlIHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmdcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCi17Ci0JemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIFpMT0dfRElTQUJMRUQpOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBzZXRfbG9nX2ZpbGUoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpmbmFtZSwgaW50IGxvZ2xldmVsKQotewotCWludCByZXQ7Ci0JY2hhciAqcCA9IE5VTEw7Ci0JY29uc3QgY2hhciAqZnVsbHBhdGg7Ci0KLQkvKiBQYXRoIGRldGVjdGlvbi4gKi8KLQlpZiAoIUlTX0RJUkVDVE9SWV9TRVAoKmZuYW1lKSkgewotCQljaGFyIGN3ZFtNQVhQQVRITEVOICsgMV07Ci0JCWN3ZFtNQVhQQVRITEVOXSA9ICdcMCc7Ci0KLQkJaWYgKGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pID09IE5VTEwpIHsKLQkJCXpsb2dfZXJyKCJjb25maWdfbG9nX2ZpbGU6IFVuYWJsZSB0byBhbGxvYyBtZW0hIik7Ci0JCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JCX0KLQotCQlpZiAoKHAgPSBfdGFsbG9jX3plcm8odGFsbF92Y21kX2N0eCwKLQkJCQkgICAgICBzdHJsZW4oY3dkKSArIHN0cmxlbihmbmFtZSkgKyAyKSwKLQkJCQkgICAgICAic2V0X2xvZ19maWxlIikKLQkJICAgID09IE5VTEwpIHsKLQkJCXpsb2dfZXJyKCJjb25maWdfbG9nX2ZpbGU6IFVuYWJsZSB0byBhbGxvYyBtZW0hIik7Ci0JCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0JCX0KLQkJc3ByaW50ZihwLCAiJXMvJXMiLCBjd2QsIGZuYW1lKTsKLQkJZnVsbHBhdGggPSBwOwotCX0gZWxzZQotCQlmdWxscGF0aCA9IGZuYW1lOwotCi0JcmV0ID0gemxvZ19zZXRfZmlsZShOVUxMLCBmdWxscGF0aCwgbG9nbGV2ZWwpOwotCi0JaWYgKHApCi0JCXRhbGxvY19mcmVlKHApOwotCi0JaWYgKCFyZXQpIHsKLQkJdnR5X291dCh2dHksICJjYW4ndCBvcGVuIGxvZ2ZpbGUgJXNcbiIsIGZuYW1lKTsKLQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCX0KLQotCWlmIChob3N0LmxvZ2ZpbGUpCi0JCXRhbGxvY19mcmVlKGhvc3QubG9nZmlsZSk7Ci0KLQlob3N0LmxvZ2ZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGZuYW1lKTsKLQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4oY29uZmlnX2xvZ19maWxlLAotICAgICAgY29uZmlnX2xvZ19maWxlX2NtZCwKLSAgICAgICJsb2cgZmlsZSBGSUxFTkFNRSIsCi0gICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJMb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZW5hbWVcbiIpCi17Ci0JcmV0dXJuIHNldF9sb2dfZmlsZSh2dHksIGFyZ3ZbMF0sIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOwotfQotCi1ERUZVTihjb25maWdfbG9nX2ZpbGVfbGV2ZWwsCi0gICAgICBjb25maWdfbG9nX2ZpbGVfbGV2ZWxfY21kLAotICAgICAgImxvZyBmaWxlIEZJTEVOQU1FICIgTE9HX0xFVkVMUywKLSAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKLSAgICAgICJMb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZW5hbWVcbiIgTE9HX0xFVkVMX0RFU0MpCi17Ci0JaW50IGxldmVsOwotCi0JaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMV0pKSA9PSBaTE9HX0RJU0FCTEVEKQotCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKLQlyZXR1cm4gc2V0X2xvZ19maWxlKHZ0eSwgYXJndlswXSwgbGV2ZWwpOwotfQotCi1ERUZVTihub19jb25maWdfbG9nX2ZpbGUsCi0gICAgICBub19jb25maWdfbG9nX2ZpbGVfY21kLAotICAgICAgIm5vIGxvZyBmaWxlIFtGSUxFTkFNRV0iLAotICAgICAgTk9fU1RSCi0gICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGUgbmFtZVxuIikKLXsKLQl6bG9nX3Jlc2V0X2ZpbGUoTlVMTCk7Ci0KLQlpZiAoaG9zdC5sb2dmaWxlKQotCQl0YWxsb2NfZnJlZShob3N0LmxvZ2ZpbGUpOwotCi0JaG9zdC5sb2dmaWxlID0gTlVMTDsKLQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotQUxJQVMobm9fY29uZmlnX2xvZ19maWxlLAotICAgICAgbm9fY29uZmlnX2xvZ19maWxlX2xldmVsX2NtZCwKLSAgICAgICJubyBsb2cgZmlsZSBGSUxFTkFNRSBMRVZFTCIsCi0gICAgICBOT19TVFIKLSAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKLSAgICAgICJDYW5jZWwgbG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGUgbmFtZVxuIiAiTG9nZ2luZyBsZXZlbFxuIikKLQotICAgIERFRlVOKGNvbmZpZ19sb2dfc3lzbG9nLAotICAgICAgY29uZmlnX2xvZ19zeXNsb2dfY21kLAotICAgICAgImxvZyBzeXNsb2ciLCAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3lzbG9nIGxvZ2dpbmcgbGV2ZWxcbiIpCi17Ci0JemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihjb25maWdfbG9nX3N5c2xvZ19sZXZlbCwKLSAgICAgIGNvbmZpZ19sb2dfc3lzbG9nX2xldmVsX2NtZCwKLSAgICAgICJsb2cgc3lzbG9nICIgTE9HX0xFVkVMUywKLSAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzeXNsb2cgbG9nZ2luZyBsZXZlbFxuIiBMT0dfTEVWRUxfREVTQykKLXsKLQlpbnQgbGV2ZWw7Ci0KLQlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCi0JCXJldHVybiBDTURfRVJSX05PX01BVENIOwotCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIGxldmVsKTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOX0RFUFJFQ0FURUQoY29uZmlnX2xvZ19zeXNsb2dfZmFjaWxpdHksCi0JCSBjb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eV9jbWQsCi0JCSAibG9nIHN5c2xvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAotCQkgIkxvZ2dpbmcgY29udHJvbFxuIgotCQkgIkxvZ2dpbmcgZ29lcyB0byBzeXNsb2dcbiIKLQkJICIoRGVwcmVjYXRlZCkgRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIKLQkJIExPR19GQUNJTElUWV9ERVNDKQotewotCWludCBmYWNpbGl0eTsKLQotCWlmICgoZmFjaWxpdHkgPSBmYWNpbGl0eV9tYXRjaChhcmd2WzBdKSkgPCAwKQotCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKLQotCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOwotCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBmYWNpbGl0eTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOKG5vX2NvbmZpZ19sb2dfc3lzbG9nLAotICAgICAgbm9fY29uZmlnX2xvZ19zeXNsb2dfY21kLAotICAgICAgIm5vIGxvZyBzeXNsb2cgW0xFVkVMXSIsCi0gICAgICBOT19TVFIgIkxvZ2dpbmcgY29udHJvbFxuIiAiQ2FuY2VsIGxvZ2dpbmcgdG8gc3lzbG9nXG4iICJMb2dnaW5nIGxldmVsXG4iKQotewotCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIFpMT0dfRElTQUJMRUQpOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotQUxJQVMobm9fY29uZmlnX2xvZ19zeXNsb2csCi0gICAgICBub19jb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eV9jbWQsCi0gICAgICAibm8gbG9nIHN5c2xvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAotICAgICAgTk9fU1RSCi0gICAgICAiTG9nZ2luZyBjb250cm9sXG4iCi0gICAgICAiTG9nZ2luZyBnb2VzIHRvIHN5c2xvZ1xuIgotICAgICAgIkZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iIExPR19GQUNJTElUWV9ERVNDKQotCi0gICAgREVGVU4oY29uZmlnX2xvZ19mYWNpbGl0eSwKLSAgICAgIGNvbmZpZ19sb2dfZmFjaWxpdHlfY21kLAotICAgICAgImxvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAotICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgotICAgICAgIkZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iIExPR19GQUNJTElUWV9ERVNDKQotewotCWludCBmYWNpbGl0eTsKLQotCWlmICgoZmFjaWxpdHkgPSBmYWNpbGl0eV9tYXRjaChhcmd2WzBdKSkgPCAwKQotCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKLQl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gZmFjaWxpdHk7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihub19jb25maWdfbG9nX2ZhY2lsaXR5LAotICAgICAgbm9fY29uZmlnX2xvZ19mYWNpbGl0eV9jbWQsCi0gICAgICAibm8gbG9nIGZhY2lsaXR5IFtGQUNJTElUWV0iLAotICAgICAgTk9fU1RSCi0gICAgICAiTG9nZ2luZyBjb250cm9sXG4iCi0gICAgICAiUmVzZXQgc3lzbG9nIGZhY2lsaXR5IHRvIGRlZmF1bHQgKGRhZW1vbilcbiIgIlN5c2xvZyBmYWNpbGl0eVxuIikKLXsKLQl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gTE9HX0RBRU1PTjsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLURFRlVOX0RFUFJFQ0FURUQoY29uZmlnX2xvZ190cmFwLAotCQkgY29uZmlnX2xvZ190cmFwX2NtZCwKLQkJICJsb2cgdHJhcCAiIExPR19MRVZFTFMsCi0JCSAiTG9nZ2luZyBjb250cm9sXG4iCi0JCSAiKERlcHJlY2F0ZWQpIFNldCBsb2dnaW5nIGxldmVsIGFuZCBkZWZhdWx0IGZvciBhbGwgZGVzdGluYXRpb25zXG4iCi0JCSBMT0dfTEVWRUxfREVTQykKLXsKLQlpbnQgbmV3X2xldmVsOwotCWludCBpOwotCi0JaWYgKChuZXdfbGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKLQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7Ci0KLQl6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsID0gbmV3X2xldmVsOwotCWZvciAoaSA9IDA7IGkgPCBaTE9HX05VTV9ERVNUUzsgaSsrKQotCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbaV0gIT0gWkxPR19ESVNBQkxFRCkKLQkJCXpsb2dfZGVmYXVsdC0+bWF4bHZsW2ldID0gbmV3X2xldmVsOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU5fREVQUkVDQVRFRChub19jb25maWdfbG9nX3RyYXAsCi0JCSBub19jb25maWdfbG9nX3RyYXBfY21kLAotCQkgIm5vIGxvZyB0cmFwIFtMRVZFTF0iLAotCQkgTk9fU1RSCi0JCSAiTG9nZ2luZyBjb250cm9sXG4iCi0JCSAiUGVybWl0IGFsbCBsb2dnaW5nIGluZm9ybWF0aW9uXG4iICJMb2dnaW5nIGxldmVsXG4iKQotewotCXpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwgPSBMT0dfREVCVUc7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihjb25maWdfbG9nX3JlY29yZF9wcmlvcml0eSwKLSAgICAgIGNvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5X2NtZCwKLSAgICAgICJsb2cgcmVjb3JkLXByaW9yaXR5IiwKLSAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKLSAgICAgICJMb2cgdGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgbWVzc2FnZVxuIikKLXsKLQl6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9IDE7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihub19jb25maWdfbG9nX3JlY29yZF9wcmlvcml0eSwKLSAgICAgIG5vX2NvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5X2NtZCwKLSAgICAgICJubyBsb2cgcmVjb3JkLXByaW9yaXR5IiwKLSAgICAgIE5PX1NUUgotICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgotICAgICAgIkRvIG5vdCBsb2cgdGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgbWVzc2FnZVxuIikKLXsKLQl6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9IDA7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotI2VuZGlmCi0KLURFRlVOKGJhbm5lcl9tb3RkX2ZpbGUsCi0gICAgICBiYW5uZXJfbW90ZF9maWxlX2NtZCwKLSAgICAgICJiYW5uZXIgbW90ZCBmaWxlIFtGSUxFXSIsCi0gICAgICAiU2V0IGJhbm5lclxuIiAiQmFubmVyIGZvciBtb3RkXG4iICJCYW5uZXIgZnJvbSBhIGZpbGVcbiIgIkZpbGVuYW1lXG4iKQotewotCWlmIChob3N0Lm1vdGRmaWxlKQotCQl0YWxsb2NfZnJlZShob3N0Lm1vdGRmaWxlKTsKLQlob3N0Lm1vdGRmaWxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKLQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4oYmFubmVyX21vdGRfZGVmYXVsdCwKLSAgICAgIGJhbm5lcl9tb3RkX2RlZmF1bHRfY21kLAotICAgICAgImJhbm5lciBtb3RkIGRlZmF1bHQiLAotICAgICAgIlNldCBiYW5uZXIgc3RyaW5nXG4iICJTdHJpbmdzIGZvciBtb3RkXG4iICJEZWZhdWx0IHN0cmluZ1xuIikKLXsKLQlob3N0Lm1vdGQgPSBkZWZhdWx0X21vdGQ7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihub19iYW5uZXJfbW90ZCwKLSAgICAgIG5vX2Jhbm5lcl9tb3RkX2NtZCwKLSAgICAgICJubyBiYW5uZXIgbW90ZCIsIE5PX1NUUiAiU2V0IGJhbm5lciBzdHJpbmdcbiIgIlN0cmluZ3MgZm9yIG1vdGRcbiIpCi17Ci0JaG9zdC5tb3RkID0gTlVMTDsKLQlpZiAoaG9zdC5tb3RkZmlsZSkKLQkJdGFsbG9jX2ZyZWUoaG9zdC5tb3RkZmlsZSk7Ci0JaG9zdC5tb3RkZmlsZSA9IE5VTEw7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi0vKiBTZXQgY29uZmlnIGZpbGVuYW1lLiAgQ2FsbGVkIGZyb20gdnR5LmMgKi8KLXZvaWQgaG9zdF9jb25maWdfc2V0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotCWhvc3QuY29uZmlnID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBmaWxlbmFtZSk7Ci19Ci0KLXZvaWQgaW5zdGFsbF9kZWZhdWx0KGVudW0gbm9kZV90eXBlIG5vZGUpCi17Ci0JaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfZXhpdF9jbWQpOwotCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3F1aXRfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19lbmRfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19oZWxwX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfbGlzdF9jbWQpOwotCi0JaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfdGVybWluYWxfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV9maWxlX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfbWVtb3J5X2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJnNob3dfcnVubmluZ19jb25maWdfY21kKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBjb21tYW5kIGludGVyZmFjZS4gSW5zdGFsbCBiYXNpYyBub2RlcyBhbmQgY29tbWFuZHMuICovCi12b2lkIGNtZF9pbml0KGludCB0ZXJtaW5hbCkKLXsKLQkvKiBBbGxvY2F0ZSBpbml0aWFsIHRvcCB2ZWN0b3Igb2YgY29tbWFuZHMuICovCi0JY21kdmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKLQotCS8qIERlZmF1bHQgaG9zdCB2YWx1ZSBzZXR0aW5ncy4gKi8KLQlob3N0Lm5hbWUgPSBOVUxMOwotCWhvc3QucGFzc3dvcmQgPSBOVUxMOwotCWhvc3QuZW5hYmxlID0gTlVMTDsKLQlob3N0LmxvZ2ZpbGUgPSBOVUxMOwotCWhvc3QuY29uZmlnID0gTlVMTDsKLQlob3N0LmxpbmVzID0gLTE7Ci0JaG9zdC5tb3RkID0gZGVmYXVsdF9tb3RkOwotCWhvc3QubW90ZGZpbGUgPSBOVUxMOwotCi0JLyogSW5zdGFsbCB0b3Agbm9kZXMuICovCi0JaW5zdGFsbF9ub2RlKCZ2aWV3X25vZGUsIE5VTEwpOwotCWluc3RhbGxfbm9kZSgmZW5hYmxlX25vZGUsIE5VTEwpOwotCWluc3RhbGxfbm9kZSgmYXV0aF9ub2RlLCBOVUxMKTsKLQlpbnN0YWxsX25vZGUoJmF1dGhfZW5hYmxlX25vZGUsIE5VTEwpOwotCWluc3RhbGxfbm9kZSgmY29uZmlnX25vZGUsIGNvbmZpZ193cml0ZV9ob3N0KTsKLQotCS8qIEVhY2ggbm9kZSdzIGJhc2ljIGNvbW1hbmRzLiAqLwotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3ZlcnNpb25fY21kKTsKLQlpZiAodGVybWluYWwpIHsKLQkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19saXN0X2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfZXhpdF9jbWQpOwotCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3F1aXRfY21kKTsKLQkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19oZWxwX2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfZW5hYmxlX2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoX2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZlY2hvX2NtZCk7Ci0JfQotCi0JaWYgKHRlcm1pbmFsKSB7Ci0JCWluc3RhbGxfZGVmYXVsdChFTkFCTEVfTk9ERSk7Ci0JCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ19kaXNhYmxlX2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9jbWQpOwotCQlpbnN0YWxsX2VsZW1lbnQgKEVOQUJMRV9OT0RFLCAmY29weV9ydW5uaW5nY29uZmlnX3N0YXJ0dXBjb25maWdfY21kKTsKLQl9Ci0JaW5zdGFsbF9lbGVtZW50IChFTkFCTEVfTk9ERSwgJnNob3dfc3RhcnR1cF9jb25maWdfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZzaG93X3ZlcnNpb25fY21kKTsKLQotCWlmICh0ZXJtaW5hbCkgewotCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGhfY21kKTsKLQkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmZWNob19jbWQpOwotCi0JCWluc3RhbGxfZGVmYXVsdChDT05GSUdfTk9ERSk7Ci0JfQotCi0JaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmaG9zdG5hbWVfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19ob3N0bmFtZV9jbWQpOwotCi0JaWYgKHRlcm1pbmFsKSB7Ci0JCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnBhc3N3b3JkX2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnBhc3N3b3JkX3RleHRfY21kKTsKLQkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmZW5hYmxlX3Bhc3N3b3JkX2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmVuYWJsZV9wYXNzd29yZF90ZXh0X2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX2VuYWJsZV9wYXNzd29yZF9jbWQpOwotCi0jaWZkZWYgVlRZX0NSWVBUX1BXCi0JCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQpOwotCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kKTsKLSNlbmRpZgotCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZiYW5uZXJfbW90ZF9kZWZhdWx0X2NtZCk7Ci0JCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmJhbm5lcl9tb3RkX2ZpbGVfY21kKTsKLQkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fYmFubmVyX21vdGRfY21kKTsKLQkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kKTsKLQkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kKTsKLQotCX0KLQlzcmFuZCh0aW1lKE5VTEwpKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYyBiL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0N2FlNS4uMDAwMDAwMAotLS0gYS9vcGVuYnNjL3NyYy92dHkvdmVjdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyogR2VuZXJpYyB2ZWN0b3IgaW50ZXJmYWNlIHJvdXRpbmUKLSAqIENvcHlyaWdodCAoQykgMTk5NyBLdW5paGlybyBJc2hpZ3VybwotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KLSAqCi0gKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICogMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPHZ0eS92ZWN0b3IuaD4KLSNpbmNsdWRlIDx2dHkvdnR5Lmg+Ci0jaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLXZvaWQgKnRhbGxfdnR5X3ZlY19jdHg7Ci0KLS8qIEluaXRpYWxpemUgdmVjdG9yIDogYWxsb2NhdGUgbWVtb3J5IGFuZCByZXR1cm4gdmVjdG9yLiAqLwotdmVjdG9yIHZlY3Rvcl9pbml0KHVuc2lnbmVkIGludCBzaXplKQotewotCXZlY3RvciB2ID0gdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc3RydWN0IF92ZWN0b3IpOwotCWlmICghdikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBhbGxvY2F0ZSBhdCBsZWFzdCBvbmUgc2xvdCAqLwotCWlmIChzaXplID09IDApCi0JCXNpemUgPSAxOwotCi0Jdi0+YWxsb2NlZCA9IHNpemU7Ci0Jdi0+YWN0aXZlID0gMDsKLQl2LT5pbmRleCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzaXplb2Yodm9pZCAqKSAqIHNpemUsCi0JCQkJInZlY3Rvcl9pbml0OmluZGV4Iik7Ci0JaWYgKCF2LT5pbmRleCkgewotCQl0YWxsb2NfZnJlZSh2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB2OwotfQotCi12b2lkIHZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZSh2ZWN0b3IgdikKLXsKLQl0YWxsb2NfZnJlZSh2KTsKLX0KLQotdm9pZCB2ZWN0b3Jfb25seV9pbmRleF9mcmVlKHZvaWQgKmluZGV4KQotewotCXRhbGxvY19mcmVlKGluZGV4KTsKLX0KLQotdm9pZCB2ZWN0b3JfZnJlZSh2ZWN0b3IgdikKLXsKLQl0YWxsb2NfZnJlZSh2LT5pbmRleCk7Ci0JdGFsbG9jX2ZyZWUodik7Ci19Ci0KLXZlY3RvciB2ZWN0b3JfY29weSh2ZWN0b3IgdikKLXsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQl2ZWN0b3IgbmV3ID0gdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc3RydWN0IF92ZWN0b3IpOwotCWlmICghbmV3KQotCQlyZXR1cm4gTlVMTDsKLQotCW5ldy0+YWN0aXZlID0gdi0+YWN0aXZlOwotCW5ldy0+YWxsb2NlZCA9IHYtPmFsbG9jZWQ7Ci0KLQlzaXplID0gc2l6ZW9mKHZvaWQgKikgKiAodi0+YWxsb2NlZCk7Ci0JbmV3LT5pbmRleCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzaXplLCAidmVjdG9yX2NvcHk6aW5kZXgiKTsKLQlpZiAoIW5ldy0+aW5kZXgpIHsKLQkJdGFsbG9jX2ZyZWUobmV3KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbWNweShuZXctPmluZGV4LCB2LT5pbmRleCwgc2l6ZSk7Ci0KLQlyZXR1cm4gbmV3OwotfQotCi0vKiBDaGVjayBhc3NpZ25lZCBpbmRleCwgYW5kIGlmIGl0IHJ1bnMgc2hvcnQgZG91YmxlIGluZGV4IHBvaW50ZXIgKi8KLXZvaWQgdmVjdG9yX2Vuc3VyZSh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IG51bSkKLXsKLQlpZiAodi0+YWxsb2NlZCA+IG51bSkKLQkJcmV0dXJuOwotCi0Jdi0+aW5kZXggPSB0YWxsb2NfcmVhbGxvY19zaXplKHRhbGxfdnR5X3ZlY19jdHgsIHYtPmluZGV4LAotCQkJCSAgICAgICBzaXplb2Yodm9pZCAqKSAqICh2LT5hbGxvY2VkICogMikpOwotCW1lbXNldCgmdi0+aW5kZXhbdi0+YWxsb2NlZF0sIDAsIHNpemVvZih2b2lkICopICogdi0+YWxsb2NlZCk7Ci0Jdi0+YWxsb2NlZCAqPSAyOwotCi0JaWYgKHYtPmFsbG9jZWQgPD0gbnVtKQotCQl2ZWN0b3JfZW5zdXJlKHYsIG51bSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIG5leHQgZW1wdHkgc2xvdCBpbmRleC4gIEl0IGRvc2Ugbm90IG1lYW4KLSAgIHRoZSBzbG90J3MgaW5kZXggbWVtb3J5IGlzIGFzc2lnbmVkLCBwbGVhc2UgY2FsbCB2ZWN0b3JfZW5zdXJlKCkKLSAgIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gKi8KLWludCB2ZWN0b3JfZW1wdHlfc2xvdCh2ZWN0b3IgdikKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmICh2LT5hY3RpdmUgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdi0+YWN0aXZlOyBpKyspCi0JCWlmICh2LT5pbmRleFtpXSA9PSAwKQotCQkJcmV0dXJuIGk7Ci0KLQlyZXR1cm4gaTsKLX0KLQotLyogU2V0IHZhbHVlIHRvIHRoZSBzbWFsbGVzdCBlbXB0eSBzbG90LiAqLwotaW50IHZlY3Rvcl9zZXQodmVjdG9yIHYsIHZvaWQgKnZhbCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWkgPSB2ZWN0b3JfZW1wdHlfc2xvdCh2KTsKLQl2ZWN0b3JfZW5zdXJlKHYsIGkpOwotCi0Jdi0+aW5kZXhbaV0gPSB2YWw7Ci0KLQlpZiAodi0+YWN0aXZlIDw9IGkpCi0JCXYtPmFjdGl2ZSA9IGkgKyAxOwotCi0JcmV0dXJuIGk7Ci19Ci0KLS8qIFNldCB2YWx1ZSB0byBzcGVjaWZpZWQgaW5kZXggc2xvdC4gKi8KLWludCB2ZWN0b3Jfc2V0X2luZGV4KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSwgdm9pZCAqdmFsKQotewotCXZlY3Rvcl9lbnN1cmUodiwgaSk7Ci0KLQl2LT5pbmRleFtpXSA9IHZhbDsKLQotCWlmICh2LT5hY3RpdmUgPD0gaSkKLQkJdi0+YWN0aXZlID0gaSArIDE7Ci0KLQlyZXR1cm4gaTsKLX0KLQotLyogTG9vayB1cCB2ZWN0b3IuICAqLwotdm9pZCAqdmVjdG9yX2xvb2t1cCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpCi17Ci0JaWYgKGkgPj0gdi0+YWN0aXZlKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdi0+aW5kZXhbaV07Ci19Ci0KLS8qIExvb2t1cCB2ZWN0b3IsIGVuc3VyZSBpdC4gKi8KLXZvaWQgKnZlY3Rvcl9sb29rdXBfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKLXsKLQl2ZWN0b3JfZW5zdXJlKHYsIGkpOwotCXJldHVybiB2LT5pbmRleFtpXTsKLX0KLQotLyogVW5zZXQgdmFsdWUgYXQgc3BlY2lmaWVkIGluZGV4IHNsb3QuICovCi12b2lkIHZlY3Rvcl91bnNldCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpCi17Ci0JaWYgKGkgPj0gdi0+YWxsb2NlZCkKLQkJcmV0dXJuOwotCi0Jdi0+aW5kZXhbaV0gPSBOVUxMOwotCi0JaWYgKGkgKyAxID09IHYtPmFjdGl2ZSkgewotCQl2LT5hY3RpdmUtLTsKLQkJd2hpbGUgKGkgJiYgdi0+aW5kZXhbLS1pXSA9PSBOVUxMICYmIHYtPmFjdGl2ZS0tKSA7CS8qIElzIHRoaXMgdWdseSA/ICovCi0JfQotfQotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIG5vdCBlbXBsdHkgc2xvdC4gKi8KLXVuc2lnbmVkIGludCB2ZWN0b3JfY291bnQodmVjdG9yIHYpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdW5zaWduZWQgY291bnQgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHYtPmFjdGl2ZTsgaSsrKQotCQlpZiAodi0+aW5kZXhbaV0gIT0gTlVMTCkKLQkJCWNvdW50Kys7Ci0KLQlyZXR1cm4gY291bnQ7Ci19CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvdnR5LmMgYi9vcGVuYnNjL3NyYy92dHkvdnR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjBmMzguLjAwMDAwMDAKLS0tIGEvb3BlbmJzYy9zcmMvdnR5L3Z0eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3OCArMCwwIEBACi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jaW5jbHVkZSA8YXJwYS90ZWxuZXQuaD4KLQotI2luY2x1ZGUgImNhcmRzaGVsbC5oIgotI2luY2x1ZGUgPHZ0eS92dHkuaD4KLSNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgotI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KLSNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KLQotLyogb3VyIGNhbGxiYWNrLCBsb2NhdGVkIGluIHRlbG5ldF9pbnRlcmZhY2UuYyAqLwotdm9pZCB2dHlfZXZlbnQoZW51bSBldmVudCBldmVudCwgaW50IHNvY2ssIHN0cnVjdCB2dHkgKnZ0eSk7Ci0KLWV4dGVybiBzdHJ1Y3QgaG9zdCBob3N0OwotCi0vKiBWZWN0b3Igd2hpY2ggc3RvcmUgZWFjaCB2dHkgc3RydWN0dXJlLiAqLwotc3RhdGljIHZlY3RvciB2dHl2ZWM7Ci0KLXZlY3RvciBWdnR5X3NlcnZfdGhyZWFkOwotCi1jaGFyICp2dHlfY3dkID0gTlVMTDsKLQotLyogQ29uZmlndXJlIGxvY2suICovCi1zdGF0aWMgaW50IHZ0eV9jb25maWc7Ci0KLXN0YXRpYyBpbnQgbm9fcGFzc3dvcmRfY2hlY2sgPSAxOwotCi12b2lkICp0YWxsX3Z0eV9jdHg7Ci0KLXN0YXRpYyB2b2lkIHZ0eV9jbGVhcl9idWYoc3RydWN0IHZ0eSAqdnR5KQotewotCW1lbXNldCh2dHktPmJ1ZiwgMCwgdnR5LT5tYXgpOwotfQotCi0vKiBBbGxvY2F0ZSBuZXcgdnR5IHN0cnVjdC4gKi8KLXN0cnVjdCB2dHkgKnZ0eV9uZXcoKQotewotCXN0cnVjdCB2dHkgKm5ldyA9IHRhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RydWN0IHZ0eSk7Ci0KLQlpZiAoIW5ldykKLQkJZ290byBvdXQ7Ci0KLQluZXctPm9idWYgPSBidWZmZXJfbmV3KDApOwkvKiBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZS4gKi8KLQlpZiAoIW5ldy0+b2J1ZikKLQkJZ290byBvdXRfbmV3OwotCW5ldy0+YnVmID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgVlRZX0JVRlNJWiwgInZ0eV9uZXctPmJ1ZiIpOwotCWlmICghbmV3LT5idWYpCi0JCWdvdG8gb3V0X29idWY7Ci0KLQluZXctPm1heCA9IFZUWV9CVUZTSVo7Ci0KLQlyZXR1cm4gbmV3OwotCi1vdXRfb2J1ZjoKLQlidWZmZXJfZnJlZShuZXctPm9idWYpOwotb3V0X25ldzoKLQl0YWxsb2NfZnJlZShuZXcpOwotCW5ldyA9IE5VTEw7Ci1vdXQ6Ci0JcmV0dXJuIG5ldzsKLX0KLQotLyogQXV0aGVudGljYXRpb24gb2YgdnR5ICovCi1zdGF0aWMgdm9pZCB2dHlfYXV0aChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKmJ1ZikKLXsKLQljaGFyICpwYXNzd2QgPSBOVUxMOwotCWVudW0gbm9kZV90eXBlIG5leHRfbm9kZSA9IDA7Ci0JaW50IGZhaWw7Ci0JY2hhciAqY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotCi0Jc3dpdGNoICh2dHktPm5vZGUpIHsKLQljYXNlIEFVVEhfTk9ERToKLSNpZmRlZiBWVFlfQ1JZUFRfUFcKLQkJaWYgKGhvc3QuZW5jcnlwdCkKLQkJCXBhc3N3ZCA9IGhvc3QucGFzc3dvcmRfZW5jcnlwdDsKLQkJZWxzZQotI2VuZGlmCi0JCQlwYXNzd2QgPSBob3N0LnBhc3N3b3JkOwotCQlpZiAoaG9zdC5hZHZhbmNlZCkKLQkJCW5leHRfbm9kZSA9IGhvc3QuZW5hYmxlID8gVklFV19OT0RFIDogRU5BQkxFX05PREU7Ci0JCWVsc2UKLQkJCW5leHRfbm9kZSA9IFZJRVdfTk9ERTsKLQkJYnJlYWs7Ci0JY2FzZSBBVVRIX0VOQUJMRV9OT0RFOgotI2lmZGVmIFZUWV9DUllQVF9QVwotCQlpZiAoaG9zdC5lbmNyeXB0KQotCQkJcGFzc3dkID0gaG9zdC5lbmFibGVfZW5jcnlwdDsKLQkJZWxzZQotI2VuZGlmCi0JCQlwYXNzd2QgPSBob3N0LmVuYWJsZTsKLQkJbmV4dF9ub2RlID0gRU5BQkxFX05PREU7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChwYXNzd2QpIHsKLSNpZmRlZiBWVFlfQ1JZUFRfUFcKLQkJaWYgKGhvc3QuZW5jcnlwdCkKLQkJCWZhaWwgPSBzdHJjbXAoY3J5cHQoYnVmLCBwYXNzd2QpLCBwYXNzd2QpOwotCQllbHNlCi0jZW5kaWYKLQkJCWZhaWwgPSBzdHJjbXAoYnVmLCBwYXNzd2QpOwotCX0gZWxzZQotCQlmYWlsID0gMTsKLQotCWlmICghZmFpbCkgewotCQl2dHktPmZhaWwgPSAwOwotCQl2dHktPm5vZGUgPSBuZXh0X25vZGU7CS8qIFN1Y2Nlc3MgISAqLwotCX0gZWxzZSB7Ci0JCXZ0eS0+ZmFpbCsrOwotCQlpZiAodnR5LT5mYWlsID49IDMpIHsKLQkJCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFKSB7Ci0JCQkJdnR5X291dCh2dHksCi0JCQkJCSIlJSBCYWQgcGFzc3dvcmRzLCB0b28gbWFueSBmYWlsdXJlcyElcyIsCi0JCQkJCVZUWV9ORVdMSU5FKTsKLQkJCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogQVVUSF9FTkFCTEVfTk9ERSAqLwotCQkJCXZ0eS0+ZmFpbCA9IDA7Ci0JCQkJdnR5X291dCh2dHksCi0JCQkJCSIlJSBCYWQgZW5hYmxlIHBhc3N3b3JkcywgdG9vIG1hbnkgZmFpbHVyZXMhJXMiLAotCQkJCQlWVFlfTkVXTElORSk7Ci0JCQkJdnR5LT5ub2RlID0gVklFV19OT0RFOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKiBDbG9zZSB2dHkgaW50ZXJmYWNlLiAqLwotdm9pZCB2dHlfY2xvc2Uoc3RydWN0IHZ0eSAqdnR5KQotewotCWludCBpOwotCi0JaWYgKHZ0eS0+b2J1ZikgIHsKLQkJLyogRmx1c2ggYnVmZmVyLiAqLwotCQlidWZmZXJfZmx1c2hfYWxsKHZ0eS0+b2J1ZiwgdnR5LT5mZCk7Ci0KLQkJLyogRnJlZSBpbnB1dCBidWZmZXIuICovCi0JCWJ1ZmZlcl9mcmVlKHZ0eS0+b2J1Zik7Ci0JCXZ0eS0+b2J1ZiA9IE5VTEw7Ci0JfQotCi0JLyogRnJlZSBjb21tYW5kIGhpc3RvcnkuICovCi0JZm9yIChpID0gMDsgaSA8IFZUWV9NQVhISVNUOyBpKyspCi0JCWlmICh2dHktPmhpc3RbaV0pCi0JCQl0YWxsb2NfZnJlZSh2dHktPmhpc3RbaV0pOwotCi0JLyogVW5zZXQgdmVjdG9yLiAqLwotCXZlY3Rvcl91bnNldCh2dHl2ZWMsIHZ0eS0+ZmQpOwotCi0JLyogQ2xvc2Ugc29ja2V0LiAqLwotCWlmICh2dHktPmZkID4gMCkKLQkJY2xvc2UodnR5LT5mZCk7Ci0KLQlpZiAodnR5LT5idWYpIHsKLQkJdGFsbG9jX2ZyZWUodnR5LT5idWYpOwotCQl2dHktPmJ1ZiA9IE5VTEw7Ci0JfQotCi0JLyogQ2hlY2sgY29uZmlndXJlLiAqLwotCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7Ci0KLQkvKiBGSVhNRTogbWVtb3J5IGxlYWsuIFdlIG5lZWQgdG8gY2FsbCB0ZWxuZXRfY2xvc2VfY2xpZW50KCkgYnV0IGRvbid0Ci0JICogaGF2ZSBiZmQgKi8KLQl2dHlfZXZlbnQoVlRZX0NMT1NFRCwgdnR5LT5mZCwgdnR5KTsKLQotCS8qIE9LIGZyZWUgdnR5LiAqLwotCXRhbGxvY19mcmVlKHZ0eSk7Ci19Ci0KLWludCB2dHlfc2hlbGwoc3RydWN0IHZ0eSAqdnR5KQotewotCXJldHVybiB2dHktPnR5cGUgPT0gVlRZX1NIRUxMID8gMSA6IDA7Ci19Ci0KLQotLyogVlRZIHN0YW5kYXJkIG91dHB1dCBmdW5jdGlvbi4gKi8KLWludCB2dHlfb3V0KHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCWludCBsZW4gPSAwOwotCWludCBzaXplID0gMTAyNDsKLQljaGFyIGJ1ZlsxMDI0XTsKLQljaGFyICpwID0gTlVMTDsKLQotCWlmICh2dHlfc2hlbGwodnR5KSkgewotCQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotCQl2cHJpbnRmKGZvcm1hdCwgYXJncyk7Ci0JCXZhX2VuZChhcmdzKTsKLQl9IGVsc2UgewotCQkvKiBUcnkgdG8gd3JpdGUgdG8gaW5pdGlhbCBidWZmZXIuICAqLwotCQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotCQlsZW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YgYnVmLCBmb3JtYXQsIGFyZ3MpOwotCQl2YV9lbmQoYXJncyk7Ci0KLQkJLyogSW5pdGlhbCBidWZmZXIgaXMgbm90IGVub3VnaC4gICovCi0JCWlmIChsZW4gPCAwIHx8IGxlbiA+PSBzaXplKSB7Ci0JCQl3aGlsZSAoMSkgewotCQkJCWlmIChsZW4gPiAtMSkKLQkJCQkJc2l6ZSA9IGxlbiArIDE7Ci0JCQkJZWxzZQotCQkJCQlzaXplID0gc2l6ZSAqIDI7Ci0KLQkJCQlwID0gdGFsbG9jX3JlYWxsb2Nfc2l6ZSh0YWxsX3Z0eV9jdHgsIHAsIHNpemUpOwotCQkJCWlmICghcCkKLQkJCQkJcmV0dXJuIC0xOwotCi0JCQkJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLQkJCQlsZW4gPSB2c25wcmludGYocCwgc2l6ZSwgZm9ybWF0LCBhcmdzKTsKLQkJCQl2YV9lbmQoYXJncyk7Ci0KLQkJCQlpZiAobGVuID4gLTEgJiYgbGVuIDwgc2l6ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBXaGVuIGluaXRpYWwgYnVmZmVyIGlzIGVub3VnaCB0byBzdG9yZSBhbGwgb3V0cHV0LiAgKi8KLQkJaWYgKCFwKQotCQkJcCA9IGJ1ZjsKLQotCQkvKiBQb2ludGVyIHAgbXVzdCBwb2ludCBvdXQgYnVmZmVyLiAqLwotCQlidWZmZXJfcHV0KHZ0eS0+b2J1ZiwgKHVfY2hhciAqKSBwLCBsZW4pOwotCi0JCS8qIElmIHAgaXMgbm90IGRpZmZlcmVudCB3aXRoIGJ1ZiwgaXQgaXMgYWxsb2NhdGVkIGJ1ZmZlci4gICovCi0JCWlmIChwICE9IGJ1ZikKLQkJCXRhbGxvY19mcmVlKHApOwotCX0KLQotCXZ0eV9ldmVudChWVFlfV1JJVEUsIHZ0eS0+ZmQsIHZ0eSk7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgdnR5X291dF9uZXdsaW5lKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQljaGFyICpwID0gdnR5X25ld2xpbmUodnR5KTsKLQlidWZmZXJfcHV0KHZ0eS0+b2J1ZiwgcCwgc3RybGVuKHApKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHZ0eV9jb25maWdfbG9jayhzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0JaWYgKHZ0eV9jb25maWcgPT0gMCkgewotCQl2dHktPmNvbmZpZyA9IDE7Ci0JCXZ0eV9jb25maWcgPSAxOwotCX0KLQlyZXR1cm4gdnR5LT5jb25maWc7Ci19Ci0KLWludCB2dHlfY29uZmlnX3VubG9jayhzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0JaWYgKHZ0eV9jb25maWcgPT0gMSAmJiB2dHktPmNvbmZpZyA9PSAxKSB7Ci0JCXZ0eS0+Y29uZmlnID0gMDsKLQkJdnR5X2NvbmZpZyA9IDA7Ci0JfQotCXJldHVybiB2dHktPmNvbmZpZzsKLX0KLQotLyogU2F5IGhlbGxvIHRvIHZ0eSBpbnRlcmZhY2UuICovCi12b2lkIHZ0eV9oZWxsbyhzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0JaWYgKGhvc3QubW90ZGZpbGUpIHsKLQkJRklMRSAqZjsKLQkJY2hhciBidWZbNDA5Nl07Ci0KLQkJZiA9IGZvcGVuKGhvc3QubW90ZGZpbGUsICJyIik7Ci0JCWlmIChmKSB7Ci0JCQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKLQkJCQljaGFyICpzOwotCQkJCS8qIHdvcmsgYmFja3dhcmRzIHRvIGlnbm9yZSB0cmFpbGxpbmcgaXNzcGFjZSgpICovCi0JCQkJZm9yIChzID0gYnVmICsgc3RybGVuKGJ1Zik7Ci0JCQkJICAgICAocyA+IGJ1ZikgJiYgaXNzcGFjZSgqKHMgLSAxKSk7IHMtLSkgOwotCQkJCSpzID0gJ1wwJzsKLQkJCQl2dHlfb3V0KHZ0eSwgIiVzJXMiLCBidWYsIFZUWV9ORVdMSU5FKTsKLQkJCX0KLQkJCWZjbG9zZShmKTsKLQkJfSBlbHNlCi0JCQl2dHlfb3V0KHZ0eSwgIk1PVEQgZmlsZSBub3QgZm91bmQlcyIsIFZUWV9ORVdMSU5FKTsKLQl9IGVsc2UgaWYgKGhvc3QubW90ZCkKLQkJdnR5X291dCh2dHksICIlcyIsIGhvc3QubW90ZCk7Ci19Ci0KLS8qIFB1dCBvdXQgcHJvbXB0IGFuZCB3YWl0IGlucHV0IGZyb20gdXNlci4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9wcm9tcHQoc3RydWN0IHZ0eSAqdnR5KQotewotCXN0cnVjdCB1dHNuYW1lIG5hbWVzOwotCWNvbnN0IGNoYXIgKmhvc3RuYW1lOwotCi0JaWYgKHZ0eS0+dHlwZSA9PSBWVFlfVEVSTSkgewotCQlob3N0bmFtZSA9IGhvc3QubmFtZTsKLQkJaWYgKCFob3N0bmFtZSkgewotCQkJdW5hbWUoJm5hbWVzKTsKLQkJCWhvc3RuYW1lID0gbmFtZXMubm9kZW5hbWU7Ci0JCX0KLQkJdnR5X291dCh2dHksIGNtZF9wcm9tcHQodnR5LT5ub2RlKSwgaG9zdG5hbWUpOwotCX0KLX0KLQotLyogQ29tbWFuZCBleGVjdXRpb24gb3ZlciB0aGUgdnR5IGludGVyZmFjZS4gKi8KLXN0YXRpYyBpbnQgdnR5X2NvbW1hbmQoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpidWYpCi17Ci0JaW50IHJldDsKLQl2ZWN0b3IgdmxpbmU7Ci0KLQkvKiBTcGxpdCByZWFkbGluZSBzdHJpbmcgdXAgaW50byB0aGUgdmVjdG9yICovCi0JdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWMoYnVmKTsKLQotCWlmICh2bGluZSA9PSBOVUxMKQotCQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci0KLQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kKHZsaW5lLCB2dHksIE5VTEwsIDApOwotCWlmIChyZXQgIT0gQ01EX1NVQ0NFU1MpCi0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgQ01EX1dBUk5JTkc6Ci0JCQlpZiAodnR5LT50eXBlID09IFZUWV9GSUxFKQotCQkJCXZ0eV9vdXQodnR5LCAiV2FybmluZy4uLiVzIiwgVlRZX05FV0xJTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6Ci0JCQl2dHlfb3V0KHZ0eSwgIiUlIEFtYmlndW91cyBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKLQkJCXZ0eV9vdXQodnR5LCAiJSUgVW5rbm93biBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX0VSUl9JTkNPTVBMRVRFOgotCQkJdnR5X291dCh2dHksICIlJSBDb21tYW5kIGluY29tcGxldGUuJXMiLCBWVFlfTkVXTElORSk7Ci0JCQlicmVhazsKLQkJfQotCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciB0ZWxuZXRfYmFja3dhcmRfY2hhciA9IDB4MDg7Ci1zdGF0aWMgY29uc3QgY2hhciB0ZWxuZXRfc3BhY2VfY2hhciA9ICcgJzsKLQotLyogQmFzaWMgZnVuY3Rpb24gdG8gd3JpdGUgYnVmZmVyIHRvIHZ0eS4gKi8KLXN0YXRpYyB2b2lkIHZ0eV93cml0ZShzdHJ1Y3QgdnR5ICp2dHksIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcykKLXsKLQlpZiAoKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUpIHx8ICh2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkpCi0JCXJldHVybjsKLQotCS8qIFNob3VsZCB3ZSBkbyBidWZmZXJpbmcgaGVyZSA/ICBBbmQgbWFrZSB2dHlfZmx1c2ggKHZ0eSkgPyAqLwotCWJ1ZmZlcl9wdXQodnR5LT5vYnVmLCBidWYsIG5ieXRlcyk7Ci19Ci0KLS8qIEVuc3VyZSBsZW5ndGggb2YgaW5wdXQgYnVmZmVyLiAgSXMgYnVmZmVyIGlzIHNob3J0LCBkb3VibGUgaXQuICovCi1zdGF0aWMgdm9pZCB2dHlfZW5zdXJlKHN0cnVjdCB2dHkgKnZ0eSwgaW50IGxlbmd0aCkKLXsKLQlpZiAodnR5LT5tYXggPD0gbGVuZ3RoKSB7Ci0JCXZ0eS0+bWF4ICo9IDI7Ci0JCXZ0eS0+YnVmID0gdGFsbG9jX3JlYWxsb2Nfc2l6ZSh0YWxsX3Z0eV9jdHgsIHZ0eS0+YnVmLCB2dHktPm1heCk7Ci0JCS8vIEZJWE1FOiBjaGVjayByZXR1cm4KLQl9Ci19Ci0KLS8qIEJhc2ljIGZ1bmN0aW9uIHRvIGluc2VydCBjaGFyYWN0ZXIgaW50byB2dHkuICovCi1zdGF0aWMgdm9pZCB2dHlfc2VsZl9pbnNlcnQoc3RydWN0IHZ0eSAqdnR5LCBjaGFyIGMpCi17Ci0JaW50IGk7Ci0JaW50IGxlbmd0aDsKLQotCXZ0eV9lbnN1cmUodnR5LCB2dHktPmxlbmd0aCArIDEpOwotCWxlbmd0aCA9IHZ0eS0+bGVuZ3RoIC0gdnR5LT5jcDsKLQltZW1tb3ZlKCZ2dHktPmJ1Zlt2dHktPmNwICsgMV0sICZ2dHktPmJ1Zlt2dHktPmNwXSwgbGVuZ3RoKTsKLQl2dHktPmJ1Zlt2dHktPmNwXSA9IGM7Ci0KLQl2dHlfd3JpdGUodnR5LCAmdnR5LT5idWZbdnR5LT5jcF0sIGxlbmd0aCArIDEpOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9iYWNrd2FyZF9jaGFyLCAxKTsKLQotCXZ0eS0+Y3ArKzsKLQl2dHktPmxlbmd0aCsrOwotfQotCi0vKiBTZWxmIGluc2VydCBjaGFyYWN0ZXIgJ2MnIGluIG92ZXJ3cml0ZSBtb2RlLiAqLwotc3RhdGljIHZvaWQgdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZShzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgYykKLXsKLQl2dHlfZW5zdXJlKHZ0eSwgdnR5LT5sZW5ndGggKyAxKTsKLQl2dHktPmJ1Zlt2dHktPmNwKytdID0gYzsKLQotCWlmICh2dHktPmNwID4gdnR5LT5sZW5ndGgpCi0JCXZ0eS0+bGVuZ3RoKys7Ci0KLQlpZiAoKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUpIHx8ICh2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkpCi0JCXJldHVybjsKLQotCXZ0eV93cml0ZSh2dHksICZjLCAxKTsKLX0KLQotLyogSW5zZXJ0IGEgd29yZCBpbnRvIHZ0eSBpbnRlcmZhY2Ugd2l0aCBvdmVyd3JpdGUgbW9kZS4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9pbnNlcnRfd29yZF9vdmVyd3JpdGUoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpzdHIpCi17Ci0JaW50IGxlbiA9IHN0cmxlbihzdHIpOwotCXZ0eV93cml0ZSh2dHksIHN0ciwgbGVuKTsKLQlzdHJjcHkoJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBzdHIpOwotCXZ0eS0+Y3AgKz0gbGVuOwotCXZ0eS0+bGVuZ3RoID0gdnR5LT5jcDsKLX0KLQotLyogRm9yd2FyZCBjaGFyYWN0ZXIuICovCi1zdGF0aWMgdm9pZCB2dHlfZm9yd2FyZF9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQlpZiAodnR5LT5jcCA8IHZ0eS0+bGVuZ3RoKSB7Ci0JCXZ0eV93cml0ZSh2dHksICZ2dHktPmJ1Zlt2dHktPmNwXSwgMSk7Ci0JCXZ0eS0+Y3ArKzsKLQl9Ci19Ci0KLS8qIEJhY2t3YXJkIGNoYXJhY3Rlci4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9iYWNrd2FyZF9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQlpZiAodnR5LT5jcCA+IDApIHsKLQkJdnR5LT5jcC0tOwotCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOwotCX0KLX0KLQotLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLiAqLwotc3RhdGljIHZvaWQgdnR5X2JlZ2lubmluZ19vZl9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl3aGlsZSAodnR5LT5jcCkKLQkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKLX0KLQotLyogTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAqLwotc3RhdGljIHZvaWQgdnR5X2VuZF9vZl9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl3aGlsZSAodnR5LT5jcCA8IHZ0eS0+bGVuZ3RoKQotCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7Ci19Ci0KLS8qIEFkZCBjdXJyZW50IGNvbW1hbmQgbGluZSB0byB0aGUgaGlzdG9yeSBidWZmZXIuICovCi1zdGF0aWMgdm9pZCB2dHlfaGlzdF9hZGQoc3RydWN0IHZ0eSAqdnR5KQotewotCWludCBpbmRleDsKLQotCWlmICh2dHktPmxlbmd0aCA9PSAwKQotCQlyZXR1cm47Ci0KLQlpbmRleCA9IHZ0eS0+aGluZGV4ID8gdnR5LT5oaW5kZXggLSAxIDogVlRZX01BWEhJU1QgLSAxOwotCi0JLyogSWdub3JlIHRoZSBzYW1lIHN0cmluZyBhcyBwcmV2aW91cyBvbmUuICovCi0JaWYgKHZ0eS0+aGlzdFtpbmRleF0pCi0JCWlmIChzdHJjbXAodnR5LT5idWYsIHZ0eS0+aGlzdFtpbmRleF0pID09IDApIHsKLQkJCXZ0eS0+aHAgPSB2dHktPmhpbmRleDsKLQkJCXJldHVybjsKLQkJfQotCi0JLyogSW5zZXJ0IGhpc3RvcnkgZW50cnkuICovCi0JaWYgKHZ0eS0+aGlzdFt2dHktPmhpbmRleF0pCi0JCXRhbGxvY19mcmVlKHZ0eS0+aGlzdFt2dHktPmhpbmRleF0pOwotCXZ0eS0+aGlzdFt2dHktPmhpbmRleF0gPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2N0eCwgdnR5LT5idWYpOwotCi0JLyogSGlzdG9yeSBpbmRleCByb3RhdGlvbi4gKi8KLQl2dHktPmhpbmRleCsrOwotCWlmICh2dHktPmhpbmRleCA9PSBWVFlfTUFYSElTVCkKLQkJdnR5LT5oaW5kZXggPSAwOwotCi0JdnR5LT5ocCA9IHZ0eS0+aGluZGV4OwotfQotCi0vKiBHZXQgdGVsbmV0IHdpbmRvdyBzaXplLiAqLwotc3RhdGljIGludAotdnR5X3RlbG5ldF9vcHRpb24gKHN0cnVjdCB2dHkgKnZ0eSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQotewotI2lmZGVmIFRFTE5FVF9PUFRJT05fREVCVUcKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYnVmW2ldKQotCXsKLQljYXNlIElBQzoKLQkgIHZ0eV9vdXQgKHZ0eSwgIklBQyAiKTsKLQkgIGJyZWFrOwotCWNhc2UgV0lMTDoKLQkgIHZ0eV9vdXQgKHZ0eSwgIldJTEwgIik7Ci0JICBicmVhazsKLQljYXNlIFdPTlQ6Ci0JICB2dHlfb3V0ICh2dHksICJXT05UICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBETzoKLQkgIHZ0eV9vdXQgKHZ0eSwgIkRPICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBET05UOgotCSAgdnR5X291dCAodnR5LCAiRE9OVCAiKTsKLQkgIGJyZWFrOwotCWNhc2UgU0I6Ci0JICB2dHlfb3V0ICh2dHksICJTQiAiKTsKLQkgIGJyZWFrOwotCWNhc2UgU0U6Ci0JICB2dHlfb3V0ICh2dHksICJTRSAiKTsKLQkgIGJyZWFrOwotCWNhc2UgVEVMT1BUX0VDSE86Ci0JICB2dHlfb3V0ICh2dHksICJURUxPUFRfRUNITyAlcyIsIFZUWV9ORVdMSU5FKTsKLQkgIGJyZWFrOwotCWNhc2UgVEVMT1BUX1NHQToKLQkgIHZ0eV9vdXQgKHZ0eSwgIlRFTE9QVF9TR0EgJXMiLCBWVFlfTkVXTElORSk7Ci0JICBicmVhazsKLQljYXNlIFRFTE9QVF9OQVdTOgotCSAgdnR5X291dCAodnR5LCAiVEVMT1BUX05BV1MgJXMiLCBWVFlfTkVXTElORSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgdnR5X291dCAodnR5LCAiJXggIiwgYnVmW2ldKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHZ0eV9vdXQgKHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOwotCi0jZW5kaWYgLyogVEVMTkVUX09QVElPTl9ERUJVRyAqLwotCi0gIHN3aXRjaCAoYnVmWzBdKQotICAgIHsKLSAgICBjYXNlIFNCOgotICAgICAgdnR5LT5zYl9sZW4gPSAwOwotICAgICAgdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgPSAxOwotICAgICAgcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNFOiAKLSAgICAgIHsKLQlpZiAoIXZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzKQotCSAgcmV0dXJuIDA7Ci0KLQlpZiAoKHZ0eS0+c2JfbGVuID09IDApIHx8ICh2dHktPnNiX2J1ZlswXSA9PSAnXDAnKSkKLQkgIHsKLQkgICAgdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgPSAwOwotCSAgICByZXR1cm4gMDsKLQkgIH0KLQlzd2l0Y2ggKHZ0eS0+c2JfYnVmWzBdKQotCSAgewotCSAgY2FzZSBURUxPUFRfTkFXUzoKLQkgICAgaWYgKHZ0eS0+c2JfbGVuICE9IFRFTE5FVF9OQVdTX1NCX0xFTikKLQkgICAgICB2dHlfb3V0KHZ0eSwiUkZDIDEwNzMgdmlvbGF0aW9uIGRldGVjdGVkOiB0ZWxuZXQgTkFXUyBvcHRpb24gIgotCQkJInNob3VsZCBzZW5kICVkIGNoYXJhY3RlcnMsIGJ1dCB3ZSByZWNlaXZlZCAlbHUiLAotCQkJVEVMTkVUX05BV1NfU0JfTEVOLCAodV9sb25nKXZ0eS0+c2JfbGVuKTsKLQkgICAgZWxzZSBpZiAoc2l6ZW9mKHZ0eS0+c2JfYnVmKSA8IFRFTE5FVF9OQVdTX1NCX0xFTikKLQkgICAgICB2dHlfb3V0KHZ0eSwgIkJ1ZyBkZXRlY3RlZDogc2l6ZW9mKHZ0eS0+c2JfYnVmKSAlbHUgPCAlZCwgIgotCQkgICAgICAgInRvbyBzbWFsbCB0byBoYW5kbGUgdGhlIHRlbG5ldCBOQVdTIG9wdGlvbiIsCi0JCSAgICAgICAodV9sb25nKXNpemVvZih2dHktPnNiX2J1ZiksIFRFTE5FVF9OQVdTX1NCX0xFTik7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXZ0eS0+d2lkdGggPSAoKHZ0eS0+c2JfYnVmWzFdIDw8IDgpfHZ0eS0+c2JfYnVmWzJdKTsKLQkJdnR5LT5oZWlnaHQgPSAoKHZ0eS0+c2JfYnVmWzNdIDw8IDgpfHZ0eS0+c2JfYnVmWzRdKTsKLSNpZmRlZiBURUxORVRfT1BUSU9OX0RFQlVHCi0JCXZ0eV9vdXQodnR5LCAiVEVMTkVUIE5BV1Mgd2luZG93IHNpemUgbmVnb3RpYXRpb24gY29tcGxldGVkOiAiCi0JCQkgICAgICAid2lkdGggJWQsIGhlaWdodCAlZCVzIiwKLQkJCXZ0eS0+d2lkdGgsIHZ0eS0+aGVpZ2h0LCBWVFlfTkVXTElORSk7Ci0jZW5kaWYKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotCXZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzID0gMDsKLQlyZXR1cm4gMDsKLQlicmVhazsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotLyogRXhlY3V0ZSBjdXJyZW50IGNvbW1hbmQgbGluZS4gKi8KLXN0YXRpYyBpbnQgdnR5X2V4ZWN1dGUoc3RydWN0IHZ0eSAqdnR5KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBDTURfU1VDQ0VTUzsKLQotCXN3aXRjaCAodnR5LT5ub2RlKSB7Ci0JY2FzZSBBVVRIX05PREU6Ci0JY2FzZSBBVVRIX0VOQUJMRV9OT0RFOgotCQl2dHlfYXV0aCh2dHksIHZ0eS0+YnVmKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gdnR5X2NvbW1hbmQodnR5LCB2dHktPmJ1Zik7Ci0JCWlmICh2dHktPnR5cGUgPT0gVlRZX1RFUk0pCi0JCQl2dHlfaGlzdF9hZGQodnR5KTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogQ2xlYXIgY29tbWFuZCBsaW5lIGJ1ZmZlci4gKi8KLQl2dHktPmNwID0gdnR5LT5sZW5ndGggPSAwOwotCXZ0eV9jbGVhcl9idWYodnR5KTsKLQotCWlmICh2dHktPnN0YXR1cyAhPSBWVFlfQ0xPU0UpCi0JCXZ0eV9wcm9tcHQodnR5KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFNlbmQgV0lMTCBURUxPUFRfRUNITyB0byByZW1vdGUgc2VydmVyLiAqLwotc3RhdGljIHZvaWQKLXZ0eV93aWxsX2VjaG8gKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl1bnNpZ25lZCBjaGFyIGNtZFtdID0geyBJQUMsIFdJTEwsIFRFTE9QVF9FQ0hPLCAnXDAnIH07Ci0JdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOwotfQotCi0vKiBNYWtlIHN1cHByZXNzIEdvLUFoZWFkIHRlbG5ldCBvcHRpb24uICovCi1zdGF0aWMgdm9pZAotdnR5X3dpbGxfc3VwcHJlc3NfZ29fYWhlYWQgKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl1bnNpZ25lZCBjaGFyIGNtZFtdID0geyBJQUMsIFdJTEwsIFRFTE9QVF9TR0EsICdcMCcgfTsKLQl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Ci19Ci0KLS8qIE1ha2UgZG9uJ3QgdXNlIGxpbmVtb2RlIG92ZXIgdGVsbmV0LiAqLwotc3RhdGljIHZvaWQKLXZ0eV9kb250X2xpbmVtb2RlIChzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0JdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBET05ULCBURUxPUFRfTElORU1PREUsICdcMCcgfTsKLQl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Ci19Ci0KLS8qIFVzZSB3aW5kb3cgc2l6ZS4gKi8KLXN0YXRpYyB2b2lkCi12dHlfZG9fd2luZG93X3NpemUgKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl1bnNpZ25lZCBjaGFyIGNtZFtdID0geyBJQUMsIERPLCBURUxPUFRfTkFXUywgJ1wwJyB9OwotCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKLX0KLQotc3RhdGljIHZvaWQgdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyhzdHJ1Y3QgdnR5ICopOwotc3RhdGljIHZvaWQgdnR5X3JlZHJhd19saW5lKHN0cnVjdCB2dHkgKik7Ci0KLS8qIFByaW50IGNvbW1hbmQgbGluZSBoaXN0b3J5LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbQotICAgdnR5X25leHRfbGluZSBhbmQgdnR5X3ByZXZpb3VzX2xpbmUuICovCi1zdGF0aWMgdm9pZCB2dHlfaGlzdG9yeV9wcmludChzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0JaW50IGxlbmd0aDsKLQotCXZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcodnR5KTsKLQotCS8qIEdldCBwcmV2aW91cyBsaW5lIGZyb20gaGlzdG9yeSBidWZmZXIgKi8KLQlsZW5ndGggPSBzdHJsZW4odnR5LT5oaXN0W3Z0eS0+aHBdKTsKLQltZW1jcHkodnR5LT5idWYsIHZ0eS0+aGlzdFt2dHktPmhwXSwgbGVuZ3RoKTsKLQl2dHktPmNwID0gdnR5LT5sZW5ndGggPSBsZW5ndGg7Ci0KLQkvKiBSZWRyYXcgY3VycmVudCBsaW5lICovCi0JdnR5X3JlZHJhd19saW5lKHZ0eSk7Ci19Ci0KLS8qIFNob3cgbmV4dCBjb21tYW5kIGxpbmUgaGlzdG9yeS4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9uZXh0X2xpbmUoc3RydWN0IHZ0eSAqdnR5KQotewotCWludCB0cnlfaW5kZXg7Ci0KLQlpZiAodnR5LT5ocCA9PSB2dHktPmhpbmRleCkKLQkJcmV0dXJuOwotCi0JLyogVHJ5IGlzIHRoZXJlIGhpc3RvcnkgZXhpc3Qgb3Igbm90LiAqLwotCXRyeV9pbmRleCA9IHZ0eS0+aHA7Ci0JaWYgKHRyeV9pbmRleCA9PSAoVlRZX01BWEhJU1QgLSAxKSkKLQkJdHJ5X2luZGV4ID0gMDsKLQllbHNlCi0JCXRyeV9pbmRleCsrOwotCi0JLyogSWYgdGhlcmUgaXMgbm90IGhpc3RvcnkgcmV0dXJuLiAqLwotCWlmICh2dHktPmhpc3RbdHJ5X2luZGV4XSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZWxzZQotCQl2dHktPmhwID0gdHJ5X2luZGV4OwotCi0JdnR5X2hpc3RvcnlfcHJpbnQodnR5KTsKLX0KLQotLyogU2hvdyBwcmV2aW91cyBjb21tYW5kIGxpbmUgaGlzdG9yeS4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9wcmV2aW91c19saW5lKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQlpbnQgdHJ5X2luZGV4OwotCi0JdHJ5X2luZGV4ID0gdnR5LT5ocDsKLQlpZiAodHJ5X2luZGV4ID09IDApCi0JCXRyeV9pbmRleCA9IFZUWV9NQVhISVNUIC0gMTsKLQllbHNlCi0JCXRyeV9pbmRleC0tOwotCi0JaWYgKHZ0eS0+aGlzdFt0cnlfaW5kZXhdID09IE5VTEwpCi0JCXJldHVybjsKLQllbHNlCi0JCXZ0eS0+aHAgPSB0cnlfaW5kZXg7Ci0KLQl2dHlfaGlzdG9yeV9wcmludCh2dHkpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJlZHJhdyBhbGwgb2YgdGhlIGNvbW1hbmQgbGluZSBjaGFyYWN0ZXIuICovCi1zdGF0aWMgdm9pZCB2dHlfcmVkcmF3X2xpbmUoc3RydWN0IHZ0eSAqdnR5KQotewotCXZ0eV93cml0ZSh2dHksIHZ0eS0+YnVmLCB2dHktPmxlbmd0aCk7Ci0JdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoOwotfQotCi0vKiBGb3J3YXJkIHdvcmQuICovCi1zdGF0aWMgdm9pZCB2dHlfZm9yd2FyZF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSAhPSAnICcpCi0JCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKLQotCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdID09ICcgJykKLQkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOwotfQotCi0vKiBCYWNrd2FyZCB3b3JkIHdpdGhvdXQgc2tpcHBpbmcgdHJhaW5pbmcgc3BhY2UuICovCi1zdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfcHVyZV93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdICE9ICcgJykKLQkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKLX0KLQotLyogQmFja3dhcmQgd29yZC4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9iYWNrd2FyZF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdID09ICcgJykKLQkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKLQotCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gIT0gJyAnKQotCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOwotfQotCi0vKiBXaGVuICdeRCcgaXMgdHlwZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSB3ZSBtb3ZlIHRvIHRoZSBkb3duCi0gICBsZXZlbC4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9kb3duX2xldmVsKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOwotCSgqY29uZmlnX2V4aXRfY21kLmZ1bmMpIChOVUxMLCB2dHksIDAsIE5VTEwpOwotCXZ0eV9wcm9tcHQodnR5KTsKLQl2dHktPmNwID0gMDsKLX0KLQotLyogV2hlbiAnXlonIGlzIHJlY2VpdmVkIGZyb20gdnR5LCBtb3ZlIGRvd24gdG8gdGhlIGVuYWJsZSBtb2RlLiAqLwotc3RhdGljIHZvaWQgdnR5X2VuZF9jb25maWcoc3RydWN0IHZ0eSAqdnR5KQotewotCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7Ci0KLQlzd2l0Y2ggKHZ0eS0+bm9kZSkgewotCWNhc2UgVklFV19OT0RFOgotCWNhc2UgRU5BQkxFX05PREU6Ci0JCS8qIE5vdGhpbmcgdG8gZG8uICovCi0JCWJyZWFrOwotCWNhc2UgQ09ORklHX05PREU6Ci0JY2FzZSBWVFlfTk9ERToKLQkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKLQkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIFVua25vd24gbm9kZSwgd2UgaGF2ZSB0byBpZ25vcmUgaXQuICovCi0JCWJyZWFrOwotCX0KLQotCXZ0eV9wcm9tcHQodnR5KTsKLQl2dHktPmNwID0gMDsKLX0KLQotLyogRGVsZXRlIGEgY2hhcmN0ZXIgYXQgdGhlIGN1cnJlbnQgcG9pbnQuICovCi1zdGF0aWMgdm9pZCB2dHlfZGVsZXRlX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQotewotCWludCBpOwotCWludCBzaXplOwotCi0JaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUgfHwgdnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpCi0JCXJldHVybjsKLQotCWlmICh2dHktPmxlbmd0aCA9PSAwKSB7Ci0JCXZ0eV9kb3duX2xldmVsKHZ0eSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodnR5LT5jcCA9PSB2dHktPmxlbmd0aCkKLQkJcmV0dXJuOwkJLyogY29tcGxldGlvbiBuZWVkIGhlcmU/ICovCi0KLQlzaXplID0gdnR5LT5sZW5ndGggLSB2dHktPmNwOwotCi0JdnR5LT5sZW5ndGgtLTsKLQltZW1tb3ZlKCZ2dHktPmJ1Zlt2dHktPmNwXSwgJnZ0eS0+YnVmW3Z0eS0+Y3AgKyAxXSwgc2l6ZSAtIDEpOwotCXZ0eS0+YnVmW3Z0eS0+bGVuZ3RoXSA9ICdcMCc7Ci0KLQl2dHlfd3JpdGUodnR5LCAmdnR5LT5idWZbdnR5LT5jcF0sIHNpemUgLSAxKTsKLQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X3NwYWNlX2NoYXIsIDEpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9iYWNrd2FyZF9jaGFyLCAxKTsKLX0KLQotLyogRGVsZXRlIGEgY2hhcmFjdGVyIGJlZm9yZSB0aGUgcG9pbnQuICovCi1zdGF0aWMgdm9pZCB2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQotewotCWlmICh2dHktPmNwID09IDApCi0JCXJldHVybjsKLQotCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Ci0JdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7Ci19Ci0KLS8qIEtpbGwgcmVzdCBvZiBsaW5lIGZyb20gY3VycmVudCBwb2ludC4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9raWxsX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQotewotCWludCBpOwotCWludCBzaXplOwotCi0Jc2l6ZSA9IHZ0eS0+bGVuZ3RoIC0gdnR5LT5jcDsKLQotCWlmIChzaXplID09IDApCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfc3BhY2VfY2hhciwgMSk7Ci0JZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9iYWNrd2FyZF9jaGFyLCAxKTsKLQotCW1lbXNldCgmdnR5LT5idWZbdnR5LT5jcF0sIDAsIHNpemUpOwotCXZ0eS0+bGVuZ3RoID0gdnR5LT5jcDsKLX0KLQotLyogS2lsbCBsaW5lIGZyb20gdGhlIGJlZ2lubmluZy4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcoc3RydWN0IHZ0eSAqdnR5KQotewotCXZ0eV9iZWdpbm5pbmdfb2ZfbGluZSh2dHkpOwotCXZ0eV9raWxsX2xpbmUodnR5KTsKLX0KLQotLyogRGVsZXRlIGEgd29yZCBiZWZvcmUgdGhlIHBvaW50LiAqLwotc3RhdGljIHZvaWQgdnR5X2ZvcndhcmRfa2lsbF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSA9PSAnICcpCi0JCXZ0eV9kZWxldGVfY2hhcih2dHkpOwotCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdICE9ICcgJykKLQkJdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7Ci19Ci0KLS8qIERlbGV0ZSBhIHdvcmQgYmVmb3JlIHRoZSBwb2ludC4gKi8KLXN0YXRpYyB2b2lkIHZ0eV9iYWNrd2FyZF9raWxsX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQotewotCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gPT0gJyAnKQotCQl2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIodnR5KTsKLQl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdICE9ICcgJykKLQkJdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHZ0eSk7Ci19Ci0KLS8qIFRyYW5zcG9zZSBjaGFycyBiZWZvcmUgb3IgYXQgdGhlIHBvaW50LiAqLwotc3RhdGljIHZvaWQgdnR5X3RyYW5zcG9zZV9jaGFycyhzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0JY2hhciBjMSwgYzI7Ci0KLQkvKiBJZiBsZW5ndGggaXMgc2hvcnQgb3IgcG9pbnQgaXMgbmVhciBieSB0aGUgYmVnaW5uaW5nIG9mIGxpbmUgdGhlbgotCSAgIHJldHVybi4gKi8KLQlpZiAodnR5LT5sZW5ndGggPCAyIHx8IHZ0eS0+Y3AgPCAxKQotCQlyZXR1cm47Ci0KLQkvKiBJbiBjYXNlIG9mIHBvaW50IGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KLQlpZiAodnR5LT5jcCA9PSB2dHktPmxlbmd0aCkgewotCQljMSA9IHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXTsKLQkJYzIgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMl07Ci0KLQkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKLQkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKLQkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMxKTsKLQkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMyKTsKLQl9IGVsc2UgewotCQljMSA9IHZ0eS0+YnVmW3Z0eS0+Y3BdOwotCQljMiA9IHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXTsKLQotCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOwotCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzEpOwotCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzIpOwotCX0KLX0KLQotLyogRG8gY29tcGxldGlvbiBhdCB2dHkgaW50ZXJmYWNlLiAqLwotc3RhdGljIHZvaWQgdnR5X2NvbXBsZXRlX2NvbW1hbmQoc3RydWN0IHZ0eSAqdnR5KQotewotCWludCBpOwotCWludCByZXQ7Ci0JY2hhciAqKm1hdGNoZWQgPSBOVUxMOwotCXZlY3RvciB2bGluZTsKLQotCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFIHx8IHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKQotCQlyZXR1cm47Ci0KLQl2bGluZSA9IGNtZF9tYWtlX3N0cnZlYyh2dHktPmJ1Zik7Ci0JaWYgKHZsaW5lID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIEluIGNhc2Ugb2YgJ2hlbHAgXHQnLiAqLwotCWlmIChpc3NwYWNlKChpbnQpdnR5LT5idWZbdnR5LT5sZW5ndGggLSAxXSkpCi0JCXZlY3Rvcl9zZXQodmxpbmUsICdcMCcpOwotCi0JbWF0Y2hlZCA9IGNtZF9jb21wbGV0ZV9jb21tYW5kKHZsaW5lLCB2dHksICZyZXQpOwotCi0JY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKLQotCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7Ci0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgotCQl2dHlfb3V0KHZ0eSwgIiUlIEFtYmlndW91cyBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOwotCQl2dHlfcHJvbXB0KHZ0eSk7Ci0JCXZ0eV9yZWRyYXdfbGluZSh2dHkpOwotCQlicmVhazsKLQljYXNlIENNRF9FUlJfTk9fTUFUQ0g6Ci0JCS8qIHZ0eV9vdXQgKHZ0eSwgIiUlIFRoZXJlIGlzIG5vIG1hdGNoZWQgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsgKi8KLQkJdnR5X3Byb21wdCh2dHkpOwotCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfQ09NUExFVEVfRlVMTF9NQVRDSDoKLQkJdnR5X3Byb21wdCh2dHkpOwotCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKLQkJdnR5X2JhY2t3YXJkX3B1cmVfd29yZCh2dHkpOwotCQl2dHlfaW5zZXJ0X3dvcmRfb3ZlcndyaXRlKHZ0eSwgbWF0Y2hlZFswXSk7Ci0JCXZ0eV9zZWxmX2luc2VydCh2dHksICcgJyk7Ci0JCS8vdGFsbG9jX2ZyZWUobWF0Y2hlZFswXSk7Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0NPTVBMRVRFX01BVENIOgotCQl2dHlfcHJvbXB0KHZ0eSk7Ci0JCXZ0eV9yZWRyYXdfbGluZSh2dHkpOwotCQl2dHlfYmFja3dhcmRfcHVyZV93b3JkKHZ0eSk7Ci0JCXZ0eV9pbnNlcnRfd29yZF9vdmVyd3JpdGUodnR5LCBtYXRjaGVkWzBdKTsKLQkJdGFsbG9jX2ZyZWUobWF0Y2hlZFswXSk7Ci0JCXZlY3Rvcl9vbmx5X2luZGV4X2ZyZWUobWF0Y2hlZCk7Ci0JCXJldHVybjsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfQ09NUExFVEVfTElTVF9NQVRDSDoKLQkJZm9yIChpID0gMDsgbWF0Y2hlZFtpXSAhPSBOVUxMOyBpKyspIHsKLQkJCWlmIChpICE9IDAgJiYgKChpICUgNikgPT0gMCkpCi0JCQkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKLQkJCXZ0eV9vdXQodnR5LCAiJS0xMHMgIiwgbWF0Y2hlZFtpXSk7Ci0JCQl0YWxsb2NfZnJlZShtYXRjaGVkW2ldKTsKLQkJfQotCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOwotCi0JCXZ0eV9wcm9tcHQodnR5KTsKLQkJdnR5X3JlZHJhd19saW5lKHZ0eSk7Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0VSUl9OT1RISU5HX1RPRE86Ci0JCXZ0eV9wcm9tcHQodnR5KTsKLQkJdnR5X3JlZHJhd19saW5lKHZ0eSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlpZiAobWF0Y2hlZCkKLQkJdmVjdG9yX29ubHlfaW5kZXhfZnJlZShtYXRjaGVkKTsKLX0KLQotc3RhdGljIHZvaWQKLXZ0eV9kZXNjcmliZV9mb2xkKHN0cnVjdCB2dHkgKnZ0eSwgaW50IGNtZF93aWR0aCwKLQkJICB1bnNpZ25lZCBpbnQgZGVzY193aWR0aCwgc3RydWN0IGRlc2MgKmRlc2MpCi17Ci0JY2hhciAqYnVmOwotCWNvbnN0IGNoYXIgKmNtZCwgKnA7Ci0JaW50IHBvczsKLQotCWNtZCA9IGRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kOwotCi0JaWYgKGRlc2Nfd2lkdGggPD0gMCkgewotCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIGNtZF93aWR0aCwgY21kLCBkZXNjLT5zdHIsCi0JCQlWVFlfTkVXTElORSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlidWYgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LCBzdHJsZW4oZGVzYy0+c3RyKSArIDEsICJkZXNjcmliZV9mb2xkIik7Ci0JaWYgKCFidWYpCi0JCXJldHVybjsKLQotCWZvciAocCA9IGRlc2MtPnN0cjsgc3RybGVuKHApID4gZGVzY193aWR0aDsgcCArPSBwb3MgKyAxKSB7Ci0JCWZvciAocG9zID0gZGVzY193aWR0aDsgcG9zID4gMDsgcG9zLS0pCi0JCQlpZiAoKihwICsgcG9zKSA9PSAnICcpCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKHBvcyA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJc3RybmNweShidWYsIHAsIHBvcyk7Ci0JCWJ1Zltwb3NdID0gJ1wwJzsKLQkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCBjbWRfd2lkdGgsIGNtZCwgYnVmLCBWVFlfTkVXTElORSk7Ci0KLQkJY21kID0gIiI7Ci0JfQotCi0JdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCBjbWRfd2lkdGgsIGNtZCwgcCwgVlRZX05FV0xJTkUpOwotCi0JdGFsbG9jX2ZyZWUoYnVmKTsKLX0KLQotLyogRGVzY3JpYmUgbWF0Y2hlZCBjb21tYW5kIGZ1bmN0aW9uLiAqLwotc3RhdGljIHZvaWQgdnR5X2Rlc2NyaWJlX2NvbW1hbmQoc3RydWN0IHZ0eSAqdnR5KQotewotCWludCByZXQ7Ci0JdmVjdG9yIHZsaW5lOwotCXZlY3RvciBkZXNjcmliZTsKLQl1bnNpZ25lZCBpbnQgaSwgd2lkdGgsIGRlc2Nfd2lkdGg7Ci0Jc3RydWN0IGRlc2MgKmRlc2MsICpkZXNjX2NyID0gTlVMTDsKLQotCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKHZ0eS0+YnVmKTsKLQotCS8qIEluIGNhc2Ugb2YgJz4gPycuICovCi0JaWYgKHZsaW5lID09IE5VTEwpIHsKLQkJdmxpbmUgPSB2ZWN0b3JfaW5pdCgxKTsKLQkJdmVjdG9yX3NldCh2bGluZSwgJ1wwJyk7Ci0JfSBlbHNlIGlmIChpc3NwYWNlKChpbnQpdnR5LT5idWZbdnR5LT5sZW5ndGggLSAxXSkpCi0JCXZlY3Rvcl9zZXQodmxpbmUsICdcMCcpOwotCi0JZGVzY3JpYmUgPSBjbWRfZGVzY3JpYmVfY29tbWFuZCh2bGluZSwgdnR5LCAmcmV0KTsKLQotCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7Ci0KLQkvKiBBbWJpZ3VvdXMgZXJyb3IuICovCi0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgotCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOwotCQl2dHlfb3V0KHZ0eSwgIiUlIEFtYmlndW91cyBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOwotCQl2dHlfcHJvbXB0KHZ0eSk7Ci0JCXZ0eV9yZWRyYXdfbGluZSh2dHkpOwotCQlyZXR1cm47Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKLQkJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKLQkJdnR5X291dCh2dHksICIlJSBUaGVyZSBpcyBubyBtYXRjaGVkIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7Ci0JCXZ0eV9wcm9tcHQodnR5KTsKLQkJdnR5X3JlZHJhd19saW5lKHZ0eSk7Ci0JCXJldHVybjsKLQkJYnJlYWs7Ci0JfQotCi0JLyogR2V0IHdpZHRoIG9mIGNvbW1hbmQgc3RyaW5nLiAqLwotCXdpZHRoID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShkZXNjcmliZSk7IGkrKykKLQkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3JpYmUsIGkpKSAhPSBOVUxMKSB7Ci0JCQl1bnNpZ25lZCBpbnQgbGVuOwotCi0JCQlpZiAoZGVzYy0+Y21kWzBdID09ICdcMCcpCi0JCQkJY29udGludWU7Ci0KLQkJCWxlbiA9IHN0cmxlbihkZXNjLT5jbWQpOwotCQkJaWYgKGRlc2MtPmNtZFswXSA9PSAnLicpCi0JCQkJbGVuLS07Ci0KLQkJCWlmICh3aWR0aCA8IGxlbikKLQkJCQl3aWR0aCA9IGxlbjsKLQkJfQotCi0JLyogR2V0IHdpZHRoIG9mIGRlc2NyaXB0aW9uIHN0cmluZy4gKi8KLQlkZXNjX3dpZHRoID0gdnR5LT53aWR0aCAtICh3aWR0aCArIDYpOwotCi0JLyogUHJpbnQgb3V0IGRlc2NyaXB0aW9uLiAqLwotCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGRlc2NyaWJlKTsgaSsrKQotCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjcmliZSwgaSkpICE9IE5VTEwpIHsKLQkJCWlmIChkZXNjLT5jbWRbMF0gPT0gJ1wwJykKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKHN0cmNtcChkZXNjLT5jbWQsICI8Y3I+IikgPT0gMCkgewotCQkJCWRlc2NfY3IgPSBkZXNjOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoIWRlc2MtPnN0cikKLQkJCQl2dHlfb3V0KHZ0eSwgIiAgJS1zJXMiLAotCQkJCQlkZXNjLT5jbWRbMF0gPT0KLQkJCQkJJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKLQkJCQkJVlRZX05FV0xJTkUpOwotCQkJZWxzZSBpZiAoZGVzY193aWR0aCA+PSBzdHJsZW4oZGVzYy0+c3RyKSkKLQkJCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIHdpZHRoLAotCQkJCQlkZXNjLT5jbWRbMF0gPT0KLQkJCQkJJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKLQkJCQkJZGVzYy0+c3RyLCBWVFlfTkVXTElORSk7Ci0JCQllbHNlCi0JCQkJdnR5X2Rlc2NyaWJlX2ZvbGQodnR5LCB3aWR0aCwgZGVzY193aWR0aCwgZGVzYyk7Ci0KLSNpZiAwCi0JCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAlcyVzIiwgd2lkdGgKLQkJCQlkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKLQkJCQlkZXNjLT5zdHIgPyBkZXNjLT5zdHIgOiAiIiwgVlRZX05FV0xJTkUpOwotI2VuZGlmCQkJCS8qIDAgKi8KLQkJfQotCi0JaWYgKChkZXNjID0gZGVzY19jcikpIHsKLQkJaWYgKCFkZXNjLT5zdHIpCi0JCQl2dHlfb3V0KHZ0eSwgIiAgJS1zJXMiLAotCQkJCWRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAotCQkJCVZUWV9ORVdMSU5FKTsKLQkJZWxzZSBpZiAoZGVzY193aWR0aCA+PSBzdHJsZW4oZGVzYy0+c3RyKSkKLQkJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgd2lkdGgsCi0JCQkJZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCi0JCQkJZGVzYy0+c3RyLCBWVFlfTkVXTElORSk7Ci0JCWVsc2UKLQkJCXZ0eV9kZXNjcmliZV9mb2xkKHZ0eSwgd2lkdGgsIGRlc2Nfd2lkdGgsIGRlc2MpOwotCX0KLQotCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7Ci0JdmVjdG9yX2ZyZWUoZGVzY3JpYmUpOwotCi0JdnR5X3Byb21wdCh2dHkpOwotCXZ0eV9yZWRyYXdfbGluZSh2dHkpOwotfQotCi0vKiBeQyBzdG9wIGN1cnJlbnQgaW5wdXQgYW5kIGRvIG5vdCBhZGQgY29tbWFuZCBsaW5lIHRvIHRoZSBoaXN0b3J5LiAqLwotc3RhdGljIHZvaWQgdnR5X3N0b3BfaW5wdXQoc3RydWN0IHZ0eSAqdnR5KQotewotCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aCA9IDA7Ci0JdnR5X2NsZWFyX2J1Zih2dHkpOwotCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7Ci0KLQlzd2l0Y2ggKHZ0eS0+bm9kZSkgewotCWNhc2UgVklFV19OT0RFOgotCWNhc2UgRU5BQkxFX05PREU6Ci0JCS8qIE5vdGhpbmcgdG8gZG8uICovCi0JCWJyZWFrOwotCWNhc2UgQ09ORklHX05PREU6Ci0JY2FzZSBWVFlfTk9ERToKLQkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKLQkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIFVua25vd24gbm9kZSwgd2UgaGF2ZSB0byBpZ25vcmUgaXQuICovCi0JCWJyZWFrOwotCX0KLQl2dHlfcHJvbXB0KHZ0eSk7Ci0KLQkvKiBTZXQgaGlzdG9yeSBwb2ludGVyIHRvIHRoZSBsYXRlc3Qgb25lLiAqLwotCXZ0eS0+aHAgPSB2dHktPmhpbmRleDsKLX0KLQotI2RlZmluZSBDT05UUk9MKFgpICAoKFgpIC0gJ0AnKQotI2RlZmluZSBWVFlfTk9STUFMICAgICAwCi0jZGVmaW5lIFZUWV9QUkVfRVNDQVBFIDEKLSNkZWZpbmUgVlRZX0VTQ0FQRSAgICAgMgotCi0vKiBFc2NhcGUgY2hhcmFjdGVyIGNvbW1hbmQgbWFwLiAqLwotc3RhdGljIHZvaWQgdnR5X2VzY2FwZV9tYXAodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0Jc3dpdGNoIChjKSB7Ci0JY2FzZSAoJ0EnKToKLQkJdnR5X3ByZXZpb3VzX2xpbmUodnR5KTsKLQkJYnJlYWs7Ci0JY2FzZSAoJ0InKToKLQkJdnR5X25leHRfbGluZSh2dHkpOwotCQlicmVhazsKLQljYXNlICgnQycpOgotCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7Ci0JCWJyZWFrOwotCWNhc2UgKCdEJyk6Ci0JCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUuICovCi0JdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOwotfQotCi0vKiBRdWl0IHByaW50IG91dCB0byB0aGUgYnVmZmVyLiAqLwotc3RhdGljIHZvaWQgdnR5X2J1ZmZlcl9yZXNldChzdHJ1Y3QgdnR5ICp2dHkpCi17Ci0JYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7Ci0JdnR5X3Byb21wdCh2dHkpOwotCXZ0eV9yZWRyYXdfbGluZSh2dHkpOwotfQotCi0vKiBSZWFkIGRhdGEgdmlhIHZ0eSBzb2NrZXQuICovCi1pbnQgdnR5X3JlYWQoc3RydWN0IHZ0eSAqdnR5KQotewotCWludCBpOwotCWludCBuYnl0ZXM7Ci0JdW5zaWduZWQgY2hhciBidWZbVlRZX1JFQURfQlVGU0laXTsKLQotCWludCB2dHlfc29jayA9IHZ0eS0+ZmQ7Ci0KLQkvKiBSZWFkIHJhdyBkYXRhIGZyb20gc29ja2V0ICovCi0JaWYgKChuYnl0ZXMgPSByZWFkKHZ0eS0+ZmQsIGJ1ZiwgVlRZX1JFQURfQlVGU0laKSkgPD0gMCkgewotCQlpZiAobmJ5dGVzIDwgMCkgewotCQkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkgewotCQkJCXZ0eV9ldmVudChWVFlfUkVBRCwgdnR5X3NvY2ssIHZ0eSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7Ci0JCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykgewotCQlpZiAoYnVmW2ldID09IElBQykgewotCQkJaWYgKCF2dHktPmlhYykgewotCQkJCXZ0eS0+aWFjID0gMTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdnR5LT5pYWMgPSAwOwotCQkJfQotCQl9Ci0KLQkJaWYgKHZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzICYmICF2dHktPmlhYykgewotCQkJaWYgKHZ0eS0+c2JfbGVuIDwgc2l6ZW9mKHZ0eS0+c2JfYnVmKSkKLQkJCQl2dHktPnNiX2J1Zlt2dHktPnNiX2xlbl0gPSBidWZbaV07Ci0JCQl2dHktPnNiX2xlbisrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAodnR5LT5pYWMpIHsKLQkJCS8qIEluIGNhc2Ugb2YgdGVsbmV0IGNvbW1hbmQgKi8KLQkJCWludCByZXQgPSAwOwotCQkJcmV0ID0gdnR5X3RlbG5ldF9vcHRpb24odnR5LCBidWYgKyBpLCBuYnl0ZXMgLSBpKTsKLQkJCXZ0eS0+aWFjID0gMDsKLQkJCWkgKz0gcmV0OwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAodnR5LT5zdGF0dXMgPT0gVlRZX01PUkUpIHsKLQkJCXN3aXRjaCAoYnVmW2ldKSB7Ci0JCQljYXNlIENPTlRST0woJ0MnKToKLQkJCWNhc2UgJ3EnOgotCQkJY2FzZSAnUSc6Ci0JCQkJdnR5X2J1ZmZlcl9yZXNldCh2dHkpOwotCQkJCWJyZWFrOwotI2lmIDAJCQkJLyogTW9yZSBsaW5lIGRvZXMgbm90IHdvcmsgZm9yICJzaG93IGlwIGJncCIuICAqLwotCQkJY2FzZSAnXG4nOgotCQkJY2FzZSAnXHInOgotCQkJCXZ0eS0+c3RhdHVzID0gVlRZX01PUkVMSU5FOwotCQkJCWJyZWFrOwotI2VuZGlmCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBFc2NhcGUgY2hhcmFjdGVyLiAqLwotCQlpZiAodnR5LT5lc2NhcGUgPT0gVlRZX0VTQ0FQRSkgewotCQkJdnR5X2VzY2FwZV9tYXAoYnVmW2ldLCB2dHkpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBQcmUtZXNjYXBlIHN0YXR1cy4gKi8KLQkJaWYgKHZ0eS0+ZXNjYXBlID09IFZUWV9QUkVfRVNDQVBFKSB7Ci0JCQlzd2l0Y2ggKGJ1ZltpXSkgewotCQkJY2FzZSAnWyc6Ci0JCQkJdnR5LT5lc2NhcGUgPSBWVFlfRVNDQVBFOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnYic6Ci0JCQkJdnR5X2JhY2t3YXJkX3dvcmQodnR5KTsKLQkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdmJzoKLQkJCQl2dHlfZm9yd2FyZF93b3JkKHZ0eSk7Ci0JCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnZCc6Ci0JCQkJdnR5X2ZvcndhcmRfa2lsbF93b3JkKHZ0eSk7Ci0JCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05UUk9MKCdIJyk6Ci0JCQljYXNlIDB4N2Y6Ci0JCQkJdnR5X2JhY2t3YXJkX2tpbGxfd29yZCh2dHkpOwotCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQlzd2l0Y2ggKGJ1ZltpXSkgewotCQljYXNlIENPTlRST0woJ0EnKToKLQkJCXZ0eV9iZWdpbm5pbmdfb2ZfbGluZSh2dHkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09OVFJPTCgnQicpOgotCQkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKLQkJCWJyZWFrOwotCQljYXNlIENPTlRST0woJ0MnKToKLQkJCXZ0eV9zdG9wX2lucHV0KHZ0eSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDT05UUk9MKCdEJyk6Ci0JCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKLQkJCWJyZWFrOwotCQljYXNlIENPTlRST0woJ0UnKToKLQkJCXZ0eV9lbmRfb2ZfbGluZSh2dHkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09OVFJPTCgnRicpOgotCQkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09OVFJPTCgnSCcpOgotCQljYXNlIDB4N2Y6Ci0JCQl2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIodnR5KTsKLQkJCWJyZWFrOwotCQljYXNlIENPTlRST0woJ0snKToKLQkJCXZ0eV9raWxsX2xpbmUodnR5KTsKLQkJCWJyZWFrOwotCQljYXNlIENPTlRST0woJ04nKToKLQkJCXZ0eV9uZXh0X2xpbmUodnR5KTsKLQkJCWJyZWFrOwotCQljYXNlIENPTlRST0woJ1AnKToKLQkJCXZ0eV9wcmV2aW91c19saW5lKHZ0eSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDT05UUk9MKCdUJyk6Ci0JCQl2dHlfdHJhbnNwb3NlX2NoYXJzKHZ0eSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDT05UUk9MKCdVJyk6Ci0JCQl2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHZ0eSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDT05UUk9MKCdXJyk6Ci0JCQl2dHlfYmFja3dhcmRfa2lsbF93b3JkKHZ0eSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDT05UUk9MKCdaJyk6Ci0JCQl2dHlfZW5kX2NvbmZpZyh2dHkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1xuJzoKLQkJY2FzZSAnXHInOgotCQkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKLQkJCXZ0eV9leGVjdXRlKHZ0eSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnXHQnOgotCQkJdnR5X2NvbXBsZXRlX2NvbW1hbmQodnR5KTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFCi0JCQkgICAgfHwgdnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpCi0JCQkJdnR5X3NlbGZfaW5zZXJ0KHZ0eSwgYnVmW2ldKTsKLQkJCWVsc2UKLQkJCQl2dHlfZGVzY3JpYmVfY29tbWFuZCh2dHkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1wwMzMnOgotCQkJaWYgKGkgKyAxIDwgbmJ5dGVzICYmIGJ1ZltpICsgMV0gPT0gJ1snKSB7Ci0JCQkJdnR5LT5lc2NhcGUgPSBWVFlfRVNDQVBFOwotCQkJCWkrKzsKLQkJCX0gZWxzZQotCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX1BSRV9FU0NBUEU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmIChidWZbaV0gPiAzMSAmJiBidWZbaV0gPCAxMjcpCi0JCQkJdnR5X3NlbGZfaW5zZXJ0KHZ0eSwgYnVmW2ldKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgc3RhdHVzLiAqLwotCWlmICh2dHktPnN0YXR1cyA9PSBWVFlfQ0xPU0UpCi0JCXZ0eV9jbG9zZSh2dHkpOwotCWVsc2UgewotCQl2dHlfZXZlbnQoVlRZX1dSSVRFLCB2dHlfc29jaywgdnR5KTsKLQkJdnR5X2V2ZW50KFZUWV9SRUFELCB2dHlfc29jaywgdnR5KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJlYWQgdXAgY29uZmlndXJhdGlvbiBmaWxlICovCi1zdGF0aWMgaW50Ci12dHlfcmVhZF9maWxlKEZJTEUgKmNvbmZwKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHZ0eSAqdnR5OwotCi0JdnR5ID0gdnR5X25ldygpOwotCXZ0eS0+ZmQgPSAwOwotCXZ0eS0+dHlwZSA9IFZUWV9GSUxFOwotCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOwotCi0JcmV0ID0gY29uZmlnX2Zyb21fZmlsZSh2dHksIGNvbmZwKTsKLQotCWlmIChyZXQgIT0gQ01EX1NVQ0NFU1MpIHsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKLQkJCWZwcmludGYoc3RkZXJyLCAiQW1iaWd1b3VzIGNvbW1hbmQuXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIENNRF9FUlJfTk9fTUFUQ0g6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGlzIG5vIHN1Y2ggY29tbWFuZC5cbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZnByaW50ZihzdGRlcnIsICJFcnJvciBvY2N1cnJlZCBkdXJpbmcgcmVhZGluZyBiZWxvdyAiCi0JCQkibGluZTpcbiVzXG4iLCB2dHktPmJ1Zik7Ci0JCXZ0eV9jbG9zZSh2dHkpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl2dHlfY2xvc2UodnR5KTsKLQlyZXR1cm4gMDsKLX0KLQotLyogQ3JlYXRlIG5ldyB2dHkgc3RydWN0dXJlLiAqLwotc3RydWN0IHZ0eSAqCi12dHlfY3JlYXRlIChpbnQgdnR5X3NvY2ssIHZvaWQgKnByaXYpCi17Ci0gIHN0cnVjdCB2dHkgKnZ0eTsKLQotCXN0cnVjdCB0ZXJtaW9zIHQ7Ci0KLQl0Y2dldGF0dHIodnR5X3NvY2ssICZ0KTsKLQljZm1ha2VyYXcoJnQpOwotCXRjc2V0YXR0cih2dHlfc29jaywgVENTQU5PVywgJnQpOwotCi0gIC8qIEFsbG9jYXRlIG5ldyB2dHkgc3RydWN0dXJlIGFuZCBzZXQgdXAgZGVmYXVsdCB2YWx1ZXMuICovCi0gIHZ0eSA9IHZ0eV9uZXcgKCk7Ci0gIHZ0eS0+ZmQgPSB2dHlfc29jazsKLSAgdnR5LT5wcml2ID0gcHJpdjsKLSAgdnR5LT50eXBlID0gVlRZX1RFUk07Ci0gIGlmIChub19wYXNzd29yZF9jaGVjaykKLSAgICB7Ci0gICAgICBpZiAoaG9zdC5hZHZhbmNlZCkKLQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKLSAgICAgIGVsc2UKLQl2dHktPm5vZGUgPSBWSUVXX05PREU7Ci0gICAgfQotICBlbHNlCi0gICAgdnR5LT5ub2RlID0gQVVUSF9OT0RFOwotICB2dHktPmZhaWwgPSAwOwotICB2dHktPmNwID0gMDsKLSAgdnR5X2NsZWFyX2J1ZiAodnR5KTsKLSAgdnR5LT5sZW5ndGggPSAwOwotICBtZW1zZXQgKHZ0eS0+aGlzdCwgMCwgc2l6ZW9mICh2dHktPmhpc3QpKTsKLSAgdnR5LT5ocCA9IDA7Ci0gIHZ0eS0+aGluZGV4ID0gMDsKLSAgdmVjdG9yX3NldF9pbmRleCAodnR5dmVjLCB2dHlfc29jaywgdnR5KTsKLSAgdnR5LT5zdGF0dXMgPSBWVFlfTk9STUFMOwotICBpZiAoaG9zdC5saW5lcyA+PSAwKQotICAgIHZ0eS0+bGluZXMgPSBob3N0LmxpbmVzOwotICBlbHNlCi0gICAgdnR5LT5saW5lcyA9IC0xOwotCi0gIGlmICghIG5vX3Bhc3N3b3JkX2NoZWNrKQotICAgIHsKLSAgICAgIC8qIFZ0eSBpcyBub3QgYXZhaWxhYmxlIGlmIHBhc3N3b3JkIGlzbid0IHNldC4gKi8KLSAgICAgIGlmIChob3N0LnBhc3N3b3JkID09IE5VTEwgJiYgaG9zdC5wYXNzd29yZF9lbmNyeXB0ID09IE5VTEwpCi0JewotCSAgdnR5X291dCAodnR5LCAiVnR5IHBhc3N3b3JkIGlzIG5vdCBzZXQuJXMiLCBWVFlfTkVXTElORSk7Ci0JICB2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKLQkgIHZ0eV9jbG9zZSAodnR5KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogU2F5IGhlbGxvIHRvIHRoZSB3b3JsZC4gKi8KLSAgdnR5X2hlbGxvICh2dHkpOwotICBpZiAoISBub19wYXNzd29yZF9jaGVjaykKLSAgICB2dHlfb3V0ICh2dHksICIlc1VzZXIgQWNjZXNzIFZlcmlmaWNhdGlvbiVzJXMiLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FKTsKLQotICAvKiBTZXR0aW5nIHVwIHRlcm1pbmFsLiAqLwotICB2dHlfd2lsbF9lY2hvICh2dHkpOwotICB2dHlfd2lsbF9zdXBwcmVzc19nb19haGVhZCAodnR5KTsKLQotICB2dHlfZG9udF9saW5lbW9kZSAodnR5KTsKLSAgdnR5X2RvX3dpbmRvd19zaXplICh2dHkpOwotICAvKiB2dHlfZG9udF9sZmxvd19haGVhZCAodnR5KTsgKi8KLQotICB2dHlfcHJvbXB0ICh2dHkpOwotCi0gIC8qIEFkZCByZWFkL3dyaXRlIHRocmVhZC4gKi8KLSAgdnR5X2V2ZW50IChWVFlfV1JJVEUsIHZ0eV9zb2NrLCB2dHkpOwotICB2dHlfZXZlbnQgKFZUWV9SRUFELCB2dHlfc29jaywgdnR5KTsKLQotICByZXR1cm4gdnR5OwotfQotCi1ERUZVTihjb25maWdfd2hvLCBjb25maWdfd2hvX2NtZCwgIndobyIsICJEaXNwbGF5IHdobyBpcyBvbiB2dHlcbiIpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IHZ0eSAqdjsKLQotCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZ0eXZlYyk7IGkrKykKLQkJaWYgKCh2ID0gdmVjdG9yX3Nsb3QodnR5dmVjLCBpKSkgIT0gTlVMTCkKLQkJCXZ0eV9vdXQodnR5LCAiJXN2dHlbJWRdICVzIiwKLQkJCQl2LT5jb25maWcgPyAiKiIgOiAiICIsIGksIFZUWV9ORVdMSU5FKTsKLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLS8qIE1vdmUgdG8gdnR5IGNvbmZpZ3VyYXRpb24gbW9kZS4gKi8KLURFRlVOKGxpbmVfdnR5LAotICAgICAgbGluZV92dHlfY21kLAotICAgICAgImxpbmUgdnR5IiwgIkNvbmZpZ3VyZSBhIHRlcm1pbmFsIGxpbmVcbiIgIlZpcnR1YWwgdGVybWluYWxcbiIpCi17Ci0JdnR5LT5ub2RlID0gVlRZX05PREU7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi0vKiB2dHkgbG9naW4uICovCi1ERUZVTih2dHlfbG9naW4sIHZ0eV9sb2dpbl9jbWQsICJsb2dpbiIsICJFbmFibGUgcGFzc3dvcmQgY2hlY2tpbmdcbiIpCi17Ci0Jbm9fcGFzc3dvcmRfY2hlY2sgPSAwOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4obm9fdnR5X2xvZ2luLAotICAgICAgbm9fdnR5X2xvZ2luX2NtZCwgIm5vIGxvZ2luIiwgTk9fU1RSICJFbmFibGUgcGFzc3dvcmQgY2hlY2tpbmdcbiIpCi17Ci0Jbm9fcGFzc3dvcmRfY2hlY2sgPSAxOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4oc2VydmljZV9hZHZhbmNlZF92dHksCi0gICAgICBzZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQsCi0gICAgICAic2VydmljZSBhZHZhbmNlZC12dHkiLAotICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBhZHZhbmNlZCBtb2RlIHZ0eSBpbnRlcmZhY2VcbiIpCi17Ci0JaG9zdC5hZHZhbmNlZCA9IDE7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihub19zZXJ2aWNlX2FkdmFuY2VkX3Z0eSwKLSAgICAgIG5vX3NlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCwKLSAgICAgICJubyBzZXJ2aWNlIGFkdmFuY2VkLXZ0eSIsCi0gICAgICBOT19TVFIKLSAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgYWR2YW5jZWQgbW9kZSB2dHkgaW50ZXJmYWNlXG4iKQotewotCWhvc3QuYWR2YW5jZWQgPSAwOwotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotREVGVU4odGVybWluYWxfbW9uaXRvciwKLSAgICAgIHRlcm1pbmFsX21vbml0b3JfY21kLAotICAgICAgInRlcm1pbmFsIG1vbml0b3IiLAotICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKLSAgICAgICJDb3B5IGRlYnVnIG91dHB1dCB0byB0aGUgY3VycmVudCB0ZXJtaW5hbCBsaW5lXG4iKQotewotCXZ0eS0+bW9uaXRvciA9IDE7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTih0ZXJtaW5hbF9ub19tb25pdG9yLAotICAgICAgdGVybWluYWxfbm9fbW9uaXRvcl9jbWQsCi0gICAgICAidGVybWluYWwgbm8gbW9uaXRvciIsCi0gICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgotICAgICAgTk9fU1RSICJDb3B5IGRlYnVnIG91dHB1dCB0byB0aGUgY3VycmVudCB0ZXJtaW5hbCBsaW5lXG4iKQotewotCXZ0eS0+bW9uaXRvciA9IDA7Ci0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCi1ERUZVTihzaG93X2hpc3RvcnksCi0gICAgICBzaG93X2hpc3RvcnlfY21kLAotICAgICAgInNob3cgaGlzdG9yeSIsIFNIT1dfU1RSICJEaXNwbGF5IHRoZSBzZXNzaW9uIGNvbW1hbmQgaGlzdG9yeVxuIikKLXsKLQlpbnQgaW5kZXg7Ci0KLQlmb3IgKGluZGV4ID0gdnR5LT5oaW5kZXggKyAxOyBpbmRleCAhPSB2dHktPmhpbmRleDspIHsKLQkJaWYgKGluZGV4ID09IFZUWV9NQVhISVNUKSB7Ci0JCQlpbmRleCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICh2dHktPmhpc3RbaW5kZXhdICE9IE5VTEwpCi0JCQl2dHlfb3V0KHZ0eSwgIiAgJXMlcyIsIHZ0eS0+aGlzdFtpbmRleF0sIFZUWV9ORVdMSU5FKTsKLQotCQlpbmRleCsrOwotCX0KLQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotLyogRGlzcGxheSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICovCi1zdGF0aWMgaW50IHZ0eV9jb25maWdfd3JpdGUoc3RydWN0IHZ0eSAqdnR5KQotewotCXZ0eV9vdXQodnR5LCAibGluZSB2dHklcyIsIFZUWV9ORVdMSU5FKTsKLQotCS8qIGxvZ2luICovCi0JaWYgKG5vX3Bhc3N3b3JkX2NoZWNrKQotCQl2dHlfb3V0KHZ0eSwgIiBubyBsb2dpbiVzIiwgVlRZX05FV0xJTkUpOwotCi0JdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7Ci0KLQlyZXR1cm4gQ01EX1NVQ0NFU1M7Ci19Ci0KLXN0cnVjdCBjbWRfbm9kZSB2dHlfbm9kZSA9IHsKLQlWVFlfTk9ERSwKLQkiJXMoY29uZmlnLWxpbmUpIyAiLAotCTEsCi19OwotCi0vKiBSZXNldCBhbGwgVlRZIHN0YXR1cy4gKi8KLXZvaWQgdnR5X3Jlc2V0KCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgdnR5ICp2dHk7Ci0Jc3RydWN0IHRocmVhZCAqdnR5X3NlcnZfdGhyZWFkOwotCi0JZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodnR5dmVjKTsgaSsrKQotCQlpZiAoKHZ0eSA9IHZlY3Rvcl9zbG90KHZ0eXZlYywgaSkpICE9IE5VTEwpIHsKLQkJCWJ1ZmZlcl9yZXNldCh2dHktPm9idWYpOwotCQkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7Ci0JCQl2dHlfY2xvc2UodnR5KTsKLQkJfQotCi0JZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoVnZ0eV9zZXJ2X3RocmVhZCk7IGkrKykKLQkJaWYgKCh2dHlfc2Vydl90aHJlYWQgPQotCQkgICAgIHZlY3Rvcl9zbG90KFZ2dHlfc2Vydl90aHJlYWQsIGkpKSAhPSBOVUxMKSB7Ci0JCQkvL3RocmVhZF9jYW5jZWwgKHZ0eV9zZXJ2X3RocmVhZCk7Ci0JCQl2ZWN0b3Jfc2xvdChWdnR5X3NlcnZfdGhyZWFkLCBpKSA9IE5VTEw7Ci0JCQljbG9zZShpKTsKLQkJfQotfQotCi1zdGF0aWMgdm9pZCB2dHlfc2F2ZV9jd2Qodm9pZCkKLXsKLQljaGFyIGN3ZFtNQVhQQVRITEVOXTsKLQljaGFyICpjIDsKLQotCWMgPSBnZXRjd2QoY3dkLCBNQVhQQVRITEVOKTsKLQotCWlmICghYykgewotCQlpZiAoY2hkaXIoU1lTQ09ORkRJUikgIT0gMCkKLQkJICAgIHBlcnJvcigiY2hkaXIgZmFpbGVkIik7Ci0JCWlmIChnZXRjd2QoY3dkLCBNQVhQQVRITEVOKSA9PSBOVUxMKQotCQkgICAgcGVycm9yKCJnZXRjd2QgZmFpbGVkIik7Ci0JfQotCi0JdnR5X2N3ZCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cmxlbihjd2QpICsgMSwgInNhdmVfY3dkIik7Ci0Jc3RyY3B5KHZ0eV9jd2QsIGN3ZCk7Ci19Ci0KLWNoYXIgKnZ0eV9nZXRfY3dkKCkKLXsKLQlyZXR1cm4gdnR5X2N3ZDsKLX0KLQotaW50IHZ0eV9zaGVsbF9zZXJ2KHN0cnVjdCB2dHkgKnZ0eSkKLXsKLQlyZXR1cm4gdnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWID8gMSA6IDA7Ci19Ci0KLXZvaWQgdnR5X2luaXRfdnR5c2goKQotewotCXZ0eXZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7Ci19Ci0KLWV4dGVybiB2b2lkICp0YWxsX2JzY19jdHg7Ci0vKiBJbnN0YWxsIHZ0eSdzIG93biBjb21tYW5kcyBsaWtlIGB3aG8nIGNvbW1hbmQuICovCi12b2lkIHZ0eV9pbml0KCkKLXsKLQl0YWxsX3Z0eV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMCwgInZ0eSIpOwotCXRhbGxfdnR5X3ZlY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF92dHlfY3R4LCAwLCAidnR5X3ZlY3RvciIpOwotCXRhbGxfdnR5X2NtZF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF92dHlfY3R4LCAwLCAidnR5X2NvbW1hbmQiKTsKLQotCS8qIEZvciBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24gcmVhZCwgcHJlc2VydmUgY3VycmVudCBkaXJlY3RvcnkuICovCi0JdnR5X3NhdmVfY3dkKCk7Ci0KLQl2dHl2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOwotCi0JLyogSW5zdGFsbCBiZ3AgdG9wIG5vZGUuICovCi0JaW5zdGFsbF9ub2RlKCZ2dHlfbm9kZSwgdnR5X2NvbmZpZ193cml0ZSk7Ci0KLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3dob19jbWQpOwotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2hpc3RvcnlfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfd2hvX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbGluZV92dHlfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQpOwotCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX3NlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2hvd19oaXN0b3J5X2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmdGVybWluYWxfbW9uaXRvcl9jbWQpOwotCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnRlcm1pbmFsX25vX21vbml0b3JfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZzaG93X2hpc3RvcnlfY21kKTsKLQotCWluc3RhbGxfZGVmYXVsdChWVFlfTk9ERSk7Ci0JaW5zdGFsbF9lbGVtZW50KFZUWV9OT0RFLCAmdnR5X2xvZ2luX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFZUWV9OT0RFLCAmbm9fdnR5X2xvZ2luX2NtZCk7Ci19Ci0KLWludCB2dHlfcmVhZF9jb25maWdfZmlsZShjb25zdCBjaGFyICpmaWxlX25hbWUpCi17Ci0JRklMRSAqY2ZpbGU7Ci0JaW50IHJjOwotCi0JY2ZpbGUgPSBmb3BlbihmaWxlX25hbWUsICJyIik7Ci0JaWYgKCFjZmlsZSkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlyYyA9IHZ0eV9yZWFkX2ZpbGUoY2ZpbGUpOwotCWZjbG9zZShjZmlsZSk7Ci0KLQlob3N0X2NvbmZpZ19zZXQoZmlsZV9uYW1lKTsKLQotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jCmluZGV4IGI4MjRjM2QuLjdjMzJjMDUgMTAwNjQ0Ci0tLSBhL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKKysrIGIvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZV9sYXllcjMuYwpAQCAtMjMsOSArMjMsOSBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KLSNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+Ci0jaW5jbHVkZSA8dnR5L3Z0eS5oPgorI2luY2x1ZGUgPG9zbW9jb20vdnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDxvc21vY29tL3Z0eS92dHkuaD4KIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCkBAIC00MSwzNiArNDEsOSBAQAogI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgogI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CiAjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdnR5Lmg+CiAKLXN0YXRpYyBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKLQotc3RydWN0IGNtZF9ub2RlIHN1YnNjcl9ub2RlID0gewotCVNVQlNDUl9OT0RFLAotCSIlcyhzdWJzY3JpYmVyKSMiLAotCTEsCi19OwotCi1zdGF0aWMgaW50IGR1bW15X2NvbmZpZ193cml0ZShzdHJ1Y3QgdnR5ICp2KQotewotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHN0cnVjdCBidWZmZXIgKmFyZ3ZfdG9fYnVmZmVyKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10sIGludCBiYXNlKQotewotCXN0cnVjdCBidWZmZXIgKmIgPSBidWZmZXJfbmV3KDEwMjQpOwotCWludCBpOwotCi0JaWYgKCFiKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAoaSA9IGJhc2U7IGkgPCBhcmdjOyBpKyspIHsKLQkJYnVmZmVyX3B1dHN0cihiLCBhcmd2W2ldKTsKLQkJYnVmZmVyX3B1dGMoYiwgJyAnKTsKLQl9Ci0JYnVmZmVyX3B1dGMoYiwgJ1wwJyk7Ci0KLQlyZXR1cm4gYjsKLX0KK2V4dGVybiBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldF9mcm9tX3Z0eShzdHJ1Y3QgdnR5ICp2KTsKIAogc3RhdGljIGludCBoZXhwYXJzZShjb25zdCBjaGFyICpzdHIsIHVfaW50OF90ICpiLCBpbnQgbWF4X2xlbikKIApAQCAtOTksMjkgKzcyLDYgQEAKIAlyZXR1cm4gaT4+MTsKIH0KIAotLyogcGVyLXN1YnNjcmliZXIgY29uZmlndXJhdGlvbiAqLwotREVGVU4oY2ZnX3N1YnNjciwKLSAgICAgIGNmZ19zdWJzY3JfY21kLAotICAgICAgInN1YnNjcmliZXIgSU1TSSIsCi0gICAgICAiU2VsZWN0IGEgU3Vic2NyaWJlciB0byBjb25maWd1cmVcbiIpCi17Ci0JY29uc3QgY2hhciAqaW1zaSA9IGFyZ3ZbMF07Ci0Jc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7Ci0KLQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koZ3NtbmV0LCBpbXNpKTsKLQlpZiAoIXN1YnNjcikgewotCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm9yIElNU0kgJXMlcyIsCi0JCQlpbXNpLCBWVFlfTkVXTElORSk7Ci0JCXJldHVybiBDTURfV0FSTklORzsKLQl9Ci0KLQkvKiB2dHlfZ29fcGFyZW50IHNob3VsZCBwdXQgdGhpcyBzdWJzY3JpYmVyICovCi0JdnR5LT5pbmRleCA9IHN1YnNjcjsKLQl2dHktPm5vZGUgPSBTVUJTQ1JfTk9ERTsKLQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQogc3RhdGljIHZvaWQgc3Vic2NyX2R1bXBfZnVsbF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKIHsKIAlpbnQgcmM7CkBAIC0xNDEsNyArOTEsNyBAQAogCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCiAJCQlWVFlfTkVXTElORSk7CiAKLQlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvLCBzdWJzY3IpOworCXJjID0gZGJfZ2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3IoJmFpbmZvLCBzdWJzY3IpOwogCWlmICghcmMpIHsKIAkJdnR5X291dCh2dHksICIgICAgQTNBOCBhbGdvcml0aG0gaWQ6ICVkJXMiLAogCQkJYWluZm8uYXV0aF9hbGdvLCBWVFlfTkVXTElORSk7CkBAIC0xNTAsNyArMTAwLDcgQEAKIAkJCVZUWV9ORVdMSU5FKTsKIAl9CiAKLQlyYyA9IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKCZhdHVwbGUsIHN1YnNjcik7CisJcmMgPSBkYl9nZXRfbGFzdGF1dGh0dXBsZV9mb3Jfc3Vic2NyKCZhdHVwbGUsIHN1YnNjcik7CiAJaWYgKCFyYykgewogCQl2dHlfb3V0KHZ0eSwgIiAgICBBM0E4IGxhc3QgdHVwbGUgKHVzZWQgJWQgdGltZXMpOiVzIiwKIAkJCWF0dXBsZS51c2VfY291bnQsIFZUWV9ORVdMSU5FKTsKQEAgLTE3MiwzNCArMTIyLDYgQEAKIAogCiAvKiBTdWJzY3JpYmVyICovCi1ERUZVTihzaG93X3N1YnNjciwKLSAgICAgIHNob3dfc3Vic2NyX2NtZCwKLSAgICAgICJzaG93IHN1YnNjcmliZXIgW0lNU0ldIiwKLQlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIHN1YnNjcmliZXJcbiIpCi17Ci0JY29uc3QgY2hhciAqaW1zaTsKLQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKLQotCWlmIChhcmdjID49IDEpIHsKLQkJaW1zaSA9IGFyZ3ZbMF07Ci0JCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGltc2kpOwotCQlpZiAoIXN1YnNjcikgewotCQkJdnR5X291dCh2dHksICIlJSB1bmtub3duIHN1YnNjcmliZXIlcyIsCi0JCQkJVlRZX05FV0xJTkUpOwotCQkJcmV0dXJuIENNRF9XQVJOSU5HOwotCQl9Ci0JCXN1YnNjcl9kdW1wX2Z1bGxfdnR5KHZ0eSwgc3Vic2NyKTsKLQkJc3Vic2NyX3B1dChzdWJzY3IpOwotCi0JCXJldHVybiBDTURfU1VDQ0VTUzsKLQl9Ci0KLQkvKiBGSVhNRTogaXRlcmF0ZSBvdmVyIGFsbCBzdWJzY3JpYmVycyA/ICovCi0JcmV0dXJuIENNRF9XQVJOSU5HOwotCi0JcmV0dXJuIENNRF9TVUNDRVNTOwotfQotCiBERUZVTihzaG93X3N1YnNjcl9jYWNoZSwKICAgICAgIHNob3dfc3Vic2NyX2NhY2hlX2NtZCwKICAgICAgICJzaG93IHN1YnNjcmliZXIgY2FjaGUiLApAQCAtMjIwLDYgKzE0Miw3IEBACiAgICAgICAic21zIHNlbmQgcGVuZGluZyIsCiAgICAgICAiU2VuZCBhbGwgcGVuZGluZyBTTVMiKQogeworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CiAJc3RydWN0IGdzbV9zbXMgKnNtczsKIAlpbnQgaWQgPSAwOwogCkBAIC0yNTIsNyArMTc1LDcgQEAKIAlzdHJuY3B5KHNtcy0+dGV4dCwgdGV4dCwgc2l6ZW9mKHNtcy0+dGV4dCktMSk7CiAKIAkvKiBGSVhNRTogZG9uJ3QgdXNlIElEIDEgc3RhdGljICovCi0Jc21zLT5zZW5kZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKGdzbW5ldCwgMSk7CisJc21zLT5zZW5kZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKHJlY2VpdmVyLT5uZXQsIDEpOwogCXNtcy0+cmVwbHlfcGF0aF9yZXEgPSAwOwogCXNtcy0+c3RhdHVzX3JlcF9yZXEgPSAwOwogCXNtcy0+dWRfaGRyX2luZCA9IDA7CkBAIC0yNjUsMTkgKzE4OCwyMCBAQAogCXJldHVybiBzbXM7CiB9CiAKLXN0YXRpYyBpbnQgX3NlbmRfc21zX2J1ZmZlcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyICpiLCB1X2ludDhfdCB0cF9waWQpCitzdGF0aWMgaW50IF9zZW5kX3Ntc19zdHIoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwgY2hhciAqc3RyLAorCQkJIHVfaW50OF90IHRwX3BpZCkKIHsKIAlzdHJ1Y3QgZ3NtX3NtcyAqc21zOwogCi0Jc21zID0gc21zX2Zyb21fdGV4dChyZWNlaXZlciwgYnVmZmVyX2dldHN0cihiKSk7CisJc21zID0gc21zX2Zyb21fdGV4dChyZWNlaXZlciwgc3RyKTsKIAlzbXMtPnByb3RvY29sX2lkID0gdHBfcGlkOwogCWdzbTQxMV9zZW5kX3Ntc19zdWJzY3IocmVjZWl2ZXIsIHNtcyk7CiAKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmdldF9zdWJzY3JfYnlfYXJndihjb25zdCBjaGFyICp0eXBlLAorc3RhdGljIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqZ2V0X3N1YnNjcl9ieV9hcmd2KHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0LAorCQkJCQkJIGNvbnN0IGNoYXIgKnR5cGUsCiAJCQkJCQkgY29uc3QgY2hhciAqaWQpCiB7CiAJaWYgKCFzdHJjbXAodHlwZSwgImV4dGVuc2lvbiIpKQpAQCAtMjkyLDE0ICsyMTYsNDMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KICNkZWZpbmUgU1VCU0NSX1RZUEVTICIoZXh0ZW5zaW9ufGltc2l8dG1zaXxpZCkiCisjZGVmaW5lIFNVQlNDUl9IRUxQICJPcGVyYXRpb25zIG9uIGEgU3Vic2NyaWJlclxuIgkJCVwKKwkiSWRlbnRpZnkgc3Vic2NyaWJlciBieSBoaXMgZXh0ZW5zaW9uIChwaG9uZSBudW1iZXIpXG4iCQlcCisJIklkZW50aWZ5IHN1YnNjcmliZXIgYnkgaGlzIElNU0lcbiIJCQkJXAorCSJJZGVudGlmeSBzdWJzY3JpYmVyIGJ5IGhpcyBUTVNJXG4iCQkJCVwKKwkiSWRlbnRpZnkgc3Vic2NyaWJlciBieSBoaXMgZGF0YWJhc2UgSURcbiIJCQlcCisJIklkZW50aWZpZXIgZm9yIHRoZSBzdWJzY3JpYmVyXG4iCisKK0RFRlVOKHNob3dfc3Vic2NyLAorICAgICAgc2hvd19zdWJzY3JfY21kLAorICAgICAgInNob3cgc3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIElEIiwKKwlTSE9XX1NUUiBTVUJTQ1JfSEVMUCkKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0KKwkJCQlnZXRfc3Vic2NyX2J5X2FyZ3YoZ3NtbmV0LCBhcmd2WzBdLCBhcmd2WzFdKTsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfZHVtcF9mdWxsX3Z0eSh2dHksIHN1YnNjcik7CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CiAKIERFRlVOKHN1YnNjcmliZXJfc2VuZF9zbXMsCiAgICAgICBzdWJzY3JpYmVyX3NlbmRfc21zX2NtZCwKLSAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc21zIHNlbmQgLkxJTkUiLAotICAgICAgIlNlbGVjdCBzdWJzY3JpYmVyIGJhc2VkIG9uIGV4dGVuc2lvbiIpCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIElEIHNtcyBzZW5kIC5MSU5FIiwKKwlTVUJTQ1JfSEVMUCAiU01TIE9wZXJhdGlvbnNcbiIgIlNlbmQgU01TXG4iICJBY3R1YWwgU01TIFRleHQiKQogewotCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOwotCXN0cnVjdCBidWZmZXIgKmI7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihnc21uZXQsIGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWNoYXIgKnN0cjsKIAlpbnQgcmM7CiAKIAlpZiAoIXN1YnNjcikgewpAQCAtMzA3LDkgKzI2MCw5IEBACiAJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CiAJCXJldHVybiBDTURfV0FSTklORzsKIAl9Ci0JYiA9IGFyZ3ZfdG9fYnVmZmVyKGFyZ2MsIGFyZ3YsIDIpOwotCXJjID0gX3NlbmRfc21zX2J1ZmZlcihzdWJzY3IsIGIsIDApOwotCWJ1ZmZlcl9mcmVlKGIpOworCXN0ciA9IGFyZ3ZfY29uY2F0KGFyZ3YsIGFyZ2MsIDIpOworCXJjID0gX3NlbmRfc21zX3N0cihzdWJzY3IsIHN0ciwgMCk7CisJdGFsbG9jX2ZyZWUoc3RyKTsKIAogCXN1YnNjcl9wdXQoc3Vic2NyKTsKIApAQCAtMzE4LDExICsyNzEsMTMgQEAKIAogREVGVU4oc3Vic2NyaWJlcl9zaWxlbnRfc21zLAogICAgICAgc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCwKLSAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc2lsZW50IHNtcyBzZW5kIC5MSU5FIiwKLSAgICAgICJTZWxlY3Qgc3Vic2NyaWJlciBiYXNlZCBvbiBleHRlbnNpb24iKQorICAgICAgInN1YnNjcmliZXIgIiBTVUJTQ1JfVFlQRVMgIiBJRCBzaWxlbnQtc21zIHNlbmQgLkxJTkUiLAorCVNVQlNDUl9IRUxQCisJIlNpbGVudCBTTVMgT3BlcmF0aW9uXG4iICJTZW5kIFNpbGVudCBTTVNcbiIgIkFjdHVhbCBTTVMgdGV4dFxuIikKIHsKLQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihhcmd2WzBdLCBhcmd2WzFdKTsKLQlzdHJ1Y3QgYnVmZmVyICpiOworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBnZXRfc3Vic2NyX2J5X2FyZ3YoZ3NtbmV0LCBhcmd2WzBdLCBhcmd2WzFdKTsKKwljaGFyICpzdHI7CiAJaW50IHJjOwogCiAJaWYgKCFzdWJzY3IpIHsKQEAgLTMzMSwyMSArMjg2LDMwIEBACiAJCXJldHVybiBDTURfV0FSTklORzsKIAl9CiAKLQliID0gYXJndl90b19idWZmZXIoYXJnYywgYXJndiwgMik7Ci0JcmMgPSBfc2VuZF9zbXNfYnVmZmVyKHN1YnNjciwgYiwgNjQpOwotCWJ1ZmZlcl9mcmVlKGIpOworCXN0ciA9IGFyZ3ZfY29uY2F0KGFyZ3YsIGFyZ2MsIDIpOworCXJjID0gX3NlbmRfc21zX3N0cihzdWJzY3IsIHN0ciwgMCk7CisJdGFsbG9jX2ZyZWUoc3RyKTsKIAogCXN1YnNjcl9wdXQoc3Vic2NyKTsKIAogCXJldHVybiByYzsKIH0KIAorI2RlZmluZSBDSEFOX1RZUEVTICIoYW55fHRjaC9mfHRjaC9hbnl8c2RjY2gpIgorI2RlZmluZSBDSEFOX1RZUEVfSEVMUCAJCQlcCisJCSJBbnkgY2hhbm5lbFxuIgkJXAorCQkiVENIL0YgY2hhbm5lbFxuIglcCisJCSJBbnkgVENIIGNoYW5uZWxcbiIJXAorCQkiU0RDQ0ggY2hhbm5lbFxuIgorCiBERUZVTihzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0LAogICAgICAgc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdGFydF9jbWQsCi0gICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBjYWxsIHN0YXJ0IChhbnl8dGNoL2Z8dGNoL2FueXxzZGNjaCkiLAotICAgICAgIlN0YXJ0IGEgc2lsZW50IGNhbGwgdG8gYSBzdWJzY3JpYmVyIikKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgSUQgc2lsZW50LWNhbGwgc3RhcnQgKGFueXx0Y2gvZnx0Y2gvYW55fHNkY2NoKSIsCisJU1VCU0NSX0hFTFAgIlNpbGVudCBjYWxsIG9wZXJhdGlvblxuIiAiU3RhcnQgc2lsZW50IGNhbGxcbiIKKwlDSEFOX1RZUEVfSEVMUCkKIHsKLQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihhcmd2WzBdLCBhcmd2WzFdKTsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGdzbW5ldCwgYXJndlswXSwgYXJndlsxXSk7CiAJaW50IHJjLCB0eXBlOwogCiAJaWYgKCFzdWJzY3IpIHsKQEAgLTM3OCwxMCArMzQyLDEyIEBACiAKIERFRlVOKHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcCwKICAgICAgIHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcF9jbWQsCi0gICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBjYWxsIHN0b3AiLAotICAgICAgIlN0b3AgYSBzaWxlbnQgY2FsbCB0byBhIHN1YnNjcmliZXIiKQorICAgICAgInN1YnNjcmliZXIgIiBTVUJTQ1JfVFlQRVMgIiBJRCBzaWxlbnQtY2FsbCBzdG9wIiwKKwlTVUJTQ1JfSEVMUCAiU2lsZW50IGNhbGwgb3BlcmF0aW9uXG4iICJTdG9wIHNpbGVudCBjYWxsXG4iCisJQ0hBTl9UWVBFX0hFTFApCiB7Ci0Jc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBnZXRfc3Vic2NyX2J5X2FyZ3YoYXJndlswXSwgYXJndlsxXSk7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGdldF9zdWJzY3JfYnlfYXJndihnc21uZXQsIGFyZ3ZbMF0sIGFyZ3ZbMV0pOwogCWludCByYzsKIAogCWlmICghc3Vic2NyKSB7CkBAIC00MDEsODUgKzM2NywxNDAgQEAKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKLURFRlVOKGNmZ19zdWJzY3JfbmFtZSwKLSAgICAgIGNmZ19zdWJzY3JfbmFtZV9jbWQsCi0gICAgICAibmFtZSBOQU1FIiwKLSAgICAgICJTZXQgdGhlIG5hbWUgb2YgdGhlIHN1YnNjcmliZXIiKQorREVGVU4oZW5hX3N1YnNjcl9hdXRob3JpemRlLAorICAgICAgZW5hX3N1YnNjcl9hdXRob3JpemVkX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgSUQgYXV0aG9yaXplZCAoMHwxKSIsCisJU1VCU0NSX0hFTFAgIihEZS0pQXV0aG9yaXplIHN1YnNjcmliZXIgaW4gSExSXG4iCisJIlN1YnNjcmliZXIgc2hvdWxkIE5PVCBiZSBhdXRob3JpemVkXG4iCisJIlN1YnNjcmliZXIgc2hvdWxkIGJlIGF1dGhvcml6ZWRcbiIpCiB7Ci0JY29uc3QgY2hhciAqbmFtZSA9IGFyZ3ZbMF07Ci0Jc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSB2dHktPmluZGV4OworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPQorCQkJZ2V0X3N1YnNjcl9ieV9hcmd2KGdzbW5ldCwgYXJndlswXSwgYXJndlsxXSk7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJc3Vic2NyLT5hdXRob3JpemVkID0gYXRvaShhcmd2WzJdKTsKKwlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKworCXN1YnNjcl9wdXQoc3Vic2NyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oZW5hX3N1YnNjcl9uYW1lLAorICAgICAgZW5hX3N1YnNjcl9uYW1lX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgSUQgbmFtZSBOQU1FIiwKKwlTVUJTQ1JfSEVMUCAiU2V0IHRoZSBuYW1lIG9mIHRoZSBzdWJzY3JpYmVyXG4iCisJIk5hbWUgb2YgdGhlIFN1YnNjcmliZXJcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9CisJCQlnZXRfc3Vic2NyX2J5X2FyZ3YoZ3NtbmV0LCBhcmd2WzBdLCBhcmd2WzFdKTsKKwljb25zdCBjaGFyICpuYW1lID0gYXJndlsyXTsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CiAKIAlzdHJuY3B5KHN1YnNjci0+bmFtZSwgbmFtZSwgc2l6ZW9mKHN1YnNjci0+bmFtZSkpOwotCiAJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CiAKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKIAlyZXR1cm4gQ01EX1NVQ0NFU1M7CiB9CiAKLURFRlVOKGNmZ19zdWJzY3JfZXh0ZW5zaW9uLAotICAgICAgY2ZnX3N1YnNjcl9leHRlbnNpb25fY21kLAotICAgICAgImV4dGVuc2lvbiBFWFRFTlNJT04iLAotICAgICAgIlNldCB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBzdWJzY3JpYmVyIikKK0RFRlVOKGVuYV9zdWJzY3JfZXh0ZW5zaW9uLAorICAgICAgZW5hX3N1YnNjcl9leHRlbnNpb25fY21kLAorICAgICAgInN1YnNjcmliZXIgIiBTVUJTQ1JfVFlQRVMgIiBJRCBleHRlbnNpb24gRVhURU5TSU9OIiwKKwlTVUJTQ1JfSEVMUCAiU2V0IHRoZSBleHRlbnNpb24gKHBob25lIG51bWJlcikgb2YgdGhlIHN1YnNjcmliZXJcbiIKKwkiRXh0ZW5zaW9uIChwaG9uZSBudW1iZXIpXG4iKQogewotCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOwotCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCA9IGdzbW5ldF9mcm9tX3Z0eSh2dHkpOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0KKwkJCWdldF9zdWJzY3JfYnlfYXJndihnc21uZXQsIGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzJdOwogCi0Jc3RybmNweShzdWJzY3ItPmV4dGVuc2lvbiwgbmFtZSwgc2l6ZW9mKHN1YnNjci0+ZXh0ZW5zaW9uKSk7CisJaWYgKCFzdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIlJSBObyBzdWJzY3JpYmVyIGZvdW5kIGZvciAlcyAlcyVzIiwKKwkJCWFyZ3ZbMF0sIGFyZ3ZbMV0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KIAorCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIG5hbWUsIHNpemVvZihzdWJzY3ItPm5hbWUpKTsKIAlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKIAorCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwogCXJldHVybiBDTURfU1VDQ0VTUzsKIH0KIAotREVGVU4oY2ZnX3N1YnNjcl9hdXRob3JpemVkLAotICAgICAgY2ZnX3N1YnNjcl9hdXRob3JpemVkX2NtZCwKLSAgICAgICJhdXRoIDwwLTE+IiwKLSAgICAgICJTZXQgdGhlIGF1dGhvcml6YXRpb24gc3RhdHVzIG9mIHRoZSBzdWJzY3JpYmVyIikKKyNkZWZpbmUgQTNBOF9BTEdfVFlQRVMgIihub25lfHhvcnxjb21wMTI4djEpIgorI2RlZmluZSBBM0E4X0FMR19IRUxQIAkJCVwKKwkiVXNlIE5vIEEzQTggYWxnb3JpdGhtXG4iCVwKKwkiVXNlIFhPUiBhbGdvcml0aG1cbiIJCVwKKwkiVXNlIENPTVAxMjh2MSBhbGdvcml0aG1cbiIKKworREVGVU4oZW5hX3N1YnNjcl9hM2E4LAorICAgICAgZW5hX3N1YnNjcl9hM2E4X2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgSUQgYTNhOCAiIEEzQThfQUxHX1RZUEVTICIgW0tJXSIsCisgICAgICBTVUJTQ1JfSEVMUCAiU2V0IGEzYTggcGFyYW1ldGVycyBmb3IgdGhlIHN1YnNjcmliZXJcbiIKKyAgICAgIEEzQThfQUxHX0hFTFAgIkVuY3J5cHRpb24gS2V5IEtpXG4iKQogewotCWludCBhdXRoID0gYXRvaShhcmd2WzBdKTsKLQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7Ci0KLQlpZiAoYXV0aCkKLQkJc3Vic2NyLT5hdXRob3JpemVkID0gMTsKLQllbHNlCi0JCXN1YnNjci0+YXV0aG9yaXplZCA9IDA7Ci0KLQlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKLQotCXJldHVybiBDTURfU1VDQ0VTUzsKLX0KLQotI2RlZmluZSBBM0E4X0FMR19UWVBFUyAiKG5vbmV8Y29tcDEyOHYxKSIKLQotREVGVU4oY2ZnX3N1YnNjcl9hM2E4LAotICAgICAgY2ZnX3N1YnNjcl9hM2E4X2NtZCwKLSAgICAgICJhM2E4ICIgQTNBOF9BTEdfVFlQRVMgIiBbS0ldIiwKLSAgICAgICJTZXQgYTNhOCBwYXJhbWV0ZXJzIGZvciB0aGUgc3Vic2NyaWJlciIpCi17Ci0Jc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSB2dHktPmluZGV4OwotCWNvbnN0IGNoYXIgKmFsZ19zdHIgPSBhcmd2WzBdOwotCWNvbnN0IGNoYXIgKmtpX3N0ciA9IGFyZ3ZbMV07CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQgPSBnc21uZXRfZnJvbV92dHkodnR5KTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9CisJCQlnZXRfc3Vic2NyX2J5X2FyZ3YoZ3NtbmV0LCBhcmd2WzBdLCBhcmd2WzFdKTsKKwljb25zdCBjaGFyICphbGdfc3RyID0gYXJndlsyXTsKKwljb25zdCBjaGFyICpraV9zdHIgPSBhcmdjID09IDQgPyBhcmd2WzNdIDogTlVMTDsKIAlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKLQlpbnQgcmM7CisJaW50IHJjLCBtaW5sZW4sIG1heGxlbjsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CiAKIAlpZiAoIXN0cmNhc2VjbXAoYWxnX3N0ciwgIm5vbmUiKSkgewotCQkvKiBKdXN0IGVyYXNlICovCi0JCXJjID0gc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3IoTlVMTCwgc3Vic2NyKTsKKwkJYWluZm8uYXV0aF9hbGdvID0gQVVUSF9BTEdPX05PTkU7CisJCW1pbmxlbiA9IG1heGxlbiA9IDA7CisJfSBlbHNlIGlmICghc3RyY2FzZWNtcChhbGdfc3RyLCAieG9yIikpIHsKKwkJYWluZm8uYXV0aF9hbGdvID0gQVVUSF9BTEdPX1hPUjsKKwkJbWlubGVuID0gQTM4X1hPUl9NSU5fS0VZX0xFTjsKKwkJbWF4bGVuID0gQTM4X1hPUl9NQVhfS0VZX0xFTjsKIAl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFsZ19zdHIsICJjb21wMTI4djEiKSkgewotCQkvKiBQYXJzZSBoZXggc3RyaW5nIEtpICovCi0JCXJjID0gaGV4cGFyc2Uoa2lfc3RyLCBhaW5mby5hM2E4X2tpLCBzaXplb2YoYWluZm8uYTNhOF9raSkpOwotCQlpZiAocmMgIT0gMTYpCi0JCQlyZXR1cm4gQ01EX1dBUk5JTkc7Ci0KLQkJLyogU2V0IHRoZSBpbmZvcyAqLwogCQlhaW5mby5hdXRoX2FsZ28gPSBBVVRIX0FMR09fQ09NUDEyOHYxOwotCQlhaW5mby5hM2E4X2tpX2xlbiA9IHJjOwotCQlyYyA9IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKCZhaW5mbywgc3Vic2NyKTsKKwkJbWlubGVuID0gbWF4bGVuID0gQTM4X0NPTVAxMjhfS0VZX0xFTjsKIAl9IGVsc2UgewogCQkvKiBVbmtub3duIG1ldGhvZCAqLwogCQlyZXR1cm4gQ01EX1dBUk5JTkc7CiAJfQogCisJaWYgKGtpX3N0cikgeworCQlyYyA9IGhleHBhcnNlKGtpX3N0ciwgYWluZm8uYTNhOF9raSwgc2l6ZW9mKGFpbmZvLmEzYThfa2kpKTsKKwkJaWYgKChyYyA+IG1heGxlbikgfHwgKHJjIDwgbWlubGVuKSkKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJYWluZm8uYTNhOF9raV9sZW4gPSByYzsKKwl9IGVsc2UgeworCQlhaW5mby5hM2E4X2tpX2xlbiA9IDA7CisJCWlmIChtaW5sZW4pCisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJcmMgPSBkYl9zeW5jX2F1dGhpbmZvX2Zvcl9zdWJzY3IoCisJCWFpbmZvLmF1dGhfYWxnbyA9PSBBVVRIX0FMR09fTk9ORSA/IE5VTEwgOiAmYWluZm8sCisJCXN1YnNjcik7CisKKwkvKiB0aGUgbGFzdCB0dXBsZSBwcm9iYWJseSBpbnZhbGlkIHdpdGggdGhlIG5ldyBhdXRoIHNldHRpbmdzICovCisJZGJfc3luY19sYXN0YXV0aHR1cGxlX2Zvcl9zdWJzY3IoTlVMTCwgc3Vic2NyKTsKKwogCXJldHVybiByYyA/IENNRF9XQVJOSU5HIDogQ01EX1NVQ0NFU1M7CiB9CiAKQEAgLTUwMiwzMCArNTIzLDYwIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBic2NfdnR5X2luaXRfZXh0cmEoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCitERUZVTihzaG93X3N0YXRzLAorICAgICAgc2hvd19zdGF0c19jbWQsCisgICAgICAic2hvdyBzdGF0aXN0aWNzIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBuZXR3b3JrIHN0YXRpc3RpY3NcbiIpCiB7Ci0JZ3NtbmV0ID0gbmV0OworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0X2Zyb21fdnR5KHZ0eSk7CiAKKwlvcGVuYnNjX3Z0eV9wcmludF9zdGF0aXN0aWNzKHZ0eSwgbmV0KTsKKwl2dHlfb3V0KHZ0eSwgIkxvY2F0aW9uIFVwZGF0ZSAgICAgICAgIDogJWx1IGF0dGFjaCwgJWx1IG5vcm1hbCwgJWx1IHBlcmlvZGljJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfdHlwZS5hdHRhY2gpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfdHlwZS5ub3JtYWwpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfdHlwZS5wZXJpb2RpYyksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIklNU0kgRGV0YWNoIEluZGljYXRpb25zIDogJWx1JXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfdHlwZS5kZXRhY2gpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJMb2NhdGlvbiBVcGRhdGUgUmVzcG9uc2U6ICVsdSBhY2NlcHQsICVsdSByZWplY3QlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF9yZXNwLmFjY2VwdCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF9yZXNwLnJlamVjdCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkhhbmRvdmVyICAgICAgICAgICAgICAgIDogJWx1IGF0dGVtcHRlZCwgJWx1IG5vX2NoYW5uZWwsICVsdSB0aW1lb3V0LCAiCisJCSIlbHUgY29tcGxldGVkLCAlbHUgZmFpbGVkJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmF0dGVtcHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIubm9fY2hhbm5lbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIudGltZW91dCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIuY29tcGxldGVkKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5mYWlsZWQpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJTTVMgTU8gICAgICAgICAgICAgICAgICA6ICVsdSBzdWJtaXR0ZWQsICVsdSBubyByZWNlaXZlciVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMuc3VibWl0dGVkKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMubm9fcmVjZWl2ZXIpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJTTVMgTVQgICAgICAgICAgICAgICAgICA6ICVsdSBkZWxpdmVyZWQsICVsdSBubyBtZW1vcnksICVsdSBvdGhlciBlcnJvciVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMuZGVsaXZlcmVkKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMucnBfZXJyX21lbSksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnJwX2Vycl9vdGhlciksIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworaW50IGJzY192dHlfaW5pdF9leHRyYSh2b2lkKQorewogCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NDQUxMLCBzY2FsbF9jYmZuLCBOVUxMKTsKIAotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3N1YnNjcl9jbWQpOwotCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3N1YnNjcl9jYWNoZV9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19zdWJzY3JfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfc3Vic2NyX2NhY2hlX2NtZCk7CiAKLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc21zX3NlbmRfcGVuZF9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc21zX3NlbmRfcGVuZF9jbWQpOwogCi0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2VuZF9zbXNfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnRfY21kKTsKLQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdG9wX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzdWJzY3JpYmVyX3NlbmRfc21zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzdWJzY3JpYmVyX3NpbGVudF9zbXNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcF9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19zdGF0c19jbWQpOwogCi0JaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX3N1YnNjcl9jbWQpOwotCWluc3RhbGxfbm9kZSgmc3Vic2NyX25vZGUsIGR1bW15X2NvbmZpZ193cml0ZSk7Ci0KLQlpbnN0YWxsX2RlZmF1bHQoU1VCU0NSX05PREUpOwotCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfbmFtZV9jbWQpOwotCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfZXh0ZW5zaW9uX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9hdXRob3JpemVkX2NtZCk7Ci0JaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9hM2E4X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmZW5hX3N1YnNjcl9uYW1lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmZW5hX3N1YnNjcl9leHRlbnNpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZlbmFfc3Vic2NyX2F1dGhvcml6ZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZlbmFfc3Vic2NyX2EzYThfY21kKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9kZWJ1Z190ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYwppbmRleCAwZjBjMjg0Li5mM2U0ODM3IDEwMDY0NAotLS0gYS9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYworKysgYi9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYwpAQCAtMjQsMTggKzI0LDIwIEBACiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKIHsKLQlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCXN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OwogCi0JZGVidWdfaW5pdCgpOwotCXN0ZGVycl90YXJnZXQgPSBkZWJ1Z190YXJnZXRfY3JlYXRlX3N0ZGVycigpOwotCWRlYnVnX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7Ci0JZGVidWdfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOwogCi0JZGVidWdfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRFJMTCIpOworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJEUkxMIik7CiAJREVCVUdQKERDQywgIllvdSBzaG91bGQgbm90IHNlZSB0aGlzXG4iKTsKIAotCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRSTEw6RENDIik7CisJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRSTEw6RENDIik7CiAJREVCVUdQKERSTEwsICJZb3Ugc2hvdWxkIHNlZSB0aGlzXG4iKTsKIAlERUJVR1AoRENDLCAiWW91IHNob3VsZCBzZWUgdGhpc1xuIik7CiAJREVCVUdQKERNTSwgIllvdSBzaG91bGQgbm90IHNlZSB0aGlzXG4iKTsKKworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvLmdpdGlnbm9yZSBiL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjQ1ZTQuLjAwMDAwMDAKLS0tIGEvcnJscC1lcGhlbWVyaXMvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYXNuMV9nZW4vKgotKi5vCi0qLmEKLXJybHAtdGVzdApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvQ09QWUlORyBiL3JybHAtZXBoZW1lcmlzL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzA4OGUuLjAwMDAwMDAKLS0tIGEvcnJscC1lcGhlbWVyaXMvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotU2VlIHRoZSBpbmNsdWRlZCBncGwtMi4wLnR4dCBvciBncGwtMy4wLnR4dCBkZXBlbmRpbmcgb24geW91cgotcHJlZmVyZW5jZXMuCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9NYWtlZmlsZSBiL3JybHAtZXBoZW1lcmlzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDJjYWM3Li4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCi1BU04xQz0uLi8uLi8uLi90bXAvcnJscC9hc24xYy9hc24xYy9hc24xYwotQVNOMV9JTkNMVURFPS9ob21lL3RudC90bXAvcnJscC9hc24xYy9za2VsZXRvbnMKLUNDPWdjYwotQ0ZMQUdTPS1JJChBU04xX0lOQ0xVREUpIC1JYXNuMV9nZW4gLU8zIC1XYWxsCi0KLUFTTjFfRklMRVM9JCh3aWxkY2FyZCBhc24xLyouYXNuKQotCi0KLWFsbDogcnJscC10ZXN0Ci0KLQotcnJscC10ZXN0OiBsaWJnc20tYXNuMS5hIGdwcy5vIHVieC5vIHVieC1wYXJzZS5vIHJybHAubyBtYWluLm8KLQkkKENDKSAtbyAkQCBncHMubyB1YngubyB1YngtcGFyc2UubyBycmxwLm8gbWFpbi5vIC1MLiAtbGdzbS1hc24xIC1sbQotCi0KLSMKLSMgQVNOMSBmaWxlIGF1dG9nZW5lcmF0aW9uIChuZWVkIHJlY3Vyc2l2ZSBtYWtlZmlsZSBjYWxsKQotIwotCi1BU04xX1NPVVJDRVMgPSAkKHdpbGRjYXJkIGFzbjFfZ2VuLyouYykKLUFTTjFfT0JKRUNUUyA9ICQoQVNOMV9TT1VSQ0VTOi5jPS5vKQotCi1saWJnc20tYXNuMS5hOiAkKEFTTjFfRklMRVMpCi0JbWtkaXIgLXAgYXNuMV9nZW4gJiYgXAotCWNkIGFzbjFfZ2VuICYmIFwKLQkkKEFTTjFDKSAtZnNrZWxldG9ucy1jb3B5IC1mbmF0aXZlLXR5cGVzIC1nZW4tUEVSICQoYWRkcHJlZml4IC4uLywkXikKLQlAcm0gYXNuMV9nZW4vY29udmVydGVyLXNhbXBsZS5jIGFzbjFfZ2VuL01ha2VmaWxlLmFtLnNhbXBsZQotCUAkKE1BS0UpIGxpYmdzbS1hc24xLmEuc3VibWFrZQotCi1saWJnc20tYXNuMS5hLnN1Ym1ha2U6ICQoQVNOMV9PQkpFQ1RTKQotCSQoQVIpIHJjcyBsaWJnc20tYXNuMS5hICReCi0KLS5QSE9OWTogbGliZ3NtLWFzbjEuYS5zdWJtYWtlCi0KLQotIwotIyBDbGVhbgotIwotCi1jbGVhbjoKLQlybSAtUmYgYXNuMV9nZW4KLQlybSAtZiBsaWJnc20tYXNuMS5hICoubyBycmxwLXRlc3QKLQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1CUy1Db2RlLmFzbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyNTM2Ni4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1CUy1Db2RlLmFzbgorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0tLSAkSWQ6IE1BUC1CUy1Db2RlLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAotLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAKLS0tIDE3LjcuMTAJQmVhcmVyIFNlcnZpY2UgQ29kZXMKLSAKLU1BUC1CUy1Db2RlIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KLQotREVGSU5JVElPTlMKLQotOjo9Ci0KLUJFR0lOCi0KLUJlYXJlclNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQotCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQotCS0tIGJlYXJlciBzZXJ2aWNlLCBhIGdyb3VwIG9mIGJlYXJlciBzZXJ2aWNlcywgb3IgYWxsIGJlYXJlcgotCS0tIHNlcnZpY2VzLiBUaGUgc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDIgWzNdLgotCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgotCS0tCi0JLS0gcGxtbi1zcGVjaWZpYyBiZWFyZXIgc2VydmljZXM6Ci0JLS0gYml0cyA4NzY1NDMyMTogZGVmaW5lZCBieSB0aGUgSFBMTU4gb3BlcmF0b3IKLQotCS0tIHJlc3Qgb2YgYmVhcmVyIHNlcnZpY2VzOgotCS0tIGJpdCA4OiAwICh1bnVzZWQpCi0JLS0gYml0cyA3NjU0MzIxOiBncm91cCAoYml0cyA3NjU0KSwgYW5kIHJhdGUsIGlmIGFwcGxpY2FibGUKLQktLSAoYml0cyAzMjEpCi0KLUV4dC1CZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKLQktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKLQktLSBiZWFyZXIgc2VydmljZSwgYSBncm91cCBvZiBiZWFyZXIgc2VydmljZXMsIG9yIGFsbCBiZWFyZXIKLQktLSBzZXJ2aWNlcy4gVGhlIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDAyIFszXS4KLQktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKLQktLQotCS0tIE9DVEVUIDE6Ci0JLS0gcGxtbi1zcGVjaWZpYyBiZWFyZXIgc2VydmljZXM6Ci0JLS0gYml0cyA4NzY1NDMyMTogZGVmaW5lZCBieSB0aGUgSFBMTU4gb3BlcmF0b3IKLQktLQotCS0tIHJlc3Qgb2YgYmVhcmVyIHNlcnZpY2VzOgotCS0tIGJpdCA4OiAwICh1bnVzZWQpCi0JLS0gYml0cyA3NjU0MzIxOiBncm91cCAoYml0cyA3NjU0KSwgYW5kIHJhdGUsIGlmIGFwcGxpY2FibGUKLQktLSAoYml0cyAzMjEpCi0KLQktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gSWYgcmVjZWl2ZWQgdGhlCi0gICAgLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBzaGFsbCBiZQotCS0tIHRyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgZGVmaW5lZCBmb3IgdGhlCi0JLS0gb3BlcmF0aW9uIHRoYXQgdXNlcyB0aGlzIHR5cGUuIAotCi0KLQktLSBFeHQtQmVhcmVyU2VydmljZUNvZGUgaW5jbHVkZXMgYWxsIHZhbHVlcyBkZWZpbmVkIGZvciBCZWFyZXJTZXJ2aWNlQ29kZS4KLQotYWxsQmVhcmVyU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAwMDAwMCdCCi0KLWFsbERhdGFDREEtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMCdCCi1kYXRhQ0RBLTMwMGJwcwkJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMSdCCi1kYXRhQ0RBLTEyMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMCdCCi1kYXRhQ0RBLTEyMDAtNzVicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMSdCCi1kYXRhQ0RBLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDEwMCdCCi1kYXRhQ0RBLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDEwMSdCCi1kYXRhQ0RBLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDExMCdCCi1nZW5lcmFsLWRhdGFDREEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDExMSdCCi0KLWFsbERhdGFDRFMtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTAwMCdCCi1kYXRhQ0RTLTEyMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTAxMCdCCi1kYXRhQ0RTLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTEwMCdCCi1kYXRhQ0RTLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTEwMSdCCi1kYXRhQ0RTLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTExMCdCCi1nZW5lcmFsLWRhdGFDRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTExMSdCCi0KLWFsbFBhZEFjY2Vzc0NBLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDAnQgotcGFkQWNjZXNzQ0EtMzAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDEnQgotcGFkQWNjZXNzQ0EtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDEwJ0IKLXBhZEFjY2Vzc0NBLTEyMDAtNzVicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAxMSdCCi1wYWRBY2Nlc3NDQS0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMDAnQgotcGFkQWNjZXNzQ0EtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMTAxJ0IKLXBhZEFjY2Vzc0NBLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDExMCdCCi1nZW5lcmFsLXBhZEFjY2Vzc0NBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMTEnQgotCi1hbGxEYXRhUERTLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDEwMDAnQgotZGF0YVBEUy0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMDAnQgotZGF0YVBEUy00ODAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMDEnQgotZGF0YVBEUy05NjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMTAnQgotZ2VuZXJhbC1kYXRhUERTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMTEnQgotCi1hbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTEwMDAwJ0IKLQotYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDExMTAwMCdCCi0KLWFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMDAwMDAnQgotCi1hbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDAxMDAwJ0IKLQotLS0gVGhlIGZvbGxvd2luZyBub24taGllcmFyY2hpY2FsIENvbXBvdW5kIEJlYXJlciBTZXJ2aWNlCi0tLSBHcm91cHMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMzA6Ci1hbGxEYXRhQ2lyY3VpdEFzeW5jaHJvbm91cwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDEwMDAwJ0IKLQktLSBjb3ZlcnMgImFsbERhdGFDREEtU2VydmljZXMiLCAiYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDREEiIGFuZAotCS0tICJhbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEQSIKLWFsbEFzeW5jaHJvbm91c1NlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDAnQgotCS0tIGNvdmVycyAiYWxsRGF0YUNEQS1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQSIsCi0JLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBIiBhbmQgImFsbFBhZEFjY2Vzc0NEQS1TZXJ2aWNlcyIKLWFsbERhdGFDaXJjdWl0U3luY2hyb25vdXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTAxMTAwMCdCCi0JLS0gY292ZXJzICJhbGxEYXRhQ0RTLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RTIiBhbmQKLQktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDRFMiCi1hbGxTeW5jaHJvbm91c1NlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDExMDEwMDAnQgotCS0tIGNvdmVycyAiYWxsRGF0YUNEUy1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEUyIsCi0JLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RTIiBhbmQgImFsbERhdGFQRFMtU2VydmljZXMiCi0tLQotLS0gQ29tcG91bmQgQmVhcmVyIFNlcnZpY2UgR3JvdXAgQ29kZXMgYXJlIG9ubHkgdXNlZCBpbiBjYWxsCi0tLSBpbmRlcGVuZGVudCBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugb3BlcmF0aW9ucywgaS5lLiB0aGV5Ci0tLSBhcmUgbm90IHVzZWQgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEgb3IgaW4KLS0tIERlbGV0ZVN1YnNjcmliZXJEYXRhIG1lc3NhZ2VzLgotCi1hbGxQTE1OLXNwZWNpZmljQlMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMCdCCi1wbG1uLXNwZWNpZmljQlMtMQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAxJ0IKLXBsbW4tc3BlY2lmaWNCUy0yCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMTAnQgotcGxtbi1zcGVjaWZpY0JTLTMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMSdCCi1wbG1uLXNwZWNpZmljQlMtNAlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAwJ0IKLXBsbW4tc3BlY2lmaWNCUy01CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDEnQgotcGxtbi1zcGVjaWZpY0JTLTYJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDExMCdCCi1wbG1uLXNwZWNpZmljQlMtNwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTExJ0IKLXBsbW4tc3BlY2lmaWNCUy04CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMDAnQgotcGxtbi1zcGVjaWZpY0JTLTkJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMSdCCi1wbG1uLXNwZWNpZmljQlMtQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDEwJ0IKLXBsbW4tc3BlY2lmaWNCUy1CCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTEnQgotcGxtbi1zcGVjaWZpY0JTLUMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMCdCCi1wbG1uLXNwZWNpZmljQlMtRAlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAxJ0IKLXBsbW4tc3BlY2lmaWNCUy1FCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMTAnQgotcGxtbi1zcGVjaWZpY0JTLUYJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTExMSdCCi0KLUVORAotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQ29tbW9uRGF0YVR5cGVzLmFzbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkMjAyZS4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuCisrKyAvZGV2L251bGwKQEAgLTEsNjMzICswLDAgQEAKLS0tICRJZDogTUFQLUNvbW1vbkRhdGFUeXBlcy5hc24gMzA0NzAgMjAwOS0xMC0xMCAxMjozNzo1Nloga3JqICQKLS0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKLS0tIDE3LjcuOAlDb21tb24gZGF0YSB0eXBlcwotCi1NQVAtQ29tbW9uRGF0YVR5cGVzIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQotCi1ERUZJTklUSU9OUwotCi1JTVBMSUNJVCBUQUdTCi0KLTo6PQotCi1CRUdJTgotCi1FWFBPUlRTCi0KLQktLSBnZW5lcmFsIGRhdGEgdHlwZXMgYW5kIHZhbHVlcwotCUFkZHJlc3NTdHJpbmcsCi0JSVNETi1BZGRyZXNzU3RyaW5nLAotCW1heElTRE4tQWRkcmVzc0xlbmd0aCwKLQlGVE4tQWRkcmVzc1N0cmluZywKLQlJU0ROLVN1YmFkZHJlc3NTdHJpbmcsCi0JRXh0ZXJuYWxTaWduYWxJbmZvLCAKLQlFeHQtRXh0ZXJuYWxTaWduYWxJbmZvLCAKLUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAotCVNpZ25hbEluZm8sCi0JbWF4U2lnbmFsSW5mb0xlbmd0aCwKLQlBbGVydGluZ1BhdHRlcm4sCi0JVEJDRC1TVFJJTkcsCi0KLQktLSBkYXRhIHR5cGVzIGZvciBudW1iZXJpbmcgYW5kIGlkZW50aWZpY2F0aW9uCi0JSU1TSSwKLQlUTVNJLCAKLQlJZGVudGl0eSwKLQlTdWJzY3JpYmVySWQsCi0JSU1FSSwKLQlITFItTGlzdCwKLQlMTVNJLAotCUdsb2JhbENlbGxJZCwKLQlOZXR3b3JrUmVzb3VyY2UsCi0JQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZSwKLQlOQUVBLVByZWZlcnJlZENJLCAKLQlOQUVBLUNJQywgCi0JQVNDSS1DYWxsUmVmZXJlbmNlLAotCVN1YnNjcmliZXJJZGVudGl0eSwKLQlQTE1OLUlkLAotCi0JLS0gZGF0YSB0eXBlcyBmb3IgQ0FNRUwKLQlDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSwgCi0JQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGgsCi0JTEFJRml4ZWRMZW5ndGgsCi0KLQktLSBkYXRhIHR5cGVzIGZvciBzdWJzY3JpYmVyIG1hbmFnZW1lbnQKLQlCYXNpY1NlcnZpY2VDb2RlLAotCUV4dC1CYXNpY1NlcnZpY2VDb2RlLAotCUVNTFBQLUluZm8sCi0JRU1MUFAtUHJpb3JpdHksIAotCU1DLVNTLUluZm8sCi0JTWF4TUMtQmVhcmVycywKLQlNQy1CZWFyZXJzLAotCUV4dC1TUy1TdGF0dXMsCi0KLQktLSBkYXRhIHR5cGVzIGZvciBnZW9ncmFwaGljIGxvY2F0aW9uCi0JQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uLAotCUxDU0NsaWVudEV4dGVybmFsSUQsCi0JTENTQ2xpZW50SW50ZXJuYWxJRCwKLQlMQ1NTZXJ2aWNlVHlwZUlELAotLS0tIFdTIGFkZGVkIGV4cG9ydHMgbmVlZGVkIGJ5IGdzbV9tYXAuYXNuIChleHRyYSBhc24xIGZpbGUgdG8gaGFuZGxlIG9sZGVyIHByb3QuIHZlci4pCi0JUHJvdG9jb2xJZCwKLQlMQ1NTZXJ2aWNlVHlwZUlECQotOwotCi1JTVBPUlRTCi0JVGVsZXNlcnZpY2VDb2RlLAotCUV4dC1UZWxlc2VydmljZUNvZGUKLUZST00gTUFQLVRTLUNvZGUgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtVFMtQ29kZSAoMTkpIHZlcnNpb24xMSAoMTEpfQotCi0JQmVhcmVyU2VydmljZUNvZGUsCi0JRXh0LUJlYXJlclNlcnZpY2VDb2RlCi1GUk9NIE1BUC1CUy1Db2RlIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KLQotCVNTLUNvZGUKLUZST00gTUFQLVNTLUNvZGUgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQotCi0JRXh0ZW5zaW9uQ29udGFpbmVyCi1GUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Ci07Ci0KLQotLS0gZ2VuZXJhbCBkYXRhIHR5cGVzCi0KLVRCQ0QtU1RSSU5HIDo6PSBPQ1RFVCBTVFJJTkcKLQktLSBUaGlzIHR5cGUgKFRlbGVwaG9ueSBCaW5hcnkgQ29kZWQgRGVjaW1hbCBTdHJpbmcpIGlzIHVzZWQgdG8KLQktLSByZXByZXNlbnQgc2V2ZXJhbCBkaWdpdHMgZnJvbSAwIHRocm91Z2ggOSwgKiwgIywgYSwgYiwgYywgdHdvCi0JLS0gZGlnaXRzIHBlciBvY3RldCwgZWFjaCBkaWdpdCBlbmNvZGVkIDAwMDAgdG8gMTAwMSAoMCB0byA5KSwKLQktLSAxMDEwICgqKSwgMTAxMSAoIyksIDExMDAgKGEpLCAxMTAxIChiKSBvciAxMTEwIChjKTsgMTExMSB1c2VkCi0JLS0gYXMgZmlsbGVyIHdoZW4gdGhlcmUgaXMgYW4gb2RkIG51bWJlciBvZiBkaWdpdHMuCi0KLQktLSBiaXRzIDg3NjUgb2Ygb2N0ZXQgbiBlbmNvZGluZyBkaWdpdCAybgotCS0tIGJpdHMgNDMyMSBvZiBvY3RldCBuIGVuY29kaW5nIGRpZ2l0IDIobi0xKSArMQotCi1BZGRyZXNzU3RyaW5nIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEFkZHJlc3NMZW5ndGgpKQotCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIG51bWJlciBmb3IgYWRkcmVzc2luZwotCS0tIHB1cnBvc2VzLiBJdCBpcyBjb21wb3NlZCBvZgotCS0tCWEpCW9uZSBvY3RldCBmb3IgbmF0dXJlIG9mIGFkZHJlc3MsIGFuZCBudW1iZXJpbmcgcGxhbgotCS0tCQlpbmRpY2F0b3IuCi0JLS0JYikJZGlnaXRzIG9mIGFuIGFkZHJlc3MgZW5jb2RlZCBhcyBUQkNELVN0cmluZy4KLQotCS0tIGEpCVRoZSBmaXJzdCBvY3RldCBpbmNsdWRlcyBhIG9uZSBiaXQgZXh0ZW5zaW9uIGluZGljYXRvciwgYQotCS0tCQkzIGJpdHMgbmF0dXJlIG9mIGFkZHJlc3MgaW5kaWNhdG9yIGFuZCBhIDQgYml0cyBudW1iZXJpbmcKLQktLQkJcGxhbiBpbmRpY2F0b3IsIGVuY29kZWQgYXMgZm9sbG93czoKLQotCS0tIGJpdCA4OiAxICAobm8gZXh0ZW5zaW9uKQotCi0JLS0gYml0cyA3NjU6IG5hdHVyZSBvZiBhZGRyZXNzIGluZGljYXRvcgotCS0tCTAwMCAgdW5rbm93bgotCS0tCTAwMSAgaW50ZXJuYXRpb25hbCBudW1iZXIKLQktLQkwMTAgIG5hdGlvbmFsIHNpZ25pZmljYW50IG51bWJlcgotCS0tCTAxMSAgbmV0d29yayBzcGVjaWZpYyBudW1iZXIKLQktLQkxMDAgIHN1YnNjcmliZXIgbnVtYmVyCi0JLS0JMTAxICByZXNlcnZlZAotCS0tCTExMCAgYWJicmV2aWF0ZWQgbnVtYmVyCi0JLS0JMTExICByZXNlcnZlZCBmb3IgZXh0ZW5zaW9uCi0KLQktLSBiaXRzIDQzMjE6IG51bWJlcmluZyBwbGFuIGluZGljYXRvcgotCS0tCTAwMDAgIHVua25vd24KLQktLQkwMDAxICBJU0ROL1RlbGVwaG9ueSBOdW1iZXJpbmcgUGxhbiAoUmVjIElUVS1UIEUuMTY0KQotCS0tCTAwMTAgIHNwYXJlCi0JLS0JMDAxMSAgZGF0YSBudW1iZXJpbmcgcGxhbiAoSVRVLVQgUmVjIFguMTIxKQotCS0tCTAxMDAgIHRlbGV4IG51bWJlcmluZyBwbGFuIChJVFUtVCBSZWMgRi42OSkKLQktLQkwMTAxICBzcGFyZQotCS0tCTAxMTAgIGxhbmQgbW9iaWxlIG51bWJlcmluZyBwbGFuIChJVFUtVCBSZWMgRS4yMTIpCi0JLS0JMDExMSAgc3BhcmUKLQktLQkxMDAwICBuYXRpb25hbCBudW1iZXJpbmcgcGxhbgotCS0tCTEwMDEgIHByaXZhdGUgbnVtYmVyaW5nIHBsYW4KLQktLQkxMTExICByZXNlcnZlZCBmb3IgZXh0ZW5zaW9uCi0KLQktLQlhbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZC4KLQotCS0tIGIpCVRoZSBmb2xsb3dpbmcgb2N0ZXRzIHJlcHJlc2VudGluZyBkaWdpdHMgb2YgYW4gYWRkcmVzcwotCS0tCQllbmNvZGVkIGFzIGEgVEJDRC1TVFJJTkcuCi0KLW1heEFkZHJlc3NMZW5ndGggIElOVEVHRVIgOjo9IDIwCi0KLUlTRE4tQWRkcmVzc1N0cmluZyA6Oj0gCi0JCQlBZGRyZXNzU3RyaW5nIChTSVpFICgxLi5tYXhJU0ROLUFkZHJlc3NMZW5ndGgpKQotCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBJU0ROIG51bWJlcnMuCi0KLW1heElTRE4tQWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gOQotCi1GVE4tQWRkcmVzc1N0cmluZyA6Oj0gCi0JCQlBZGRyZXNzU3RyaW5nIChTSVpFICgxLi5tYXhGVE4tQWRkcmVzc0xlbmd0aCkpCi0JLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGZvcndhcmRlZC10byBudW1iZXJzLiAKLQktLSBJZiBOQUkgPSBpbnRlcm5hdGlvbmFsIHRoZSBmaXJzdCBkaWdpdHMgcmVwcmVzZW50IHRoZSBjb3VudHJ5IGNvZGUgKENDKQotCS0tIGFuZCB0aGUgbmV0d29yayBkZXN0aW5hdGlvbiBjb2RlIChOREMpIGFzIGZvciBFLjE2NC4KLQotbWF4RlROLUFkZHJlc3NMZW5ndGggIElOVEVHRVIgOjo9IDE1Ci0KLUlTRE4tU3ViYWRkcmVzc1N0cmluZyA6Oj0gCi0JCQlPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heElTRE4tU3ViYWRkcmVzc0xlbmd0aCkpCi0JLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IElTRE4gc3ViYWRkcmVzc2VzLgotCS0tIEl0IGlzIGNvbXBvc2VkIG9mCi0JLS0JYSkJb25lIG9jdGV0IGZvciB0eXBlIG9mIHN1YmFkZHJlc3MgYW5kIG9kZC9ldmVuIGluZGljYXRvci4KLQktLQliKQkyMCBvY3RldHMgZm9yIHN1YmFkZHJlc3MgaW5mb3JtYXRpb24uCi0KLQktLQlhKQlUaGUgZmlyc3Qgb2N0ZXQgaW5jbHVkZXMgYSBvbmUgYml0IGV4dGVuc2lvbiBpbmRpY2F0b3IsIGEKLQktLQkJMyBiaXRzIHR5cGUgb2Ygc3ViYWRkcmVzcyBhbmQgYSBvbmUgYml0IG9kZC9ldmVuIGluZGljYXRvciwKLQktLQkJZW5jb2RlZCBhcyBmb2xsb3dzOgotCi0JLS0JYml0IDg6IDEgIChubyBleHRlbnNpb24pCi0KLQktLQliaXRzIDc2NTogdHlwZSBvZiBzdWJhZGRyZXNzCi0JLS0JCTAwMCAgTlNBUCAoWC4yMTMvSVNPIDgzNDggQUQyKQotCS0tCQkwMTAgIFVzZXIgU3BlY2lmaWVkCi0JLS0JCUFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkCi0KLQktLQliaXQgNDogb2RkL2V2ZW4gaW5kaWNhdG9yCi0JLS0JCTAgIGV2ZW4gbnVtYmVyIG9mIGFkZHJlc3Mgc2lnbmFscwotCS0tCQkxICBvZGQgbnVtYmVyIG9mIGFkZHJlc3Mgc2lnbmFscwotCS0tCQlUaGUgb2RkL2V2ZW4gaW5kaWNhdG9yIGlzIHVzZWQgd2hlbiB0aGUgdHlwZSBvZiBzdWJhZGRyZXNzCi0JLS0JCWlzICJ1c2VyIHNwZWNpZmllZCIgYW5kIHRoZSBjb2RpbmcgaXMgQkNELgotCi0JLS0JYml0cyAzMjE6IDAwMCAodW51c2VkKQotCi0JLS0JYikgU3ViYWRkcmVzcyBpbmZvcm1hdGlvbi4KLQktLQlUaGUgTlNBUCBYLjIxMy9JU084MzQ4QUQyIGFkZHJlc3Mgc2hhbGwgYmUgZm9ybWF0dGVkIGFzIHNwZWNpZmllZAotCS0tCWJ5IG9jdGV0IDQgd2hpY2ggY29udGFpbnMgdGhlIEF1dGhvcml0eSBhbmQgRm9ybWF0IElkZW50aWZpZXIKLQktLQkoQUZJKS4gVGhlIGVuY29kaW5nIGlzIG1hZGUgYWNjb3JkaW5nIHRvIHRoZSAicHJlZmVycmVkIGJpbmFyeQotCS0tCWVuY29kaW5nIiBhcyBkZWZpbmVkIGluIFguMjEzL0lTTzgzNEFEMi4gRm9yIHRoZSBkZWZpbml0aW9uCi0JLS0Jb2YgdGhpcyB0eXBlIG9mIHN1YmFkZHJlc3MsIHNlZSBJVFUtVCBSZWMgSS4zMzQuCi0KLQktLQlGb3IgVXNlci1zcGVjaWZpYyBzdWJhZGRyZXNzLCB0aGlzIGZpZWxkIGlzIGVuY29kZWQgYWNjb3JkaW5nCi0JLS0JdG8gdGhlIHVzZXIgc3BlY2lmaWNhdGlvbiwgc3ViamVjdCB0byBhIG1heGltdW0gbGVuZ3RoIG9mIDIwCi0JLS0Jb2N0ZXRzLiBXaGVuIGludGVyd29ya2luZyB3aXRoIFguMjUgbmV0d29ya3MgQkNEIGNvZGluZyBzaG91bGQKLQktLQliZSBhcHBsaWVkLgotCi1tYXhJU0ROLVN1YmFkZHJlc3NMZW5ndGggIElOVEVHRVIgOjo9IDIxCi0KLUV4dGVybmFsU2lnbmFsSW5mbyA6Oj0gU0VRVUVOQ0UgewotCXByb3RvY29sSWQJUHJvdG9jb2xJZCwKLQlzaWduYWxJbmZvCVNpZ25hbEluZm8sCi0JLS0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBnaXZlbiBpbgotCS0tIGNsYXVzZSA3LjYuOS4KLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS0tIGV4dGVuc2lvbkNvbnRhaW5lciBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gMgotCS4uLn0KLQotU2lnbmFsSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhTaWduYWxJbmZvTGVuZ3RoKSkKLQotbWF4U2lnbmFsSW5mb0xlbmd0aCAgSU5URUdFUiA6Oj0gMjAwCi0JLS0gVGhpcyBOYW1lZFZhbHVlIHJlcHJlc2VudHMgdGhlIHRoZW9yZXRpY2FsIG1heGltdW0gbnVtYmVyIG9mIG9jdGV0cyB3aGljaCBpcwotCS0tIGF2YWlsYWJsZSB0byBjYXJyeSBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgU2lnbmFsSW5mbyBkYXRhIHR5cGUsCi0JLS0gd2l0aG91dCByZXF1aXJpbmcgc2VnbWVudGF0aW9uIHRvIGNvcGUgd2l0aCB0aGUgbmV0d29yayBsYXllciBzZXJ2aWNlLgotCS0tIEhvd2V2ZXIsIHRoZSBhY3R1YWwgbWF4aW11bSBzaXplIGF2YWlsYWJsZSBmb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEKLQktLSB0eXBlIG1heSBiZSBsb3dlciwgZXNwZWNpYWxseSB3aGVuIG90aGVyIGluZm9ybWF0aW9uIGVsZW1lbnRzCi0JLS0gaGF2ZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2FtZSBjb21wb25lbnQuCi0KLVByb3RvY29sSWQgOjo9IEVOVU1FUkFURUQgewotCWdzbS0wNDA4ICAoMSksCi0JZ3NtLTA4MDYgICgyKSwKLQlnc20tQlNTTUFQICAoMyksCi0JLS0gVmFsdWUgMyBpcyByZXNlcnZlZCBhbmQgbXVzdCBub3QgYmUgdXNlZAotCWV0cy0zMDAxMDItMSAgKDQpfQotCi1FeHQtRXh0ZXJuYWxTaWduYWxJbmZvIDo6PSBTRVFVRU5DRSB7Ci0JZXh0LVByb3RvY29sSWQJRXh0LVByb3RvY29sSWQsCi0Jc2lnbmFsSW5mbwlTaWduYWxJbmZvLAotCS0tIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZ2l2ZW4gaW4KLQktLSBjbGF1c2UgNy42LjkuMTAKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotRXh0LVByb3RvY29sSWQgOjo9IEVOVU1FUkFURUQgewotCWV0cy0zMDAzNTYgICgxKSwKLQkuLi4gCi0JIH0KLS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKLS0tIEZvciBFeHQtRXh0ZXJuYWxTaWduYWxJbmZvIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55Ci0tLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZSAKLS0tIEV4dC1FeHRlcm5hbFNpZ25hbEluZm8gc2VxdWVuY2UuCi0KLUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvIDo6PSBTRVFVRU5DRSB7Ci0JYWNjZXNzTmV0d29ya1Byb3RvY29sSWQJQWNjZXNzTmV0d29ya1Byb3RvY29sSWQsCi0Jc2lnbmFsSW5mbwlMb25nU2lnbmFsSW5mbywKLQktLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGdpdmVuIGluIGNsYXVzZSA3LjYuOS4xCi0JCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUxvbmdTaWduYWxJbmZvIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heExvbmdTaWduYWxJbmZvTGVuZ3RoKSkKLQotbWF4TG9uZ1NpZ25hbEluZm9MZW5ndGggIElOVEVHRVIgOjo9IDI1NjAKLQktLSBUaGlzIE5hbWVkIFZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9jdGV0cyB3aGljaCBpcyBhdmFpbGFibGUKLQktLSB0byBjYXJyeSBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgTG9uZ1NpZ25hbEluZm8gZGF0YSB0eXBlIHVzaW5nCi0JLS0gV2hpdGUgQm9vayBTQ0NQIHdpdGggdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzLgotCS0tIEl0IHRha2VzIGFjY291bnQgb2YgdGhlIG9jdGV0cyB1c2VkIGJ5IHRoZSBsb3dlciBsYXllcnMgb2YgdGhlIHByb3RvY29sLCBhbmQKLQktLSBvdGhlciBpbmZvcm1hdGlvbiBlbGVtZW50cyB3aGljaCBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIHNhbWUgY29tcG9uZW50LgotCi1BY2Nlc3NOZXR3b3JrUHJvdG9jb2xJZCA6Oj0gRU5VTUVSQVRFRCB7Ci0JdHMzRy00ODAwNiAgICgxKSwKLQl0czNHLTI1NDEzICgyKSwKLQkuLi59Ci0JLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgotCS0tIEZvciBBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbyBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQotCS0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAotCS0tIEFjY2Vzc05ldHdvcmtTaWduYWxJbmZvIHNlcXVlbmNlLgotCi1BbGVydGluZ1BhdHRlcm4gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkgKQotCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBBbGVydGluZyBQYXR0ZXJuCi0KLQktLQliaXRzIDg3NjUgOiAwMDAwICh1bnVzZWQpCi0KLQktLQliaXRzIDQzIDogdHlwZSBvZiBQYXR0ZXJuCi0JLS0JCTAwIGxldmVsCi0JLS0JCTAxIGNhdGVnb3J5Ci0JLS0JCTEwIGNhdGVnb3J5Ci0JLS0JCWFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkLgotCi0JLS0JYml0cyAyMSA6IHR5cGUgb2YgYWxlcnRpbmcKLQotYWxlcnRpbmdMZXZlbC0wICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAwMDAnQgotYWxlcnRpbmdMZXZlbC0xICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAwMDEnQgotYWxlcnRpbmdMZXZlbC0yICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAwMTAnQgotCS0tIGFsbCBvdGhlciB2YWx1ZXMgb2YgQWxlcnRpbmcgbGV2ZWwgYXJlIHJlc2VydmVkCi0JLS0gQWxlcnRpbmcgTGV2ZWxzIGFyZSBkZWZpbmVkIGluIEdTTSAwMi4wNwotCQotYWxlcnRpbmdDYXRlZ29yeS0xICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAxMDAnQgotYWxlcnRpbmdDYXRlZ29yeS0yICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAxMDEnQgotYWxlcnRpbmdDYXRlZ29yeS0zICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAxMTAnQgotYWxlcnRpbmdDYXRlZ29yeS00ICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAxMTEnQgotYWxlcnRpbmdDYXRlZ29yeS01ICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDEwMDAnQgotCS0tIGFsbCBvdGhlciB2YWx1ZXMgb2YgQWxlcnRpbmcgQ2F0ZWdvcnkgYXJlIHJlc2VydmVkCi0JLS0gQWxlcnRpbmcgY2F0ZWdvcmllcyBhcmUgZGVmaW5lZCBpbiBHU00gMDIuMDcKLQotLS0gZGF0YSB0eXBlcyBmb3IgbnVtYmVyaW5nIGFuZCBpZGVudGlmaWNhdGlvbgotCi1JTVNJIDo6PSBUQkNELVNUUklORyAoU0laRSAoMy4uOCkpCi0JLS0gZGlnaXRzIG9mIE1DQywgTU5DLCBNU0lOIGFyZSBjb25jYXRlbmF0ZWQgaW4gdGhpcyBvcmRlci4KLQotSWRlbnRpdHkgOjo9IENIT0lDRSB7Ci0JaW1zaQkJCUlNU0ksCi0JaW1zaS1XaXRoTE1TSQlJTVNJLVdpdGhMTVNJfQotCi1JTVNJLVdpdGhMTVNJIDo6PSBTRVFVRU5DRSB7Ci0JaW1zaQkJCUlNU0ksCi0JbG1zaQkJCUxNU0ksCi0JLS0gYSBzcGVjaWFsIHZhbHVlIDAwMDAwMDAwIGluZGljYXRlcyB0aGF0IHRoZSBMTVNJIGlzIG5vdCBpbiB1c2UKLQkuLi59Ci0KLUFTQ0ktQ2FsbFJlZmVyZW5jZSA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDEuLjgpKQotCS0tIGRpZ2l0cyBvZiBWR0NTL1ZCUy1hcmVhLEdyb3VwLUlEIGFyZSBjb25jYXRlbmF0ZWQgaW4gdGhpcyBvcmRlciBpZiB0aGVyZSBpcyBhCi0JLS0gVkdDUy9WQlMtYXJlYS4KLQotVE1TSSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi40KSkKLQotU3Vic2NyaWJlcklkIDo6PSBDSE9JQ0UgewotCWltc2kJCQlbMF0gSU1TSSwKLQl0bXNpCQkJWzFdIFRNU0l9Ci0KLUlNRUkgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICg4KSkKLQktLQlSZWZlcnMgdG8gSW50ZXJuYXRpb25hbCBNb2JpbGUgU3RhdGlvbiBFcXVpcG1lbnQgSWRlbnRpdHkKLQktLQlhbmQgU29mdHdhcmUgVmVyc2lvbiBOdW1iZXIgKFNWTikgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddLgotCS0tCUlmIHRoZSBTVk4gaXMgbm90IHByZXNlbnQgdGhlIGxhc3Qgb2N0ZXQgc2hhbGwgY29udGFpbiB0aGUKLQktLQlkaWdpdCAwIGFuZCBhIGZpbGxlci4KLQktLQlJZiBwcmVzZW50IHRoZSBTVk4gc2hhbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxhc3Qgb2N0ZXQuCi0KLUhMUi1JZCA6Oj0gSU1TSQotCS0tIGxlYWRpbmcgZGlnaXRzIG9mIElNU0ksIGkuZS4gKE1DQywgTU5DLCBsZWFkaW5nIGRpZ2l0cyBvZgotCS0tIE1TSU4pIGZvcm1pbmcgSExSIElkIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XS4KLQotSExSLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mSExSLUlkKSBPRgotCQkJCUhMUi1JZAotCi1tYXhOdW1PZkhMUi1JZCAgSU5URUdFUiA6Oj0gNTAKLQotTE1TSSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKLQotR2xvYmFsQ2VsbElkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDUuLjcpKQotCS0tIFJlZmVycyB0byBDZWxsIEdsb2JhbCBJZGVudGlmaWNhdGlvbiBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10uCi0JLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0JLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKLQktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAotCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0Ci0JLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKLQktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcwotCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0Ci0JLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKLQktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjQuMDA4IFszNV0KLQktLSBvY3RldHMgNiBhbmQgNwlDZWxsIElkZW50aXR5IChDSSkgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjQuMDA4IFszNV0KLQotTmV0d29ya1Jlc291cmNlIDo6PSBFTlVNRVJBVEVEIHsKLQlwbG1uICAoMCksCi0JaGxyICAoMSksCi0JdmxyICAoMiksCi0JcHZsciAgKDMpLAotCWNvbnRyb2xsaW5nTVNDICAoNCksCi0Jdm1zYyAgKDUpLAotCWVpciAgKDYpLAotCXJzcyAgKDcpfQotCi1BZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlIDo6PSBFTlVNRVJBVEVEIHsKLQlzZ3NuICgwKSwKLQlnZ3NuICgxKSwKLQlnbWxjICgyKSwKLQlnc21TQ0YgKDMpLAotCW5wbHIgKDQpLAotCWF1YyAoNSksCi0JLi4uICwKLQl1ZSAoNiksCi0JbW1lICg3KX0KLQktLSBpZiB1bmtub3duIHZhbHVlIGlzIHJlY2VpdmVkIGluIEFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UKLQktLSBpdCBzaGFsbCBiZSBpZ25vcmVkLgotCi0KLU5BRUEtUHJlZmVycmVkQ0kgOjo9IFNFUVVFTkNFIHsKLQluYWVhLVByZWZlcnJlZENJQwlbMF0gTkFFQS1DSUMsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1OQUVBLUNJQyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKLQktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYnkgdGhlIENhcnJpZXIgSWRlbnRpZmljYXRpb24KLQktLSBwYXJhbWV0ZXIgaW4gQU5TSSBUMS4xMTMuMy4gQ2FycmllciBjb2RlcyBiZXR3ZWVuICIwMDAiIGFuZCAiOTk5IiBtYXkKLQktLSBiZSBlbmNvZGVkIGFzIDMgZGlnaXRzIHVzaW5nICIwMDAiIHRvICI5OTkiIG9yIGFzIDQgZGlnaXRzIHVzaW5nIAotCS0tICIwMDAwIiB0byAiMDk5OSIuIENhcnJpZXIgY29kZXMgYmV0d2VlbiAiMTAwMCIgYW5kICI5OTk5IiBhcmUgZW5jb2RlZAotCS0tIHVzaW5nIDQgZGlnaXRzLgotCi1TdWJzY3JpYmVySWRlbnRpdHkgOjo9IENIT0lDRSB7Ci0JaW1zaQkJCVswXSBJTVNJLAotCW1zaXNkbgkJWzFdIElTRE4tQWRkcmVzc1N0cmluZwotCX0KLQotTENTQ2xpZW50RXh0ZXJuYWxJRCA6Oj0gU0VRVUVOQ0UgewotCWV4dGVybmFsQWRkcmVzcwlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiB9Ci0KLUxDU0NsaWVudEludGVybmFsSUQgOjo9IEVOVU1FUkFURUQgewotCWJyb2FkY2FzdFNlcnZpY2UJKDApLAotCW8tYW5kTS1IUExNTgkoMSksCi0Jby1hbmRNLVZQTE1OCSgyKSwKLQlhbm9ueW1vdXNMb2NhdGlvbgkoMyksCi0JdGFyZ2V0TVNzdWJzY3JpYmVkU2VydmljZQkoNCksCi0JLi4uIH0KLS0tIGZvciBhIENBTUVMIHBoYXNlIDMgUExNTiBvcGVyYXRvciBjbGllbnQsIHRoZSB2YWx1ZSB0YXJnZXRNU3N1YnNjcmliZWRTZXJ2aWNlIHNoYWxsIGJlIHVzZWQKLQotTENTU2VydmljZVR5cGVJRCA6Oj0gSU5URUdFUiAoMC4uMTI3KQotCS0tIHRoZSBpbnRlZ2VyIHZhbHVlcyAwLTYzIGFyZSByZXNlcnZlZCBmb3IgU3RhbmRhcmQgTENTIHNlcnZpY2UgdHlwZXMKLQktLSB0aGUgaW50ZWdlciB2YWx1ZXMgNjQtMTI3IGFyZSByZXNlcnZlZCBmb3IgTm9uIFN0YW5kYXJkIExDUyBzZXJ2aWNlIHR5cGVzCi0KLS0tIFN0YW5kYXJkIExDUyBTZXJ2aWNlIFR5cGVzCi1lbWVyZ2VuY3lTZXJ2aWNlcwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMAotZW1lcmdlbmN5QWxlcnRTZXJ2aWNlcwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMQotcGVyc29uVHJhY2tpbmcJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAyCi1mbGVldE1hbmFnZW1lbnQJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDMKLWFzc2V0TWFuYWdlbWVudAkJTENTU2VydmljZVR5cGVJRCA6Oj0gNAotdHJhZmZpY0Nvbmdlc3Rpb25SZXBvcnRpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDUKLXJvYWRzaWRlQXNzaXN0YW5jZQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNgotcm91dGluZ1RvTmVhcmVzdENvbW1lcmNpYWxFbnRlcnByaXNlCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Ci1uYXZpZ2F0aW9uCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOAotCS0tdGhpcyBzZXJ2aWNlIHR5cGUgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBpbiBwcmV2aW91cyByZWxlYXNlcwotY2l0eVNpZ2h0c2VlaW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Ci1sb2NhbGl6ZWRBZHZlcnRpc2luZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAKLW1vYmlsZVllbGxvd1BhZ2VzCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMSAKLXRyYWZmaWNBbmRQdWJsaWNUcmFuc3BvcnRhdGlvbkluZm8JCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyCi13ZWF0aGVyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEzCi1hc3NldEFuZFNlcnZpY2VGaW5kaW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNAotZ2FtaW5nCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE1Ci1maW5kWW91ckZyaWVuZAkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE2Ci1kYXRpbmcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTcKLWNoYXR0aW5nCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE4Ci1yb3V0ZUZpbmRpbmcJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxOQotd2hlcmVBbUkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMjAKLQotLS0gVGhlIHZhbHVlcyBvZiBMQ1NTZXJ2aWNlVHlwZUlEIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byAzR1BQIFRTIDIyLjA3MS4KLQotLS0gTm9uIFN0YW5kYXJkIExDUyBTZXJ2aWNlIFR5cGVzCi1zZXJ2NjQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjQKLXNlcnY2NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2NQotc2VydjY2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY2Ci1zZXJ2NjcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjcKLXNlcnY2OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2OAotc2VydjY5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY5Ci1zZXJ2NzAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzAKLXNlcnY3MQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3MQotc2VydjcyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcyCi1zZXJ2NzMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzMKLXNlcnY3NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3NAotc2Vydjc1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc1Ci1zZXJ2NzYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzYKLXNlcnY3NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Nwotc2Vydjc4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc4Ci1zZXJ2NzkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzkKLXNlcnY4MAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4MAotc2VydjgxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgxCi1zZXJ2ODIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODIKLXNlcnY4MwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Mwotc2Vydjg0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg0Ci1zZXJ2ODUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODUKLXNlcnY4NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Ngotc2Vydjg3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg3Ci1zZXJ2ODgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODgKLXNlcnY4OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4OQotc2VydjkwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkwCi1zZXJ2OTEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTEKLXNlcnY5MgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Mgotc2VydjkzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkzCi1zZXJ2OTQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTQKLXNlcnY5NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5NQotc2Vydjk2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk2Ci1zZXJ2OTcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTcKLXNlcnY5OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5OAotc2Vydjk5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk5Ci1zZXJ2MTAwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMAotc2VydjEwMQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDEKLXNlcnYxMDIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAyCi1zZXJ2MTAzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMwotc2VydjEwNAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDQKLXNlcnYxMDUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA1Ci1zZXJ2MTA2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNgotc2VydjEwNwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDcKLXNlcnYxMDgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA4Ci1zZXJ2MTA5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwOQotc2VydjExMAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTAKLXNlcnYxMTEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTExCi1zZXJ2MTEyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMgotc2VydjExMwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTMKLXNlcnYxMTQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE0Ci1zZXJ2MTE1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNQotc2VydjExNgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTYKLXNlcnYxMTcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE3Ci1zZXJ2MTE4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExOAotc2VydjExOQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTkKLXNlcnYxMjAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIwCi1zZXJ2MTIxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMQotc2VydjEyMgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjIKLXNlcnYxMjMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIzCi1zZXJ2MTI0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNAotc2VydjEyNQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjUKLXNlcnYxMjYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI2Ci1zZXJ2MTI3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNwotCi1QTE1OLUlkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQotCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgotCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0Ci0JLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKLQktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAotCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0Ci0JLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKLQktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAotCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0Ci0KLS0tIGRhdGEgdHlwZXMgZm9yIENBTUVMCi0KLUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJIDo6PSBDSE9JQ0UgewotCWNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoCVswXSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aCwKLQlsYWlGaXhlZExlbmd0aAlbMV0gTEFJRml4ZWRMZW5ndGh9Ci0KLUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDcpKQotCS0tIFJlZmVycyB0byBDZWxsIEdsb2JhbCBJZGVudGlmaWNhdGlvbiBvciBTZXJ2aWNlIEFyZSBJZGVudGlmaWNhdGlvbgotCS0tIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMDMuCi0JLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0JLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKLQktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAotCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0Ci0JLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKLQktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcwotCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0Ci0JLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKLQktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4Ci0JLS0gb2N0ZXRzIDYgYW5kIDcJQ2VsbCBJZGVudGl0eSAoQ0kpIHZhbHVlIG9yIAotCS0tIAkJCVNlcnZpY2UgQXJlYSBDb2RlIChTQUMpIHZhbHVlIAotCS0tCQkJYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDAzCi0KLUxBSUZpeGVkTGVuZ3RoIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDUpKQotCS0tIFJlZmVycyB0byBMb2NhdGlvbiBBcmVhIElkZW50aWZpY2F0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMDMgWzE3XS4KLQktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKLQktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAotCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0Ci0JLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKLQktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAotCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCi0JLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKLQktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAotCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XQotCi0tLSBkYXRhIHR5cGVzIGZvciBzdWJzY3JpYmVyIG1hbmFnZW1lbnQKLQotQmFzaWNTZXJ2aWNlQ29kZSA6Oj0gQ0hPSUNFIHsKLQliZWFyZXJTZXJ2aWNlCVsyXSBCZWFyZXJTZXJ2aWNlQ29kZSwKLQl0ZWxlc2VydmljZQlbM10gVGVsZXNlcnZpY2VDb2RlfQotCi1FeHQtQmFzaWNTZXJ2aWNlQ29kZSA6Oj0gQ0hPSUNFIHsKLQlleHQtQmVhcmVyU2VydmljZQlbMl0gRXh0LUJlYXJlclNlcnZpY2VDb2RlLAotCWV4dC1UZWxlc2VydmljZQlbM10gRXh0LVRlbGVzZXJ2aWNlQ29kZX0KLQotRU1MUFAtSW5mbyA6Oj0gU0VRVUVOQ0UgewotCW1heGltdW1lbnRpdGxlZFByaW9yaXR5CUVNTFBQLVByaW9yaXR5LAotCWRlZmF1bHRQcmlvcml0eQlFTUxQUC1Qcmlvcml0eSwKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotRU1MUFAtUHJpb3JpdHkgOjo9IElOVEVHRVIgKDAuLjE1KQotCS0tIFRoZSBtYXBwaW5nIGZyb20gdGhlIHZhbHVlcyBBLEIsMCwxLDIsMyw0IHRvIHRoZSBpbnRlZ2VyLXZhbHVlIGlzCi0JLS0gc3BlY2lmaWVkIGFzIGZvbGxvd3Mgd2hlcmUgQSBpcyB0aGUgaGlnaGVzdCBhbmQgNCBpcyB0aGUgbG93ZXN0Ci0JLS0gcHJpb3JpdHkgbGV2ZWwKLQktLSB0aGUgaW50ZWdlciB2YWx1ZXMgNy0xNSBhcmUgc3BhcmUgYW5kIHNoYWxsIGJlIG1hcHBlZCB0byB2YWx1ZSA0Ci0KLXByaW9yaXR5TGV2ZWxBCQlFTUxQUC1Qcmlvcml0eSA6Oj0gNgotcHJpb3JpdHlMZXZlbEIJCUVNTFBQLVByaW9yaXR5IDo6PSA1Ci1wcmlvcml0eUxldmVsMAkJRU1MUFAtUHJpb3JpdHkgOjo9IDAKLXByaW9yaXR5TGV2ZWwxCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMQotcHJpb3JpdHlMZXZlbDIJCUVNTFBQLVByaW9yaXR5IDo6PSAyCi1wcmlvcml0eUxldmVsMwkJRU1MUFAtUHJpb3JpdHkgOjo9IDMKLXByaW9yaXR5TGV2ZWw0CQlFTUxQUC1Qcmlvcml0eSA6Oj0gNAotCi1NQy1TUy1JbmZvIDo6PSBTRVFVRU5DRSB7Ci0Jc3MtQ29kZQkJWzBdIFNTLUNvZGUsCi0Jc3MtU3RhdHVzCQlbMV0gRXh0LVNTLVN0YXR1cywKLQluYnJTQgkJWzJdIE1heE1DLUJlYXJlcnMsCi0JbmJyVXNlcgkJWzNdIE1DLUJlYXJlcnMsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1NYXhNQy1CZWFyZXJzIDo6PSBJTlRFR0VSICgyLi5tYXhOdW1PZk1DLUJlYXJlcnMpCi0KLU1DLUJlYXJlcnMgOjo9IElOVEVHRVIgKDEuLm1heE51bU9mTUMtQmVhcmVycykKLQotbWF4TnVtT2ZNQy1CZWFyZXJzICBJTlRFR0VSIDo6PSA3Ci0KLUV4dC1TUy1TdGF0dXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCi0KLQktLSBPQ1RFVCAxOgotCS0tCi0JLS0gYml0cyA4NzY1OiAwMDAwICh1bnVzZWQpCi0JLS0gYml0cyA0MzIxOiBVc2VkIHRvIGNvbnZleSB0aGUgIlAgYml0IiwiUiBiaXQiLCJBIGJpdCIgYW5kICJRIGJpdCIsCi0JLS0JCSAgICByZXByZXNlbnRpbmcgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIHN0YXRlIGluZm9ybWF0aW9uCi0JLS0JCSAgICBhcyBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDExIFsyMl0KLQotCS0tIGJpdCA0OiAiUSBiaXQiCi0KLQktLSBiaXQgMzogIlAgYml0IgotCi0JLS0gYml0IDI6ICJSIGJpdCIKLQotCS0tIGJpdCAxOiAiQSBiaXQiCi0KLQktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gVGhleSBzaGFsbCBiZSBkaXNjYXJkZWQgaWYKLQktLSByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QuCi0KLQotCS0tIGRhdGEgdHlwZXMgZm9yIGdlb2dyYXBoaWMgbG9jYXRpb24KLQotQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uIDo6PSBJTlRFR0VSICgwLi4zMjc2NykKLS0tIHRoZSB2YWx1ZSByZXByZXNlbnRzIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWludXRlcyBzaW5jZSB0aGUgbGFzdAotLS0gbmV0d29yayBjb250YWN0IG9mIHRoZSBtb2JpbGUgc3RhdGlvbiAoaS5lLiB0aGUgYWN0dWFsaXR5IG9mIHRoZQotLS0gbG9jYXRpb24gaW5mb3JtYXRpb24pLgotLS0gdmFsdWUgIjAiIGluZGljYXRlcyB0aGF0IHRoZSBNUyBpcyBjdXJyZW50bHkgaW4gY29udGFjdCB3aXRoIHRoZQotLS0gICAgICAgICAgIG5ldHdvcmsKLS0tIHZhbHVlICIzMjc2NyIgaW5kaWNhdGVzIHRoYXQgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIGF0IGxlYXN0Ci0tLSAgICAgICAgICAgICAgIDMyNzY3IG1pbnV0ZXMgb2xkCi0KLUVORAotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FUi1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRVItRGF0YVR5cGVzLmFzbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiOTBmYy4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FUi1EYXRhVHlwZXMuYXNuCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS0tICRJZDogTUFQLUVSLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKLS0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCi0tLSAxNy43LjcJRXJyb3IgZGF0YSB0eXBlcwotCi1NQVAtRVItRGF0YVR5cGVzIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUVSLURhdGFUeXBlcyAoMTcpIHZlcnNpb24xMSAoMTEpfQotCi1ERUZJTklUSU9OUwotCi1JTVBMSUNJVCBUQUdTCi0KLTo6PQotCi1CRUdJTgotCi1FWFBPUlRTCi0JUm9hbWluZ05vdEFsbG93ZWRQYXJhbSwKLQlDYWxsQmFycmVkUGFyYW0sCi0JQ1VHLVJlamVjdFBhcmFtLAotCVNTLUluY29tcGF0aWJpbGl0eUNhdXNlLAotCVBXLVJlZ2lzdHJhdGlvbkZhaWx1cmVDYXVzZSwKLQlTTS1EZWxpdmVyeUZhaWx1cmVDYXVzZSwKLQlTeXN0ZW1GYWlsdXJlUGFyYW0sCi0JRGF0YU1pc3NpbmdQYXJhbSwKLQlVbmV4cGVjdGVkRGF0YVBhcmFtLAotCUZhY2lsaXR5Tm90U3VwUGFyYW0sCi0JT1ItTm90QWxsb3dlZFBhcmFtLAotCVVua25vd25TdWJzY3JpYmVyUGFyYW0sCi0JTnVtYmVyQ2hhbmdlZFBhcmFtLAotCVVuaWRlbnRpZmllZFN1YlBhcmFtLAotCUlsbGVnYWxTdWJzY3JpYmVyUGFyYW0sCi0JSWxsZWdhbEVxdWlwbWVudFBhcmFtLAotCUJlYXJlclNlcnZOb3RQcm92UGFyYW0sCi0JVGVsZXNlcnZOb3RQcm92UGFyYW0sCi0JVHJhY2luZ0J1ZmZlckZ1bGxQYXJhbSwKLQlOb1JvYW1pbmdOYlBhcmFtLAotCUFic2VudFN1YnNjcmliZXJQYXJhbSwKLQlCdXN5U3Vic2NyaWJlclBhcmFtLAotCU5vU3Vic2NyaWJlclJlcGx5UGFyYW0sCi0JRm9yd2FyZGluZ1Zpb2xhdGlvblBhcmFtLAotCUZvcndhcmRpbmdGYWlsZWRQYXJhbSwgCi0JQVRJLU5vdEFsbG93ZWRQYXJhbSwKLQlTdWJCdXN5Rm9yTVQtU01TLVBhcmFtLAotCU1lc3NhZ2VXYWl0TGlzdEZ1bGxQYXJhbSwKLQlBYnNlbnRTdWJzY3JpYmVyU00tUGFyYW0sCi0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSwKLQlSZXNvdXJjZUxpbWl0YXRpb25QYXJhbSwKLQlOb0dyb3VwQ2FsbE5iUGFyYW0sCi0JSW5jb21wYXRpYmxlVGVybWluYWxQYXJhbSwKLQlTaG9ydFRlcm1EZW5pYWxQYXJhbSwKLQlMb25nVGVybURlbmlhbFBhcmFtLAotCVVuYXV0aG9yaXplZFJlcXVlc3RpbmdOZXR3b3JrLVBhcmFtLAotCVVuYXV0aG9yaXplZExDU0NsaWVudC1QYXJhbSwKLQlQb3NpdGlvbk1ldGhvZEZhaWx1cmUtUGFyYW0sCi1Vbmtub3duT3JVbnJlYWNoYWJsZUxDU0NsaWVudC1QYXJhbSwKLQlNTS1FdmVudE5vdFN1cHBvcnRlZC1QYXJhbSwKLUFUU0ktTm90QWxsb3dlZFBhcmFtLAotQVRNLU5vdEFsbG93ZWRQYXJhbSwKLUlsbGVnYWxTUy1PcGVyYXRpb25QYXJhbSwKLVNTLU5vdEF2YWlsYWJsZVBhcmFtLAotU1MtU3Vic2NyaXB0aW9uVmlvbGF0aW9uUGFyYW0sCi1JbmZvcm1hdGlvbk5vdEF2YWlsYWJsZVBhcmFtLAotVGFyZ2V0Q2VsbE91dHNpZGVHQ0EtUGFyYW0sCi1PbmdvaW5nR3JvdXBDYWxsUGFyYW0KLQotOwotCi1JTVBPUlRTCi0JU1MtU3RhdHVzCi1GUk9NIE1BUC1TUy1EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9Ci0KLQlTaWduYWxJbmZvLAotCUJhc2ljU2VydmljZUNvZGUsCi0JTmV0d29ya1Jlc291cmNlLAotCUFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UKLUZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KLQotCi0JU1MtQ29kZQotRlJPTSBNQVAtU1MtQ29kZSB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9Ci0KLQlFeHRlbnNpb25Db250YWluZXIKLUZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KLTsKLQotUm9hbWluZ05vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgewotCXJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UJUm9hbWluZ05vdEFsbG93ZWRDYXVzZSwKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQlhZGRpdGlvbmFsUm9hbWluZ05vdEFsbG93ZWRDYXVzZQlbMF0gQWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UgT1BUSU9OQUwgfQotCi0tLQlpZiB0aGUgYWRkaXRpb25hbFJvYW1pbmdOb3RhbGxvd2VkQ2F1c2UgaXMgcmVjZWl2ZWQgYnkgdGhlIE1TQy9WTFIgb3IgU0dTTiB0aGVuIHRoZSAKLS0tCXJvYW1pbmdOb3RBbGxvd2VkQ2F1c2Ugc2hhbGwgYmUgZGlzY2FyZGVkLgotCi1BZGRpdGlvbmFsUm9hbWluZ05vdEFsbG93ZWRDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7Ci0Jc3VwcG9ydGVkUkFULVR5cGVzTm90QWxsb3dlZCAoMCksCi0JLi4ufQotCi1Sb2FtaW5nTm90QWxsb3dlZENhdXNlIDo6PSBFTlVNRVJBVEVEIHsKLQlwbG1uUm9hbWluZ05vdEFsbG93ZWQgICgwKSwKLQlvcGVyYXRvckRldGVybWluZWRCYXJyaW5nICAoMyl9Ci0KLUNhbGxCYXJyZWRQYXJhbSA6Oj0gQ0hPSUNFIHsKLQljYWxsQmFycmluZ0NhdXNlCUNhbGxCYXJyaW5nQ2F1c2UsCi0JLS0gY2FsbCBCYXJyaW5nQ2F1c2UgbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDMgYW5kIGhpZ2hlcgotCWV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0JRXh0ZW5zaWJsZUNhbGxCYXJyZWRQYXJhbQotCS0tIGV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0gbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDwzCi0JfQotCi1DYWxsQmFycmluZ0NhdXNlIDo6PSBFTlVNRVJBVEVEIHsKLQliYXJyaW5nU2VydmljZUFjdGl2ZSAgKDApLAotCW9wZXJhdG9yQmFycmluZyAgKDEpfQotCi1FeHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JY2FsbEJhcnJpbmdDYXVzZQlDYWxsQmFycmluZ0NhdXNlCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uICwKLQl1bmF1dGhvcmlzZWRNZXNzYWdlT3JpZ2luYXRvcglbMV0gTlVMTAkJT1BUSU9OQUwgfQotCi1DVUctUmVqZWN0UGFyYW0gOjo9IFNFUVVFTkNFIHsKLQljdWctUmVqZWN0Q2F1c2UJQ1VHLVJlamVjdENhdXNlCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1DVUctUmVqZWN0Q2F1c2UgOjo9IEVOVU1FUkFURUQgewotCWluY29taW5nQ2FsbHNCYXJyZWRXaXRoaW5DVUcgICgwKSwKLQlzdWJzY3JpYmVyTm90TWVtYmVyT2ZDVUcgICgxKSwKLQlyZXF1ZXN0ZWRCYXNpY1NlcnZpY2VWaW9sYXRlc0NVRy1Db25zdHJhaW50cyAgKDUpLAotCWNhbGxlZFBhcnR5U1MtSW50ZXJhY3Rpb25WaW9sYXRpb24gICg3KX0KLQotU1MtSW5jb21wYXRpYmlsaXR5Q2F1c2UgOjo9IFNFUVVFTkNFIHsKLQlzcy1Db2RlCQlbMV0gU1MtQ29kZQlPUFRJT05BTCwKLQliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKLQlzcy1TdGF0dXMJCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCi0JLi4ufQotCi1QVy1SZWdpc3RyYXRpb25GYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgewotCXVuZGV0ZXJtaW5lZCAgKDApLAotCWludmFsaWRGb3JtYXQgICgxKSwKLQluZXdQYXNzd29yZHNNaXNtYXRjaCAgKDIpfQotCi1TTS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgewotCW1lbW9yeUNhcGFjaXR5RXhjZWVkZWQgICgwKSwKLQllcXVpcG1lbnRQcm90b2NvbEVycm9yICAoMSksCi0JZXF1aXBtZW50Tm90U00tRXF1aXBwZWQgICgyKSwKLQl1bmtub3duU2VydmljZUNlbnRyZSAgKDMpLAotCXNjLUNvbmdlc3Rpb24gICg0KSwKLQlpbnZhbGlkU01FLUFkZHJlc3MgICg1KSwKLQlzdWJzY3JpYmVyTm90U0MtU3Vic2NyaWJlciAgKDYpfQotCi1TTS1EZWxpdmVyeUZhaWx1cmVDYXVzZSA6Oj0gU0VRVUVOQ0UgewotCXNtLUVudW1lcmF0ZWREZWxpdmVyeUZhaWx1cmVDYXVzZQlTTS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UsCi0JZGlhZ25vc3RpY0luZm8JU2lnbmFsSW5mbwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotQWJzZW50U3Vic2NyaWJlclNNLVBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMLAotCS0tIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gY2FuIGJlIGVpdGhlciBmb3Igbm9uLUdQUlMgCi0JLS0gb3IgZm9yIEdQUlMKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAgCVswXSAJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCB9Ci0JLS0gaWYgcmVjZWl2ZWQsIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAotCS0tIGlzIGZvciBHUFJTIGFuZCBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIAotCS0tIGZvciBub24tR1BSUwotCi1BYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIDo6PSBJTlRFR0VSICgwLi4yNTUpCi0JLS0gQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wNDAKLQotU3lzdGVtRmFpbHVyZVBhcmFtIDo6PSBDSE9JQ0UgewotCW5ldHdvcmtSZXNvdXJjZQlOZXR3b3JrUmVzb3VyY2UsCi0JLS0gbmV0d29ya1Jlc291cmNlIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAzCi0JZXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbQlFeHRlbnNpYmxlU3lzdGVtRmFpbHVyZVBhcmFtCi0JLS0gZXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbSBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gPDMKLQl9Ci0KLUV4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQluZXR3b3JrUmVzb3VyY2UJTmV0d29ya1Jlc291cmNlCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCWFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UJWzBdIEFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UJT1BUSU9OQUwsCi0JZmFpbHVyZUNhdXNlUGFyYW0JWzFdIEZhaWx1cmVDYXVzZVBhcmFtCU9QVElPTkFMIH0KLQotRmFpbHVyZUNhdXNlUGFyYW0gOjo9IEVOVU1FUkFURUQgewotCWxpbWl0UmVhY2hlZE9uTnVtYmVyT2ZDb25jdXJyZW50TG9jYXRpb25SZXF1ZXN0cyAoMCksCi0JLi4uIH0KLQktLSBpZiB1bmtub3duIHZhbHVlIGlzIHJlY2VpdmVkIGluIEZhaWx1cmVDYXVzZVBhcmFtIGl0IHNoYWxsIGJlIGlnbm9yZWQKLQotCi1EYXRhTWlzc2luZ1BhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLVVuZXhwZWN0ZWREYXRhUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotRmFjaWxpdHlOb3RTdXBQYXJhbSA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCXNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkIFswXQlOVUxMCQlPUFRJT05BTCwKLQluZWVkZWRMY3NDYXBhYmlsaXR5Tm90U3VwcG9ydGVkSW5TZXJ2aW5nTm9kZSBbMV0gTlVMTAlPUFRJT05BTCB9Ci0KLU9SLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1Vbmtub3duU3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JdW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljCVVua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYwlPUFRJT05BTH0KLQotVW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKLQlpbXNpVW5rbm93biAgKDApLAotCWdwcnMtZXBzLVN1YnNjcmlwdGlvblVua25vd24gICgxKSwKLQkuLi4sCi0JbnBkYk1pc21hdGNoICAoMil9Ci0JLS0gaWYgdW5rbm93biB2YWx1ZXMgYXJlIHJlY2VpdmVkIGluIAkKLQktLSBVbmtub3duU3Vic2NyaWJlckRpYWdub3N0aWMgdGhleSBzaGFsbCBiZSBkaXNjYXJkZWQKLQotTnVtYmVyQ2hhbmdlZFBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLVVuaWRlbnRpZmllZFN1YlBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUlsbGVnYWxTdWJzY3JpYmVyUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotSWxsZWdhbEVxdWlwbWVudFBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUJlYXJlclNlcnZOb3RQcm92UGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotVGVsZXNlcnZOb3RQcm92UGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotVHJhY2luZ0J1ZmZlckZ1bGxQYXJhbSA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1Ob1JvYW1pbmdOYlBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUFic2VudFN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCWFic2VudFN1YnNjcmliZXJSZWFzb24JWzBdIEFic2VudFN1YnNjcmliZXJSZWFzb24JT1BUSU9OQUx9Ci0KLUFic2VudFN1YnNjcmliZXJSZWFzb24gOjo9IEVOVU1FUkFURUQgewotCWltc2lEZXRhY2ggKDApLAotCXJlc3RyaWN0ZWRBcmVhICgxKSwKLQlub1BhZ2VSZXNwb25zZSAoMiksCi0JLi4uICwKLQlwdXJnZWRNUyAoMyl9Ci0tLSBleGNlcHRpb24gaGFuZGxpbmc6IGF0IHJlY2VwdGlvbiBvZiBvdGhlciB2YWx1ZXMgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIAotLS0gQWJzZW50U3Vic2NyaWJlclJlYXNvbiBzaGFsbCBiZSBpZ25vcmVkLiAKLS0tIFRoZSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uOiBwdXJnZWRNUyBpcyBkZWZpbmVkIGZvciB0aGUgU3VwZXItQ2hhcmdlciBmZWF0dXJlIAotLS0gKHNlZSBUUyAyMy4xMTYpLiBJZiB0aGlzIHZhbHVlIGlzIHJlY2VpdmVkIGluIGEgUHJvdmlkZSBSb2FtaW5nIE51bWJlciByZXNwb25zZQotLS0gaXQgc2hhbGwgYmUgbWFwcGVkIHRvIHRoZSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uOiBpbXNpRGV0YWNoIGluIHRoZSBTZW5kIFJvdXRlaW5nCi0tLSBJbmZvcm1hdGlvbiByZXNwb25zZQotCi1CdXN5U3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JY2Nicy1Qb3NzaWJsZQlbMF0gTlVMTAkJT1BUSU9OQUwsCi0JY2Nicy1CdXN5CQlbMV0gTlVMTAkJT1BUSU9OQUx9Ci0KLU5vU3Vic2NyaWJlclJlcGx5UGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotRm9yd2FyZGluZ1Zpb2xhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUZvcndhcmRpbmdGYWlsZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1BVEktTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUFUU0ktTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUFUTS1Ob3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotSWxsZWdhbFNTLU9wZXJhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLVNTLU5vdEF2YWlsYWJsZVBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLVNTLVN1YnNjcmlwdGlvblZpb2xhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUluZm9ybWF0aW9uTm90QXZhaWxhYmxlUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotU3ViQnVzeUZvck1ULVNNUy1QYXJhbSA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uICwKLQlncHJzQ29ubmVjdGlvblN1c3BlbmRlZAlOVUxMCQkJT1BUSU9OQUwgfQotCS0tIElmIEdwcnNDb25uZWN0aW9uU3VzcGVuZGVkIGlzIG5vdCB1bmRlcnN0b29kIGl0IHNoYWxsIAotCS0tIGJlIGRpc2NhcmRlZAotCi1NZXNzYWdlV2FpdExpc3RGdWxsUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotUmVzb3VyY2VMaW1pdGF0aW9uUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotTm9Hcm91cENhbGxOYlBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUluY29tcGF0aWJsZVRlcm1pbmFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotU2hvcnRUZXJtRGVuaWFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQkuLi59Ci0KLUxvbmdUZXJtRGVuaWFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQkuLi59Ci0KLVVuYXV0aG9yaXplZFJlcXVlc3RpbmdOZXR3b3JrLVBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLVVuYXV0aG9yaXplZExDU0NsaWVudC1QYXJhbSA6Oj0gU0VRVUVOQ0UgewotCXVuYXV0aG9yaXplZExDU0NsaWVudC1EaWFnbm9zdGljCVswXSBVbmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcgkJCU9QVElPTkFMLAotCS4uLiB9Ci0KLVVuYXV0aG9yaXplZExDU0NsaWVudC1EaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKLQlub0FkZGl0aW9uYWxJbmZvcm1hdGlvbiAoMCksCi0JY2xpZW50Tm90SW5NU1ByaXZhY3lFeGNlcHRpb25MaXN0ICgxKSwKLQljYWxsVG9DbGllbnROb3RTZXR1cCAoMiksCi0JcHJpdmFjeU92ZXJyaWRlTm90QXBwbGljYWJsZSAoMyksCi0JZGlzYWxsb3dlZEJ5TG9jYWxSZWd1bGF0b3J5UmVxdWlyZW1lbnRzICg0KSwKLQkuLi4sCi0JdW5hdXRob3JpemVkUHJpdmFjeUNsYXNzICg1KSwKLQl1bmF1dGhvcml6ZWRDYWxsU2Vzc2lvblVucmVsYXRlZEV4dGVybmFsQ2xpZW50ICg2KSwKLQl1bmF1dGhvcml6ZWRDYWxsU2Vzc2lvblJlbGF0ZWRFeHRlcm5hbENsaWVudCAoNykgfQotLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgotLS0JYW55IHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSBpZ25vcmVkCi0KLVBvc2l0aW9uTWV0aG9kRmFpbHVyZS1QYXJhbSA6Oj0gU0VRVUVOQ0UgewotCXBvc2l0aW9uTWV0aG9kRmFpbHVyZS1EaWFnbm9zdGljCVswXSBQb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcgkJCU9QVElPTkFMLAotCS4uLiB9Ci0KLVBvc2l0aW9uTWV0aG9kRmFpbHVyZS1EaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKLQljb25nZXN0aW9uICAoMCksCi0JaW5zdWZmaWNpZW50UmVzb3VyY2VzICAoMSksCi0JaW5zdWZmaWNpZW50TWVhc3VyZW1lbnREYXRhICAoMiksCi0JaW5jb25zaXN0ZW50TWVhc3VyZW1lbnREYXRhICAoMyksCi0JbG9jYXRpb25Qcm9jZWR1cmVOb3RDb21wbGV0ZWQgICg0KSwKLQlsb2NhdGlvblByb2NlZHVyZU5vdFN1cHBvcnRlZEJ5VGFyZ2V0TVMgICg1KSwKLQlxb1NOb3RBdHRhaW5hYmxlICAoNiksCi0JcG9zaXRpb25NZXRob2ROb3RBdmFpbGFibGVJbk5ldHdvcmsJKDcpLAotCXBvc2l0aW9uTWV0aG9kTm90QXZhaWxhYmxlSW5Mb2NhdGlvbkFyZWEJKDgpLAotCS4uLiB9Ci0tLQlleGNlcHRpb24gaGFuZGxpbmc6Ci0tLQlhbnkgdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIGlnbm9yZWQKLQotVW5rbm93bk9yVW5yZWFjaGFibGVMQ1NDbGllbnQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotTU0tRXZlbnROb3RTdXBwb3J0ZWQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotVGFyZ2V0Q2VsbE91dHNpZGVHQ0EtUGFyYW0gOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotT25nb2luZ0dyb3VwQ2FsbFBhcmFtIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLQotRU5ECi0KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRjMDU3Li4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0tLSAkSWQ6IE1BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCi0tLSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgotLS0KLS0tIFRha2VuIGZyb20gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQotLS0KLS0tIDE3LjcuMTEgRXh0ZW5zaW9uIGRhdGEgdHlwZXMKLS0tCi0KLU1BUC1FeHRlbnNpb25EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Ci0KLURFRklOSVRJT05TCi0KLUlNUExJQ0lUIFRBR1MKLQotOjo9Ci0KLUJFR0lOCi0KLUVYUE9SVFMKLQotCVByaXZhdGVFeHRlbnNpb24sCi0JRXh0ZW5zaW9uQ29udGFpbmVyLAotCVNMUi1BcmdFeHRlbnNpb25Db250YWluZXI7Ci0KLQotLS0gSU9DIGZvciBwcml2YXRlIE1BUCBleHRlbnNpb25zCi0KLQotTUFQLUVYVEVOU0lPTiAgOjo9IENMQVNTIHsKLQkmRXh0ZW5zaW9uVHlwZQkJCQlPUFRJT05BTCwKLQkmZXh0ZW5zaW9uSWQgCU9CSkVDVCBJREVOVElGSUVSIH0KLQktLSBUaGUgbGVuZ3RoIG9mIHRoZSBPYmplY3QgSWRlbnRpZmllciBzaGFsbCBub3QgZXhjZWVkIDE2IG9jdGV0cyBhbmQgdGhlCi0JLS0gbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdGhlIE9iamVjdCBJZGVudGlmaWVyIHNoYWxsIG5vdCBleGNlZWQgMTYKLQotLS0gZGF0YSB0eXBlcwotCi1FeHRlbnNpb25Db250YWluZXIgOjo9IFNFUVVFTkNFIHsKLQlwcml2YXRlRXh0ZW5zaW9uTGlzdAlbMF1Qcml2YXRlRXh0ZW5zaW9uTGlzdAlPUFRJT05BTCwgCi0JcGNzLUV4dGVuc2lvbnMJWzFdUENTLUV4dGVuc2lvbnMJT1BUSU9OQUwsCi0JLi4ufQotCi1TTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyIDo6PSBTRVFVRU5DRSB7Ci0JcHJpdmF0ZUV4dGVuc2lvbkxpc3QJWzBdUHJpdmF0ZUV4dGVuc2lvbkxpc3QJT1BUSU9OQUwsIAotCXNsci1BcmctUENTLUV4dGVuc2lvbnMJWzFdU0xSLUFyZy1QQ1MtRXh0ZW5zaW9ucwlPUFRJT05BTCwKLQkuLi59Ci0KLVByaXZhdGVFeHRlbnNpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlByaXZhdGVFeHRlbnNpb25zKSBPRgotCQkJCVByaXZhdGVFeHRlbnNpb24KLQotUHJpdmF0ZUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgewotCWV4dElkCQlNQVAtRVhURU5TSU9OLiZleHRlbnNpb25JZAotCQkJCSh7RXh0ZW5zaW9uU2V0fSksCi0JZXh0VHlwZQkJTUFQLUVYVEVOU0lPTi4mRXh0ZW5zaW9uVHlwZQotCQkJCSh7RXh0ZW5zaW9uU2V0fXtAZXh0SWR9KQlPUFRJT05BTH0KLQotbWF4TnVtT2ZQcml2YXRlRXh0ZW5zaW9ucyAgSU5URUdFUiA6Oj0gMTAKLQotRXh0ZW5zaW9uU2V0CQlNQVAtRVhURU5TSU9OIDo6PQotCQl7Li4uCi0JCSAtLSBFeHRlbnNpb25TZXQgaXMgdGhlIHNldCBvZiBhbGwgZGVmaW5lZCBwcml2YXRlIGV4dGVuc2lvbnMKLQl9Ci0JLS0gVW5zdXBwb3J0ZWQgcHJpdmF0ZSBleHRlbnNpb25zIHNoYWxsIGJlIGRpc2NhcmRlZCBpZiByZWNlaXZlZC4KLQotUENTLUV4dGVuc2lvbnMgOjo9IFNFUVVFTkNFIHsKLQkuLi59Ci0KLVNMUi1BcmctUENTLUV4dGVuc2lvbnMgOjo9IFNFUVVFTkNFIHsKLQkuLi4sCi0JbmEtRVNSSy1SZXF1ZXN0CVswXQlOVUxMCQlPUFRJT05BTCB9Ci0KLUVORAotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1MQ1MtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDM0Yjg5Li4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuCisrKyAvZGV2L251bGwKQEAgLTEsNjU3ICswLDAgQEAKLS0tICRJZDogTUFQLUxDUy1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCi0tLSBNQVAtTENTLURhdGFUeXBlcy5hc24KLS0tCi0tLSBUYWtlbiBmcm9tIDNHUFAgVFMgMjkuMDAyICBWOC45LjAgKDIwMDktMDQpCi0tLQotLS0gMTcuNy4xMyBMb2NhdGlvbiBzZXJ2aWNlIGRhdGEgdHlwZXMKLS0tCi0KLU1BUC1MQ1MtRGF0YVR5cGVzIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uMTEgKDExKX0KLQotREVGSU5JVElPTlMKLUlNUExJQ0lUIFRBR1MKLTo6PQotQkVHSU4KLQotRVhQT1JUUwotCVJvdXRpbmdJbmZvRm9yTENTLUFyZywKLQlSb3V0aW5nSW5mb0ZvckxDUy1SZXMsCi0JUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcsCi0JUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1SZXMsCi0JU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LUFyZywKLQlTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtUmVzLAotTG9jYXRpb25UeXBlLCAKLURlZmVycmVkTG9jYXRpb25FdmVudFR5cGUsCi1MQ1NDbGllbnROYW1lLAotTENTLVFvUywKLUhvcml6b250YWwtQWNjdXJhY3ksCi1SZXNwb25zZVRpbWUsCi1FeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIAotVmVsb2NpdHlFc3RpbWF0ZSwKLVN1cHBvcnRlZEdBRFNoYXBlcywKLUFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwKLUxDU1JlcXVlc3RvcklELCAKLUxDUy1SZWZlcmVuY2VOdW1iZXIsCi1MQ1NDb2Rld29yZCwKLUFyZWFFdmVudEluZm8sCi1SZXBvcnRpbmdQTE1OTGlzdCwKLVBlcmlvZGljTERSSW5mbywKLVNlcXVlbmNlTnVtYmVyCi07Ci0KLUlNUE9SVFMKLQlBZGRyZXNzU3RyaW5nLAotCUlTRE4tQWRkcmVzc1N0cmluZywKLQlJTUVJLAotCUlNU0ksCi0JTE1TSSwKLQlTdWJzY3JpYmVySWRlbnRpdHksCi0JQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uLAotCUxDU0NsaWVudEV4dGVybmFsSUQsCi0JTENTQ2xpZW50SW50ZXJuYWxJRCwKLUxDU1NlcnZpY2VUeXBlSUQsCi1DZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSwKLVBMTU4tSWQKLUZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KLQotCUV4dGVuc2lvbkNvbnRhaW5lciwKLQlTTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyCi1GUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Ci0KLQlVU1NELURhdGFDb2RpbmdTY2hlbWUsCi1VU1NELVN0cmluZwotRlJPTSBNQVAtU1MtRGF0YVR5cGVzIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKQotICAgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQotCi0JQVBOLAotCUdTTi1BZGRyZXNzLAotCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwotRlJPTSBNQVAtTVMtRGF0YVR5cGVzIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU1TLURhdGFUeXBlcyAoMTEpIHZlcnNpb24xMSAoMTEpfQotCi0JQWRkaXRpb25hbC1OdW1iZXIKLUZST00gTUFQLVNNLURhdGFUeXBlcyB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TTS1EYXRhVHlwZXMgKDE2KSB2ZXJzaW9uMTEgKDExKX0KLTsKLQotCi1Sb3V0aW5nSW5mb0ZvckxDUy1BcmcgOjo9IFNFUVVFTkNFIHsKLQltbGNOdW1iZXIJCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCi0JdGFyZ2V0TVMJCVsxXSBTdWJzY3JpYmVySWRlbnRpdHksCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1Sb3V0aW5nSW5mb0ZvckxDUy1SZXMgOjo9IFNFUVVFTkNFIHsKLQl0YXJnZXRNUwkJWzBdIFN1YnNjcmliZXJJZGVudGl0eSwKLQlsY3NMb2NhdGlvbkluZm8JWzFdIExDU0xvY2F0aW9uSW5mbywKLQlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0Jdi1nbWxjLUFkZHJlc3MJWzNdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAotCWgtZ21sYy1BZGRyZXNzCVs0XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKLQlwcHItQWRkcmVzcwlbNV0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCi0JYWRkaXRpb25hbC12LWdtbGMtQWRkcmVzcwlbNl0JR1NOLUFkZHJlc3MJT1BUSU9OQUwgfQotCi1MQ1NMb2NhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKLQluZXR3b3JrTm9kZS1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAotCS0tIE5ldHdvcmtOb2RlLW51bWJlciBjYW4gYmUgZWl0aGVyIG1zYy1udW1iZXIgb3Igc2dzbi1udW1iZXIKLQlsbXNpCQkJWzBdIExNU0kJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiAsCi0JZ3Byc05vZGVJbmRpY2F0b3IgCVsyXSBOVUxMCQlPUFRJT05BTCwKLQktLSBncHJzTm9kZUluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU0dTTiBudW1iZXIgaXMgc2VudCBhcyB0aGUgTmV0d29yayBOb2RlIE51bWJlcgotCWFkZGl0aW9uYWwtTnVtYmVyCVszXSBBZGRpdGlvbmFsLU51bWJlcglPUFRJT05BTCwKLQlzdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJWzRdCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTCwKLQlhZGRpdGlvbmFsLUxDUy1DYXBhYmlsaXR5U2V0cwlbNV0JU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMCi0JfQotCi1Qcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyA6Oj0gU0VRVUVOQ0UgewotCWxvY2F0aW9uVHlwZQlMb2NhdGlvblR5cGUsCi0JbWxjLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCi0JbGNzLUNsaWVudElECVswXSBMQ1MtQ2xpZW50SUQJT1BUSU9OQUwsCi0JcHJpdmFjeU92ZXJyaWRlCVsxXSBOVUxMCQlPUFRJT05BTCwKLQlpbXNpCQkJWzJdIElNU0kJCU9QVElPTkFMLAotCW1zaXNkbgkJWzNdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQlsbXNpCQkJWzRdIExNU0kJCU9QVElPTkFMLAotCWltZWkJCQlbNV0gSU1FSQkJT1BUSU9OQUwsCi0JbGNzLVByaW9yaXR5CVs2XSBMQ1MtUHJpb3JpdHkJT1BUSU9OQUwsCi0JbGNzLVFvUwkJWzddIExDUy1Rb1MJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs4XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uICwKLQlzdXBwb3J0ZWRHQURTaGFwZXMJWzldCVN1cHBvcnRlZEdBRFNoYXBlcwlPUFRJT05BTCwKLQlsY3MtUmVmZXJlbmNlTnVtYmVyCVsxMF0JTENTLVJlZmVyZW5jZU51bWJlcglPUFRJT05BTCwKLQlsY3NTZXJ2aWNlVHlwZUlECVsxMV0JTENTU2VydmljZVR5cGVJRAlPUFRJT05BTCwKLQlsY3NDb2Rld29yZAlbMTJdCUxDU0NvZGV3b3JkCU9QVElPTkFMLAotCWxjcy1Qcml2YWN5Q2hlY2sJWzEzXQlMQ1MtUHJpdmFjeUNoZWNrCU9QVElPTkFMLAotCWFyZWFFdmVudEluZm8JWzE0XQlBcmVhRXZlbnRJbmZvCU9QVElPTkFMLAotCWgtZ21sYy1BZGRyZXNzCVsxNV0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCi0JbW8tbHJTaG9ydENpcmN1aXRJbmRpY2F0b3IJWzE2XSBOVUxMCQlPUFRJT05BTCwKLQlwZXJpb2RpY0xEUkluZm8JWzE3XSBQZXJpb2RpY0xEUkluZm8JT1BUSU9OQUwsCi0JcmVwb3J0aW5nUExNTkxpc3QJWzE4XSBSZXBvcnRpbmdQTE1OTGlzdAlPUFRJT05BTCB9Ci0KLQktLSBvbmUgb2YgaW1zaSBvciBtc2lzZG4gaXMgbWFuZGF0b3J5Ci0JLS0gSWYgYSBsb2NhdGlvbiBlc3RpbWF0ZSB0eXBlIGluZGljYXRlcyBhY3RpdmF0ZSBkZWZlcnJlZCBsb2NhdGlvbiBvciBjYW5jZWwgZGVmZXJyZWQgCi0JLS0gbG9jYXRpb24sIGEgbGNzLVJlZmVyZW5jZSBudW1iZXIgc2hhbGwgYmUgaW5jbHVkZWQuCi0KLUxvY2F0aW9uVHlwZSA6Oj0gU0VRVUVOQ0UgewotCWxvY2F0aW9uRXN0aW1hdGVUeXBlCVswXSBMb2NhdGlvbkVzdGltYXRlVHlwZSwKLQkuLi4sCi0JZGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZQlbMV0gRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZQlPUFRJT05BTCB9Ci0KLUxvY2F0aW9uRXN0aW1hdGVUeXBlIDo6PSBFTlVNRVJBVEVEIHsKLQljdXJyZW50TG9jYXRpb24JKDApLAotCWN1cnJlbnRPckxhc3RLbm93bkxvY2F0aW9uCSgxKSwKLQlpbml0aWFsTG9jYXRpb24JKDIpLAotCS4uLiwKLQlhY3RpdmF0ZURlZmVycmVkTG9jYXRpb24JKDMpLAotCWNhbmNlbERlZmVycmVkTG9jYXRpb24JKDQpICwKLQlub3RpZmljYXRpb25WZXJpZmljYXRpb25Pbmx5CSg1KSB9Ci0tLQlleGNlcHRpb24gaGFuZGxpbmc6Ci0tLQlhIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIGNvbnRhaW5pbmcgYW4gdW5yZWNvZ25pemVkIExvY2F0aW9uRXN0aW1hdGVUeXBlCi0tLQlzaGFsbCBiZSByZWplY3RlZCBieSB0aGUgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiB1bmV4cGVjdGVkIGRhdGEgdmFsdWUKLQotRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSA6Oj0gQklUIFNUUklORyB7Ci0JbXNBdmFpbGFibGUJKDApICwKLQllbnRlcmluZ0ludG9BcmVhCSgxKSwKLQlsZWF2aW5nRnJvbUFyZWEJKDIpLAotCWJlaW5nSW5zaWRlQXJlYQkoMykgLAotCXBlcmlvZGljTERSCSg0KSAgfSAoU0laRSAoMS4uMTYpKSAKLS0tIGJlaW5nSW5zaWRlQXJlYSBpcyBhbHdheXMgdHJlYXRlZCBhcyBvbmVUaW1lRXZlbnQgcmVnYXJkbGVzcyBvZiB0aGUgcG9zc2libGUgdmFsdWUKLS0tIG9mIG9jY3VycmVuY2VJbmZvIGluc2lkZSBhcmVhRXZlbnRJbmZvLgotLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgotLS0gYSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyBjb250YWluaW5nIG90aGVyIHZhbHVlcyB0aGFuIGxpc3RlZCBhYm92ZSBpbiAKLS0tIERlZmVycmVkTG9jYXRpb25FdmVudFR5cGUgc2hhbGwgYmUgcmVqZWN0ZWQgYnkgdGhlIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgCi0tLSB1bmV4cGVjdGVkIGRhdGEgdmFsdWUuCi0KLUxDUy1DbGllbnRJRCA6Oj0gU0VRVUVOQ0UgewotCWxjc0NsaWVudFR5cGUJWzBdIExDU0NsaWVudFR5cGUsCi0JbGNzQ2xpZW50RXh0ZXJuYWxJRAlbMV0gTENTQ2xpZW50RXh0ZXJuYWxJRAlPUFRJT05BTCwKLQlsY3NDbGllbnREaWFsZWRCeU1TCVsyXSBBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCWxjc0NsaWVudEludGVybmFsSUQJWzNdIExDU0NsaWVudEludGVybmFsSUQJT1BUSU9OQUwsCi0JbGNzQ2xpZW50TmFtZQlbNF0gTENTQ2xpZW50TmFtZQlPUFRJT05BTCwKLQkuLi4sCi0JbGNzQVBOCQlbNV0gQVBOCQlPUFRJT05BTCwKLQlsY3NSZXF1ZXN0b3JJRAlbNl0gTENTUmVxdWVzdG9ySUQJT1BUSU9OQUwgfQotCi1MQ1NDbGllbnRUeXBlIDo6PSBFTlVNRVJBVEVEIHsKLQllbWVyZ2VuY3lTZXJ2aWNlcwkoMCksCi0JdmFsdWVBZGRlZFNlcnZpY2VzCSgxKSwKLQlwbG1uT3BlcmF0b3JTZXJ2aWNlcwkoMiksCi0JbGF3ZnVsSW50ZXJjZXB0U2VydmljZXMJKDMpLAotCS4uLiB9Ci0JLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgotCS0tCXVucmVjb2duaXplZCB2YWx1ZXMgbWF5IGJlIGlnbm9yZWQgaWYgdGhlIExDUyBjbGllbnQgdXNlcyB0aGUgcHJpdmFjeSBvdmVycmlkZQotCS0tCW90aGVyd2lzZSwgYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgYXMgdW5leHBlY3RlZCBkYXRhIGJ5IGEgcmVjZWl2ZXIKLQktLQlhIHJldHVybiBlcnJvciBzaGFsbCB0aGVuIGJlIHJldHVybmVkIGlmIHJlY2VpdmVkIGluIGEgTUFQIGludm9rZSAKLQotTENTQ2xpZW50TmFtZSA6Oj0gU0VRVUVOQ0UgewotCWRhdGFDb2RpbmdTY2hlbWUJWzBdIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKLQluYW1lU3RyaW5nCVsyXSBOYW1lU3RyaW5nLAotCS4uLiwKLQlsY3MtRm9ybWF0SW5kaWNhdG9yCVszXSBMQ1MtRm9ybWF0SW5kaWNhdG9yCU9QVElPTkFMIH0KLQotLS0gVGhlIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSBzaGFsbCBpbmRpY2F0ZSB1c2Ugb2YgdGhlIGRlZmF1bHQgYWxwaGFiZXQgdGhyb3VnaCB0aGUKLS0tIGZvbGxvd2luZyBlbmNvZGluZwotLS0JYml0CTcgNiA1IDQgMyAyIDEgMAotLS0JCTAgMCAwIDAgMSAxIDEgMQotCi1OYW1lU3RyaW5nIDo6PSBVU1NELVN0cmluZyAoU0laRSAoMS4ubWF4TmFtZVN0cmluZ0xlbmd0aCkpCi0KLW1heE5hbWVTdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDYzCi0KLUxDU1JlcXVlc3RvcklEIDo6PSBTRVFVRU5DRSB7Ci0JZGF0YUNvZGluZ1NjaGVtZQlbMF0gVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAotCXJlcXVlc3RvcklEU3RyaW5nCVsxXSBSZXF1ZXN0b3JJRFN0cmluZywKLQkuLi4sCi0JbGNzLUZvcm1hdEluZGljYXRvcglbMl0gTENTLUZvcm1hdEluZGljYXRvcglPUFRJT05BTCB9Ci0KLVJlcXVlc3RvcklEU3RyaW5nIDo6PSBVU1NELVN0cmluZyAoU0laRSAoMS4ubWF4UmVxdWVzdG9ySURTdHJpbmdMZW5ndGgpKQotCi1tYXhSZXF1ZXN0b3JJRFN0cmluZ0xlbmd0aCAgSU5URUdFUiA6Oj0gNjMKLQotTENTLUZvcm1hdEluZGljYXRvciA6Oj0gRU5VTUVSQVRFRCB7Ci0JbG9naWNhbE5hbWUJKDApLAotCWUtbWFpbEFkZHJlc3MJKDEpLAotCW1zaXNkbgkJKDIpLAotCXVybAkJCSgzKSwKLQlzaXBVcmwJCSg0KSwKLQkuLi4gfQotCi1MQ1MtUHJpb3JpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCi0JLS0gMCA9IGhpZ2hlc3QgcHJpb3JpdHkKLQktLSAxID0gbm9ybWFsIHByaW9yaXR5Ci0JLS0gYWxsIG90aGVyIHZhbHVlcyB0cmVhdGVkIGFzIDEgCi0KLUxDUy1Rb1MgOjo9IFNFUVVFTkNFIHsKLQlob3Jpem9udGFsLWFjY3VyYWN5CVswXSBIb3Jpem9udGFsLUFjY3VyYWN5CU9QVElPTkFMLAotCXZlcnRpY2FsQ29vcmRpbmF0ZVJlcXVlc3QJWzFdIE5VTEwJCU9QVElPTkFMLAotCXZlcnRpY2FsLWFjY3VyYWN5CVsyXSBWZXJ0aWNhbC1BY2N1cmFjeQlPUFRJT05BTCwJcmVzcG9uc2VUaW1lCVszXSBSZXNwb25zZVRpbWUJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCXZlbG9jaXR5UmVxdWVzdAlbNV0gTlVMTAkJT1BUSU9OQUwKLX0KLQotSG9yaXpvbnRhbC1BY2N1cmFjeSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBiaXQgOCA9IDAKLQktLSBiaXRzIDctMSA9IDcgYml0IFVuY2VydGFpbnR5IENvZGUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4gVGhlIGhvcml6b250YWwgbG9jYXRpb24gCi0JLS0gZXJyb3Igc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgZXJyb3IgaW5kaWNhdGVkIGJ5IHRoZSB1bmNlcnRhaW50eSBjb2RlIHdpdGggNjclCi0JLS0gY29uZmlkZW5jZS4KLQotVmVydGljYWwtQWNjdXJhY3kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCi0JLS0gYml0IDggPSAwCi0JLS0gYml0cyA3LTEgPSA3IGJpdCBWZXJ0aWNhbCBVbmNlcnRhaW50eSBDb2RlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuIAotCS0tIFRoZSB2ZXJ0aWNhbCBsb2NhdGlvbiBlcnJvciBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBlcnJvciBpbmRpY2F0ZWQgCi0JLS0gYnkgdGhlIHVuY2VydGFpbnR5IGNvZGUgd2l0aCA2NyUgY29uZmlkZW5jZS4KLQotUmVzcG9uc2VUaW1lIDo6PSBTRVFVRU5DRSB7Ci0JcmVzcG9uc2VUaW1lQ2F0ZWdvcnkJUmVzcG9uc2VUaW1lQ2F0ZWdvcnksCi0JLi4ufQotLS0Jbm90ZTogYW4gZXhwYW5kYWJsZSBTRVFVRU5DRSBzaW1wbGlmaWVzIGxhdGVyIGFkZGl0aW9uIG9mIGEgbnVtZXJpYyByZXNwb25zZSB0aW1lLgotCi1SZXNwb25zZVRpbWVDYXRlZ29yeSA6Oj0gRU5VTUVSQVRFRCB7Ci0JbG93ZGVsYXkgICgwKSwKLQlkZWxheXRvbGVyYW50ICAoMSksCi0JLi4uIH0KLS0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKLS0tCWFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDEgKGRlbGF5dG9sZXJhbnQpCi0KLVN1cHBvcnRlZEdBRFNoYXBlcyA6Oj0gQklUIFNUUklORyB7Ci0JZWxsaXBzb2lkUG9pbnQgICgwKSwKLQllbGxpcHNvaWRQb2ludFdpdGhVbmNlcnRhaW50eUNpcmNsZSAoMSksCi0JZWxsaXBzb2lkUG9pbnRXaXRoVW5jZXJ0YWludHlFbGxpcHNlICgyKSwKLQlwb2x5Z29uICgzKSwKLQllbGxpcHNvaWRQb2ludFdpdGhBbHRpdHVkZSAoNCksCi0JZWxsaXBzb2lkUG9pbnRXaXRoQWx0aXR1ZGVBbmRVbmNlcnRhaW50eUVsaXBzb2lkICg1KSwKLQllbGxpcHNvaWRBcmMgICg2KSB9IChTSVpFICg3Li4xNikpCi0tLSBBIG5vZGUgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgU2hhcGVzIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIgaXQgc3VwcG9ydHMuCi0tLSBleGNlcHRpb24gaGFuZGxpbmc6IGJpdHMgNyB0byAxNSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkLgotCi1MQ1MtUmVmZXJlbmNlTnVtYmVyOjo9IE9DVEVUIFNUUklORyAoU0laRSgxKSkKLQotTENTQ29kZXdvcmQgOjo9IFNFUVVFTkNFIHsKLQlkYXRhQ29kaW5nU2NoZW1lCVswXSBVU1NELURhdGFDb2RpbmdTY2hlbWUsCi0JbGNzQ29kZXdvcmRTdHJpbmcJWzFdIExDU0NvZGV3b3JkU3RyaW5nLAotCS4uLn0KLQotTENTQ29kZXdvcmRTdHJpbmcgOjo9IFVTU0QtU3RyaW5nIChTSVpFICgxLi5tYXhMQ1NDb2Rld29yZFN0cmluZ0xlbmd0aCkpCi0KLW1heExDU0NvZGV3b3JkU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSAyMAotCi1MQ1MtUHJpdmFjeUNoZWNrIDo6PSBTRVFVRU5DRSB7Ci0JY2FsbFNlc3Npb25VbnJlbGF0ZWQJWzBdIFByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24sCi0JY2FsbFNlc3Npb25SZWxhdGVkCVsxXSBQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uCU9QVElPTkFMLAotCS4uLn0KLQotUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbiA6Oj0gRU5VTUVSQVRFRCB7Ci0JYWxsb3dlZFdpdGhvdXROb3RpZmljYXRpb24gKDApLAotCWFsbG93ZWRXaXRoTm90aWZpY2F0aW9uICgxKSwKLQlhbGxvd2VkSWZOb1Jlc3BvbnNlICgyKSwKLQlyZXN0cmljdGVkSWZOb1Jlc3BvbnNlICgzKSwKLQlub3RBbGxvd2VkICg0KSwKLQkuLi59Ci0tLQlleGNlcHRpb24gaGFuZGxpbmc6Ci0tLQlhIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIGNvbnRhaW5pbmcgYW4gdW5yZWNvZ25pemVkIFByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24KLS0tCXNoYWxsIGJlIHJlamVjdGVkIGJ5IHRoZSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZQotCi1BcmVhRXZlbnRJbmZvIDo6PSBTRVFVRU5DRSB7Ci0JYXJlYURlZmluaXRpb24JWzBdCUFyZWFEZWZpbml0aW9uLAotCW9jY3VycmVuY2VJbmZvCVsxXQlPY2N1cnJlbmNlSW5mbwlPUFRJT05BTCwKLQlpbnRlcnZhbFRpbWUJWzJdCUludGVydmFsVGltZQlPUFRJT05BTCwKLQkuLi59Ci0KLUFyZWFEZWZpbml0aW9uIDo6PSBTRVFVRU5DRSB7Ci0JYXJlYUxpc3QJCVswXQlBcmVhTGlzdCwKLQkuLi59Ci0KLUFyZWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkFyZWFzKSBPRiBBcmVhCi0KLW1heE51bU9mQXJlYXMgIElOVEVHRVIgOjo9IDEwCi0KLUFyZWEgOjo9IFNFUVVFTkNFIHsKLQlhcmVhVHlwZQkJWzBdCUFyZWFUeXBlLAotCWFyZWFJZGVudGlmaWNhdGlvbglbMV0JQXJlYUlkZW50aWZpY2F0aW9uLAotCS4uLn0KLQotQXJlYVR5cGUgOjo9IEVOVU1FUkFURUQgewotCWNvdW50cnlDb2RlCSgwKSwKLQlwbG1uSWQJCSgxKSwKLQlsb2NhdGlvbkFyZWFJZAkoMiksCi0Jcm91dGluZ0FyZWFJZAkoMyksCi0JY2VsbEdsb2JhbElkCSg0KSwKLQkuLi4sCi0JdXRyYW5DZWxsSWQJKDUpIH0KLQotQXJlYUlkZW50aWZpY2F0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjcpKQotCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgotCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0Ci0JLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKLQktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAotCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0IGlmIDMgZGlnaXQgTU5DIGluY2x1ZGVkCi0JLS0JCQlvciBmaWxsZXIgKDExMTEpCi0JLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKLQktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAotCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSAoTEFDKSBmb3IgTG9jYWwgQXJlYSBJZCwKLQktLQkJCVJvdXRpbmcgQXJlYSBJZCBhbmQgQ2VsbCBHbG9iYWwgSWQKLQktLSBvY3RldCA2CVJvdXRpbmcgQXJlYSBDb2RlIChSQUMpIGZvciBSb3V0aW5nIEFyZWEgSWQKLQktLSBvY3RldHMgNiBhbmQgNwlDZWxsIElkZW50aXR5IChDSSkgZm9yIENlbGwgR2xvYmFsIElkCi0JLS0gb2N0ZXRzIDQgdW50aWwgNwlVdHJhbiBDZWxsIElkZW50aXR5IChVQy1JZCkgZm9yIFV0cmFuIENlbGwgSWQKLQotT2NjdXJyZW5jZUluZm8gOjo9IEVOVU1FUkFURUQgewotCW9uZVRpbWVFdmVudAkoMCksCi0JbXVsdGlwbGVUaW1lRXZlbnQJKDEpLAotCS4uLn0KLQotSW50ZXJ2YWxUaW1lIDo6PSBJTlRFR0VSICgxLi4zMjc2NykKLQktLSBtaW5pbXVtIGludGVydmFsIHRpbWUgYmV0d2VlbiBhcmVhIHJlcG9ydHMgaW4gc2Vjb25kcwotCi1QZXJpb2RpY0xEUkluZm8gOjo9IFNFUVVFTkNFIHsKLQlyZXBvcnRpbmdBbW91bnQJCVJlcG9ydGluZ0Ftb3VudCwKLQlyZXBvcnRpbmdJbnRlcnZhbAlSZXBvcnRpbmdJbnRlcnZhbCwKLQkuLi59Ci0tLSByZXBvcnRpbmdJbnRlcnZhbCB4IHJlcG9ydGluZ0Ftb3VudCBzaGFsbCBub3QgZXhjZWVkIDg2Mzk5OTkgKDk5IGRheXMsIDIzIGhvdXJzLAotLS0gNTkgbWludXRlcyBhbmQgNTkgc2Vjb25kcykgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBPTUEgTUxQIGFuZCBSTFAKLQotUmVwb3J0aW5nQW1vdW50IDo6PSBJTlRFR0VSICgxLi5tYXhSZXBvcnRpbmdBbW91bnQpCi0KLW1heFJlcG9ydGluZ0Ftb3VudCBJTlRFR0VSIDo6PSA4NjM5OTk5Ci0KLVJlcG9ydGluZ0ludGVydmFsIDo6PSBJTlRFR0VSICgxLi5tYXhSZXBvcnRpbmdJbnRlcnZhbCkKLS0tIFJlcG9ydGluZ0ludGVydmFsIGlzIGluIHNlY29uZHMKLQotbWF4UmVwb3J0aW5nSW50ZXJ2YWwgSU5URUdFUiA6Oj0gODYzOTk5OQotCi1SZXBvcnRpbmdQTE1OTGlzdDo6PSBTRVFVRU5DRSB7Ci0JcGxtbi1MaXN0UHJpb3JpdGl6ZWQJCQlbMF0gTlVMTAkJCQkJT1BUSU9OQUwsCi0JcGxtbi1MaXN0IAkJCQkJCVsxXSBQTE1OTGlzdCwKLQkuLi59Ci0KLVBMTU5MaXN0Ojo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUmVwb3J0aW5nUExNTikgT0YKLQkJCQlSZXBvcnRpbmdQTE1OCi0KLW1heE51bU9mUmVwb3J0aW5nUExNTiBJTlRFR0VSIDo6PSAyMAotCi1SZXBvcnRpbmdQTE1OOjo9IFNFUVVFTkNFIHsKLQlwbG1uLUlkIAkJCQkJCVswXSBQTE1OLUlkLAotCXJhbi1UZWNobm9sb2d5IAkJCQkJWzFdIFJBTi1UZWNobm9sb2d5CQkJT1BUSU9OQUwsCi0JcmFuLVBlcmlvZGljTG9jYXRpb25TdXBwb3J0CQlbMl0gTlVMTAkJCQkJT1BUSU9OQUwsCi0JLi4ufQotCi1SQU4tVGVjaG5vbG9neSA6Oj0gRU5VTUVSQVRFRCB7Ci0JZ3NtCQkJKDApLAotCXVtdHMJCSgxKSwKLQkuLi59Ci0KLVByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tUmVzIDo6PSBTRVFVRU5DRSB7Ci0JbG9jYXRpb25Fc3RpbWF0ZQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sCi0JYWdlT2ZMb2NhdGlvbkVzdGltYXRlCVswXSBBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uICwKLQlhZGQtTG9jYXRpb25Fc3RpbWF0ZQlbMl0gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIAlPUFRJT05BTCwKLQlkZWZlcnJlZG10LWxyUmVzcG9uc2VJbmRpY2F0b3IJWzNdIE5VTEwJCU9QVElPTkFMLAotCWdlcmFuUG9zaXRpb25pbmdEYXRhCVs0XSBQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbglPUFRJT05BTCwKLQl1dHJhblBvc2l0aW9uaW5nRGF0YQlbNV0gVXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvCU9QVElPTkFMLAotCWNlbGxJZE9yU2FpCVs2XSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlPUFRJT05BTCwKLQlzYWktUHJlc2VudAlbN10gTlVMTAkJT1BUSU9OQUwsCi0JYWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCVs4XSBBY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IJCU9QVElPTkFMLAotCXZlbG9jaXR5RXN0aW1hdGUJWzldIFZlbG9jaXR5RXN0aW1hdGUJT1BUSU9OQUwsCi0JbW8tbHJTaG9ydENpcmN1aXRJbmRpY2F0b3IJWzEwXSBOVUxMCQlPUFRJT05BTCB9Ci0KLS0tCWlmIGRlZmVycmVkbXQtbHJSZXNwb25zZUluZGljYXRvciBpcyBzZXQsIGxvY2F0aW9uRXN0aW1hdGUgaXMgaWdub3JlZC4KLQotLS0gdGhlIGFkZC1Mb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlciBzaGFsbCBub3QgYmUgc2VudCB0byBhIG5vZGUgdGhhdCBkaWQgbm90IGluZGljYXRlIHRoZQotLS0gZ2VvZ3JhcGhpYyBzaGFwZXMgc3VwcG9ydGVkIGluIHRoZSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZwotLS0gVGhlIGxvY2F0aW9uRXN0aW1hdGUgYW5kIHRoZSBhZGQtbG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXJzIHNoYWxsIG5vdCBiZSBzZW50IGlmCi0tLSB0aGUgc3VwcG9ydGVkR0FEU2hhcGVzIHBhcmFtZXRlciBoYXMgYmVlbiByZWNlaXZlZCBpbiBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZwotLS0gYW5kIHRoZSBzaGFwZSBlbmNvZGVkIGluIGxvY2F0aW9uRXN0aW1hdGUgb3IgYWRkLUxvY2F0aW9uRXN0aW1hdGUgaXMgbm90IG1hcmtlZAotLS0gYXMgc3VwcG9ydGVkIGluIHN1cHBvcnRlZEdBRFNoYXBlcy4gSW4gc3VjaCBhIGNhc2UgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbgotLS0gc2hhbGwgYmUgcmVqZWN0ZWQgd2l0aCBlcnJvciBGYWNpbGl0eU5vdFN1cHBvcnRlZCB3aXRoIGFkZGl0aW9uYWwgaW5kaWNhdGlvbgotLS0gc2hhcGVPZkxvY2F0aW9uRXN0aW1hdGVOb3RTdXBwb3J0ZWQuCi0tLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbElkT3JTYWkgcGFyYW1ldGVyIGNvbnRhaW5zIGEgU2VydmljZSBBcmVhIElkZW50aXR5LgotCi1BY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IgOjo9IEVOVU1FUkFURUQgewotCXJlcXVlc3RlZEFjY3VyYWN5RnVsZmlsbGVkICAoMCksCi0JcmVxdWVzdGVkQWNjdXJhY3lOb3RGdWxmaWxsZWQgICgxKSwKLQkuLi4JfQotCi1FeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4RXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uKSkKLQktLSBSZWZlcnMgdG8gZ2VvZ3JhcGhpY2FsIEluZm9ybWF0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCi0JLS0gVGhpcyBpcyBjb21wb3NlZCBvZiAxIG9yIG1vcmUgb2N0ZXRzIHdpdGggYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0bwotCS0tIDNHUFAgVFMgMjMuMDMyCi0JLS0gT2N0ZXQgMTogVHlwZSBvZiBzaGFwZSwgb25seSB0aGUgZm9sbG93aW5nIHNoYXBlcyBpbiAzR1BQIFRTIDIzLjAzMiBhcmUgYWxsb3dlZDoKLQktLQkJKGEpIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQotCS0tCQkoYikgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZQotCS0tCQkoYykgRWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAotCS0tCQkoZCkgRWxsaXBzb2lkIEFyYwotCS0tCQkoZSkgRWxsaXBzb2lkIFBvaW50Ci0JLS0gQW55IG90aGVyIHZhbHVlIGluIG9jdGV0IDEgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkCi0JLS0gT2N0ZXRzIDIgdG8gOCBmb3IgY2FzZSAoYSkgliBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKLQktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cwotCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cwotCS0tCQlVbmNlcnRhaW50eSBjb2RlCQkJCTEgb2N0ZXQKLQktLSBPY3RldHMgMiB0byAxMSBmb3IgY2FzZSAoYikgliBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlOgotCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCi0JLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCi0JLS0JCVVuY2VydGFpbnR5IHNlbWktbWFqb3IgYXhpcwkJCQkxIG9jdGV0Ci0JLS0JCVVuY2VydGFpbnR5IHNlbWktbWlub3IgYXhpcwkJCQkxIG9jdGV0Ci0JLS0JCUFuZ2xlIG9mIG1ham9yIGF4aXMJCQkJMSBvY3RldAotCS0tCQlDb25maWRlbmNlCQkJCTEgb2N0ZXQKLQktLSBPY3RldHMgMiB0byAxNCBmb3IgY2FzZSAoYykgliBFbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkCi0JLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKLQktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKLQktLQkJQWx0aXR1ZGUJCQkJMiBvY3RldHMKLQktLQkJVW5jZXJ0YWludHkgc2VtaS1tYWpvciBheGlzCQkJCTEgb2N0ZXQKLQktLQkJVW5jZXJ0YWludHkgc2VtaS1taW5vciBheGlzCQkJCTEgb2N0ZXQKLQktLQkJQW5nbGUgb2YgbWFqb3IgYXhpcwkJCQkxIG9jdGV0Ci0JLS0JCVVuY2VydGFpbnR5IGFsdGl0dWRlCQkJCTEgb2N0ZXQKLQktLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0Ci0JLS0gT2N0ZXRzIDIgdG8gMTMgZm9yIGNhc2UgKGQpIJYgRWxsaXBzb2lkIEFyYwotCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCi0JLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCi0JLS0JCUlubmVyIHJhZGl1cwkJCQkyIG9jdGV0cwotCS0tCQlVbmNlcnRhaW50eSByYWRpdXMJCQkJMSBvY3RldAotCS0tCQlPZmZzZXQgYW5nbGUJCQkJMSBvY3RldAotCS0tCQlJbmNsdWRlZCBhbmdsZQkJCQkxIG9jdGV0Ci0JLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAotCS0tIE9jdGV0cyAyIHRvIDcgZm9yIGNhc2UgKGUpIJYgRWxsaXBzb2lkIFBvaW50Ci0JLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKLQktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKLQotCS0tCi0JLS0gQW4gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb21wcmlzaW5nIG1vcmUgdGhhbiBvbmUgb2N0ZXQgYW5kCi0JLS0gY29udGFpbmluZyBhbnkgb3RoZXIgc2hhcGUgb3IgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBvY3RldHMgb3IgY29kaW5nIGFjY29yZGluZwotCS0tIHRvIDNHUFAgVFMgMjMuMDMyIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZCBkYXRhIGJ5IGEgcmVjZWl2ZXIuCi0JLS0KLQktLSBBbiBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGNvbXByaXNpbmcgb25lIG9jdGV0IHNoYWxsIGJlIGRpc2NhcmRlZAotCS0tIGJ5IHRoZSByZWNlaXZlciBpZiBhbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGlzIHJlY2VpdmVkIAotCS0tIGluIHRoZSBzYW1lIG1lc3NhZ2UuCi0JLS0KLQktLSBBbiBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGNvbXByaXNpbmcgb25lIG9jdGV0IHNoYWxsIGJlIHRyZWF0ZWQgYXMKLQktLSBpbnZhbGlkIGRhdGEgYnkgdGhlIHJlY2VpdmVyIGlmIGFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgaXMgbm90Ci0JLS0gcmVjZWl2ZWQgaW4gdGhlIHNhbWUgbWVzc2FnZS4KLQotbWF4RXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uICBJTlRFR0VSIDo6PSAyMAotCS0tIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd3MgZm9yIGZ1cnRoZXIgc2hhcGVzIGluIDNHUFAgVFMgMjMuMDMyIHRvIGJlIGluY2x1ZGVkIGluIGxhdGVyIAotCS0tIHZlcnNpb25zIG9mIDNHUFAgVFMgMjkuMDAyCi0KLVZlbG9jaXR5RXN0aW1hdGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNC4uNykpCi0JLS0gUmVmZXJzIHRvIFZlbG9jaXR5IGRlc2NyaXB0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCi0JLS0gVGhpcyBpcyBjb21wb3NlZCBvZiA0IG9yIG1vcmUgb2N0ZXRzIHdpdGggYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0bwotCS0tIDNHUFAgVFMgMjMuMDMyCi0JLS0gT2N0ZXQgMTogVHlwZSBvZiB2ZWxvY2l0eSwgb25seSB0aGUgZm9sbG93aW5nIHR5cGVzIGluIDNHUFAgVFMgMjMuMDMyIGFyZSBhbGxvd2VkOgotCS0tCQkoYSkgSG9yaXpvbnRhbCBWZWxvY2l0eQotCS0tCQkoYikgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5Ci0JLS0JCShjKSBIb3Jpem9udGFsIFZlbG9jaXR5IHdpdGggVW5jZXJ0YWludHkKLQktLQkJKGQpIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgVW5jZXJ0YWludHkKLQktLSBGb3IgdHlwZXMgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkKLQktLSBhbmQgVW5jZXJ0YWludHksIHRoZSBkaXJlY3Rpb24gb2YgdGhlIFZlcnRpY2FsIFNwZWVkIGlzIGFsc28gaW5jbHVkZWQgaW4gT2N0ZXQgMQotCS0tIEFueSBvdGhlciB2YWx1ZSBpbiBvY3RldCAxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZAotCS0tIE9jdGV0cyAyIHRvIDQgZm9yIGNhc2UgKGEpIEhvcml6b250YWwgdmVsb2NpdHk6Ci0JLS0JCUJlYXJpbmcJCQkJMSBvY3RldAotCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCi0JLS0gT2N0ZXRzIDIgdG8gNSBmb3IgY2FzZSAoYikgliBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHk6Ci0JLS0JCUJlYXJpbmcJCQkJMSBvY3RldAotCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCi0JLS0JCVZlcnRpY2FsIFNwZWVkCQkJCTEgb2N0ZXQKLQktLSBPY3RldHMgMiB0byA1IGZvciBjYXNlIChjKSCWIEhvcml6b250YWwgdmVsb2NpdHkgd2l0aCBVbmNlcnRhaW50eToKLQktLQkJQmVhcmluZwkJCQkxIG9jdGV0Ci0JLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKLQktLQkJVW5jZXJ0YWludHkgU3BlZWQJCQkJMSBvY3RldAotCS0tIE9jdGV0cyAyIHRvIDcgZm9yIGNhc2UgKGQpIJYgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBVbmNlcnRhaW50eToKLQktLQkJQmVhcmluZwkJCQkxIG9jdGV0Ci0JLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKLQktLQkJVmVydGljYWwgU3BlZWQJCQkJMSBvY3RldAotCS0tCQlIb3Jpem9udGFsIFVuY2VydGFpbnR5IFNwZWVkCQkJMSBvY3RldAotCS0tCQlWZXJ0aWNhbCBVbmNlcnRhaW50eSBTcGVlZAkJCQkxIG9jdGV0Ci0KLVBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLm1heFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uKSkKLQktLSBSZWZlcnMgdG8gdGhlIFBvc2l0aW9uaW5nIERhdGEgZGVmaW5lZCBpbiAzR1BQIFRTIDQ5LjAzMS4KLQktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDIgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvCi0JLS0gM0dQUCBUUyA0OS4wMzEuIAotCi1tYXhQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbiBJTlRFR0VSIDo6PSAxMAotCS0tIAotCi1VdHJhblBvc2l0aW9uaW5nRGF0YUluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMy4ubWF4VXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvKSkKLQktLSBSZWZlcnMgdG8gdGhlIFBvc2l0aW9uIERhdGEgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMy4KLQktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIHRoZSBwb3NpdGlvbmluZ0RhdGFEaXNjcmltaW5hdG9yIGFuZCB0aGUgcG9zaXRpb25pbmdEYXRhU2V0Ci0JLS0gaW5jbHVkZWQgaW4gcG9zaXRpb25EYXRhIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMuCi0KLW1heFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbyBJTlRFR0VSIDo6PSAxMQotCS0tIAotCi1BZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4QWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uKSkKLQktLSBSZWZlcnMgdG8gZ2VvZ3JhcGhpY2FsIEluZm9ybWF0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCi0JLS0gVGhpcyBpcyBjb21wb3NlZCBvZiAxIG9yIG1vcmUgb2N0ZXRzIHdpdGggYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0byAKLQktLSAzR1BQIFRTIDIzLjAzMgotCS0tIE9jdGV0IDE6IFR5cGUgb2Ygc2hhcGUsIGFsbCB0aGUgc2hhcGVzIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIgYXJlIGFsbG93ZWQ6Ci0JLS0gT2N0ZXRzIDIgdG8gbiAod2hlcmUgbiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIG9jdGV0cyBuZWNlc3NhcnkgdG8gZW5jb2RlIHRoZSBzaGFwZQotCS0tIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAzMikgYXJlIHVzZWQgdG8gZW5jb2RlIHRoZSBzaGFwZSBpdHNlbGYgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotCS0tIGVuY29kaW5nIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIKLQktLQotCS0tIEFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIsIHdoZXRoZXIgdmFsaWQgb3IgaW52YWxpZCwgcmVjZWl2ZWQgCi0JLS0gdG9nZXRoZXIgd2l0aCBhIHZhbGlkIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgaW4gdGhlIHNhbWUgbWVzc2FnZSAKLQktLSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0JLS0KLQktLSBBbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGNvbnRhaW5pbmcgYW55IHNoYXBlIG5vdCBkZWZpbmVkIGluIAotCS0tIDNHUFAgVFMgMjMuMDMyIG9yIGFuIGluY29ycmVjdCBudW1iZXIgb2Ygb2N0ZXRzIG9yIGNvZGluZyBhY2NvcmRpbmcgdG8gCi0JLS0gM0dQUCBUUyAyMy4wMzIgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkIGRhdGEgYnkgYSByZWNlaXZlciBpZiBub3QgcmVjZWl2ZWQgCi0JLS0gdG9nZXRoZXIgd2l0aCBhIHZhbGlkIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgaW4gdGhlIHNhbWUgbWVzc2FnZS4KLQotbWF4QWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uICBJTlRFR0VSIDo6PSA5MQotCS0tIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd3Mgc3VwcG9ydCBmb3IgYWxsIHRoZSBzaGFwZXMgY3VycmVudGx5IGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIKLQotU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LUFyZyA6Oj0gU0VRVUVOQ0UgewotCWxjcy1FdmVudAkJTENTLUV2ZW50LAotCWxjcy1DbGllbnRJRAlMQ1MtQ2xpZW50SUQsIAotCWxjc0xvY2F0aW9uSW5mbwlMQ1NMb2NhdGlvbkluZm8sCi0JbXNpc2RuCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCWltc2kJCQlbMV0gSU1TSQkJT1BUSU9OQUwsCi0JaW1laQkJCVsyXSBJTUVJCQlPUFRJT05BTCwKLQluYS1FU1JECQlbM10gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCW5hLUVTUksJCVs0XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCi0JbG9jYXRpb25Fc3RpbWF0ZQlbNV0gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAotCWFnZU9mTG9jYXRpb25Fc3RpbWF0ZQlbNl0gQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAotCXNsci1BcmdFeHRlbnNpb25Db250YWluZXIJWzddIFNMUi1BcmdFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uICwKLQlhZGQtTG9jYXRpb25Fc3RpbWF0ZQlbOF0gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAotCWRlZmVycmVkbXQtbHJEYXRhCVs5XSBEZWZlcnJlZG10LWxyRGF0YQlPUFRJT05BTCwgCi0JbGNzLVJlZmVyZW5jZU51bWJlcglbMTBdIExDUy1SZWZlcmVuY2VOdW1iZXIJT1BUSU9OQUwsCi0JZ2VyYW5Qb3NpdGlvbmluZ0RhdGEJWzExXSBQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbglPUFRJT05BTCwKLQl1dHJhblBvc2l0aW9uaW5nRGF0YQlbMTJdIFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbwlPUFRJT05BTCwKLQljZWxsSWRPclNhaQlbMTNdCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCU9QVElPTkFMLAotCWgtZ21sYy1BZGRyZXNzCVsxNF0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCi0JbGNzU2VydmljZVR5cGVJRAlbMTVdCUxDU1NlcnZpY2VUeXBlSUQJT1BUSU9OQUwsCi0Jc2FpLVByZXNlbnQJWzE3XSBOVUxMCQlPUFRJT05BTCwKLQlwc2V1ZG9ueW1JbmRpY2F0b3IJWzE4XSBOVUxMCQlPUFRJT05BTCwKLQlhY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IJWzE5XSBBY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IJT1BUSU9OQUwsCi0JdmVsb2NpdHlFc3RpbWF0ZQlbMjBdIFZlbG9jaXR5RXN0aW1hdGUJT1BUSU9OQUwsCi0Jc2VxdWVuY2VOdW1iZXIJWzIxXSBTZXF1ZW5jZU51bWJlcglPUFRJT05BTCwKLQlwZXJpb2RpY0xEUkluZm8JWzIyXSBQZXJpb2RpY0xEUkluZm8JT1BUSU9OQUwsCi0JbW8tbHJTaG9ydENpcmN1aXRJbmRpY2F0b3IJWzIzXSBOVUxMCQlPUFRJT05BTCB9Ci0KLQktLSBvbmUgb2YgbXNpc2RuIG9yIGltc2kgaXMgbWFuZGF0b3J5Ci0JLS0gYSBsb2NhdGlvbiBlc3RpbWF0ZSB0aGF0IGlzIHZhbGlkIGZvciB0aGUgbG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXIgc2hvdWxkIAotCS0tIGJlIHRyYW5zZmVycmVkIGluIHRoaXMgcGFyYW1ldGVyIGluIHByZWZlcmVuY2UgdG8gdGhlIGFkZC1Mb2NhdGlvbkVzdGltYXRlLgotCS0tIHRoZSBkZWZlcnJlZG10LWxyRGF0YSBwYXJhbWV0ZXIgc2hhbGwgYmUgaW5jbHVkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIGxjcy1FdmVudAotCS0tIGluZGljYXRlcyBhIGRlZmVycmVkbXQtbHJSZXNwb25zZS4KLQktLSBpZiB0aGUgbGNzLUV2ZW50IGluZGljYXRlcyBhIGRlZmVycmVkbXQtbHJSZXNwb25zZSB0aGVuIHRoZSBsb2NhdGlvbkVzdGltYXRlIAotCS0tIGFuZCB0aGUgYWRkLWxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVycyBzaGFsbCBub3QgYmUgc2VudCBpZiB0aGUgCi0JLS0gc3VwcG9ydGVkR0FEU2hhcGVzIHBhcmFtZXRlciBoYWQgYmVlbiByZWNlaXZlZCBpbiBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZwotCS0tIGFuZCB0aGUgc2hhcGUgZW5jb2RlZCBpbiBsb2NhdGlvbkVzdGltYXRlIG9yIGFkZC1Mb2NhdGlvbkVzdGltYXRlIHdhcyBub3QgbWFya2VkCi0JLS0gYXMgc3VwcG9ydGVkIGluIHN1cHBvcnRlZEdBRFNoYXBlcy4gSW4gc3VjaCBhIGNhc2UgdGVybWluYXRpb25DYXVzZSAKLQktLSBpbiBkZWZlcnJlZG10LWxyRGF0YSBzaGFsbCBiZSBwcmVzZW50IHdpdGggdmFsdWUgCi0JLS0gc2hhcGVPZkxvY2F0aW9uRXN0aW1hdGVOb3RTdXBwb3J0ZWQuIAotCS0tIElmIGEgbGNzIGV2ZW50IGluZGljYXRlcyBkZWZlcnJlZCBtdC1sciByZXNwb25zZSwgdGhlIGxjcy1SZWZlcmVuY2UgbnVtYmVyIHNoYWxsIGJlIAotCS0tIGluY2x1ZGVkLiAKLQktLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbElkT3JTYWkgcGFyYW1ldGVyIGNvbnRhaW5zIGEgU2VydmljZSBBcmVhIElkZW50aXR5LgotCi1EZWZlcnJlZG10LWxyRGF0YSA6Oj0gU0VRVUVOQ0UgewotCWRlZmVycmVkTG9jYXRpb25FdmVudFR5cGUJRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSwKLQl0ZXJtaW5hdGlvbkNhdXNlCVswXSBUZXJtaW5hdGlvbkNhdXNlCU9QVElPTkFMLAotCWxjc0xvY2F0aW9uSW5mbwlbMV0gTENTTG9jYXRpb25JbmZvCU9QVElPTkFMLAotCS4uLn0KLQktLSBsY3NMb2NhdGlvbkluZm8gbWF5IGJlIGluY2x1ZGVkIG9ubHkgaWYgYSB0ZXJtaW5hdGlvbkNhdXNlIGlzIHByZXNlbnQgCi0JLS0gaW5kaWNhdGluZyBtdC1sclJlc3RhcnQuCi0KLUxDUy1FdmVudCA6Oj0gRU5VTUVSQVRFRCB7Ci0JZW1lcmdlbmN5Q2FsbE9yaWdpbmF0aW9uICAoMCksCi0JZW1lcmdlbmN5Q2FsbFJlbGVhc2UgICgxKSwgCi0JbW8tbHIgICgyKSwKLQkuLi4sCi0JZGVmZXJyZWRtdC1sclJlc3BvbnNlICAoMykgLAotCWRlZmVycmVkbW8tbHJUVFRQSW5pdGlhdGlvbiAgKDQpICB9Ci0JLS0JZGVmZXJyZWRtdC1sclJlc3BvbnNlIGlzIGFwcGxpY2FibGUgdG8gdGhlIGRlbGl2ZXJ5IG9mIGEgbG9jYXRpb24gZXN0aW1hdGUgCi0JLS0JZm9yIGFuIExEUiBpbml0aWF0ZWQgZWFybGllciBieSBlaXRoZXIgdGhlIG5ldHdvcmsgKHZpYSBhbiBNVC1MUiBhY3RpdmF0ZSBkZWZlcnJlZCAKLQktLQlsb2NhdGlvbikgb3IgdGhlIFVFICh2aWEgYSBkZWZlcnJlZCBNTy1MUiBUVFRQIGluaXRpYXRpb24pCi0JLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgotCS0tCWEgU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LUFyZyBjb250YWluaW5nIGFuIHVucmVjb2duaXplZCBMQ1MtRXZlbnQKLQktLQlzaGFsbCBiZSByZWplY3RlZCBieSBhIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgdW5leHBlY3RlZCBkYXRhIHZhbHVlCi0KLVRlcm1pbmF0aW9uQ2F1c2UgOjo9IEVOVU1FUkFURUQgewotCW5vcm1hbCAgKDApLAotCWVycm9ydW5kZWZpbmVkICAoMSksCi0JaW50ZXJuYWxUaW1lb3V0ICAoMiksCi0JY29uZ2VzdGlvbiAgKDMpLAotCW10LWxyUmVzdGFydCAgKDQpLAotCXByaXZhY3lWaW9sYXRpb24gICg1KSwKLQkuLi4sCi0Jc2hhcGVPZkxvY2F0aW9uRXN0aW1hdGVOb3RTdXBwb3J0ZWQgKDYpICwKLQlzdWJzY3JpYmVyVGVybWluYXRpb24gKDcpLAotCXVFVGVybWluYXRpb24gKDgpLAotCW5ldHdvcmtUZXJtaW5hdGlvbiAoOSkgIH0gCi0tLSBtdC1sclJlc3RhcnQgc2hhbGwgYmUgdXNlZCB0byB0cmlnZ2VyIHRoZSBHTUxDIHRvIHJlc3RhcnQgdGhlIGxvY2F0aW9uIHByb2NlZHVyZSwgCi0tLSBlaXRoZXIgYmVjYXVzZSB0aGUgc2VuZGluZyBub2RlIGtub3dzIHRoYXQgdGhlIHRlcm1pbmFsIGhhcyBtb3ZlZCB1bmRlciBjb3ZlcmFnZSAKLS0tIG9mIGFub3RoZXIgTVNDIG9yIFNHU04gKGUuZy4gU2VuZCBJZGVudGlmaWNhdGlvbiByZWNlaXZlZCksIG9yIGJlY2F1c2UgdGhlIHN1YnNjcmliZXIKLS0tIGhhcyBiZWVuIGRlcmVnaXN0ZXJlZCBkdWUgdG8gYSBDYW5jZWwgTG9jYXRpb24gcmVjZWl2ZWQgZnJvbSBITFIuCi0tLQotLS0gZXhjZXB0aW9uIGhhbmRsaW5nCi0tLSBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAxIChlcnJvcnVuZGVmaW5lZCkgCi0KLVNlcXVlbmNlTnVtYmVyIDo6PSBJTlRFR0VSICgxLi5tYXhSZXBvcnRpbmdBbW91bnQpCi0KLVN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1SZXMgOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLCAKLQkuLi4sIAotCW5hLUVTUksJCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCi0JbmEtRVNSRAkJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQloLWdtbGMtQWRkcmVzcwlbMl0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCi0JbW8tbHJTaG9ydENpcmN1aXRJbmRpY2F0b3IJWzNdIE5VTEwJCU9QVElPTkFMLAotCXJlcG9ydGluZ1BMTU5MaXN0CVs0XSBSZXBvcnRpbmdQTE1OTGlzdAlPUFRJT05BTCwKLQlsY3MtUmVmZXJlbmNlTnVtYmVyCVs1XQlMQ1MtUmVmZXJlbmNlTnVtYmVyCU9QVElPTkFMIH0KLQotLS0gbmEtRVNSSyBhbmQgbmEtRVNSRCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCi0tLQotLS0gZXhjZXB0aW9uIGhhbmRsaW5nCi0tLSByZWNlaXB0IG9mIGJvdGggbmEtRVNSSyBhbmQgbmEtRVNSRCBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGEgcmV0dXJuIGVycm9yCi0KLQotRU5ECi0KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU1TLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1NUy1EYXRhVHlwZXMuYXNuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzEyYTAyLi4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU1TLURhdGFUeXBlcy5hc24KKysrIC9kZXYvbnVsbApAQCAtMSwyNzgwICswLDAgQEAKLS0tICRJZDogTUFQLU1TLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKLS0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCi0tLSAxNy43LjEJTW9iaWxlIFNlcnZpY2UgZGF0YSB0eXBlcwotCi1NQVAtTVMtRGF0YVR5cGVzIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU1TLURhdGFUeXBlcyAoMTEpIHZlcnNpb24xMSAoMTEpfQotCi1ERUZJTklUSU9OUwotCi1JTVBMSUNJVCBUQUdTCi0KLTo6PQotCi1CRUdJTgotCi1FWFBPUlRTCi0KLQktLSBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKLQlVcGRhdGVMb2NhdGlvbkFyZywKLQlVcGRhdGVMb2NhdGlvblJlcywKLQlDYW5jZWxMb2NhdGlvbkFyZywKLQlDYW5jZWxMb2NhdGlvblJlcywgCi0JUHVyZ2VNUy1BcmcsIAotCVB1cmdlTVMtUmVzLAotCVNlbmRJZGVudGlmaWNhdGlvbkFyZywKLQlTZW5kSWRlbnRpZmljYXRpb25SZXMsIAotCVVwZGF0ZUdwcnNMb2NhdGlvbkFyZywKLQlVcGRhdGVHcHJzTG9jYXRpb25SZXMsCi0JSVNULVN1cHBvcnRJbmRpY2F0b3IsIAotCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cywKLQotCS0tIGdwcnMgbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCi0JR1NOLUFkZHJlc3MsCi0KLQktLSBoYW5kb3ZlciB0eXBlcwotCUZvcndhcmRBY2Nlc3NTaWduYWxsaW5nLUFyZywKLQlQcmVwYXJlSE8tQXJnLAotCVByZXBhcmVITy1SZXMsCi0JUHJlcGFyZVN1YnNlcXVlbnRITy1BcmcsIAotCVByZXBhcmVTdWJzZXF1ZW50SE8tUmVzLAotCVByb2Nlc3NBY2Nlc3NTaWduYWxsaW5nLUFyZywKLQlTZW5kRW5kU2lnbmFsLUFyZywKLQlTZW5kRW5kU2lnbmFsLVJlcywKLQotCS0tIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgdHlwZXMKLQlTZW5kQXV0aGVudGljYXRpb25JbmZvQXJnLAotCVNlbmRBdXRoZW50aWNhdGlvbkluZm9SZXMsIAotCUF1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydEFyZywKLUF1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydFJlcywKLQotCS0tIHNlY3VyaXR5IG1hbmFnZW1lbnQgdHlwZXMKLQlLYywgCi0JQ2tzbiwKLQotCS0tIGVxdWlwbWVudCBtYW5hZ2VtZW50IHR5cGVzCi0JQ2hlY2tJTUVJLUFyZywKLQlDaGVja0lNRUktUmVzLAotCi0JLS0gc3Vic2NyaWJlciBtYW5hZ2VtZW50IHR5cGVzCi0JSW5zZXJ0U3Vic2NyaWJlckRhdGFBcmcsCi0JSW5zZXJ0U3Vic2NyaWJlckRhdGFSZXMsIAotCUxTQUlkZW50aXR5LAotCURlbGV0ZVN1YnNjcmliZXJEYXRhQXJnLAotCURlbGV0ZVN1YnNjcmliZXJEYXRhUmVzLAotCUV4dC1Rb1MtU3Vic2NyaWJlZCwKLQlFeHQyLVFvUy1TdWJzY3JpYmVkLCAKLQlFeHQzLVFvUy1TdWJzY3JpYmVkLAotCVN1YnNjcmliZXJEYXRhLAotCU9EQi1EYXRhLAotCVN1YnNjcmliZXJTdGF0dXMsCi0JWm9uZUNvZGVMaXN0LAotCW1heE51bU9mWm9uZUNvZGVzLCAKLQlPLUNTSSwgCi1ELUNTSSwKLQlPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdCwgCi0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QsCi0JU1MtQ1NJLAotCVNlcnZpY2VLZXksCi0JRGVmYXVsdENhbGxIYW5kbGluZywKLQlDYW1lbENhcGFiaWxpdHlIYW5kbGluZywKLQlCYXNpY1NlcnZpY2VDcml0ZXJpYSwKLQlTdXBwb3J0ZWRDYW1lbFBoYXNlcywKLQlPZmZlcmVkQ2FtZWw0Q1NJcywKLQlPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzLAotCW1heE51bU9mQ2FtZWxURFBEYXRhLAotCUNVRy1JbmRleCwgCi0JQ1VHLUluZm8sCi0JQ1VHLUludGVybG9jaywKLQlJbnRlckNVRy1SZXN0cmljdGlvbnMsCi0JSW50cmFDVUctT3B0aW9ucywKLQlOb3RpZmljYXRpb25Ub01TVXNlciwgCi0JUW9TLVN1YnNjcmliZWQsCi1JU1QtQWxlcnRUaW1lclZhbHVlLAotCVQtQ1NJLAotCVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKLUFQTiwKLUFkZGl0aW9uYWxJbmZvLAotCi0JLS0gZmF1bHQgcmVjb3ZlcnkgdHlwZXMKLQlSZXNldEFyZywKLQlSZXN0b3JlRGF0YUFyZywKLQlSZXN0b3JlRGF0YVJlcywKLQotLS0gcHJvdmlkZSBzdWJzY3JpYmVyIGluZm8gdHlwZXMgCi1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgCi1NUy1DbGFzc21hcmsyLAotR1BSU01TQ2xhc3MsCi0KLQktLSBzdWJzY3JpYmVyIGluZm9ybWF0aW9uIGVucXVpcnkgdHlwZXMKLQlQcm92aWRlU3Vic2NyaWJlckluZm9BcmcsCi0JUHJvdmlkZVN1YnNjcmliZXJJbmZvUmVzLAotCVN1YnNjcmliZXJJbmZvLAotCUxvY2F0aW9uSW5mb3JtYXRpb24sCi0JTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMsCi0JUkFJZGVudGl0eSwKLQlTdWJzY3JpYmVyU3RhdGUsCi0JR1BSU0NoYXJnaW5nSUQsIAotTU5QSW5mb1JlcywKLQlSb3V0ZWluZ051bWJlciwKLQotCS0tIGFueSB0aW1lIGluZm9ybWF0aW9uIGVucXVpcnkgdHlwZXMKLQlBbnlUaW1lSW50ZXJyb2dhdGlvbkFyZywKLQlBbnlUaW1lSW50ZXJyb2dhdGlvblJlcywKLQotCS0tIGFueSB0aW1lIGluZm9ybWF0aW9uIGhhbmRsaW5nIHR5cGVzCi0JQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25BcmcsCi0JQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25SZXMsCi0JQW55VGltZU1vZGlmaWNhdGlvbkFyZywKLQlBbnlUaW1lTW9kaWZpY2F0aW9uUmVzLAotCi0JLS0gc3Vic2NyaWJlciBkYXRhIG1vZGlmaWNhdGlvbiBub3RpZmljYXRpb24gdHlwZXMKLQlOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZEFyZywKLQlOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZFJlcywKLQotCS0tIGdwcnMgbG9jYXRpb24gaW5mb3JtYXRpb24gcmV0cmlldmFsIHR5cGVzCi0JU2VuZFJvdXRpbmdJbmZvRm9yR3Byc0FyZywKLQlTZW5kUm91dGluZ0luZm9Gb3JHcHJzUmVzLAotCi0JLS0gZmFpbHVyZSByZXBvcnRpbmcgdHlwZXMKLQlGYWlsdXJlUmVwb3J0QXJnLAotCUZhaWx1cmVSZXBvcnRSZXMsCi0KLQktLSBncHJzIG5vdGlmaWNhdGlvbiB0eXBlcwotCU5vdGVNc1ByZXNlbnRGb3JHcHJzQXJnLAotCU5vdGVNc1ByZXNlbnRGb3JHcHJzUmVzLAotCi0JLS0gTW9iaWxpdHkgTWFuYWdlbWVudCB0eXBlcwotTm90ZU1NLUV2ZW50QXJnLAotCU5vdGVNTS1FdmVudFJlcywKLQlOdW1iZXJQb3J0YWJpbGl0eVN0YXR1cywKLQlQYWdpbmdBcmVhLAotCi0JLS0gVkdDUyAvIFZCUyB0eXBlcyB0eXBlcwotR3JvdXBJZCwgCi1Mb25nLUdyb3VwSWQsCi1BZGRpdGlvbmFsU3Vic2NyaXB0aW9ucwotCi07Ci0KLUlNUE9SVFMKLQltYXhOdW1PZlNTLAotCVNTLVN1YnNjcmlwdGlvbk9wdGlvbiwKLQlTUy1MaXN0LAotCVNTLUZvckJTLUNvZGUsCi0JUGFzc3dvcmQKLUZST00gTUFQLVNTLURhdGFUeXBlcyB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1EYXRhVHlwZXMgKDE0KSB2ZXJzaW9uMTEgKDExKX0KLQotCVNTLUNvZGUKLUZST00gTUFQLVNTLUNvZGUgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQotCi0JRXh0LUJlYXJlclNlcnZpY2VDb2RlCi1GUk9NIE1BUC1CUy1Db2RlIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KLQotCUV4dC1UZWxlc2VydmljZUNvZGUKLUZST00gTUFQLVRTLUNvZGUgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtVFMtQ29kZSAoMTkpIHZlcnNpb24xMSAoMTEpfQotCi0JQWRkcmVzc1N0cmluZywKLUlTRE4tQWRkcmVzc1N0cmluZywgCi0JSVNETi1TdWJhZGRyZXNzU3RyaW5nLCAKLQlGVE4tQWRkcmVzc1N0cmluZywKLQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKLQlJTVNJLCAKLQlJTUVJLAotCVRNU0ksCi0JSExSLUxpc3QsCi0JTE1TSSwKLQlJZGVudGl0eSwKLQlHbG9iYWxDZWxsSWQsCi0JQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksCi0JRXh0LUJhc2ljU2VydmljZUNvZGUsCi0JTkFFQS1QcmVmZXJyZWRDSSwKLQlFTUxQUC1JbmZvLCAKLQlNQy1TUy1JbmZvLAotCVN1YnNjcmliZXJJZGVudGl0eSwKLQlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCi0JTENTQ2xpZW50RXh0ZXJuYWxJRCwKLQlMQ1NDbGllbnRJbnRlcm5hbElELAotCUV4dC1TUy1TdGF0dXMsCi0JTENTU2VydmljZVR5cGVJRCwKLQlBU0NJLUNhbGxSZWZlcmVuY2UsCi0JVEJDRC1TVFJJTkcsCi0JTEFJRml4ZWRMZW5ndGgsCi0JUExNTi1JZCwKLUVNTFBQLVByaW9yaXR5Ci1GUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9Ci0KLQlFeHRlbnNpb25Db250YWluZXIKLUZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KLQotCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KLUZST00gTUFQLUVSLURhdGFUeXBlcyB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KLQotCVRyYWNlUHJvcGFnYXRpb25MaXN0Ci1GUk9NIE1BUC1PTS1EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtT00tRGF0YVR5cGVzICgxMikgdmVyc2lvbjExICgxMSl9Ci0KLTsKLQotLS0gbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCi0KLVVwZGF0ZUxvY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7Ci0JaW1zaQkJCUlNU0ksCi0JbXNjLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nLAotCXZsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAotCWxtc2kJCQlbMTBdIExNU0kJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uICwKLQl2bHItQ2FwYWJpbGl0eQlbNl0gVkxSLUNhcGFiaWxpdHkJT1BUSU9OQUwsCi0JaW5mb3JtUHJldmlvdXNOZXR3b3JrRW50aXR5CVsxMV0JTlVMTAkJT1BUSU9OQUwsCi0JY3MtTENTLU5vdFN1cHBvcnRlZEJ5VUUJWzEyXQlOVUxMCQlPUFRJT05BTCwKLQl2LWdtbGMtQWRkcmVzcwlbMl0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCi0JYWRkLWluZm8JCVsxM10gQURELUluZm8JT1BUSU9OQUwsCi0JcGFnaW5nQXJlYQlbMTRdIFBhZ2luZ0FyZWEJT1BUSU9OQUwsCi0Jc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVsxNV0gTlVMTAkJT1BUSU9OQUwgCi0JLS0gVGhlIHNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIFVwZGF0ZUxvY2F0aW9uQXJnIGFuZCB0aGUgQURELUluZm8KLQktLSBzdHJ1Y3R1cmVzIGNhcnJ5IHRoZSBzYW1lIHNlbWFudGljLgotCSB9Ci0KLVZMUi1DYXBhYmlsaXR5IDo6PSBTRVFVRU5DRXsKLQlzdXBwb3J0ZWRDYW1lbFBoYXNlcyAgCVswXSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiAsCi0Jc29sc2FTdXBwb3J0SW5kaWNhdG9yCVsyXSBOVUxMCQlPUFRJT05BTCwKLQlpc3RTdXBwb3J0SW5kaWNhdG9yCVsxXSBJU1QtU3VwcG9ydEluZGljYXRvcglPUFRJT05BTCwKLQlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJblNlcnZpbmdOZXR3b3JrRW50aXR5CVszXSBTdXBlckNoYXJnZXJJbmZvCU9QVElPTkFMLAotCWxvbmdGVE4tU3VwcG9ydGVkCVs0XQlOVUxMCQlPUFRJT05BTCwKLQlzdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJWzVdCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTCwKLQlvZmZlcmVkQ2FtZWw0Q1NJcwlbNl0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCi0Jc3VwcG9ydGVkUkFULVR5cGVzSW5kaWNhdG9yCVs3XQlTdXBwb3J0ZWRSQVQtVHlwZXMJT1BUSU9OQUwsCi0JbG9uZ0dyb3VwSUQtU3VwcG9ydGVkCVs4XQlOVUxMCQlPUFRJT05BTCB9Ci0KLVN1cHBvcnRlZFJBVC1UeXBlczo6PSBCSVQgU1RSSU5HIHsKLQl1dHJhbiAgKDApLAotCWdlcmFuICAoMSksCi0JZ2FuICAgICgyKSwKLQlpLWhzcGEtZXZvbHV0aW9uICgzKSwKLQllLXV0cmFuCSg0KX0gKFNJWkUgKDIuLjgpKQotCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogYml0cyA1IHRvIDcgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKLQkgCi0KLQotU3VwZXJDaGFyZ2VySW5mbyA6Oj0gQ0hPSUNFIHsKLQlzZW5kU3Vic2NyaWJlckRhdGEJWzBdIE5VTEwsCi0Jc3Vic2NyaWJlckRhdGFTdG9yZWQJWzFdIEFnZUluZGljYXRvciB9Ci0KLUFnZUluZGljYXRvciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi42KSkKLQktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoaXMgcGFyYW1ldGVyIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLgotCi1JU1QtU3VwcG9ydEluZGljYXRvciA6Oj0gIEVOVU1FUkFURUQgewotCWJhc2ljSVNUU3VwcG9ydGVkCSgwKSwKLQlpc3RDb21tYW5kU3VwcG9ydGVkCSgxKSwKLQkuLi59Ci0tLSBleGNlcHRpb24gaGFuZGxpbmc6Ci0tLSByZWNlcHRpb24gb2YgdmFsdWVzID4gMSBzaGFsbCBiZSBtYXBwZWQgdG8gJyBpc3RDb21tYW5kU3VwcG9ydGVkICcKLQotU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzIDo6PSBCSVQgU1RSSU5HIHsKLQlsY3NDYXBhYmlsaXR5U2V0MSAoMCksCi0JbGNzQ2FwYWJpbGl0eVNldDIgKDEpLAotCWxjc0NhcGFiaWxpdHlTZXQzICgyKSwKLQlsY3NDYXBhYmlsaXR5U2V0NCAoMykgLAotCWxjc0NhcGFiaWxpdHlTZXQ1ICg0KSB9IChTSVpFICgyLi4xNikpIAotLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQxIGluZGljYXRlcyBMQ1MgUmVsZWFzZTk4IG9yIFJlbGVhc2U5OSB2ZXJzaW9uLgotLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQyIGluZGljYXRlcyBMQ1MgUmVsZWFzZTQuCi0tLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDMgaW5kaWNhdGVzIExDUyBSZWxlYXNlNS4KLS0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0NCBpbmRpY2F0ZXMgTENTIFJlbGVhc2U2LgotLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQ1IGluZGljYXRlcyBMQ1MgUmVsZWFzZTcgb3IgbGF0ZXIgdmVyc2lvbi4KLS0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBMQ1MgY2FwYWJpbGl0eSBzZXRzIGl0IHN1cHBvcnRzLiAKLS0tIElmIG5vIGJpdCBpcyBzZXQgdGhlbiB0aGUgc2VuZGluZyBub2RlIGRvZXMgbm90IHN1cHBvcnQgTENTLgotLS0gSWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2VudCBieSBhbiBWTFIgdGhlbiB0aGUgVkxSIG1heSBzdXBwb3J0IGF0IG1vc3QgY2FwYWJpbGl0eSBzZXQxLgotLS0gSWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2VudCBieSBhbiBTR1NOIHRoZW4gbm8gc3VwcG9ydCBmb3IgTENTIGlzIGFzc3VtZWQuCi0tLSBBbiBTR1NOIGlzIG5vdCBhbGxvd2VkIHRvIGluZGljYXRlIHN1cHBvcnQgb2YgY2FwYWJpbGl0eSBzZXQxLgotLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0KLVVwZGF0ZUxvY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7Ci0JaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JYWRkLUNhcGFiaWxpdHkJTlVMTAkJCU9QVElPTkFMLAotCXBhZ2luZ0FyZWEtQ2FwYWJpbGl0eQlbMF1OVUxMCQkJT1BUSU9OQUwgfQotCi1BREQtSW5mbyA6Oj0gU0VRVUVOQ0UgewotCWltZWlzdgkJWzBdIElNRUksCi0Jc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVsxXSBOVUxMCQlPUFRJT05BTCwKLQktLSBUaGUgc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlIHBhcmFtZXRlciBpbiB0aGUgVXBkYXRlTG9jYXRpb25BcmcgYW5kIHRoZSBBREQtSW5mbwotCS0tIHN0cnVjdHVyZXMgY2FycnkgdGhlIHNhbWUgc2VtYW50aWMuCi0JLi4ufQotCi0KLVBhZ2luZ0FyZWEgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GIExvY2F0aW9uQXJlYSAKLQotCi1Mb2NhdGlvbkFyZWEgOjo9IENIT0lDRSB7Ci0JbGFpRml4ZWRMZW5ndGgJWzBdIExBSUZpeGVkTGVuZ3RoLAotCWxhYwkJCVsxXSBMQUN9Ci0KLQotTEFDIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQotCS0tIFJlZmVycyB0byBMb2NhdGlvbiBBcmVhIENvZGUgb2YgdGhlIExvY2F0aW9uIEFyZWEgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiAKLSAgICAgLS0gM0dQUCBUUyAyMy4wMDMgWzE3XS4KLQktLSBMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0KLQotQ2FuY2VsTG9jYXRpb25BcmcgOjo9IFszXSBTRVFVRU5DRSB7Ci0JaWRlbnRpdHkJCUlkZW50aXR5LAotCWNhbmNlbGxhdGlvblR5cGUJQ2FuY2VsbGF0aW9uVHlwZQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQl0eXBlT2ZVcGRhdGUJWzBdIFR5cGVPZlVwZGF0ZQlPUFRJT05BTCB9Ci0KLVR5cGVPZlVwZGF0ZSA6Oj0gRU5VTUVSQVRFRCB7Ci0Jc2dzbi1jaGFuZ2UgKDApLAotCW1tZS1jaGFuZ2UgKDEpLAotCS4uLn0KLQktLSBUeXBlT2ZVcGRhdGUgc2hhbGwgYmUgYWJzZW50IGlmIENhbmNlbGxhdGlvblR5cGUgaXMgZGlmZmVyZW50IGZyb20gdXBkYXRlUHJvY2VkdXJlCi0KLUNhbmNlbGxhdGlvblR5cGUgOjo9IEVOVU1FUkFURUQgewotCXVwZGF0ZVByb2NlZHVyZQkoMCksCi0Jc3Vic2NyaXB0aW9uV2l0aGRyYXcJKDEpLAotCS4uLn0KLQktLSBUaGUgSExSIHNoYWxsIG5vdCBzZW5kIHZhbHVlcyBvdGhlciB0aGFuIGxpc3RlZCBhYm92ZQotCi1DYW5jZWxMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1QdXJnZU1TLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKLQlpbXNpCQkJSU1TSSwKLQl2bHItTnVtYmVyCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCi0Jc2dzbi1OdW1iZXIJWzFdCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotUHVyZ2VNUy1SZXMgOjo9IFNFUVVFTkNFIHsKLQlmcmVlemVUTVNJCVswXQlOVUxMCQlPUFRJT05BTCwKLQlmcmVlemVQLVRNU0kJWzFdCU5VTEwJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCWZyZWV6ZU0tVE1TSQlbMl0JTlVMTAkJT1BUSU9OQUwgfQotCi1TZW5kSWRlbnRpZmljYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKLQl0bXNpCQkJVE1TSSwKLQludW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMJTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzIAlPUFRJT05BTCwKLQktLSB3aXRoaW4gYSBkaWFsb2d1ZSBudW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMgc2hhbGwgYmUgcHJlc2VudCBpbiAKLQktLSB0aGUgZmlyc3Qgc2VydmljZSByZXF1ZXN0IGFuZCBzaGFsbCBub3QgYmUgcHJlc2VudCBpbiBzdWJzZXF1ZW50IHNlcnZpY2UgcmVxdWVzdHMuIAotCS0tIElmIHJlY2VpdmVkIGluIGEgc3Vic2VxdWVudCBzZXJ2aWNlIHJlcXVlc3QgaXQgc2hhbGwgYmUgZGlzY2FyZGVkLiAKLQlzZWdtZW50YXRpb25Qcm9oaWJpdGVkCU5VTEwJCQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQltc2MtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZyAJT1BUSU9OQUwsCi0JcHJldmlvdXMtTEFJCVswXSBMQUlGaXhlZExlbmd0aAlPUFRJT05BTCwKLQlob3BDb3VudGVyCVsxXSBIb3BDb3VudGVyCU9QVElPTkFMIH0KLQotSG9wQ291bnRlciA6Oj0gSU5URUdFUiAoMC4uMykKLQotU2VuZElkZW50aWZpY2F0aW9uUmVzIDo6PSBbM10gU0VRVUVOQ0UgewotCWltc2kJCQlJTVNJCQkJT1BUSU9OQUwsCi0JLS0gSU1TSSBzaGFsbCBiZSBwcmVzZW50IGluIHRoZSBmaXJzdCAob3Igb25seSkgc2VydmljZSByZXNwb25zZSBvZiBhIGRpYWxvZ3VlLgotCS0tIElmIG11bHRpcGxlIHNlcnZpY2UgcmVxdWVzdHMgYXJlIHByZXNlbnQgaW4gYSBkaWFsb2d1ZSB0aGVuIElNU0kKLQktLSBzaGFsbCBub3QgYmUgcHJlc2VudCBpbiBhbnkgc2VydmljZSByZXNwb25zZSBvdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUuCi0JYXV0aGVudGljYXRpb25TZXRMaXN0CUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlPUFRJT05BTCwKLQljdXJyZW50U2VjdXJpdHlDb250ZXh0CVsyXUN1cnJlbnRTZWN1cml0eUNvbnRleHQJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi0tLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCi0KLUF1dGhlbnRpY2F0aW9uU2V0TGlzdCA6Oj0gQ0hPSUNFIHsKLQl0cmlwbGV0TGlzdAlbMF0gVHJpcGxldExpc3QsCi0JcXVpbnR1cGxldExpc3QJWzFdIFF1aW50dXBsZXRMaXN0IH0KLQotVHJpcGxldExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GCi0JCQkJQXV0aGVudGljYXRpb25UcmlwbGV0Ci0KLVF1aW50dXBsZXRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRgotCQkJCUF1dGhlbnRpY2F0aW9uUXVpbnR1cGxldAotCi1BdXRoZW50aWNhdGlvblRyaXBsZXQgOjo9IFNFUVVFTkNFIHsKLQlyYW5kCQkJUkFORCwKLQlzcmVzCQkJU1JFUywKLQlrYwkJCUtjLAotCS4uLn0KLQotQXV0aGVudGljYXRpb25RdWludHVwbGV0IDo6PSBTRVFVRU5DRSB7Ci0JcmFuZAkJCVJBTkQsCi0JeHJlcwkJCVhSRVMsCi0JY2sJCQlDSywKLQlpawkJCUlLLAotCWF1dG4JCQlBVVROLAotCS4uLn0KLQotQ3VycmVudFNlY3VyaXR5Q29udGV4dCA6Oj0gQ0hPSUNFIHsKLQlnc20tU2VjdXJpdHlDb250ZXh0RGF0YQlbMF0gR1NNLVNlY3VyaXR5Q29udGV4dERhdGEsCi0JdW10cy1TZWN1cml0eUNvbnRleHREYXRhCVsxXSBVTVRTLVNlY3VyaXR5Q29udGV4dERhdGEgfQotCi1HU00tU2VjdXJpdHlDb250ZXh0RGF0YSA6Oj0gU0VRVUVOQ0UgewotCWtjCQkJS2MsCi0JY2tzbgkJCUNrc24sCi0JLi4uIH0KLQotVU1UUy1TZWN1cml0eUNvbnRleHREYXRhIDo6PSBTRVFVRU5DRSB7Ci0JY2sJCQlDSywKLQlpawkJCUlLLAotCWtzaQkJCUtTSSwKLQkuLi4gfQotCi1SQU5EIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKLQotU1JFUyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKLQotS2MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoOCkpCi0KLVhSRVMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNC4uMTYpKQotCi1DSyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCi0KLUlLIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKLQotQVVUTiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCi0KLUFVVFMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTQpKQotCi1Da3NuIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQotCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI0LjAwOAotCi1LU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCi0JLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjQuMDA4Ci0KLUF1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydEFyZyA6Oj0gU0VRVUVOQ0UgewotCWltc2kJCQlJTVNJLAotCWZhaWx1cmVDYXVzZQlGYWlsdXJlQ2F1c2UsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gLAotCXJlLWF0dGVtcHQJQk9PTEVBTgkJT1BUSU9OQUwsCi0JYWNjZXNzVHlwZQlBY2Nlc3NUeXBlCU9QVElPTkFMLAotCXJhbmQJCQlSQU5ECQkJT1BUSU9OQUwsCi0JdmxyLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCXNnc24tTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQotCi1BY2Nlc3NUeXBlIDo6PSBFTlVNRVJBVEVEIHsKLQljYWxsICgwKSwKLQllbWVyZ2VuY3lDYWxsICgxKSwKLQlsb2NhdGlvblVwZGF0aW5nICgyKSwKLQlzdXBwbGVtZW50YXJ5U2VydmljZSAoMyksCi0Jc2hvcnRNZXNzYWdlICg0KSwKLQlncHJzQXR0YWNoICg1KSwKLQlyb3V0aW5nQXJlYVVwZGF0aW5nICg2KSwKLQlzZXJ2aWNlUmVxdWVzdCAoNyksCi0JcGRwQ29udGV4dEFjdGl2YXRpb24gKDgpLAotCXBkcENvbnRleHREZWFjdGl2YXRpb24gKDkpLAotCS4uLiwKLQlncHJzRGV0YWNoICgxMCl9Ci0JLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgotCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMTAgc2hhbGwgYmUgaWdub3JlZC4KLQotQXV0aGVudGljYXRpb25GYWlsdXJlUmVwb3J0UmVzIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUZhaWx1cmVDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7Ci0Jd3JvbmdVc2VyUmVzcG9uc2UgICgwKSwKLQl3cm9uZ05ldHdvcmtTaWduYXR1cmUgICgxKX0KLQotLS0gZ3BycyBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKLQotVXBkYXRlR3Byc0xvY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7Ci0JaW1zaQkJCUlNU0ksCi0Jc2dzbi1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAkKLQlzZ3NuLUFkZHJlc3MJR1NOLUFkZHJlc3MsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gLAotCXNnc24tQ2FwYWJpbGl0eQlbMF0gU0dTTi1DYXBhYmlsaXR5CU9QVElPTkFMLAotCWluZm9ybVByZXZpb3VzTmV0d29ya0VudGl0eQlbMV0JTlVMTAkJT1BUSU9OQUwsCi0JcHMtTENTLU5vdFN1cHBvcnRlZEJ5VUUJWzJdCU5VTEwJCU9QVElPTkFMLAotCXYtZ21sYy1BZGRyZXNzCVszXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKLQlhZGQtaW5mbwkJWzRdICBBREQtSW5mbwlPUFRJT05BTCwKLQllcHMtaW5mbwkJWzVdCUVQUy1JbmZvCU9QVElPTkFMLAotCXNlcnZpbmdOb2RlVHlwZUluZGljYXRvcglbNl0JTlVMTAkJT1BUSU9OQUwsCi0Jc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVs3XSBOVUxMCQlPUFRJT05BTCwKLQl1c2VkUkFULVR5cGUJWzhdIFVzZWQtUkFULVR5cGUJT1BUSU9OQUwgCi0JIH0KLQotVXNlZC1SQVQtVHlwZTo6PSBFTlVNRVJBVEVEIHsKLQl1dHJhbiAgKDApLAotCWdlcmFuICAoMSksCi0JZ2FuICAgICgyKSwKLQlpLWhzcGEtZXZvbHV0aW9uICgzKSwKLQllLXV0cmFuCSg0KSwKLQkuLi59Ci0KLUVQUy1JbmZvIDo6PSBDSE9JQ0V7Ci0JcGRuLWd3LXVwZGF0ZQlbMF0gUEROLUdXLVVwZGF0ZSwKLQlpc3ItSW5mb3JtYXRpb24JWzFdIElTUi1JbmZvcm1hdGlvbiB9Ci0KLVBETi1HVy1VcGRhdGUgOjo9IFNFUVVFTkNFewotCWFwbgkJCVswXSBBUE4JCU9QVElPTkFMLAotCXBkbi1ndy1JZGVudGl0eQlbMV0gUEROLUdXLUlkZW50aXR5CU9QVElPTkFMLAotCWNvbnRleHRJZAkJWzJdIENvbnRleHRJZCAgICAgICAgICAgICAgICAgICAgIE9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiB9Ci0KLUlTUi1JbmZvcm1hdGlvbjo6PSBCSVQgU1RSSU5HIHsKLQl1cGRhdGVNTUUgICgwKSwKLQljYW5jZWxTR1NOICAoMSl9IChTSVpFICgyLi44KSkKLQktLSBleGNlcHRpb24gaGFuZGxpbmc6IHJlY2VwdGlvbiBvZiB1bmtub3duIGJpdCBhc3NpZ25tZW50cyBpbiB0aGUKLQktLSBJU1ItSW5mb3JtYXRpb24gZGF0YSB0eXBlIHNoYWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgcmVjZWl2ZXIgCi0KLVNHU04tQ2FwYWJpbGl0eSA6Oj0gU0VRVUVOQ0V7Ci0Jc29sc2FTdXBwb3J0SW5kaWNhdG9yCU5VTEwJCQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gLAotCXN1cGVyQ2hhcmdlclN1cHBvcnRlZEluU2VydmluZ05ldHdvcmtFbnRpdHkJWzJdIFN1cGVyQ2hhcmdlckluZm8JT1BUSU9OQUwgLAotCWdwcnNFbmhhbmNlbWVudHNTdXBwb3J0SW5kaWNhdG9yIAlbM10gTlVMTAkJT1BUSU9OQUwsCi0Jc3VwcG9ydGVkQ2FtZWxQaGFzZXMgIAlbNF0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCi0Jc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs1XSAgU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMLAotCW9mZmVyZWRDYW1lbDRDU0lzCVs2XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKLQlzbXNDYWxsQmFycmluZ1N1cHBvcnRJbmRpY2F0b3IJWzddCU5VTEwJCU9QVElPTkFMLAlzdXBwb3J0ZWRSQVQtVHlwZXNJbmRpY2F0b3IJWzhdCVN1cHBvcnRlZFJBVC1UeXBlcwlPUFRJT05BTCwKLQlzdXBwb3J0ZWRGZWF0dXJlcwlbOV0gU3VwcG9ydGVkRmVhdHVyZXMJT1BUSU9OQUwgfQotCi1TdXBwb3J0ZWRGZWF0dXJlczo6PSBCSVQgU1RSSU5HIHsKLQlvZGItYWxsICgwKSwKLQlvZGItSFBMTU4tQVBOICgxKSwKLQlvZGItVlBMTU4tQVBOICgyKSwKLQlyZWdTdWIgKDMpfSAoU0laRSAoNC4uOCkpCi0KLUdTTi1BZGRyZXNzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDUuLjE3KSkKLQktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCi0KLVVwZGF0ZUdwcnNMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgewotCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCWFkZC1DYXBhYmlsaXR5CU5VTEwJCQlPUFRJT05BTCwKLQlzZ3NuLW1tZVNlcGFyYXRpb25TdXBwb3J0ZWQJWzBdIE5VTEwJCU9QVElPTkFMIH0KLQotLS0gaGFuZG92ZXIgdHlwZXMKLQotRm9yd2FyZEFjY2Vzc1NpZ25hbGxpbmctQXJnIDo6PSBbM10gU0VRVUVOQ0UgewotCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAotCWludGVncml0eVByb3RlY3Rpb25JbmZvCVswXSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAotCWVuY3J5cHRpb25JbmZvCVsxXSBFbmNyeXB0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAotCWtleVN0YXR1cwkJWzJdCUtleVN0YXR1cwlPUFRJT05BTCwKLQlhbGxvd2VkR1NNLUFsZ29yaXRobXMJWzRdCUFsbG93ZWRHU00tQWxnb3JpdGhtcwlPUFRJT05BTCwKLQlhbGxvd2VkVU1UUy1BbGdvcml0aG1zCVs1XQlBbGxvd2VkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAotCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbNl0gUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbM10JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKLQkuLi4sCi0JcmFkaW9SZXNvdXJjZUxpc3QJWzddCVJhZGlvUmVzb3VyY2VMaXN0CU9QVElPTkFMLAotCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJWzldCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCi0JcmFuYXAtU2VydmljZUhhbmRvdmVyCVs4XQlSQU5BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCi0JYnNzbWFwLVNlcnZpY2VIYW5kb3Zlckxpc3QJWzEwXQlCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdAlPUFRJT05BTCwKLQljdXJyZW50bHlVc2VkQ29kZWMJWzExXSBDb2RlYwlPUFRJT05BTCwKLQlpdVN1cHBvcnRlZENvZGVjc0xpc3QJWzEyXSBTdXBwb3J0ZWRDb2RlY3NMaXN0CU9QVElPTkFMLAotCXJhYi1Db25maWd1cmF0aW9uSW5kaWNhdG9yCVsxM10gTlVMTAkJT1BUSU9OQUwsCi0JaXVTZWxlY3RlZENvZGVjCVsxNF0JQ29kZWMJT1BUSU9OQUwsCi0JYWx0ZXJuYXRpdmVDaGFubmVsVHlwZQlbMTVdCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKLQl0cmFjZVByb3BhZ2F0aW9uTGlzdAlbMTddCVRyYWNlUHJvcGFnYXRpb25MaXN0CU9QVElPTkFMIH0KLQotQWxsb3dlZEdTTS1BbGdvcml0aG1zIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQotCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBjb2RlZCBhcyBBbGdvcml0aG0gaWRlbnRpZmllciBvY3RldCBmcm9tCi0JLS0gUGVybWl0dGVkIEFsZ29yaXRobXMgZGVmaW5lZCBpbiAzR1BQIFRTIDQ4LjAwOAotCS0tIEEgbm9kZSBzaGFsbCBtYXJrIGFsbCBHU00gYWxnb3JpdGhtcyB0aGF0IGFyZSBhbGxvd2VkIGluIE1TQy1CCi0KLUFsbG93ZWRVTVRTLUFsZ29yaXRobXMgOjo9IFNFUVVFTkNFIHsKLQlpbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtcwlbMF0gCVBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zCU9QVElPTkFMLAotCWVuY3J5cHRpb25BbGdvcml0aG1zCVsxXSAJUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotUGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMgOjo9Ci0JCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4UGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXNMZW5ndGgpKQotCS0tIE9jdGV0cyBjb250YWluIGEgY29tcGxldGUgUGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMgZGF0YSB0eXBlIAotCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCi0JLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMuIAotCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAotCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCi0KLQotbWF4UGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXNMZW5ndGggSU5URUdFUiA6Oj0gOQotCi1QZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtcyA6Oj0KLQkJT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtc0xlbmd0aCkpCi0JLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtcyBkYXRhIHR5cGUgCi0JLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKLQktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMwotCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAotCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCi0KLQotbWF4UGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXNMZW5ndGggSU5URUdFUiA6Oj0gOQotCi1LZXlTdGF0dXMgOjo9IEVOVU1FUkFURUQgewotCW9sZCAgKDApLAotCW5ldyAgKDEpLAotCS4uLn0KLQktLSBleGNlcHRpb24gaGFuZGxpbmc6Ci0JLS0gcmVjZWl2ZWQgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAib2xkIgotCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAibmV3IgotCi1QcmVwYXJlSE8tQXJnIDo6PSBbM10gU0VRVUVOQ0UgewotCXRhcmdldENlbGxJZAlbMF0gR2xvYmFsQ2VsbElkCU9QVElPTkFMLAotCWhvLU51bWJlck5vdFJlcXVpcmVkCU5VTEwJCQlPUFRJT05BTCwgCi0JdGFyZ2V0Uk5DSWQJWzFdIFJOQ0lkCQlPUFRJT05BTCwKLQlhbi1BUERVCQlbMl0gQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCi0JbXVsdGlwbGVCZWFyZXJSZXF1ZXN0ZWQJWzNdIE5VTEwJCU9QVElPTkFMLAotCWltc2kJCQlbNF0gSU1TSQkJT1BUSU9OQUwsCi0JaW50ZWdyaXR5UHJvdGVjdGlvbkluZm8JWzVdIEludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCi0JZW5jcnlwdGlvbkluZm8JWzZdIEVuY3J5cHRpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCi0JcmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVs3XSBSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCi0JYWxsb3dlZEdTTS1BbGdvcml0aG1zCVs5XQlBbGxvd2VkR1NNLUFsZ29yaXRobXMJT1BUSU9OQUwsCi0JYWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlbMTBdCUFsbG93ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCi0JcmFkaW9SZXNvdXJjZUxpc3QJWzExXSBSYWRpb1Jlc291cmNlTGlzdAlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzhdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gLAotCXJhYi1JZAkJWzEyXSBSQUItSWQJT1BUSU9OQUwsCi0JYnNzbWFwLVNlcnZpY2VIYW5kb3ZlcglbMTNdCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCi0JcmFuYXAtU2VydmljZUhhbmRvdmVyCVsxNF0JUkFOQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLCAKLQlic3NtYXAtU2VydmljZUhhbmRvdmVyTGlzdAlbMTVdCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJMaXN0CU9QVElPTkFMLAotCWFzY2lDYWxsUmVmZXJlbmNlCVsyMF0JQVNDSS1DYWxsUmVmZXJlbmNlCU9QVElPTkFMLAotCWdlcmFuLWNsYXNzbWFyawlbMTZdIEdFUkFOLUNsYXNzbWFyawlPUFRJT05BTCwKLQlpdUN1cnJlbnRseVVzZWRDb2RlYwlbMTddIENvZGVjCU9QVElPTkFMLAotCWl1U3VwcG9ydGVkQ29kZWNzTGlzdAlbMThdIFN1cHBvcnRlZENvZGVjc0xpc3QJT1BUSU9OQUwsCi0JcmFiLUNvbmZpZ3VyYXRpb25JbmRpY2F0b3IJWzE5XSBOVUxMCQlPUFRJT05BTCwKLQl1ZXNiaS1JdQkJWzIxXQlVRVNCSS1JdQlPUFRJT05BTCwKLQlpbWVpc3YJCVsyMl0JSU1FSQkJT1BUSU9OQUwsCi0JYWx0ZXJuYXRpdmVDaGFubmVsVHlwZQlbMjNdCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKLQl0cmFjZVByb3BhZ2F0aW9uTGlzdAlbMjVdCVRyYWNlUHJvcGFnYXRpb25MaXN0CU9QVElPTkFMCSB9Ci0KLUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi4gbWF4TnVtT2ZTZXJ2aWNlSGFuZG92ZXJzKSBPRgotCQkJCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJJbmZvCi0KLUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJJbmZvIDo6PSBTRVFVRU5DRSB7Ci0JYnNzbWFwLVNlcnZpY2VIYW5kb3ZlcglCU1NNQVAtU2VydmljZUhhbmRvdmVyLAotCXJhYi1JZAkJUkFCLUlkLAotCS0tIFJBQiBJZGVudGl0eSBpcyBuZWVkZWQgdG8gcmVsYXRlIHRoZSBzZXJ2aWNlIGhhbmRvdmVycyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCi0JLi4ufQotCi1tYXhOdW1PZlNlcnZpY2VIYW5kb3ZlcnMgIElOVEVHRVIgOjo9IDcKLQotQlNTTUFQLVNlcnZpY2VIYW5kb3ZlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgU2VydmljZSBIYW5kb3ZlciBpbmZvcm1hdGlvbiBlbGVtZW50IGluCi0JLS0gM0dQUCBUUyA0OC4wMDguCi0KLVJBTkFQLVNlcnZpY2VIYW5kb3ZlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIFNlcnZpY2UtSGFuZG92ZXIgZGF0YSB0eXBlIAotCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCi0JLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKLQktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKLQotCi1SYWRpb1Jlc291cmNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mUmFkaW9SZXNvdXJjZXMpIE9GCi0JCQkJUmFkaW9SZXNvdXJjZQotCi1SYWRpb1Jlc291cmNlIDo6PSBTRVFVRU5DRSB7Ci0JcmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiwKLQlyYWItSWQJCVJBQi1JZCwKLQktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgcmFkaW8gcmVzb3VyY2VzIHdpdGggdGhlIHJhZGlvIGFjY2VzcyBiZWFyZXJzLiAKLQkuLi59Ci0KLW1heE51bU9mUmFkaW9SZXNvdXJjZXMgIElOVEVHRVIgOjo9IDcKLQotUHJlcGFyZUhPLVJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKLQloYW5kb3Zlck51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCXJlbG9jYXRpb25OdW1iZXJMaXN0CVsxXQlSZWxvY2F0aW9uTnVtYmVyTGlzdAlPUFRJT05BTCwKLQlhbi1BUERVCQlbMl0JQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCi0JbXVsdGljYWxsQmVhcmVySW5mbwlbM10JTXVsdGljYWxsQmVhcmVySW5mbwlPUFRJT05BTCwKLQltdWx0aXBsZUJlYXJlck5vdFN1cHBvcnRlZAlOVUxMCQkJT1BUSU9OQUwsCi0Jc2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJWzVdCVNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAotCWNob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbNl0gQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCSBPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzRdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JaXVTZWxlY3RlZENvZGVjCVs3XSBDb2RlYwkJT1BUSU9OQUwsCi0JaXVBdmFpbGFibGVDb2RlY3NMaXN0CVs4XSBDb2RlY0xpc3QJT1BUSU9OQUwgfQotCi1TZWxlY3RlZFVNVFMtQWxnb3JpdGhtcyA6Oj0gU0VRVUVOQ0UgewotCWludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0JWzBdIAlDaG9zZW5JbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtCU9QVElPTkFMLAotCWVuY3J5cHRpb25BbGdvcml0aG0JWzFdIAlDaG9zZW5FbmNyeXB0aW9uQWxnb3JpdGhtCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotQ2hvc2VuSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0gZGF0YSB0eXBlIAotCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCi0JLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKLQktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKLQotQ2hvc2VuRW5jcnlwdGlvbkFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIEVuY3J5cHRpb25BbGdvcml0aG0gZGF0YSB0eXBlIAotCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCi0JLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKLQktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKLQotQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7Ci0JY2hvc2VuQ2hhbm5lbEluZm8JWzBdIENob3NlbkNoYW5uZWxJbmZvCU9QVElPTkFMLAotCWNob3NlblNwZWVjaFZlcnNpb24JWzFdIENob3NlblNwZWVjaFZlcnNpb24JT1BUSU9OQUwsCi0JLi4ufQotCi1DaG9zZW5DaGFubmVsSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgQ2hvc2VuIENoYW5uZWwgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTIDQ4LjAwOAotCi1DaG9zZW5TcGVlY2hWZXJzaW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQotCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBTcGVlY2ggVmVyc2lvbiAoY2hvc2VuKSBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMKLQktLSA0OC4wMDggCi0KLVByZXBhcmVTdWJzZXF1ZW50SE8tQXJnIDo6PSBbM10gU0VRVUVOQ0UgewotCXRhcmdldENlbGxJZAlbMF0gR2xvYmFsQ2VsbElkCU9QVElPTkFMLAotCXRhcmdldE1TQy1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKLQl0YXJnZXRSTkNJZAlbMl0gUk5DSWQJCU9QVElPTkFMLAotCWFuLUFQRFUJCVszXQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbwlPUFRJT05BTCwKLQlzZWxlY3RlZFJhYi1JZAlbNF0JUkFCLUlkCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQlnZXJhbi1jbGFzc21hcmsJWzZdIEdFUkFOLUNsYXNzbWFyawlPUFRJT05BTCwKLQlyYWItQ29uZmlndXJhdGlvbkluZGljYXRvcglbN10gTlVMTAkJT1BUSU9OQUwgfQotCi1QcmVwYXJlU3Vic2VxdWVudEhPLVJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKLQlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKLQlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLVByb2Nlc3NBY2Nlc3NTaWduYWxsaW5nLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKLQlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKLQlzZWxlY3RlZFVNVFMtQWxnb3JpdGhtcwlbMV0JU2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCi0Jc2VsZWN0ZWRHU00tQWxnb3JpdGhtCVsyXQlTZWxlY3RlZEdTTS1BbGdvcml0aG0JT1BUSU9OQUwsCi0JY2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVszXSBDaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24gT1BUSU9OQUwsCi0Jc2VsZWN0ZWRSYWItSWQJWzRdIFJBQi1JZAlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCi0JLi4uLAotCWlVU2VsZWN0ZWRDb2RlYwlbNV0gQ29kZWMJCU9QVElPTkFMLAotCWl1QXZhaWxhYmxlQ29kZWNzTGlzdAlbNl0gQ29kZWNMaXN0CU9QVElPTkFMIH0KLQotU3VwcG9ydGVkQ29kZWNzTGlzdCA6Oj0gU0VRVUVOQ0UgewotCXV0cmFuQ29kZWNMaXN0CVswXSBDb2RlY0xpc3QJT1BUSU9OQUwsCi0JZ2VyYW5Db2RlY0xpc3QJWzFdIENvZGVjTGlzdAlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUNvZGVjTGlzdCA6Oj0gU0VRVUVOQ0UgewotCWNvZGVjMQkJWzFdIENvZGVjLAotCWNvZGVjMgkJWzJdIENvZGVjCQlPUFRJT05BTCwKLQljb2RlYzMJCVszXSBDb2RlYwkJT1BUSU9OQUwsCi0JY29kZWM0CQlbNF0gQ29kZWMJCU9QVElPTkFMLAotCWNvZGVjNQkJWzVdIENvZGVjCQlPUFRJT05BTCwKLQljb2RlYzYJCVs2XSBDb2RlYwkJT1BUSU9OQUwsCi0JY29kZWM3CQlbN10gQ29kZWMJCU9QVElPTkFMLAotCWNvZGVjOAkJWzhdIENvZGVjCQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzldIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0JLS0gQ29kZWNzIGFyZSBzZW50IGluIHByaW9yaXR5IG9yZGVyIHdoZXJlIGNvZGVjMSBoYXMgaGlnaGVzdCBwcmlvcml0eQotCi1Db2RlYyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi40KSkKLQotCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgotCS0tIG9jdGV0IDEJQ29kZWQgYXMgQ29kZWMgSWRlbnRpZmljYXRpb24gY29kZSBpbiAzR1BQIFRTIDI2LjEwMwotCS0tIG9jdGV0cyAyLDMsNAlQYXJhbWV0ZXJzIGZvciB0aGUgQ29kZWMgYXMgZGVmaW5lZCBpbiAzR1BQIFRTCi0JLS0JCQkyNi4xMDMsIGlmIGF2YWlsYWJsZSwgbGVuZ3RoIGRlcGVuZGluZyBvbiB0aGUgY29kZWMKLQotR0VSQU4tQ2xhc3NtYXJrIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjg3KSkKLQktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgR0VSQU4gQ2xhc3NtYXJrIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gM0dQUCBUUyA0OC4wMDgKLQotU2VsZWN0ZWRHU00tQWxnb3JpdGhtIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQotCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBjb2RlZCBhcyBBbGdvcml0aG0gaWRlbnRpZmllciBvY3RldCBmcm9tIENob3NlbiBFbmNyeXB0aW9uCi0JLS0gQWxnb3JpdGhtIGRlZmluZWQgaW4gM0dQUCBUUyA0OC4wMDgKLQktLSBBIG5vZGUgc2hhbGwgbWFyayBvbmx5IHRoZSBzZWxlY3RlZCBHU00gYWxnb3JpdGhtCi0KLVNlbmRFbmRTaWduYWwtQXJnIDo6PSBbM10gU0VRVUVOQ0UgewotCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKLQkuLi59Ci0KLVNlbmRFbmRTaWduYWwtUmVzIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAotCS4uLn0KLQotUk5DSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNykpCi0JLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0JLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKLQktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAotCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0Ci0JLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKLQktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcwotCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0Ci0JLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKLQktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4Ci0JLS0gb2N0ZXRzIDYgYW5kIDcJUk5DIElkIHZhbHVlIGFjY29yZGluZyB0byAzR1BQIFRTIDI1LjQxMwotCi1SZWxvY2F0aW9uTnVtYmVyTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyKSBPRgotCQkJCVJlbG9jYXRpb25OdW1iZXIKLQotTXVsdGljYWxsQmVhcmVySW5mbyA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyKQotCi1SZWxvY2F0aW9uTnVtYmVyIDo6PSBTRVFVRU5DRSB7Ci0JaGFuZG92ZXJOdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAotCXJhYi1JZAkJUkFCLUlkLAotCS0tIFJBQiBJZGVudGl0eSBpcyBuZWVkZWQgdG8gcmVsYXRlIHRoZSBjYWxscyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCi0JLi4ufQotCi1SQUItSWQgOjo9IElOVEVHRVIgKDEuLm1heE5yT2ZSQUJzKQotCi1tYXhOck9mUkFCcyBJTlRFR0VSIDo6PSAyNTUKLQotbWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyICBJTlRFR0VSIDo6PSA3Ci0KLVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzLi4xMykpCi0JLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIENoYW5uZWwgVHlwZSBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMgNDguMDA4Ci0KLUludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxOC4ubWF4TnVtT2ZJbnRlZ3JpdHlJbmZvKSkKLQktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIEludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbiBkYXRhIHR5cGUgCi0JLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKLQktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMwotCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAotCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCi0KLW1heE51bU9mSW50ZWdyaXR5SW5mbyBJTlRFR0VSIDo6PSAxMDAKLQotRW5jcnlwdGlvbkluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE4Li5tYXhOdW1PZkVuY3J5cHRpb25JbmZvKSkKLQktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIEVuY3J5cHRpb25JbmZvcm1hdGlvbiBkYXRhIHR5cGUgCi0JLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKLQktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMwotCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAotCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCi0KLW1heE51bU9mRW5jcnlwdGlvbkluZm8gSU5URUdFUiA6Oj0gMTAwCi0KLS0tIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgdHlwZXMKLQotU2VuZEF1dGhlbnRpY2F0aW9uSW5mb0FyZyA6Oj0gU0VRVUVOQ0UgewotCWltc2kJCQlbMF0gSU1TSSwKLQludW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMJTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzLAotCXNlZ21lbnRhdGlvblByb2hpYml0ZWQJTlVMTAkJCU9QVElPTkFMLAotCWltbWVkaWF0ZVJlc3BvbnNlUHJlZmVycmVkCVsxXSBOVUxMCQkJT1BUSU9OQUwsCi0JcmUtc3luY2hyb25pc2F0aW9uSW5mbwlSZS1zeW5jaHJvbmlzYXRpb25JbmZvCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQlyZXF1ZXN0aW5nTm9kZVR5cGUJWzNdIFJlcXVlc3RpbmdOb2RlVHlwZQlPUFRJT05BTCwKLQlyZXF1ZXN0aW5nUExNTi1JZAlbNF0gUExNTi1JZAlPUFRJT05BTCwKLQludW1iZXJPZlJlcXVlc3RlZEFkZGl0aW9uYWwtVmVjdG9ycwlbNV0gTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU9QVElPTkFMLAotCWFkZGl0aW9uYWxWZWN0b3JzQXJlRm9yRVBTCVs2XSBOVUxMCQlPUFRJT05BTCB9CQotCi0KLU51bWJlck9mUmVxdWVzdGVkVmVjdG9ycyA6Oj0gSU5URUdFUiAoMS4uNSkKLQotUmUtc3luY2hyb25pc2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgewotCXJhbmQJCQlSQU5ELAotCWF1dHMJCQlBVVRTLAotCS4uLn0KLQotU2VuZEF1dGhlbnRpY2F0aW9uSW5mb1JlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKLQlhdXRoZW50aWNhdGlvblNldExpc3QJQXV0aGVudGljYXRpb25TZXRMaXN0IAlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQllcHMtQXV0aGVudGljYXRpb25TZXRMaXN0CVsyXSBFUFMtQXV0aGVudGljYXRpb25TZXRMaXN0CU9QVElPTkFMIH0KLQotRVBTLUF1dGhlbnRpY2F0aW9uU2V0TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNSkgT0YKLQkJCQlFUEMtQVYKLQotRVBDLUFWIDo6PSBTRVFVRU5DRSB7Ci0JcmFuZAkJCVJBTkQsCi0JeHJlcwkJCVhSRVMsCi0JYXV0bgkJCUFVVE4sCi0Ja2FzbWUJCUtBU01FLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1LQVNNRSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCi0KLVJlcXVlc3RpbmdOb2RlVHlwZSA6Oj0gRU5VTUVSQVRFRCB7Ci0JdmxyICAoMCksCi0Jc2dzbiAgKDEpLAotCS4uLiwKLQlzLWNzY2YgICgyKSwKLQlic2YgICgzKSwKLQlnYW4tYWFhLXNlcnZlciAgKDQpLAotCXdsYW4tYWFhLXNlcnZlciAgKDUpLAotCW1tZQkJKDE2KSwKLQltbWUtc2dzbgkoMTcpCi0JfQotCS0tIHRoZSB2YWx1ZXMgMiwgMywgNCBhbmQgNSBzaGFsbCBub3QgYmUgdXNlZCBvbiB0aGUgTUFQLUQgb3IgR3IgaW50ZXJmYWNlcwotCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKLQktLSByZWNlaXZlZCB2YWx1ZXMgaW4gdGhlIHJhbmdlICg2LTE1KSBzaGFsbCBiZSB0cmVhdGVkIGFzICJ2bHIiCi0JLS0gcmVjZWl2ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxNyBzaGFsbCBiZSB0cmVhdGVkIGFzICJzZ3NuIgotCi0tLSBlcXVpcG1lbnQgbWFuYWdlbWVudCB0eXBlcwotCi1DaGVja0lNRUktQXJnIDo6PSBTRVFVRU5DRSB7Ci0JaW1laQkJCUlNRUksCi0JcmVxdWVzdGVkRXF1aXBtZW50SW5mbwlSZXF1ZXN0ZWRFcXVpcG1lbnRJbmZvLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1DaGVja0lNRUktUmVzIDo6PSBTRVFVRU5DRSB7Ci0JZXF1aXBtZW50U3RhdHVzCUVxdWlwbWVudFN0YXR1cwlPUFRJT05BTCwKLQlibXVlZgkJVUVTQkktSXUJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotUmVxdWVzdGVkRXF1aXBtZW50SW5mbzo6PSBCSVQgU1RSSU5HIHsKLQllcXVpcG1lbnRTdGF0dXMgICgwKSwKLQlibXVlZiAgKDEpfSAoU0laRSAoMi4uOCkpCi0JLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCi0JLS0gUmVxdWVzdGVkRXF1aXBtZW50SW5mbyBkYXRhIHR5cGUgc2hhbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSByZWNlaXZlciAKLQotVUVTQkktSXUgOjo9IFNFUVVFTkNFIHsKLQl1ZXNiaS1JdUEJWzBdIFVFU0JJLUl1QQkJCQlPUFRJT05BTCwKLQl1ZXNiaS1JdUIJWzFdIFVFU0JJLUl1QgkJCQlPUFRJT05BTCwKLQkuLi59Ci0KLVVFU0JJLUl1QQkJCQk6Oj0gQklUIFNUUklORyAoU0laRSgxLi4xMjgpKQotLS0gU2VlIDNHUFAgVFMgMjUuNDEzCi0KLVVFU0JJLUl1QgkJCQk6Oj0gQklUIFNUUklORyAoU0laRSgxLi4xMjgpKQotLS0gU2VlIDNHUFAgVFMgMjUuNDEzCi0KLUVxdWlwbWVudFN0YXR1cyA6Oj0gRU5VTUVSQVRFRCB7Ci0Jd2hpdGVMaXN0ZWQgICgwKSwKLQlibGFja0xpc3RlZCAgKDEpLAotCWdyZXlMaXN0ZWQgICgyKX0KLQotLS0gc3Vic2NyaWJlciBtYW5hZ2VtZW50IHR5cGVzCi0KLUluc2VydFN1YnNjcmliZXJEYXRhQXJnIDo6PSBTRVFVRU5DRSB7Ci0JaW1zaQkJCVswXSBJTVNJCQlPUFRJT05BTCwKLQlDT01QT05FTlRTIE9GCVN1YnNjcmliZXJEYXRhLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMTRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gLAkKLQluYWVhLVByZWZlcnJlZENJCVsxNV0gTkFFQS1QcmVmZXJyZWRDSQlPUFRJT05BTCwKLQktLSBuYWVhLVByZWZlcnJlZENJIGlzIGluY2x1ZGVkIGF0IHRoZSBkaXNjcmV0aW9uIG9mIHRoZSBITFIgb3BlcmF0b3IuCi0JZ3Byc1N1YnNjcmlwdGlvbkRhdGEJWzE2XSBHUFJTU3Vic2NyaXB0aW9uRGF0YQlPUFRJT05BTCwKLQlyb2FtaW5nUmVzdHJpY3RlZEluU2dzbkR1ZVRvVW5zdXBwb3J0ZWRGZWF0dXJlIFsyM10gCU5VTEwJCi0JCQkJCQkJT1BUSU9OQUwsIAotCW5ldHdvcmtBY2Nlc3NNb2RlCVsyNF0gTmV0d29ya0FjY2Vzc01vZGUJT1BUSU9OQUwsCi0JbHNhSW5mb3JtYXRpb24JWzI1XSBMU0FJbmZvcm1hdGlvbglPUFRJT05BTCwKLQlsbXUtSW5kaWNhdG9yCVsyMV0JTlVMTAkJT1BUSU9OQUwsCi0JbGNzSW5mb3JtYXRpb24JWzIyXQlMQ1NJbmZvcm1hdGlvbglPUFRJT05BTCwKLQlpc3RBbGVydFRpbWVyCVsyNl0gSVNULUFsZXJ0VGltZXJWYWx1ZQlPUFRJT05BTCwKLQlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJbkhMUglbMjddIEFnZUluZGljYXRvcglPUFRJT05BTCwKLQltYy1TUy1JbmZvCVsyOF0gTUMtU1MtSW5mbwlPUFRJT05BTCwKLQljcy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkJWzI5XSBDUy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkJCU9QVElPTkFMLAotCXNnc24tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlbMTddIFNHU04tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKLQljaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyAJWzE4XQlDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyAJT1BUSU9OQUwsCi0JYWNjZXNzUmVzdHJpY3Rpb25EYXRhCVsxOV0gQWNjZXNzUmVzdHJpY3Rpb25EYXRhCU9QVElPTkFMLAotCWljcy1JbmRpY2F0b3IJWzIwXQlCT09MRUFOCU9QVElPTkFMLAotCWVwcy1TdWJzY3JpcHRpb25EYXRhCVszMV0JRVBTLVN1YnNjcmlwdGlvbkRhdGEJT1BUSU9OQUwsCi0JY3NnLVN1YnNjcmlwdGlvbkRhdGFMaXN0CVszMl0gQ1NHLVN1YnNjcmlwdGlvbkRhdGFMaXN0CU9QVElPTkFMIH0KLQktLSBJZiB0aGUgTmV0d29yayBBY2Nlc3MgTW9kZSBwYXJhbWV0ZXIgaXMgc2VudCwgaXQgc2hhbGwgYmUgcHJlc2VudCBvbmx5IGluIAotCS0tIHRoZSBmaXJzdCBzZXF1ZW5jZSBpZiBzZXFtZW50YXRpb24gaXMgdXNlZAotCi1DU0ctU3Vic2NyaXB0aW9uRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUwKSBPRgotCQkJCUNTRy1TdWJzY3JpcHRpb25EYXRhCi0KLUNTRy1TdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7Ci0JY3NnLUlkCSAJCUNTRy1JZCwKLQlleHBpcmF0aW9uRGF0ZQkJVGltZQkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAotCS4uLn0KLQotQ1NHLUlkIDo6PSBCSVQgU1RSSU5HIChTSVpFICgyNykpCi0JLS0gY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDAzIFsxN10uCi0KLVRpbWUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCi0JLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gSUVURiBSRkMgMzU4OCBbMTM5XQotCi0KLUVQUy1TdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7Ci0JYXBuLW9pLVJlcGxhY2VtZW50CVswXQlBUE4tT0ktUmVwbGFjZW1lbnQJT1BUSU9OQUwsCi0JcmZzcC1pZAkJWzJdCVJGU1AtSUQJCU9QVElPTkFMLAotCWFtYnIJCQlbM10JQU1CUgkJT1BUSU9OQUwsCi0JYXBuLUNvbmZpZ3VyYXRpb25Qcm9maWxlCVs0XQlBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUJT1BUSU9OQUwsCi0Jc3RuLXNyCQlbNl0JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiB9Ci0KLUFQTi1PSS1SZXBsYWNlbWVudCA6Oj0gIE9DVEVUIFNUUklORyAoU0laRSAoOS4uMTAwKSkKLQktLSBPY3RldHMgYXJlIGNvZGVkIGFzIEFQTiBPcGVyYXRvciBJZGVudGlmaWVyIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddIAotCi1SRlNQLUlEIDo6PSAgSU5URUdFUiAoMS4uMjU2KQotCi1BUE4tQ29uZmlndXJhdGlvblByb2ZpbGUgOjo9IFNFUVVFTkNFIHsKLQlkZWZhdWx0Q29udGV4dAlDb250ZXh0SWQsCi0JY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKLQkJLS0gSWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIGNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZCBtYXkgb25seSBiZSBwcmVzZW50IGluIHRoZQotCQktLSBmaXJzdCBzZWdtZW50IG9mIEFQTi1Db25maWd1cmF0aW9uUHJvZmlsZS4KLQllcHNEYXRhTGlzdAlbMV0JRVBTLURhdGFMaXN0LAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiB9Ci0KLUVQUy1EYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZBUE4tQ29uZmlndXJhdGlvbnMpIE9GCi0JCQkJQVBOLUNvbmZpZ3VyYXRpb24KLQotCi1tYXhOdW1PZkFQTi1Db25maWd1cmF0aW9ucyAgSU5URUdFUiA6Oj0gNTAKLQotCi1BUE4tQ29uZmlndXJhdGlvbiA6Oj0gU0VRVUVOQ0UgewotCWNvbnRleHRJZAkJWzBdIENvbnRleHRJZCwKLQlzZXJ2ZWRQYXJ0eUlQLUFkZHJlc3MJWzFdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAotCWFwbgkJCVsyXSBBUE4sCi0JZXBzLXFvcy1TdWJzY3JpYmVkCVszXSBFUFMtUW9TLVN1YnNjcmliZWQsCi0JcGRuLWd3LUlkZW50aXR5CVs0XSBQRE4tR1ctSWRlbnRpdHkJT1BUSU9OQUwsCi0JcGRuLWd3LUFsbG9jYXRpb25UeXBlCVs1XSBQRE4tR1ctQWxsb2NhdGlvblR5cGUJT1BUSU9OQUwsCi0JdnBsbW5BZGRyZXNzQWxsb3dlZAlbNl0gTlVMTAkJT1BUSU9OQUwsCi0JY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJWzddIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAotCWFtYnIJCQlbOF0gQU1CUgkJT1BUSU9OQUwsCi0Jc3BlY2lmaWNBUE5JbmZvTGlzdAlbOV0gU3BlY2lmaWNBUE5JbmZvTGlzdAlPUFRJT05BTCwJZXh0ZW5zaW9uQ29udGFpbmVyCVsxMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiB9Ci0KLUVQUy1Rb1MtU3Vic2NyaWJlZCA6Oj0gU0VRVUVOQ0UgewotCXFvcy1DbGFzcy1JZGVudGlmaWVyCVswXSBRb1MtQ2xhc3MtSWRlbnRpZmllciwKLQlhbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eQlbMV0gQWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHksCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uIH0KLQotQU1CUiA6Oj0gU0VRVUVOQ0UgewotCW1heC1SZXF1ZXN0ZWRCYW5kd2lkdGgtVUwJWzBdIEJhbmR3aWR0aCwKLQltYXgtUmVxdWVzdGVkQmFuZHdpZHRoLURMCVsxXSBCYW5kd2lkdGgsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uIH0KLQotCi1TcGVjaWZpY0FQTkluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNwZWNpZmljQVBOSW5mb3MpIE9GCi0JCQkJU3BlY2lmaWNBUE5JbmZvCi0KLW1heE51bU9mU3BlY2lmaWNBUE5JbmZvcyAgSU5URUdFUiA6Oj0gNTAKLQotU3BlY2lmaWNBUE5JbmZvIDo6PSBTRVFVRU5DRSB7Ci0JYXBuCQkJWzBdIEFQTiwKLQlwZG4tZ3ctSWRlbnRpdHkJWzFdIFBETi1HVy1JZGVudGl0eSwKLQlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gfQotCi1CYW5kd2lkdGggOjo9IElOVEVHRVIgCi0JLS0gYml0cyBwZXIgc2Vjb25kCi0KLVFvUy1DbGFzcy1JZGVudGlmaWVyIDo6PSBJTlRFR0VSICgxLi45KQotCS0tIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiAgM0dQUCBUUyAyOS4yMTIKLQotCi0KLUFsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5IDo6PSBTRVFVRU5DRSB7Ci0JcHJpb3JpdHktbGV2ZWwJWzBdIElOVEVHRVIsCi0JcHJlLWVtcHRpb24tY2FwYWJpbGl0eQlbMV0gQk9PTEVBTglPUFRJT05BTCwKLQlwcmUtZW1wdGlvbi12dWxuZXJhYmlsaXR5CVsyXSBCT09MRUFOCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiB9Ci0KLVBETi1HVy1JZGVudGl0eSA6Oj0gU0VRVUVOQ0UgewotCXBkbi1ndy1pcHY0LUFkZHJlc3MJWzBdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAotCXBkbi1ndy1pcHY2LUFkZHJlc3MJWzFdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAotCXBkbi1ndy1uYW1lCVsyXSBGUUROCQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gfQotCi1GUUROIDo6PSAgT0NURVQgU1RSSU5HIChTSVpFICg5Li4xMDApKQotCi0KLVBETi1HVy1BbGxvY2F0aW9uVHlwZSA6Oj0gRU5VTUVSQVRFRCB7Ci0Jc3RhdGljCSgwKSwKLQlkeW5hbWljCSgxKX0KLQotCi1BY2Nlc3NSZXN0cmljdGlvbkRhdGEgOjo9IEJJVCBTVFJJTkcgewotCXV0cmFuTm90QWxsb3dlZCAoMCksCi0JZ2VyYW5Ob3RBbGxvd2VkICgxKSwKLQlnYW5Ob3RBbGxvd2VkICAgKDIpLAotCWktaHNwYS1ldm9sdXRpb25Ob3RBbGxvd2VkICgzKSwKLQllLXV0cmFuTm90QWxsb3dlZCAoNCksCi0JaG8tdG9Ob24zR1BQLUFjY2Vzc05vdEFsbG93ZWQgKDUpIH0gKFNJWkUgKDIuLjgpKQotCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogCi0JLS0gYWNjZXNzIHJlc3RyaWN0aW9uIGRhdGEgcmVsYXRlZCB0byBhbiBhY2Nlc3MgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IGEgbm9kZQotCS0tIHNoYWxsIGJlIGlnbm9yZWQKLQktLSBiaXRzIDYgdG8gNyBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAotCQotCi1DUy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCi0JLS0gVGhpcyBkYXRhIHR5cGUgZW5jb2RlcyBlYWNoIHByaW9yaXR5IGxldmVsIGRlZmluZWQgaW4gVFMgMjMuMTA3IGFzIHRoZSBiaW5hcnkgdmFsdWUKLQktLSBvZiB0aGUgcHJpb3JpdHkgbGV2ZWwuCi0KLUlTVC1BbGVydFRpbWVyVmFsdWUgOjo9IElOVEVHRVIgKDE1Li4yNTUpCi0KLUxDU0luZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7Ci0JZ21sYy1MaXN0CVswXQlHTUxDLUxpc3QJT1BUSU9OQUwsCi0JbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0CVsxXQlMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJT1BUSU9OQUwsCi0JbW9sci1MaXN0CQlbMl0JTU9MUi1MaXN0CU9QVElPTkFMLAotCS4uLiwKLQlhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0CVszXQlMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJT1BUSU9OQUwgfQotCS0tIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgbWF5IGJlIHNlbnQgb25seSBpZiBsY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgaXMKLQktLSBwcmVzZW50IGFuZCBjb250YWlucyBmb3VyIGluc3RhbmNlcyBvZiBMQ1MtUHJpdmFjeUNsYXNzLiBJZiB0aGUgbWVudGlvbmVkIGNvbmRpdGlvbgotCS0tIGlzIG5vdCBzYXRpc2ZpZWQgdGhlIHJlY2VpdmluZyBub2RlIHNoYWxsIGRpc2NhcmQgYWRkLWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdC4KLQktLSBJZiBhbiBMQ1MtUHJpdmFjeUNsYXNzIGlzIHJlY2VpdmVkIGJvdGggaW4gbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IGFuZCBpbgotCS0tIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3Qgd2l0aCB0aGUgc2FtZSBTUy1Db2RlLCB0aGVuIHRoZSBlcnJvciB1bmV4cGVjdGVkIAotCS0tIGRhdGEgdmFsdWUgc2hhbGwgYmUgcmV0dXJuZWQuCi0KLUdNTEMtTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZHTUxDKSBPRgotCQkJCUlTRE4tQWRkcmVzc1N0cmluZwotCS0tIGlmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCB0aGUgY29tcGxldGUgR01MQy1MaXN0IHNoYWxsIGJlIHNlbnQgaW4gb25lIHNlZ21lbnQKLQotbWF4TnVtT2ZHTUxDICBJTlRFR0VSIDo6PSA1Ci0KLU5ldHdvcmtBY2Nlc3NNb2RlIDo6PSBFTlVNRVJBVEVEIHsKLQlwYWNrZXRBbmRDaXJjdWl0CSgwKSwKLQlvbmx5Q2lyY3VpdAkJKDEpLAotCW9ubHlQYWNrZXQJCSgyKSwKLQkuLi59Ci0JLS0gaWYgdW5rbm93biB2YWx1ZXMgYXJlIHJlY2VpdmVkIGluIE5ldHdvcmtBY2Nlc3NNb2RlCi0JLS0gdGhleSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0KLUdQUlNEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpIE9GCi0JCQkJUERQLUNvbnRleHQKLQotbWF4TnVtT2ZQRFAtQ29udGV4dHMgIElOVEVHRVIgOjo9IDUwCi0KLVBEUC1Db250ZXh0IDo6PSBTRVFVRU5DRSB7Ci0JcGRwLUNvbnRleHRJZAlDb250ZXh0SWQsCi0JcGRwLVR5cGUJCVsxNl0gUERQLVR5cGUsCi0JcGRwLUFkZHJlc3MJWzE3XSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKLQlxb3MtU3Vic2NyaWJlZAlbMThdIFFvUy1TdWJzY3JpYmVkLAotCXZwbG1uQWRkcmVzc0FsbG93ZWQJWzE5XSBOVUxMCU9QVElPTkFMLAotCWFwbgkJCVsyMF0gQVBOLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMjFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gLAotCWV4dC1Rb1MtU3Vic2NyaWJlZAlbMF0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLCAKLQlwZHAtQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJWzFdIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAotCWV4dDItUW9TLVN1YnNjcmliZWQJWzJdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCi0JLS0gZXh0Mi1Rb1MtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIGV4dC1Rb1MtU3Vic2NyaWJlZCBpcyBwcmVzZW50LgotCWV4dDMtUW9TLVN1YnNjcmliZWQJWzNdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwKLQktLSBleHQzLVFvUy1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgZXh0Mi1Rb1MtU3Vic2NyaWJlZCBpcyBwcmVzZW50LgotCSB9Ci0KLUNvbnRleHRJZCA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpCi0KLUdQUlNTdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7Ci0JY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKLQkJLS0gSWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIGNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZCBtYXkgb25seSBiZSBwcmVzZW50IGluIHRoZQotCQktLSBmaXJzdCBzZWdtZW50IG9mIEdQUlNTdWJzY3JpcHRpb25EYXRhLgotCWdwcnNEYXRhTGlzdAlbMV0JR1BSU0RhdGFMaXN0LAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiB9Ci0KLVNHU04tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgewotCWdwcnMtQ1NJCQlbMF0JR1BSUy1DU0kJT1BUSU9OQUwsCi0JbW8tc21zLUNTSQlbMV0JU01TLUNTSQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JbXQtc21zLUNTSQlbM10JU01TLUNTSQlPUFRJT05BTCwKLQltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzRdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKLQltZy1jc2kJCVs1XQlNRy1DU0kJT1BUSU9OQUwKLQl9Ci0KLUdQUlMtQ1NJIDo6PSBTRVFVRU5DRSB7Ci0JZ3Bycy1DYW1lbFREUERhdGFMaXN0CVswXSBHUFJTLUNhbWVsVERQRGF0YUxpc3QJT1BUSU9OQUwsCi0JY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCW5vdGlmaWNhdGlvblRvQ1NFCVszXQlOVUxMCQlPUFRJT05BTCwKLQljc2ktQWN0aXZlCVs0XQlOVUxMCQlPUFRJT05BTCwKLQkuLi59Ci0tLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIEdQUlMtQ1NJIGlzIHNlbnQgdG8gU0dTTi4KLS0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4gCi0tLQlHUFJTLUNhbWVsVERQRGF0YSBhbmQgIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIHByZXNlbnQgaW4gCi0tLQl0aGUgR1BSUy1DU0kgc2VxdWVuY2UuCi0tLQlJZiBHUFJTLUNTSSBpcyBzZWdtZW50ZWQsIGdwcnMtQ2FtZWxURFBEYXRhTGlzdCBhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgCi0tLQlwcmVzZW50IGluIHRoZSBmaXJzdCBzZWdtZW50Ci0KLUdQUlMtQ2FtZWxURFBEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCi0JR1BSUy1DYW1lbFREUERhdGEKLS0tCUdQUlMtQ2FtZWxURFBEYXRhTGlzdCBzaGFsbCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCi0tLQlHUFJTLUNhbWVsVERQRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBncHJzLVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KLQotR1BSUy1DYW1lbFREUERhdGEgOjo9IFNFUVVFTkNFIHsKLQlncHJzLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlbMF0gR1BSUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCi0Jc2VydmljZUtleQlbMV0gU2VydmljZUtleSwKLQlnc21TQ0YtQWRkcmVzcwlbMl0gSVNETi1BZGRyZXNzU3RyaW5nLAotCWRlZmF1bHRTZXNzaW9uSGFuZGxpbmcJWzNdIERlZmF1bHRHUFJTLUhhbmRsaW5nLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLgotCX0KLQotRGVmYXVsdEdQUlMtSGFuZGxpbmcgOjo9IEVOVU1FUkFURUQgewotCWNvbnRpbnVlVHJhbnNhY3Rpb24gKDApICwKLQlyZWxlYXNlVHJhbnNhY3Rpb24gKDEpICwKLQkuLi59Ci0tLSBleGNlcHRpb24gaGFuZGxpbmc6Ci0tLSByZWNlcHRpb24gb2YgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAiY29udGludWVUcmFuc2FjdGlvbiIKLS0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInJlbGVhc2VUcmFuc2FjdGlvbiIKLQotR1BSUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgewotCWF0dGFjaCAJCQkoMSksCi0JYXR0YWNoQ2hhbmdlT2ZQb3NpdGlvbiAJCSgyKSwKLQlwZHAtQ29udGV4dEVzdGFibGlzaG1lbnQgCQkoMTEpLAotCXBkcC1Db250ZXh0RXN0YWJsaXNobWVudEFja25vd2xlZGdlbWVudAkoMTIpLAotCXBkcC1Db250ZXh0Q2hhbmdlT2ZQb3NpdGlvbiAJCSgxNCksCi0JLi4uIH0KLS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKLS0tIEZvciBHUFJTLUNhbWVsVERQRGF0YSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQotLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCi0tLSBHUFJTLUNhbWVsVERQRGF0YXNlcXVlbmNlLgotCi1BUE4gOjo9ICBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjYzKSkKLQktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddIAotCi1QRFAtVHlwZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKLQktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI5LjA2MCBbMTA1XQotCi1QRFAtQWRkcmVzcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4xNikpCi0JLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyOS4wNjAgWzEwNV0KLQotCS0tIFRoZSBwb3NzaWJsZSBzaXplIHZhbHVlcyBhcmU6Ci0JLS0gMS03IG9jdGV0cyAgWC4yNSBhZGRyZXNzIHR5cGUKLQktLSAgNCAgb2N0ZXRzICBJUHY0IGFkZHJlc3MgdHlwZQotCS0tIDE2ICBvY3RldHMgIElwdjYgYWRkcmVzcyB0eXBlCi0KLVFvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQotCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAKLQktLSAzLTUuCi0KLUV4dC1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi45KSkKLQktLSBPQ1RFVCAxOiAKLQktLSAgQWxsb2NhdGlvbi9SZXRlbnRpb24gUHJpb3JpdHkgKFRoaXMgb2N0ZXQgZW5jb2RlcyBlYWNoIHByaW9yaXR5IGxldmVsIGRlZmluZWQgaW4KLQktLSAgICAgMjMuMTA3IGFzIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHByaW9yaXR5IGxldmVsLCBkZWNsYXJhdGlvbiBpbiAyOS4wNjApCi0JLS0gT2N0ZXRzIDItOSBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAKLQktLSA2LTEzLgotCi1FeHQyLVFvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjMpKQotCS0tIE9jdGV0cyAxLTMgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgMTQtMTYuCi0JLS0gSWYgUXVhbGl0eSBvZiBTZXJ2aWNlIGluZm9ybWF0aW9uIGlzIHN0cnVjdHVyZWQgd2l0aCAxNCBvY3RldCBsZW5ndGgsIHRoZW4KLQktLSBPY3RldCAxIGlzIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldCAxNC4KLQotRXh0My1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKLQktLSBPY3RldHMgMS0yIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXRzIDE3LTE4LgotCi1DaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKLQktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDMyLjIxNS4KLQotTFNBT25seUFjY2Vzc0luZGljYXRvciA6Oj0gRU5VTUVSQVRFRCB7Ci0JYWNjZXNzT3V0c2lkZUxTQXNBbGxvd2VkICAoMCksCi0JYWNjZXNzT3V0c2lkZUxTQXNSZXN0cmljdGVkICgxKX0KLQotTFNBRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTFNBcykgT0YKLQkJCQlMU0FEYXRhCi0KLW1heE51bU9mTFNBcyAgSU5URUdFUiA6Oj0gMjAKLQotTFNBRGF0YSA6Oj0gU0VRVUVOQ0UgewotCWxzYUlkZW50aXR5CVswXSBMU0FJZGVudGl0eSwKLQlsc2FBdHRyaWJ1dGVzCVsxXSBMU0FBdHRyaWJ1dGVzLAotCWxzYUFjdGl2ZU1vZGVJbmRpY2F0b3IJWzJdIE5VTEwJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotTFNBSW5mb3JtYXRpb24gOjo9IFNFUVVFTkNFIHsKLQljb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQJTlVMTAkJCU9QVElPTkFMLAotCi0JCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKLQkJLS0gZmlyc3Qgc2VnbWVudC4KLQlsc2FPbmx5QWNjZXNzSW5kaWNhdG9yCVsxXQlMU0FPbmx5QWNjZXNzSW5kaWNhdG9yCU9QVElPTkFMLAotCWxzYURhdGFMaXN0CVsyXQlMU0FEYXRhTGlzdAlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUxTQUlkZW50aXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQotCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10KLQotTFNBQXR0cmlidXRlcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDQ4LjAwOCBbNDldCi0KLVN1YnNjcmliZXJEYXRhIDo6PSBTRVFVRU5DRSB7Ci0JbXNpc2RuCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCWNhdGVnb3J5CQlbMl0gQ2F0ZWdvcnkJT1BUSU9OQUwsCi0Jc3Vic2NyaWJlclN0YXR1cwlbM10gU3Vic2NyaWJlclN0YXR1cwlPUFRJT05BTCwKLQliZWFyZXJTZXJ2aWNlTGlzdAlbNF0gQmVhcmVyU2VydmljZUxpc3QJT1BUSU9OQUwsCi0JLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkIC8gbm90IGFsbG9jYXRlZAotCS0tIGJlYXJlclNlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gOC44LjEKLQl0ZWxlc2VydmljZUxpc3QJWzZdIFRlbGVzZXJ2aWNlTGlzdAlPUFRJT05BTCwKLQktLSBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciByZWNlcHRpb24gb2YgdW5zdXBwb3J0ZWQgLyBub3QgYWxsb2NhdGVkCi0JLS0gdGVsZXNlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gOC44LjEKLQlwcm92aXNpb25lZFNTCVs3XSBFeHQtU1MtSW5mb0xpc3QJT1BUSU9OQUwsCi0Jb2RiLURhdGEJCVs4XSBPREItRGF0YQlPUFRJT05BTCwKLQlyb2FtaW5nUmVzdHJpY3Rpb25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSAgWzldIE5VTEwJT1BUSU9OQUwsCi0JcmVnaW9uYWxTdWJzY3JpcHRpb25EYXRhCVsxMF0gWm9uZUNvZGVMaXN0CU9QVElPTkFMLAotCXZic1N1YnNjcmlwdGlvbkRhdGEJWzExXSBWQlNEYXRhTGlzdAlPUFRJT05BTCwKLQl2Z2NzU3Vic2NyaXB0aW9uRGF0YQlbMTJdIFZHQ1NEYXRhTGlzdAlPUFRJT05BTCwKLQl2bHJDYW1lbFN1YnNjcmlwdGlvbkluZm8JWzEzXSBWbHJDYW1lbFN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwKLQl9Ci0KLUNhdGVnb3J5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQotCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBJVFUtVCBSZWMgUS43NjMuCi0KLVN1YnNjcmliZXJTdGF0dXMgOjo9IEVOVU1FUkFURUQgewotCXNlcnZpY2VHcmFudGVkICAoMCksCi0Jb3BlcmF0b3JEZXRlcm1pbmVkQmFycmluZyAgKDEpfQotCi1CZWFyZXJTZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCZWFyZXJTZXJ2aWNlcykgT0YKLQkJCQlFeHQtQmVhcmVyU2VydmljZUNvZGUKLQotbWF4TnVtT2ZCZWFyZXJTZXJ2aWNlcyAgSU5URUdFUiA6Oj0gNTAKLQotVGVsZXNlcnZpY2VMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlRlbGVzZXJ2aWNlcykgT0YKLQkJCQlFeHQtVGVsZXNlcnZpY2VDb2RlCi0KLW1heE51bU9mVGVsZXNlcnZpY2VzICBJTlRFR0VSIDo6PSAyMAotCi1PREItRGF0YSA6Oj0gU0VRVUVOQ0UgewotCW9kYi1HZW5lcmFsRGF0YQlPREItR2VuZXJhbERhdGEsCi0Jb2RiLUhQTE1OLURhdGEJT0RCLUhQTE1OLURhdGEJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLU9EQi1HZW5lcmFsRGF0YSA6Oj0gQklUIFNUUklORyB7Ci0JYWxsT0ctQ2FsbHNCYXJyZWQgICgwKSwKLQlpbnRlcm5hdGlvbmFsT0dDYWxsc0JhcnJlZCAgKDEpLAotCWludGVybmF0aW9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICAoMiksCi0JaW50ZXJ6b25hbE9HQ2FsbHNCYXJyZWQgKDYpLAotCWludGVyem9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICg3KSwKLQlpbnRlcnpvbmFsT0dDYWxsc0FuZEludGVybmF0aW9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICg4KSwKLQlwcmVtaXVtUmF0ZUluZm9ybWF0aW9uT0dDYWxsc0JhcnJlZCAgKDMpLAotCXByZW1pdW1SYXRlRW50ZXJ0YWluZW1lbnRPR0NhbGxzQmFycmVkICAoNCksCi0Jc3MtQWNjZXNzQmFycmVkICAoNSksCi0JYWxsRUNULUJhcnJlZCAoOSksCi0JY2hhcmdlYWJsZUVDVC1CYXJyZWQgKDEwKSwKLQlpbnRlcm5hdGlvbmFsRUNULUJhcnJlZCAoMTEpLAotCWludGVyem9uYWxFQ1QtQmFycmVkICgxMiksCi0JZG91Ymx5Q2hhcmdlYWJsZUVDVC1CYXJyZWQgKDEzKSwKLQltdWx0aXBsZUVDVC1CYXJyZWQgKDE0KSwKLQlhbGxQYWNrZXRPcmllbnRlZFNlcnZpY2VzQmFycmVkICgxNSksCi0Jcm9hbWVyQWNjZXNzVG9IUExNTi1BUC1CYXJyZWQgICgxNiksCi0Jcm9hbWVyQWNjZXNzVG9WUExNTi1BUC1CYXJyZWQgICgxNyksCi0Jcm9hbWluZ091dHNpZGVQTE1OT0ctQ2FsbHNCYXJyZWQgICgxOCksCi0JYWxsSUMtQ2FsbHNCYXJyZWQgICgxOSksCi0Jcm9hbWluZ091dHNpZGVQTE1OSUMtQ2FsbHNCYXJyZWQgICgyMCksCi0Jcm9hbWluZ091dHNpZGVQTE1OSUNvdW50cnlJQy1DYWxsc0JhcnJlZCAgKDIxKSwKLQlyb2FtaW5nT3V0c2lkZVBMTU4tQmFycmVkICAoMjIpLAotCXJvYW1pbmdPdXRzaWRlUExNTi1Db3VudHJ5QmFycmVkICAoMjMpLAotCXJlZ2lzdHJhdGlvbkFsbENGLUJhcnJlZCAgKDI0KSwKLQlyZWdpc3RyYXRpb25DRk5vdFRvSFBMTU4tQmFycmVkICAoMjUpLAotCXJlZ2lzdHJhdGlvbkludGVyem9uYWxDRi1CYXJyZWQgICgyNiksCi0JcmVnaXN0cmF0aW9uSW50ZXJ6b25hbENGTm90VG9IUExNTi1CYXJyZWQgICgyNyksCi0JcmVnaXN0cmF0aW9uSW50ZXJuYXRpb25hbENGLUJhcnJlZCAgKDI4KX0gKFNJWkUgKDE1Li4zMikpCi0JLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCi0JLS0gT0RCLUdlbmVyYWxEYXRhIHR5cGUgc2hhbGwgYmUgdHJlYXRlZCBsaWtlIHVuc3VwcG9ydGVkIE9EQi1HZW5lcmFsRGF0YQotCS0tIFdoZW4gdGhlIE9EQi1HZW5lcmFsRGF0YSB0eXBlIGlzIHJlbW92ZWQgZnJvbSB0aGUgSExSIGZvciBhIGdpdmVuIHN1YnNjcmliZXIsIAotCS0tIGluIE5vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkIG9wZXJhdGlvbiBzZW50IHRvd2FyZCB0aGUgZ3NtU0NGIAotCS0tIGFsbCBiaXRzIHNoYWxsIGJlIHNldCB0byAiTyIuCi0KLU9EQi1IUExNTi1EYXRhIDo6PSBCSVQgU1RSSU5HIHsKLQlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGUxICAoMCksCi0JcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlMiAgKDEpLAotCXBsbW4tU3BlY2lmaWNCYXJyaW5nVHlwZTMgICgyKSwKLQlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGU0ICAoMyl9IChTSVpFICg0Li4zMikpCi0JLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCi0JLS0gT0RCLUhQTE1OLURhdGEgdHlwZSBzaGFsbCBiZSB0cmVhdGVkIGxpa2UgdW5zdXBwb3J0ZWQgT0RCLUhQTE1OLURhdGEgCi0JLS0gV2hlbiB0aGUgT0RCLUhQTE1OLURhdGEgdHlwZSBpcyByZW1vdmVkIGZyb20gdGhlIEhMUiBmb3IgYSBnaXZlbiBzdWJzY3JpYmVyLCAKLQktLSBpbiBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24gc2VudCB0b3dhcmQgdGhlIGdzbVNDRgotCS0tIGFsbCBiaXRzIHNoYWxsIGJlIHNldCB0byAiTyIuCi0KLUV4dC1TUy1JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKLQkJCQlFeHQtU1MtSW5mbwotCi1FeHQtU1MtSW5mbyA6Oj0gQ0hPSUNFIHsKLQlmb3J3YXJkaW5nSW5mbwlbMF0gRXh0LUZvcndJbmZvLAotCWNhbGxCYXJyaW5nSW5mbwlbMV0gRXh0LUNhbGxCYXJJbmZvLAotCWN1Zy1JbmZvCQlbMl0gQ1VHLUluZm8sCi0Jc3MtRGF0YQkJWzNdIEV4dC1TUy1EYXRhLAotCWVtbHBwLUluZm8JWzRdIEVNTFBQLUluZm99Ci0KLUV4dC1Gb3J3SW5mbyA6Oj0gU0VRVUVOQ0UgewotCXNzLUNvZGUJCVNTLUNvZGUsCi0JZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CUV4dC1Gb3J3RmVhdHVyZUxpc3QsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1FeHQtRm9yd0ZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCi0JCQkJRXh0LUZvcndGZWF0dXJlCi0KLUV4dC1Gb3J3RmVhdHVyZSA6Oj0gU0VRVUVOQ0UgewotCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKLQlzcy1TdGF0dXMJCVs0XSBFeHQtU1MtU3RhdHVzLAotCWZvcndhcmRlZFRvTnVtYmVyCVs1XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCi0JLS0gV2hlbiB0aGlzIGRhdGEgdHlwZSBpcyBzZW50IGZyb20gYW4gSExSIHdoaWNoIHN1cHBvcnRzIENBTUVMIFBoYXNlIDIKLQktLSB0byBhIFZMUiB0aGF0IHN1cHBvcnRzIENBTUVMIFBoYXNlIDIgdGhlIFZMUiBzaGFsbCBub3QgY2hlY2sgdGhlCi0JLS0gZm9ybWF0IG9mIHRoZSBudW1iZXIKLQlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzhdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQlmb3J3YXJkaW5nT3B0aW9ucwlbNl0gRXh0LUZvcndPcHRpb25zCU9QVElPTkFMLAotCW5vUmVwbHlDb25kaXRpb25UaW1lCVs3XSBFeHQtTm9SZXBDb25kVGltZQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzldIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JbG9uZ0ZvcndhcmRlZFRvTnVtYmVyCVsxMF0gRlROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQotCi1FeHQtRm9yd09wdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCi0KLQktLSBPQ1RFVCAxOgotCi0JLS0gIGJpdCA4OiBub3RpZmljYXRpb24gdG8gZm9yd2FyZGluZyBwYXJ0eQotCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgotCS0tCTEgIG5vdGlmaWNhdGlvbgotCi0JLS0gIGJpdCA3OiByZWRpcmVjdGluZyBwcmVzZW50YXRpb24KLQktLQkwIG5vIHByZXNlbnRhdGlvbiAgCi0JLS0JMSAgcHJlc2VudGF0aW9uCi0KLQktLSAgYml0IDY6IG5vdGlmaWNhdGlvbiB0byBjYWxsaW5nIHBhcnR5Ci0JLS0JMCAgbm8gbm90aWZpY2F0aW9uCi0JLS0JMSAgbm90aWZpY2F0aW9uCi0KLQktLSAgYml0IDU6IDAgKHVudXNlZCkKLQotCS0tICBiaXRzIDQzOiBmb3J3YXJkaW5nIHJlYXNvbgotCS0tCTAwICBtcyBub3QgcmVhY2hhYmxlCi0JLS0JMDEgIG1zIGJ1c3kKLQktLQkxMCAgbm8gcmVwbHkKLQktLQkxMSAgdW5jb25kaXRpb25hbAotCi0JLS0gYml0cyAyMTogMDAgKHVudXNlZCkKLQotCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGV5IHNoYWxsIGJlIGRpc2NhcmRlZCBpZgotCS0tIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZC4KLQotRXh0LU5vUmVwQ29uZFRpbWUgOjo9IElOVEVHRVIgKDEuLjEwMCkKLQktLSBPbmx5IHZhbHVlcyA1LTMwIGFyZSB1c2VkLgotCS0tIFZhbHVlcyBpbiB0aGUgcmFuZ2VzIDEtNCBhbmQgMzEtMTAwIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotCS0tIElmIHJlY2VpdmVkOgotCS0tCQl2YWx1ZXMgMS00IHNoYWxsIGJlIG1hcHBlZCBvbiB0byB2YWx1ZSA1Ci0JLS0JCXZhbHVlcyAzMS0xMDAgc2hhbGwgYmUgbWFwcGVkIG9uIHRvIHZhbHVlIDMwCi0KLUV4dC1DYWxsQmFySW5mbyA6Oj0gU0VRVUVOQ0UgewotCXNzLUNvZGUJCVNTLUNvZGUsCi0JY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlFeHQtQ2FsbEJhckZlYXR1cmVMaXN0LAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1FeHQtQ2FsbEJhckZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCi0JCQkJRXh0LUNhbGxCYXJyaW5nRmVhdHVyZQotCi1FeHQtQ2FsbEJhcnJpbmdGZWF0dXJlIDo6PSBTRVFVRU5DRSB7Ci0JYmFzaWNTZXJ2aWNlCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAotCXNzLVN0YXR1cwkJWzRdIEV4dC1TUy1TdGF0dXMsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUNVRy1JbmZvIDo6PSBTRVFVRU5DRSB7Ci0JY3VnLVN1YnNjcmlwdGlvbkxpc3QJQ1VHLVN1YnNjcmlwdGlvbkxpc3QsCi0JY3VnLUZlYXR1cmVMaXN0CUNVRy1GZWF0dXJlTGlzdAlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUNVRy1TdWJzY3JpcHRpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgwLi5tYXhOdW1PZkNVRykgT0YKLQkJCQlDVUctU3Vic2NyaXB0aW9uCi0KLUNVRy1TdWJzY3JpcHRpb24gOjo9IFNFUVVFTkNFIHsKLQljdWctSW5kZXgJQ1VHLUluZGV4LAotCWN1Zy1JbnRlcmxvY2sJQ1VHLUludGVybG9jaywKLQlpbnRyYUNVRy1PcHRpb25zCUludHJhQ1VHLU9wdGlvbnMsCi0JYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CUV4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1DVUctSW5kZXggOjo9IElOVEVHRVIgKDAuLjMyNzY3KQotCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBFVFMgMzAwIDEzOC4KLQotQ1VHLUludGVybG9jayA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKLQotSW50cmFDVUctT3B0aW9ucyA6Oj0gRU5VTUVSQVRFRCB7Ci0Jbm9DVUctUmVzdHJpY3Rpb25zICAoMCksCi0JY3VnSUMtQ2FsbEJhcnJlZCAgKDEpLAotCWN1Z09HLUNhbGxCYXJyZWQgICgyKX0KLQotbWF4TnVtT2ZDVUcgIElOVEVHRVIgOjo9IDEwCi0KLUNVRy1GZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgotCQkJCUNVRy1GZWF0dXJlCi0KLUV4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcykgT0YKLQkJCQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQotCi1tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMgIElOVEVHRVIgOjo9IDMyCi0KLUNVRy1GZWF0dXJlIDo6PSBTRVFVRU5DRSB7Ci0JYmFzaWNTZXJ2aWNlCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAotCXByZWZlcmVudGlhbENVRy1JbmRpY2F0b3IJQ1VHLUluZGV4CU9QVElPTkFMLAotCWludGVyQ1VHLVJlc3RyaWN0aW9ucwlJbnRlckNVRy1SZXN0cmljdGlvbnMsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUludGVyQ1VHLVJlc3RyaWN0aW9ucyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQotCS0tIGJpdHMgODc2NTQzOiAwMDAwMDAgKHVudXNlZCkKLQktLSBFeGNlcHRpb24gaGFuZGxpbmc6Ci0JLS0gYml0cyA4NzY1NDMgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKLQotCS0tIGJpdHMgMjEKLQktLQkwMCAgQ1VHIG9ubHkgZmFjaWxpdGllcwotCS0tCTAxICBDVUcgd2l0aCBvdXRnb2luZyBhY2Nlc3MKLQktLQkxMCAgQ1VHIHdpdGggaW5jb21pbmcgYWNjZXNzCi0JLS0JMTEgIENVRyB3aXRoIGJvdGggb3V0Z29pbmcgYW5kIGluY29taW5nIGFjY2VzcwotCi1FeHQtU1MtRGF0YSA6Oj0gU0VRVUVOQ0UgewotCXNzLUNvZGUJCVNTLUNvZGUsCi0Jc3MtU3RhdHVzCVs0XSBFeHQtU1MtU3RhdHVzLAotCXNzLVN1YnNjcmlwdGlvbk9wdGlvbglTUy1TdWJzY3JpcHRpb25PcHRpb24JT1BUSU9OQUwsCi0JYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CUV4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs1XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1MQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUHJpdmFjeUNsYXNzKSBPRgotCQkJCUxDUy1Qcml2YWN5Q2xhc3MKLQotbWF4TnVtT2ZQcml2YWN5Q2xhc3MgIElOVEVHRVIgOjo9IDQKLQotTENTLVByaXZhY3lDbGFzcyA6Oj0gU0VRVUVOQ0UgewotCXNzLUNvZGUJCVNTLUNvZGUsCi0Jc3MtU3RhdHVzCQlFeHQtU1MtU3RhdHVzLAotCW5vdGlmaWNhdGlvblRvTVNVc2VyCVswXSBOb3RpZmljYXRpb25Ub01TVXNlcglPUFRJT05BTCwKLQktLSBub3RpZmljYXRpb25Ub01TVXNlciBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlcyBjYWxsU2Vzc2lvblJlbGF0ZWQKLQktLSBhbmQgY2FsbFNlc3Npb25VbnJlbGF0ZWQuIElmIG5vdCByZWNlaXZlZCBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25SZWxhdGVkCi0JLS0gYW5kIGNhbGxTZXNzaW9uVW5yZWxhdGVkLAotCS0tIHRoZSBkZWZhdWx0IHZhbHVlcyBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KLQlleHRlcm5hbENsaWVudExpc3QJWzFdIEV4dGVybmFsQ2xpZW50TGlzdAlPUFRJT05BTCwKLQktLSBleHRlcm5hbENsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBjYWxsU2Vzc2lvblVucmVsYXRlZCB0byBhCi0JLS0gdmlzaXRlZCBub2RlIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBMQ1MgUmVsZWFzZSA0IG9yIGxhdGVyIHZlcnNpb25zLgotCS0tIGV4dGVybmFsQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlcyBjYWxsU2Vzc2lvblVucmVsYXRlZCBhbmQKLQktLSBjYWxsU2Vzc2lvblJlbGF0ZWQgdG8gYSB2aXNpdGVkIG5vZGUgdGhhdCBzdXBwb3J0cyBMQ1MgUmVsZWFzZSA0IG9yIGxhdGVyIHZlcnNpb25zLgotCXBsbW5DbGllbnRMaXN0CVsyXSBQTE1OQ2xpZW50TGlzdAlPUFRJT05BTCwKLQktLSBwbG1uQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlIHBsbW5vcGVyYXRvci4KLQlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JZXh0LWV4dGVybmFsQ2xpZW50TGlzdAlbNF0gRXh0LUV4dGVybmFsQ2xpZW50TGlzdAlPUFRJT05BTCwKLQktLSBFeHQtZXh0ZXJuYWxDbGllbnRMaXN0IG1heSBiZSBzZW50IG9ubHkgaWYgdGhlIHZpc2l0ZWQgbm9kZSBzdXBwb3J0cyBMQ1MgUmVsZWFzZSA0IG9yCi0JLS0gbGF0ZXIgdmVyc2lvbnMsIHRoZSB1c2VyIGRpZCBzcGVjaWZ5IG1vcmUgdGhhbiA1IGNsaWVudHMsIGFuZCBXaGl0ZSBCb29rIFNDQ1AgaXMgdXNlZC4KLQlzZXJ2aWNlVHlwZUxpc3QJWzVdCVNlcnZpY2VUeXBlTGlzdAlPUFRJT05BTAotCS0tIHNlcnZpY2VUeXBlTGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlIHNlcnZpY2VUeXBlIGFuZCBpZiB0aGUgdmlzaXRlZCBub2RlCi0JLS0gc3VwcG9ydHMgTENTIFJlbGVhc2UgNSBvciBsYXRlciB2ZXJzaW9ucy4KLQktLSAKLQktLSBpZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgdGhlIGNvbXBsZXRlIExDUy1Qcml2YWN5Q2xhc3Mgc2hhbGwgYmUgc2VudCBpbiBvbmUgc2VnbWVudAotfQotCi1FeHRlcm5hbENsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDAuLm1heE51bU9mRXh0ZXJuYWxDbGllbnQpIE9GCi0JCQkJRXh0ZXJuYWxDbGllbnQKLQotbWF4TnVtT2ZFeHRlcm5hbENsaWVudCAgSU5URUdFUiA6Oj0gNQotCi1QTE1OQ2xpZW50TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQTE1OQ2xpZW50KSBPRgotCQkJCUxDU0NsaWVudEludGVybmFsSUQKLQotbWF4TnVtT2ZQTE1OQ2xpZW50ICBJTlRFR0VSIDo6PSA1Ci0KLUV4dC1FeHRlcm5hbENsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUV4dGVybmFsQ2xpZW50KSBPRgotCQkJCUV4dGVybmFsQ2xpZW50Ci0KLW1heE51bU9mRXh0LUV4dGVybmFsQ2xpZW50ICBJTlRFR0VSIDo6PSAzNQotCi1FeHRlcm5hbENsaWVudCA6Oj0gU0VRVUVOQ0UgewotCWNsaWVudElkZW50aXR5CUxDU0NsaWVudEV4dGVybmFsSUQsCi0JZ21sYy1SZXN0cmljdGlvbglbMF0gR01MQy1SZXN0cmljdGlvbglPUFRJT05BTCwKLQlub3RpZmljYXRpb25Ub01TVXNlcglbMV0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCi0JLS0gSWYgbm90aWZpY2F0aW9uVG9NU1VzZXIgaXMgbm90IHJlY2VpdmVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBhY2NvcmRpbmcgdG8gCi0JLS0gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KLQlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gfQotCi1HTUxDLVJlc3RyaWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKLQlnbWxjLUxpc3QJCSgwKSwKLQlob21lLUNvdW50cnkJKDEpICwKLQkuLi4gfQotLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgotLS0gQXQgcmVjZXB0aW9uIG9mIGFueSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlCi0tLSBHTUxDLVJlc3RyaWN0aW9uLgotCi1Ob3RpZmljYXRpb25Ub01TVXNlciA6Oj0gRU5VTUVSQVRFRCB7Ci0Jbm90aWZ5TG9jYXRpb25BbGxvd2VkCSgwKSwKLQlub3RpZnlBbmRWZXJpZnktTG9jYXRpb25BbGxvd2VkSWZOb1Jlc3BvbnNlCSgxKSwKLQlub3RpZnlBbmRWZXJpZnktTG9jYXRpb25Ob3RBbGxvd2VkSWZOb1Jlc3BvbnNlCSgyKSwKLQkuLi4sCi0JbG9jYXRpb25Ob3RBbGxvd2VkICgzKSB9Ci0tLSBleGNlcHRpb24gaGFuZGxpbmc6Ci0tLSBBdCByZWNlcHRpb24gb2YgYW55IG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUKLS0tIE5vdGlmaWNhdGlvblRvTVNVc2VyLgotCi1TZXJ2aWNlVHlwZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU2VydmljZVR5cGUpIE9GCi0JCQkJU2VydmljZVR5cGUKLQotbWF4TnVtT2ZTZXJ2aWNlVHlwZSAgSU5URUdFUiA6Oj0gMzIKLQotU2VydmljZVR5cGUgOjo9IFNFUVVFTkNFIHsKLQlzZXJ2aWNlVHlwZUlkZW50aXR5CUxDU1NlcnZpY2VUeXBlSUQsCi0JZ21sYy1SZXN0cmljdGlvbglbMF0gR01MQy1SZXN0cmljdGlvbglPUFRJT05BTCwKLQlub3RpZmljYXRpb25Ub01TVXNlcglbMV0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCi0JLS0gSWYgbm90aWZpY2F0aW9uVG9NU1VzZXIgaXMgbm90IHJlY2VpdmVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBhY2NvcmRpbmcgdG8gCi0JLS0gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KLQlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gfQotCi1NT0xSLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTU9MUi1DbGFzcykgT0YKLQkJCQlNT0xSLUNsYXNzCi0KLW1heE51bU9mTU9MUi1DbGFzcyAgSU5URUdFUiA6Oj0gMwotCi1NT0xSLUNsYXNzIDo6PSBTRVFVRU5DRSB7Ci0Jc3MtQ29kZQkJU1MtQ29kZSwKLQlzcy1TdGF0dXMJCUV4dC1TUy1TdGF0dXMsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1ab25lQ29kZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mWm9uZUNvZGVzKQotCQkJCU9GIFpvbmVDb2RlCi0KLVpvbmVDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQotCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10KLQotbWF4TnVtT2Zab25lQ29kZXMgIElOVEVHRVIgOjo9IDEwCi0KLUluc2VydFN1YnNjcmliZXJEYXRhUmVzIDo6PSBTRVFVRU5DRSB7Ci0JdGVsZXNlcnZpY2VMaXN0CVsxXSBUZWxlc2VydmljZUxpc3QJT1BUSU9OQUwsCi0JYmVhcmVyU2VydmljZUxpc3QJWzJdIEJlYXJlclNlcnZpY2VMaXN0CU9QVElPTkFMLAotCXNzLUxpc3QJCVszXSBTUy1MaXN0CU9QVElPTkFMLAotCW9kYi1HZW5lcmFsRGF0YQlbNF0gT0RCLUdlbmVyYWxEYXRhCU9QVElPTkFMLAotCXJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJWzVdIFJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJT1BUSU9OQUwsCi0Jc3VwcG9ydGVkQ2FtZWxQaGFzZXMJWzZdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiAsCi0Jb2ZmZXJlZENhbWVsNENTSXMJWzhdIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAotCXN1cHBvcnRlZEZlYXR1cmVzCVs5XSBTdXBwb3J0ZWRGZWF0dXJlcwlPUFRJT05BTCB9Ci0KLVJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UgOjo9IEVOVU1FUkFURUQgewotCW5ldHdvcmtOb2RlLUFyZWFSZXN0cmljdGVkCSgwKSwKLQl0b29NYW55Wm9uZUNvZGVzCSgxKSwKLQl6b25lQ29kZXNDb25mbGljdAkoMiksCi0JcmVnaW9uYWxTdWJzY05vdFN1cHBvcnRlZAkoMyl9Ci0KLURlbGV0ZVN1YnNjcmliZXJEYXRhQXJnIDo6PSBTRVFVRU5DRSB7Ci0JaW1zaQkJCVswXSBJTVNJLAotCWJhc2ljU2VydmljZUxpc3QJWzFdIEJhc2ljU2VydmljZUxpc3QJT1BUSU9OQUwsCi0JLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkL25vdCBhbGxvY2F0ZWQKLQktLSBiYXNpY1NlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gNi44LjIKLQlzcy1MaXN0CQlbMl0gU1MtTGlzdAlPUFRJT05BTCwKLQlyb2FtaW5nUmVzdHJpY3Rpb25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSBbNF0gTlVMTAlPUFRJT05BTCwKLQlyZWdpb25hbFN1YnNjcmlwdGlvbklkZW50aWZpZXIJWzVdIFpvbmVDb2RlCU9QVElPTkFMLAotCXZic0dyb3VwSW5kaWNhdGlvbglbN10gTlVMTAkJT1BUSU9OQUwsCi0Jdmdjc0dyb3VwSW5kaWNhdGlvbglbOF0gTlVMTAkgCU9QVElPTkFMLAotCWNhbWVsU3Vic2NyaXB0aW9uSW5mb1dpdGhkcmF3CVs5XSBOVUxMCSAJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAotCS4uLiwKLQlncHJzU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CVsxMF0gR1BSU1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlPUFRJT05BTCwKLQlyb2FtaW5nUmVzdHJpY3RlZEluU2dzbkR1ZVRvVW5zdXBwcG9ydGVkRmVhdHVyZSBbMTFdIE5VTEwJT1BUSU9OQUwsCi0JbHNhSW5mb3JtYXRpb25XaXRoZHJhdwlbMTJdIExTQUluZm9ybWF0aW9uV2l0aGRyYXcJT1BUSU9OQUwsCi0JZ21sYy1MaXN0V2l0aGRyYXcgCVsxM10JTlVMTAkJT1BUSU9OQUwsCi0JaXN0SW5mb3JtYXRpb25XaXRoZHJhdwlbMTRdIE5VTEwJCU9QVElPTkFMLAotCXNwZWNpZmljQ1NJLVdpdGhkcmF3CVsxNV0gU3BlY2lmaWNDU0ktV2l0aGRyYXcJT1BUSU9OQUwsCi0JY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3NXaXRoZHJhdwlbMTZdIE5VTEwJCU9QVElPTkFMLAotCXN0bi1zcldpdGhkcmF3CVsxN10gTlVMTAkJT1BUSU9OQUwsCi0JZXBzU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CVsxOF0gRVBTLVN1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlPUFRJT05BTCwKLQlhcG4tb2ktcmVwbGFjZW1lbnRXaXRoZHJhdwlbMTldIE5VTEwJCU9QVElPTkFMLAotCWNzZy1TdWJzY3JpcHRpb25EZWxldGVkCVsyMF0JTlVMTAkJT1BUSU9OQUwgfQotCi1TcGVjaWZpY0NTSS1XaXRoZHJhdyA6Oj0gQklUIFNUUklORyB7Ci0Jby1jc2kgKDApLAotCXNzLWNzaSAoMSksCi0JdGlmLWNzaSAoMiksCi0JZC1jc2kgKDMpLAotCXZ0LWNzaSAoNCksCi0JbW8tc21zLWNzaSAoNSksCi0JbS1jc2kgKDYpLAotCWdwcnMtY3NpICg3KSwKLQl0LWNzaSAoOCksCi0JbXQtc21zLWNzaSAoOSksCi0JbWctY3NpICgxMCksCi0Jby1JTS1DU0kgKDExKSwgCi0JZC1JTS1DU0kgKDEyKSwKLQl2dC1JTS1DU0kgKDEzKSB9IChTSVpFKDguLjMyKSkgCi0tLSBleGNlcHRpb24gaGFuZGxpbmc6Ci0tLSBiaXRzIDExIHRvIDMxIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYnkgYSBub24tSVAgTXVsdGltZWRpYSBDb3JlIE5ldHdvcmsgZW50aXR5LgotLS0gYml0cyAwLTEwIGFuZCAxNC0zMSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGJ5IGFuIElQIE11bHRpbWVkaWEgQ29yZSBOZXR3b3JrIGVudGl0eS4KLS0tIGJpdHMgMTEtMTMgYXJlIG9ubHkgYXBwbGljYWJsZSBpbiBhbiBJUCBNdWx0aW1lZGlhIENvcmUgTmV0d29yay4KLS0tIEJpdCA4IGFuZCBiaXRzIDExLTEzIGFyZSBvbmx5IGFwcGxpY2FibGUgZm9yIHRoZSBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24uCi0KLUdQUlNTdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcgOjo9IENIT0lDRSB7Ci0JYWxsR1BSU0RhdGEJTlVMTCwKLQljb250ZXh0SWRMaXN0CUNvbnRleHRJZExpc3R9Ci0KLUVQUy1TdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcgOjo9IENIT0lDRSB7Ci0JYWxsRVBTLURhdGEJTlVMTCwKLQljb250ZXh0SWRMaXN0CUNvbnRleHRJZExpc3R9Ci0KLUNvbnRleHRJZExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgotCQkJCUNvbnRleHRJZAotCi1MU0FJbmZvcm1hdGlvbldpdGhkcmF3IDo6PSBDSE9JQ0UgewotCWFsbExTQURhdGEJTlVMTCwKLQlsc2FJZGVudGl0eUxpc3QJTFNBSWRlbnRpdHlMaXN0IH0KLQotTFNBSWRlbnRpdHlMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkxTQXMpIE9GCi0JCQkJTFNBSWRlbnRpdHkKLQotQmFzaWNTZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VzKSBPRgotCQkJCUV4dC1CYXNpY1NlcnZpY2VDb2RlCi0KLW1heE51bU9mQmFzaWNTZXJ2aWNlcyAgSU5URUdFUiA6Oj0gNzAKLQotRGVsZXRlU3Vic2NyaWJlckRhdGFSZXMgOjo9IFNFUVVFTkNFIHsKLQlyZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCVswXSBSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1WbHJDYW1lbFN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKLQlvLUNTSQkJWzBdIE8tQ1NJCQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0Jc3MtQ1NJCQlbMl0gU1MtQ1NJCU9QVElPTkFMLAotCW8tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbNF0gTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QJT1BUSU9OQUwsCi0JdGlmLUNTSQkJWzNdIE5VTEwJT1BUSU9OQUwsCi0JbS1DU0kJCVs1XSBNLUNTSQlPUFRJT05BTCwKLQltby1zbXMtQ1NJCVs2XSBTTVMtQ1NJCU9QVElPTkFMLAotCXZ0LUNTSQkJWzddIFQtQ1NJCU9QVElPTkFMLAotCXQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVs4XSBULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKLQlkLUNTSQkJWzldIEQtQ1NJCU9QVElPTkFMLAotCW10LXNtcy1DU0kJWzEwXSBTTVMtQ1NJCU9QVElPTkFMLAotCW10LXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlbMTFdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTAotCX0KLQotTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi4gbWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCi0JTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEKLQotTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEgOjo9IFNFUVVFTkNFIHsKLQlzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50CVNNUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCi0JdHBkdS1UeXBlQ3JpdGVyaW9uCVswXQlUUERVLVR5cGVDcml0ZXJpb24JCU9QVElPTkFMLAotCS4uLiB9Ci0KLVRQRFUtVHlwZUNyaXRlcmlvbiA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZUUERVVHlwZXMpIE9GCi0JTVQtU01TLVRQRFUtVHlwZQotCi0KLW1heE51bU9mVFBEVVR5cGVzIElOVEVHRVIgOjo9IDUKLQotTVQtU01TLVRQRFUtVHlwZSA6Oj0gRU5VTUVSQVRFRCB7Ci0Jc21zLURFTElWRVIgCSgwKSwKLQlzbXMtU1VCTUlULVJFUE9SVCAJKDEpLAotCXNtcy1TVEFUVVMtUkVQT1JUIAkoMiksCi0JLi4uIH0KLQotLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgotLS0JRm9yIFRQRFUtVHlwZUNyaXRlcmlvbiBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQotLS0Jb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSAKLS0tCXRoZSB3aG9sZSBUUERVLVR5cGVDcml0ZXJpb24gc2VxdWVuY2UuCi0tLQlJbiBDQU1FTCBwaGFzZSA0LCBzbXMtU1VCTUlULVJFUE9SVCBzaGFsbCBub3QgYmUgdXNlZCBhbmQgYSByZWNlaXZlZCBUUERVLVR5cGVDcml0ZXJpb24KLS0tCXNlcXVlbmNlIGNvbnRhaW5pbmcgc21zLVNVQk1JVC1SRVBPUlQgc2hhbGwgYmUgd2hvbGx5IGlnbm9yZWQuCi0KLUQtQ1NJIDo6PSBTRVFVRU5DRSB7Ci0JZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CVswXSBEUC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCi0JY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCW5vdGlmaWNhdGlvblRvQ1NFCVszXQlOVUxMCQlPUFRJT05BTCwKLQljc2ktQWN0aXZlCVs0XQlOVUxMCQlPUFRJT05BTCwKLQkuLi59IAotLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBELUNTSSBpcyBzZW50IHRvIFZMUi9HTVNDLgotLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgotLS0JRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAotLS0JdGhlIEQtQ1NJIHNlcXVlbmNlLgotLS0JSWYgRC1DU0kgaXMgc2VnbWVudGVkLCB0aGVuIHRoZSBmaXJzdCBzZWdtZW50IHNoYWxsIGNvbnRhaW4gZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0Ci0tLQlhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcuIFN1YnNlcXVlbnQgc2VnbWVudHMgc2hhbGwgbm90IGNvbnRhaW4KLS0tCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nLCBidXQgbWF5IGNvbnRhaW4gZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0LgotCi1EUC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkRQLUFuYWx5c2VkSW5mb0NyaXRlcmlhKSBPRgotCQkJCURQLUFuYWx5c2VkSW5mb0NyaXRlcml1bQotCi1tYXhOdW1PZkRQLUFuYWx5c2VkSW5mb0NyaXRlcmlhIElOVEVHRVIgOjo9IDEwCi0KLURQLUFuYWx5c2VkSW5mb0NyaXRlcml1bSA6Oj0gU0VRVUVOQ0UgewotCWRpYWxsZWROdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAotCXNlcnZpY2VLZXkJU2VydmljZUtleSwKLQlnc21TQ0YtQWRkcmVzcwlJU0ROLUFkZHJlc3NTdHJpbmcsCi0JZGVmYXVsdENhbGxIYW5kbGluZwlEZWZhdWx0Q2FsbEhhbmRsaW5nLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1TUy1DU0kgOjo9IFNFUVVFTkNFIHsKLQlzcy1DYW1lbERhdGEJU1MtQ2FtZWxEYXRhLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCW5vdGlmaWNhdGlvblRvQ1NFCVswXQlOVUxMCQlPUFRJT05BTCwKLQljc2ktQWN0aXZlCVsxXQlOVUxMCQlPUFRJT05BTAotLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBTUy1DU0kgaXMgc2VudCB0byBWTFIuCi0tLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCi19Ci0KLVNTLUNhbWVsRGF0YSAgOjo9IFNFUVVFTkNFIHsKLQlzcy1FdmVudExpc3QJU1MtRXZlbnRMaXN0LAotCWdzbVNDRi1BZGRyZXNzCUlTRE4tQWRkcmVzc1N0cmluZywKLQlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwgCi0JLi4ufQotCi1TUy1FdmVudExpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsU1NFdmVudHMpIE9GIFNTLUNvZGUKLQktLSBBY3Rpb25zIGZvciB0aGUgZm9sbG93aW5nIFNTLUNvZGUgdmFsdWVzIGFyZSBkZWZpbmVkIGluIENBTUVMIFBoYXNlIDM6Ci0JLS0gZWN0CQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgotCS0tIG11bHRpUFRZCVNTLUNvZGUgOjo9ICcwMTAxMDAwMSdCCi0JLS0gY2QJCVNTLUNvZGUgOjo9ICcwMDEwMDEwMCdCCi0JLS0gY2NicwkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAwJ0IKLQktLSBhbGwgb3RoZXIgU1MgY29kZXMgc2hhbGwgYmUgaWdub3JlZAotCS0tIFdoZW4gU1MtQ1NJIGlzIHNlbnQgdG8gdGhlIFZMUiwgaXQgc2hhbGwgbm90IGNvbnRhaW4gYSBtYXJraW5nIGZvciBjY2JzLgotCS0tIElmIHRoZSBWTFIgcmVjZWl2ZXMgU1MtQ1NJIGNvbnRhaW5pbmcgYSBtYXJraW5nIGZvciBjY2JzLCB0aGUgVkxSIHNoYWxsIGRpc2NhcmQgdGhlCi0JLS0gY2NicyBtYXJraW5nIGluIFNTLUNTSS4KLQotbWF4TnVtT2ZDYW1lbFNTRXZlbnRzIElOVEVHRVIgOjo9IDEwCi0KLU8tQ1NJIDo6PSBTRVFVRU5DRSB7Ci0Jby1CY3NtQ2FtZWxURFBEYXRhTGlzdAlPLUJjc21DYW1lbFREUERhdGFMaXN0LAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVswXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKLQlub3RpZmljYXRpb25Ub0NTRQlbMV0JTlVMTAkJT1BUSU9OQUwsCi0JY3NpQWN0aXZlCQlbMl0JTlVMTAkJT1BUSU9OQUx9Ci0tLQlub3RpZmljYXRpb250b0NTRSBhbmQgY3NpQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gTy1DU0kgaXMgc2VudCB0byBWTFIvR01TQy4KLS0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KLS0tCU8tQ1NJIHNoYWxsIG5vdCBiZSBzZWdtZW50ZWQuCi0KLU8tQmNzbUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgotCU8tQmNzbUNhbWVsVERQRGF0YQotCS0tIE8tQmNzbUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgotCS0tIE8tQmNzbUNhbWVsVERQRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBvLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQuCi0JLS0gRm9yIENBTUVMIFBoYXNlIDIsIHRoaXMgbWVhbnMgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBPLUJjc21DYW1lbFREUERhdGEgaXMgYWxsb3dlZAotCS0tIHdpdGggby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IGJlaW5nIGVxdWFsIHRvIERQMi4KLQotbWF4TnVtT2ZDYW1lbFREUERhdGEgIElOVEVHRVIgOjo9IDEwCi0KLU8tQmNzbUNhbWVsVERQRGF0YSA6Oj0gU0VRVUVOQ0UgewotCW8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCi0Jc2VydmljZUtleQlTZXJ2aWNlS2V5LAotCWdzbVNDRi1BZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCi0JZGVmYXVsdENhbGxIYW5kbGluZwlbMV0gRGVmYXVsdENhbGxIYW5kbGluZywKLQlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4KLQl9Ci0KLVNlcnZpY2VLZXkgOjo9IElOVEVHRVIgKDAuLjIxNDc0ODM2NDcpCi0KLU8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7Ci0JY29sbGVjdGVkSW5mbyAoMiksCi0JLi4uLAotCXJvdXRlU2VsZWN0RmFpbHVyZSAoNCkgfQotCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKLQktLSBGb3IgTy1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55Ci0JLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCi0JLS0gTy1CY3NtQ2FtZWxURFBEYXRhc2VxdWVuY2UuIAotCS0tIEZvciBPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQotCS0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlCi0JLS0gTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgc2VxdWVuY2UuCi0KLU8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKLQlPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSAKLQotVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgotCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWEgCi0KLU8tQmNzbUNhbWVsVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7Ci0Jby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50CU8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwJCi0JZGVzdGluYXRpb25OdW1iZXJDcml0ZXJpYSAJWzBdIERlc3RpbmF0aW9uTnVtYmVyQ3JpdGVyaWEJT1BUSU9OQUwsCi0JYmFzaWNTZXJ2aWNlQ3JpdGVyaWEJWzFdIEJhc2ljU2VydmljZUNyaXRlcmlhCU9QVElPTkFMLAotCWNhbGxUeXBlQ3JpdGVyaWEJWzJdIENhbGxUeXBlQ3JpdGVyaWEJT1BUSU9OQUwsCi0JLi4uLAotCW8tQ2F1c2VWYWx1ZUNyaXRlcmlhCVszXSBPLUNhdXNlVmFsdWVDcml0ZXJpYQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCB9Ci0KLVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWEgOjo9IFNFUVVFTkNFIHsKLQl0LUJDU00tVHJpZ2dlckRldGVjdGlvblBvaW50CVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwJCi0JYmFzaWNTZXJ2aWNlQ3JpdGVyaWEJWzBdIEJhc2ljU2VydmljZUNyaXRlcmlhCU9QVElPTkFMLAotCXQtQ2F1c2VWYWx1ZUNyaXRlcmlhCVsxXSBULUNhdXNlVmFsdWVDcml0ZXJpYQlPUFRJT05BTCwKLQkuLi4gfQotCi1EZXN0aW5hdGlvbk51bWJlckNyaXRlcmlhICA6Oj0gU0VRVUVOQ0UgewotCW1hdGNoVHlwZQkJWzBdIE1hdGNoVHlwZSwKLQlkZXN0aW5hdGlvbk51bWJlckxpc3QgCVsxXSBEZXN0aW5hdGlvbk51bWJlckxpc3QJT1BUSU9OQUwsCi0JZGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0CVsyXSBEZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QJT1BUSU9OQUwsCi0JLS0gb25lIG9yIGJvdGggb2YgZGVzdGluYXRpb25OdW1iZXJMaXN0IGFuZCBkZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QgCi0JLS0gc2hhbGwgYmUgcHJlc2VudAotCS4uLn0KLQotRGVzdGluYXRpb25OdW1iZXJMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRQkoMS4ubWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVycykgT0YKLQkJCQlJU0ROLUFkZHJlc3NTdHJpbmcKLQktLSBUaGUgcmVjZWl2aW5nIGVudGl0eSBzaGFsbCBub3QgY2hlY2sgdGhlIGZvcm1hdCBvZiBhIG51bWJlciBpbgotCS0tIHRoZSBkaWFsbGVkIG51bWJlciBsaXN0Ci0KLURlc3RpbmF0aW9uTnVtYmVyTGVuZ3RoTGlzdCAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlckxlbmd0aHMpIE9GIAotCQkJCQlJTlRFR0VSKDEuLm1heE51bU9mSVNETi1BZGRyZXNzRGlnaXRzKQotCi1CYXNpY1NlcnZpY2VDcml0ZXJpYSAgIDo6PSBTRVFVRU5DRSBTSVpFKDEuLm1heE51bU9mQ2FtZWxCYXNpY1NlcnZpY2VDcml0ZXJpYSkgT0YKLQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQotCi1tYXhOdW1PZklTRE4tQWRkcmVzc0RpZ2l0cyAgSU5URUdFUiA6Oj0gMTUKLQotbWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVycyAgSU5URUdFUiA6Oj0gMTAKLQotbWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVyTGVuZ3RocyAgSU5URUdFUiA6Oj0gMwotCi1tYXhOdW1PZkNhbWVsQmFzaWNTZXJ2aWNlQ3JpdGVyaWEgIElOVEVHRVIgOjo9IDUKLQotQ2FsbFR5cGVDcml0ZXJpYSAgICAgICA6Oj0gRU5VTUVSQVRFRCB7Ci0JZm9yd2FyZGVkIAkoMCksCi0Jbm90Rm9yd2FyZGVkCSgxKX0KLQotTWF0Y2hUeXBlICAgICAgIDo6PSBFTlVNRVJBVEVEIHsKLQlpbmhpYml0aW5nIAkoMCksCi0JZW5hYmxpbmcJCSgxKX0KLQotTy1DYXVzZVZhbHVlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNBTUVMLU8tQ2F1c2VWYWx1ZUNyaXRlcmlhKSBPRgotCUNhdXNlVmFsdWUKLQotVC1DYXVzZVZhbHVlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNBTUVMLVQtQ2F1c2VWYWx1ZUNyaXRlcmlhKSBPRgotCUNhdXNlVmFsdWUKLQotbWF4TnVtT2ZDQU1FTC1PLUNhdXNlVmFsdWVDcml0ZXJpYSAgSU5URUdFUiA6Oj0gNQotCi1tYXhOdW1PZkNBTUVMLVQtQ2F1c2VWYWx1ZUNyaXRlcmlhICBJTlRFR0VSIDo6PSA1Ci0KLUNhdXNlVmFsdWUgOjo9IE9DVEVUIFNUUklORyAoU0laRSgxKSkKLS0tIFR5cGUgZXh0cmFjdGVkIGZyb20gQ2F1c2UgcGFyYW1ldGVyIGluIElUVS1UIFJlY29tbWVuZGF0aW9uIFEuNzYzLgotLS0gRm9yIHRoZSB1c2Ugb2YgY2F1c2UgdmFsdWUgcmVmZXIgdG8gSVRVLVQgUmVjb21tZW5kYXRpb24gUS44NTAuCi0KLURlZmF1bHRDYWxsSGFuZGxpbmcgOjo9IEVOVU1FUkFURUQgewotCWNvbnRpbnVlQ2FsbCAoMCkgLAotCXJlbGVhc2VDYWxsICgxKSAsCi0JLi4ufQotCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKLQktLSByZWNlcHRpb24gb2YgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAiY29udGludWVDYWxsIgotCS0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInJlbGVhc2VDYWxsIgotCi1DYW1lbENhcGFiaWxpdHlIYW5kbGluZyA6Oj0gSU5URUdFUigxLi4xNikgCi0JLS0gdmFsdWUgMSA9IENBTUVMIHBoYXNlIDEsCi0JLS0gdmFsdWUgMiA9IENBTUVMIHBoYXNlIDIsCi0JLS0gdmFsdWUgMyA9IENBTUVMIFBoYXNlIDMsCi0JLS0gdmFsdWUgNCA9IENBTUVMIHBoYXNlIDQ6Ci0JLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBncmVhdGVyIHRoYW4gNCBzaGFsbCBiZSB0cmVhdGVkIGFzIENBTUVMIHBoYXNlIDQuCi0KLVN1cHBvcnRlZENhbWVsUGhhc2VzIDo6PSBCSVQgU1RSSU5HIHsKLQlwaGFzZTEgKDApLAotCXBoYXNlMiAoMSksCi0JcGhhc2UzICgyKSwKLQlwaGFzZTQgKDMpfSAoU0laRSAoMS4uMTYpKSAKLS0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBDQU1FTCBQaGFzZXMgaXQgc3VwcG9ydHMuCi0tLSBPdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgotCi1PZmZlcmVkQ2FtZWw0Q1NJcyA6Oj0gQklUIFNUUklORyB7IAkKLQlvLWNzaQkJKDApLAotCWQtY3NpCQkoMSksCi0JdnQtY3NpCQkoMiksCi0JdC1jc2kJCSgzKSwKLQltdC1zbXMtY3NpCSg0KSwKLQltZy1jc2kJCSg1KSwKLQlwc2ktZW5oYW5jZW1lbnRzCSg2KSAKLX0gKFNJWkUgKDcuLjE2KSkKLS0tIEEgbm9kZSBzdXBwb3J0aW5nIENhbWVsIHBoYXNlIDQgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ2FtZWw0IENTSXMgCi0tLSBpdCBvZmZlcnMuCi0tLSBPdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgotCi1PZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzIDo6PSBCSVQgU1RSSU5HIHsgCQotCWluaXRpYXRlQ2FsbEF0dGVtcHQJKDApLAotCXNwbGl0TGVnCQkoMSksCi0JbW92ZUxlZwkJKDIpLAotCWRpc2Nvbm5lY3RMZWcJKDMpLAotCWVudGl0eVJlbGVhc2VkCSg0KSwKLQlkZmMtV2l0aEFyZ3VtZW50CSg1KSwKLQlwbGF5VG9uZQkJKDYpLAotCWR0bWYtTWlkQ2FsbAkoNyksCi0JY2hhcmdpbmdJbmRpY2F0b3IJKDgpLAotCWFsZXJ0aW5nRFAJKDkpLAotCWxvY2F0aW9uQXRBbGVydGluZwkoMTApLAotCWNoYW5nZU9mUG9zaXRpb25EUAkoMTEpLAotCW9yLUludGVyYWN0aW9ucwkoMTIpLAotCXdhcm5pbmdUb25lRW5oYW5jZW1lbnRzCSgxMyksCi0JY2YtRW5oYW5jZW1lbnRzCSgxNCksCi0Jc3Vic2NyaWJlZEVuaGFuY2VkRGlhbGxlZFNlcnZpY2VzIAkoMTUpLAotCXNlcnZpbmdOZXR3b3JrRW5oYW5jZWREaWFsbGVkU2VydmljZXMgKDE2KSwKLQljcml0ZXJpYUZvckNoYW5nZU9mUG9zaXRpb25EUAkoMTcpLAotCXNlcnZpY2VDaGFuZ2VEUAkoMTgpLAotCWNvbGxlY3RJbmZvcm1hdGlvbgkoMTkpCi19IChTSVpFICgxNS4uNjQpKQotLS0gQSBub2RlIHN1cHBvcnRpbmcgQ2FtZWwgcGhhc2UgNCBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBDQU1FTDQgCi0tLSBmdW5jdGlvbmFsaXRpZXMgaXQgb2ZmZXJzLgotLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KLQotU01TLUNTSSA6Oj0gU0VRVUVOQ0UgewotCXNtcy1DQU1FTC1URFAtRGF0YUxpc3QJWzBdIFNNUy1DQU1FTC1URFAtRGF0YUxpc3QJT1BUSU9OQUwsCi0JY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCW5vdGlmaWNhdGlvblRvQ1NFCVszXSBOVUxMCQlPUFRJT05BTCwKLQljc2ktQWN0aXZlCVs0XSBOVUxMCQlPUFRJT05BTCwKLQkuLi59Ci0tLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudAotLS0Jd2hlbiBNTy1TTVMtQ1NJIG9yIE1ULVNNUy1DU0kgaXMgc2VudCB0byBWTFIgb3IgU0dTTi4KLS0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KLS0tCVNNUy1DQU1FTC1URFAtRGF0YSBhbmQgIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIHByZXNlbnQgaW4gCi0tLQl0aGUgU01TLUNTSSBzZXF1ZW5jZS4KLS0tCUlmIFNNUy1DU0kgaXMgc2VnbWVudGVkLCBzbXMtQ0FNRUwtVERQLURhdGFMaXN0IGFuZCBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSAKLS0tCXByZXNlbnQgaW4gdGhlIGZpcnN0IHNlZ21lbnQKLQotU01TLUNBTUVMLVREUC1EYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCi0JU01TLUNBTUVMLVREUC1EYXRhCi0tLQlTTVMtQ0FNRUwtVERQLURhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKLS0tCVNNUy1DQU1FTC1URFAtRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50LgotCi1TTVMtQ0FNRUwtVERQLURhdGEgOjo9IFNFUVVFTkNFIHsKLQlzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50CVswXSBTTVMtVHJpZ2dlckRldGVjdGlvblBvaW50LAotCXNlcnZpY2VLZXkJWzFdIFNlcnZpY2VLZXksCi0JZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKLQlkZWZhdWx0U01TLUhhbmRsaW5nCVszXSBEZWZhdWx0U01TLUhhbmRsaW5nLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLgotCX0KLQotU01TLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7Ci0Jc21zLUNvbGxlY3RlZEluZm8gKDEpLAotCS4uLiwKLQlzbXMtRGVsaXZlcnlSZXF1ZXN0ICgyKQotCX0KLS0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKLS0tCUZvciBTTVMtQ0FNRUwtVERQLURhdGEgYW5kIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgCi0tLQlwYXJhbWV0ZXIgd2l0aCBhbnkgb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZQotLS0JdGhlIHdob2xlIHNlcXVlbmNlLgotLS0KLS0tCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHJlY2VpdmVkIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gc21zLUNvbGxlY3RlZEluZm8KLS0tCWluIGFuIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZSBjb250YWluZWQgaW4gbW8tc21zLUNTSSwgdGhlbiB0aGUgcmVjZWl2ZXIgc2hhbGwKLS0tCWlnbm9yZSB0aGUgd2hvbGUgU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlLgotLS0KLS0tCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHJlY2VpdmVkIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gc21zLURlbGl2ZXJ5UmVxdWVzdAotLS0JaW4gYW4gU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlIGNvbnRhaW5lZCBpbiBtdC1zbXMtQ1NJIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCi0tLQlpZ25vcmUgdGhlIHdob2xlIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZS4KLS0tCi0tLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1EZWxpdmVyeVJlcXVlc3QKLS0tCWluIGFuIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCi0tLQlpZ25vcmUgdGhlIHdob2xlIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlLgotCi1EZWZhdWx0U01TLUhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKLQljb250aW51ZVRyYW5zYWN0aW9uICgwKSAsCi0JcmVsZWFzZVRyYW5zYWN0aW9uICgxKSAsCi0JLi4ufQotLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgotLS0JcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlVHJhbnNhY3Rpb24iCi0tLQlyZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlVHJhbnNhY3Rpb24iCi0KLU0tQ1NJIDo6PSBTRVFVRU5DRSB7Ci0JbW9iaWxpdHlUcmlnZ2VycwlNb2JpbGl0eVRyaWdnZXJzLAotCXNlcnZpY2VLZXkJU2VydmljZUtleSwKLQlnc21TQ0YtQWRkcmVzcwlbMF0JSVNETi1BZGRyZXNzU3RyaW5nLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCW5vdGlmaWNhdGlvblRvQ1NFCVsyXSBOVUxMCQlPUFRJT05BTCwKLQljc2ktQWN0aXZlCVszXSBOVUxMCQlPUFRJT05BTCwKLQkuLi59Ci0tLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE0tQ1NJIGlzIHNlbnQgdG8gVkxSLgotLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgotCi1NRy1DU0kgOjo9IFNFUVVFTkNFIHsKLQltb2JpbGl0eVRyaWdnZXJzCU1vYmlsaXR5VHJpZ2dlcnMsCi0Jc2VydmljZUtleQlTZXJ2aWNlS2V5LAotCWdzbVNDRi1BZGRyZXNzCVswXQlJU0ROLUFkZHJlc3NTdHJpbmcsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0Jbm90aWZpY2F0aW9uVG9DU0UJWzJdIE5VTEwJCU9QVElPTkFMLAotCWNzaS1BY3RpdmUJWzNdIE5VTEwJCU9QVElPTkFMLAotCS4uLn0KLS0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gTUctQ1NJIGlzIHNlbnQgdG8gU0dTTi4KLS0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KLQotTW9iaWxpdHlUcmlnZ2VycyAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTW9iaWxpdHlUcmlnZ2VycykgT0YKLQlNTS1Db2RlCi0KLW1heE51bU9mTW9iaWxpdHlUcmlnZ2VycyBJTlRFR0VSIDo6PSAxMAotCi1NTS1Db2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQotLS0JVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBNb2JpbGl0eSBNYW5hZ2VtZW50IGV2ZW50LgotLS0JQWN0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBNTS1Db2RlIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBDQU1FTCBQaGFzZSA0OgotLS0KLS0tCUNTIGRvbWFpbiBNTSBldmVudHM6Ci0tLQlMb2NhdGlvbi11cGRhdGUtaW4tc2FtZS1WTFIJTU0tQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKLS0tCUxvY2F0aW9uLXVwZGF0ZS10by1vdGhlci1WTFIJTU0tQ29kZSA6Oj0gJzAwMDAwMDAxJ0IKLS0tCUlNU0ktQXR0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDAxMCdCCi0tLQlNUy1pbml0aWF0ZWQtSU1TSS1EZXRhY2gJTU0tQ29kZSA6Oj0gJzAwMDAwMDExJ0IKLS0tCU5ldHdvcmstaW5pdGlhdGVkLUlNU0ktRGV0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDEwMCdCCi0tLQotLS0JUFMgZG9tYWluIE1NIGV2ZW50czoKLS0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLWluLXNhbWUtU0dTTglNTS1Db2RlIDo6PSAnMTAwMDAwMDAnQgotLS0JUm91dGVpbmctQXJlYS11cGRhdGUtdG8tb3RoZXItU0dTTi11cGRhdGUtZnJvbS1uZXctU0dTTgotLS0JCQkJTU0tQ29kZSA6Oj0gJzEwMDAwMDAxJ0IKLS0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLXRvLW90aGVyLVNHU04tZGlzY29ubmVjdC1ieS1kZXRhY2gKLS0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDAxMCdCCi0tLQlHUFJTLUF0dGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAwMTEnQgotLS0JTVMtaW5pdGlhdGVkLUdQUlMtRGV0YWNoCU1NLUNvZGUgOjo9ICcxMDAwMDEwMCdCCi0tLQlOZXR3b3JrLWluaXRpYXRlZC1HUFJTLURldGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAxMDEnQiAKLS0tCU5ldHdvcmstaW5pdGlhdGVkLXRyYW5zZmVyLXRvLU1TLW5vdC1yZWFjaGFibGUtZm9yLXBhZ2luZwotLS0JCQkJTU0tQ29kZSA6Oj0gJzEwMDAwMTEwJ0IKLS0tCi0tLQlJZiB0aGUgTVNDIHJlY2VpdmVzIGFueSBvdGhlciBNTS1jb2RlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUKLS0tCUNTIGRvbWFpbiwgdGhlbiB0aGUgTVNDIHNoYWxsIGlnbm9yZSB0aGF0IE1NLWNvZGUuCi0tLQlJZiB0aGUgU0dTTiByZWNlaXZlcyBhbnkgb3RoZXIgTU0tY29kZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlCi0tLQlQUyBkb21haW4sIHRoZW4gdGhlIFNHU04gc2hhbGwgaWdub3JlIHRoYXQgTU0tY29kZS4KLQotVC1DU0kgOjo9IFNFUVVFTkNFIHsKLQl0LUJjc21DYW1lbFREUERhdGFMaXN0CVQtQmNzbUNhbWVsVERQRGF0YUxpc3QsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzBdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAotCW5vdGlmaWNhdGlvblRvQ1NFCVsxXSBOVUxMCQlPUFRJT05BTCwKLQljc2ktQWN0aXZlCVsyXSBOVUxMCQlPUFRJT05BTH0KLS0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gVlQtQ1NJL1QtQ1NJIGlzIHNlbnQKLS0tCXRvIFZMUi9HTVNDLgotLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgotLS0JVC1DU0kgc2hhbGwgbm90IGJlIHNlZ21lbnRlZC4KLQotVC1CY3NtQ2FtZWxURFBEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCi0JVC1CY3NtQ2FtZWxURFBEYXRhCi0JLS0tIFQtQmNzbUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgotCS0tLSBULUJjc21DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3IgdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LgotCS0tLSBGb3IgQ0FNRUwgUGhhc2UgMiwgdGhpcyBtZWFucyB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIFQtQmNzbUNhbWVsVERQRGF0YSBpcyBhbGxvd2VkCi0JLS0tIHdpdGggdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IGJlaW5nIGVxdWFsIHRvIERQMTIuIAotCS0tLSBGb3IgQ0FNRUwgUGhhc2UgMywgbW9yZSBURFCScyBhcmUgYWxsb3dlZC4KLQotVC1CY3NtQ2FtZWxURFBEYXRhIDo6PSBTRVFVRU5DRSB7Ci0JdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50CVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKLQlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCi0JZ3NtU0NGLUFkZHJlc3MJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKLQlkZWZhdWx0Q2FsbEhhbmRsaW5nCVsxXSBEZWZhdWx0Q2FsbEhhbmRsaW5nLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotVC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IDo6PSBFTlVNRVJBVEVEIHsKLQl0ZXJtQXR0ZW1wdEF1dGhvcml6ZWQgKDEyKSwKLQkuLi4gLAotCXRCdXN5ICgxMyksCi0JdE5vQW5zd2VyICgxNCl9Ci0JLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgotCS0tIEZvciBULUJjc21DYW1lbFREUERhdGEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkgb3RoZXIKLQktLSB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSwgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUKLQktLSBULUJjc21DYW1lbFREUERhdGEgc2VxdWVuY2UuCi0KLS0tIGdwcnMgbG9jYXRpb24gaW5mb3JtYXRpb24gcmV0cmlldmFsIHR5cGVzCi0KLVNlbmRSb3V0aW5nSW5mb0ZvckdwcnNBcmcgOjo9IFNFUVVFTkNFIHsKLQlpbXNpCQkJCVswXSBJTVNJLAotCWdnc24tQWRkcmVzcwkJWzFdIEdTTi1BZGRyZXNzCU9QVElPTkFMLCAKLQlnZ3NuLU51bWJlcgkJWzJdCUlTRE4tQWRkcmVzc1N0cmluZywKLQlleHRlbnNpb25Db250YWluZXIJCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1TZW5kUm91dGluZ0luZm9Gb3JHcHJzUmVzIDo6PSBTRVFVRU5DRSB7Ci0Jc2dzbi1BZGRyZXNzCQlbMF0gR1NOLUFkZHJlc3MsCi0JZ2dzbi1BZGRyZXNzCQlbMV0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCi0JbW9iaWxlTm90UmVhY2hhYmxlUmVhc29uCQlbMl0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotLS0gZmFpbHVyZSByZXBvcnQgdHlwZXMKLQotRmFpbHVyZVJlcG9ydEFyZyA6Oj0gU0VRVUVOQ0UgewotCWltc2kJCQkJWzBdIElNU0ksCi0JZ2dzbi1OdW1iZXIJCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJLAotCWdnc24tQWRkcmVzcwkJWzJdIEdTTi1BZGRyZXNzCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUZhaWx1cmVSZXBvcnRSZXMgOjo9IFNFUVVFTkNFIHsKLQlnZ3NuLUFkZHJlc3MJCVswXSBHU04tQWRkcmVzcwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi0tLSBncHJzIG5vdGlmaWNhdGlvbiB0eXBlcwotCi1Ob3RlTXNQcmVzZW50Rm9yR3Byc0FyZyA6Oj0gU0VRVUVOQ0UgewotCWltc2kJCQkJWzBdIElNU0ksCi0Jc2dzbi1BZGRyZXNzCQlbMV0gR1NOLUFkZHJlc3MsCi0JZ2dzbi1BZGRyZXNzCQlbMl0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotTm90ZU1zUHJlc2VudEZvckdwcnNSZXMgOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi0tLSBmYXVsdCByZWNvdmVyeSB0eXBlcwotCi1SZXNldEFyZyA6Oj0gU0VRVUVOQ0UgewotCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAotCWhsci1MaXN0CQlITFItTGlzdAkJT1BUSU9OQUwsCi0JLi4ufQotCi1SZXN0b3JlRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgewotCWltc2kJCQlJTVNJLAotCWxtc2kJCQlMTVNJCQkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gLAotCXZsci1DYXBhYmlsaXR5CVs2XSBWTFItQ2FwYWJpbGl0eQlPUFRJT05BTCB9Ci0KLVJlc3RvcmVEYXRhUmVzIDo6PSBTRVFVRU5DRSB7Ci0JaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCi0JbXNOb3RSZWFjaGFibGUJTlVMTAkJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi0tLSBWQlMvVkdDUyB0eXBlcwotVkJTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVkJTR3JvdXBJZHMpIE9GCi0JCQkJVm9pY2VCcm9hZGNhc3REYXRhCi0KLVZHQ1NEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZWR0NTR3JvdXBJZHMpIE9GCi0JCQkJVm9pY2VHcm91cENhbGxEYXRhCi0KLW1heE51bU9mVkJTR3JvdXBJZHMgIElOVEVHRVIgOjo9IDUwCi0KLW1heE51bU9mVkdDU0dyb3VwSWRzICBJTlRFR0VSIDo6PSA1MAotCi1Wb2ljZUdyb3VwQ2FsbERhdGEgIDo6PSBTRVFVRU5DRSB7Ci0JZ3JvdXBJZAkJR3JvdXBJZCwgCi0JLS0gZ3JvdXBJZCBzaGFsbCBiZSBmaWxsZWQgd2l0aCBzaXggVEJDRCBmaWxsZXJzICgxMTExKWlmIHRoZSBsb25nR3JvdXBJZCBpcyBwcmVzZW50ICAKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQlhZGRpdGlvbmFsU3Vic2NyaXB0aW9ucwlBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucwlPUFRJT05BTCwKLQlhZGRpdGlvbmFsSW5mbwlbMF0gQWRkaXRpb25hbEluZm8JT1BUSU9OQUwsCi0JbG9uZ0dyb3VwSWQJWzFdIExvbmctR3JvdXBJZAlPUFRJT05BTCB9Ci0KLQktLSBWb2ljZUdyb3VwQ2FsbERhdGEgY29udGFpbmluZyBhIGxvbmdHcm91cElkIHNoYWxsIG5vdCBiZSBzZW50IHRvIFZMUnMgdGhhdCBkaWQgbm90Ci0JLS0gaW5kaWNhdGUgc3VwcG9ydCBvZiBsb25nIEdyb3VwIElEcyB3aXRoaW4gdGhlIFVwZGF0ZSBMb2NhdGlvbiBvciBSZXN0b3JlIERhdGEgCi0JLS0gcmVxdWVzdCBtZXNzYWdlCi0KLUFkZGl0aW9uYWxJbmZvIDo6PSBCSVQgU1RSSU5HIChTSVpFICgxLi4xMzYpKQotLS0JIFJlZmVycyB0byBBZGRpdGlvbmFsIEluZm8gYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgNDMuMDY4IAotCi1BZGRpdGlvbmFsU3Vic2NyaXB0aW9ucyA6Oj0gQklUIFNUUklORyB7Ci0JcHJpdmlsZWdlZFVwbGlua1JlcXVlc3QgKDApLAotCWVtZXJnZW5jeVVwbGlua1JlcXVlc3QgKDEpLAotCWVtZXJnZW5jeVJlc2V0ICgyKX0gKFNJWkUgKDMuLjgpKQotLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0KLVZvaWNlQnJvYWRjYXN0RGF0YSA6Oj0gU0VRVUVOQ0UgewotCWdyb3VwaWQJCUdyb3VwSWQsIAotCS0tIGdyb3VwSWQgc2hhbGwgYmUgZmlsbGVkIHdpdGggc2l4IFRCQ0QgZmlsbGVycyAoMTExMSlpZiB0aGUgbG9uZ0dyb3VwSWQgaXMgcHJlc2VudAotCWJyb2FkY2FzdEluaXRFbnRpdGxlbWVudAlOVUxMCQkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JbG9uZ0dyb3VwSWQJWzBdIExvbmctR3JvdXBJZAlPUFRJT05BTCB9Ci0JCi0tLSBWb2ljZUJyb2FkY2FzdERhdGEgY29udGFpbmluZyBhIGxvbmdHcm91cElkIHNoYWxsIG5vdCBiZSBzZW50IHRvIFZMUnMgdGhhdCBkaWQgbm90Ci0tLSBpbmRpY2F0ZSBzdXBwb3J0IG9mIGxvbmcgR3JvdXAgSURzIHdpdGhpbiB0aGUgVXBkYXRlIExvY2F0aW9uIG9yIFJlc3RvcmUgRGF0YSAKLQktLSByZXF1ZXN0IG1lc3NhZ2UKLQotR3JvdXBJZCAgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgzKSkKLQktLSBXaGVuIEdyb3VwLUlkIGlzIGxlc3MgdGhhbiBzaXggY2hhcmFjdGVycyBpbiBsZW5ndGgsIHRoZSBUQkNEIGZpbGxlciAoMTExMSkKLQktLSBpcyB1c2VkIHRvIGZpbGwgdW51c2VkIGhhbGYgb2N0ZXRzLgotCS0tIFJlZmVycyB0byB0aGUgR3JvdXAgSWRlbnRpZmljYXRpb24gYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgMjMuMDAzIAotCS0tIGFuZCAzR1BQIFRTIDQzLjA2OC8gNDMuMDY5Ci0KLUxvbmctR3JvdXBJZCAgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICg0KSkKLQktLSBXaGVuIExvbmctR3JvdXAtSWQgaXMgbGVzcyB0aGFuIGVpZ2h0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLCB0aGUgVEJDRCBmaWxsZXIgKDExMTEpCi0JLS0gaXMgdXNlZCB0byBmaWxsIHVudXNlZCBoYWxmIG9jdGV0cy4KLQktLSBSZWZlcnMgdG8gdGhlIEdyb3VwIElkZW50aWZpY2F0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAwMyAKLQktLSBhbmQgM0dQUCBUUyA0My4wNjgvIDQzLjA2OQotCi0KLS0tIHByb3ZpZGUgc3Vic2NyaWJlciBpbmZvIHR5cGVzCi0KLVByb3ZpZGVTdWJzY3JpYmVySW5mb0FyZyA6Oj0gU0VRVUVOQ0UgewotCWltc2kJCVswXSBJTVNJLAotCWxtc2kJCVsxXSBMTVNJCU9QVElPTkFMLAotCXJlcXVlc3RlZEluZm8JWzJdIFJlcXVlc3RlZEluZm8sCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCWNhbGxQcmlvcml0eQlbNF0JRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwKLQl9Ci0KLVByb3ZpZGVTdWJzY3JpYmVySW5mb1JlcyA6Oj0gU0VRVUVOQ0UgewotCXN1YnNjcmliZXJJbmZvCVN1YnNjcmliZXJJbmZvLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1TdWJzY3JpYmVySW5mbyA6Oj0gU0VRVUVOQ0UgewotCWxvY2F0aW9uSW5mb3JtYXRpb24JWzBdIExvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCi0Jc3Vic2NyaWJlclN0YXRlCVsxXSBTdWJzY3JpYmVyU3RhdGUJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uICwKLQlsb2NhdGlvbkluZm9ybWF0aW9uR1BSUwlbM10gTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJT1BUSU9OQUwsCi0JcHMtU3Vic2NyaWJlclN0YXRlCVs0XSBQUy1TdWJzY3JpYmVyU3RhdGUJT1BUSU9OQUwsCi0JaW1laQkJCVs1XSBJTUVJCQlPUFRJT05BTCwKLQltcy1DbGFzc21hcmsyCVs2XSBNUy1DbGFzc21hcmsyCU9QVElPTkFMLAotCWdwcnMtTVMtQ2xhc3MJWzddIEdQUlNNU0NsYXNzCU9QVElPTkFMLAotCW1ucEluZm9SZXMJWzhdIE1OUEluZm9SZXMJT1BUSU9OQUwgfQotCi0tLQlJZiB0aGUgSExSIHJlY2VpdmVzIGxvY2F0aW9uSW5mb3JtYXRpb24sIHN1YnNjcmliZXJTdGF0ZSBvciBtcy1DbGFzc21hcmsyIGZyb20gYW4gU0dTTgotLS0JaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgotLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBsb2NhdGlvbkluZm9ybWF0aW9uR1BSUywgcHMtU3Vic2NyaWJlclN0YXRlIG9yIGdwcnMtTVMtQ2xhc3MgZnJvbQotLS0JYSBWTFIgaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgotLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBwYXJhbWV0ZXJzIHdoaWNoIGl0IGhhcyBub3QgcmVxdWVzdGVkLCBpdCBzaGFsbCBkaXNjYXJkIHRoZW0uCi0KLU1OUEluZm9SZXMgOjo9IFNFUVVFTkNFIHsKLQlyb3V0ZWluZ051bWJlcglbMF0gUm91dGVpbmdOdW1iZXIgCU9QVElPTkFMLAotCWltc2kJCQlbMV0gSU1TSQkJT1BUSU9OQUwsCi0JbXNpc2RuCQlbMl0gSVNETi1BZGRyZXNzU3RyaW5nIAlPUFRJT05BTCwKLQludW1iZXJQb3J0YWJpbGl0eVN0YXR1cwlbM10gTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uIH0KLS0tCVRoZSBJTVNJIHBhcmFtZXRlciBjb250YWlucyBhIGdlbmVyaWMgSU1TSSwgaS5lLiBpdCBpcyBub3QgdGllZCBuZWNlc3NhcmlseSB0byB0aGUgCi0tLQlTdWJzY3JpYmVyLiBNQ0MgYW5kIE1OQyB2YWx1ZXMgaW4gdGhpcyBJTVNJIHNoYWxsIHBvaW50IHRvIHRoZSBTdWJzY3JpcHRpb24gTmV0d29yayBvZiAKLS0tCXRoZSBTdWJzY3JpYmVyLiBTZWUgM0dQUCBUUyAyMy4wNjYgWzEwOF0uCi0KLVJvdXRlaW5nTnVtYmVyIDo6PSBUQkNELVNUUklORyAoU0laRSAoMS4uNSkpCi0KLQotTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMgOjo9IEVOVU1FUkFURUQgewotCW5vdEtub3duVG9CZVBvcnRlZAkoMCksCi0Jb3duTnVtYmVyUG9ydGVkT3V0CSgxKSwKLQlmb3JlaWduTnVtYmVyUG9ydGVkVG9Gb3JlaWduTmV0d29yawkoMiksCi0JLi4uLAotCW93bk51bWJlck5vdFBvcnRlZE91dAkoNCksCi0JZm9yZWlnbk51bWJlclBvcnRlZEluCSg1KQotCX0KLQktLQlleGNlcHRpb24gaGFuZGxpbmc6IAotCS0tICByZWNlcHRpb24gb2Ygb3RoZXIgdmFsdWVzIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIAotCS0tICB3aG9sZSBOdW1iZXJQb3J0YWJpbGl0eVN0YXR1czsKLQktLSAgb3duTnVtYmVyTm90UG9ydGVkT3V0IG9yIGZvcmVpZ25OdW1iZXJQb3J0ZWRJbiBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBbnkgVGltZSAKLQktLSAgSW50ZXJyb2dhdGlvbiBtZXNzYWdlLgotCi1NUy1DbGFzc21hcmsyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQotCS0tIFRoaXMgcGFyYW1ldGVyIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIE1TIENsYXNzbWFyayAyIElFIGRlZmluZWQgaW4gCi0JLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KLQotR1BSU01TQ2xhc3MgOjo9IFNFUVVFTkNFIHsKLQltU05ldHdvcmtDYXBhYmlsaXR5CVswXSBNU05ldHdvcmtDYXBhYmlsaXR5LAotCW1TUmFkaW9BY2Nlc3NDYXBhYmlsaXR5CVsxXSBNU1JhZGlvQWNjZXNzQ2FwYWJpbGl0eQlPUFRJT05BTAotCX0KLQotTVNOZXR3b3JrQ2FwYWJpbGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi44KSkKLQktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBOZXR3b3JrIENhcGFiaWxpdHkgSUUgZGVmaW5lZCBpbiAKLQktLSAzR1BQIFRTIDI0LjAwOCBbMzVdLgotCQotTVNSYWRpb0FjY2Vzc0NhcGFiaWxpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNTApKQotCS0tIFRoaXMgcGFyYW1ldGVyIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIE1TIFJhZGlvIEFjY2VzcyBDYXBhYmlsaXR5IElFIGRlZmluZWQgaW4KLQktLSAzR1BQIFRTIDI0LjAwOCBbMzVdLgotCi1SZXF1ZXN0ZWRJbmZvIDo6PSBTRVFVRU5DRSB7Ci0JbG9jYXRpb25JbmZvcm1hdGlvbglbMF0gTlVMTAkJT1BUSU9OQUwsCi0Jc3Vic2NyaWJlclN0YXRlCVsxXSBOVUxMCQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sIAotCWN1cnJlbnRMb2NhdGlvbglbM10gTlVMTAkJT1BUSU9OQUwsCi0JcmVxdWVzdGVkRG9tYWluCVs0XSBEb21haW5UeXBlCU9QVElPTkFMLAotCWltZWkJCQlbNl0gTlVMTAkJT1BUSU9OQUwsCi0JbXMtY2xhc3NtYXJrCVs1XSBOVUxMCQlPUFRJT05BTCwKLQltbnBSZXF1ZXN0ZWRJbmZvCVs3XSBOVUxMIAkJT1BUSU9OQUwgfQotCi0tLQljdXJyZW50TG9jYXRpb24gc2hhbGwgYmUgYWJzZW50IGlmIGxvY2F0aW9uSW5mb3JtYXRpb24gaXMgYWJzZW50Ci0KLURvbWFpblR5cGUgOjo9ICBFTlVNRVJBVEVEIHsKLQljcy1Eb21haW4JCSgwKSwKLQlwcy1Eb21haW4JCSgxKSwKLQkuLi59Ci0tLSBleGNlcHRpb24gaGFuZGxpbmc6Ci0tLSByZWNlcHRpb24gb2YgdmFsdWVzID4gMSBzaGFsbCBiZSBtYXBwZWQgdG8gJ2NzLURvbWFpbicKLQotTG9jYXRpb25JbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgewotCWFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCi0JZ2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JWzBdIEdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAotCXZsci1udW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQlsb2NhdGlvbk51bWJlcglbMl0gTG9jYXRpb25OdW1iZXIJT1BUSU9OQUwsCi0JY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJWzNdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiAsCi0Jc2VsZWN0ZWRMU0EtSWQJWzVdIExTQUlkZW50aXR5CU9QVElPTkFMLAotCW1zYy1OdW1iZXIJWzZdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQlnZW9kZXRpY0luZm9ybWF0aW9uCVs3XSBHZW9kZXRpY0luZm9ybWF0aW9uCU9QVElPTkFMLCAKLQljdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQJWzhdIE5VTEwJCU9QVElPTkFMLAotCXNhaS1QcmVzZW50CVs5XSBOVUxMCQlPUFRJT05BTCB9Ci0tLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgcGFyYW1ldGVyIGNvbnRhaW5zCi0tLSBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KLS0tIGN1cnJlbnRMb2NhdGlvblJldHJpZXZlZCBzaGFsbCBiZSBwcmVzZW50IAotLS0gaWYgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdlcmUgcmV0cmlldmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bGwgcGFnaW5nLgotCi1Mb2NhdGlvbkluZm9ybWF0aW9uR1BSUyA6Oj0gU0VRVUVOQ0UgewotCWNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCVswXSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSBPUFRJT05BTCwKLQlyb3V0ZWluZ0FyZWFJZGVudGl0eQlbMV0gUkFJZGVudGl0eQlPUFRJT05BTCwKLQlnZW9ncmFwaGljYWxJbmZvcm1hdGlvbglbMl0gR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCi0Jc2dzbi1OdW1iZXIJWzNdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQlzZWxlY3RlZExTQUlkZW50aXR5CVs0XSBMU0FJZGVudGl0eQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzVdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0Jc2FpLVByZXNlbnQJWzZdIE5VTEwJCU9QVElPTkFMLAotCWdlb2RldGljSW5mb3JtYXRpb24JWzddIEdlb2RldGljSW5mb3JtYXRpb24JT1BUSU9OQUwsCi0JY3VycmVudExvY2F0aW9uUmV0cmlldmVkCVs4XSBOVUxMCQlPUFRJT05BTCwKLQlhZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JWzldIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCB9Ci0tLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgcGFyYW1ldGVyIGNvbnRhaW5zCi0tLSBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KLS0tIGN1cnJlbnRMb2NhdGlvblJldHJpZXZlZCBzaGFsbCBiZSBwcmVzZW50IGlmIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgotLS0gd2FzIHJldHJpZXZlZCBhZnRlciBzdWNjZXNzZnVsIHBhZ2luZy4KLQotUkFJZGVudGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg2KSkKLS0tIFJvdXRpbmcgQXJlYSBJZGVudGl0eSBpcyBjb2RlZCBpbiBhY2NvcmRhbmNlIHdpdGggM0dQUCBUUyAyOS4wNjAgWzEwNV0uCi0tLSBJdCBzaGFsbCBjb250YWluIHRoZSB2YWx1ZSBwYXJ0IGRlZmluZWQgaW4gM0dQUCBUUyAyOS4wNjAgb25seS4gSS5lLiB0aGUgM0dQUCBUUyAyOS4wNjAKLS0tIHR5cGUgaWRlbnRpZmllciBvY3RldCBzaGFsbCBub3QgYmUgaW5jbHVkZWQuCi0KLQotR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoOCkpCi0tLQlSZWZlcnMgdG8gZ2VvZ3JhcGhpY2FsIEluZm9ybWF0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCi0tLQlPbmx5IHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKLS0tCWFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAzMiBpcyBhbGxvd2VkIHRvIGJlIHVzZWQKLS0tCVRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDMyIGlzIGFzIGZvbGxvd3M6Ci0tLQkJVHlwZSBvZiBzaGFwZSAoZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlKQkxIG9jdGV0Ci0tLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cwotLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCi0tLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0Ci0KLUdlb2RldGljSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTApKQotLS0JUmVmZXJzIHRvIENhbGxpbmcgR2VvZGV0aWMgTG9jYXRpb24gZGVmaW5lZCBpbiBRLjc2MyAoMTk5OSkuCi0tLQlPbmx5IHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKLS0tCWFzIHNwZWNpZmllZCBpbiBRLjc2MyAoMTk5OSkgaXMgYWxsb3dlZCB0byBiZSB1c2VkCi0tLQlUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0byBRLjc2MyAoMTk5OSkgaXMgYXMgZm9sbG93czoKLS0tCQlTY3JlZW5pbmcgYW5kIHByZXNlbnRhdGlvbiBpbmRpY2F0b3JzCQkxIG9jdGV0Ci0tLQkJVHlwZSBvZiBzaGFwZSAoZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlKQkxIG9jdGV0Ci0tLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cwotLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCi0tLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0Ci0tLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0Ci0KLUxvY2F0aW9uTnVtYmVyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjEwKSkKLQktLSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gSVRVLVQgUmVjIFEuNzYzCi0KLVN1YnNjcmliZXJTdGF0ZSA6Oj0gQ0hPSUNFIHsKLQlhc3N1bWVkSWRsZQlbMF0gTlVMTCwKLQljYW1lbEJ1c3kJCVsxXSBOVUxMLAotCW5ldERldE5vdFJlYWNoYWJsZQlOb3RSZWFjaGFibGVSZWFzb24sCi0Jbm90UHJvdmlkZWRGcm9tVkxSCVsyXSBOVUxMfQotCi1QUy1TdWJzY3JpYmVyU3RhdGUgOjo9IENIT0lDRSB7Ci0Jbm90UHJvdmlkZWRGcm9tU0dTTglbMF0gTlVMTCwKLQlwcy1EZXRhY2hlZAlbMV0gTlVMTCwKLQlwcy1BdHRhY2hlZE5vdFJlYWNoYWJsZUZvclBhZ2luZwlbMl0gTlVMTCwKLQlwcy1BdHRhY2hlZFJlYWNoYWJsZUZvclBhZ2luZwlbM10gTlVMTCwKLQlwcy1QRFAtQWN0aXZlTm90UmVhY2hhYmxlRm9yUGFnaW5nCVs0XSBQRFAtQ29udGV4dEluZm9MaXN0LAotCXBzLVBEUC1BY3RpdmVSZWFjaGFibGVGb3JQYWdpbmcJWzVdIFBEUC1Db250ZXh0SW5mb0xpc3QsCi0JbmV0RGV0Tm90UmVhY2hhYmxlCU5vdFJlYWNoYWJsZVJlYXNvbiB9Ci0KLVBEUC1Db250ZXh0SW5mb0xpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgotCQkJCVBEUC1Db250ZXh0SW5mbwotCi1QRFAtQ29udGV4dEluZm8gOjo9IFNFUVVFTkNFIHsKLQlwZHAtQ29udGV4dElkZW50aWZpZXIJWzBdIENvbnRleHRJZCwKLQlwZHAtQ29udGV4dEFjdGl2ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCi0JcGRwLVR5cGUJCVsyXSBQRFAtVHlwZSwKLQlwZHAtQWRkcmVzcwlbM10gUERQLUFkZHJlc3MJT1BUSU9OQUwsCi0JYXBuLVN1YnNjcmliZWQJWzRdIEFQTgkJT1BUSU9OQUwsCi0JYXBuLUluVXNlCQlbNV0gQVBOCQlPUFRJT05BTCwKLQluc2FwaQkJWzZdIE5TQVBJCQlPUFRJT05BTCwKLQl0cmFuc2FjdGlvbklkCVs3XSBUcmFuc2FjdGlvbklkCU9QVElPTkFMLAotCXRlaWQtRm9yR25BbmRHcAlbOF0gVEVJRAkJT1BUSU9OQUwsCi0JdGVpZC1Gb3JJdQlbOV0gVEVJRAkJT1BUSU9OQUwsCi0JZ2dzbi1BZGRyZXNzCVsxMF0gR1NOLUFkZHJlc3MgCU9QVElPTkFMLAotCXFvcy1TdWJzY3JpYmVkCVsxMV0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAotCXFvcy1SZXF1ZXN0ZWQJWzEyXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCi0JcW9zLU5lZ290aWF0ZWQJWzEzXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCi0JY2hhcmdpbmdJZAlbMTRdIEdQUlNDaGFyZ2luZ0lECU9QVElPTkFMLAotCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVsxNV0gQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJT1BUSU9OQUwsCi0Jcm5jLUFkZHJlc3MJWzE2XSBHU04tQWRkcmVzcwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzE3XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCXFvczItU3Vic2NyaWJlZAlbMThdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCi0JLS0gcW9zMi1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KLQlxb3MyLVJlcXVlc3RlZAlbMTldIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCi0JLS0gcW9zMi1SZXF1ZXN0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MtUmVxdWVzdGVkIGlzIHByZXNlbnQuCi0JcW9zMi1OZWdvdGlhdGVkCVsyMF0gRXh0Mi1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKLQktLSBxb3MyLU5lZ290aWF0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MtTmVnb3RpYXRlZCBpcyBwcmVzZW50LgotCQlxb3MzLVN1YnNjcmliZWQJWzIxXSBFeHQzLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAotCS0tIHFvczMtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItU3Vic2NyaWJlZCBpcyBwcmVzZW50LgotCXFvczMtUmVxdWVzdGVkCVsyMl0gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKLQktLSBxb3MzLVJlcXVlc3RlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItUmVxdWVzdGVkIGlzIHByZXNlbnQuCi0JcW9zMy1OZWdvdGlhdGVkCVsyM10gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTAotCS0tIHFvczMtTmVnb3RpYXRlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItTmVnb3RpYXRlZCBpcyBwcmVzZW50LgotfQotCi1OU0FQSSA6Oj0gSU5URUdFUiAoMC4uMTUpCi0tLQlUaGlzIHR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgTmV0d29yayBsYXllciBTZXJ2aWNlIEFjY2VzcyBQb2ludAotCi1UcmFuc2FjdGlvbklkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjIpKQotLS0JVGhpcyB0eXBlIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCBpbiB0aGUgCi0tLQlzZXNzaW9uIG1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIGFjY2VzcyBpbnRlcmZhY2UuIFRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIAotLS0JM0dQUCBUUyAyNC4wMDgKLQotVEVJRCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKLS0tCVRoaXMgdHlwZSBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBUdW5uZWwgRW5kcG9pbnQgSWRlbnRpZmllciB3aGljaCBpcyB1c2VkIHRvIAotLS0JZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgdHVubmVscyBiZXR3ZWVuIHRoZSBzYW1lIHBhaXIgb2YgZW50aXRpZXMgd2hpY2ggY29tbXVuaWNhdGUgCi0tLQl1c2luZyB0aGUgR1BSUyBUdW5uZWxsaW5nIFByb3RvY29sIFRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwLgotCi1HUFJTQ2hhcmdpbmdJRCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKLS0tCVRoZSBDaGFyZ2luZyBJRCBpcyBhIHVuaXF1ZSBmb3VyIG9jdGV0IHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgR0dTTiB3aGVuIAotLS0JYSBQRFAgQ29udGV4dCBpcyBhY3RpdmF0ZWQuIEEgQ2hhcmdpbmcgSUQgaXMgZ2VuZXJhdGVkIGZvciBlYWNoIGFjdGl2YXRlZCBjb250ZXh0LgotLS0JVGhlIGVuY29kaW5nIGlzIGRlZmluZWQgaW4gM0dQUCBUUyAyOS4wNjAuCi0KLU5vdFJlYWNoYWJsZVJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7Ci0JbXNQdXJnZWQgKDApLAotCWltc2lEZXRhY2hlZCAoMSksCi0JcmVzdHJpY3RlZEFyZWEgKDIpLAotCW5vdFJlZ2lzdGVyZWQgKDMpfQotCi0tLSBhbnkgdGltZSBpbnRlcnJvZ2F0aW9uIGluZm8gdHlwZXMKLQotQW55VGltZUludGVycm9nYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKLQlzdWJzY3JpYmVySWRlbnRpdHkJWzBdIFN1YnNjcmliZXJJZGVudGl0eSwKLQlyZXF1ZXN0ZWRJbmZvCVsxXSBSZXF1ZXN0ZWRJbmZvLAotCWdzbVNDRi1BZGRyZXNzCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1BbnlUaW1lSW50ZXJyb2dhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgewotCXN1YnNjcmliZXJJbmZvCVN1YnNjcmliZXJJbmZvLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi0tLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBoYW5kbGluZyB0eXBlcwotCi1BbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgewotCXN1YnNjcmliZXJJZGVudGl0eQlbMF0gU3Vic2NyaWJlcklkZW50aXR5LAotCXJlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8JWzFdIFJlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8sCi0JZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKLQlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwsCi0JLi4ufQotCi1BbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgewotCWNhbGxGb3J3YXJkaW5nRGF0YQlbMV0gQ2FsbEZvcndhcmRpbmdEYXRhCU9QVElPTkFMLAotCWNhbGxCYXJyaW5nRGF0YQlbMl0gQ2FsbEJhcnJpbmdEYXRhCU9QVElPTkFMLAotCW9kYi1JbmZvCQlbM10gT0RCLUluZm8JT1BUSU9OQUwsCi0JY2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbNF0gQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKLQlzdXBwb3J0ZWRWTFItQ0FNRUwtUGhhc2VzCVs1XSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKLQlzdXBwb3J0ZWRTR1NOLUNBTUVMLVBoYXNlcwlbNl0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs3XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uICwKLQlvZmZlcmVkQ2FtZWw0Q1NJc0luVkxSCVs4XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKLQlvZmZlcmVkQ2FtZWw0Q1NJc0luU0dTTglbOV0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCi0JbXNpc2RuLUJTLUxpc3QJWzEwXSBNU0lTRE4tQlMtTGlzdAlPUFRJT05BTCB9Ci0KLVJlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKLQlyZXF1ZXN0ZWRTUy1JbmZvCVsxXSBTUy1Gb3JCUy1Db2RlCU9QVElPTkFMLAotCW9kYgkJCVsyXSBOVUxMCQlPUFRJT05BTCwKLQlyZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCVszXSBSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCQlPUFRJT05BTCwKLQlzdXBwb3J0ZWRWTFItQ0FNRUwtUGhhc2VzCVs0XSBOVUxMCQlPUFRJT05BTCwKLQlzdXBwb3J0ZWRTR1NOLUNBTUVMLVBoYXNlcwlbNV0gTlVMTAkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCWFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCi0JCQkJWzddIEFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCi0JCQkJCQkJT1BUSU9OQUwsCi0JbXNpc2RuLUJTLUxpc3QJWzhdIE5VTEwJCU9QVElPTkFMIH0KLQotTVNJU0ROLUJTLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTVNJU0ROKSBPRgotCQkJCU1TSVNETi1CUwotCi1tYXhOdW1PZk1TSVNETiAgSU5URUdFUiA6Oj0gNTAKLQotCi1NU0lTRE4tQlMgOjo9IFNFUVVFTkNFIHsKLQltc2lzZG4JCQlJU0ROLUFkZHJlc3NTdHJpbmcsCQotCWJhc2ljU2VydmljZUxpc3QJWzBdCUJhc2ljU2VydmljZUxpc3QJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1SZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvIDo6PSBFTlVNRVJBVEVEIHsKLQlvLUNTSQkJKDApLAotCXQtQ1NJCQkoMSksCi0JdnQtQ1NJCQkoMiksCi0JdGlmLUNTSQkJKDMpLAotCWdwcnMtQ1NJCQkoNCksCi0JbW8tc21zLUNTSQkoNSksCi0Jc3MtQ1NJCQkoNiksCi0JbS1DU0kJCSg3KSwKLQlkLWNzaQkJKDgpfQotCi1BZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gRU5VTUVSQVRFRCB7Ci0JbXQtc21zLUNTSQkoMCksCi0JbWctY3NpCQkoMSksCi0Jby1JTS1DU0kgCQkoMiksCi0JZC1JTS1DU0kJCSgzKSwKLQl2dC1JTS1DU0kJIAkoNCksCi0JLi4ufQotLS0JZXhjZXB0aW9uIGhhbmRsaW5nOiB1bmtub3duIHZhbHVlcyBzaGFsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIHJlY2VpdmVyLgotCi1DYWxsRm9yd2FyZGluZ0RhdGEgOjo9IFNFUVVFTkNFIHsKLQlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJRXh0LUZvcndGZWF0dXJlTGlzdCwKLQlub3RpZmljYXRpb25Ub0NTRQlOVUxMCQkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1DYWxsQmFycmluZ0RhdGEgOjo9IFNFUVVFTkNFIHsKLQljYWxsQmFycmluZ0ZlYXR1cmVMaXN0CUV4dC1DYWxsQmFyRmVhdHVyZUxpc3QsCi0JcGFzc3dvcmQJCVBhc3N3b3JkCQlPUFRJT05BTCwKLQl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCi0Jbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1Xcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyIDo6PSBJTlRFR0VSICgwLi40KQotCi1PREItSW5mbyA6Oj0gU0VRVUVOQ0UgewotCW9kYi1EYXRhCQlPREItRGF0YSwKLQlub3RpZmljYXRpb25Ub0NTRQlOVUxMCQkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKLQlvLUNTSQkJWzBdCU8tQ1NJCU9QVElPTkFMLAotCW8tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbMV0JTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QJT1BUSU9OQUwsIAotCWQtQ1NJCQlbMl0JRC1DU0kJT1BUSU9OQUwsCi0JdC1DU0kJCVszXQlULUNTSQlPUFRJT05BTCwKLQl0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbNF0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCi0JdnQtQ1NJCQlbNV0JVC1DU0kJT1BUSU9OQUwsCi0JdnQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVs2XQlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKLQl0aWYtQ1NJCQlbN10JTlVMTAkJT1BUSU9OQUwsCi0JdGlmLUNTSS1Ob3RpZmljYXRpb25Ub0NTRQlbOF0JTlVMTAkJT1BUSU9OQUwsCi0JZ3Bycy1DU0kJCVs5XQlHUFJTLUNTSQlPUFRJT05BTCwKLQltby1zbXMtQ1NJCVsxMF0JU01TLUNTSQlPUFRJT05BTCwKLQlzcy1DU0kJCVsxMV0JU1MtQ1NJCU9QVElPTkFMLAotCW0tQ1NJCQlbMTJdCU0tQ1NJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMTNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0Jc3BlY2lmaWNDU0lEZWxldGVkTGlzdAlbMTRdCVNwZWNpZmljQ1NJLVdpdGhkcmF3CU9QVElPTkFMLAotCW10LXNtcy1DU0kJWzE1XQlTTVMtQ1NJCU9QVElPTkFMLAotCW10LXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlbMTZdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKLQltZy1jc2kJCVsxN10JTUctQ1NJCU9QVElPTkFMLAotCW8tSU0tQ1NJCQlbMThdIE8tQ1NJCU9QVElPTkFMLAotCW8tSU0tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbMTldIE8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAotCWQtSU0tQ1NJCQlbMjBdIEQtQ1NJCU9QVElPTkFMLAotCXZ0LUlNLUNTSQkJWzIxXSBULUNTSQlPUFRJT05BTCwKLQl2dC1JTS1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJWzIyXQlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTAotCX0KLQotQW55VGltZU1vZGlmaWNhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgewotCXN1YnNjcmliZXJJZGVudGl0eQlbMF0JU3Vic2NyaWJlcklkZW50aXR5LAotCWdzbVNDRi1BZGRyZXNzCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcsCi0JbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvCVsyXQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNGLUluZm8gT1BUSU9OQUwsCi0JbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DQi1JbmZvCVszXQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNCLUluZm8gT1BUSU9OQUwsCi0JbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DU0kJWzRdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCWxvbmdGVE4tU3VwcG9ydGVkCVs2XQlOVUxMCQlPUFRJT05BTCwKLQkuLi4sCi0JbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YQlbN10JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YSBPUFRJT05BTCwKLQltb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEJWzhdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItSVAtU00tR1ctRGF0YSBPUFRJT05BTCB9Ci0KLUFueVRpbWVNb2RpZmljYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKLQlzcy1JbmZvRm9yLUNTRQlbMF0JRXh0LVNTLUluZm9Gb3ItQ1NFCU9QVElPTkFMLAotCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzFdCUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCW9kYi1JbmZvCQlbM10JT0RCLUluZm8JT1BUSU9OQUwgfQotCi1Nb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNGLUluZm8gOjo9IFNFUVVFTkNFIHsKLQlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKLQliYXNpY1NlcnZpY2UJWzFdCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAotCXNzLVN0YXR1cwkJWzJdCUV4dC1TUy1TdGF0dXMJT1BUSU9OQUwsCi0JZm9yd2FyZGVkVG9OdW1iZXIJWzNdCUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCi0JZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs0XQlJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCi0Jbm9SZXBseUNvbmRpdGlvblRpbWUJWzVdCUV4dC1Ob1JlcENvbmRUaW1lCU9QVElPTkFMLAotCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVs2XQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzddCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0ItSW5mbyA6Oj0gU0VRVUVOQ0UgewotCXNzLUNvZGUJCVswXQlTUy1Db2RlLAotCWJhc2ljU2VydmljZQlbMV0JRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCi0Jc3MtU3RhdHVzCQlbMl0JRXh0LVNTLVN0YXR1cwlPUFRJT05BTCwKLQlwYXNzd29yZAkJWzNdCVBhc3N3b3JkCU9QVElPTkFMLAotCXdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJWzRdCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCi0JbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzVdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YSA6Oj0gU0VRVUVOQ0UgewotCW9kYi1kYXRhCQlbMF0JT0RCLURhdGEJT1BUSU9OQUwsCi0JbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzFdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DU0kgOjo9IFNFUVVFTkNFIHsKLQlyZXF1ZXN0ZWRDYW1lbC1TdWJzY3JpcHRpb25JbmZvCVswXQlSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvLAotCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVsxXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKLQltb2RpZnlDU0ktU3RhdGUJWzJdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbM10JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQlhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwotCQkJCVs0XSBBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwotCQkJCQkJCU9QVElPTkFMIH0KLS0tIHJlcXVlc3RlZENhbWVsLVN1YnNjcmlwdGlvbkluZm8gc2hhbGwgYmUgZGlzY2FyZGVkIGlmCi0tLSBhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyBpcyByZWNlaXZlZAotCi1Nb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEgOjo9IFNFUVVFTkNFIHsKLQltb2RpZnlSZWdpc3RyYXRpb25TdGF0dXMJWzBdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24gOjo9IEVOVU1FUkFURUQgewotCWRlYWN0aXZhdGUJKDApLAotCWFjdGl2YXRlCQkoMSl9Ci0KLS0tIHN1YnNjcmliZXIgZGF0YSBtb2RpZmljYXRpb24gbm90aWZpY2F0aW9uIHR5cGVzCi0KLU5vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkQXJnIDo6PSBTRVFVRU5DRSB7Ci0JaW1zaQkJCUlNU0ksCi0JbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCi0JZm9yd2FyZGluZ0luZm9Gb3ItQ1NFCVswXSBFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFCU9QVElPTkFMLAotCWNhbGxCYXJyaW5nSW5mb0Zvci1DU0UJWzFdIEV4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFCU9QVElPTkFMLAotCW9kYi1JbmZvCQlbMl0gT0RCLUluZm8JT1BUSU9OQUwsCi0JY2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbM10gQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKLQlhbGxJbmZvcm1hdGlvblNlbnQJWzRdIE5VTEwJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1Ob3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZFJlcyA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi0tLSBtb2JpbGl0eSBtYW5hZ2VtZW50IGV2ZW50IG5vdGlmaWNhdGlvb24gaW5mbyB0eXBlcwotCi1Ob3RlTU0tRXZlbnRBcmc6Oj0gU0VRVUVOQ0UgewotCXNlcnZpY2VLZXkJU2VydmljZUtleSwKLQlldmVudE1ldAkJWzBdCU1NLUNvZGUsCi0JaW1zaQkJCVsxXQlJTVNJLAotCW1zaXNkbgkJWzJdCUlTRE4tQWRkcmVzc1N0cmluZywKLQlsb2NhdGlvbkluZm9ybWF0aW9uCVszXQlMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAotCXN1cHBvcnRlZENBTUVMUGhhc2VzCVs1XQlTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzZdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJWzddCUxvY2F0aW9uSW5mb3JtYXRpb25HUFJTCU9QVElPTkFMLAotCW9mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMJWzhdIE9mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMJT1BUSU9OQUwKLX0KLQotTm90ZU1NLUV2ZW50UmVzIDo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCi0JLi4ufQotCi1FeHQtU1MtSW5mb0Zvci1DU0UgOjo9IENIT0lDRSB7Ci0JZm9yd2FyZGluZ0luZm9Gb3ItQ1NFCVswXSBFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFLAotCWNhbGxCYXJyaW5nSW5mb0Zvci1DU0UJWzFdIEV4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFCi0JfQotCi1FeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFIDo6PSBTRVFVRU5DRSB7Ci0Jc3MtQ29kZQkJWzBdCVNTLUNvZGUsCi0JZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CVsxXQlFeHQtRm9yd0ZlYXR1cmVMaXN0LAotCW5vdGlmaWNhdGlvblRvQ1NFCVsyXQlOVUxMCQlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLUV4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFIDo6PSBTRVFVRU5DRSB7Ci0Jc3MtQ29kZQkJWzBdCVNTLUNvZGUsCi0JY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlbMV0JRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCwKLQlwYXNzd29yZAkJWzJdCVBhc3N3b3JkCU9QVElPTkFMLAotCXdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJWzNdCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCi0Jbm90aWZpY2F0aW9uVG9DU0UJWzRdCU5VTEwJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKLQkuLi59Ci0KLUVORAotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1PTS1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0ZGQ2Zi4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1PTS1EYXRhVHlwZXMuYXNuCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS0tICRJZDogTUFQLU9NLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKLS0tIDE3LjcuMglPcGVyYXRpb24gYW5kIG1haW50ZW5hbmNlIGRhdGEgdHlwZXMKLS0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKLSAKLU1BUC1PTS1EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtT00tRGF0YVR5cGVzICgxMikgdmVyc2lvbjExICgxMSl9Ci0KLURFRklOSVRJT05TCi0KLUlNUExJQ0lUIFRBR1MKLQotOjo9Ci0KLUJFR0lOCi0KLUVYUE9SVFMKLQlBY3RpdmF0ZVRyYWNlTW9kZUFyZywKLQlBY3RpdmF0ZVRyYWNlTW9kZVJlcywKLQlEZWFjdGl2YXRlVHJhY2VNb2RlQXJnLAotCURlYWN0aXZhdGVUcmFjZU1vZGVSZXMsCi0JVHJhY2VQcm9wYWdhdGlvbkxpc3QKLTsKLQotSU1QT1JUUwotCUFkZHJlc3NTdHJpbmcsCi0JSU1TSQotRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQotCi0JRXh0ZW5zaW9uQ29udGFpbmVyCi1GUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Ci0KLTsKLQotQWN0aXZhdGVUcmFjZU1vZGVBcmcgOjo9IFNFUVVFTkNFIHsKLQlpbXNpCQkJWzBdIElNU0kJCU9QVElPTkFMLAotCXRyYWNlUmVmZXJlbmNlCVsxXSBUcmFjZVJlZmVyZW5jZSwKLQl0cmFjZVR5cGUJCVsyXSBUcmFjZVR5cGUsCi0Jb21jLUlkCQlbM10gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JdHJhY2VSZWZlcmVuY2UyCVs1XSBUcmFjZVJlZmVyZW5jZTIJT1BUSU9OQUwsCi0JdHJhY2VEZXB0aExpc3QJWzZdIFRyYWNlRGVwdGhMaXN0CU9QVElPTkFMLAotCXRyYWNlTkUtVHlwZUxpc3QJWzddIFRyYWNlTkUtVHlwZUxpc3QJT1BUSU9OQUwsCi0JdHJhY2VJbnRlcmZhY2VMaXN0CVs4XSBUcmFjZUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCi0JdHJhY2VFdmVudExpc3QJWzldIFRyYWNlRXZlbnRMaXN0CU9QVElPTkFMCi0JfQotCi1UcmFjZVJlZmVyZW5jZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKLQotVHJhY2VSZWZlcmVuY2UyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQotCi1UcmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCi0KLVRyYWNlVHlwZSA6Oj0gSU5URUdFUgotCSgwLi4yNTUpCi0JLS0gVHJhY2UgdHlwZXMgYXJlIGZ1bGx5IGRlZmluZWQgaW4gIDNHUFAgVFMgNTIuMDA4LiBbNjFdCi0KLVRyYWNlRGVwdGhMaXN0IDo6PSBTRVFVRU5DRSB7Ci0JbXNjLXMtVHJhY2VEZXB0aAlbMF0gVHJhY2VEZXB0aAlPUFRJT05BTCwKLQltZ3ctVHJhY2VEZXB0aAlbMV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKLQlzZ3NuLVRyYWNlRGVwdGgJWzJdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCi0JZ2dzbi1UcmFjZURlcHRoCVszXSBUcmFjZURlcHRoCU9QVElPTkFMLAotCXJuYy1UcmFjZURlcHRoCVs0XSBUcmFjZURlcHRoCU9QVElPTkFMLAotCWJtc2MtVHJhY2VEZXB0aAlbNV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKLQkuLi59Ci0KLVRyYWNlRGVwdGggOjo9IEVOVU1FUkFURUQgewotCW1pbmltdW0gKDApLAotCW1lZGl1bSAoMSksCi0JbWF4aW11bSAoMiksCi0JLi4ufQotLS0gVGhlIHZhbHVlIG1lZGl1bSBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIFJOQy4gRm9yIG90aGVyIG5ldHdvcmsgZWxlbWVudHMsIGlmIHZhbHVlIG1lZGl1bQotLS0gaXMgcmVjZWl2ZWQsIHZhbHVlIG1pbmltdW0gc2hhbGwgYmUgYXBwbGllZC4KLQotVHJhY2VORS1UeXBlTGlzdCA6Oj0gQklUIFNUUklORyB7Ci0JbXNjLXMgKDApLAotCW1ndyAoMSksCi0Jc2dzbiAoMiksCi0JZ2dzbiAoMyksCi0Jcm5jICg0KSwKLQlibS1zYyAoNSl9IChTSVpFICg2Li4xNikpCi0tLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KLQotVHJhY2VJbnRlcmZhY2VMaXN0IDo6PSBTRVFVRU5DRSB7Ci0JbXNjLXMtTGlzdAlbMF0gTVNDLVMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKLQltZ3ctTGlzdAkJWzFdIE1HVy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAotCXNnc24tTGlzdAkJWzJdIFNHU04tSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKLQlnZ3NuLUxpc3QJCVszXSBHR1NOLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCi0Jcm5jLUxpc3QJCVs0XSBSTkMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKLQlibXNjLUxpc3QJCVs1XSBCTVNDLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCi0JLi4ufQotCi1NU0MtUy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKLQlhICgwKSwKLQlpdSAoMSksCi0JbWMgKDIpLAotCW1hcC1nICgzKSwKLQltYXAtYiAoNCksCi0JbWFwLWUgKDUpLAotCW1hcC1mICg2KSwKLQljYXAgKDcpLAotCW1hcC1kICg4KSwKLQltYXAtYyAoOSl9IChTSVpFICgxMC4uMTYpKQotLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0KLU1HVy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKLQltYyAoMCksCi0JbmItdXAgKDEpLAotCWl1LXVwICgyKX0gKFNJWkUgKDMuLjgpKQotLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0KLVNHU04tSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7Ci0JZ2IgKDApLAotCWl1ICgxKSwKLQlnbiAoMiksCi0JbWFwLWdyICgzKSwKLQltYXAtZ2QgKDQpLAotCW1hcC1nZiAoNSksCi0JZ3MgKDYpLAotCWdlICg3KX0gKFNJWkUgKDguLjE2KSkKLS0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgotCi1HR1NOLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgewotCWduICgwKSwKLQlnaSAoMSksCi0JZ21iICgyKX0gKFNJWkUgKDMuLjgpKQotLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0KLVJOQy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKLQlpdSAoMCksCi0JaXVyICgxKSwKLQlpdWIgKDIpLAotCXV1ICgzKX0gKFNJWkUgKDQuLjgpKQotLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0KLUJNU0MtSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7Ci0JZ21iICgwKX0gKFNJWkUgKDEuLjgpKQotLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0KLVRyYWNlRXZlbnRMaXN0IDo6PSBTRVFVRU5DRSB7Ci0JbXNjLXMtTGlzdAlbMF0gTVNDLVMtRXZlbnRMaXN0CU9QVElPTkFMLAotCW1ndy1MaXN0CQlbMV0gTUdXLUV2ZW50TGlzdAlPUFRJT05BTCwKLQlzZ3NuLUxpc3QJCVsyXSBTR1NOLUV2ZW50TGlzdAlPUFRJT05BTCwKLQlnZ3NuLUxpc3QJCVszXSBHR1NOLUV2ZW50TGlzdAlPUFRJT05BTCwKLQlibXNjLUxpc3QJCVs0XSBCTVNDLUV2ZW50TGlzdAlPUFRJT05BTCwKLQkuLi59Ci0KLU1TQy1TLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7Ci0JbW8tbXRDYWxsICgwKSwKLQltby1tdC1zbXMgKDEpLAotCWx1LWltc2lBdHRhY2gtaW1zaURldGFjaCAoMiksCi0JaGFuZG92ZXJzICgzKSwKLQlzcyAoNCl9IChTSVpFICg1Li4xNikpCi0tLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KLQotTUdXLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7Ci0JY29udGV4dCAoMCl9IChTSVpFICgxLi44KSkKLS0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgotCi1TR1NOLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7Ci0JcGRwQ29udGV4dCAoMCksCi0JbW8tbXQtc21zICgxKSwKLQlyYXUtZ3Byc0F0dGFjaC1ncHJzRGV0YWNoICgyKSwKLQltYm1zQ29udGV4dCAoMyl9IChTSVpFICg0Li4xNikpCi0tLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KLQotR0dTTi1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgewotCXBkcENvbnRleHQgKDApLAotCW1ibXNDb250ZXh0ICgxKX0gKFNJWkUgKDIuLjgpKQotLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCi0KLUJNU0MtRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKLQltYm1zTXVsdGljYXN0U2VydmljZUFjdGl2YXRpb24gKDApfSAoU0laRSAoMS4uOCkpCi0tLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KLQotCi1UcmFjZVByb3BhZ2F0aW9uTGlzdCA6Oj0gU0VRVUVOQ0UgewotCXRyYWNlUmVmZXJlbmNlCVswXSBUcmFjZVJlZmVyZW5jZQlPUFRJT05BTCwKLQl0cmFjZVR5cGUJCVsxXSBUcmFjZVR5cGUJT1BUSU9OQUwsCi0JdHJhY2VSZWZlcmVuY2UyCVsyXSBUcmFjZVJlZmVyZW5jZTIJT1BUSU9OQUwsCi0JdHJhY2VSZWNvcmRpbmdTZXNzaW9uUmVmZXJlbmNlCVszXSBUcmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UgT1BUSU9OQUwsCi0Jcm5jLVRyYWNlRGVwdGgJWzRdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCi0Jcm5jLUludGVyZmFjZUxpc3QJWzVdIFJOQy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAotCW1zYy1zLVRyYWNlRGVwdGgJWzZdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCi0JbXNjLXMtSW50ZXJmYWNlTGlzdAlbN10gTVNDLVMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKLQltc2Mtcy1FdmVudExpc3QJWzhdIE1TQy1TLUV2ZW50TGlzdAlPUFRJT05BTCwKLQltZ3ctVHJhY2VEZXB0aAlbOV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKLQltZ3ctSW50ZXJmYWNlTGlzdAlbMTBdIE1HVy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAotCW1ndy1FdmVudExpc3QJWzExXSBNR1ctRXZlbnRMaXN0CU9QVElPTkFMLAotCS4uLn0KLQotQWN0aXZhdGVUcmFjZU1vZGVSZXMgOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JdHJhY2VTdXBwb3J0SW5kaWNhdG9yCVsxXQlOVUxMCQlPUFRJT05BTAotCX0KLQotRGVhY3RpdmF0ZVRyYWNlTW9kZUFyZyA6Oj0gU0VRVUVOQ0UgewotCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCi0JdHJhY2VSZWZlcmVuY2UJWzFdIFRyYWNlUmVmZXJlbmNlLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiwKLQl0cmFjZVJlZmVyZW5jZTIJWzNdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTAotCX0KLQotRGVhY3RpdmF0ZVRyYWNlTW9kZVJlcyA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotRU5ECi0KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TTS1EYXRhVHlwZXMuYXNuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWY5NDFmLi4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24KKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLS0gJElkOiBNQVAtU00tRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAotLS0gM0dQUCBUUyAyOS4wMDIgIFY4LjkuMCAoMjAwOS0wNCkgIAotLS0gMTcuNy42CVNob3J0IG1lc3NhZ2UgZGF0YSB0eXBlcwotCi1NQVAtU00tRGF0YVR5cGVzIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNNLURhdGFUeXBlcyAoMTYpIHZlcnNpb24xMSAoMTEpfQotCi1ERUZJTklUSU9OUwotCi1JTVBMSUNJVCBUQUdTCi0KLTo6PQotCi1CRUdJTgotCi1FWFBPUlRTCi0JUm91dGluZ0luZm9Gb3JTTS1BcmcsCi0JUm91dGluZ0luZm9Gb3JTTS1SZXMsCi0JTU8tRm9yd2FyZFNNLUFyZywKLQlNTy1Gb3J3YXJkU00tUmVzLAotCU1ULUZvcndhcmRTTS1BcmcsCi0JTVQtRm9yd2FyZFNNLVJlcywKLQlSZXBvcnRTTS1EZWxpdmVyeVN0YXR1c0FyZywKLQlSZXBvcnRTTS1EZWxpdmVyeVN0YXR1c1JlcywKLQlBbGVydFNlcnZpY2VDZW50cmVBcmcsCi0JSW5mb3JtU2VydmljZUNlbnRyZUFyZywKLQlSZWFkeUZvclNNLUFyZywgCi0JUmVhZHlGb3JTTS1SZXMsCi0JU00tRGVsaXZlcnlPdXRjb21lLAotCUFsZXJ0UmVhc29uLAotCUFkZGl0aW9uYWwtTnVtYmVyLAotCU1ULUZvcndhcmRTTS1WR0NTLUFyZywKLQlNVC1Gb3J3YXJkU00tVkdDUy1SZXMKLTsKLQotSU1QT1JUUwotCUFkZHJlc3NTdHJpbmcsCi0JSVNETi1BZGRyZXNzU3RyaW5nLAotCVNpZ25hbEluZm8sCi0JSU1TSSwKLQlMTVNJLAotCUFTQ0ktQ2FsbFJlZmVyZW5jZQotCi1GUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9Ci0KLQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCi1GUk9NIE1BUC1FUi1EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRVItRGF0YVR5cGVzICgxNykgdmVyc2lvbjExICgxMSl9Ci0KLQlFeHRlbnNpb25Db250YWluZXIKLUZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KLTsKLQotCi1Sb3V0aW5nSW5mb0ZvclNNLUFyZyA6Oj0gU0VRVUVOQ0UgewotCW1zaXNkbgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKLQlzbS1SUC1QUkkJCVsxXSBCT09MRUFOLAotCXNlcnZpY2VDZW50cmVBZGRyZXNzCVsyXSBBZGRyZXNzU3RyaW5nLAotCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiAsCi0JZ3Byc1N1cHBvcnRJbmRpY2F0b3IJWzddCU5VTEwJCU9QVElPTkFMLAotCS0tIGdwcnNTdXBwb3J0SW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTTVMtR01TQyBzdXBwb3J0cwotCS0tIHJlY2VpdmluZyBvZiB0d28gbnVtYmVycyBmcm9tIHRoZSBITFIKLQlzbS1SUC1NVEkJCVs4XSBTTS1SUC1NVEkJT1BUSU9OQUwsCi0Jc20tUlAtU01FQQlbOV0gU00tUlAtU01FQQlPUFRJT05BTCwKLQlzbS1kZWxpdmVyeU5vdEludGVuZGVkCVsxMF0gU00tRGVsaXZlcnlOb3RJbnRlbmRlZAlPUFRJT05BTCB9Ci0KLVNNLURlbGl2ZXJ5Tm90SW50ZW5kZWQgOjo9IEVOVU1FUkFURUQgewotCW9ubHlJTVNJLXJlcXVlc3RlZCAgKDApLAotCW9ubHlNQ0MtTU5DLXJlcXVlc3RlZCAgKDEpLAotCS4uLn0KLQotU00tUlAtTVRJIDo6PSBJTlRFR0VSICgwLi4xMCkKLQktLSAwIFNNUyBEZWxpdmVyIAotCS0tIDEgU01TIFN0YXR1cyBSZXBvcnQKLQktLSBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBzaGFsbCBiZSBkaXNjYXJkZWQgaWYKLQktLSByZWNlaXZlZAotCi1TTS1SUC1TTUVBIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjEyKSkKLQktLSB0aGlzIHBhcmFtZXRlciBjb250YWlucyBhbiBhZGRyZXNzIGZpZWxkIHdoaWNoIGlzIGVuY29kZWQgCi0JLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjA0MC4gQW4gYWRkcmVzcyBmaWVsZCBjb250YWlucyAzIGVsZW1lbnRzIDoKLQktLSAJCWFkZHJlc3MtbGVuZ3RoCi0JLS0gCQl0eXBlLW9mLWFkZHJlc3MKLQktLSAJCWFkZHJlc3MtdmFsdWUKLQotUm91dGluZ0luZm9Gb3JTTS1SZXMgOjo9IFNFUVVFTkNFIHsKLQlpbXNpCQkJSU1TSSwKLQlsb2NhdGlvbkluZm9XaXRoTE1TSQlbMF0gTG9jYXRpb25JbmZvV2l0aExNU0ksCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1Mb2NhdGlvbkluZm9XaXRoTE1TSSA6Oj0gU0VRVUVOQ0UgewotCW5ldHdvcmtOb2RlLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nLAotCWxtc2kJCQlMTVNJCQkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JZ3Byc05vZGVJbmRpY2F0b3IJWzVdCU5VTEwJCU9QVElPTkFMLAotCS0tIGdwcnNOb2RlSW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTR1NOIG51bWJlciBpcyBzZW50IGFzIHRoZSAKLQktLSBOZXR3b3JrIE5vZGUgTnVtYmVyCi0JYWRkaXRpb25hbC1OdW1iZXIJWzZdIEFkZGl0aW9uYWwtTnVtYmVyCU9QVElPTkFMIAotCS0tIE5ldHdvcmtOb2RlLW51bWJlciBjYW4gYmUgZWl0aGVyIG1zYy1udW1iZXIgb3Igc2dzbi1udW1iZXIgb3IgSVAtU00tR1cKLQktLSBudW1iZXIgb3IgU01TIFJvdXRlciBudW1iZXIKLQl9Ci0KLUFkZGl0aW9uYWwtTnVtYmVyIDo6PSBDSE9JQ0UgewotCW1zYy1OdW1iZXIJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKLQlzZ3NuLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nfQotCS0tIGFkZGl0aW9uYWwtbnVtYmVyIGNhbiBiZSBlaXRoZXIgbXNjLW51bWJlciBvciBzZ3NuLW51bWJlcgotCS0tIGlmIHJlY2VpdmVkIG5ldHdvcmtOb2RlLW51bWJlciBpcyBtc2MtbnVtYmVyIHRoZW4gdGhlIAkKLQktLSBhZGRpdGlvbmFsIG51bWJlciBpcyBzZ3NuLW51bWJlciAKLQktLSBpZiByZWNlaXZlZCBuZXR3b3JrTm9kZS1udW1iZXIgaXMgc2dzbi1udW1iZXIgdGhlbiB0aGUgCi0JLS0gYWRkaXRpb25hbCBudW1iZXIgaXMgbXNjLW51bWJlciAKLQotTU8tRm9yd2FyZFNNLUFyZyA6Oj0gU0VRVUVOQ0UgewotCXNtLVJQLURBCQlTTS1SUC1EQSwKLQlzbS1SUC1PQQkJU00tUlAtT0EsCi0Jc20tUlAtVUkJCVNpZ25hbEluZm8sCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4gLAotCWltc2kJCQlJTVNJIAkJT1BUSU9OQUwgfQotCi1NTy1Gb3J3YXJkU00tUmVzIDo6PSBTRVFVRU5DRSB7Ci0Jc20tUlAtVUkJCVNpZ25hbEluZm8gCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1NVC1Gb3J3YXJkU00tQXJnIDo6PSBTRVFVRU5DRSB7Ci0Jc20tUlAtREEJCVNNLVJQLURBLAotCXNtLVJQLU9BCQlTTS1SUC1PQSwKLQlzbS1SUC1VSQkJU2lnbmFsSW5mbywKLQltb3JlTWVzc2FnZXNUb1NlbmQJTlVMTAkJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1NVC1Gb3J3YXJkU00tUmVzIDo6PSBTRVFVRU5DRSB7Ci0Jc20tUlAtVUkJCVNpZ25hbEluZm8JT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi59Ci0KLVNNLVJQLURBIDo6PSBDSE9JQ0UgewotCWltc2kJCQlbMF0gSU1TSSwKLQlsbXNpCQkJWzFdIExNU0ksCi0Jc2VydmljZUNlbnRyZUFkZHJlc3NEQQlbNF0gQWRkcmVzc1N0cmluZywKLQlub1NNLVJQLURBCVs1XSBOVUxMfQotCi1TTS1SUC1PQSA6Oj0gQ0hPSUNFIHsKLQltc2lzZG4JCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcsCi0Jc2VydmljZUNlbnRyZUFkZHJlc3NPQQlbNF0gQWRkcmVzc1N0cmluZywKLQlub1NNLVJQLU9BCVs1XSBOVUxMfQotCi1SZXBvcnRTTS1EZWxpdmVyeVN0YXR1c0FyZyA6Oj0gU0VRVUVOQ0UgewotCW1zaXNkbgkJSVNETi1BZGRyZXNzU3RyaW5nLAotCXNlcnZpY2VDZW50cmVBZGRyZXNzCUFkZHJlc3NTdHJpbmcsCi0Jc20tRGVsaXZlcnlPdXRjb21lCVNNLURlbGl2ZXJ5T3V0Y29tZSwKLQlhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCVswXSBBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCi0JCQkJCQkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCWdwcnNTdXBwb3J0SW5kaWNhdG9yCVsyXQlOVUxMCQlPUFRJT05BTCwKLQktLSBncHJzU3VwcG9ydEluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU01TLUdNU0Mgc3VwcG9ydHMgCi0JLS0gaGFuZGxpbmcgb2YgdHdvIGRlbGl2ZXJ5IG91dGNvbWVzCi0JZGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yCVszXSAJTlVMTAkJT1BUSU9OQUwsCi0JLS0gRGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIGlzIHNldCB3aGVuIHRoZSBTTS1EZWxpdmVyeU91dGNvbWUKLQktLSBpcyBmb3IgR1BSUwotCWFkZGl0aW9uYWxTTS1EZWxpdmVyeU91dGNvbWUJWzRdIAlTTS1EZWxpdmVyeU91dGNvbWUgCU9QVElPTkFMLAotCS0tIElmIHJlY2VpdmVkLCBhZGRpdGlvbmFsU00tRGVsaXZlcnlPdXRjb21lIGlzIGZvciBHUFJTCi0JLS0gSWYgRGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBBZGRpdGlvbmFsU00tRGVsaXZlcnlPdXRjb21lIHNoYWxsIGJlIGFic2VudAotCWFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCVs1XSAJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBPUFRJT05BTCwKLQktLSBJZiByZWNlaXZlZCBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3IgR1BSUwotCS0tIElmIERlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBpcyBzZXQsIHRoZW4gQWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gCi0JLS0gc2hhbGwgYmUgYWJzZW50Ci0JaXAtc20tZ3ctSW5kaWNhdG9yCVs2XSAJTlVMTAkJT1BUSU9OQUwsCi0JLS0gdGhlIGlwLXNtLWd3IGluZGljYXRvciBpbmRpY2F0ZXMgYnkgaXRzIHByZXNlbmNlIHRoYXQgc20tZGVsaXZlcnlPdXRjb21lCi0JLS0gaXMgZm9yIGRlbGl2ZXJ5IHZpYSBJTVMKLQktLSBJZiBwcmVzZW50LCBkZWxpdmVyeU91dGNvbWVJbmRpY2F0b3Igc2hhbGwgYmUgYWJzZW50LgotCWlwLXNtLWd3LXNtLWRlbGl2ZXJ5T3V0Y29tZQlbN10gCVNNLURlbGl2ZXJ5T3V0Y29tZQlPUFRJT05BTCwgCi0JLS0gSWYgcmVjZWl2ZWQgaXAtc20tZ3ctc20tZGVsaXZlcnlPdXRjb21lIGlzIGZvciBkZWxpdmVyeSB2aWEgSU1TCi0JLS0gSWYgaXAtc20tZ3ctSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBpcC1zbS1ndy1zbS1kZWxpdmVyeU91dGNvbWUgc2hhbGwgYmUgYWJzZW50Ci0JaXAtc20tZ3ctYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbOF0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTAotCS0tIElmIHJlY2VpdmVkIGlwLXNtLWd3LXNtLWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIGRlbGl2ZXJ5IHZpYSBJTVMKLQktLSBJZiBpcC1zbS1ndy1JbmRpY2F0b3IgaXMgc2V0LCB0aGVuIGlwLXNtLWd3LXNtLWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gCi0JLS0gc2hhbGwgYmUgYWJzZW50Ci19Ci0KLVNNLURlbGl2ZXJ5T3V0Y29tZSA6Oj0gRU5VTUVSQVRFRCB7Ci0JbWVtb3J5Q2FwYWNpdHlFeGNlZWRlZCAgKDApLAotCWFic2VudFN1YnNjcmliZXIgICgxKSwKLQlzdWNjZXNzZnVsVHJhbnNmZXIgICgyKX0KLQotUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNSZXMgOjo9IFNFUVVFTkNFIHsKLQlzdG9yZWRNU0lTRE4JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1BbGVydFNlcnZpY2VDZW50cmVBcmcgOjo9IFNFUVVFTkNFIHsKLQltc2lzZG4JCUlTRE4tQWRkcmVzc1N0cmluZywKLQlzZXJ2aWNlQ2VudHJlQWRkcmVzcwlBZGRyZXNzU3RyaW5nLAotCS4uLn0KLQotSW5mb3JtU2VydmljZUNlbnRyZUFyZyA6Oj0gU0VRVUVOQ0UgewotCXN0b3JlZE1TSVNETglJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCi0JbXctU3RhdHVzCU1XLVN0YXR1cwlPUFRJT05BTCwKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLiAsCi0JYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMLAotCWFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCVswXQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMIH0KLQktLSBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIAotCS0tIGFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgcHJlc2VudC4KLQktLSBpZiBpbmNsdWRlZCwgYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIEdQUlMgYW5kCi0JLS0gYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3Igbm9uLUdQUlMKLQotTVctU3RhdHVzIDo6PSBCSVQgU1RSSU5HIHsKLQlzYy1BZGRyZXNzTm90SW5jbHVkZWQgICgwKSwKLQltbnJmLVNldCAgKDEpLAotCW1jZWYtU2V0ICAoMikgLAotCW1ucmctU2V0CSAgKDMpfSAoU0laRSAoNi4uMTYpKQotCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKLQktLSBiaXRzIDQgdG8gMTUgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKLQotUmVhZHlGb3JTTS1BcmcgOjo9IFNFUVVFTkNFIHsKLQlpbXNpCQkJWzBdIElNU0ksCi0JYWxlcnRSZWFzb24JQWxlcnRSZWFzb24sCi0JYWxlcnRSZWFzb25JbmRpY2F0b3IJTlVMTAkJCU9QVElPTkFMLAotCS0tIGFsZXJ0UmVhc29uSW5kaWNhdG9yIGlzIHNldCBvbmx5IHdoZW4gdGhlIGFsZXJ0UmVhc29uIAotCS0tIHNlbnQgdG8gSExSIGlzIGZvciBHUFJTCi0JZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKLQkuLi4sCi0JYWRkaXRpb25hbEFsZXJ0UmVhc29uSW5kaWNhdG9yCVsxXSBOVUxMCQlPUFRJT05BTAotCS0tIGFkZGl0aW9uYWxBbGVydFJlYXNvbkluZGljYXRvciBpcyBzZXQgb25seSB3aGVuIHRoZSBhbGVydFJlYXNvbgotCS0tIHNlbnQgdG8gSExSIGlzIGZvciBJUC1TTS1HVwotCX0KLQotUmVhZHlGb3JTTS1SZXMgOjo9IFNFUVVFTkNFIHsKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotQWxlcnRSZWFzb24gOjo9IEVOVU1FUkFURUQgewotCW1zLVByZXNlbnQgICgwKSwKLQltZW1vcnlBdmFpbGFibGUgICgxKX0KLQotTVQtRm9yd2FyZFNNLVZHQ1MtQXJnIDo6PSBTRVFVRU5DRSB7Ci0JYXNjaUNhbGxSZWZlcmVuY2UJQVNDSS1DYWxsUmVmZXJlbmNlLAotCXNtLVJQLU9BCQlTTS1SUC1PQSwKLQlzbS1SUC1VSQkJU2lnbmFsSW5mbywKLQlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAotCS4uLn0KLQotTVQtRm9yd2FyZFNNLVZHQ1MtUmVzIDo6PSBTRVFVRU5DRSB7Ci0Jc20tUlAtVUkJCVswXSBTaWduYWxJbmZvCU9QVElPTkFMLAotCWRpc3BhdGNoZXJMaXN0CVsxXSBEaXNwYXRjaGVyTGlzdAlPUFRJT05BTCwKLQlvbmdvaW5nQ2FsbAlOVUxMCQkJT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4ufQotCi1EaXNwYXRjaGVyTGlzdCA6Oj0gCi0JU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZEaXNwYXRjaGVycykgT0YKLQkJCQlJU0ROLUFkZHJlc3NTdHJpbmcKLQotbWF4TnVtT2ZEaXNwYXRjaGVycyAgSU5URUdFUiA6Oj0gNQotCi0KLQotRU5ECi0KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLUNvZGUuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtQ29kZS5hc24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2M2YyZGMuLjAwMDAwMDAKLS0tIGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtQ29kZS5hc24KKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLS0gJElkOiBNQVAtU1MtQ29kZS5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKLS0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKLS0tIDE3LjcuNQlTdXBwbGVtZW50YXJ5IHNlcnZpY2UgY29kZXMKLQotTUFQLVNTLUNvZGUgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQotCi1ERUZJTklUSU9OUwotCi06Oj0KLQotQkVHSU4KLQotU1MtQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKLQktLSBzdXBwbGVtZW50YXJ5IHNlcnZpY2UsIGEgZ3JvdXAgb2Ygc3VwcGxlbWVudGFyeSBzZXJ2aWNlcywgb3IKLQktLSBhbGwgc3VwcGxlbWVudGFyeSBzZXJ2aWNlcy4gVGhlIHNlcnZpY2VzIGFuZCBhYmJyZXZpYXRpb25zCi0JLS0gdXNlZCBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAwNCBbNV0uIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMKLQktLSBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0JLS0KLQktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSwgYW5kIHNwZWNpZmljIHNlcnZpY2UKLQktLSAoYml0cyA0MzIxKQotCi1hbGxTUwkJCVNTLUNvZGUgOjo9ICcwMDAwMDAwMCdCCi0JLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKLQktLSBhbGwgU1MKLQotYWxsTGluZUlkZW50aWZpY2F0aW9uU1MJU1MtQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKLQktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQotCS0tIGFsbCBsaW5lIGlkZW50aWZpY2F0aW9uIFNTCi1jbGlwCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDAwMSdCCi0JLS0gY2FsbGluZyBsaW5lIGlkZW50aWZpY2F0aW9uIHByZXNlbnRhdGlvbgotY2xpcgkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMTAnQgotCS0tIGNhbGxpbmcgbGluZSBpZGVudGlmaWNhdGlvbiByZXN0cmljdGlvbgotY29scAkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMTEnQgotCS0tIGNvbm5lY3RlZCBsaW5lIGlkZW50aWZpY2F0aW9uIHByZXNlbnRhdGlvbgotY29scgkJCQlTUy1Db2RlIDo6PSAnMDAwMTAxMDAnQgotCS0tIGNvbm5lY3RlZCBsaW5lIGlkZW50aWZpY2F0aW9uIHJlc3RyaWN0aW9uCi1tY2kJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMTAxJ0IKLQktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQotCS0tIG1hbGljaW91cyBjYWxsIGlkZW50aWZpY2F0aW9uCi0KLWFsbE5hbWVJZGVudGlmaWNhdGlvblNTCVNTLUNvZGUgOjo9ICcwMDAxMTAwMCdCCi0JLS0gYWxsIG5hbWUgaWRlbnRpZmljYXRpb24gU1MKLWNuYXAJCQkJU1MtQ29kZSA6Oj0gJzAwMDExMDAxJ0IKLQktLSBjYWxsaW5nIG5hbWUgcHJlc2VudGF0aW9uCi0KLQktLSBTUy1Db2RlcyAnMDAwMTEwMTAnQiB0byAnMDAwMTExMTEnQiBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAKLQktLSBOYW1lSWRlbnRpZmljYXRpb24gU3VwcGxlbWVudGFyeSBTZXJ2aWNlIHVzZS4KLQotYWxsRm9yd2FyZGluZ1NTCVNTLUNvZGUgOjo9ICcwMDEwMDAwMCdCCi0JLS0gYWxsIGZvcndhcmRpbmcgU1MKLWNmdQkJCQlTUy1Db2RlIDo6PSAnMDAxMDAwMDEnQgotCS0tIGNhbGwgZm9yd2FyZGluZyB1bmNvbmRpdGlvbmFsCi1hbGxDb25kRm9yd2FyZGluZ1NTCVNTLUNvZGUgOjo9ICcwMDEwMTAwMCdCCi0JLS0gYWxsIGNvbmRpdGlvbmFsIGZvcndhcmRpbmcgU1MKLWNmYgkJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMDEnQgotCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBtb2JpbGUgc3Vic2NyaWJlciBidXN5Ci1jZm5yeQkJCVNTLUNvZGUgOjo9ICcwMDEwMTAxMCdCCi0JLS0gY2FsbCBmb3J3YXJkaW5nIG9uIG5vIHJlcGx5Ci1jZm5yYwkJCVNTLUNvZGUgOjo9ICcwMDEwMTAxMSdCCi0JLS0gY2FsbCBmb3J3YXJkaW5nIG9uIG1vYmlsZSBzdWJzY3JpYmVyIG5vdCByZWFjaGFibGUgCi1jZAkJCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgotCS0tIGNhbGwgZGVmbGVjdGlvbgotCi1hbGxDYWxsT2ZmZXJpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMTAwMDAnQgotCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCi0JLS0gYWxsIGNhbGwgb2ZmZXJpbmcgU1MgaW5jbHVkZXMgYWxzbyBhbGwgZm9yd2FyZGluZyBTUwotZWN0CQkJCVNTLUNvZGUgOjo9ICcwMDExMDAwMSdCCi0JCS0tIGV4cGxpY2l0IGNhbGwgdHJhbnNmZXIKLW1haAkJCQlTUy1Db2RlIDo6PSAnMDAxMTAwMTAnQgotCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCi0JLS0gbW9iaWxlIGFjY2VzcyBodW50aW5nCi0KLWFsbENhbGxDb21wbGV0aW9uU1MJU1MtQ29kZSA6Oj0gJzAxMDAwMDAwJ0IKLQktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQotCS0tIGFsbCBDYWxsIGNvbXBsZXRpb24gU1MKLWN3CQkJCVNTLUNvZGUgOjo9ICcwMTAwMDAwMSdCCi0JLS0gY2FsbCB3YWl0aW5nCi1ob2xkCQkJCVNTLUNvZGUgOjo9ICcwMTAwMDAxMCdCCi0JLS0gY2FsbCBob2xkCi1jY2JzLUEJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMTEnQgotCS0tIGNvbXBsZXRpb24gb2YgY2FsbCB0byBidXN5IHN1YnNjcmliZXJzLCBvcmlnaW5hdGluZyBzaWRlCi0JLS0gdGhpcyBTUy1Db2RlIGlzIHVzZWQgb25seSBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSwgRGVsZXRlU3Vic2NyaWJlckRhdGEgCi0JLS0gYW5kIEludGVycm9nYXRlU1MKLWNjYnMtQgkJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCi0JLS0gY29tcGxldGlvbiBvZiBjYWxsIHRvIGJ1c3kgc3Vic2NyaWJlcnMsIGRlc3RpbmF0aW9uIHNpZGUKLQktLSB0aGlzIFNTLUNvZGUgaXMgdXNlZCBvbmx5IGluIEluc2VydFN1YnNjcmliZXJEYXRhIGFuZCBEZWxldGVTdWJzY3JpYmVyRGF0YQotbWMJCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAxJ0IKLQktLSBtdWx0aWNhbGwKLQotYWxsTXVsdGlQYXJ0eVNTCVNTLUNvZGUgOjo9ICcwMTAxMDAwMCdCCi0JLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKLQktLSBhbGwgbXVsdGlwYXJ0eSBTUwotbXVsdGlQVFkJCQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgotCS0tIG11bHRpcGFydHkKLQotYWxsQ29tbXVuaXR5T2ZJbnRlcmVzdC1TUwlTUy1Db2RlIDo6PSAnMDExMDAwMDAnQgotCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCi0JLS0gYWxsIGNvbW11bml0eSBvZiBpbnRlcmVzdCBTUwotY3VnCQkJCVNTLUNvZGUgOjo9ICcwMTEwMDAwMSdCCi0JLS0gY2xvc2VkIHVzZXIgZ3JvdXAKLQotYWxsQ2hhcmdpbmdTUwkJU1MtQ29kZSA6Oj0gJzAxMTEwMDAwJ0IKLQktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQotCS0tIGFsbCBjaGFyZ2luZyBTUwotYW9jaQkJCQlTUy1Db2RlIDo6PSAnMDExMTAwMDEnQgotCS0tIGFkdmljZSBvZiBjaGFyZ2UgaW5mb3JtYXRpb24KLWFvY2MJCQkJU1MtQ29kZSA6Oj0gJzAxMTEwMDEwJ0IKLQktLSBhZHZpY2Ugb2YgY2hhcmdlIGNoYXJnaW5nCi0KLWFsbEFkZGl0aW9uYWxJbmZvVHJhbnNmZXJTUwlTUy1Db2RlIDo6PSAnMTAwMDAwMDAnQgotCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCi0JLS0gYWxsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdHJhbnNmZXIgU1MKLXV1czEJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDAxJ0IKLQktLSBVVVMxIHVzZXItdG8tdXNlciBzaWduYWxsaW5nIAotdXVzMgkJCQlTUy1Db2RlIDo6PSAnMTAwMDAwMTAnQgotCS0tIFVVUzIgdXNlci10by11c2VyIHNpZ25hbGxpbmcKLXV1czMJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDExJ0IKLQktLSBVVVMzIHVzZXItdG8tdXNlciBzaWduYWxsaW5nCi0KLWFsbEJhcnJpbmdTUwkJU1MtQ29kZSA6Oj0gJzEwMDEwMDAwJ0IKLQktLSBhbGwgYmFycmluZyBTUwotYmFycmluZ09mT3V0Z29pbmdDYWxscwlTUy1Db2RlIDo6PSAnMTAwMTAwMDEnQgotCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgY2FsbHMKLWJhb2MJCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMDEwJ0IKLQktLSBiYXJyaW5nIG9mIGFsbCBvdXRnb2luZyBjYWxscwotYm9pYwkJCQlTUy1Db2RlIDo6PSAnMTAwMTAwMTEnQgotCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgaW50ZXJuYXRpb25hbCBjYWxscwotYm9pY0V4SEMJCQlTUy1Db2RlIDo6PSAnMTAwMTAxMDAnQgotCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgaW50ZXJuYXRpb25hbCBjYWxscyBleGNlcHQgdGhvc2UgZGlyZWN0ZWQKLQktLSB0byB0aGUgaG9tZSBQTE1OIENvdW50cnkKLWJhcnJpbmdPZkluY29taW5nQ2FsbHMJU1MtQ29kZSA6Oj0gJzEwMDExMDAxJ0IKLQktLSBiYXJyaW5nIG9mIGluY29taW5nIGNhbGxzCi1iYWljCQkJCVNTLUNvZGUgOjo9ICcxMDAxMTAxMCdCCi0JLS0gYmFycmluZyBvZiBhbGwgaW5jb21pbmcgY2FsbHMKLWJpY1JvYW0JCQlTUy1Db2RlIDo6PSAnMTAwMTEwMTEnQgotCS0tIGJhcnJpbmcgb2YgaW5jb21pbmcgY2FsbHMgd2hlbiByb2FtaW5nIG91dHNpZGUgaG9tZSBQTE1OCi0JLS0gQ291bnRyeQotCi1hbGxQTE1OLXNwZWNpZmljU1MJU1MtQ29kZSA6Oj0gJzExMTEwMDAwJ0IKLXBsbW4tc3BlY2lmaWNTUy0xCVNTLUNvZGUgOjo9ICcxMTExMDAwMSdCCi1wbG1uLXNwZWNpZmljU1MtMglTUy1Db2RlIDo6PSAnMTExMTAwMTAnQgotcGxtbi1zcGVjaWZpY1NTLTMJU1MtQ29kZSA6Oj0gJzExMTEwMDExJ0IKLXBsbW4tc3BlY2lmaWNTUy00CVNTLUNvZGUgOjo9ICcxMTExMDEwMCdCCi1wbG1uLXNwZWNpZmljU1MtNQlTUy1Db2RlIDo6PSAnMTExMTAxMDEnQgotcGxtbi1zcGVjaWZpY1NTLTYJU1MtQ29kZSA6Oj0gJzExMTEwMTEwJ0IKLXBsbW4tc3BlY2lmaWNTUy03CVNTLUNvZGUgOjo9ICcxMTExMDExMSdCCi1wbG1uLXNwZWNpZmljU1MtOAlTUy1Db2RlIDo6PSAnMTExMTEwMDAnQgotcGxtbi1zcGVjaWZpY1NTLTkJU1MtQ29kZSA6Oj0gJzExMTExMDAxJ0IKLXBsbW4tc3BlY2lmaWNTUy1BCVNTLUNvZGUgOjo9ICcxMTExMTAxMCdCCi1wbG1uLXNwZWNpZmljU1MtQglTUy1Db2RlIDo6PSAnMTExMTEwMTEnQgotcGxtbi1zcGVjaWZpY1NTLUMJU1MtQ29kZSA6Oj0gJzExMTExMTAwJ0IKLXBsbW4tc3BlY2lmaWNTUy1ECVNTLUNvZGUgOjo9ICcxMTExMTEwMSdCCi1wbG1uLXNwZWNpZmljU1MtRQlTUy1Db2RlIDo6PSAnMTExMTExMTAnQgotcGxtbi1zcGVjaWZpY1NTLUYJU1MtQ29kZSA6Oj0gJzExMTExMTExJ0IKLQotYWxsQ2FsbFByaW9yaXR5U1MJU1MtQ29kZSA6Oj0gJzEwMTAwMDAwJ0IKLQktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQotCS0tIGFsbCBjYWxsIHByaW9yaXR5IFNTCi1lbWxwcAkJCVNTLUNvZGUgOjo9ICcxMDEwMDAwMSdCCi0JLS0gZW5oYW5jZWQgTXVsdGlsZXZlbCBQcmVjZWRlbmNlIFByZS1lbXB0aW9uIChFTUxQUCkgc2VydmljZQotCi1hbGxMQ1NQcml2YWN5RXhjZXB0aW9uCVNTLUNvZGUgOjo9ICcxMDExMDAwMCdCCi0JLS0gYWxsIExDUyBQcml2YWN5IEV4Y2VwdGlvbiBDbGFzc2VzCi11bml2ZXJzYWwJCQlTUy1Db2RlIDo6PSAnMTAxMTAwMDEnQgotCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGFueSBMQ1MgY2xpZW50Ci1jYWxsU2Vzc2lvblJlbGF0ZWQJU1MtQ29kZSA6Oj0gJzEwMTEwMDEwJ0IKLQktLSBhbGxvdyBsb2NhdGlvbiBieSBhbnkgdmFsdWUgYWRkZWQgTENTIGNsaWVudCB0byB3aGljaCBhIGNhbGwvc2Vzc2lvbiAKLQktLSBpcyBlc3RhYmxpc2hlZCBmcm9tIHRoZSB0YXJnZXQgTVMKLWNhbGxTZXNzaW9uVW5yZWxhdGVkCVNTLUNvZGUgOjo9ICcxMDExMDAxMSdCCi0JLS0gYWxsb3cgbG9jYXRpb24gYnkgZGVzaWduYXRlZCBleHRlcm5hbCB2YWx1ZSBhZGRlZCBMQ1MgY2xpZW50cwotcGxtbm9wZXJhdG9yCQlTUy1Db2RlIDo6PSAnMTAxMTAxMDAnQgotCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGRlc2lnbmF0ZWQgUExNTiBvcGVyYXRvciBMQ1MgY2xpZW50cyAKLXNlcnZpY2VUeXBlCQlTUy1Db2RlIDo6PSAnMTAxMTAxMDEnQgotCS0tIGFsbG93IGxvY2F0aW9uIGJ5IExDUyBjbGllbnRzIG9mIGEgZGVzaWduYXRlZCBMQ1Mgc2VydmljZSB0eXBlCi0KLWFsbE1PTFItU1MJCVNTLUNvZGUgOjo9ICcxMTAwMDAwMCdCCi0JLS0gYWxsIE1vYmlsZSBPcmlnaW5hdGluZyBMb2NhdGlvbiBSZXF1ZXN0IENsYXNzZXMKLWJhc2ljU2VsZkxvY2F0aW9uCVNTLUNvZGUgOjo9ICcxMTAwMDAwMSdCCi0JLS0gYWxsb3cgYW4gTVMgdG8gcmVxdWVzdCBpdHMgb3duIGxvY2F0aW9uCi1hdXRvbm9tb3VzU2VsZkxvY2F0aW9uCVNTLUNvZGUgOjo9ICcxMTAwMDAxMCdCCi0JLS0gYWxsb3cgYW4gTVMgdG8gcGVyZm9ybSBzZWxmIGxvY2F0aW9uIHdpdGhvdXQgaW50ZXJhY3Rpb24KLQktLSB3aXRoIHRoZSBQTE1OIGZvciBhIHByZWRldGVybWluZWQgcGVyaW9kIG9mIHRpbWUKLXRyYW5zZmVyVG9UaGlyZFBhcnR5CVNTLUNvZGUgOjo9ICcxMTAwMDAxMSdCCi0JLS0gYWxsb3cgYW4gTVMgdG8gcmVxdWVzdCB0cmFuc2ZlciBvZiBpdHMgbG9jYXRpb24gdG8gYW5vdGhlciBMQ1MgY2xpZW50Ci0KLUVORAotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzZjdmMC4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1EYXRhVHlwZXMuYXNuCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS0tICRJZDogTUFQLVNTLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKLS0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgIAotLS0gMTcuNy40CVN1cHBsZW1lbnRhcnkgc2VydmljZSBkYXRhIHR5cGVzCi0gCi1NQVAtU1MtRGF0YVR5cGVzIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQotCi1ERUZJTklUSU9OUwotCi1JTVBMSUNJVCBUQUdTCi0KLTo6PQotCi1CRUdJTgotCi1FWFBPUlRTCi0JUmVnaXN0ZXJTUy1BcmcsCi0JU1MtSW5mbywKLQlTUy1TdGF0dXMsCi0JU1MtU3Vic2NyaXB0aW9uT3B0aW9uLAotCVNTLUZvckJTLUNvZGUsCi0JSW50ZXJyb2dhdGVTUy1SZXMsCi0JVVNTRC1BcmcsCi0JVVNTRC1SZXMsIAotCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKLQlVU1NELVN0cmluZywKLQlQYXNzd29yZCwKLQlHdWlkYW5jZUluZm8sCi0JU1MtTGlzdCwKLQlTUy1JbmZvTGlzdCwKLQlPdmVycmlkZUNhdGVnb3J5LAotCUNsaVJlc3RyaWN0aW9uT3B0aW9uLAotCU5vUmVwbHlDb25kaXRpb25UaW1lLAotCUZvcndhcmRpbmdPcHRpb25zLAotCW1heE51bU9mU1MsCi0JU1MtRGF0YSwKLQlTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uQXJnLAotCVNTLUludm9jYXRpb25Ob3RpZmljYXRpb25SZXMsCi0JQ0NCUy1GZWF0dXJlLAotCVJlZ2lzdGVyQ0MtRW50cnlBcmcsCi0JUmVnaXN0ZXJDQy1FbnRyeVJlcywKLQlFcmFzZUNDLUVudHJ5QXJnLAotCUVyYXNlQ0MtRW50cnlSZXMKLTsKLQotSU1QT1JUUwotCUFkZHJlc3NTdHJpbmcsCi0JSVNETi1BZGRyZXNzU3RyaW5nLAotCUlTRE4tU3ViYWRkcmVzc1N0cmluZywKLQlGVE4tQWRkcmVzc1N0cmluZywKLQlJTVNJLAotCUJhc2ljU2VydmljZUNvZGUsCi0JQWxlcnRpbmdQYXR0ZXJuLAotCUVNTFBQLVByaW9yaXR5LCAKLQlNYXhNQy1CZWFyZXJzLAotCU1DLUJlYXJlcnMsCi0JRXh0ZXJuYWxTaWduYWxJbmZvCi1GUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9Ci0KLQlFeHRlbnNpb25Db250YWluZXIKLUZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7Ci0gICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KLQotCVNTLUNvZGUKLUZST00gTUFQLVNTLUNvZGUgewotICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQotOwotCi0KLVJlZ2lzdGVyU1MtQXJnIDo6PSBTRVFVRU5DRSB7Ci0Jc3MtQ29kZQkJU1MtQ29kZSwKLQliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKLQlmb3J3YXJkZWRUb051bWJlcglbNF0gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzZdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQlub1JlcGx5Q29uZGl0aW9uVGltZQlbNV0gTm9SZXBseUNvbmRpdGlvblRpbWUJT1BUSU9OQUwsCi0JLi4uLAotCWRlZmF1bHRQcmlvcml0eQlbN10gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCi0JbmJyVXNlcgkJWzhdIE1DLUJlYXJlcnMJT1BUSU9OQUwsCi0JbG9uZ0ZUTi1TdXBwb3J0ZWQJWzldCU5VTEwJCU9QVElPTkFMIH0KLQotTm9SZXBseUNvbmRpdGlvblRpbWUgOjo9IElOVEVHRVIgKDUuLjMwKQotCi1TUy1JbmZvIDo6PSBDSE9JQ0UgewotCWZvcndhcmRpbmdJbmZvCVswXSBGb3J3YXJkaW5nSW5mbywKLQljYWxsQmFycmluZ0luZm8JWzFdIENhbGxCYXJyaW5nSW5mbywKLQlzcy1EYXRhCQlbM10gU1MtRGF0YX0KLQotRm9yd2FyZGluZ0luZm8gOjo9IFNFUVVFTkNFIHsKLQlzcy1Db2RlCQlTUy1Db2RlCQlPUFRJT05BTCwKLQlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJRm9yd2FyZGluZ0ZlYXR1cmVMaXN0LAotCS4uLn0KLQotRm9yd2FyZGluZ0ZlYXR1cmVMaXN0IDo6PSAKLQlTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcykgT0YKLQkJCQlGb3J3YXJkaW5nRmVhdHVyZQotCi1Gb3J3YXJkaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgewotCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAotCXNzLVN0YXR1cwkJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKLQlmb3J3YXJkZWRUb051bWJlcglbNV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbOF0gSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCWZvcndhcmRpbmdPcHRpb25zCVs2XSBGb3J3YXJkaW5nT3B0aW9ucwlPUFRJT05BTCwKLQlub1JlcGx5Q29uZGl0aW9uVGltZQlbN10gTm9SZXBseUNvbmRpdGlvblRpbWUJT1BUSU9OQUwsCi0JLi4uLAotCWxvbmdGb3J3YXJkZWRUb051bWJlcglbOV0gRlROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQotCi1TUy1TdGF0dXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCi0KLQktLSBiaXRzIDg3NjU6IDAwMDAgKHVudXNlZCkKLQktLSBiaXRzIDQzMjE6IFVzZWQgdG8gY29udmV5IHRoZSAiUCBiaXQiLCJSIGJpdCIsIkEgYml0IiBhbmQgIlEgYml0IiwKLQktLQkJICAgIHJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugc3RhdGUgaW5mb3JtYXRpb24KLQktLQkJICAgIGFzIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMTEgWzIyXQotCi0JLS0gYml0IDQ6ICJRIGJpdCIKLQotCS0tIGJpdCAzOiAiUCBiaXQiCi0KLQktLSBiaXQgMjogIlIgYml0IgotCi0JLS0gYml0IDE6ICJBIGJpdCIKLQotRm9yd2FyZGluZ09wdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCi0KLQktLSBiaXQgODogbm90aWZpY2F0aW9uIHRvIGZvcndhcmRpbmcgcGFydHkKLQktLQkwICBubyBub3RpZmljYXRpb24KLQktLQkxICBub3RpZmljYXRpb24KLQotCS0tIGJpdCA3OiByZWRpcmVjdGluZyBwcmVzZW50YXRpb24KLQktLQkwIG5vIHByZXNlbnRhdGlvbiAgCi0JLS0JMSAgcHJlc2VudGF0aW9uCi0KLQktLSBiaXQgNjogbm90aWZpY2F0aW9uIHRvIGNhbGxpbmcgcGFydHkKLQktLQkwICBubyBub3RpZmljYXRpb24KLQktLQkxICBub3RpZmljYXRpb24KLQotCS0tIGJpdCA1OiAwICh1bnVzZWQpCi0KLQktLSBiaXRzIDQzOiBmb3J3YXJkaW5nIHJlYXNvbgotCS0tCTAwICBtcyBub3QgcmVhY2hhYmxlCi0JLS0JMDEgIG1zIGJ1c3kKLQktLQkxMCAgbm8gcmVwbHkKLQktLQkxMSAgdW5jb25kaXRpb25hbCB3aGVuIHVzZWQgaW4gYSBTUkkgUmVzdWx0LCAKLQktLQkgICAgb3IgY2FsbCBkZWZsZWN0aW9uIHdoZW4gdXNlZCBpbiBhIFJDSCBBcmd1bWVudAotCS0tIGJpdHMgMjE6IDAwICh1bnVzZWQpCi0KLUNhbGxCYXJyaW5nSW5mbyA6Oj0gU0VRVUVOQ0UgewotCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAotCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJQ2FsbEJhcnJpbmdGZWF0dXJlTGlzdCwKLQkuLi59Ci0KLUNhbGxCYXJyaW5nRmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgotCQkJCUNhbGxCYXJyaW5nRmVhdHVyZQotCi1DYWxsQmFycmluZ0ZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKLQliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKLQlzcy1TdGF0dXMJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKLQkuLi59Ci0KLVNTLURhdGEgOjo9IFNFUVVFTkNFIHsKLQlzcy1Db2RlCQlTUy1Db2RlCQlPUFRJT05BTCwKLQlzcy1TdGF0dXMJCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCi0Jc3MtU3Vic2NyaXB0aW9uT3B0aW9uCVNTLVN1YnNjcmlwdGlvbk9wdGlvbglPUFRJT05BTCwKLQliYXNpY1NlcnZpY2VHcm91cExpc3QJQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAotCS4uLiwKLQlkZWZhdWx0UHJpb3JpdHkJRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCi0JbmJyVXNlcgkJWzVdIE1DLUJlYXJlcnMJT1BUSU9OQUwKLQl9Ci0KLVNTLVN1YnNjcmlwdGlvbk9wdGlvbiA6Oj0gQ0hPSUNFIHsKLQljbGlSZXN0cmljdGlvbk9wdGlvbglbMl0gQ2xpUmVzdHJpY3Rpb25PcHRpb24sCi0Jb3ZlcnJpZGVDYXRlZ29yeQlbMV0gT3ZlcnJpZGVDYXRlZ29yeX0KLQotQ2xpUmVzdHJpY3Rpb25PcHRpb24gOjo9IEVOVU1FUkFURUQgewotCXBlcm1hbmVudCAgKDApLAotCXRlbXBvcmFyeURlZmF1bHRSZXN0cmljdGVkICAoMSksCi0JdGVtcG9yYXJ5RGVmYXVsdEFsbG93ZWQgICgyKX0KLQotT3ZlcnJpZGVDYXRlZ29yeSA6Oj0gRU5VTUVSQVRFRCB7Ci0Jb3ZlcnJpZGVFbmFibGVkICAoMCksCi0Jb3ZlcnJpZGVEaXNhYmxlZCAgKDEpfQotCi1TUy1Gb3JCUy1Db2RlIDo6PSBTRVFVRU5DRSB7Ci0Jc3MtQ29kZQkJU1MtQ29kZSwKLQliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKLQkuLi4sCi0JbG9uZ0ZUTi1TdXBwb3J0ZWQJWzRdCU5VTEwJCU9QVElPTkFMIH0KLQotR2VuZXJpY1NlcnZpY2VJbmZvIDo6PSBTRVFVRU5DRSB7Ci0Jc3MtU3RhdHVzCVNTLVN0YXR1cywKLQljbGlSZXN0cmljdGlvbk9wdGlvbglDbGlSZXN0cmljdGlvbk9wdGlvbglPUFRJT05BTCwKLQkuLi4sCi0JbWF4aW11bUVudGl0bGVkUHJpb3JpdHkJWzBdIEVNTFBQLVByaW9yaXR5CU9QVElPTkFMLAotCWRlZmF1bHRQcmlvcml0eQlbMV0gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCi0JY2Nicy1GZWF0dXJlTGlzdAlbMl0gQ0NCUy1GZWF0dXJlTGlzdAlPUFRJT05BTCwKLQluYnJTQgkJWzNdIE1heE1DLUJlYXJlcnMJT1BUSU9OQUwsCi0JbmJyVXNlcgkJWzRdIE1DLUJlYXJlcnMJT1BUSU9OQUwsCi0JbmJyU04JCVs1XSBNQy1CZWFyZXJzCU9QVElPTkFMIH0KLQotQ0NCUy1GZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDQ0JTLVJlcXVlc3RzKSBPRgotCQkJCUNDQlMtRmVhdHVyZQotCi1tYXhOdW1PZkNDQlMtUmVxdWVzdHMgIElOVEVHRVIgOjo9IDUKLQotQ0NCUy1GZWF0dXJlIDo6PSBTRVFVRU5DRSB7Ci0JY2Nicy1JbmRleAlbMF0gQ0NCUy1JbmRleAlPUFRJT05BTCwKLQliLXN1YnNjcmliZXJOdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKLQliLXN1YnNjcmliZXJTdWJhZGRyZXNzCVsyXSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCi0JYmFzaWNTZXJ2aWNlR3JvdXAJWzNdIEJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCi0JLi4ufQotCi1DQ0JTLUluZGV4ICA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZDQ0JTLVJlcXVlc3RzKQotCi1JbnRlcnJvZ2F0ZVNTLVJlcyA6Oj0gQ0hPSUNFIHsKLQlzcy1TdGF0dXMJCVswXSBTUy1TdGF0dXMsCi0JYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CVsyXSBCYXNpY1NlcnZpY2VHcm91cExpc3QsCi0JZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CVszXSBGb3J3YXJkaW5nRmVhdHVyZUxpc3QsCi0JZ2VuZXJpY1NlcnZpY2VJbmZvCVs0XQlHZW5lcmljU2VydmljZUluZm8gfQotCi1VU1NELUFyZyA6Oj0gU0VRVUVOQ0UgewotCXVzc2QtRGF0YUNvZGluZ1NjaGVtZQlVU1NELURhdGFDb2RpbmdTY2hlbWUsCi0JdXNzZC1TdHJpbmcJVVNTRC1TdHJpbmcsCi0JLi4uICwKLQlhbGVydGluZ1BhdHRlcm4JQWxlcnRpbmdQYXR0ZXJuCU9QVElPTkFMLAotCW1zaXNkbgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCB9Ci0KLVVTU0QtUmVzIDo6PSBTRVFVRU5DRSB7Ci0JdXNzZC1EYXRhQ29kaW5nU2NoZW1lCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKLQl1c3NkLVN0cmluZwlVU1NELVN0cmluZywKLQkuLi59Ci0KLVVTU0QtRGF0YUNvZGluZ1NjaGVtZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBUaGUgc3RydWN0dXJlIG9mIHRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgaXMgZGVmaW5lZCBieQotCS0tIHRoZSBDZWxsIEJyb2FkY2FzdCBEYXRhIENvZGluZyBTY2hlbWUgYXMgZGVzY3JpYmVkIGluCi0JLS0gVFMgM0dQUCBUUyAyMy4wMzggWzI1XQotCi1VU1NELVN0cmluZyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhVU1NELVN0cmluZ0xlbmd0aCkpCi0JLS0gVGhlIHN0cnVjdHVyZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIFVTU0QtU3RyaW5nIGlzIGRlcGVuZGVudAotCS0tIG9uIHRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgYXMgZGVzY3JpYmVkIGluIFRTIDNHUFAgVFMgMjMuMDM4IFsyNV0uCi0KLW1heFVTU0QtU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSAxNjAKLQotUGFzc3dvcmQgOjo9IE51bWVyaWNTdHJpbmcKLQkoRlJPTSAoIjAifCIxInwiMiJ8IjMifCI0InwiNSJ8IjYifCI3InwiOCJ8IjkiKSkKLQkoU0laRSAoNCkpCi0KLUd1aWRhbmNlSW5mbyA6Oj0gRU5VTUVSQVRFRCB7Ci0JZW50ZXJQVyAgKDApLAotCWVudGVyTmV3UFcgICgxKSwKLQllbnRlck5ld1BXLUFnYWluICAoMil9Ci0JLS0gSG93IHRoaXMgaW5mb3JtYXRpb24gaXMgcmVhbGx5IGRlbGl2ZXJlZCB0byB0aGUgc3Vic2NyaWJlcgotCS0tIChkaXNwbGF5LCBhbm5vdW5jZW1lbnQsIC4uLikgaXMgbm90IHBhcnQgb2YgdGhpcwotCS0tIHNwZWNpZmljYXRpb24uCi0KLVNTLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU1MpIE9GCi0JCQkJU1MtQ29kZQotCi1tYXhOdW1PZlNTICBJTlRFR0VSIDo6PSAzMAotCi1TUy1JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKLQkJCQlTUy1JbmZvCi0KLUJhc2ljU2VydmljZUdyb3VwTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VHcm91cHMpIE9GCi0JCQkJQmFzaWNTZXJ2aWNlQ29kZQotCi1tYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcyAgSU5URUdFUiA6Oj0gMTMKLQotU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgewotCWltc2kJCQlbMF0gSU1TSSwKLQltc2lzZG4JCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCi0Jc3MtRXZlbnQJCVsyXSBTUy1Db2RlLAotCS0tIFRoZSBmb2xsb3dpbmcgU1MtQ29kZSB2YWx1ZXMgYXJlIGFsbG93ZWQgOgotCS0tIGVjdAkJU1MtQ29kZSA6Oj0gJzAwMTEwMDAxJ0IKLQktLSBtdWx0aVBUWQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgotCS0tIGNkCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgotCS0tIGNjYnMJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCi0Jc3MtRXZlbnRTcGVjaWZpY2F0aW9uCVszXSBTUy1FdmVudFNwZWNpZmljYXRpb24JT1BUSU9OQUwsCi0JZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uLAotCWItc3Vic2NyaWJlck51bWJlcglbNV0JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAotCWNjYnMtUmVxdWVzdFN0YXRlCVs2XQlDQ0JTLVJlcXVlc3RTdGF0ZQlPUFRJT05BTAotCX0KLQotQ0NCUy1SZXF1ZXN0U3RhdGUgOjo9IEVOVU1FUkFURUQgewotCXJlcXVlc3QgIAkoMCksCi0JcmVjYWxsICAJKDEpLAotCWFjdGl2ZSAgCSgyKSwKLQljb21wbGV0ZWQJKDMpLAotCXN1c3BlbmRlZAkoNCksCi0JZnJvemVuCSg1KSwKLQlkZWxldGVkCSg2KQotCX0KLQotU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCi0JLi4uCi0JfQotCi1TUy1FdmVudFNwZWNpZmljYXRpb24gOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heEV2ZW50U3BlY2lmaWNhdGlvbikgT0YKLQkJCQlBZGRyZXNzU3RyaW5nCi0KLW1heEV2ZW50U3BlY2lmaWNhdGlvbiAgSU5URUdFUiA6Oj0gMgotCi1SZWdpc3RlckNDLUVudHJ5QXJnIDo6PSBTRVFVRU5DRSB7Ci0Jc3MtQ29kZQkJWzBdCVNTLUNvZGUsCi0JY2Nicy1EYXRhCQlbMV0JQ0NCUy1EYXRhCU9QVElPTkFMLAotCS4uLn0KLQotQ0NCUy1EYXRhIDo6PSBTRVFVRU5DRSB7Ci0JY2Nicy1GZWF0dXJlCVswXQlDQ0JTLUZlYXR1cmUsCi0JdHJhbnNsYXRlZEItTnVtYmVyCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcsCi0Jc2VydmljZUluZGljYXRvcglbMl0JU2VydmljZUluZGljYXRvcglPUFRJT05BTCwKLQljYWxsSW5mbwkJWzNdCUV4dGVybmFsU2lnbmFsSW5mbywKLQluZXR3b3JrU2lnbmFsSW5mbwlbNF0JRXh0ZXJuYWxTaWduYWxJbmZvLAotCS4uLn0KLQotU2VydmljZUluZGljYXRvciA6Oj0gQklUIFNUUklORyB7Ci0JY2xpci1pbnZva2VkICgwKSwKLQljYW1lbC1pbnZva2VkICgxKX0gKFNJWkUoMi4uMzIpKSAKLQktLSBleGNlcHRpb24gaGFuZGxpbmc6Ci0JLS0gYml0cyAyIHRvIDMxIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCi0KLVJlZ2lzdGVyQ0MtRW50cnlSZXMgOjo9IFNFUVVFTkNFIHsKLQljY2JzLUZlYXR1cmUJWzBdIENDQlMtRmVhdHVyZQlPUFRJT05BTCwKLQkuLi59Ci0KLUVyYXNlQ0MtRW50cnlBcmcgOjo9IFNFUVVFTkNFIHsKLQlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKLQljY2JzLUluZGV4CVsxXQlDQ0JTLUluZGV4CU9QVElPTkFMLAotCS4uLn0KLQotRXJhc2VDQy1FbnRyeVJlcyA6Oj0gU0VRVUVOQ0UgewotCXNzLUNvZGUJCVswXQlTUy1Db2RlLAotCXNzLVN0YXR1cwkJWzFdIFNTLVN0YXR1cwlPUFRJT05BTCwKLQkuLi59Ci0KLUVORAotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1UUy1Db2RlLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWMwMGJmLi4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLS0gJElkOiBNQVAtVFMtQ29kZS5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKLS0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCi0tLSAxNy43LjkJVGVsZXNlcnZpY2UgQ29kZXMKLSAKLU1BUC1UUy1Db2RlIHsKLSAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0gICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVRTLUNvZGUgKDE5KSB2ZXJzaW9uMTEgKDExKX0KLQotREVGSU5JVElPTlMKLQotOjo9Ci0KLUJFR0lOCi0KLVRlbGVzZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKLQktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKLQktLSB0ZWxlc2VydmljZSwgYSBncm91cCBvZiB0ZWxlc2VydmljZXMsIG9yIGFsbCB0ZWxlc2VydmljZXMuIFRoZQotCS0tIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIEdTTSAyMi4wMDMgWzRdLgotCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgotCi0JLS0gYml0cyA4NzY1NDMyMTogZ3JvdXAgKGJpdHMgODc2NSkgYW5kIHNwZWNpZmljIHNlcnZpY2UKLQktLSAoYml0cyA0MzIxKQotCi1FeHQtVGVsZXNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQotCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQotCS0tIHRlbGVzZXJ2aWNlLCBhIGdyb3VwIG9mIHRlbGVzZXJ2aWNlcywgb3IgYWxsIHRlbGVzZXJ2aWNlcy4gVGhlCi0JLS0gc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgR1NNIDIyLjAwMyBbNF0uCi0JLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0KLQktLSBPQ1RFVCAxOgotCS0tIGJpdHMgODc2NTQzMjE6IGdyb3VwIChiaXRzIDg3NjUpIGFuZCBzcGVjaWZpYyBzZXJ2aWNlCi0JLS0gKGJpdHMgNDMyMSkKLQotCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBJZiByZWNlaXZlZCB0aGUKLSAgICAtLSBFeHQtVGVsZXNlcnZpY2VDb2RlIHNoYWxsIGJlCi0gCS0tIHRyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgZGVmaW5lZCBmb3IgdGhlCi0JLS0gb3BlcmF0aW9uIHRoYXQgdXNlcyB0aGlzIHR5cGUuCi0KLQktLSBFeHQtVGVsZXNlcnZpY2VDb2RlIGluY2x1ZGVzIGFsbCB2YWx1ZXMgZGVmaW5lZCBmb3IgVGVsZXNlcnZpY2VDb2RlLgotCi1hbGxUZWxlc2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMDAwMDAnQgotCi1hbGxTcGVlY2hUcmFuc21pc3Npb25TZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMCdCCi10ZWxlcGhvbnkJCQlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMSdCCi1lbWVyZ2VuY3lDYWxscwkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMTAnQgotCi1hbGxTaG9ydE1lc3NhZ2VTZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMCdCCi1zaG9ydE1lc3NhZ2VNVC1QUAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMSdCCi1zaG9ydE1lc3NhZ2VNTy1QUAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDEwMDAxMCdCCi0KLWFsbEZhY3NpbWlsZVRyYW5zbWlzc2lvblNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDAwJ0IKLWZhY3NpbWlsZUdyb3VwM0FuZEFsdGVyU3BlZWNoCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDAxJ0IKLWF1dG9tYXRpY0ZhY3NpbWlsZUdyb3VwMwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAxMCdCCi1mYWNzaW1pbGVHcm91cDQJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMTEnQgotCi0tLSBUaGUgZm9sbG93aW5nIG5vbi1oaWVyYXJjaGljYWwgQ29tcG91bmQgVGVsZXNlcnZpY2UgR3JvdXBzCi0tLSBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAzMDoKLWFsbERhdGFUZWxlc2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMTAwMDAnQgotCS0tIGNvdmVycyBUZWxlc2VydmljZSBHcm91cHMgJ2FsbEZhY3NpbWlsZVRyYW5zbWlzc2lvblNlcnZpY2VzJwotCS0tIGFuZCAnYWxsU2hvcnRNZXNzYWdlU2VydmljZXMnCi1hbGxUZWxlc2VydmljZXMtRXhlcHRTTVMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMDAwMDAnQgotCS0tIGNvdmVycyBUZWxlc2VydmljZSBHcm91cHMgJ2FsbFNwZWVjaFRyYW5zbWlzc2lvblNlcnZpY2VzJyBhbmQKLQktLSAnYWxsRmFjc2ltaWxlVHJhbnNtaXNzaW9uU2VydmljZXMnCi0tLQotLS0gQ29tcG91bmQgVGVsZXNlcnZpY2UgR3JvdXAgQ29kZXMgYXJlIG9ubHkgdXNlZCBpbiBjYWxsCi0tLSBpbmRlcGVuZGVudCBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugb3BlcmF0aW9ucywgaS5lLiB0aGV5Ci0tLSBhcmUgbm90IHVzZWQgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEgb3IgaW4KLS0tIERlbGV0ZVN1YnNjcmliZXJEYXRhIG1lc3NhZ2VzLgotCi1hbGxWb2ljZUdyb3VwQ2FsbFNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDEwMDAwJ0IKLXZvaWNlR3JvdXBDYWxsCQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAxMDAwMSdCCi12b2ljZUJyb2FkY2FzdENhbGwJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMTAwMTAnQgotCi1hbGxQTE1OLXNwZWNpZmljVFMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMDAnQgotcGxtbi1zcGVjaWZpY1RTLTEJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMDEnQgotcGxtbi1zcGVjaWZpY1RTLTIJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMTAnQgotcGxtbi1zcGVjaWZpY1RTLTMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMTEnQgotcGxtbi1zcGVjaWZpY1RTLTQJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDAnQgotcGxtbi1zcGVjaWZpY1RTLTUJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDEnQgotcGxtbi1zcGVjaWZpY1RTLTYJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMTAnQgotcGxtbi1zcGVjaWZpY1RTLTcJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMTEnQgotcGxtbi1zcGVjaWZpY1RTLTgJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMDAnQgotcGxtbi1zcGVjaWZpY1RTLTkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMDEnQgotcGxtbi1zcGVjaWZpY1RTLUEJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTAnQgotcGxtbi1zcGVjaWZpY1RTLUIJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTEnQgotcGxtbi1zcGVjaWZpY1RTLUMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMDAnQgotcGxtbi1zcGVjaWZpY1RTLUQJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMDEnQgotcGxtbi1zcGVjaWZpY1RTLUUJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMTAnQgotcGxtbi1zcGVjaWZpY1RTLUYJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMTEnQgotCi1FTkQKLQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLUNvbXBvbmVudHMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLUNvbXBvbmVudHMuYXNuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmFkZTZhLi4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbgorKysgL2Rldi9udWxsCkBAIC0xLDE0ODggKzAsMCBAQAotLS0gUlJMUC1Db21wb25lbnRzLmFzbgotLS0gJElkJAotLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDQ0LjAzMSBWNy40LjAgKDIwMDctMDMpCi0tLSBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzQ0X3Nlcmllcy80NC4wMzEvNDQwMzEtNzQwLnppcC80NDAzMS03NDAuZG9jCi0tLQotLS0gNCBDb21wb25lbnRzCi0tLSA1IEVsZW1lbnRzIG9mIENvbXBvbmVudHMKLS0tCi0KLVJSTFAtQ29tcG9uZW50cwotLS0geyBSUkxQLUNvbXBvbmVudHMgfQotCi1ERUZJTklUSU9OUyBBVVRPTUFUSUMgVEFHUyA6Oj0KLQotQkVHSU4KLQotSU1QT1JUUwotCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgVmVsb2NpdHlFc3RpbWF0ZQotRlJPTQotCU1BUC1MQ1MtRGF0YVR5cGVzIHsKLQlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb24xMSAoMTEpfQotCi0JRXh0ZW5zaW9uQ29udGFpbmVyCi1GUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgewotCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0JZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KLTsKLQotCi0tLSBBZGQgaGVyZSBvdGhlciBBU04uMSBkZWZpbml0aW9ucyBwcmVzZW50ZWQgYmVsb3cKLS0tIGluIGNoYXB0ZXJzIDQgYW5kIDUuCi0KLS0tIE1lYXN1cmVtZW50IFBvc2l0aW9uIHJlcXVlc3QgY29tcG9uZW50Ci1Nc3JQb3NpdGlvbi1SZXEgOjo9IFNFUVVFTkNFIHsKLQlwb3NpdGlvbkluc3RydWN0CQlQb3NpdGlvbkluc3RydWN0LAotCXJlZmVyZW5jZUFzc2lzdERhdGEJCVJlZmVyZW5jZUFzc2lzdERhdGEJCU9QVElPTkFMLAotCW1zckFzc2lzdERhdGEJCQlNc3JBc3Npc3REYXRhCQkJT1BUSU9OQUwsCi0Jc3lzdGVtSW5mb0Fzc2lzdERhdGEJU3lzdGVtSW5mb0Fzc2lzdERhdGEJT1BUSU9OQUwsCi0JZ3BzLUFzc2lzdERhdGEJCQlHUFMtQXNzaXN0RGF0YQkJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKLQkuLi4sCi0JLS0gUmVsZWFzZSA5OCBleHRlbnNpb24gZWxlbWVudAotcmVsOTgtTXNyUG9zaXRpb24tUmVxLWV4dGVuc2lvbgkJCVJlbDk4LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTCwJCi0JLS0gUmVsZWFzZSA1IGV4dGVuc2lvbiBlbGVtZW50Ci1yZWw1LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw1LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTCwKLQktLSBSZWxlYXNlIDcgZXh0ZW5zaW9uIGVsZW1lbnQKLXJlbDctTXNyUG9zaXRpb24tUmVxLWV4dGVuc2lvbgkJCVJlbDctTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbgkJCU9QVElPTkFMCi19Ci0KLS0tIE1lYXN1cmVtZW50IFBvc2l0aW9uIHJlc3BvbnNlIGNvbXBvbmVudAotTXNyUG9zaXRpb24tUnNwIDo6PSBTRVFVRU5DRSB7Ci0JbXVsdGlwbGVTZXRzCQkJTXVsdGlwbGVTZXRzCQkJT1BUSU9OQUwsCi0JcmVmZXJlbmNlSWRlbnRpdHkJCVJlZmVyZW5jZUlkZW50aXR5CQlPUFRJT05BTCwKLQlvdGQtTWVhc3VyZUluZm8JCQlPVEQtTWVhc3VyZUluZm8JCQlPUFRJT05BTCwKLQlsb2NhdGlvbkluZm8JCQlMb2NhdGlvbkluZm8JCQlPUFRJT05BTCwKLQlncHMtTWVhc3VyZUluZm8JCQlHUFMtTWVhc3VyZUluZm8JCQlPUFRJT05BTCwKLQlsb2NhdGlvbkVycm9yCQkJTG9jYXRpb25FcnJvcgkJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKLQkuLi4sCQotCS0tIFJlbGVhc2UgZXh0ZW5zaW9uIGhlcmUKLQlyZWwtOTgtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgkJCi0JCQkJCQkJUmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCU9QVElPTkFMLAotCXJlbC01LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24KLQkJCQkJCQlSZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTCwKLQktLSByZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIGFuZCBvdGhlciBwb3NzaWJsZSBmdXR1cmUgZXh0ZW5zaW9ucwotCS0tIGFyZSB0aGUgb25seSBpbmZvcm1hdGlvbiBlbGVtZW50cyB0aGF0IG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgMm5kCi0JLS0gTXNyUG9zaXRpb24tUnNwIGNvbXBvbmVudCB3aGVuIFJSTFAgcHNldWRvLXNlZ21lbnRhdGlvbiBpcyB1c2VkCi0JcmVsLTctTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgotCQkJCQkJCVJlbC03LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCU9QVElPTkFMCi19Ci0KLS0tIEFzc2lzdGFuY2UgRGF0YSBjb21wb25lbnQKLUFzc2lzdGFuY2VEYXRhIDo6PSBTRVFVRU5DRSB7Ci0JcmVmZXJlbmNlQXNzaXN0RGF0YQlSZWZlcmVuY2VBc3Npc3REYXRhCQkJT1BUSU9OQUwsCi0JbXNyQXNzaXN0RGF0YQkJCU1zckFzc2lzdERhdGEJCQlPUFRJT05BTCwKLQlzeXN0ZW1JbmZvQXNzaXN0RGF0YQlTeXN0ZW1JbmZvQXNzaXN0RGF0YQlPUFRJT05BTCwKLQlncHMtQXNzaXN0RGF0YQkJCUdQUy1Bc3Npc3REYXRhCQkJT1BUSU9OQUwsCQotCW1vcmVBc3NEYXRhVG9CZVNlbnQJCU1vcmVBc3NEYXRhVG9CZVNlbnQJCU9QVElPTkFMLAktLSBJZiBub3QgcHJlc2VudCwgaW50ZXJwcmV0IGFzIG9ubHkKLQkJCQkJCQkJCQkJCQkJCQktLSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50IHVzZWQgdG8KLQkJCQkJCQkJCQkJCQkJCQktLSBkZWxpdmVyIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZQotCQkJCQkJCQkJCQkJCQkJCS0tIGRhdGEuCi0JZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAotCS4uLiwKLQktLSBSZWxlYXNlIGV4dGVuc2lvbiBoZXJlCi0JcmVsOTgtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uCVJlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglPUFRJT05BTCwKLQlyZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglSZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglPUFRJT05BTCwKLSByZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiBSZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiBPUFRJT05BTAkKLX0KLQotLS0gUHJvdG9jb2wgRXJyb3IgY29tcG9uZW50Ci1Qcm90b2NvbEVycm9yIDo6PSBTRVFVRU5DRSB7Ci0JZXJyb3JDYXVzZQkJCQlFcnJvckNvZGVzLAkKLQlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCi0JLi4uLAotCS0tIFJlbGVhc2UgZXh0ZW5zaW9ucyBoZXJlCi0JcmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb24gUmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb24JCU9QVElPTkFMCi19Ci0KLS0tIFBvc2l0aW9uIGluc3RydWN0aW9ucwotUG9zaXRpb25JbnN0cnVjdCA6Oj0gU0VRVUVOQ0UgewotCS0tIE1ldGhvZCB0eXBlCi0JbWV0aG9kVHlwZQkJCQlNZXRob2RUeXBlLAkKLQlwb3NpdGlvbk1ldGhvZAkJCVBvc2l0aW9uTWV0aG9kLAotCW1lYXN1cmVSZXNwb25zZVRpbWUJCU1lYXN1cmVSZXNwb25zZVRpbWUsCQkKLQl1c2VNdWx0aXBsZVNldHMJCQlVc2VNdWx0aXBsZVNldHMsCQkKLQllbnZpcm9ubWVudENoYXJhY3RlcglFbnZpcm9ubWVudENoYXJhY3RlcglPUFRJT05BTAkKLX0KLQotLS0KLU1ldGhvZFR5cGUgOjo9IENIT0lDRSB7Ci0JbXNBc3Npc3RlZAkJQWNjdXJhY3lPcHQsCS0tIGFjY3VyYWN5IGlzIG9wdGlvbmFsCi0JbXNCYXNlZAkJCUFjY3VyYWN5LAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5Ci0JbXNCYXNlZFByZWYJCUFjY3VyYWN5LAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5Ci0JbXNBc3Npc3RlZFByZWYJQWNjdXJhY3kgCQktLSBhY2N1cmFjeSBpcyBtYW5kYXRvcnkKLX0KLQotLS0gQWNjdXJhY3kgb2YgdGhlIGxvY2F0aW9uIGVzdGltYXRpb24KLUFjY3VyYWN5T3B0IDo6PSBTRVFVRU5DRSB7Ci0JYWNjdXJhY3kJCUFjY3VyYWN5CU9QVElPTkFMCi19Ci0KLS0tIFRoZSB2YWx1ZXMgb2YgdGhpcyBmaWVsZCBhcmUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiAoVW5jZXJ0YWludHkgY29kZSkKLUFjY3VyYWN5IDo6PSBJTlRFR0VSICgwLi4xMjcpCi0KLQotLS0gUG9zaXRpb24gTWV0aG9kCi1Qb3NpdGlvbk1ldGhvZCA6Oj0gRU5VTUVSQVRFRCB7Ci0JZW90ZCAoMCksCi0JZ3BzICgxKSwKLQlncHNPckVPVEQgKDIpCi19Ci0KLS0tIE1lYXN1cmVtZW50IHJlcXVlc3QgcmVzcG9uc2UgdGltZQotTWVhc3VyZVJlc3BvbnNlVGltZSA6Oj0gSU5URUdFUiAoMC4uNykKLQotLS0gdXNlTXVsdGlwbGUgU2V0cywgRkZTIQotVXNlTXVsdGlwbGVTZXRzIDo6PSBFTlVNRVJBVEVEIHsKLQltdWx0aXBsZVNldHMgKDApLAkJLS0gbXVsdGlwbGUgc2V0cyBhcmUgYWxsb3dlZAotCW9uZVNldCAoMSkJCQkJLS0gc2VuZGluZyBvZiBtdWx0aXBsZSBpcyBub3QgYWxsb3dlZAotfQotCi0tLSBFbnZpcm9ubWVudCBjaGFyYWN0ZXJpemF0aW9uCi1FbnZpcm9ubWVudENoYXJhY3RlciA6Oj0gRU5VTUVSQVRFRCB7Ci0JYmFkQXJlYSAoMCksCQktLSBiYWQgdXJiYW4gb3Igc3VidXJiYW4sIGhlYXZ5IG11bHRpcGF0aCBhbmQgTkxPUwotCW5vdEJhZEFyZWEgKDEpLAkJLS0gbGlnaHQgbXVsdGlwYXRoIGFuZCBOTE9TCi0JbWl4ZWRBcmVhICgyKSwJCS0tIG5vdCBkZWZpbmVkIG9yIG1peGVkIGVudmlyb25tZW50Ci0JLi4uCi19Ci0KLS0tIEUtT1REIHJlZmVyZW5jZSBCVFMgZm9yIEFzc2l0YW5jZSBkYXRhIElFCi1SZWZlcmVuY2VBc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7Ci0JYmNjaENhcnJpZXIJCUJDQ0hDYXJyaWVyLAkJCQkJCS0tIEJDQ0ggY2FycmllcgotCWJzaWMJCQlCU0lDLAkJCQkJCQkJLS0gQlNJQwotCXRpbWVTbG90U2NoZW1lCVRpbWVTbG90U2NoZW1lLCAJCQkJCS0tIFRpbWVzbG90IHNjaGVtZQotCWJ0c1Bvc2l0aW9uCQlCVFNQb3NpdGlvbgkJCU9QVElPTkFMCi19Ci0KLS0tIGVsbGlwc29pZCBwb2ludCBhbmQKLS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQgc2hhcGVzIGFyZSBzdXBwb3J0ZWQKLUJUU1Bvc2l0aW9uIDo6PSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KLQotLS0gUkYgY2hhbm5lbCBudW1iZXIgb2YgQkNDSAotQkNDSENhcnJpZXIgOjo9IElOVEVHRVIgKDAuLjEwMjMpCi0KLS0tIEJhc2Ugc3RhdGlvbiBJZGVudGl0eSBDb2RlCi1CU0lDIDo6PSBJTlRFR0VSICgwLi42MykKLQotLS0gVGltZXNsb3Qgc2NoZW1lCi1UaW1lU2xvdFNjaGVtZSA6Oj0gRU5VTUVSQVRFRCB7Ci0JZXF1YWxMZW5ndGggKDApLAotCXZhcmlvdXNMZW5ndGggKDEpCi19Ci0KLS0tIFRpbWUgc2xvdCAobW9kdWxvKQotTW9kdWxvVGltZVNsb3QgOjo9IElOVEVHRVIgKDAuLjMpCi0KLS0tIEUtT1REIG1lYXN1cmVtZW50IGFzc2lzdGFuY2UgZGF0YSBJRQotLS0gVGhlIHRvdGFsIG51bWJlciBvZiBuZWlnaGJvcnMgaW4gdGhpcyBlbGVtZW50IChNc3JBc3Npc3REYXRhKQotLS0gYW5kIGluIFN5c3RlbUluZm9Bc3Npc3REYXRhIGVsZW1lbnQgKHByZXNlbnRlZCBuZWlnaGJvcnMKLS0tIGNhbiBiZSBhdCBhIG1heGltdW0gMTUhKQotTXNyQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgewotCSBtc3JBc3Npc3RMaXN0IFNlcU9mTXNyQXNzaXN0QlRTCi19Ci1TZXFPZk1zckFzc2lzdEJUUyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTUpKSBPRiBNc3JBc3Npc3RCVFMKLQotTXNyQXNzaXN0QlRTIDo6PSBTRVFVRU5DRSB7Ci0JYmNjaENhcnJpZXIJCQlCQ0NIQ2FycmllciwJCS0tIEJDQ0ggY2FycmllcgotCWJzaWMJCQkJQlNJQywJCQkJLS0gQlNJQwotCW11bHRpRnJhbWVPZmZzZXQJTXVsdGlGcmFtZU9mZnNldCwgCS0tIG11bHRpZnJhbWUgb2Zmc2V0Ci0JdGltZVNsb3RTY2hlbWUJCVRpbWVTbG90U2NoZW1lLAkJLS0gVGltZXNsb3Qgc2NoZW1lCi0Jcm91Z2hSVEQJCQlSb3VnaFJURCwJCQktLSByb3VnaCBSVEQgdmFsdWUKLQotCS0tIExvY2F0aW9uIENhbGN1bGF0aW9uIEFzc2lzdGFuY2UgZGF0YSBpcyBtb3ZlZCBoZXJlCi0JY2FsY0Fzc2lzdGFuY2VCVFMJQ2FsY0Fzc2lzdGFuY2VCVFMJT1BUSU9OQUwKLX0KLQotLS0gTXVsdGlmcmFtZSBvZmZzZXQKLU11bHRpRnJhbWVPZmZzZXQgOjo9IElOVEVHRVIgKDAuLjUxKQotLS0gVGhlIE11bHRpZnJhbWUgT2Zmc2V0IHZhbHVlIDUxIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZAotLS0gc2hhbGwgYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgotCi0tLSBSb3VnaCBSVEQgdmFsdWUgYmV0d2VlbiBvbmUgYmFzZSBzdGF0aW9uIGFuZCByZWZlcmVuY2UgQlRTCi1Sb3VnaFJURCA6Oj0gSU5URUdFUiAoMC4uMTI1MCkKLS0tIFRoZSBSb3VnaFJURCB2YWx1ZSAxMjUwIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZCBzaGFsbAotLS0gYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgotCi0tLSBFLU9URCBNZWFzdXJlbWVudCBhc3Npc3RhbmNlIGRhdGEgZm9yIHN5c3RlbSBpbmZvcm1hdGlvbiBMaXN0IElFCi0tLSBUaGUgdG90YWwgbnVtYmVyIG9mIGJhc2Ugc3RhdGlvbnMgaW4gdGhpcyBlbGVtZW50IChTeXN0ZW1JbmZvQXNzaXN0RGF0YQotLS0gcHJlc2VudGVkIG5laWdoYm9ycykgYW5kIGluIE1zckFzc2lzdERhdGEgZWxlbWVudCBjYW4gYmUgYXQgYSBtYXhpbXVtIDE1LgotU3lzdGVtSW5mb0Fzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKLQlzeXN0ZW1JbmZvQXNzaXN0TGlzdCAJU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTCi19Ci1TZXFPZlN5c3RlbUluZm9Bc3Npc3RCVFM6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMzIpKSBPRiBTeXN0ZW1JbmZvQXNzaXN0QlRTCi0KLS0tIHdoZXRoZXIgbi50aCBpcyBwcmVzZW50IG9yIG5vdCA/Ci1TeXN0ZW1JbmZvQXNzaXN0QlRTIDo6PSBDSE9JQ0UgewotCW5vdFByZXNlbnQJCU5VTEwsCi0JcHJlc2VudAkJCUFzc2lzdEJUU0RhdGEKLX0KLQotLS0gQWN0dWFsIGFzc2lzdGFuY2UgZGF0YSBmb3Igc3lzdGVtIGluZm9ybWF0aW9uIGJhc2Ugc3RhdGlvbgotQXNzaXN0QlRTRGF0YSA6Oj0gU0VRVUVOQ0UgewotCWJzaWMJCQkJQlNJQywJCQkJLS0gQlNJQwotCW11bHRpRnJhbWVPZmZzZXQJTXVsdGlGcmFtZU9mZnNldCwJLS0gbXVsdGlmcmFtZSBvZmZzZXQKLQl0aW1lU2xvdFNjaGVtZQkJVGltZVNsb3RTY2hlbWUsCQktLSBUaW1lc2xvdCBzY2hlbWUKLQlyb3VnaFJURAkJCVJvdWdoUlRELAkJCS0tIHJvdWdoIFJURCB2YWx1ZQotCi0JLS0gTG9jYXRpb24gQ2FsY3VsYXRpb24gQXNzaXN0YW5jZSBkYXRhCi0JY2FsY0Fzc2lzdGFuY2VCVFMJQ2FsY0Fzc2lzdGFuY2VCVFMJT1BUSU9OQUwKLX0KLQotLS0gRS1PVEQgTG9jYXRpb24gY2FsY3VsYXRpb24gYXNzaXN0YW5jZSBkYXRhLAotLS0gQ2FsY0Fzc2lzdGFuY2VCVFMgZWxlbWVudCBpcyBvcHRpb25hbCBub3Qgc3ViZmllbGRzCi1DYWxjQXNzaXN0YW5jZUJUUyA6Oj0gU0VRVUVOQ0UgewotCWZpbmVSVEQJCQkJRmluZVJURCwJCS0tIGZpbmUgUlREIHZhbHVlIGJldHdlZW4gYmFzZSBzdGF0aW9ucwotCXJlZmVyZW5jZVdHUzg0CQlSZWZlcmVuY2VXR1M4NAktLSByZWZlcmVuY2UgY29vcmRpbmF0ZXMKLX0KLQotLS0gQ29vcmRpbmF0ZXMgb2YgbmVpZ2hib3VyIEJUUywgV0dTLTg0IGVsbGlwc29pZAotUmVmZXJlbmNlV0dTODQgOjo9IFNFUVVFTkNFIHsKLQlyZWxhdGl2ZU5vcnRoCVJlbERpc3RhbmNlLAkJCQktLSByZWxhdGl2ZSBkaXN0YW5jZSAoc291dGggbmVnYXRpdmUpCi0JcmVsYXRpdmVFYXN0CVJlbERpc3RhbmNlLAkJCQktLSByZWxhdGl2ZSBkaXN0YW5jZSAod2VzdCBuZWdhdGl2ZSkKLQktLSBSZWxhdGl2ZSBBbHRpdHVkZSBpcyBub3QgYWx3YXlzIGtub3duCi0JcmVsYXRpdmVBbHQJCVJlbGF0aXZlQWx0CQlPUFRJT05BTAktLSByZWxhdGl2ZSBhbHRpdHVkZQotfQotCi0tLSBGaW5lIFJURCB2YWx1ZSBiZXR3ZWVuIHRoaXMgQlRTIGFuZCB0aGUgcmVmZXJlbmNlIEJUUwkKLUZpbmVSVEQgOjo9IElOVEVHRVIgKDAuLjI1NSkKLQotLS0gUmVsYXRpdmUgbm9ydGgvZWFzdCBkaXN0YW5jZQotUmVsRGlzdGFuY2UgOjo9IElOVEVHRVIgKC0yMDAwMDAuLjIwMDAwMCkKLQotLS0gUmVsYXRpdmUgYWx0aXR1ZGUKLVJlbGF0aXZlQWx0IDo6PSBJTlRFR0VSICgtNDAwMC4uNDAwMCkKLQotLS0gTWVhc3VyZSBwb3NpdGlvbiByZXNwb25zZSBJRXMKLS0tIFJlZmVyZW5jZSBJZGVudGl0eQotLS0gTXVsdGlwbGUgc2V0cwotTXVsdGlwbGVTZXRzIDo6PSBTRVFVRU5DRSB7Ci0JLS0gbnVtYmVyIG9mIHJlZmVyZW5jZSBzZXRzCi0JbmJyT2ZTZXRzCQkJSU5URUdFUiAoMi4uMyksCQkKLQotCS0tIFRoaXMgZmllbGQgYWN0dWFsbHkgdGVsbHMgdGhlIG51bWJlciBvZiByZWZlcmVuY2UgQlRTcwotCW5ick9mUmVmZXJlbmNlQlRTcwlJTlRFR0VSICgxLi4zKSwKLQotCS0tIFRoaXMgZmllbGQgaXMgY29uZGl0aW9uYWwgYW5kIGluY2x1ZGVkIG9wdGlvbmFsbHkgb25seSBpZgotCS0tIG5ick9mU2V0cyBpcyAzIGFuZCBudW1iZXIgb2YgcmVmZXJlbmNlIEJUU3MgaXMgMi4KLQlyZWZlcmVuY2VSZWxhdGlvbgkJUmVmZXJlbmNlUmVsYXRpb24JCU9QVElPTkFMCi19Ci0KLS0tIFJlbGF0aW9uIGJldHdlZW4gcmVmZW5jZSBCVFNzIGFuZCBzZXRzCi1SZWZlcmVuY2VSZWxhdGlvbiA6Oj0gRU5VTUVSQVRFRCB7Ci0Jc2Vjb25kQlRTVGhpcmRTZXQgKDApLAktLSAxc3QgQlRTIHJlbGF0ZWQgdG8gMXN0IGFuZCAybmQgc2V0cwotCXNlY29uZEJUU1NlY29uZFNldCAoMSksCS0tIDFzdCBCVFMgcmVsYXRlZCB0byAxc3QgYW5kIDNyZCBzZXRzCi0JZmlyc3RCVFNGaXJzdFNldCAoMikJLS0gMXN0IEJUUyByZWxhdGVkIHRvIDFzdCBzZXQKLX0KLQotLS0gUmVmZXJlbmNlIEJUUyBJZGVudGl0eSwgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG51bWJlciBvZgotLS0gQlRTcyB0b2xkIG5ick9mUmVmZXJlbmNlQlRTcyBmaWVsZCBpbiBNdWx0aXBsZSBzZXRzIGVsZW1lbnQpCi1SZWZlcmVuY2VJZGVudGl0eSA6Oj0gU0VRVUVOQ0UgewotCS0tIFJlZmVyZW5jZSBCVFMgbGlzdAotCXJlZkJUU0xpc3QJCVNlcU9mUmVmZXJlbmNlSWRlbnRpdHlUeXBlCi19Ci1TZXFPZlJlZmVyZW5jZUlkZW50aXR5VHlwZSA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMykpIE9GIFJlZmVyZW5jZUlkZW50aXR5VHlwZQotCi0tLSBDZWxsIGlkZW50aXR5Ci1SZWZlcmVuY2VJZGVudGl0eVR5cGUgOjo9IENIT0lDRSB7Ci0JYnNpY0FuZENhcnJpZXIJQlNJQ0FuZENhcnJpZXIsCQktLSBCU0lDIGFuZCBDYXJyaWVyCi0JY2kJCQkJQ2VsbElELAkJCQktLSBDZWxsIElELCBMQUMgbm90IG5lZWRlZAotCXJlcXVlc3RJbmRleAlSZXF1ZXN0SW5kZXgsCQktLSBJbmRleCB0byBSZXF1ZXN0ZWQgTmVpZ2hib3IgTGlzdAotCXN5c3RlbUluZm9JbmRleAlTeXN0ZW1JbmZvSW5kZXgsCS0tIEluZGV4IHRvIFN5c3RlbSBpbmZvIGxpc3QsIHRoaXMgdHlwZSBvZiByZWYuIGlkZW50aXR5Ci0JCQkJCQkJCQkJLS0gc2hhbGwgbm90IGJlIHVzZWQgYnkgdGhlIE1TIHVubGVzcyBpdCBoYXMgcmVjZWl2ZWQKLQkJCQkJCQkJCQktLSB0aGUgU3lzdGVtSW5mb0Fzc2lzdERhdGEgZnJvbSB0aGUgU01MQyBmb3IgdGhpcyBjZWxsLgotCWNpQW5kTEFDCQlDZWxsSURBbmRMQUMJCS0tIENJIGFuZCBMQUMKLX0KLQotQlNJQ0FuZENhcnJpZXIgOjo9IFNFUVVFTkNFIHsKLQljYXJyaWVyCUJDQ0hDYXJyaWVyLAotCWJzaWMJCUJTSUMKLX0KLQotUmVxdWVzdEluZGV4IDo6PSBJTlRFR0VSICgxLi4xNikKLQotU3lzdGVtSW5mb0luZGV4IDo6PSBJTlRFR0VSICgxLi4zMikKLQotQ2VsbElEQW5kTEFDIDo6PSBTRVFVRU5DRSB7Ci0JcmVmZXJlbmNlTEFDCUxBQ0lELAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKLQlyZWZlcmVuY2VDSQkJQ2VsbElECQkJCS0tIENlbGwgaWRlbnRpdHkKLX0KLUNlbGxJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCi1MQUNJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCi0KLS0tIE9URC1NZWFzdXJlSW5mbwotT1RELU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7Ci0JLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cywgT1RELU1zckVsZW1lbnQgaXMgcmVwZWF0ZWQgbnVtYmVyIG9mIHRpbWVzCi0JLS0gdG9sZCBpbiBuYnJPZlJlZmVyZW5jZUJUU3MgaW4gTXVsdGlwbGVTZXRzLCBkZWZhdWx0IHZhbHVlIGlzIDEKLQlvdGRNc3JGaXJzdFNldHMJCU9URC1Nc3JFbGVtZW50Rmlyc3QsCi0KLQktLSBpZiBtb3JlIHRoYW4gb25lIHNldHMgYXJlIHByZXNlbnQgdGhpcyBlbGVtZW50IGlzIHJlcGVhdGVkCi0JLS0gTnVtYmVyT2ZTZXRzIC0gMSAoLTEgPSBmaXJzdCBzZXQpCi0Jb3RkTXNyUmVzdFNldHMJCVNlcU9mT1RELU1zckVsZW1lbnRSZXN0CQlPUFRJT05BTAotfQotCi1TZXFPZk9URC1Nc3JFbGVtZW50UmVzdCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMikpIE9GIE9URC1Nc3JFbGVtZW50UmVzdAotCi0tLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIGZvciAxIHNldAotT1RELU1zckVsZW1lbnRGaXJzdCA6Oj0gU0VRVUVOQ0UgewotCXJlZkZyYW1lTnVtYmVyCQkJSU5URUdFUiAoMC4uNDI0MzEpLCAJCQkJLS0gRnJhbWUgbnVtYmVyIG1vZHVsbyA0MjQzMgotCXJlZmVyZW5jZVRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKLQl0b2FNZWFzdXJlbWVudHNPZlJlZglUT0EtTWVhc3VyZW1lbnRzT2ZSZWYJT1BUSU9OQUwsCi0Jc3RkUmVzb2x1dGlvbgkJCVN0ZFJlc29sdXRpb24sCi0JdGFDb3JyZWN0aW9uCQkJSU5URUdFUiAoMC4uOTYwKQkJT1BUSU9OQUwsCS0tIFRBIGNvcnJlY3Rpb24KLQotCS0tIG1lYXN1cmVkIG5laWdoYm9ycyBpbiBPVEQgbWVhc3VyZW1lbnRzCi0Jb3RkLUZpcnN0U2V0TXNycyAJCVNlcU9mT1RELUZpcnN0U2V0TXNycyAJT1BUSU9OQUwKLX0KLVNlcU9mT1RELUZpcnN0U2V0TXNycyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTApKSBPRiBPVEQtRmlyc3RTZXRNc3JzCi0KLS0tIE9URCBtZWFzdXJlbnQgaW5mb3JtYXRpb24gMiBhbmQgMyBzZXRzIGlmIGV4aXN0Ci1PVEQtTXNyRWxlbWVudFJlc3QgOjo9IFNFUVVFTkNFIHsKLQlyZWZGcmFtZU51bWJlcgkJCUlOVEVHRVIgKDAuLjQyNDMxKSwgCQkJCQktLSBGcmFtZSBudW1iZXIgbW9kdWxvIDQyNDMyCi0JcmVmZXJlbmNlVGltZVNsb3QJCU1vZHVsb1RpbWVTbG90LAotCXRvYU1lYXN1cmVtZW50c09mUmVmCVRPQS1NZWFzdXJlbWVudHNPZlJlZgkJT1BUSU9OQUwsCi0Jc3RkUmVzb2x1dGlvbgkJCVN0ZFJlc29sdXRpb24sCi0JdGFDb3JyZWN0aW9uCQkJSU5URUdFUiAoMC4uOTYwKQkJCU9QVElPTkFMLAktLSBUQSBjb3JyZWN0aW9uCi0KLQktLSBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cwotCW90ZC1Nc3JzT2ZPdGhlclNldHMgCVNlcU9mT1RELU1zcnNPZk90aGVyU2V0cwlPUFRJT05BTAotfQotU2VxT2ZPVEQtTXNyc09mT3RoZXJTZXRzIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xMCkpIE9GIE9URC1Nc3JzT2ZPdGhlclNldHMKLQotLS0gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBUT0EgbWVhc3VyZW1lbnRzIGZyb20gdGhlIHJlZmVyZW5jZSBCVFMKLVRPQS1NZWFzdXJlbWVudHNPZlJlZiA6Oj0gU0VRVUVOQ0UgewotCXJlZlF1YWxpdHkJCQlSZWZRdWFsaXR5LAotCW51bU9mTWVhc3VyZW1lbnRzCU51bU9mTWVhc3VyZW1lbnRzCi19Ci0KLVJlZlF1YWxpdHkgOjo9IElOVEVHRVIgKDAuLjMxKQkJCS0tIFN0IERldiBvZiBUT0Egb2YgcmVmZXJlbmNlIGFzIGRlZmluZWQgaW4gYW5uZXgKLU51bU9mTWVhc3VyZW1lbnRzIDo6PSBJTlRFR0VSICgwLi43KQktLSBOby4gb2YgbWVhc3VyZW1lbnRzIGZvciBSZWZRdWFsaXR5IGFzIGRlZmluZWQgaW4gYW5uZXgKLVN0ZFJlc29sdXRpb24gOjo9IElOVEVHRVIgKDAuLjMpCQktLSBWYWx1ZXMgb2YgcmVzb2x1dGlvbiBhcmUgZGVmaW5lZCBpbiBhbm5leAotCi1PVEQtRmlyc3RTZXRNc3JzIDo6PSBPVEQtTWVhc3VyZW1lbnRXaXRoSUQKLQotLS0gTmVpZ2hib3VyIGluZm8gaW4gT1REIG1lYXN1cmVtZW50cyAwLTEwIHRpbWVzIGluIFREIG1lYXN1cmVtZW50IGluZm8KLU9URC1Nc3JzT2ZPdGhlclNldHMgOjo9IENIT0lDRSB7Ci0JaWRlbnRpdHlOb3RQcmVzZW50CU9URC1NZWFzdXJlbWVudCwJCi0JaWRlbnRpdHlQcmVzZW50CQlPVEQtTWVhc3VyZW1lbnRXaXRoSUQKLX0KLQotLS0gRm9yIHRoaXMgT1REIG1lYXN1cmVtZW50IGlkZW50aXR5IGlzIHNhbWUgYXMgdGhlIGlkZW50aXR5IG9mIEJUUwotLS0gaW4gdGhlIGZpcnN0IHNldCB3aXRoIHNhbWUgc2VxdWVuY2UgbnVtYmVyCi1PVEQtTWVhc3VyZW1lbnQgOjo9IFNFUVVFTkNFIHsKLQluYm9yVGltZVNsb3QJTW9kdWxvVGltZVNsb3QsCi0JZW90ZFF1YWxpdHkJCUVPVERRdWFsaXR5LAotCW90ZFZhbHVlCQlPVERWYWx1ZQotfQotCi0tLSBUaGlzIG1lYXN1cmVtZW50IGNvbnRhaW5zIHRoZSBCVFMgaWRlbnRpdHkgYW5kIG1lYXN1cmVtZW50Ci1PVEQtTWVhc3VyZW1lbnRXaXRoSUQgOjo9U0VRVUVOQ0UgewotCW5laWdoYm9ySWRlbnRpdHkJTmVpZ2hib3JJZGVudGl0eSwKLQluYm9yVGltZVNsb3QJCU1vZHVsb1RpbWVTbG90LAotCWVvdGRRdWFsaXR5CQkJRU9URFF1YWxpdHksCi0Jb3RkVmFsdWUJCQlPVERWYWx1ZQotfQotCi1FT1REUXVhbGl0eSA6Oj0gU0VRVUVOQ0UgewotCW5ick9mTWVhc3VyZW1lbnRzCUlOVEVHRVIJKDAuLjcpLAotCXN0ZE9mRU9URAkJCUlOVEVHRVIgKDAuLjMxKQotfQotCi1OZWlnaGJvcklkZW50aXR5IDo6PSBDSE9JQ0UgewotCWJzaWNBbmRDYXJyaWVyCQlCU0lDQW5kQ2FycmllciwJCS0tIEJTSUMgYW5kIENhcnJpZXIKLQljaQkJCQkJQ2VsbElELAkJCQktLSBDZWxsIElELCBMQUMgbm90IG5lZWRlZAotCW11bHRpRnJhbWVDYXJyaWVyCU11bHRpRnJhbWVDYXJyaWVyLCAJLS0gTXVsdGlGcmFtZU9mZmVzdCBhbmQgQlNJQwotCXJlcXVlc3RJbmRleAkJUmVxdWVzdEluZGV4LAkJLS0gSW5kZXggdG8gUmVxdWVzdGVkIE5laWdoYm9yIExpc3QKLQlzeXN0ZW1JbmZvSW5kZXgJCVN5c3RlbUluZm9JbmRleCwJLS0gSW5kZXggdG8gU3lzdGVtIGluZm8gbGlzdCwgdGhpcyB0eXBlIG9mIG5laWdoYm91cgotCQkJCQkJCQkJCQktLSBpZGVudGl0eSBzaGFsbCBub3QgYmUgdXNlZCBieSB0aGUgTVMgdW5sZXNzIGl0IGhhcwotCQkJCQkJCQkJCQktLSByZWNlaXZlZCB0aGUgU3lzdGVtSW5mb0Fzc2lzdERhdGEgZnJvbSB0aGUgU01MQyBmb3IKLQkJCQkJCQkJCQkJLS0gdGhpcyBjZWxsLgotCWNpQW5kTEFDCQkJQ2VsbElEQW5kTEFDCQktLSBDSSBhbmQgTEFDCi19Ci0KLS0tIE11bHRpZnJhbWUgYW5kIGNhcnJpZXIKLU11bHRpRnJhbWVDYXJyaWVyIDo6PSBTRVFVRU5DRSB7Ci0JYmNjaENhcnJpZXIJCQlCQ0NIQ2FycmllciwKLQltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQKLX0KLQotLS0gT1REIG1lYXN1cmVtZW50IHZhbHVlIGZvciBuZWlnaGJvdXIKLU9URFZhbHVlIDo6PSBJTlRFR0VSICgwLi4zOTk5OSkKLQotLS0gTG9jYXRpb24gaW5mb3JtYXRpb24gSUUKLUxvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgewotCXJlZkZyYW1lCQlJTlRFR0VSICgwLi42NTUzNSksCQkJLS0gUmVmZXJlbmNlIEZyYW1lIG51bWJlcgotCS0tIElmIHJlZkZyYW1lIGlzIHdpdGhpbiAoNDI0MzIuLjY1NTM1KSwgaXQgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIKLQktLSBpbiB0aGF0IGNhc2UgdGhlIE1TIHNob3VsZCBwcm92aWRlIEdQUyBUT1cgaWYgYXZhaWxhYmxlCi0JZ3BzVE9XCQkJSU5URUdFUiAoMC4uMTQzOTk5OTkpCU9QVElPTkFMLAktLSBHUFMgVE9XCi0JZml4VHlwZQkJCUZpeFR5cGUsCi0JLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZkZyYW1lIGlzIDAgLSA0MjQzMQotCS0tIFBvc3NpYmxlIHNoYXBlcyBjYXJyaWVkIGluIHBvc0VzdGltYXRlIGFyZQotCS0tIGVsbGlwc29pZCBwb2ludCwKLQktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKLQktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlCi0JLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAotCXBvc0VzdGltYXRlCQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KLX0KLQotRml4VHlwZSA6Oj0gSU5URUdFUiB7Ci0JdHdvREZpeCAoMCksCi0JdGhyZWVERml4ICgxKQotfSAoMC4uMSkKLQotLS0gR1BTLU1lYXN1cmVtZW50IGluZm9ybWF0aW9uCi1HUFMtTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKLQktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzCi0JLS0gdXNlciBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhpcyBlbGVtZW50IGlzIG51bWJlciBvZiBlbGVtZW50cwotCS0tIGRlZmluZWQgaW4gcmVmZXJlbmNlIEJUUyBpZGVudGl0eQotCWdwc01zclNldExpc3QJU2VxT2ZHUFMtTXNyU2V0RWxlbWVudAkKLX0KLVNlcU9mR1BTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBHUFMtTXNyU2V0RWxlbWVudAotCi0tLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIDEtMyB0aW1lcyBpbiBtZXNzYWdlCi1HUFMtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgewotCXJlZkZyYW1lCQlJTlRFR0VSICgwLi42NTUzNSkJT1BUSU9OQUwsIAktLSBSZWZlcmVuY2UgRnJhbWUgbnVtYmVyCi0JZ3BzVE9XCQkJR1BTVE9XMjRiLAkJCQkJCS0tIEdQUyBUT1cKLQktLSBOb3RlIHRoYXQgYXBwbGljYWJsZSByYW5nZSBmb3IgcmVmRnJhbWUgaXMgMCAtIDQyNDMxCi0KLS0tTl9TQVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgZ3BzLW1zckxpc3QKLQotCWdwcy1tc3JMaXN0CQlTZXFPZkdQUy1Nc3JFbGVtZW50Ci19Ci0KLS0tIDI0IGJpdCBwcmVzZW50YXRpb24gZm9yIEdQU1RPVwotR1BTVE9XMjRiIDo6PSBJTlRFR0VSICgwLi4xNDM5OTk5OSkKLQotLS0gbWVhc3VyZWQgZWxlbWVudHMgaW4gbWVhc3VyZW1lbnQgcGFyYW1ldGVycyBmaWVsZAotU2VxT2ZHUFMtTXNyRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBHUFMtTXNyRWxlbWVudAotCi1HUFMtTXNyRWxlbWVudCA6Oj0gU0VRVUVOQ0UgewotCXNhdGVsbGl0ZUlECQlTYXRlbGxpdGVJRCwJCQkJLS0gU2F0ZWxsaXRlIGlkZW50aWZpZXIKLQljTm8JCQkJSU5URUdFUiAoMC4uNjMpLAkJCS0tIGNhcnJpZXIgbm9pc2UgcmF0aW8KLQlkb3BwbGVyCQkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksIAktLSBkb3BwbGVyLCBtdWxsdGlwbHkgYnkgMC4yCi0Jd2hvbGVDaGlwcwkJSU5URUdFUiAoMC4uMTAyMiksCQkJLS0gd2hvbGUgdmFsdWUgb2YgdGhlIGNvZGUgcGhhc2UgbWVhc3VyZW1lbnQKLQlmcmFjQ2hpcHMJCUlOVEVHRVIgKDAuLjEwMjQpLAkJCS0tIGZyYWN0aW9uYWwgdmFsdWUgb2YgdGhlIGNvZGUgcGhhc2UgbWVhc3VyZW1lbnQKLQkJCQkJCQkJCQkJLS0gYSB2YWx1ZSBvZiAxMDI0IHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSBzZW5kZXIKLQkJCQkJCQkJCQkJLS0gdGhlIHJlY2VpdmVyIHNoYWxsIGNvbnNpZGVyIGEgdmFsdWUgb2YgMTAyNCB0byBiZQotCQkJCQkJCQkJCQktLSBpbnZhbGlkIGRhdGEKLQltcGF0aEluZGljCQlNcGF0aEluZGljLAkJCQkJLS0gbXVsdGlwYXRoIGluZGljYXRvcgotCXBzZXVSYW5nZVJNU0VycglJTlRFR0VSICgwLi42MykJCQkJLS0gaW5kZXgJCQotfQotCi0tLSBNdWx0aXBhdGggaW5kaWNhdG9yCi1NcGF0aEluZGljIDo6PSBFTlVNRVJBVEVEIHsKLQlub3RNZWFzdXJlZCAoMCksCi0JbG93ICgxKSwKLQltZWRpdW0gKDIpLAotCWhpZ2ggKDMpCi19Ci0KLS0tIExvY2F0aW9uIGVycm9yIElFCi1Mb2NhdGlvbkVycm9yIDo6PSBTRVFVRU5DRSB7Ci0JbG9jRXJyb3JSZWFzb24JCQkJTG9jRXJyb3JSZWFzb24sCi0JYWRkaXRpb25hbEFzc2lzdGFuY2VEYXRhCUFkZGl0aW9uYWxBc3Npc3RhbmNlRGF0YQlPUFRJT05BTCwKLQkuLi4KLX0KLQotTG9jRXJyb3JSZWFzb24gOjo9IEVOVU1FUkFURUQgewotCXVuRGVmaW5lZCAoMCksCQotCW5vdEVub3VnaEJUU3MgKDEpLAotCW5vdEVub3VnaFNhdHMgKDIpLAotCWVvdGRMb2NDYWxBc3NEYXRhTWlzc2luZyAoMyksCi0JZW90ZEFzc0RhdGFNaXNzaW5nICg0KSwKLQlncHNMb2NDYWxBc3NEYXRhTWlzc2luZyAoNSksCi0JZ3BzQXNzRGF0YU1pc3NpbmcgKDYpLAotCW1ldGhvZE5vdFN1cHBvcnRlZCAoNyksCi0Jbm90UHJvY2Vzc2VkICg4KSwKLQlyZWZCVFNGb3JHUFNOb3RTZXJ2aW5nQlRTICg5KSwKLQlyZWZCVFNGb3JFT1RETm90U2VydmluZ0JUUyAoMTApLAotCS4uLiwKLQlub3RFbm91Z2hHQU5TU1NhdHMgKDExKSwJCi0gZ2Fuc3NBc3NEYXRhTWlzc2luZyAoMTIpLAotCXJlZkJUU0ZvckdBTlNTTm90U2VydmluZ0JUUyAoMTMpCi19Ci0KLS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKLS0tIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDAKLQotCi0tLSBkZWZpbmVzIGFkZGl0aW9uYWwgYXNzaXN0YW5jZSBkYXRhIG5lZWRlZCBmb3IgYW55IG5ldyBsb2NhdGlvbiBhdHRlbXB0Ci0tLSBNUyBzaGFsbCByZXRhaW4gYW55IGFzc2lzdGFuY2UgZGF0YSBhbHJlYWR5IHJlY2VpdmVkCi1BZGRpdGlvbmFsQXNzaXN0YW5jZURhdGEgOjo9IFNFUVVFTkNFIHsKLQlncHNBc3Npc3RhbmNlRGF0YQkJR1BTQXNzaXN0YW5jZURhdGEJCU9QVElPTkFMLAotCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKLQkuLi4sCi0JZ2Fuc3NBc3Npc3RhbmNlRGF0YSBHQU5TU0Fzc2lzdGFuY2VEYXRhIE9QVElPTkFMCi19Ci0KLUdQU0Fzc2lzdGFuY2VEYXRhIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEdQU0Fzc2lzdGFuY2VEYXRhKSkKLS0tIEdQU0Fzc2lzdGFuY2VEYXRhIGhhcyBpZGVudGljYWwgc3RydWN0dXJlIGFuZCBlbmNvZGluZyB0byBvY3RldHMgMyB0byBuIG9mIHRoZQotLS0gR1BTIEFzc2lzdGFuY2UgRGF0YSBJRSBpbiAzR1BQIFRTIDQ5LjAzMQotCi1tYXhHUFNBc3Npc3RhbmNlRGF0YQlJTlRFR0VSIDo6PSA0MAotCi1HQU5TU0Fzc2lzdGFuY2VEYXRhIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEdBTlNTQXNzaXN0YW5jZURhdGEpKQotLS0gR0FOU1NBc3Npc3RhbmNlRGF0YSBoYXMgaWRlbnRpY2FsIHN0cnVjdHVyZSBhbmQgZW5jb2RpbmcgdG8gb2N0ZXRzIDMgdG8gbiBvZiB0aGUKLS0tIEdBTlNTIEFzc2lzdGFuY2UgRGF0YSBJRSBpbiAzR1BQIFRTIDQ5LjAzMQotCi1tYXhHQU5TU0Fzc2lzdGFuY2VEYXRhCUlOVEVHRVIgOjo9IDQwCi0KLQotLS0gUHJvdG9jb2wgRXJyb3IgQ2F1c2VzCi1FcnJvckNvZGVzIDo6PSBFTlVNRVJBVEVEIHsKLQl1bkRlZmluZWQgKDApLAotbWlzc2luZ0NvbXBvbmV0ICgxKSwJCQkKLWluY29ycmVjdERhdGEgKDIpLAkJCQotbWlzc2luZ0lFb3JDb21wb25lbnRFbGVtZW50ICgzKSwJCQotbWVzc2FnZVRvb1Nob3J0ICg0KSwJCQkKLXVua25vd1JlZmVyZW5jZU51bWJlciAoNSksCQkKLS4uLgotfQotCi0tLSBleGNlcHRpb24gaGFuZGxpbmc6Ci0tLSBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAwCi0KLS0tIEdQUyBhc3Npc3RhbmNlIGRhdGEgSUUKLUdQUy1Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7Ci0JY29udHJvbEhlYWRlcgkJQ29udHJvbEhlYWRlcgotfQotCi0tLSBNb3JlIEFzc2lzdGFuY2UgRGF0YSBUbyBCZSBTZW50IElFCi0tLSBNb3JlIEFzc2lzdGFuY2UgRGF0YSBDb21wb25lbnRzIE9uIHRoZSBXYXkgaW5kaWNhdGlvbiBmb3IgZGVsaXZlcnkgb2YgYW4gZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlCi0tLSBkYXRhIGluIG11bHRpcGxlIEFzc2lzdGFuY2UgRGF0YSBjb21wb25lbnRzLgotCi1Nb3JlQXNzRGF0YVRvQmVTZW50IDo6PSBFTlVNRVJBVEVEIHsKLQlub01vcmVNZXNzYWdlcyAoMCksCQkJLS0gVGhpcyBpcyB0aGUgb25seSBvciBsYXN0IEFzc2lzdGFuY2UgRGF0YSBtZXNzYWdlIHVzZWQgdG8gZGVsaXZlcgotCQkJCQkJCQktLSB0aGUgZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlIGRhdGEuCi0JbW9yZU1lc3NhZ2VzT25UaGVXYXkgKDEpCS0tIFRoZSBTTUxDIHdpbGwgc2VuZCBtb3JlIEFzc2lzdGFuY2UgRGF0YSBtZXNzYWdlcyBvciBhIGZpbmFsIFJSTFAKLQkJCQkJCQkJLS0gTWVhc3VyZSBQb3NpdGlvbiBSZXF1ZXN0IG1lc3NhZ2UgdG8gZGVsaXZlciB0aGUKLQkJCQkJCQkJLS0gdGhlIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZSBkYXRhLgotfQotCi0tLSBDb250cm9sIGhlYWRlciBvZiB0aGUgR1BTIGFzc2lzdGFuY2UgZGF0YQotQ29udHJvbEhlYWRlciA6Oj0gU0VRVUVOQ0UgewotCi0JLS0gRmllbGQgdHlwZSBQcmVzZW50IGluZm9ybWF0aW9uCi0JcmVmZXJlbmNlVGltZQkJUmVmZXJlbmNlVGltZQkJT1BUSU9OQUwsCi0JcmVmTG9jYXRpb24JCQlSZWZMb2NhdGlvbgkJCU9QVElPTkFMLAotCWRncHNDb3JyZWN0aW9ucwkJREdQU0NvcnJlY3Rpb25zCQlPUFRJT05BTCwKLQluYXZpZ2F0aW9uTW9kZWwJCU5hdmlnYXRpb25Nb2RlbAkJT1BUSU9OQUwsCi0JaW9ub3NwaGVyaWNNb2RlbAkJSW9ub3NwaGVyaWNNb2RlbAkJT1BUSU9OQUwsCi0JdXRjTW9kZWwJCQlVVENNb2RlbAkJCU9QVElPTkFMLAotCWFsbWFuYWMJCQlBbG1hbmFjCQkJT1BUSU9OQUwsCi0JYWNxdWlzQXNzaXN0CQlBY3F1aXNBc3Npc3QJCU9QVElPTkFMLAotCXJlYWxUaW1lSW50ZWdyaXR5IFNlcU9mLUJhZFNhdGVsbGl0ZVNldCBPUFRJT05BTAotfQotCi1SZWZlcmVuY2VUaW1lIDo6PSBTRVFVRU5DRSB7Ci0JZ3BzVGltZQkJCQlHUFNUaW1lLAotCWdzbVRpbWUJCQkJR1NNVGltZQkJCQlPUFRJT05BTCwKLQlncHNUb3dBc3Npc3QJCUdQU1RPV0Fzc2lzdAkJT1BUSU9OQUwKLX0KLQotLS0gR1BTIFRpbWUgaW5jbHVkZXMgd2VlayBudW1iZXIgYW5kIHRpbWUtb2Ytd2VlayAoVE9XKQotR1BTVGltZSA6Oj0gU0VRVUVOQ0UgewotCWdwc1RPVzIzYgkJCUdQU1RPVzIzYiwKLQlncHNXZWVrCQkJCUdQU1dlZWsKLX0KLQotLS0gR1BTVE9XLCByYW5nZSAwLTYwNDc5OS45MiwgcmVzb2x1dGlvbiAwLjA4IHNlYywgMjMtYml0IHByZXNlbnRhdGlvbgotR1BTVE9XMjNiIDo6PSBJTlRFR0VSICgwLi43NTU5OTk5KQotCi0tLSBHUFMgd2VlayBudW1iZXIKLUdQU1dlZWsgOjo9IElOVEVHRVIgKDAuLjEwMjMpCi0KLS0tIEdQU1RPV0Fzc2lzdCBjb25zaXN0cyBvZiBUTE0gbWVzc2FnZSwgQW50aS1zcG9vZiBmbGFnLCBBbGVydCBmbGFnLCBhbmQgMiByZXNlcnZlZCBiaXRzIGluIFRMTSBXb3JkCi0tLSBmb3IgZWFjaCB2aXNpYmxlIHNhdGVsbGl0ZS4KLS0tIE5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIGluIEdQU1RPV0Fzc2lzdAotR1BTVE9XQXNzaXN0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xMikpIE9GIEdQU1RPV0Fzc2lzdEVsZW1lbnQKLQotR1BTVE9XQXNzaXN0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgewotCXNhdGVsbGl0ZUlECQkJU2F0ZWxsaXRlSUQsCi0JdGxtV29yZAkJCQlUTE1Xb3JkLAotCWFudGlTcG9vZgkJCUFudGlTcG9vZkZsYWcsCi0JYWxlcnQJCQkJQWxlcnRGbGFnLAotCXRsbVJzdmRCaXRzCQkJVExNUmVzZXJ2ZWRCaXRzCi19Ci0KLS0tIFRMTSBXb3JkLCAxNCBiaXRzCi1UTE1Xb3JkIDo6PSBJTlRFR0VSICgwLi4xNjM4MykKLQotLS0gQW50aS1TcG9vZiBmbGFnCi1BbnRpU3Bvb2ZGbGFnIDo6PSBJTlRFR0VSICgwLi4xKQotCi0tLSBBbGVydCBmbGFnCi1BbGVydEZsYWcgOjo9IElOVEVHRVIgKDAuLjEpCi0KLS0tIFJlc2VydmVkIGJpdHMgaW4gVExNIHdvcmQsIE1TQiBvY2N1cnMgZWFybGllciBpbiBUTE0gV29yZCB0cmFuc21pdHRlZCBieSBzYXRlbGxpdGUKLVRMTVJlc2VydmVkQml0cyA6Oj0gSU5URUdFUiAoMC4uMykKLQotR1NNVGltZSA6Oj0gU0VRVUVOQ0UgewotCWJjY2hDYXJyaWVyCQlCQ0NIQ2FycmllciwJLS0gQkNDSCBjYXJyaWVyCi0JYnNpYwkJCUJTSUMsCQkJLS0gQlNJQwotCWZyYW1lTnVtYmVyCQlGcmFtZU51bWJlciwKLQl0aW1lU2xvdAkJVGltZVNsb3QsCi0JYml0TnVtYmVyCQlCaXROdW1iZXIKLX0KLQotLS0gRnJhbWUgbnVtYmVyCi1GcmFtZU51bWJlciA6Oj0gSU5URUdFUiAoMC4uMjA5NzE1MSkKLQotLS0gVGltZSBzbG90IG51bWJlcgotVGltZVNsb3QgOjo9IElOVEVHRVIgKDAuLjcpCi0KLS0tIEJpdCBudW1iZXIKLUJpdE51bWJlciA6Oj0gSU5URUdFUiAoMC4uMTU2KQotCi0KLS0tIFJlZmVyZW5jZSBMb2NhdGlvbiBJRQotUmVmTG9jYXRpb24gOjo9IFNFUVVFTkNFIHsKLQl0aHJlZURMb2NhdGlvbgkJCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbgotfQotCi0tLSBER1BTIENvcnJlY3Rpb25zIElFCi1ER1BTQ29ycmVjdGlvbnMgOjo9IFNFUVVFTkNFIHsKLQotCWdwc1RPVwkJSU5URUdFUiAoMC4uNjA0Nzk5KSwJLS0gREdQUyByZWZlcmVuY2UgdGltZQotCXN0YXR1cwkJSU5URUdFUiAoMC4uNyksCi0JLS0gTl9TQVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2Ygc2F0TGlzdAotCXNhdExpc3QJCVNlcU9mU2F0RWxlbWVudCAJCi19Ci1TZXFPZlNhdEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi4xNikpIE9GIFNhdEVsZW1lbnQKLQotLS0gbnVtYmVyIG9mIGNvcnJlY3Rpb24gZm9yIHNhdGVsbGl0ZXMKLVNhdEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKLQlzYXRlbGxpdGVJRAkJU2F0ZWxsaXRlSUQsCi0KLQotLS0tIFNlcXVlbmNlIG51bWJlciBmb3IgZXBoZW1lcmlzCi0JaW9kZSAJCQlJTlRFR0VSICgwLi4yMzkpLAotCS0tIFVzZXIgRGlmZmVyZW50aWFsIFJhbmdlIEVycm9yCi0JdWRyZQkJCUlOVEVHRVIgKDAuLjMpLAkJCi0KLQktLSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiwgcmFuZ2UgaXMKLQktLSAtNjU1LjA0IC0gKzY1NS4wNCwKLQlwc2V1ZG9SYW5nZUNvcglJTlRFR0VSICgtMjA0Ny4uMjA0NyksIAkKLQotCS0tIFBzZXVkbyBSYW5nZSBSYXRlIENvcnJlY3Rpb24sIHJhbmdlIGlzCi0JLS0gLTQuMDY0IC0gKzQuMDY0LAotCXJhbmdlUmF0ZUNvcglJTlRFR0VSICgtMTI3Li4xMjcpLAotCi0tLSBEZWx0YSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiAyIAkKLQlkZWx0YVBzZXVkb1JhbmdlQ29yMiAJSU5URUdFUiAoLTEyNy4uMTI3KSwJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKLQkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCi0JLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMgkKLQlkZWx0YVJhbmdlUmF0ZUNvcjIJCUlOVEVHRVIgKC03Li43KSwJCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCi0JCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgotCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDMKLQlkZWx0YVBzZXVkb1JhbmdlQ29yMyAJSU5URUdFUiAoLTEyNy4uMTI3KSwJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKLQkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCi0JLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMwotCWRlbHRhUmFuZ2VSYXRlQ29yMwkJSU5URUdFUiAoLTcuLjcpCQkJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKLQkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCi19Ci0KLVNhdGVsbGl0ZUlEIDo6PSBJTlRFR0VSICgwLi42MykJLS0gaWRlbnRpZmllcyBzYXRlbGxpdGUKLQotLS0gTmF2aWdhdGlvbiBNb2RlbCBJRQotTmF2aWdhdGlvbk1vZGVsIDo6PSBTRVFVRU5DRSB7Ci0JbmF2TW9kZWxMaXN0CVNlcU9mTmF2TW9kZWxFbGVtZW50CQotfQotCi0tLSBuYXZpZ2F0aW9uIG1vZGVsIHNhdGVsbGl0ZSBsaXN0Ci1TZXFPZk5hdk1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBOYXZNb2RlbEVsZW1lbnQKLQotTmF2TW9kZWxFbGVtZW50IDo6PSBTRVFVRU5DRSB7Ci0Jc2F0ZWxsaXRlSUQJCVNhdGVsbGl0ZUlELAkJCQotCXNhdFN0YXR1cwkJU2F0U3RhdHVzCQktLSBzYXRlbGxpdGUgc3RhdHVzCi19Ci0KLS0tIHRoZSBTdGF0dXMgb2YgdGhlIG5hdmlnYXRpb24gbW9kZWwKLVNhdFN0YXR1cyA6Oj0gQ0hPSUNFIHsKLQktLSBOZXcgc2F0ZWxsaXRlLCBuZXcgTmF2aWdhdGlvbiBNb2RlbAotCW5ld1NhdGVsbGl0ZUFuZE1vZGVsVUMJVW5jb21wcmVzc2VkRXBoZW1lcmlzLAotCi0JLS0gRXhpc3Rpbmcgc2F0ZWxsaXRlLCBFeGlzdGluZyBOYXZpZ2F0aW9uIE1vZGVsCi0Jb2xkU2F0ZWxsaXRlQW5kTW9kZWwJTlVMTCwKLQotCS0tIEV4aXN0aW5nIHNhdGVsbGl0ZSwgbmV3IE5hdmlnYXRpb24gTW9kZWwKLQluZXdOYXZpTW9kZWxVQwkJCVVuY29tcHJlc3NlZEVwaGVtZXJpcywKLQkuLi4KLX0KLQotLS0gVW5jb21wcmVzc2VkIHNhdGVsbGl0ZSBlbWhlbWVyaXMgYW5kIGNsb2NrIGNvcnJlY3Rpb25zCi1VbmNvbXByZXNzZWRFcGhlbWVyaXMgOjo9IFNFUVVFTkNFIHsKLQllcGhlbUNvZGVPbkwyCUlOVEVHRVIgKDAuLjMpLAotCWVwaGVtVVJBCQlJTlRFR0VSICgwLi4xNSksCi0JZXBoZW1TVmhlYWx0aAlJTlRFR0VSICgwLi42MyksCi0JZXBoZW1JT0RDCQlJTlRFR0VSCSgwLi4xMDIzKSwKLQllcGhlbUwyUGZsYWcJSU5URUdFUiAoMC4uMSksCi0JZXBoZW1TRjFSc3ZkCUVwaGVtZXJpc1N1YmZyYW1lMVJlc2VydmVkLAotCWVwaGVtVGdkCQlJTlRFR0VSICgtMTI4Li4xMjcpLAotCWVwaGVtVG9jCQlJTlRFR0VSICgwLi4zNzc5OSksCi0JZXBoZW1BRjIJCUlOVEVHRVIgKC0xMjguLjEyNyksCi0JZXBoZW1BRjEJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAotCWVwaGVtQUYwCQlJTlRFR0VSICgtMjA5NzE1Mi4uMjA5NzE1MSksCi0JZXBoZW1DcnMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAotCWVwaGVtRGVsdGFOCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKLQllcGhlbU0wCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAotCWVwaGVtQ3VjCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKLQllcGhlbUUJCQlJTlRFR0VSICgwLi40Mjk0OTY3Mjk1KSwKLQllcGhlbUN1cwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCi0JZXBoZW1BUG93ZXJIYWxmCUlOVEVHRVIgKDAuLjQyOTQ5NjcyOTUpLAotCWVwaGVtVG9lCQlJTlRFR0VSICgwLi4zNzc5OSksCi0JZXBoZW1GaXRGbGFnCUlOVEVHRVIgKDAuLjEpLAotCWVwaGVtQU9EQQkJSU5URUdFUiAoMC4uMzEpLAotCWVwaGVtQ2ljCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKLQllcGhlbU9tZWdhQTAJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAotCWVwaGVtQ2lzCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKLQllcGhlbUkwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAotCWVwaGVtQ3JjCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKLQllcGhlbVcJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCi0JZXBoZW1PbWVnYUFEb3QJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAotCWVwaGVtSURvdAkJSU5URUdFUiAoLTgxOTIuLjgxOTEpCi19Ci0KLS0tIFJlc2VydmVkIGJpdHMgaW4gc3ViZnJhbWUgMSBvZiBuYXZpZ2F0aW9uIG1lc3NhZ2UKLUVwaGVtZXJpc1N1YmZyYW1lMVJlc2VydmVkIDo6PSBTRVFVRU5DRSB7Ci0JcmVzZXJ2ZWQxCQlJTlRFR0VSICgwLi44Mzg4NjA3KSwJLS0gMjMtYml0IGZpZWxkCi0JcmVzZXJ2ZWQyCQlJTlRFR0VSICgwLi4xNjc3NzIxNSksCS0tIDI0LWJpdCBmaWVsZAotCXJlc2VydmVkMwkJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAktLSAyNC1iaXQgZmllbGQKLQlyZXNlcnZlZDQJCUlOVEVHRVIgKDAuLjY1NTM1KQkJLS0gMTYtYml0IGZpZWxkCi19Ci0KLS0tIElvbm9zcGhlcmljIE1vZGVsIElFCi1Jb25vc3BoZXJpY01vZGVsIDo6PSBTRVFVRU5DRSB7Ci0JYWxmYTAJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAotCWFsZmExCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKLQlhbGZhMgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCi0JYWxmYTMJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAotCWJldGEwCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKLQliZXRhMQkJCUlOVEVHRVIgKC0xMjguLjEyNyksCi0JYmV0YTIJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAotCWJldGEzCQkJSU5URUdFUiAoLTEyOC4uMTI3KQotfQotCi0tLSBVbml2ZXJzYWwgVGltZSBDb29yZGluYXRlIE1vZGVsCi1VVENNb2RlbCA6Oj0gU0VRVUVOQ0UgewotCXV0Y0ExCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAotCXV0Y0EwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAotCXV0Y1RvdAkJCUlOVEVHRVIgKDAuLjI1NSksCi0JdXRjV050CQkJSU5URUdFUiAoMC4uMjU1KSwKLQl1dGNEZWx0YVRscwkJSU5URUdFUiAoLTEyOC4uMTI3KSwKLQl1dGNXTmxzZgkJSU5URUdFUiAoMC4uMjU1KSwKLQl1dGNETgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCi0JdXRjRGVsdGFUbHNmCUlOVEVHRVIgKC0xMjguLjEyNykKLX0KLQotLS0gQWxtYW5hYywgTG9uZyB0ZXJtIG1vZGVsCi0tLSBOT1RFOiBUaGVzZSBhcmUgcGFyYW1ldGVycyBhcmUgc3Vic2V0IG9mIHRoZSBlcGhlbWVyaXMKLS0tIE5PVEU6IEJ1dCB3aXRoIHJlZHVjZWQgcmVzb2x1dGlvbiBhbmQgYWNjdXJhY3kKLUFsbWFuYWMgOjo9IFNFUVVFTkNFIHsKLQlhbGFtYW5hY1dOYQkJSU5URUdFUiAoMC4uMjU1KSwJLS0gT25jZSBwZXIgbWVzc2FnZQotCi0JLS0gbmF2aWdhdGlvbiBtb2RlbCBzYXRlbGxpdGUgbGlzdC4KLQktLSBUaGUgc2l6ZSBvZiBhbG1hbmFjTGlzdCBpcyBhY3R1YWxseSBOdW1zX1NhdHNfVG90YWwgZmllbGQKLQlhbG1hbmFjTGlzdAkJU2VxT2ZBbG1hbmFjRWxlbWVudAkJCi19Ci1TZXFPZkFsbWFuYWNFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi42NCkpIE9GIEFsbWFuYWNFbGVtZW50Ci0KLS0tIEFsbWFuYWMgaW5mbyBvbmNlIHBlciBzYXRlbGxpdGUKLUFsbWFuYWNFbGVtZW50IDo6PSBTRVFVRU5DRSB7Ci0Jc2F0ZWxsaXRlSUQJCQlTYXRlbGxpdGVJRCwKLQlhbG1hbmFjRQkJCUlOVEVHRVIgKDAuLjY1NTM1KSwKLQlhbGFtYW5hY1RvYQkJCUlOVEVHRVIgKDAuLjI1NSksCi0JYWxtYW5hY0tzaWkJCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKLQlhbG1hbmFjT21lZ2FEb3QJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAotCWFsbWFuYWNTVmhlYWx0aAkJSU5URUdFUiAoMC4uMjU1KSwKLQlhbG1hbmFjQVBvd2VySGFsZglJTlRFR0VSICgwLi4xNjc3NzIxNSksCi0JYWxtYW5hY09tZWdhMAkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAotCWFsbWFuYWNXCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAotCWFsbWFuYWNNMAkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKLQlhbG1hbmFjQUYwCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpLAotCWFsbWFuYWNBRjEJCQlJTlRFR0VSICgtMTAyNC4uMTAyMykKLX0KLQotLS0gQWNxdWlzaXRpb24gQXNzaXN0YW5jZQotQWNxdWlzQXNzaXN0IDo6PSBTRVFVRU5DRSB7Ci0KLQktLSBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBjYW4gYmUgcmVhZCBmcm9tIGFjcXVpc3RMaXN0Ci0JdGltZVJlbGF0aW9uCVRpbWVSZWxhdGlvbiwKLQotCS0tIEFjcXVpc2l0aW9uIGFzc2lzdGFuY2UgbGlzdAotCS0tIFRoZSBzaXplIG9mIE51bWJlciBvZiBTYXRlbGxpdGVzIGlzIGFjdHVhbGx5IE51bWJlciBvZiBTYXRlbGxpdGVzIGZpZWxkCi0JYWNxdWlzTGlzdAkJU2VxT2ZBY3F1aXNFbGVtZW50CQkKLX0KLVNlcU9mQWNxdWlzRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBBY3F1aXNFbGVtZW50Ci0KLS0tIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBHUFMgdGltZSBhbmQgYWlyLWludGVyZmFjZSB0aW1pbmcKLVRpbWVSZWxhdGlvbiA6Oj0gU0VRVUVOQ0UgewotCS0tCi0JZ3BzVE9XCQlHUFNUT1cyM2IsCQktLSAyM2IgcHJlc2VudGF0aW9uCi0JZ3NtVGltZQkJR1NNVGltZQkJT1BUSU9OQUwKLX0KLQotLS0gZGF0YSBvY2N1cmluZyBwZXIgbnVtYmVyIG9mIHNhdGVsbGl0ZXMKLUFjcXVpc0VsZW1lbnQgOjo9IFNFUVVFTkNFIHsKLQlzdmlkCQkJCQlTYXRlbGxpdGVJRCwKLQotCS0tIERvcHBsZXIgMHRoIG9yZGVyIHRlcm0sCi0JLS0gLTUxMjAuMCAtIDUxMTcuNSBIeiAoPSAtMjA0OCAtIDIwNDcgd2l0aCAyLjUgSHogcmVzb2x1dGlvbikKLQlkb3BwbGVyMAkJCQlJTlRFR0VSICgtMjA0OC4uMjA0NyksCQotCWFkZGlvbmFsRG9wcGxlcgkJCUFkZGlvbmFsRG9wcGxlckZpZWxkcwlPUFRJT05BTCwKLQljb2RlUGhhc2UJCQkJSU5URUdFUiAoMC4uMTAyMiksCS0tIENvZGUgUGhhc2UKLQlpbnRDb2RlUGhhc2UJCQlJTlRFR0VSICgwLi4xOSksCS0tIEludGVnZXIgQ29kZSBQaGFzZQotCWdwc0JpdE51bWJlcgkJCUlOVEVHRVIgKDAuLjMpLCAJLS0gR1BTIGJpdCBudW1iZXIKLQljb2RlUGhhc2VTZWFyY2hXaW5kb3cJSU5URUdFUiAoMC4uMTUpLAktLSBDb2RlIFBoYXNlIFNlYXJjaCBXaW5kb3cKLQlhZGRpb25hbEFuZ2xlCQkJQWRkaW9uYWxBbmdsZUZpZWxkcwkJT1BUSU9OQUwKLX0KLQotQWRkaW9uYWxEb3BwbGVyRmllbGRzIDo6PSBTRVFVRU5DRSB7Ci0JLS0gRG9wcGxlciAxc3Qgb3JkZXIgdGVybSwgLTEuMCAtICswLjUgSHovc2VjCi0gLS0gKD0gLTQyICsgKDAgdG8gNjMpIHdpdGggMS80MiBIei9zZWMuIHJlc29sdXRpb24pCi0JZG9wcGxlcjEJCQkJSU5URUdFUiAoMC4uNjMpLAotCWRvcHBsZXJVbmNlcnRhaW50eQkJSU5URUdFUiAoMC4uNykKLSAtLSBhIHNlbmRlciBzaGFsbCBub3QgZW5jb2RlIGFueSBEb3BwbGVyVW5jZXJ0YWludHkgdmFsdWUgaW4gdGhlIHJhbmdlIDUgdG8gNwotIC0tIGEgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIGFueSB2YWx1ZSBiZXR3ZWVuIDUgYW5kIDcuCi19Ci0KLUFkZGlvbmFsQW5nbGVGaWVsZHMJOjo9IFNFUVVFTkNFIHsKLQktLSBhemltdXRoIGFuZ2xlLCAwIC0gMzQ4Ljc1IGRlZyAoPSAwIC0gMzEgd2l0aCAxMS4yNSBkZWcgcmVzb2x1dGlvbikKLQlhemltdXRoCQkJCQlJTlRFR0VSICgwLi4zMSksCi0JLS0gZWxldmF0aW9uIGFuZ2xlLCAwIC0gNzguNzUgZGVnICg9IDAgLSA3IHdpdGggMTEuMjUgZGVnIHJlc29sdXRpb24pCi0JZWxldmF0aW9uCQkJCUlOVEVHRVIgKDAuLjcpCi19Ci0KLS0tIFJlYWwtVGltZSBJbnRlZ3JpdHkKLS0tIG51bWJlciBvZiBiYWQgc2F0ZWxsaXRlcyBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZWxlbWVudAotU2VxT2YtQmFkU2F0ZWxsaXRlU2V0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIFNhdGVsbGl0ZUlECi0KLS0tIEV4dGVuc2lvbiBFbGVtZW50cwotCi0tLSBSZWxlYXNlIDk4IEV4dGVuc2lvbnMgaGVyZQotUmVsOTgtTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgewotCXJlbDk4LUV4dC1FeHBPVEQJCQlSZWw5OC1FeHQtRXhwT1RECQlPUFRJT05BTCwJLS0gRXhwZWN0ZWRPVEQgZXh0ZW5zaW9uCi0JLi4uLCAKLSBncHNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLCAKLSBncHNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgR1BTUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IE9QVElPTkFMCi0KLS0tIEZ1cnRoZXIgUjk4IGV4dGVuc2lvbnMgaGVyZQotfQotUmVsOTgtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7Ci0JcmVsOTgtRXh0LUV4cE9URAkJCVJlbDk4LUV4dC1FeHBPVEQJCU9QVElPTkFMLAktLSBFeHBlY3RlZE9URCBleHRlbnNpb24KLQkuLi4sIAotIGdwc1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCi0gZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAotCi0tLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKLX0KLQotLS0gUmVsZWFzZSA5OCBFeHBPVEQgZXh0ZW5zaW9uCi1SZWw5OC1FeHQtRXhwT1REIDo6PSBTRVFVRU5DRSB7Ci0tLSBJZiBNc3JBc3Npc3RCVFMgaXMgaW5jbHVkZWQgaW4gbWVzc2FnZSwgbXNyQXNzaXN0RGF0YS1SOTgtRXhwT1REIHNoYWxsIGJlIGluY2x1ZGVkLgotCW1zckFzc2lzdERhdGEtUjk4LUV4cE9URAkJCU1zckFzc2lzdERhdGEtUjk4LUV4cE9URAkJCU9QVElPTkFMLAotCi0tLSBJZiBTeXN0ZW1JbmZvQXNzaXN0YURhdGEgaXMgaW5jbHVkZWQgaW4gbWVzc2FnZSwgc3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URCBzaGFsbCBiZQotLS0gaW5jbHVkZWQuCi0Jc3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URAlTeXN0ZW1JbmZvQXNzaXN0RGF0YS1SOTgtRXhwT1RECU9QVElPTkFMCi19Ci0KLS0tIE1zckFzc2lzdERhdGEgUjk4IGV4dGVuc2lvbgotTXNyQXNzaXN0RGF0YS1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7Ci0JIG1zckFzc2lzdExpc3QtUjk4LUV4cE9URAkJCSBTZXFPZk1zckFzc2lzdEJUUy1SOTgtRXhwT1RECi19Ci0KLS0tIEluZGV4ZXMgaW4gU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URCByZWZlciB0byBTZXFPZk1zckFzc2lzdEJUUwotLS0gSWYgdGhlIGluZGV4IGV4Y2VlZHMgdGhlIFNlZ09mTXNyQXNzaXN0QlRTIHJhbmdlIG9yIGlmIHRoZXJlIGlzIG90aGVyCi0tLSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgQlRTIGluZGljZXMsIHRoZSBNUyBzaGFsbCBhcHBseSBwcm90b2NvbAotLS0gZXJyb3IgY2F1c2UgaW5jb3JyZWN0RGF0YQotU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTUpKSBPRiBNc3JBc3Npc3RCVFMtUjk4LUV4cE9URAotCi0tLSBUaGlzIGVsZW1lbnQgY29tcGxldGVzIE1zckFzc2lzdEJUUyBJRQotTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKLQlleHBlY3RlZE9URAkJCQlFeHBlY3RlZE9URCwKLQlleHBPVERVbmNlcnRhaW50eQkJRXhwT1REVW5jZXJ0YWludHkKLX0KLQotLS0gU3lzdGVtSW5mb0Fzc2lzdERhdGEgUjk4IGV4dGVuc2lvbgotU3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgewotCXN5c3RlbUluZm9Bc3Npc3RMaXN0Ujk4LUV4cE9URCAJU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQKLX0KLQotLS0gU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgaW5kZXggcmVmZXIgdG8gU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTCi0tLSBJZiB0aGUgaW5kZXggZXhjZWVkcyB0aGUgU2VnT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTIHJhbmdlIG9yIGlmIHRoZXJlIGlzIG90aGVyCi0tLSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgQlRTIGluZGljZXMsIHRoZSBNUyBzaGFsbCBhcHBseSBwcm90b2NvbAotLS0gZXJyb3IgY2F1c2UgaW5jb3JyZWN0RGF0YQotU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1RECi0KLS0tIHdoZXRoZXIgbi50aCBpcyBwcmVzZW50IG9yIG5vdCA/Ci1TeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IENIT0lDRSB7Ci0Jbm90UHJlc2VudAkJTlVMTCwKLQlwcmVzZW50CQkJQXNzaXN0QlRTRGF0YS1SOTgtRXhwT1RECi19Ci0KLS0tIFRoaXMgZWxlbWVudCBjb21wbGV0ZXMgQXNzaXN0QlRTRGF0YSBJRQotQXNzaXN0QlRTRGF0YS1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7Ci0JZXhwZWN0ZWRPVEQJCQkJRXhwZWN0ZWRPVEQsCi0JZXhwT1REdW5jZXJ0YWludHkJCUV4cE9URFVuY2VydGFpbnR5CS0tIFVuY2VydGFpbnR5IG9mIGV4cGVjdGVkIE9URAotfQotCi0tLSBFeHBlY3RlZCBPVEQgdmFsdWUgYmV0d2VlbiBuYm9yIGJhc2Ugc3RhdGlvbiBhbmQgcmVmZXJlbmNlIEJUUwotLS0gYXQgTVMncyBjdXJyZW50IGVzdGltYXRlZCBsb2NhdGlvbi4KLUV4cGVjdGVkT1REIDo6PSBJTlRFR0VSICgwLi4xMjUwKQotLS0gVGhlIEV4cGVjdGVkT1REIHZhbHVlIDEyNTAgc2hhbGwgbm90IGJlIGVuY29kZWQgYnkgdGhlIHRyYW5zbWl0dGluZyBlbnRpdHkgYW5kCi0tLSBzaGFsbCBiZSB0cmVhdGVkIGJ5IHRoZSByZWNlaXZpbmcgZW50aXR5IGFzIDAuCi0tLSBVbmNlcnRhaW50eSBvZiBFeHB0ZWN0ZWQgT1REIGluIGJpdHMKLUV4cE9URFVuY2VydGFpbnR5IDo6PSBJTlRFR0VSKDAuLjcpCi0KLS0tIFJlbGVhc2UgOTggZXh0ZW5zaW9ucwotCi1HUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgOjo9IElOVEVHRVIgKDAgLi4gMTI3KSAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4Ci0KLUdQU1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIDo6PSBTRVFVRU5DRSB7Ci0gcmVmZXJlbmNlRnJhbWVNU0IgSU5URUdFUiAoMCAuLiA2MyksIC0tIE1TQiBvZiBmcmFtZSBudW1iZXIKLSBncHNUb3dTdWJtcyBJTlRFR0VSICgwIC4uIDk5OTkpIE9QVElPTkFMLCAtLSBpbiB1bml0cyBvZiAxMDBucywgZm9yIE1TIGJhc2VkIEFHUFMKLSBkZWx0YVRvdyBJTlRFR0VSICgwIC4uIDEyNykgT1BUSU9OQUwsIC0tIGZvciBNUyBhc3Npc3RlZCBBR1BTCi0gZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAotfQotCi1SZWwtOTgtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgewotCi0JLS0gRmlyc3QgZXh0ZW5zaW9uIHRvIFJlbGVhc2UgOTgKLQlyZWwtOTgtRXh0LU1lYXN1cmVJbmZvCVNFUVVFTkNFIHsKLQkJb3RkLU1lYXN1cmVJbmZvLVI5OC1FeHQJT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQJCU9QVElPTkFMCi0JfSwKLQkuLi4sIAotIHRpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIEdQU1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIE9QVElPTkFMIAotIC0tIEZ1cnRoZXIgUjk4IGV4dGVuc2lvbnMgaGVyZQotfQotCi0tLSBUaGlzIGlzIGFuIGFkZGl0aW9uIHRvIE9URC1NZWFzdXJlSW5mbyBlbGVtZW50IGRlZmluZWQgaW4gb3JpZ2luYWwgbWVzc2FnZSwKLS0tIElmIE9URC1NZWFzdXJlSW5mbyBpcyBhYnNlbnQsIG9yIGlmIG9uZSBvciBtb3JlIE9URC1Nc3JFbGVtZW50UmVzdCBhcmUgcHJlc2VudAotLS0gT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQgc2hhbGwgYmUgYWJzZW50LgotLS0gT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQKLU9URC1NZWFzdXJlSW5mby1SOTgtRXh0IDo6PSBTRVFVRU5DRSB7Ci0JLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cwotCW90ZE1zckZpcnN0U2V0cy1SOTgtRXh0CQlPVEQtTXNyRWxlbWVudEZpcnN0LVI5OC1FeHQKLX0KLQotLS0gT1REIG1lYXN1cmVtZW50IGluZm9ybWF0aW9uIEV4dCBmb3IgdGhlIGZpcnN0IHNldCBvbmx5Ci1PVEQtTXNyRWxlbWVudEZpcnN0LVI5OC1FeHQgOjo9IFNFUVVFTkNFIHsKLQktLSBhZGRpdGlvbmFsIG1lYXN1cmVkIG5laWdoYm9ycyBpbiBPVEQgbWVhc3VyZW1lbnRzCi0Jb3RkLUZpcnN0U2V0TXNycy1SOTgtRXh0IAlTZXFPZk9URC1GaXJzdFNldE1zcnMtUjk4LUV4dCAJT1BUSU9OQUwKLX0KLVNlcU9mT1RELUZpcnN0U2V0TXNycy1SOTgtRXh0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi41KSkgT0YgT1RELUZpcnN0U2V0TXNycwotCi1SZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7Ci0KLQlleHRlbmRlZC1yZWZlcmVuY2UJRXh0ZW5kZWQtcmVmZXJlbmNlIAlPUFRJT05BTCwKLQktLSBUaGUgZXh0ZW5kZWQtcmVmZXJlbmNlIHNoYWxsIGJlIGluY2x1ZGVkIGJ5IHRoZSBNUyBpZiBhbmQgb25seSBpZiBwcmV2aW91c2x5Ci0JLS0gcmVjZWl2ZWQgZnJvbSB0aGUgU01MQyBpbiBhIE1lYXN1cmUgUG9zaXRpb24gUmVxdWVzdC4gV2hlbiBpbmNsdWRlZCwgdGhlIHZhbHVlIHNlbnQKLQktLSBieSB0aGUgTVMgc2hhbGwgZXF1YWwgdGhlIHZhbHVlIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCi0KLQktLSBleHRlbnNpb24gdG8gUmVsZWFzZSA1LCBmb3IgUlJMUCBwc2V1ZG8tc2VnbWVudGF0aW9uIGhlcmUKLQlvdGQtTWVhc3VyZUluZm8tNS1FeHQJT1RELU1lYXN1cmVJbmZvLTUtRXh0CU9QVElPTkFMLAotCXVsUHNldWRvU2VnSW5kCQkJVWxQc2V1ZG9TZWdJbmQJCQlPUFRJT05BTCwJLS0gSW5jbHVkZWQgd2hlbiB1cGxpbmsgUlJMUAotCS0tIFBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZCwgbm90IGluY2x1ZGVkIHdoZW4gbm8gdXBsaW5rIHBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZAotCS4uLgotCQkJCQktLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCi19Ci0KLUV4dGVuZGVkLXJlZmVyZW5jZSA6Oj0gU0VRVUVOQ0UgewotCXNtbGMtY29kZQkJCUlOVEVHRVIgKDAuLjYzKSwKLQl0cmFuc2FjdGlvbi1JRAkJSU5URUdFUiAoMC4uMjYyMTQzKQotfQotCi1PVEQtTWVhc3VyZUluZm8tNS1FeHQgOjo9IFNlcU9mT1RELU1zckVsZW1lbnRSZXN0Ci0JLS0gaWYgbW9yZSB0aGFuIG9uZSBtZWFzdXJlbWVudCBzZXRzIGFyZSBwcmVzZW50IHRoaXMgZWxlbWVudCBpcyByZXBlYXRlZAotCS0tIE51bWJlck9mU2V0cyAtIDEgKC0xID0gZmlyc3Qgc2V0KSBjb21iaW5lZCBpbiBPVEQtTWVhc3VyZUluZm8tNS1FeHQgYW5kCi0JLS0gT1RELU1lYXN1cmVJbmZvIChlLmcuIGlmIE51bWJlck9mU2V0cyBpcyAzLCB0aGVuIG9uZSBvdGRNc3JSZXN0U2V0cyBtYXkKLQktLSBiZSBzZW50IGluIE9URC1NZWFzdXJlSW5mby01LUV4dCBhbmQgb25lIGluIE9URC1NZWFzdXJlSW5mbykKLQotLS0gRmlyc3QgcGFydCBvZiBVcGxpbmsgUlJMUCBQc2V1ZG8tc2VnbWVudGF0aW9uIGluZGljYXRpb24sIHBvc3NpYmx5IG1vcmUgbWF5IGJlIGRlZmluZWQKLS0tIGluIHRoZSBmdXR1cmUgZm9yIHNlZ21lbnRhdGlvbiB3aXRoIG1vcmUgdGhhbiB0d28gc2VnbWVudHMuCi1VbFBzZXVkb1NlZ0luZCA6Oj0gRU5VTUVSQVRFRCB7Ci0JZmlyc3RPZk1hbnkgKDApLAotCXNlY29uZE9mTWFueSgxKQotfQotCi1SZWw1LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKLQlleHRlbmRlZC1yZWZlcmVuY2UJCQlFeHRlbmRlZC1yZWZlcmVuY2UsCi0JLi4uCi0JLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgotfQotCi1SZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgewotCWV4dGVuZGVkLXJlZmVyZW5jZQkJCUV4dGVuZGVkLXJlZmVyZW5jZSwKLQkuLi4KLQotLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgotfQotCi1SZWwtNS1Qcm90b2NvbEVycm9yLUV4dGVuc2lvbjo6PSBTRVFVRU5DRSB7Ci0JZXh0ZW5kZWQtcmVmZXJlbmNlCQkJRXh0ZW5kZWQtcmVmZXJlbmNlIAlPUFRJT05BTCwKLQktLSBUaGUgZXh0ZW5kZWQtcmVmZXJlbmNlIHNoYWxsIGJlIGluY2x1ZGVkIGJ5IHRoZSBNUyBpZiBhbmQgb25seSBpZiBwcmV2aW91c2x5Ci0JLS0gcmVjZWl2ZWQgZnJvbSB0aGUgU01MQy4KLQktLSBXaGVuIGluY2x1ZGVkLCB0aGUgdmFsdWUgc2VudCBieSB0aGUgTVMgc2hhbGwgZXF1YWwgdGhlIHZhbHVlIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCi0JLi4uCi0KLQktLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCi19Ci0KLS0tIFJlbGVhc2UgNyBFeHRlbnNpb25zIGhlcmUKLQotUmVsNy1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7Ci12ZWxvY2l0eVJlcXVlc3RlZAkJIE5VTEwJCSBPUFRJT05BTCwKLSBnYW5zc1Bvc2l0aW9uTWV0aG9kIEdBTlNTUG9zaXRpb25pbmdNZXRob2QgT1BUSU9OQUwsCi0gZ2Fuc3MtQXNzaXN0RGF0YSBHQU5TUy1Bc3Npc3REYXRhIE9QVElPTkFMLAotIGdhbnNzQ2FycmllclBoYXNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCi0gZ2Fuc3NUT0RHU01UaW1lQXNzb2NpYXRpb25NZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKLXJlcXVpcmVkUmVzcG9uc2VUaW1lCVJlcXVpcmVkUmVzcG9uc2VUaW1lCU9QVElPTkFMLAotCS4uLgotCS0tIEZ1cnRoZXIgUmVsZWFzZSA3IGV4dGVudGlvbnMgaGVyZQotfQotCi0tLSBhZGRpdGlvbmFsIHNhdGVsbGl0ZSBzeXN0ZW1zIG1heSBiZSBhZGRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIHByb3RvY29sCi1HQU5TU1Bvc2l0aW9uaW5nTWV0aG9kIDo6PSBCSVQgU1RSSU5HIHsKLQlncHMgKDApLAotCWdhbGlsZW8gKDEpfSAoU0laRSAoMi4uMTYpKQotCi1HQU5TUy1Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7Ci0JZ2Fuc3MtY29udHJvbEhlYWRlcglHQU5TUy1Db250cm9sSGVhZGVyCi19Ci0KLUdBTlNTLUNvbnRyb2xIZWFkZXIgOjo9IFNFUVVFTkNFIHsKLSBnYW5zc0NvbW1vbkFzc2lzdERhdGEgR0FOU1NDb21tb25Bc3Npc3REYXRhIE9QVElPTkFMLAotIGdhbnNzR2VuZXJpY0Fzc2lzdERhdGFMaXN0IFNlcU9mR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQgT1BUSU9OQUwKLX0KLQotLS0gR0FOU1MgQ29tbW9uIEFzc2lzdGFuY2UgRGF0YSBFbGVtZW50cwotR0FOU1NDb21tb25Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7Ci0JZ2Fuc3NSZWZlcmVuY2VUaW1lCQkgR0FOU1NSZWZlcmVuY2VUaW1lCQkgT1BUSU9OQUwsCi0JZ2Fuc3NSZWZMb2NhdGlvbgkJCUdBTlNTUmVmTG9jYXRpb24JCSBPUFRJT05BTCwKLQlnYW5zc0lvbm9zcGhlcmljTW9kZWwJCUdBTlNTSW9ub3NwaGVyaWNNb2RlbAkgT1BUSU9OQUwsCi0JLi4uCi19Ci0KLS0tIExpc3Qgb2YgR0FOU1MgR2VuZXJpYyBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMsIHVwIHRvIDggR0FOU1MKLVNlcU9mR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi44KSkgT0YgR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQKLQotLS0gR0FOU1MgR2VuZXJpYyBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMKLUdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IDo6PSBTRVFVRU5DRSB7Ci0gZ2Fuc3NJRCBJTlRFR0VSICgwLi43KSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAotIGdhbnNzVGltZU1vZGVsIFNlcU9mR0FOU1NUaW1lTW9kZWwgT1BUSU9OQUwsCi0JZ2Fuc3NEaWZmQ29ycmVjdGlvbnMJCSBHQU5TU0RpZmZDb3JyZWN0aW9ucwkgT1BUSU9OQUwsCi0JZ2Fuc3NOYXZpZ2F0aW9uTW9kZWwJCSBHQU5TU05hdk1vZGVsIE9QVElPTkFMLAotCWdhbnNzUmVhbFRpbWVJbnRlZ3JpdHkJIEdBTlNTUmVhbFRpbWVJbnRlZ3JpdHkJIE9QVElPTkFMLAotCWdhbnNzRGF0YUJpdEFzc2lzdAkJCSBHQU5TU0RhdGFCaXRBc3Npc3QJCSBPUFRJT05BTCwKLQlnYW5zc1JlZk1lYXN1cmVtZW50QXNzaXN0CSBHQU5TU1JlZk1lYXN1cmVtZW50QXNzaXN0IE9QVElPTkFMLAotIGdhbnNzQWxtYW5hY01vZGVsIEdBTlNTQWxtYW5hY01vZGVsIE9QVElPTkFMLAotIGdhbnNzVVRDTW9kZWwgR0FOU1NVVENNb2RlbCBPUFRJT05BTCwKLQkuLi4KLX0KLQotLS0gR0FOU1MgQ09NTU9OIEFTU0lTVEFOQ0UgREFUQSBFTEVNRU5UUwotCi0tLSBHQU5TUyBSZWZlcmVuY2UgVGltZSBJRQotR0FOU1NSZWZlcmVuY2VUaW1lIDo6PSBTRVFVRU5DRSB7Ci0JZ2Fuc3NSZWZUaW1lSW5mbwkJCSBHQU5TU1JlZlRpbWVJbmZvLAotCWdhbnNzVE9ELUdTTVRpbWVBc3NvY2lhdGlvbiBHQU5TU1RPRC1HU01UaW1lQXNzb2NpYXRpb24gT1BUSU9OQUwKLX0KLQotLS0gR0FOU1MgUmVmZXJlbmNlIFRpbWUgaW5jbHVkZXMgR0FOU1MgVE9ELCBHQU5TUyBEYXksIHVuY2VydGFpbnR5Ci1HQU5TU1JlZlRpbWVJbmZvIDo6PSBTRVFVRU5DRSB7Ci0JZ2Fuc3NEYXkJCQkgSU5URUdFUigwIC4uIDgxOTEpIE9QVElPTkFMLAotIGdhbnNzVE9EIEdBTlNTVE9ELAotCWdhbnNzVE9EVW5jZXJ0YWludHkJIEdBTlNTVE9EVW5jZXJ0YWludHkgT1BUSU9OQUwsCi0gZ2Fuc3NUaW1lSUQgSU5URUdFUiAoMCAuLiA3KSBPUFRJT05BTAotfQotCi0tLSBHQU5TUyBUT0QgaW50ZWdlciBzZWNvbmRzCi1HQU5TU1RPRCA6Oj0gSU5URUdFUiAoMCAuLiA4NjM5OSkKLQotLS0gR0FOU1MgVE9EIHVuY2VydGFpbnR5Ci1HQU5TU1RPRFVuY2VydGFpbnR5IDo6PSBJTlRFR0VSICgwIC4uIDEyNykgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAotCi0tLSBHQU5TUyBUT0QtR1NNIFRpbWUgYXNzb2NpYXRpb24gCi1HQU5TU1RPRC1HU01UaW1lQXNzb2NpYXRpb24gOjo9IFNFUVVFTkNFIHsKLQliY2NoQ2FycmllcgkJQkNDSENhcnJpZXIsCS0tIEJDQ0ggY2FycmllcgotCWJzaWMJCQlCU0lDLAkJCS0tIEJTSUMKLQlmcmFtZU51bWJlcgkJRnJhbWVOdW1iZXIsCi0JdGltZVNsb3QJCVRpbWVTbG90LAotCWJpdE51bWJlcgkJQml0TnVtYmVyLAotIGZyYW1lRHJpZnQgRnJhbWVEcmlmdCBPUFRJT05BTAotfQotCi0tLSBGcmFtZSBkcmlmdAotRnJhbWVEcmlmdCA6Oj0gSU5URUdFUigtNjQgLi4gNjMpCi0KLS0tIEdBTlNTIFJlZmVyZW5jZSBMb2NhdGlvbiBJRQotR0FOU1NSZWZMb2NhdGlvbiA6Oj0gU0VRVUVOQ0UgewotCXRocmVlRExvY2F0aW9uCQkJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCi19Ci0KLS0tIEdBTlNTIElvbm9zcGhlcmljIE1vZGVsIElFCi0tLSBHQU5TUyBJb25vc3BoZXJpYyBNb2RlbCBjb25zaXN0cyBvZiBOZVF1aWNrIG1vZGVsIHBhcmFtZXRlcnMgYW5kIHN0b3JtIGZsYWdzCi0KLUdBTlNTSW9ub3NwaGVyaWNNb2RlbCA6Oj0gU0VRVUVOQ0UgewotIGdhbnNzSW9ub01vZGVsIEdBTlNTSW9ub3NwaGVyZU1vZGVsLAotIGdhbnNzSW9ub1N0b3JtRmxhZ3MgR0FOU1NJb25vU3Rvcm1GbGFncyBPUFRJT05BTCwKLSAuLi4KLX0KLQotLS0gR0FOU1MgaW9ub3NwaGVyZSBtb2RlbC4gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leCAKLUdBTlNTSW9ub3NwaGVyZU1vZGVsIDo6PSBTRVFVRU5DRSB7Ci0gYWkwIElOVEVHRVIgKDAgLi4gNDA5NSksCi0gYWkxIElOVEVHRVIgKDAgLi4gNDA5NSksCi0gYWkyIElOVEVHRVIgKDAgLi4gNDA5NSkKLX0KLQotLS0gR0FOU1MgaW9ub3NwaGVyZSBzdG9ybSBmbGFncwotR0FOU1NJb25vU3Rvcm1GbGFncyA6Oj0gU0VRVUVOQ0UgewotCWlvbm9TdG9ybUZsYWcxCUlOVEVHRVIgKDAgLi4gMSksCi0JaW9ub1N0b3JtRmxhZzIJSU5URUdFUiAoMCAuLiAxKSwKLQlpb25vU3Rvcm1GbGFnMwlJTlRFR0VSICgwIC4uIDEpLAotCWlvbm9TdG9ybUZsYWc0CUlOVEVHRVIgKDAgLi4gMSksCi0JaW9ub1N0b3JtRmxhZzUJSU5URUdFUiAoMCAuLiAxKQotfQotCi0tLSBHQU5TUyBHRU5FUklDIEFTU0lTVEFOQ0UgREFUQSBFTEVNRU5UUwotCi0tLSBHQU5TUyBUaW1lIE1vZGVsIElFIGNvbnNpc3RzIG9mIHRpbWUgb2Zmc2V0IGFuZCBmaXJzdCBhbmQgc2Vjb25kIG9yZGVyIHBhcmFtZXRlcnMgdG8gcmVsYXRlIEdOU1MKLS0tIHNwZWNpZmljIHN5c3RlbSB0aW1lIHRvIHNlbGVjdGVkIHRpbWUgcmVmZXJlbmNlCi1TZXFPZkdBTlNTVGltZU1vZGVsIDo6PSBTRVFVRU5DRSAoU0laRSgxLi43KSkgT0YgR0FOU1NUaW1lTW9kZWxFbGVtZW50Ci0KLUdBTlNTVGltZU1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgewotCWdhbnNzVGltZU1vZGVsUmVmVGltZQkJSU5URUdFUigwIC4uIDY1NTM1KSwKLQl0QTAJCSBUQTAsCi0JdEExCQkgVEExIE9QVElPTkFMLAotCXRBMgkJIFRBMiBPUFRJT05BTCwKLSBnbnNzVE9JRCBJTlRFR0VSICgwIC4uIDcpLAotIHdlZWtOdW1iZXIgSU5URUdFUiAoMCAuLiA4MTkxKSBPUFRJT05BTCAKLX0KLQotLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTAKLVRBMCA6Oj0gSU5URUdFUiAoLTIxNDc0ODM2NDggLi4gMjE0NzQ4MzY0NykKLQotLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTEKLVRBMSA6Oj0gSU5URUdFUiAoLTgzODg2MDggLi4gODM4ODYwNykKLQotLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTIKLVRBMiA6Oj0gSU5URUdFUiAoLTY0IC4uIDYzKQotCi0tLSBER0FOU1MgQ29ycmVjdGlvbnMgSUUKLUdBTlNTRGlmZkNvcnJlY3Rpb25zIDo6PSBTRVFVRU5DRSB7Ci0JZGdhbnNzUmVmVGltZQkJSU5URUdFUiAoMCAuLiAxMTkpLAkgLS0gREdBTlNTIHJlZmVyZW5jZSB0aW1lCi0KLQktLSBOX1NHTl9UWVBFIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHNnblR5cGVMaXN0Ci0Jc2duVHlwZUxpc3QJCSBTZXFPZlNnblR5cGVFbGVtZW50Ci19Ci0KLVNlcU9mU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi4zKSkgT0YgU2duVHlwZUVsZW1lbnQgLS0gbWF4IHRocmVlIHNpZ25hbHMgcGVyIEdOU1MKLQotLS0gREdBTlNTIHNpZ25hbCB0eXBlIGVsZW1lbnQsIG9uY2UgcGVyIEdOU1Mgc2lnbmFsIHR5cGUgaW5jbHVkZWQgaW4gREdBTlNTCi1TZ25UeXBlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgewotCWdhbnNzU2lnbmFsSUQJCSBHQU5TU1NpZ25hbElEIE9QVElPTkFMLCAtLSBzaWduYWwgdHlwZSBpZGVudGl0eQotIGdhbnNzU3RhdHVzSGVhbHRoIElOVEVHRVIgKDAgLi4gNyksCi0JLS0gTl9TR04gY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgZGdhbnNzU2duTGlzdAotIGRnYW5zc1Nnbkxpc3QgU2VxT2ZER0FOU1NTZ25FbGVtZW50Ci19Ci0KLUdBTlNTU2lnbmFsSUQgOjo9IElOVEVHRVIgKDAgLi4gMykJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAotU2VxT2ZER0FOU1NTZ25FbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMTYpKSBPRiBER0FOU1NTZ25FbGVtZW50Ci0KLS0tIG51bWJlciBvZiBjb3JyZWN0aW9uIGZvciBzaWduYWxzCi1ER0FOU1NTZ25FbGVtZW50IDo6PSBTRVFVRU5DRSB7Ci0Jc3ZJRAkJIFNWSUQsIC0tIFNhdGVsbGl0ZSBpZGVudGl0eQotCi0tLS0gU2VxdWVuY2UgbnVtYmVyIGZvciBHQU5TUyBOYXZpZ2F0aW9uIE1vZGVsIHRoYXQgbWF0Y2hlcyB0aGUgREdBTlNTIGNvcnJlY3Rpb24gc2V0Ci0JaW9kIAkJCUlOVEVHRVIgKDAgLi4gMTAyMyksCi0KLQktLSBVc2VyIERpZmZlcmVudGlhbCBSYW5nZSBFcnJvcgotCXVkcmUJCQlJTlRFR0VSICgwLi4zKSwJCQotCi0JLS0gUHNldWRvIFJhbmdlIENvcnJlY3Rpb24sIHJhbmdlIGlzCi0JLS0gLTY1NS4wNCAtICs2NTUuMDQsCi0JcHNldWRvUmFuZ2VDb3IJSU5URUdFUiAoLTIwNDcuLjIwNDcpLCAJCi0KLQktLSBQc2V1ZG8gUmFuZ2UgUmF0ZSBDb3JyZWN0aW9uLCByYW5nZSBpcwotCS0tIC00LjA2NCAtICs0LjA2NCwKLQlyYW5nZVJhdGVDb3IJSU5URUdFUiAoLTEyNy4uMTI3KQotfQotCi1TVklEIDo6PSBJTlRFR0VSICgwIC4uIDYzKQktLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4Ci0KLS0tIEdBTlNTIE5hdmlnYXRpb24gTW9kZWwgSUUKLUdBTlNTTmF2TW9kZWwgOjo9IFNFUVVFTkNFIHsKLSBub25Ccm9hZGNhc3RJbmRGbGFnIElOVEVHRVIgKDAgLi4gMSksCi0gdG9lTVNCIElOVEVHRVIgKDAgLi4gMzEpIE9QVElPTkFMLCAtLSA1IE1TQiBvZiB0b2UgYW5kIHRvYyAKLSBlTVNCIElOVEVHRVIgKDAgLi4gMTI3KSBPUFRJT05BTCwKLSBzcXJ0QU1CUyBJTlRFR0VSICgwIC4uIDYzKSBPUFRJT05BTCwKLQlnYW5zc1NhdGVsbGl0ZUxpc3QgU2VxT2ZHQU5TU1NhdGVsbGl0ZUVsZW1lbnQKLX0KLQotU2VxT2ZHQU5TU1NhdGVsbGl0ZUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgR0FOU1NTYXRlbGxpdGVFbGVtZW50Ci0KLUdBTlNTU2F0ZWxsaXRlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgewotCXN2SUQgU1ZJRCwKLSBzdkhlYWx0aCBJTlRFR0VSICgtNyAuLiAxMyksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKLSBpb2QgSU5URUdFUiAoMCAuLiAxMDIzKSwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAotIGdhbnNzQ2xvY2tNb2RlbCBHQU5TU0Nsb2NrTW9kZWwsIAotIGdhbnNzT3JiaXRNb2RlbCBHQU5TU09yYml0TW9kZWwsIAotIC4uLgotfQotCi0tLSBHQU5TUyBvcmJpdCBtb2RlbCBmb3IgdGhlIEdOU1Mgc2F0ZWxsaXRlIGFjY29yZGluZyB0byB0aGUgY2hvaWNlCi1HQU5TU09yYml0TW9kZWwgOjo9IENIT0lDRSB7Ci0Ja2VwbGVyaWFuU2V0CSBOYXZNb2RlbC1LZXBsZXJpYW5TZXQsCQotIC4uLgotfQotCi0tLSBOYXZpZ2F0aW9uIG1vZGVsIGluIEtlcGxlcmlhbiBwYXJhbWV0ZXJzCi1OYXZNb2RlbC1LZXBsZXJpYW5TZXQgOjo9IFNFUVVFTkNFIHsKLSBrZXBsZXJUb2VMU0IgSU5URUdFUiAoMCAuLiA1MTEpLCAtLSA5TFNCIGFyZSBnaXZlbiBpbiBHQU5TU05hdmlnYXRpb25Nb2RlbAotCWtlcGxlclcJCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAotCWtlcGxlckRlbHRhTgkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCi0Ja2VwbGVyTTAJCSBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCi0Ja2VwbGVyT21lZ2FEb3QJIElOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKLQlrZXBsZXJFTFNCIAkgSU5URUdFUiAoMC4uMzM1NTQ0MzEpLAotCWtlcGxlcklEb3QJCSBJTlRFR0VSICgtODE5Mi4uODE5MSksCi0Ja2VwbGVyQVBvd2VySGFsZkxTQiBJTlRFR0VSICgwLi4gNjcxMDg4NjMpLAotCWtlcGxlckkwCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAotCWtlcGxlck9tZWdhMCBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCi0Ja2VwbGVyQ3JzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCi0Ja2VwbGVyQ2lzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCi0Ja2VwbGVyQ3VzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCi0Ja2VwbGVyQ3JjCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCi0Ja2VwbGVyQ2ljCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCi0Ja2VwbGVyQ3VjCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NykKLX0KLQotLS0gR0FOU1MgY2xvY2sgbW9kZWwgZm9yIHRoZSBHTlNTIHNhdGVsbGl0ZSBhY2NvcmRpbmcgdG8gdGhlIGNob2ljZQotR0FOU1NDbG9ja01vZGVsIDo6PSBDSE9JQ0UgewotCXN0YW5kYXJkQ2xvY2tNb2RlbExpc3QJIFNlcU9mU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCwJCi0gLi4uCi19Ci0KLVNlcU9mU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMikpIE9GIFN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQKLQotU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgewotIHN0YW5DbG9ja1RvY0xTQiBJTlRFR0VSICgwIC4uIDUxMSksIC0tIDlMU0Igb2YgdGltZSBvZiBjbG9jawotIHN0YW5DbG9ja0FGMiBJTlRFR0VSICgtMjA0OCAuLiAyMDQ3KSwgCi0gc3RhbkNsb2NrQUYxIElOVEVHRVIgKC0xMzEwNzIgLi4gMTMxMDcxKSwgCi0gc3RhbkNsb2NrQUYwIElOVEVHRVIgKC0xMzQyMTc3MjggLi4gMTM0MjE3NzI3KSwKLSBzdGFuQ2xvY2tUZ2QgSU5URUdFUiAoLTUxMiAuLiA1MTEpIE9QVElPTkFMLAotIHN0YW5Nb2RlbElEIElOVEVHRVIgKDAgLi4gMSkgT1BUSU9OQUwsCi0gLi4uCi19IAotCi0tLSBHQU5TUyBSZWFsLVRpbWUgSW50ZWdyaXR5IElFCi1HQU5TU1JlYWxUaW1lSW50ZWdyaXR5IDo6PSBTRVFVRU5DRSB7Ci0gLS0gbGlzdCBvZiBiYWQgc2lnbmFscwotIC0tIE5CUyBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBpbiBTZXFPZi1CYWRTaWduYWxTZXQKLSBnYW5zc0JhZFNpZ25hbExpc3QgU2VxT2ZCYWRTaWduYWxFbGVtZW50Ci19Ci0KLVNlcU9mQmFkU2lnbmFsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBCYWRTaWduYWxFbGVtZW50Ci0KLUJhZFNpZ25hbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKLSBiYWRTVklEIFNWSUQsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKLSBiYWRTaWduYWxJRCBJTlRFR0VSICgwIC4uIDMpIE9QVElPTkFMIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKLX0KLQotCi0tLSBHQU5TUyBEYXRhIEJpdCBBc3Npc3RhbmNlIElFCi1HQU5TU0RhdGFCaXRBc3Npc3QgOjo9IFNFUVVFTkNFIHsKLSBnYW5zc1RPRCBJTlRFR0VSICgwIC4uIDU5KSwKLSBzdklEIFNWSUQsCi0gZ2Fuc3NEYXRhVHlwZUlEIElOVEVHRVIgKDAgLi4gMiksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKLSAtLSBsaXN0IG9mIG5hdmlnYXRpb24gZGF0YSBiaXRzCi0gLS0gTl9CSVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU2VxT2YtRGF0YUJpdHMKLSBnYW5zc0RhdGFCaXRzIFNlcU9mLUdBTlNTRGF0YUJpdHMKLX0KLQotU2VxT2YtR0FOU1NEYXRhQml0cyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMSAuLiAxMDI0KSkgT0YgR0FOU1NEYXRhQml0Ci1HQU5TU0RhdGFCaXQgOjo9IElOVEVHRVIoMCAuLiAxKQotCi0tLSBHQU5TUyBSZWZlcmVuY2UgTWVhc3VyZW1lbnQgQXNzaXN0YW5jZSBJRQotLS0gQ29kZSBhbmQgRG9wcGxlciBhc3Npc3RhbmNlIGZyb20gdGhlIG5ldHdvcmsuIAotR0FOU1NSZWZNZWFzdXJlbWVudEFzc2lzdCA6Oj0gU0VRVUVOQ0UgewotIGdhbnNzU2lnbmFsSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAotIGdhbnNzUmVmTWVhc0Fzc2l0TGlzdCBTZXFPZkdBTlNTUmVmTWVhc3VyZW1lbnRFbGVtZW50Ci19Ci0KLVNlcU9mR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMTYpKSBPRiBHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudAotCi1HQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudCA6Oj0gU0VRVUVOQ0UgewotIHN2SUQgU1ZJRCwKLQktLSBEb3BwbGVyIDB0aCBvcmRlciB0ZXJtLAotCS0tIC0xMDI0IG0vcyB0byAxMDIzLjUgbS9zIHdpdGggMC41IG0vcyByZXNvbHV0aW9uKQotCWRvcHBsZXIwCQkJCUlOVEVHRVIgKC0yMDQ4IC4uIDIwNDcpLAktLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4Ci0JYWRkaXRpb25hbERvcHBsZXIJCUFkZGl0aW9uYWxEb3BwbGVyRmllbGRzCSBPUFRJT05BTCwKLQljb2RlUGhhc2UJCQkJSU5URUdFUiAoMCAuLiAxMDIyKSwJIC0tIENvZGUgUGhhc2UgaW4gbXMKLQlpbnRDb2RlUGhhc2UJCQlJTlRFR0VSICgwIC4uIDEyNyksCSAtLSBJbnRlZ2VyIENvZGUgUGhhc2UgaW4gbXMKLQljb2RlUGhhc2VTZWFyY2hXaW5kb3cJSU5URUdFUiAoMCAuLiAzMSksCSAtLSBDb2RlIFBoYXNlIFNlYXJjaCBXaW5kb3csIHNlZSBBbm5leAotCWFkZGl0aW9uYWxBbmdsZQkJCUFkZGlvbmFsQW5nbGVGaWVsZHMJCSBPUFRJT05BTCwKLSAuLi4KLX0KLQotQWRkaXRpb25hbERvcHBsZXJGaWVsZHMgOjo9IFNFUVVFTkNFIHsKLQktLSBEb3BwbGVyIDFzdCBvcmRlciB0ZXJtLCAtMC4yIC0gKzAuMSBtL3MyCi0JZG9wcGxlcjEJCQkJSU5URUdFUiAoMC4uNjMpLAotCWRvcHBsZXJVbmNlcnRhaW50eQkJSU5URUdFUiAoMC4uNCkKLX0KLQotLS0gR0FOU1MgQWxtYW5hYyBNb2RlbCBJRQotR0FOU1NBbG1hbmFjTW9kZWwgOjo9IFNFUVVFTkNFIHsKLSB3ZWVrTnVtYmVyIElOVEVHRVIgKDAgLi4gMjU1KSwKLSBzdklETWFzayBTVklETUFTSywKLSB0b2EgSU5URUdFUiAoMCAuLiAyNTUpIE9QVElPTkFMLAotIGlvZGEgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwKLSBnYW5zc0FsbWFuYWNMaXN0IFNlcU9mR0FOU1NBbG1hbmFjRWxlbWVudAotfQotCi0tLSBTViBJRCBNYXNrLCBMU0IgZm9yIElEIDEgYW5kIE1TQiBmb3IgSUQgMzYKLVNWSURNQVNLIDo6PSBCSVQgU1RSSU5HIChTSVpFICgxLi4zNikpCi0KLVNlcU9mR0FOU1NBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMSAuLiAzNikpIE9GIEdBTlNTQWxtYW5hY0VsZW1lbnQKLQotLS0gR0FOU1MgQWxtYW5hYyBNb2RlbCAKLUdBTlNTQWxtYW5hY0VsZW1lbnQgOjo9IENIT0lDRSB7Ci0Ja2VwbGVyaWFuQWxtYW5hY1NldAkgQWxtYW5hYy1LZXBsZXJpYW5TZXQsCQotIC4uLgotfQotCi0tLSBBbG1hbmFjIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIEtlcGxlcmlhbiBwYXJhbWV0ZXJzCi1BbG1hbmFjLUtlcGxlcmlhblNldCA6Oj0gU0VRVUVOQ0UgewotIAlrZXBBbG1hbmFjRQkJCSBJTlRFR0VSICgwIC4uIDIwNDcpLAotCWtlcEFsbWFuYWNEZWx0YUkJCUlOVEVHRVIgKC0xMDI0IC4uIDEwMjMpLAotCWtlcEFsbWFuYWNPbWVnYURvdAkJSU5URUdFUiAoLTEwMjQgLi4gMTAyMyksCi0ga2VwU1ZIZWFsdGggSU5URUdFUiAoMCAuLiAxNSksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKLQlrZXBBbG1hbmFjQVBvd2VySGFsZglJTlRFR0VSICgtNjU1MzYgLi4gNjU1MzUpLAotCWtlcEFsbWFuYWNPbWVnYTAJCUlOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NyksCi0Ja2VwQWxtYW5hY1cJCQkgSU5URUdFUiAoLTMyNzY4IC4uIDMyNzY3KSwKLQlrZXBBbG1hbmFjTTAJCQlJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpLAotCWtlcEFsbWFuYWNBRjAJCQlJTlRFR0VSICgtODE5MiAuLiA4MTkxKSwKLQlrZXBBbG1hbmFjQUYxCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpCi19Ci0KLS0tIEdBTlNTIFVuaXZlcnNhbCBUaW1lIENvb3JkaW5hdGUgTW9kZWwKLUdBTlNTVVRDTW9kZWwgOjo9IFNFUVVFTkNFIHsKLQlnYW5zc1V0Y0ExCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAotCWdhbnNzVXRjQTAJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCi0JZ2Fuc3NVdGNUb3QJCQlJTlRFR0VSICgwLi4yNTUpLAotCWdhbnNzVXRjV050CQkJSU5URUdFUiAoMC4uMjU1KSwKLQlnYW5zc1V0Y0RlbHRhVGxzCUlOVEVHRVIgKC0xMjguLjEyNyksCi0JZ2Fuc3NVdGNXTmxzZgkJSU5URUdFUiAoMC4uMjU1KSwKLQlnYW5zc1V0Y0ROCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKLQlnYW5zc1V0Y0RlbHRhVGxzZglJTlRFR0VSICgtMTI4Li4xMjcpCi19Ci0KLS0tUmVxdWlyZWQgTWVhc3VyZW1lbnQgUmVxdWVzdCBSZXNwb25zZSBUaW1lLCByYW5nZSBpcyAxIHRvIDEyOCBzZWNvbmRzLiAKLVJlcXVpcmVkUmVzcG9uc2VUaW1lIDo6PSBJTlRFR0VSICAoMS4uMTI4KQotCi1SZWwtNy1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7Ci0KLQl2ZWxFc3RpbWF0ZSAJVmVsb2NpdHlFc3RpbWF0ZSBPUFRJT05BTCwKLSAtLSBIb3Jpem9udGFsIFZlbG9jaXR5Ci0gLS0gSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5Ci0gLS0gSG9yaXpvbnRhbCBWZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5Ci0gLS0gSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBVbmNlcnRhaW50eQotIGdhbnNzTG9jYXRpb25JbmZvIEdBTlNTTG9jYXRpb25JbmZvIE9QVElPTkFMLAotIGdhbnNzTWVhc3VyZUluZm8gR0FOU1NNZWFzdXJlSW5mbyBPUFRJT05BTCwKLQkuLi4KLS0tIEZ1cnRoZXIgUmVsZWFzZSA3IGV4dGVuc2lvbnMgaGVyZQotfQotCi0tLSBHQU5TUyBMb2NhdGlvbiBJbmZvcm1hdGlvbiBjb250YWlucyBsb2NhdGlvbiBlc3RpbWF0ZSwgdGltZSBzdGFtcCB3aXRoIHVuY2VydGFpbnR5IAotLS0gYW5kIG9wdGlvbmFsbHkgUmVmZXJlbmNlIEZyYW1lIGZpZWxkCi1HQU5TU0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgewotIHJlZmVyZW5jZUZyYW1lIFJlZmVyZW5jZUZyYW1lIE9QVElPTkFMLCAtLSBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCi0gZ2Fuc3NUT0RtIEdBTlNTVE9EbSBPUFRJT05BTCwgLS0gR05TUyBUT0QgbW9kdWxvCi0gZ2Fuc3NUT0RGcmFjIElOVEVHRVIgKDAgLi4gMTYzODQpIE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4Ci0JZ2Fuc3NUT0RVbmNlcnRhaW50eSBHQU5TU1RPRFVuY2VydGFpbnR5IE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4Ci0gZ2Fuc3NUaW1lSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAotCWZpeFR5cGUJCQkgRml4VHlwZSwKLSBwb3NEYXRhIFBvc2l0aW9uRGF0YSwKLSBzdGF0aW9uYXJ5SW5kaWNhdGlvbiBJTlRFR0VSKDAgLi4gMSkgT1BUSU9OQUwsIC0tICcwJyBpZiBtb3Zpbmcgb3IgbW90aW9uIG5vdCBrbm93biAKLQktLSBQb3NzaWJsZSBzaGFwZXMgY2FycmllZCBpbiBwb3NFc3RpbWF0ZSBhcmUKLQktLSBlbGxpcHNvaWQgcG9pbnQsCi0JLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCi0JLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZQotCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKLQlwb3NFc3RpbWF0ZQkJIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwKLSAuLi4KLX0KLQotUG9zaXRpb25EYXRhIDo6PSBCSVQgU1RSSU5HIHsKLSBlLW90ZCgwKSwKLQlncHMgKDEpLAotCWdhbGlsZW8gKDIpIH0gKFNJWkUgKDMuLjE2KSkKLQotCi0tLSBHQU5TUyBUT0QgbW9kdWxvIDEgaG91cgotR0FOU1NUT0RtIDo6PSBJTlRFR0VSICgwIC4uIDM1OTk5OTkpCi0KLVJlZmVyZW5jZUZyYW1lIDo6PSBTRVFVRU5DRSB7Ci0gcmVmZXJlbmNlRk4gSU5URUdFUiAoMCAuLiA2NTUzNSksCi0JLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZmVyZW5jZUZOIGlzIDAgLSA0MjQzMQotIHJlZmVyZW5jZUZOTVNCIElOVEVHRVIgKDAgLi4gNjMpIE9QVElPTkFMIC0tIE1TQiBvZiBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCi19Ci0KLQotCi0tLSBHQU5TUyBNZWFzdXJlbWVudCBJbmZvcm1hdGlvbiAKLUdBTlNTTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKLQktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzCi0JLS0gdXNlciBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhpcyBlbGVtZW50IGlzIG51bWJlciBvZiBlbGVtZW50cwotCS0tIGRlZmluZWQgaW4gcmVmZXJlbmNlIEJUUyBpZGVudGl0eQotIGdhbnNzTXNyU2V0TGlzdCBTZXFPZkdBTlNTLU1zclNldEVsZW1lbnQKLX0KLVNlcU9mR0FOU1MtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMykpIE9GIEdBTlNTLU1zclNldEVsZW1lbnQKLQotLS0gR0FOU1MgbWVhc3VyZW1lbnQgaW5mb3JtYXRpb24gMS0zIHRpbWVzIGluIGEgbWVzc2FnZQotR0FOU1MtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgewotIHJlZmVyZW5jZUZyYW1lIFJlZmVyZW5jZUZyYW1lIE9QVElPTkFMLCAtLSBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCi0gZ2Fuc3NUT0RtIEdBTlNTVE9EbSBPUFRJT05BTCwgLS0gR0FOU1MgVE9EIG1vZHVsbwotIGRlbHRhR05BU1NUT0QgSU5URUdFUiAoMCAuLiAxMjcpIE9QVElPTkFMLAotCWdhbnNzVE9EVW5jZXJ0YWludHkgR0FOU1NUT0RVbmNlcnRhaW50eSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yaW5nIHRvIEFubmV4Ci0KLSAtLU5fU0dOX1RZUEUgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgU2VxT2ZHQU5TUy1TZ25UeXBlRWxlbWVudAotIGdhbnNzLVNnblR5cGVMaXN0IFNlcU9mR0FOU1MtU2duVHlwZUVsZW1lbnQKLX0KLQotLS0gTWVhc3VyZW1lbnRzIGNhbiBiZSByZXR1cm5lZCB1cCB0byA2IGRpZmZlcmVudCBzaWduYWwgdHlwZXMgCi1TZXFPZkdBTlNTLVNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi42KSkgT0YgR0FOU1MtU2duVHlwZUVsZW1lbnQKLQotR0FOU1MtU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKLQlnYW5zc1NpZ25hbElECQlJTlRFR0VSICgwIC4uIDE1KSwgLS0gQ29kaW5nIGFjY3JvZGluZyB0byBBbm5leAotIC0tTl9TR04gY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgU2VxT2ZHQU5TUy1TZ25FbGVtZW50Ci0gZ2Fuc3MtU2duTGlzdCBTZXFPZkdBTlNTLVNnbkVsZW1lbnQKLX0KLQotLS0gTWVhc3VyZW1lbnRzIGNhbiBiZSByZXR1cm5lZCB1cCB0byAxNiBwZXIgc2lnbmFsIHR5cGVzIAotU2VxT2ZHQU5TUy1TZ25FbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIEdBTlNTLVNnbkVsZW1lbnQKLQotCi1HQU5TUy1TZ25FbGVtZW50IDo6PSBTRVFVRU5DRSB7Ci0gc3ZJRCBTVklELAotIGNObyBJTlRFR0VSICgwIC4uIDYzKSwKLSBtcGF0aERldCBNcGF0aEluZGljLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4Ci0gY2FycmllclF1YWxpdHlJbmQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAotIGNvZGVQaGFzZSBJTlRFR0VSICgwIC4uIDIwOTcxNTEpLAotIGludGVnZXJDb2RlUGhhc2UgSU5URUdFUiAoMCAuLiA2MykgT1BUSU9OQUwsCi0gY29kZVBoYXNlUk1TRXJyb3IgSU5URUdFUiAoMC4uNjMpLCAtLSBDb2RpbmcgYWNjb3JpbmcgdG8gQW5uZXgKLSBkb3BwbGVyIElOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NykgT1BUSU9OQUwsCi0gYWRyIElOVEVHRVIgKDAgLi4gMzM1NTQ0MzEpIE9QVElPTkFMCi19Ci0KLVJlbDctQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7Ci0gZ2Fuc3MtQXNzaXN0RGF0YSBHQU5TUy1Bc3Npc3REYXRhIE9QVElPTkFMLAotIGdhbnNzQ2FycmllclBoYXNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCi0gZ2Fuc3NUT0RHU01UaW1lQXNzb2NpYXRpb25NZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKLQkuLi4KLS0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA3IGhlcmUKLX0KLQotRU5ECmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtTWVzc2FnZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxNDBlMi4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtTWVzc2FnZXMuYXNuCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLS0gUlJMUC1NZXNzYWdlcy5hc24KLS0tICRJZCQKLS0tIFRha2VuIGZyb20gM0dQUCBUUyA0NC4wMzEgVjcuNC4wICgyMDA3LTAzKQotLS0gaHR0cDovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS80NF9zZXJpZXMvNDQuMDMxLzQ0MDMxLTc0MC56aXAvNDQwMzEtNzQwLmRvYwotLS0KLS0tIDMuMSBHZW5lcmFsIEZvcm1hdCBvZiBSUkxQIE1lc3NhZ2UKLS0tCi0KLVJSTFAtTWVzc2FnZXMKLS0tIHsgUlJMUC1tZXNzYWdlcyB9Ci0KLURFRklOSVRJT05TIEFVVE9NQVRJQyBUQUdTIDo6PQotCi1CRUdJTgotCi1JTVBPUlRTCi0JTXNyUG9zaXRpb24tUmVxLCBNc3JQb3NpdGlvbi1Sc3AsIEFzc2lzdGFuY2VEYXRhLAotCVByb3RvY29sRXJyb3IKLUZST00KLQlSUkxQLUNvbXBvbmVudHMgCS0tIHsgUlJMUC1Db21wb25lbnRzIH0KLTsKLQotUERVIDo6PSBTRVFVRU5DRSB7Ci0JcmVmZXJlbmNlTnVtYmVyCQkJSU5URUdFUiAoMC4uNyksCi0JY29tcG9uZW50CQkJCVJSTFAtQ29tcG9uZW50Ci19Ci0KLVJSTFAtQ29tcG9uZW50IDo6PSBDSE9JQ0UgewotCW1zclBvc2l0aW9uUmVxCQkJTXNyUG9zaXRpb24tUmVxLAotCW1zclBvc2l0aW9uUnNwCQkJTXNyUG9zaXRpb24tUnNwLAotCWFzc2lzdGFuY2VEYXRhCQkJQXNzaXN0YW5jZURhdGEsCi0JYXNzaXN0YW5jZURhdGFBY2sJCU5VTEwsCi0JcHJvdG9jb2xFcnJvcgkJCVByb3RvY29sRXJyb3IsCi0JLi4uCi0KLX0KLQotRU5ECmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9wYXRjaC1ycmxwLWNvbXBvbmVudHMuZGlmZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlNTVhZS4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLS0tIFJSTFAtQ29tcG9uZW50cy5hc24JMjAwOS0xMC0yNiAyMjoxMDo0NC4wMDAwMDAwMDAgKzAxMDAKLSsrKyBSUkxQLUNvbXBvbmVudHMuYXNuCTIwMDktMTAtMjYgMjI6MTA6NDQuMDAwMDAwMDAwICswMTAwCi1AQCAtMTgsMTYgKzE4LDE2IEBACi0gCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgVmVsb2NpdHlFc3RpbWF0ZQotIEZST00KLSAJTUFQLUxDUy1EYXRhVHlwZXMgewotLQljY2l0dCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotLQlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uNSAoNSl9Ci0rCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCi0rCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb24xMSAoMTEpfQotIAotIAlFeHRlbnNpb25Db250YWluZXIKLSBGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgewotLQljY2l0dCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQotLQlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb240ICg0KX0KLSsJaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKLSsJZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KLSA7Ci0gCi0gLS0gQWRkIGhlcmUgb3RoZXIgQVNOLjEgZGVmaW5pdGlvbnMgcHJlc2VudGVkIGJlbG93Ci0gLS0gaW4gY2hhcHRlcnMgNCBhbmQgNS4KLSAKLUBAIC0zMDUsMTEgKzMwNSwxMSBAQAotIFN5c3RlbUluZm9JbmRleCA6Oj0gSU5URUdFUiAoMS4uMzIpCi0gCi0gQ2VsbElEQW5kTEFDIDo6PSBTRVFVRU5DRSB7Ci0tCXJlZmVyZW5jZUxBQwlMQUMsCQkJCS0tIExvY2F0aW9uIGFyZWEgY29kZQotKwlyZWZlcmVuY2VMQUMJTEFDSUQsCQkJCS0tIExvY2F0aW9uIGFyZWEgY29kZQotIAlyZWZlcmVuY2VDSQkJQ2VsbElECQkJCS0tIENlbGwgaWRlbnRpdHkKLSB9Ci0gQ2VsbElEIDo6PSBJTlRFR0VSICgwLi42NTUzNSkKLS1MQUMgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQotK0xBQ0lEIDo6PSBJTlRFR0VSICgwLi42NTUzNSkKLSAKLSAtLSBPVEQtTWVhc3VyZUluZm8KLSBPVEQtTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDBfYWRkX2VudW1lcmF0ZWRfdmVyYm9zZS5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMF9hZGRfZW51bWVyYXRlZF92ZXJib3NlLmRpZmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzIyYTMuLjAwMDAwMDAKLS0tIGEvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMF9hZGRfZW51bWVyYXRlZF92ZXJib3NlLmRpZmYKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1JbmRleDogc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuYwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMJKHJldmlzaW9uIDE0MDcpCi0rKysgc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuYwkod29ya2luZyBjb3B5KQotQEAgLTIyLDcgKzIyLDcgQEAKLSAJIkVOVU1FUkFURUQiLAkJCS8qIFRoZSBBU04uMSB0eXBlIGlzIHN0aWxsIEVOVU1FUkFURUQgKi8KLSAJIkVOVU1FUkFURUQiLAotIAlOYXRpdmVJbnRlZ2VyX2ZyZWUsCi0tCU5hdGl2ZUludGVnZXJfcHJpbnQsCi0rCU5hdGl2ZUVudW1lcmF0ZWRfcHJpbnQsCi0gCWFzbl9nZW5lcmljX25vX2NvbnN0cmFpbnQsCi0gCU5hdGl2ZUludGVnZXJfZGVjb2RlX2JlciwKLSAJTmF0aXZlSW50ZWdlcl9lbmNvZGVfZGVyLAotQEAgLTIwNSwzICsyMDUsMzAgQEAKLSAJX0FTTl9FTkNPREVEX09LKGVyKTsKLSB9Ci0gCi0raW50Ci0rTmF0aXZlRW51bWVyYXRlZF9wcmludChhc25fVFlQRV9kZXNjcmlwdG9yX3QgKnRkLCBjb25zdCB2b2lkICpzcHRyLCBpbnQgaWxldmVsLAotKwlhc25fYXBwX2NvbnN1bWVfYnl0ZXNfZiAqY2IsIHZvaWQgKmFwcF9rZXkpIHsKLSsJYXNuX0lOVEVHRVJfc3BlY2lmaWNzX3QgKnNwZWNzPShhc25fSU5URUdFUl9zcGVjaWZpY3NfdCAqKXRkLT5zcGVjaWZpY3M7Ci0rCWNvbnN0IGxvbmcgKm5hdGl2ZSA9IChjb25zdCBsb25nICopc3B0cjsKLSsJY2hhciBzY3JhdGNoWzI1Nl07Ci0rCWludCByZXQ7Ci0rCi0rCSh2b2lkKXRkOwkvKiBVbnVzZWQgYXJndW1lbnQgKi8KLSsJKHZvaWQpaWxldmVsOwkvKiBVbnVzZWQgYXJndW1lbnQgKi8KLSsKLSsJaWYobmF0aXZlKSB7Ci0rCQljb25zdCBhc25fSU5URUdFUl9lbnVtX21hcF90ICptYXAgPSBJTlRFR0VSX21hcF92YWx1ZTJlbnVtKHNwZWNzLCAqbmF0aXZlKTsKLSsJCWlmIChtYXAgJiYgbWFwLT5lbnVtX2xlbiAmJiBtYXAtPmVudW1fbmFtZSkgewotKwkJCXJldCA9IHNucHJpbnRmKHNjcmF0Y2gsIHNpemVvZihzY3JhdGNoKSwKLSsJCQkJIiVzIiwgbWFwLT5lbnVtX25hbWUpOwotKwkJfSBlbHNlIHsKLSsJCQlyZXQgPSBzbnByaW50ZihzY3JhdGNoLCBzaXplb2Yoc2NyYXRjaCksCi0rCQkJCShzcGVjcyAmJiBzcGVjcy0+ZmllbGRfdW5zaWduZWQpCi0rCQkJCT8gIiVsdSIgOiAiJWxkIiwgKm5hdGl2ZSk7Ci0rCQl9Ci0rCQlhc3NlcnQocmV0ID4gMCAmJiAoc2l6ZV90KXJldCA8IHNpemVvZihzY3JhdGNoKSk7Ci0rCQlyZXR1cm4gKGNiKHNjcmF0Y2gsIHJldCwgYXBwX2tleSkgPCAwKSA/IC0xIDogMDsKLSsJfSBlbHNlIHsKLSsJCXJldHVybiAoY2IoIjxhYnNlbnQ+IiwgOCwgYXBwX2tleSkgPCAwKSA/IC0xIDogMDsKLSsJfQotK30KLUluZGV4OiBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5oCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0gc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAkocmV2aXNpb24gMTQwNykKLSsrKyBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5oCSh3b3JraW5nIGNvcHkpCi1AQCAtMjQsNiArMjQsNyBAQAotIHhlcl90eXBlX2VuY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2VuY29kZV94ZXI7Ci0gcGVyX3R5cGVfZGVjb2Rlcl9mIE5hdGl2ZUVudW1lcmF0ZWRfZGVjb2RlX3VwZXI7Ci0gcGVyX3R5cGVfZW5jb2Rlcl9mIE5hdGl2ZUVudW1lcmF0ZWRfZW5jb2RlX3VwZXI7Ci0rYXNuX3N0cnVjdF9wcmludF9mIE5hdGl2ZUVudW1lcmF0ZWRfcHJpbnQ7Ci0gCi0gI2lmZGVmIF9fY3BsdXNwbHVzCi0gfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDljMjAxLi4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDFfZml4X3Blcl9lbmNvZGluZ19kaWV0ZXIuZGlmZgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUluZGV4OiBza2VsZXRvbnMvcGVyX3N1cHBvcnQuYwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCShyZXZpc2lvbiAxNDA3KQotKysrIHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCSh3b3JraW5nIGNvcHkpCi1AQCAtMzM2LDcgKzMzNiwxMiBAQAotIAkJYnVmWzNdID0gYml0czsKLSAJZWxzZSB7Ci0gCQlBU05fREVCVUcoIi0+W1BFUiBvdXQgc3BsaXQgJWRdIiwgb2JpdHMpOwotKyNpZiAxIC8vIERpZXRlcgotKwkJcG8tPm5ib2ZmIC09IG9iaXRzOyAvLyB1bmRvIGluY3JlbWVudGF0aW9uIGZyb20gYSBmZXcgbGluZXMgYWJvdmUKLSsJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMgPj4gKG9iaXRzIC0gMjQpLCAyNCk7IC8vIHNoaWZ0IGFjY29yZGluZyB0byB0aGUgcmVzdCBvZiB0aGUgYml0cyAKLSsjZWxzZQkJCi0gCQlwZXJfcHV0X2Zld19iaXRzKHBvLCBiaXRzID4+IDgsIDI0KTsKLSsjZW5kaWYKLSAJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMsIG9iaXRzIC0gMjQpOwotIAkJQVNOX0RFQlVHKCI8LVtQRVIgb3V0IHNwbGl0ICVkXSIsIG9iaXRzKTsKLSAJfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZGF0YS51YnggYi9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjZGRkYy4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dldC10ZXN0LWRhdGEuc2ggYi9ycmxwLWVwaGVtZXJpcy9nZXQtdGVzdC1kYXRhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNjlmNDNjLi4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL2dldC10ZXN0LWRhdGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIS9iaW4vc2gKLQotREVWPSQxCi1PVVRGPSQyCi0KLSMgQ2hhbmdlIG1vZGUKLWVjaG8gLWVuICJcJFBVQlgsNDEsMSwwMDAxLDAwMDEsOTYwMCwwKjE0XHJcbiIgPiAke0RFVn0KLQotIyBXYWl0IGEgbGl0dGxlCi1zbGVlcCAyCi0KLSMgU3RhcnQgZHVtcAotZWNobyAtZW4gIlx4YjVceDYyXHgwMVx4MDJceDAwXHgwMFx4MDNceDBhIiB8IFwKLQlzb2NhdCAtdDUgJHtERVZ9LGI5NjAwLHJhdyxjbG9jYWw9MSxlY2hvPTAgLSA+ICR7T1VURn0KLWVjaG8gLWVuICJceGI1XHg2Mlx4MGJceDEwXHgwMFx4MDBceDFiXHg1YyIgfCBcCi0Jc29jYXQgLXQxMCAke0RFVn0sYjk2MDAscmF3LGNsb2NhbD0xLGVjaG89MCAtID4+ICR7T1VURn0KLQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ3BsLTIuMC50eHQgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMi4wLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxMTkwNS4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy9ncGwtMi4wLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwbC0zLjAudHh0IGIvcnJscC1lcGhlbWVyaXMvZ3BsLTMuMC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YTllZDAuLjAwMDAwMDAKLS0tIGEvcnJscC1lcGhlbWVyaXMvZ3BsLTMuMC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2NzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNwotCi0gQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKLQotICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgotc29mdHdhcmUgYW5kIG90aGVyIGtpbmRzIG9mIHdvcmtzLgotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhbmQgb3RoZXIgcHJhY3RpY2FsIHdvcmtzIGFyZSBkZXNpZ25lZAotdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIHRoZSB3b3Jrcy4gIEJ5IGNvbnRyYXN0LAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8KLXNoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZnJlZQotc29mdHdhcmUgZm9yIGFsbCBpdHMgdXNlcnMuICBXZSwgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdXNlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vc3Qgb2Ygb3VyIHNvZnR3YXJlOyBpdCBhcHBsaWVzIGFsc28gdG8KLWFueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoZW0gaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91Ci13YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldwotZnJlZSBwcm9ncmFtcywgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBwcmV2ZW50IG90aGVycyBmcm9tIGRlbnlpbmcgeW91Ci10aGVzZSByaWdodHMgb3IgYXNraW5nIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIFRoZXJlZm9yZSwgeW91IGhhdmUKLWNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZgoteW91IG1vZGlmeSBpdDogcmVzcG9uc2liaWxpdGllcyB0byByZXNwZWN0IHRoZSBmcmVlZG9tIG9mIG90aGVycy4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBwYXNzIG9uIHRvIHRoZSByZWNpcGllbnRzIHRoZSBzYW1lCi1mcmVlZG9tcyB0aGF0IHlvdSByZWNlaXZlZC4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZQotb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkKLWtub3cgdGhlaXIgcmlnaHRzLgotCi0gIERldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKLSgxKSBhc3NlcnQgY29weXJpZ2h0IG9uIHRoZSBzb2Z0d2FyZSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBMaWNlbnNlCi1naXZpbmcgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0LgotCi0gIEZvciB0aGUgZGV2ZWxvcGVycycgYW5kIGF1dGhvcnMnIHByb3RlY3Rpb24sIHRoZSBHUEwgY2xlYXJseSBleHBsYWlucwotdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiAgRm9yIGJvdGggdXNlcnMnIGFuZAotYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcwotY2hhbmdlZCwgc28gdGhhdCB0aGVpciBwcm9ibGVtcyB3aWxsIG5vdCBiZSBhdHRyaWJ1dGVkIGVycm9uZW91c2x5IHRvCi1hdXRob3JzIG9mIHByZXZpb3VzIHZlcnNpb25zLgotCi0gIFNvbWUgZGV2aWNlcyBhcmUgZGVzaWduZWQgdG8gZGVueSB1c2VycyBhY2Nlc3MgdG8gaW5zdGFsbCBvciBydW4KLW1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBzb2Z0d2FyZSBpbnNpZGUgdGhlbSwgYWx0aG91Z2ggdGhlIG1hbnVmYWN0dXJlcgotY2FuIGRvIHNvLiAgVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBhaW0gb2YKLXByb3RlY3RpbmcgdXNlcnMnIGZyZWVkb20gdG8gY2hhbmdlIHRoZSBzb2Z0d2FyZS4gIFRoZSBzeXN0ZW1hdGljCi1wYXR0ZXJuIG9mIHN1Y2ggYWJ1c2Ugb2NjdXJzIGluIHRoZSBhcmVhIG9mIHByb2R1Y3RzIGZvciBpbmRpdmlkdWFscyB0bwotdXNlLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hlcmUgaXQgaXMgbW9zdCB1bmFjY2VwdGFibGUuICBUaGVyZWZvcmUsIHdlCi1oYXZlIGRlc2lnbmVkIHRoaXMgdmVyc2lvbiBvZiB0aGUgR1BMIHRvIHByb2hpYml0IHRoZSBwcmFjdGljZSBmb3IgdGhvc2UKLXByb2R1Y3RzLiAgSWYgc3VjaCBwcm9ibGVtcyBhcmlzZSBzdWJzdGFudGlhbGx5IGluIG90aGVyIGRvbWFpbnMsIHdlCi1zdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UgZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMKLW9mIHRoZSBHUEwsIGFzIG5lZWRlZCB0byBwcm90ZWN0IHRoZSBmcmVlZG9tIG9mIHVzZXJzLgotCi0gIEZpbmFsbHksIGV2ZXJ5IHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCi1TdGF0ZXMgc2hvdWxkIG5vdCBhbGxvdyBwYXRlbnRzIHRvIHJlc3RyaWN0IGRldmVsb3BtZW50IGFuZCB1c2Ugb2YKLXNvZnR3YXJlIG9uIGdlbmVyYWwtcHVycG9zZSBjb21wdXRlcnMsIGJ1dCBpbiB0aG9zZSB0aGF0IGRvLCB3ZSB3aXNoIHRvCi1hdm9pZCB0aGUgc3BlY2lhbCBkYW5nZXIgdGhhdCBwYXRlbnRzIGFwcGxpZWQgdG8gYSBmcmVlIHByb2dyYW0gY291bGQKLW1ha2UgaXQgZWZmZWN0aXZlbHkgcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHRoZSBHUEwgYXNzdXJlcyB0aGF0Ci1wYXRlbnRzIGNhbm5vdCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgcHJvZ3JhbSBub24tZnJlZS4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQotICAgICAgICAgICAgICAgICAgICAgICBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gIDAuIERlZmluaXRpb25zLgotCi0gICJUaGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gICJDb3B5cmlnaHQiIGFsc28gbWVhbnMgY29weXJpZ2h0LWxpa2UgbGF3cyB0aGF0IGFwcGx5IHRvIG90aGVyIGtpbmRzIG9mCi13b3Jrcywgc3VjaCBhcyBzZW1pY29uZHVjdG9yIG1hc2tzLgotCi0gICJUaGUgUHJvZ3JhbSIgcmVmZXJzIHRvIGFueSBjb3B5cmlnaHRhYmxlIHdvcmsgbGljZW5zZWQgdW5kZXIgdGhpcwotTGljZW5zZS4gIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLiAgIkxpY2Vuc2VlcyIgYW5kCi0icmVjaXBpZW50cyIgbWF5IGJlIGluZGl2aWR1YWxzIG9yIG9yZ2FuaXphdGlvbnMuCi0KLSAgVG8gIm1vZGlmeSIgYSB3b3JrIG1lYW5zIHRvIGNvcHkgZnJvbSBvciBhZGFwdCBhbGwgb3IgcGFydCBvZiB0aGUgd29yawotaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCi1leGFjdCBjb3B5LiAgVGhlIHJlc3VsdGluZyB3b3JrIGlzIGNhbGxlZCBhICJtb2RpZmllZCB2ZXJzaW9uIiBvZiB0aGUKLWVhcmxpZXIgd29yayBvciBhIHdvcmsgImJhc2VkIG9uIiB0aGUgZWFybGllciB3b3JrLgotCi0gIEEgImNvdmVyZWQgd29yayIgbWVhbnMgZWl0aGVyIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0gb3IgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbS4KLQotICBUbyAicHJvcGFnYXRlIiBhIHdvcmsgbWVhbnMgdG8gZG8gYW55dGhpbmcgd2l0aCBpdCB0aGF0LCB3aXRob3V0Ci1wZXJtaXNzaW9uLCB3b3VsZCBtYWtlIHlvdSBkaXJlY3RseSBvciBzZWNvbmRhcmlseSBsaWFibGUgZm9yCi1pbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKLWNvbXB1dGVyIG9yIG1vZGlmeWluZyBhIHByaXZhdGUgY29weS4gIFByb3BhZ2F0aW9uIGluY2x1ZGVzIGNvcHlpbmcsCi1kaXN0cmlidXRpb24gKHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLCBtYWtpbmcgYXZhaWxhYmxlIHRvIHRoZQotcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgotCi0gIFRvICJjb252ZXkiIGEgd29yayBtZWFucyBhbnkga2luZCBvZiBwcm9wYWdhdGlvbiB0aGF0IGVuYWJsZXMgb3RoZXIKLXBhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIgdGhyb3VnaAotYSBjb21wdXRlciBuZXR3b3JrLCB3aXRoIG5vIHRyYW5zZmVyIG9mIGEgY29weSwgaXMgbm90IGNvbnZleWluZy4KLQotICBBbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBkaXNwbGF5cyAiQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyIKLXRvIHRoZSBleHRlbnQgdGhhdCBpdCBpbmNsdWRlcyBhIGNvbnZlbmllbnQgYW5kIHByb21pbmVudGx5IHZpc2libGUKLWZlYXR1cmUgdGhhdCAoMSkgZGlzcGxheXMgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSwgYW5kICgyKQotdGVsbHMgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHdvcmsgKGV4Y2VwdCB0byB0aGUKLWV4dGVudCB0aGF0IHdhcnJhbnRpZXMgYXJlIHByb3ZpZGVkKSwgdGhhdCBsaWNlbnNlZXMgbWF5IGNvbnZleSB0aGUKLXdvcmsgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmCi10aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQotbWVudSwgYSBwcm9taW5lbnQgaXRlbSBpbiB0aGUgbGlzdCBtZWV0cyB0aGlzIGNyaXRlcmlvbi4KLQotICAxLiBTb3VyY2UgQ29kZS4KLQotICBUaGUgInNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yawotZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZQotZm9ybSBvZiBhIHdvcmsuCi0KLSAgQSAiU3RhbmRhcmQgSW50ZXJmYWNlIiBtZWFucyBhbiBpbnRlcmZhY2UgdGhhdCBlaXRoZXIgaXMgYW4gb2ZmaWNpYWwKLXN0YW5kYXJkIGRlZmluZWQgYnkgYSByZWNvZ25pemVkIHN0YW5kYXJkcyBib2R5LCBvciwgaW4gdGhlIGNhc2Ugb2YKLWludGVyZmFjZXMgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIG9uZSB0aGF0Ci1pcyB3aWRlbHkgdXNlZCBhbW9uZyBkZXZlbG9wZXJzIHdvcmtpbmcgaW4gdGhhdCBsYW5ndWFnZS4KLQotICBUaGUgIlN5c3RlbSBMaWJyYXJpZXMiIG9mIGFuIGV4ZWN1dGFibGUgd29yayBpbmNsdWRlIGFueXRoaW5nLCBvdGhlcgotdGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKLXBhY2thZ2luZyBhIE1ham9yIENvbXBvbmVudCwgYnV0IHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoYXQgTWFqb3IKLUNvbXBvbmVudCwgYW5kIChiKSBzZXJ2ZXMgb25seSB0byBlbmFibGUgdXNlIG9mIHRoZSB3b3JrIHdpdGggdGhhdAotTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCi1pbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbiBzb3VyY2UgY29kZSBmb3JtLiAgQQotIk1ham9yIENvbXBvbmVudCIsIGluIHRoaXMgY29udGV4dCwgbWVhbnMgYSBtYWpvciBlc3NlbnRpYWwgY29tcG9uZW50Ci0oa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCi0oaWYgYW55KSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSB3b3JrIHJ1bnMsIG9yIGEgY29tcGlsZXIgdXNlZCB0bwotcHJvZHVjZSB0aGUgd29yaywgb3IgYW4gb2JqZWN0IGNvZGUgaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gaXQuCi0KLSAgVGhlICJDb3JyZXNwb25kaW5nIFNvdXJjZSIgZm9yIGEgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIG1lYW5zIGFsbAotdGhlIHNvdXJjZSBjb2RlIG5lZWRlZCB0byBnZW5lcmF0ZSwgaW5zdGFsbCwgYW5kIChmb3IgYW4gZXhlY3V0YWJsZQotd29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bwotY29udHJvbCB0aG9zZSBhY3Rpdml0aWVzLiAgSG93ZXZlciwgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgd29yaydzCi1TeXN0ZW0gTGlicmFyaWVzLCBvciBnZW5lcmFsLXB1cnBvc2UgdG9vbHMgb3IgZ2VuZXJhbGx5IGF2YWlsYWJsZSBmcmVlCi1wcm9ncmFtcyB3aGljaCBhcmUgdXNlZCB1bm1vZGlmaWVkIGluIHBlcmZvcm1pbmcgdGhvc2UgYWN0aXZpdGllcyBidXQKLXdoaWNoIGFyZSBub3QgcGFydCBvZiB0aGUgd29yay4gIEZvciBleGFtcGxlLCBDb3JyZXNwb25kaW5nIFNvdXJjZQotaW5jbHVkZXMgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHNvdXJjZSBmaWxlcyBmb3IKLXRoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQotbGlua2VkIHN1YnByb2dyYW1zIHRoYXQgdGhlIHdvcmsgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHJlcXVpcmUsCi1zdWNoIGFzIGJ5IGludGltYXRlIGRhdGEgY29tbXVuaWNhdGlvbiBvciBjb250cm9sIGZsb3cgYmV0d2VlbiB0aG9zZQotc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgotCi0gIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgdXNlcnMKLWNhbiByZWdlbmVyYXRlIGF1dG9tYXRpY2FsbHkgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgQ29ycmVzcG9uZGluZwotU291cmNlLgotCi0gIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYSB3b3JrIGluIHNvdXJjZSBjb2RlIGZvcm0gaXMgdGhhdAotc2FtZSB3b3JrLgotCi0gIDIuIEJhc2ljIFBlcm1pc3Npb25zLgotCi0gIEFsbCByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgYXJlIGdyYW50ZWQgZm9yIHRoZSB0ZXJtIG9mCi1jb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZAotY29uZGl0aW9ucyBhcmUgbWV0LiAgVGhpcyBMaWNlbnNlIGV4cGxpY2l0bHkgYWZmaXJtcyB5b3VyIHVubGltaXRlZAotcGVybWlzc2lvbiB0byBydW4gdGhlIHVubW9kaWZpZWQgUHJvZ3JhbS4gIFRoZSBvdXRwdXQgZnJvbSBydW5uaW5nIGEKLWNvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cwotY29udGVudCwgY29uc3RpdHV0ZXMgYSBjb3ZlcmVkIHdvcmsuICBUaGlzIExpY2Vuc2UgYWNrbm93bGVkZ2VzIHlvdXIKLXJpZ2h0cyBvZiBmYWlyIHVzZSBvciBvdGhlciBlcXVpdmFsZW50LCBhcyBwcm92aWRlZCBieSBjb3B5cmlnaHQgbGF3LgotCi0gIFlvdSBtYXkgbWFrZSwgcnVuIGFuZCBwcm9wYWdhdGUgY292ZXJlZCB3b3JrcyB0aGF0IHlvdSBkbyBub3QKLWNvbnZleSwgd2l0aG91dCBjb25kaXRpb25zIHNvIGxvbmcgYXMgeW91ciBsaWNlbnNlIG90aGVyd2lzZSByZW1haW5zCi1pbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCi1vZiBoYXZpbmcgdGhlbSBtYWtlIG1vZGlmaWNhdGlvbnMgZXhjbHVzaXZlbHkgZm9yIHlvdSwgb3IgcHJvdmlkZSB5b3UKLXdpdGggZmFjaWxpdGllcyBmb3IgcnVubmluZyB0aG9zZSB3b3JrcywgcHJvdmlkZWQgdGhhdCB5b3UgY29tcGx5IHdpdGgKLXRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCi1ub3QgY29udHJvbCBjb3B5cmlnaHQuICBUaG9zZSB0aHVzIG1ha2luZyBvciBydW5uaW5nIHRoZSBjb3ZlcmVkIHdvcmtzCi1mb3IgeW91IG11c3QgZG8gc28gZXhjbHVzaXZlbHkgb24geW91ciBiZWhhbGYsIHVuZGVyIHlvdXIgZGlyZWN0aW9uCi1hbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKLXlvdXIgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgb3V0c2lkZSB0aGVpciByZWxhdGlvbnNoaXAgd2l0aCB5b3UuCi0KLSAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKLXRoZSBjb25kaXRpb25zIHN0YXRlZCBiZWxvdy4gIFN1YmxpY2Vuc2luZyBpcyBub3QgYWxsb3dlZDsgc2VjdGlvbiAxMAotbWFrZXMgaXQgdW5uZWNlc3NhcnkuCi0KLSAgMy4gUHJvdGVjdGluZyBVc2VycycgTGVnYWwgUmlnaHRzIEZyb20gQW50aS1DaXJjdW12ZW50aW9uIExhdy4KLQotICBObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKLW1lYXN1cmUgdW5kZXIgYW55IGFwcGxpY2FibGUgbGF3IGZ1bGZpbGxpbmcgb2JsaWdhdGlvbnMgdW5kZXIgYXJ0aWNsZQotMTEgb2YgdGhlIFdJUE8gY29weXJpZ2h0IHRyZWF0eSBhZG9wdGVkIG9uIDIwIERlY2VtYmVyIDE5OTYsIG9yCi1zaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCi1tZWFzdXJlcy4KLQotICBXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCi1jaXJjdW12ZW50aW9uIG9mIHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgdG8gdGhlIGV4dGVudCBzdWNoIGNpcmN1bXZlbnRpb24KLWlzIGVmZmVjdGVkIGJ5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8KLXRoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdCBvcGVyYXRpb24gb3IKLW1vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBhcyBhIG1lYW5zIG9mIGVuZm9yY2luZywgYWdhaW5zdCB0aGUgd29yaydzCi11c2VycywgeW91ciBvciB0aGlyZCBwYXJ0aWVzJyBsZWdhbCByaWdodHMgdG8gZm9yYmlkIGNpcmN1bXZlbnRpb24gb2YKLXRlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCi0KLSAgNC4gQ29udmV5aW5nIFZlcmJhdGltIENvcGllcy4KLQotICBZb3UgbWF5IGNvbnZleSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcyB5b3UKLXJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCi1hcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2U7Ci1rZWVwIGludGFjdCBhbGwgbm90aWNlcyBzdGF0aW5nIHRoYXQgdGhpcyBMaWNlbnNlIGFuZCBhbnkKLW5vbi1wZXJtaXNzaXZlIHRlcm1zIGFkZGVkIGluIGFjY29yZCB3aXRoIHNlY3Rpb24gNyBhcHBseSB0byB0aGUgY29kZTsKLWtlZXAgaW50YWN0IGFsbCBub3RpY2VzIG9mIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYWxsCi1yZWNpcGllbnRzIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotICBZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCi1hbmQgeW91IG1heSBvZmZlciBzdXBwb3J0IG9yIHdhcnJhbnR5IHByb3RlY3Rpb24gZm9yIGEgZmVlLgotCi0gIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCi0KLSAgWW91IG1heSBjb252ZXkgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBvciB0aGUgbW9kaWZpY2F0aW9ucyB0bwotcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKLXRlcm1zIG9mIHNlY3Rpb24gNCwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCi0gICAgaXQsIGFuZCBnaXZpbmcgYSByZWxldmFudCBkYXRlLgotCi0gICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKLSAgICByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBjb25kaXRpb25zIGFkZGVkIHVuZGVyIHNlY3Rpb24KLSAgICA3LiAgVGhpcyByZXF1aXJlbWVudCBtb2RpZmllcyB0aGUgcmVxdWlyZW1lbnQgaW4gc2VjdGlvbiA0IHRvCi0gICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KLQotICAgIGMpIFlvdSBtdXN0IGxpY2Vuc2UgdGhlIGVudGlyZSB3b3JrLCBhcyBhIHdob2xlLCB1bmRlciB0aGlzCi0gICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCi0gICAgTGljZW5zZSB3aWxsIHRoZXJlZm9yZSBhcHBseSwgYWxvbmcgd2l0aCBhbnkgYXBwbGljYWJsZSBzZWN0aW9uIDcKLSAgICBhZGRpdGlvbmFsIHRlcm1zLCB0byB0aGUgd2hvbGUgb2YgdGhlIHdvcmssIGFuZCBhbGwgaXRzIHBhcnRzLAotICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCi0gICAgcGVybWlzc2lvbiB0byBsaWNlbnNlIHRoZSB3b3JrIGluIGFueSBvdGhlciB3YXksIGJ1dCBpdCBkb2VzIG5vdAotICAgIGludmFsaWRhdGUgc3VjaCBwZXJtaXNzaW9uIGlmIHlvdSBoYXZlIHNlcGFyYXRlbHkgcmVjZWl2ZWQgaXQuCi0KLSAgICBkKSBJZiB0aGUgd29yayBoYXMgaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2VzLCBlYWNoIG11c3QgZGlzcGxheQotICAgIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXM7IGhvd2V2ZXIsIGlmIHRoZSBQcm9ncmFtIGhhcyBpbnRlcmFjdGl2ZQotICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCi0gICAgd29yayBuZWVkIG5vdCBtYWtlIHRoZW0gZG8gc28uCi0KLSAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAotd29ya3MsIHdoaWNoIGFyZSBub3QgYnkgdGhlaXIgbmF0dXJlIGV4dGVuc2lvbnMgb2YgdGhlIGNvdmVyZWQgd29yaywKLWFuZCB3aGljaCBhcmUgbm90IGNvbWJpbmVkIHdpdGggaXQgc3VjaCBhcyB0byBmb3JtIGEgbGFyZ2VyIHByb2dyYW0sCi1pbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCi0iYWdncmVnYXRlIiBpZiB0aGUgY29tcGlsYXRpb24gYW5kIGl0cyByZXN1bHRpbmcgY29weXJpZ2h0IGFyZSBub3QKLXVzZWQgdG8gbGltaXQgdGhlIGFjY2VzcyBvciBsZWdhbCByaWdodHMgb2YgdGhlIGNvbXBpbGF0aW9uJ3MgdXNlcnMKLWJleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yawotaW4gYW4gYWdncmVnYXRlIGRvZXMgbm90IGNhdXNlIHRoaXMgTGljZW5zZSB0byBhcHBseSB0byB0aGUgb3RoZXIKLXBhcnRzIG9mIHRoZSBhZ2dyZWdhdGUuCi0KLSAgNi4gQ29udmV5aW5nIE5vbi1Tb3VyY2UgRm9ybXMuCi0KLSAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMKLW9mIHNlY3Rpb25zIDQgYW5kIDUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gY29udmV5IHRoZQotbWFjaGluZS1yZWFkYWJsZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAotaW4gb25lIG9mIHRoZXNlIHdheXM6Ci0KLSAgICBhKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0Ci0gICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmaXhlZCBvbiBhIGR1cmFibGUgcGh5c2ljYWwgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCi0KLSAgICBiKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0Ci0gICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSBhCi0gICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKLSAgICBsb25nIGFzIHlvdSBvZmZlciBzcGFyZSBwYXJ0cyBvciBjdXN0b21lciBzdXBwb3J0IGZvciB0aGF0IHByb2R1Y3QKLSAgICBtb2RlbCwgdG8gZ2l2ZSBhbnlvbmUgd2hvIHBvc3Nlc3NlcyB0aGUgb2JqZWN0IGNvZGUgZWl0aGVyICgxKSBhCi0gICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCi0gICAgcHJvZHVjdCB0aGF0IGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBvbiBhIGR1cmFibGUgcGh5c2ljYWwKLSAgICBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UsIGZvciBhIHByaWNlIG5vCi0gICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCi0gICAgY29udmV5aW5nIG9mIHNvdXJjZSwgb3IgKDIpIGFjY2VzcyB0byBjb3B5IHRoZQotICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZyb20gYSBuZXR3b3JrIHNlcnZlciBhdCBubyBjaGFyZ2UuCi0KLSAgICBjKSBDb252ZXkgaW5kaXZpZHVhbCBjb3BpZXMgb2YgdGhlIG9iamVjdCBjb2RlIHdpdGggYSBjb3B5IG9mIHRoZQotICAgIHdyaXR0ZW4gb2ZmZXIgdG8gcHJvdmlkZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGlzCi0gICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKLSAgICBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgb2JqZWN0IGNvZGUgd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQKLSAgICB3aXRoIHN1YnNlY3Rpb24gNmIuCi0KLSAgICBkKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGJ5IG9mZmVyaW5nIGFjY2VzcyBmcm9tIGEgZGVzaWduYXRlZAotICAgIHBsYWNlIChncmF0aXMgb3IgZm9yIGEgY2hhcmdlKSwgYW5kIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIHRoZQotICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGluIHRoZSBzYW1lIHdheSB0aHJvdWdoIHRoZSBzYW1lIHBsYWNlIGF0IG5vCi0gICAgZnVydGhlciBjaGFyZ2UuICBZb3UgbmVlZCBub3QgcmVxdWlyZSByZWNpcGllbnRzIHRvIGNvcHkgdGhlCi0gICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuICBJZiB0aGUgcGxhY2UgdG8KLSAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKLSAgICBtYXkgYmUgb24gYSBkaWZmZXJlbnQgc2VydmVyIChvcGVyYXRlZCBieSB5b3Ugb3IgYSB0aGlyZCBwYXJ0eSkKLSAgICB0aGF0IHN1cHBvcnRzIGVxdWl2YWxlbnQgY29weWluZyBmYWNpbGl0aWVzLCBwcm92aWRlZCB5b3UgbWFpbnRhaW4KLSAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQotICAgIENvcnJlc3BvbmRpbmcgU291cmNlLiAgUmVnYXJkbGVzcyBvZiB3aGF0IHNlcnZlciBob3N0cyB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSwgeW91IHJlbWFpbiBvYmxpZ2F0ZWQgdG8gZW5zdXJlIHRoYXQgaXQgaXMKLSAgICBhdmFpbGFibGUgZm9yIGFzIGxvbmcgYXMgbmVlZGVkIHRvIHNhdGlzZnkgdGhlc2UgcmVxdWlyZW1lbnRzLgotCi0gICAgZSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uLCBwcm92aWRlZAotICAgIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZCBDb3JyZXNwb25kaW5nCi0gICAgU291cmNlIG9mIHRoZSB3b3JrIGFyZSBiZWluZyBvZmZlcmVkIHRvIHRoZSBnZW5lcmFsIHB1YmxpYyBhdCBubwotICAgIGNoYXJnZSB1bmRlciBzdWJzZWN0aW9uIDZkLgotCi0gIEEgc2VwYXJhYmxlIHBvcnRpb24gb2YgdGhlIG9iamVjdCBjb2RlLCB3aG9zZSBzb3VyY2UgY29kZSBpcyBleGNsdWRlZAotZnJvbSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgYXMgYSBTeXN0ZW0gTGlicmFyeSwgbmVlZCBub3QgYmUKLWluY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KLQotICBBICJVc2VyIFByb2R1Y3QiIGlzIGVpdGhlciAoMSkgYSAiY29uc3VtZXIgcHJvZHVjdCIsIHdoaWNoIG1lYW5zIGFueQotdGFuZ2libGUgcGVyc29uYWwgcHJvcGVydHkgd2hpY2ggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcGVyc29uYWwsIGZhbWlseSwKLW9yIGhvdXNlaG9sZCBwdXJwb3Nlcywgb3IgKDIpIGFueXRoaW5nIGRlc2lnbmVkIG9yIHNvbGQgZm9yIGluY29ycG9yYXRpb24KLWludG8gYSBkd2VsbGluZy4gIEluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwcm9kdWN0IGlzIGEgY29uc3VtZXIgcHJvZHVjdCwKLWRvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvdmVyYWdlLiAgRm9yIGEgcGFydGljdWxhcgotcHJvZHVjdCByZWNlaXZlZCBieSBhIHBhcnRpY3VsYXIgdXNlciwgIm5vcm1hbGx5IHVzZWQiIHJlZmVycyB0byBhCi10eXBpY2FsIG9yIGNvbW1vbiB1c2Ugb2YgdGhhdCBjbGFzcyBvZiBwcm9kdWN0LCByZWdhcmRsZXNzIG9mIHRoZSBzdGF0dXMKLW9mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheSBpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyCi1hY3R1YWxseSB1c2VzLCBvciBleHBlY3RzIG9yIGlzIGV4cGVjdGVkIHRvIHVzZSwgdGhlIHByb2R1Y3QuICBBIHByb2R1Y3QKLWlzIGEgY29uc3VtZXIgcHJvZHVjdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb2R1Y3QgaGFzIHN1YnN0YW50aWFsCi1jb21tZXJjaWFsLCBpbmR1c3RyaWFsIG9yIG5vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudAotdGhlIG9ubHkgc2lnbmlmaWNhbnQgbW9kZSBvZiB1c2Ugb2YgdGhlIHByb2R1Y3QuCi0KLSAgIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLAotcHJvY2VkdXJlcywgYXV0aG9yaXphdGlvbiBrZXlzLCBvciBvdGhlciBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBpbnN0YWxsCi1hbmQgZXhlY3V0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGNvdmVyZWQgd29yayBpbiB0aGF0IFVzZXIgUHJvZHVjdCBmcm9tCi1hIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhlIGluZm9ybWF0aW9uIG11c3QKLXN1ZmZpY2UgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRpbnVlZCBmdW5jdGlvbmluZyBvZiB0aGUgbW9kaWZpZWQgb2JqZWN0Ci1jb2RlIGlzIGluIG5vIGNhc2UgcHJldmVudGVkIG9yIGludGVyZmVyZWQgd2l0aCBzb2xlbHkgYmVjYXVzZQotbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCi0KLSAgSWYgeW91IGNvbnZleSBhbiBvYmplY3QgY29kZSB3b3JrIHVuZGVyIHRoaXMgc2VjdGlvbiBpbiwgb3Igd2l0aCwgb3IKLXNwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCi1wYXJ0IG9mIGEgdHJhbnNhY3Rpb24gaW4gd2hpY2ggdGhlIHJpZ2h0IG9mIHBvc3Nlc3Npb24gYW5kIHVzZSBvZiB0aGUKLVVzZXIgUHJvZHVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgcmVjaXBpZW50IGluIHBlcnBldHVpdHkgb3IgZm9yIGEKLWZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCi1Db3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCB1bmRlciB0aGlzIHNlY3Rpb24gbXVzdCBiZSBhY2NvbXBhbmllZAotYnkgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbi4gIEJ1dCB0aGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5Ci1pZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAotbW9kaWZpZWQgb2JqZWN0IGNvZGUgb24gdGhlIFVzZXIgUHJvZHVjdCAoZm9yIGV4YW1wbGUsIHRoZSB3b3JrIGhhcwotYmVlbiBpbnN0YWxsZWQgaW4gUk9NKS4KLQotICBUaGUgcmVxdWlyZW1lbnQgdG8gcHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBhCi1yZXF1aXJlbWVudCB0byBjb250aW51ZSB0byBwcm92aWRlIHN1cHBvcnQgc2VydmljZSwgd2FycmFudHksIG9yIHVwZGF0ZXMKLWZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlIHJlY2lwaWVudCwgb3IgZm9yCi10aGUgVXNlciBQcm9kdWN0IGluIHdoaWNoIGl0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZC4gIEFjY2VzcyB0byBhCi1uZXR3b3JrIG1heSBiZSBkZW5pZWQgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIGl0c2VsZiBtYXRlcmlhbGx5IGFuZAotYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yayBvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kCi1wcm90b2NvbHMgZm9yIGNvbW11bmljYXRpb24gYWNyb3NzIHRoZSBuZXR3b3JrLgotCi0gIENvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkLCBhbmQgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIHByb3ZpZGVkLAotaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gYSBmb3JtYXQgdGhhdCBpcyBwdWJsaWNseQotZG9jdW1lbnRlZCAoYW5kIHdpdGggYW4gaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4KLXNvdXJjZSBjb2RlIGZvcm0pLCBhbmQgbXVzdCByZXF1aXJlIG5vIHNwZWNpYWwgcGFzc3dvcmQgb3Iga2V5IGZvcgotdW5wYWNraW5nLCByZWFkaW5nIG9yIGNvcHlpbmcuCi0KLSAgNy4gQWRkaXRpb25hbCBUZXJtcy4KLQotICAiQWRkaXRpb25hbCBwZXJtaXNzaW9ucyIgYXJlIHRlcm1zIHRoYXQgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcwotTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgotQWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbnRpcmUgUHJvZ3JhbSBzaGFsbAotYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgTGljZW5zZSwgdG8gdGhlIGV4dGVudAotdGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gIElmIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMKLWFwcGx5IG9ubHkgdG8gcGFydCBvZiB0aGUgUHJvZ3JhbSwgdGhhdCBwYXJ0IG1heSBiZSB1c2VkIHNlcGFyYXRlbHkKLXVuZGVyIHRob3NlIHBlcm1pc3Npb25zLCBidXQgdGhlIGVudGlyZSBQcm9ncmFtIHJlbWFpbnMgZ292ZXJuZWQgYnkKLXRoaXMgTGljZW5zZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucy4KLQotICBXaGVuIHlvdSBjb252ZXkgYSBjb3B5IG9mIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uCi1yZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKLWl0LiAgKEFkZGl0aW9uYWwgcGVybWlzc2lvbnMgbWF5IGJlIHdyaXR0ZW4gdG8gcmVxdWlyZSB0aGVpciBvd24KLXJlbW92YWwgaW4gY2VydGFpbiBjYXNlcyB3aGVuIHlvdSBtb2RpZnkgdGhlIHdvcmsuKSAgWW91IG1heSBwbGFjZQotYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLAotZm9yIHdoaWNoIHlvdSBoYXZlIG9yIGNhbiBnaXZlIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBwZXJtaXNzaW9uLgotCi0gIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgZm9yIG1hdGVyaWFsIHlvdQotYWRkIHRvIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IChpZiBhdXRob3JpemVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZgotdGhhdCBtYXRlcmlhbCkgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGVybXM6Ci0KLSAgICBhKSBEaXNjbGFpbWluZyB3YXJyYW50eSBvciBsaW1pdGluZyBsaWFiaWxpdHkgZGlmZmVyZW50bHkgZnJvbSB0aGUKLSAgICB0ZXJtcyBvZiBzZWN0aW9ucyAxNSBhbmQgMTYgb2YgdGhpcyBMaWNlbnNlOyBvcgotCi0gICAgYikgUmVxdWlyaW5nIHByZXNlcnZhdGlvbiBvZiBzcGVjaWZpZWQgcmVhc29uYWJsZSBsZWdhbCBub3RpY2VzIG9yCi0gICAgYXV0aG9yIGF0dHJpYnV0aW9ucyBpbiB0aGF0IG1hdGVyaWFsIG9yIGluIHRoZSBBcHByb3ByaWF0ZSBMZWdhbAotICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCi0KLSAgICBjKSBQcm9oaWJpdGluZyBtaXNyZXByZXNlbnRhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoYXQgbWF0ZXJpYWwsIG9yCi0gICAgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KLSAgICByZWFzb25hYmxlIHdheXMgYXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHZlcnNpb247IG9yCi0KLSAgICBkKSBMaW1pdGluZyB0aGUgdXNlIGZvciBwdWJsaWNpdHkgcHVycG9zZXMgb2YgbmFtZXMgb2YgbGljZW5zb3JzIG9yCi0gICAgYXV0aG9ycyBvZiB0aGUgbWF0ZXJpYWw7IG9yCi0KLSAgICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCi0gICAgdHJhZGUgbmFtZXMsIHRyYWRlbWFya3MsIG9yIHNlcnZpY2UgbWFya3M7IG9yCi0KLSAgICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0Ci0gICAgbWF0ZXJpYWwgYnkgYW55b25lIHdobyBjb252ZXlzIHRoZSBtYXRlcmlhbCAob3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YKLSAgICBpdCkgd2l0aCBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBvZiBsaWFiaWxpdHkgdG8gdGhlIHJlY2lwaWVudCwgZm9yCi0gICAgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5IGltcG9zZSBvbgotICAgIHRob3NlIGxpY2Vuc29ycyBhbmQgYXV0aG9ycy4KLQotICBBbGwgb3RoZXIgbm9uLXBlcm1pc3NpdmUgYWRkaXRpb25hbCB0ZXJtcyBhcmUgY29uc2lkZXJlZCAiZnVydGhlcgotcmVzdHJpY3Rpb25zIiB3aXRoaW4gdGhlIG1lYW5pbmcgb2Ygc2VjdGlvbiAxMC4gIElmIHRoZSBQcm9ncmFtIGFzIHlvdQotcmVjZWl2ZWQgaXQsIG9yIGFueSBwYXJ0IG9mIGl0LCBjb250YWlucyBhIG5vdGljZSBzdGF0aW5nIHRoYXQgaXQgaXMKLWdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgotcmVzdHJpY3Rpb24sIHlvdSBtYXkgcmVtb3ZlIHRoYXQgdGVybS4gIElmIGEgbGljZW5zZSBkb2N1bWVudCBjb250YWlucwotYSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGJ1dCBwZXJtaXRzIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZyB1bmRlciB0aGlzCi1MaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKLW9mIHRoYXQgbGljZW5zZSBkb2N1bWVudCwgcHJvdmlkZWQgdGhhdCB0aGUgZnVydGhlciByZXN0cmljdGlvbiBkb2VzCi1ub3Qgc3Vydml2ZSBzdWNoIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZy4KLQotICBJZiB5b3UgYWRkIHRlcm1zIHRvIGEgY292ZXJlZCB3b3JrIGluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiwgeW91Ci1tdXN0IHBsYWNlLCBpbiB0aGUgcmVsZXZhbnQgc291cmNlIGZpbGVzLCBhIHN0YXRlbWVudCBvZiB0aGUKLWFkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZwotd2hlcmUgdG8gZmluZCB0aGUgYXBwbGljYWJsZSB0ZXJtcy4KLQotICBBZGRpdGlvbmFsIHRlcm1zLCBwZXJtaXNzaXZlIG9yIG5vbi1wZXJtaXNzaXZlLCBtYXkgYmUgc3RhdGVkIGluIHRoZQotZm9ybSBvZiBhIHNlcGFyYXRlbHkgd3JpdHRlbiBsaWNlbnNlLCBvciBzdGF0ZWQgYXMgZXhjZXB0aW9uczsKLXRoZSBhYm92ZSByZXF1aXJlbWVudHMgYXBwbHkgZWl0aGVyIHdheS4KLQotICA4LiBUZXJtaW5hdGlvbi4KLQotICBZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKLXByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBwcm9wYWdhdGUgb3IKLW1vZGlmeSBpdCBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlcgotdGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIHVuZGVyIHRoZSB0aGlyZAotcGFyYWdyYXBoIG9mIHNlY3Rpb24gMTEpLgotCi0gIEhvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyCi1saWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMgcmVpbnN0YXRlZCAoYSkKLXByb3Zpc2lvbmFsbHksIHVubGVzcyBhbmQgdW50aWwgdGhlIGNvcHlyaWdodCBob2xkZXIgZXhwbGljaXRseSBhbmQKLWZpbmFsbHkgdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQKLWhvbGRlciBmYWlscyB0byBub3RpZnkgeW91IG9mIHRoZSB2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zCi1wcmlvciB0byA2MCBkYXlzIGFmdGVyIHRoZSBjZXNzYXRpb24uCi0KLSAgTW9yZW92ZXIsIHlvdXIgbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzCi1yZWluc3RhdGVkIHBlcm1hbmVudGx5IGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vdGlmaWVzIHlvdSBvZiB0aGUKLXZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKLXJlY2VpdmVkIG5vdGljZSBvZiB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlIChmb3IgYW55IHdvcmspIGZyb20gdGhhdAotY29weXJpZ2h0IGhvbGRlciwgYW5kIHlvdSBjdXJlIHRoZSB2aW9sYXRpb24gcHJpb3IgdG8gMzAgZGF5cyBhZnRlcgoteW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCi0KLSAgVGVybWluYXRpb24gb2YgeW91ciByaWdodHMgdW5kZXIgdGhpcyBzZWN0aW9uIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUKLWxpY2Vuc2VzIG9mIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9yIHJpZ2h0cyBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlLiAgSWYgeW91ciByaWdodHMgaGF2ZSBiZWVuIHRlcm1pbmF0ZWQgYW5kIG5vdCBwZXJtYW5lbnRseQotcmVpbnN0YXRlZCwgeW91IGRvIG5vdCBxdWFsaWZ5IHRvIHJlY2VpdmUgbmV3IGxpY2Vuc2VzIGZvciB0aGUgc2FtZQotbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KLQotICA5LiBBY2NlcHRhbmNlIE5vdCBSZXF1aXJlZCBmb3IgSGF2aW5nIENvcGllcy4KLQotICBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlIGluIG9yZGVyIHRvIHJlY2VpdmUgb3IKLXJ1biBhIGNvcHkgb2YgdGhlIFByb2dyYW0uICBBbmNpbGxhcnkgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsKLW9jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCi10byByZWNlaXZlIGEgY29weSBsaWtld2lzZSBkb2VzIG5vdCByZXF1aXJlIGFjY2VwdGFuY2UuICBIb3dldmVyLAotbm90aGluZyBvdGhlciB0aGFuIHRoaXMgTGljZW5zZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gcHJvcGFnYXRlIG9yCi1tb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbwotbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBwcm9wYWdhdGluZyBhCi1jb3ZlcmVkIHdvcmssIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLgotCi0gIDEwLiBBdXRvbWF0aWMgTGljZW5zaW5nIG9mIERvd25zdHJlYW0gUmVjaXBpZW50cy4KLQotICBFYWNoIHRpbWUgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5Ci1yZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3JzLCB0byBydW4sIG1vZGlmeSBhbmQKLXByb3BhZ2F0ZSB0aGF0IHdvcmssIHN1YmplY3QgdG8gdGhpcyBMaWNlbnNlLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUKLWZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgotCi0gIEFuICJlbnRpdHkgdHJhbnNhY3Rpb24iIGlzIGEgdHJhbnNhY3Rpb24gdHJhbnNmZXJyaW5nIGNvbnRyb2wgb2YgYW4KLW9yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4KLW9yZ2FuaXphdGlvbiwgb3IgbWVyZ2luZyBvcmdhbml6YXRpb25zLiAgSWYgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkCi13b3JrIHJlc3VsdHMgZnJvbSBhbiBlbnRpdHkgdHJhbnNhY3Rpb24sIGVhY2ggcGFydHkgdG8gdGhhdAotdHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCi1saWNlbnNlcyB0byB0aGUgd29yayB0aGUgcGFydHkncyBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCBoYWQgb3IgY291bGQKLWdpdmUgdW5kZXIgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgcGx1cyBhIHJpZ2h0IHRvIHBvc3Nlc3Npb24gb2YgdGhlCi1Db3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKLXRoZSBwcmVkZWNlc3NvciBoYXMgaXQgb3IgY2FuIGdldCBpdCB3aXRoIHJlYXNvbmFibGUgZWZmb3J0cy4KLQotICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKLXJpZ2h0cyBncmFudGVkIG9yIGFmZmlybWVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEZvciBleGFtcGxlLCB5b3UgbWF5Ci1ub3QgaW1wb3NlIGEgbGljZW5zZSBmZWUsIHJveWFsdHksIG9yIG90aGVyIGNoYXJnZSBmb3IgZXhlcmNpc2Ugb2YKLXJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KLShpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0Ci1hbnkgcGF0ZW50IGNsYWltIGlzIGluZnJpbmdlZCBieSBtYWtpbmcsIHVzaW5nLCBzZWxsaW5nLCBvZmZlcmluZyBmb3IKLXNhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KLQotICAxMS4gUGF0ZW50cy4KLQotICBBICJjb250cmlidXRvciIgaXMgYSBjb3B5cmlnaHQgaG9sZGVyIHdobyBhdXRob3JpemVzIHVzZSB1bmRlciB0aGlzCi1MaWNlbnNlIG9mIHRoZSBQcm9ncmFtIG9yIGEgd29yayBvbiB3aGljaCB0aGUgUHJvZ3JhbSBpcyBiYXNlZC4gIFRoZQotd29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCi0KLSAgQSBjb250cmlidXRvcidzICJlc3NlbnRpYWwgcGF0ZW50IGNsYWltcyIgYXJlIGFsbCBwYXRlbnQgY2xhaW1zCi1vd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBjb250cmlidXRvciwgd2hldGhlciBhbHJlYWR5IGFjcXVpcmVkIG9yCi1oZXJlYWZ0ZXIgYWNxdWlyZWQsIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIGJ5IHNvbWUgbWFubmVyLCBwZXJtaXR0ZWQKLWJ5IHRoaXMgTGljZW5zZSwgb2YgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBpdHMgY29udHJpYnV0b3IgdmVyc2lvbiwKLWJ1dCBkbyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhCi1jb25zZXF1ZW5jZSBvZiBmdXJ0aGVyIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udHJpYnV0b3IgdmVyc2lvbi4gIEZvcgotcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgaW5jbHVkZXMgdGhlIHJpZ2h0IHRvIGdyYW50Ci1wYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKLXRoaXMgTGljZW5zZS4KLQotICBFYWNoIGNvbnRyaWJ1dG9yIGdyYW50cyB5b3UgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgdGhlIGNvbnRyaWJ1dG9yJ3MgZXNzZW50aWFsIHBhdGVudCBjbGFpbXMsIHRvCi1tYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBpbXBvcnQgYW5kIG90aGVyd2lzZSBydW4sIG1vZGlmeSBhbmQKLXByb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24uCi0KLSAgSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBwYXJhZ3JhcGhzLCBhICJwYXRlbnQgbGljZW5zZSIgaXMgYW55IGV4cHJlc3MKLWFncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAotKHN1Y2ggYXMgYW4gZXhwcmVzcyBwZXJtaXNzaW9uIHRvIHByYWN0aWNlIGEgcGF0ZW50IG9yIGNvdmVuYW50IG5vdCB0bwotc3VlIGZvciBwYXRlbnQgaW5mcmluZ2VtZW50KS4gIFRvICJncmFudCIgc3VjaCBhIHBhdGVudCBsaWNlbnNlIHRvIGEKLXBhcnR5IG1lYW5zIHRvIG1ha2Ugc3VjaCBhbiBhZ3JlZW1lbnQgb3IgY29tbWl0bWVudCBub3QgdG8gZW5mb3JjZSBhCi1wYXRlbnQgYWdhaW5zdCB0aGUgcGFydHkuCi0KLSAgSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKLWFuZCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgaXMgbm90IGF2YWlsYWJsZSBmb3IgYW55b25lCi10byBjb3B5LCBmcmVlIG9mIGNoYXJnZSBhbmQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgdGhyb3VnaCBhCi1wdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAotdGhlbiB5b3UgbXVzdCBlaXRoZXIgKDEpIGNhdXNlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB0byBiZSBzbwotYXZhaWxhYmxlLCBvciAoMikgYXJyYW5nZSB0byBkZXByaXZlIHlvdXJzZWxmIG9mIHRoZSBiZW5lZml0IG9mIHRoZQotcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKLWNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSwgdG8gZXh0ZW5kIHRoZSBwYXRlbnQKLWxpY2Vuc2UgdG8gZG93bnN0cmVhbSByZWNpcGllbnRzLiAgIktub3dpbmdseSByZWx5aW5nIiBtZWFucyB5b3UgaGF2ZQotYWN0dWFsIGtub3dsZWRnZSB0aGF0LCBidXQgZm9yIHRoZSBwYXRlbnQgbGljZW5zZSwgeW91ciBjb252ZXlpbmcgdGhlCi1jb3ZlcmVkIHdvcmsgaW4gYSBjb3VudHJ5LCBvciB5b3VyIHJlY2lwaWVudCdzIHVzZSBvZiB0aGUgY292ZXJlZCB3b3JrCi1pbiBhIGNvdW50cnksIHdvdWxkIGluZnJpbmdlIG9uZSBvciBtb3JlIGlkZW50aWZpYWJsZSBwYXRlbnRzIGluIHRoYXQKLWNvdW50cnkgdGhhdCB5b3UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSBhcmUgdmFsaWQuCi0KLSAgSWYsIHB1cnN1YW50IHRvIG9yIGluIGNvbm5lY3Rpb24gd2l0aCBhIHNpbmdsZSB0cmFuc2FjdGlvbiBvcgotYXJyYW5nZW1lbnQsIHlvdSBjb252ZXksIG9yIHByb3BhZ2F0ZSBieSBwcm9jdXJpbmcgY29udmV5YW5jZSBvZiwgYQotY292ZXJlZCB3b3JrLCBhbmQgZ3JhbnQgYSBwYXRlbnQgbGljZW5zZSB0byBzb21lIG9mIHRoZSBwYXJ0aWVzCi1yZWNlaXZpbmcgdGhlIGNvdmVyZWQgd29yayBhdXRob3JpemluZyB0aGVtIHRvIHVzZSwgcHJvcGFnYXRlLCBtb2RpZnkKLW9yIGNvbnZleSBhIHNwZWNpZmljIGNvcHkgb2YgdGhlIGNvdmVyZWQgd29yaywgdGhlbiB0aGUgcGF0ZW50IGxpY2Vuc2UKLXlvdSBncmFudCBpcyBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIHRvIGFsbCByZWNpcGllbnRzIG9mIHRoZSBjb3ZlcmVkCi13b3JrIGFuZCB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICBBIHBhdGVudCBsaWNlbnNlIGlzICJkaXNjcmltaW5hdG9yeSIgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB3aXRoaW4KLXRoZSBzY29wZSBvZiBpdHMgY292ZXJhZ2UsIHByb2hpYml0cyB0aGUgZXhlcmNpc2Ugb2YsIG9yIGlzCi1jb25kaXRpb25lZCBvbiB0aGUgbm9uLWV4ZXJjaXNlIG9mIG9uZSBvciBtb3JlIG9mIHRoZSByaWdodHMgdGhhdCBhcmUKLXNwZWNpZmljYWxseSBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIFlvdSBtYXkgbm90IGNvbnZleSBhIGNvdmVyZWQKLXdvcmsgaWYgeW91IGFyZSBhIHBhcnR5IHRvIGFuIGFycmFuZ2VtZW50IHdpdGggYSB0aGlyZCBwYXJ0eSB0aGF0IGlzCi1pbiB0aGUgYnVzaW5lc3Mgb2YgZGlzdHJpYnV0aW5nIHNvZnR3YXJlLCB1bmRlciB3aGljaCB5b3UgbWFrZSBwYXltZW50Ci10byB0aGUgdGhpcmQgcGFydHkgYmFzZWQgb24gdGhlIGV4dGVudCBvZiB5b3VyIGFjdGl2aXR5IG9mIGNvbnZleWluZwotdGhlIHdvcmssIGFuZCB1bmRlciB3aGljaCB0aGUgdGhpcmQgcGFydHkgZ3JhbnRzLCB0byBhbnkgb2YgdGhlCi1wYXJ0aWVzIHdobyB3b3VsZCByZWNlaXZlIHRoZSBjb3ZlcmVkIHdvcmsgZnJvbSB5b3UsIGEgZGlzY3JpbWluYXRvcnkKLXBhdGVudCBsaWNlbnNlIChhKSBpbiBjb25uZWN0aW9uIHdpdGggY29waWVzIG9mIHRoZSBjb3ZlcmVkIHdvcmsKLWNvbnZleWVkIGJ5IHlvdSAob3IgY29waWVzIG1hZGUgZnJvbSB0aG9zZSBjb3BpZXMpLCBvciAoYikgcHJpbWFyaWx5Ci1mb3IgYW5kIGluIGNvbm5lY3Rpb24gd2l0aCBzcGVjaWZpYyBwcm9kdWN0cyBvciBjb21waWxhdGlvbnMgdGhhdAotY29udGFpbiB0aGUgY292ZXJlZCB3b3JrLCB1bmxlc3MgeW91IGVudGVyZWQgaW50byB0aGF0IGFycmFuZ2VtZW50LAotb3IgdGhhdCBwYXRlbnQgbGljZW5zZSB3YXMgZ3JhbnRlZCwgcHJpb3IgdG8gMjggTWFyY2ggMjAwNy4KLQotICBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBjb25zdHJ1ZWQgYXMgZXhjbHVkaW5nIG9yIGxpbWl0aW5nCi1hbnkgaW1wbGllZCBsaWNlbnNlIG9yIG90aGVyIGRlZmVuc2VzIHRvIGluZnJpbmdlbWVudCB0aGF0IG1heQotb3RoZXJ3aXNlIGJlIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYXBwbGljYWJsZSBwYXRlbnQgbGF3LgotCi0gIDEyLiBObyBTdXJyZW5kZXIgb2YgT3RoZXJzJyBGcmVlZG9tLgotCi0gIElmIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGNvbnZleSBhCi1jb3ZlcmVkIHdvcmsgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5Ci1ub3QgY29udmV5IGl0IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8gdGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UKLXRvIGNvbGxlY3QgYSByb3lhbHR5IGZvciBmdXJ0aGVyIGNvbnZleWluZyBmcm9tIHRob3NlIHRvIHdob20geW91IGNvbnZleQotdGhlIFByb2dyYW0sIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIHRob3NlIHRlcm1zIGFuZCB0aGlzCi1MaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCi0KLSAgMTMuIFVzZSB3aXRoIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLSAgTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCB5b3UgaGF2ZQotcGVybWlzc2lvbiB0byBsaW5rIG9yIGNvbWJpbmUgYW55IGNvdmVyZWQgd29yayB3aXRoIGEgd29yayBsaWNlbnNlZAotdW5kZXIgdmVyc2lvbiAzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW50byBhIHNpbmdsZQotY29tYmluZWQgd29yaywgYW5kIHRvIGNvbnZleSB0aGUgcmVzdWx0aW5nIHdvcmsuICBUaGUgdGVybXMgb2YgdGhpcwotTGljZW5zZSB3aWxsIGNvbnRpbnVlIHRvIGFwcGx5IHRvIHRoZSBwYXJ0IHdoaWNoIGlzIHRoZSBjb3ZlcmVkIHdvcmssCi1idXQgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi1zZWN0aW9uIDEzLCBjb25jZXJuaW5nIGludGVyYWN0aW9uIHRocm91Z2ggYSBuZXR3b3JrIHdpbGwgYXBwbHkgdG8gdGhlCi1jb21iaW5hdGlvbiBhcyBzdWNoLgotCi0gIDE0LiBSZXZpc2VkIFZlcnNpb25zIG9mIHRoaXMgTGljZW5zZS4KLQotICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZgotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZQotUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgR05VIEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlICJvciBhbnkgbGF0ZXIgdmVyc2lvbiIgYXBwbGllcyB0byBpdCwgeW91IGhhdmUgdGhlCi1vcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBudW1iZXJlZAotdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQKLWJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgSWYgdGhlIFByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBwcm94eSBjYW4gZGVjaWRlIHdoaWNoIGZ1dHVyZQotdmVyc2lvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MKLXB1YmxpYyBzdGF0ZW1lbnQgb2YgYWNjZXB0YW5jZSBvZiBhIHZlcnNpb24gcGVybWFuZW50bHkgYXV0aG9yaXplcyB5b3UKLXRvIGNob29zZSB0aGF0IHZlcnNpb24gZm9yIHRoZSBQcm9ncmFtLgotCi0gIExhdGVyIGxpY2Vuc2UgdmVyc2lvbnMgbWF5IGdpdmUgeW91IGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50Ci1wZXJtaXNzaW9ucy4gIEhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgb2JsaWdhdGlvbnMgYXJlIGltcG9zZWQgb24gYW55Ci1hdXRob3Igb3IgY29weXJpZ2h0IGhvbGRlciBhcyBhIHJlc3VsdCBvZiB5b3VyIGNob29zaW5nIHRvIGZvbGxvdyBhCi1sYXRlciB2ZXJzaW9uLgotCi0gIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgotCi0gIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkKLUFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKLUhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkKLU9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0KLUlTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRgotQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDE2LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4KLQotICBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTU9ESUZJRVMgQU5EL09SIENPTlZFWVMKLVRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQotR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFCi1VU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GCi1EQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRAotUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksCi1FVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi1TVUNIIERBTUFHRVMuCi0KLSAgMTcuIEludGVycHJldGF0aW9uIG9mIFNlY3Rpb25zIDE1IGFuZCAxNi4KLQotICBJZiB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBhbmQgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkgcHJvdmlkZWQKLWFib3ZlIGNhbm5vdCBiZSBnaXZlbiBsb2NhbCBsZWdhbCBlZmZlY3QgYWNjb3JkaW5nIHRvIHRoZWlyIHRlcm1zLAotcmV2aWV3aW5nIGNvdXJ0cyBzaGFsbCBhcHBseSBsb2NhbCBsYXcgdGhhdCBtb3N0IGNsb3NlbHkgYXBwcm94aW1hdGVzCi1hbiBhYnNvbHV0ZSB3YWl2ZXIgb2YgYWxsIGNpdmlsIGxpYWJpbGl0eSBpbiBjb25uZWN0aW9uIHdpdGggdGhlCi1Qcm9ncmFtLCB1bmxlc3MgYSB3YXJyYW50eSBvciBhc3N1bXB0aW9uIG9mIGxpYWJpbGl0eSBhY2NvbXBhbmllcyBhCi1jb3B5IG9mIHRoZSBQcm9ncmFtIGluIHJldHVybiBmb3IgYSBmZWUuCi0KLSAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotc3RhdGUgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi0gIElmIHRoZSBwcm9ncmFtIGRvZXMgdGVybWluYWwgaW50ZXJhY3Rpb24sIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQKLW5vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLSAgICBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHlvdXIgcHJvZ3JhbSdzIGNvbW1hbmRzCi1taWdodCBiZSBkaWZmZXJlbnQ7IGZvciBhIEdVSSBpbnRlcmZhY2UsIHlvdSB3b3VsZCB1c2UgYW4gImFib3V0IGJveCIuCi0KLSAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHNjaG9vbCwKLWlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLCBhbmQgaG93IHRvIGFwcGx5IGFuZCBmb2xsb3cgdGhlIEdOVSBHUEwsIHNlZQotPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0gIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0KLWludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQotbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoCi10aGUgbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiAgQnV0IGZpcnN0LCBwbGVhc2UgcmVhZAotPGh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L3doeS1ub3QtbGdwbC5odG1sPi4KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwcy5jIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzU3NDguLjAwMDAwMDAKLS0tIGEvcnJscC1lcGhlbWVyaXMvZ3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIGdwcy5jCi0gKgotICogQSBmZXcgdXRpbGl0eSBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGxvdyBsZXZlbCBHUFMgZGF0YQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLSNpbmNsdWRlICJncHMuaCIKLQotCi0jZGVmaW5lIEdFVF9GSUVMRF9VKHcsIG5iLCBwb3MpICgoKHcpID4+IChwb3MpKSAmICgoMTw8KG5iKSktMSkpCi0jZGVmaW5lIEdFVF9GSUVMRF9TKHcsIG5iLCBwb3MpICgoKGludCkoKHcpIDw8ICgzMi0obmIpLShwb3MpKSkpID4+ICgzMi0obmIpKSkKLQotLyoKLSAqIFVucGFja3MgR1BTIFN1YmZyYW1lIDEsMiwzIHBheWxvYWRzICgzICogOCB3b3JkcykKLSAqCi0gKiBOb3RlOiBlcGgtPnN2X2lkIGlzIG5vdCBmaWxsZWQgaGVyZSBzaW5jZSBub3QgcHJlc2VudCBpbiB0aG9zZSBzdWJmcmFtZXMKLSAqCi0gKiAobm8gcGFyaXR5IGJpdCBjaGVja2luZyBpcyBkb25lLCBvbmx5IHRoZSBsb3dlciAyNCBiaXRzIG9mIGVhY2ggd29yZAotICogIGFyZSB1c2VkKQotICovCi1pbnQKLWdwc191bnBhY2tfc2YxMjModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiAqZXBoKQotewotCXVpbnQzMl90ICpzZjEgPSAmc2ZbMF07Ci0JdWludDMyX3QgKnNmMiA9ICZzZls4XTsKLQl1aW50MzJfdCAqc2YzID0gJnNmWzE2XTsKLQotCWludCBpb2RlMSwgaW9kZTI7Ci0KLQllcGgtPndlZWtfbm8JPSBHRVRfRklFTERfVShzZjFbMF0sIDEwLCAxNCk7Ci0JZXBoLT5jb2RlX29uX2wyCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgMiwgMTIpOwotCWVwaC0+c3ZfdXJhCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgNCwgIDgpOwotCWVwaC0+c3ZfaGVhbHRoCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgNiwgIDIpOwotCWVwaC0+bDJfcF9mbGFnCT0gR0VUX0ZJRUxEX1Uoc2YxWzFdLCAgMSwgMjMpOwotCWVwaC0+dF9nZAk9IEdFVF9GSUVMRF9TKHNmMVs0XSwgIDgsICAwKTsKLQllcGgtPmlvZGMJPSAoR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgMiwgIDApIDw8IDgpIHwgXAotCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjFbNV0sICA4LCAxNik7Ci0JZXBoLT50X29jCT0gR0VUX0ZJRUxEX1Uoc2YxWzVdLCAxNiwgIDApOwotCWVwaC0+YV9mMgk9IEdFVF9GSUVMRF9TKHNmMVs2XSwgIDgsIDE2KTsKLQllcGgtPmFfZjEJPSBHRVRfRklFTERfUyhzZjFbNl0sIDE2LCAgMCk7Ci0JZXBoLT5hX2YwCT0gR0VUX0ZJRUxEX1Moc2YxWzddLCAyMiwgIDIpOwotCi0JaW9kZTEJCT0gR0VUX0ZJRUxEX1Uoc2YyWzBdLCAgOCwgMTYpOwotCWVwaC0+Y19ycwk9IEdFVF9GSUVMRF9TKHNmMlswXSwgMTYsICAwKTsKLQllcGgtPmRlbHRhX24JPSBHRVRfRklFTERfUyhzZjJbMV0sIDE2LCAgOCk7Ci0JZXBoLT5tXzAJPSAoR0VUX0ZJRUxEX1Moc2YyWzFdLCAgOCwgIDApIDw8IDI0KSB8IFwKLQkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzJdLCAyNCwgIDApOwotCWVwaC0+Y191Ywk9IEdFVF9GSUVMRF9TKHNmMlszXSwgMTYsICA4KTsKLQllcGgtPmUJCT0gKEdFVF9GSUVMRF9VKHNmMlszXSwgIDgsICAwKSA8PCAyNCkgfCBcCi0JICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmMls0XSwgMjQsICAwKTsKLQllcGgtPmNfdXMJPSBHRVRfRklFTERfUyhzZjJbNV0sIDE2LCAgOCk7Ci0JZXBoLT5hX3Bvd2hhbGYJPSAoR0VUX0ZJRUxEX1Uoc2YyWzVdLCAgOCwgIDApIDw8IDI0KSB8IFwKLQkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzZdLCAyNCwgIDApOwotCWVwaC0+dF9vZQk9IEdFVF9GSUVMRF9VKHNmMls3XSwgMTYsICA4KTsKLQllcGgtPmZpdF9mbGFnCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAgMSwgIDcpOwotCi0JZXBoLT5jX2ljCT0gR0VUX0ZJRUxEX1Moc2YzWzBdLCAxNiwgIDgpOwotCWVwaC0+b21lZ2FfMAk9IChHRVRfRklFTERfUyhzZjNbMF0sICA4LCAgMCkgPDwgMjQpIHwgXAotCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjNbMV0sIDI0LCAgMCk7Ci0JZXBoLT5jX2lzCT0gR0VUX0ZJRUxEX1Moc2YzWzJdLCAxNiwgIDgpOwotCWVwaC0+aV8wCT0gKEdFVF9GSUVMRF9TKHNmM1syXSwgIDgsICAwKSA8PCAyNCkgfCBcCi0JICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1szXSwgMjQsICAwKTsKLQllcGgtPmNfcmMJPSBHRVRfRklFTERfUyhzZjNbNF0sIDE2LCAgOCk7Ci0JZXBoLT53CQk9IChHRVRfRklFTERfUyhzZjNbNF0sICA4LCAgMCkgPDwgMjQpIHwgXAotCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjNbNV0sIDI0LCAgMCk7Ci0JZXBoLT5vbWVnYV9kb3QJPSBHRVRfRklFTERfUyhzZjNbNl0sIDI0LCAgMCk7Ci0JaW9kZTIJCT0gR0VUX0ZJRUxEX1Uoc2YzWzddLCAgOCwgMTYpOwotCWVwaC0+aWRvdAk9IEdFVF9GSUVMRF9TKHNmM1s3XSwgMTQsICAyKTsKLQotCWVwaC0+X3JzdmQxCT0gR0VUX0ZJRUxEX1Uoc2YxWzFdLCAyMywgIDApOwotCWVwaC0+X3JzdmQyCT0gR0VUX0ZJRUxEX1Uoc2YxWzJdLCAyNCwgIDApOwotCWVwaC0+X3JzdmQzCT0gR0VUX0ZJRUxEX1Uoc2YxWzNdLCAyNCwgIDApOwotCWVwaC0+X3JzdmQ0CT0gR0VUX0ZJRUxEX1Uoc2YxWzRdLCAxNiwgIDgpOwotCWVwaC0+YW9kbwk9IEdFVF9GSUVMRF9VKHNmMls3XSwgIDUsICAyKTsKLQotCS8qIENoZWNrICYgY3Jvc3MtdmFsaWRhdGUgaW9kY1s3OjBdLCBpb2RlMSwgaW9kZTIgKi8KLQlpZiAoKGlvZGUxICE9IGlvZGUyKSB8fCAoaW9kZTEgIT0gKGVwaC0+aW9kYyAmIDB4ZmYpKSkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIFVucGFja3MgR1BTIFN1YmZyYW1lIDQgb3IgNSBBbG1hbmFjIHBhZ2VzIHBheWxvYWQgKDggd29yZHMpCi0gKgotICogKG5vIHBhcml0eSBiaXQgY2hlY2tpbmcgaXMgZG9uZSwgb25seSB0aGUgbG93ZXIgMjQgYml0cyBvZiBlYWNoIHdvcmQKLSAqICBhcmUgdXNlZCkKLSAqLwotaW50Ci1ncHNfdW5wYWNrX3NmNDVfYWxtYW5hYyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfYWxtYW5hY19zdiAqYWxtKQotewotCWFsbS0+c3ZfaWQgICAgICA9IEdFVF9GSUVMRF9VKHNmWzBdLCAgNiwgMTYpOwotCi0JYWxtLT5lCQk9IEdFVF9GSUVMRF9VKHNmWzBdLCAxNiwgIDApOwotCWFsbS0+dF9vYQk9IEdFVF9GSUVMRF9VKHNmWzFdLCAgOCwgMTYpOwotCWFsbS0+a3NpaQk9IEdFVF9GSUVMRF9TKHNmWzFdLCAxNiwgIDApOwotCWFsbS0+b21lZ2FfZG90CT0gR0VUX0ZJRUxEX1Moc2ZbMl0sIDE2LCAgOCk7Ci0JYWxtLT5zdl9oZWFsdGgJPSBHRVRfRklFTERfVShzZlsyXSwgIDgsICAwKTsKLQlhbG0tPmFfcG93aGFsZgk9IEdFVF9GSUVMRF9VKHNmWzNdLCAyNCwgIDApOwotCWFsbS0+b21lZ2FfMAk9IEdFVF9GSUVMRF9TKHNmWzRdLCAyNCwgIDApOwotCWFsbS0+dwkJPSBHRVRfRklFTERfUyhzZls1XSwgMjQsICAwKTsKLQlhbG0tPm1fMAk9IEdFVF9GSUVMRF9TKHNmWzZdLCAyNCwgIDApOwotCWFsbS0+YV9mMAk9IChHRVRfRklFTERfUyhzZls3XSwgOCwgMTYpIDw8IDMpIHwgXAotCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZls3XSwgMywgIDIpOwotCWFsbS0+YV9mMQk9IEdFVF9GSUVMRF9TKHNmWzddLCAxMSwgIDUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwcy5oIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MWI5ZDcuLjAwMDAwMDAKLS0tIGEvcnJscC1lcGhlbWVyaXMvZ3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIGdwcy5oCi0gKgotICogSGVhZGVyIHRvIGRlYWwgd2l0aCBsb3cgbGV2ZWwgR1BTIGRhdGEKLSAqCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqLwotCi0jaWZuZGVmIF9fR1BTX0hfXwotI2RlZmluZSBfX0dQU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLQotI2RlZmluZSBNQVhfU1YJNjQKLQotCi0vKiBJb25vc3BlcmljIG1vZGVsIGRhdGEgKi8KLXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCB7Ci0JCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KLQkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLwotCi0JaW50IGFscGhhXzA7CS8qIHMgOCAgICAgICAyXi0zMCAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLwotCWludCBhbHBoYV8xOwkvKiBzIDggICAgICAgMl4tMjcgICAgICAgICAgICAgICAgIHMgLyBzZW1pLWNpcmNsZXMgKi8KLQlpbnQgYWxwaGFfMjsJLyogcyA4ICAgICAgIDJeLTI0ICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMiAqLwotCWludCBhbHBoYV8zOwkvKiBzIDggICAgICAgMl4tMjQgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4zICovCi0JaW50IGJldGFfMDsJLyogcyA4ICAgICAgIDJeMTEgICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCi0JaW50IGJldGFfMTsJLyogcyA4ICAgICAgIDJeMTQgICAgICAgICAgICAgICAgICBzIC8gc2VtaS1jaXJjbGVzICovCi0JaW50IGJldGFfMjsJLyogcyA4ICAgICAgIDJeMTYgICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMiAqLwotCWludCBiZXRhXzM7CS8qIHMgOCAgICAgICAyXjE2ICAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjMgKi8KLX07Ci0KLQotLyogVVRDIG1vZGVsIGRhdGEgKi8KLXN0cnVjdCBncHNfdXRjX21vZGVsIHsKLQkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLwotCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCi0KLQlpbnQgYTA7CQkvKiBzIDMyICAgICAgMl4tMzAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KLQlpbnQgYTE7CQkvKiBzIDI0ICAgICAgMl4tNTAgICAgICAgICAgICAgICAgIHNlY29uZHMgLyBzZWNvbmRzICovCi0JaW50IGRlbHRhX3RfbHM7CS8qIHMgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLwotCWludCB0X290OwkvKiB1ICA4ICAgICAgMl4xMiAgICAgICA2MDIsMTEyICAgIHNlY29uZHMgICAgICAgICAgKi8KLQlpbnQgd25fdDsJLyogdSAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICB3ZWVrcyAgICAgICAgICAgICovCi0JaW50IHduX2xzZjsJLyogdSAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICB3ZWVrcyAgICAgICAgICAgICovCi0JaW50IGRuOwkJLyogdSAgOCAgICAgIDEgICAgICAgICAgICAgICAgNyAgICBkYXlzICAgICAgICAgICAgICovCi0JaW50IGRlbHRhX3RfbHNmOy8qIHMgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLwotfTsKLQotCi0vKiBBbG1hbmFjaCBkYXRhICovCi1zdHJ1Y3QgZ3BzX2FsbWFuYWNfc3YgewotCWludCBzdl9pZDsKLQlpbnQgc3ZfaGVhbHRoOwotCi0JCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KLQkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLwotCi0JaW50IGU7CQkvKiB1IDE2ICAgICAgMl4tMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlpbnQgdF9vYTsJLyogdSAgOCAgICAgIDJeMTIgICAgICAgNjAyLDExMiAgICBzZWNvbmRzICAgICAgICAgICovCi0JaW50IGtzaWk7CS8qIHMgMTYgICAgICAyXi0xOSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLwotCWludCBvbWVnYV9kb3Q7CS8qIHMgMTYgICAgICAyXi0zOCAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLwotCWludCBhX3Bvd2hhbGY7CS8qIHUgMjQgICAgICAyXi0xMSAgICAgICAgICAgICAgICAgbWV0ZXJzICAgICAgICAgICAqLwotCWludCBvbWVnYV8wOwkvKiBzIDI0ICAgICAgMl4tMjMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KLQlpbnQgdzsJCS8qIHMgMjQgICAgICAyXi0yMyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLwotCWludCBtXzA7CS8qIHMgMjQgICAgICAyXi0yMyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLwotCWludCBhX2YwOwkvKiBzIDExICAgICAgMl4tMjAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KLQlpbnQgYV9mMTsJLyogcyAxMSAgICAgIDJeLTM4ICAgICAgICAgICAgICAgICBzZWNvbmRzIC8gc2Vjb25kcyAqLwotfTsKLQotc3RydWN0IGdwc19hbG1hbmFjIHsKLQlpbnQgd25hOwotCWludCBuX3N2OwotCXN0cnVjdCBncHNfYWxtYW5hY19zdiBzdnNbTUFYX1NWXTsKLX07Ci0KLQotLyogRXBoZW1lcmlzIGRhdGEgKi8KLXN0cnVjdCBncHNfZXBoZW1lcmlzX3N2IHsKLQlpbnQgc3ZfaWQ7Ci0KLQkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLwotCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCi0KLQlpbnQgY29kZV9vbl9sMjsJLyogdSAgMiAgICAgIDEgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCi0JaW50IHdlZWtfbm87CS8qIHUgMTAgICAgICAxICAgICAgICAgICAgICAgICAgICAgd2VlayAgICAgICAgICAgICAqLwotCWludCBsMl9wX2ZsYWc7CS8qIHUgIDEgICAgICAxICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLwotCWludCBzdl91cmE7CS8qIHUgIDQgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLwotCWludCBzdl9oZWFsdGg7CS8qIHUgIDYgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLwotCWludCB0X2dkOwkvKiBzICA4ICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KLQlpbnQgaW9kYzsJLyogdSAxMCAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCi0JaW50IHRfb2M7CS8qIHUgMTYgICAgICAyXjQgICAgICAgIDYwNCw3ODQgICAgc2Vjb25kcyAgICAgICAgICAqLwotCWludCBhX2YyOwkvKiBzICA4ICAgICAgMl4tNTUgICAgICAgICAgICAgICAgIHNlYyAvIHNlY14yICAgICAgKi8KLQlpbnQgYV9mMTsJLyogcyAxNiAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZWMgLyBzZWMgICAgICAgICovCi0JaW50IGFfZjA7CS8qIHMgMjIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLwotCi0JaW50IGNfcnM7CS8qIHMgMTYgICAgICAyXi01ICAgICAgICAgICAgICAgICAgbWV0ZXJzICAgICAgICAgICAqLwotCWludCBkZWx0YV9uOwkvKiBzIDE2ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KLQlpbnQgbV8wOwkvKiBzIDMyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KLQlpbnQgY191YzsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCi0JdW5zaWduZWQgaW50IGU7CS8qIHUgMzIgICAgICAyXi0zMyAgICAgIDAuMDMgICAgICAgLyAgICAgICAgICAgICAgICAqLwotCWludCBjX3VzOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgYV9wb3doYWxmOyAvKiB1IDMyICAyXi0xOSAgICAgICAgICAgICBtZXRlcnNeKDEvMikgICAgICovCi0JaW50IHRfb2U7CS8qIHUgMTYgICAgICAyXjQgICAgICAgIDYwNCw3ODQgICAgc2Vjb25kcyAgICAgICAgICAqLwotCWludCBmaXRfZmxhZzsJLyogdSAgMSAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCi0KLQlpbnQgY19pYzsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCi0JaW50IG9tZWdhXzA7CS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLwotCWludCBjX2lzOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KLQlpbnQgaV8wOwkvKiBzIDMyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KLQlpbnQgY19yYzsJLyogcyAxNiAgICAgIDJeLTUgICAgICAgICAgICAgICAgICBtZXRlcnMgICAgICAgICAgICovCi0JaW50IHc7CQkvKiBzIDMyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KLQlpbnQgb21lZ2FfZG90OwkvKiBzIDI0ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KLQlpbnQgaWRvdDsJLyogcyAxNCAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCi0KLQlpbnQgX3JzdmQxOwkvKiAyMyBiaXRzICovCi0JaW50IF9yc3ZkMjsJLyogMjQgYml0cyAqLwotCWludCBfcnN2ZDM7CS8qIDI0IGJpdHMgKi8KLQlpbnQgX3JzdmQ0OwkvKiAxNiBiaXRzICovCi0JaW50IGFvZG87CS8qIDggYml0cyAgTm90IHN1cmUgaXQgbmVlZHMgdG8gYmUgaGVyZSAuLi4gKi8KLX07Ci0KLXN0cnVjdCBncHNfZXBoZW1lcmlzIHsKLQlpbnQgbl9zdjsKLQlzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiBzdnNbTUFYX1NWXTsKLX07Ci0KLQotLyogUmVmZXJlbmNlIHBvc2l0aW9uICovCi1zdHJ1Y3QgZ3BzX3JlZl9wb3MgewkvKiBXU0c4NCBlbGxpcHNvaWQgKi8KLQlkb3VibGUgbGF0aXR1ZGU7CS8qIGRlZyAqLwotCWRvdWJsZSBsb25naXR1ZGU7CS8qIGRlZyAqLwotCWRvdWJsZSBhbHRpdHVkZTsJLyogbSBhYm92ZSBlbGxpcHNvaWQgKi8KLX07Ci0KLQotLyogUmVmZXJlbmNlIHRpbWUgKi8KLXN0cnVjdCBncHNfcmVmX3RpbWUgewotCWludCB3bjsJCQkvKiBHUFMgd2VlayBudW1iZXIgKi8KLQlkb3VibGUgdG93OwkJLyogaW4gc2Vjb25kcyAqLwotfTsKLQotCi0vKiBBbGwgYXNzaXN0IGRhdGEgKi8KLSNkZWZpbmUgR1BTX0ZJRUxEX0lPTk9TUEhFUkUJKDE8PDApCi0jZGVmaW5lIEdQU19GSUVMRF9VVEMJCSgxPDwxKQotI2RlZmluZSBHUFNfRklFTERfQUxNQU5BQwkoMTw8MikKLSNkZWZpbmUgR1BTX0ZJRUxEX0VQSEVNRVJJUwkoMTw8MykKLSNkZWZpbmUgR1BTX0ZJRUxEX1JFRlBPUwkoMTw8NCkKLSNkZWZpbmUgR1BTX0ZJRUxEX1JFRlRJTUUJKDE8PDUpCi0KLXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgewotCWludCBmaWVsZHM7Ci0Jc3RydWN0IGdwc19pb25vc3BoZXJlX21vZGVsCWlvbm9zcGhlcmU7Ci0Jc3RydWN0IGdwc191dGNfbW9kZWwJCXV0YzsKLQlzdHJ1Y3QgZ3BzX2FsbWFuYWMJCWFsbWFuYWM7Ci0Jc3RydWN0IGdwc19lcGhlbWVyaXMJCWVwaGVtZXJpczsKLQlzdHJ1Y3QgZ3BzX3JlZl9wb3MJCXJlZl9wb3M7Ci0Jc3RydWN0IGdwc19yZWZfdGltZQkJcmVmX3RpbWU7Ci19OwotCi0KLS8qIEdQUyBTdWJmcmFtZSB1dGlsaXR5IG1ldGhvZHMgKHNlZSBncHMuYyBmb3IgZGV0YWlscykgKi8KLWludCBncHNfdW5wYWNrX3NmMTIzKHVpbnQzMl90ICpzZiwgc3RydWN0IGdwc19lcGhlbWVyaXNfc3YgKmVwaCk7Ci1pbnQgZ3BzX3VucGFja19zZjQ1X2FsbWFuYWModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3YgKmFsbSk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fR1BTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9tYWluLmMgYi9ycmxwLWVwaGVtZXJpcy9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDI1YTIuLjAwMDAwMDAKLS0tIGEvcnJscC1lcGhlbWVyaXMvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpbmNsdWRlICJncHMuaCIKLSNpbmNsdWRlICJ1YnguaCIKLSNpbmNsdWRlICJ1YngtcGFyc2UuaCIKLSNpbmNsdWRlICJycmxwLmgiCi0KLXN0YXRpYyBpbnQKLWRvX3VieF9yZWFkKHN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcywgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0JaW50IHJ2LCBmZCwgaTsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQl2b2lkICpidWY7Ci0KLQkvKiBMb2FkIGZpbGUgKi8KLQlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKLQlpZiAoZmQgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQlydiA9IGZzdGF0KGZkLCAmc3QpOwotCWlmIChydiA8IDApIHsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JYnVmID0gbWFsbG9jKHN0LnN0X3NpemUpOwotCWlmICghYnVmKSB7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJ2ID0gcmVhZChmZCwgYnVmLCBzdC5zdF9zaXplKTsKLQlpZiAocnYgIT0gc3Quc3Rfc2l6ZSkgewotCQlmcmVlKGJ1Zik7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFBhcnNlIGVhY2ggbWVzc2FnZSAqLwotCWZvciAoaT0wOyBpPHN0LnN0X3NpemU7KSB7Ci0JCWludCBydjsKLQkJcnYgPSB1YnhfbXNnX2Rpc3BhdGNoKHVieF9wYXJzZV9kdCwgYnVmICsgaSwgc3Quc3Rfc2l6ZSAtIGksIGdwcyk7Ci0JCWlmIChydiA8IDApCi0JCQlpKys7CS8qIEludmFsaWQgbWVzc2FnZTogdHJ5IG9uZSBieXRlIGxhdGVyICovCi0JCWVsc2UKLQkJCWkgKz0gcnY7Ci0JfQotCi0JLyogRG9uZSAqLwotCWZyZWUoYnVmKTsKLQljbG9zZShmZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZG9fcnJscChzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMpCi17Ci0Jc3RydWN0IHJybHBfYXNzaXN0X3JlcSBhcjsKLQl2b2lkICpwZHVzWzY0XTsKLQlpbnQgbGVuWzY0XTsKLQlpbnQgaSwgcnY7Ci0KLQljaGFyICp0ZXN0ID0gIlx4MjhceDAwXHg4MFx4MTBceDAxXHgzMlx4MDBceDE5XHg0Rlx4MDdceDE1XHgwNCI7Ci0KLQlycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3QoJmFyLCB0ZXN0LCAxMik7Ci0JcHJpbnRmKCIlMDh4ICUwMTZsbHhcbiIsIGFyLnJlcV9lbGVtcywgKGxvbmcgbG9uZyB1bnNpZ25lZCkgYXIuZXBoX3N2cyk7Ci0KLQlhci5yZXFfZWxlbXMgPSAtMTsKLQlhci5lcGhfc3ZzID0gLTFMTDsKLQlydiA9IHJybHBfZ3BzX2Fzc2lzdF9wZHVzKGdwcywgJmFyLCBwZHVzLCBsZW4sIDY0KTsKLQlwcmludGYoIiVkXG4iLCBydik7Ci0JZm9yIChpPTA7IGk8cnY7IGkrKykgewotCQlwcmludGYoIiVwICVkXG4iLCBwZHVzW2ldLCBsZW5baV0pOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhIGdwczsKLQlpbnQgcnY7Ci0KLQltZW1zZXQoJmdwcywgMHgwMCwgc2l6ZW9mKGdwcykpOwotCi0JcnYgPSBkb191YnhfcmVhZCgmZ3BzLCAiZGF0YS51YngiKTsKLQkKLQlydiA9IGRvX3JybHAoJmdwcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvcnJscC5jIGIvcnJscC1lcGhlbWVyaXMvcnJscC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjBjM2FiLi4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL3JybHAuYworKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKgotICogcnJscC5jCi0gKgotICogUlJMUCBpbXBsZW1lbnRhdGlvbgotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSAiZ3BzLmgiCi0jaW5jbHVkZSAicnJscC5oIgotCi0jaW5jbHVkZSA8UERVLmg+Ci0jaW5jbHVkZSA8R1BTLUFzc2lzdERhdGEuaD4KLSNpbmNsdWRlIDxOYXZpZ2F0aW9uTW9kZWwuaD4KLSNpbmNsdWRlIDxJb25vc3BoZXJpY01vZGVsLmg+Ci0jaW5jbHVkZSA8VVRDTW9kZWwuaD4KLSNpbmNsdWRlIDxBbG1hbmFjLmg+Ci0jaW5jbHVkZSA8UmVmTG9jYXRpb24uaD4KLSNpbmNsdWRlIDxSZWZlcmVuY2VUaW1lLmg+Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBSUkxQIEFzc2lzdGFuY2UgcmVxdWVzdCBkZWNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXt7eyAqLwotLyogRGVjb2RlIGFuZCB2YWxpZGF0ZSB0aGUgYXNzaXN0YW5jZSBkYXRhIHJlcXVlc3QgbWVzc2FnZXMuCi0gKiBTZWUgc2VjdGlvbiAxMC4xMCBvZgotICogIC4gRVRTSSBUUyAxNDkgMDMxIFY4LjEuMCAoMjAwOS0wMSkKLSAqICAuIDNHUFAgVFMgNDkuMDMxIHZlcnNpb24gOC4xLjAgUmVsZWFzZSA4Ci0gKi8KLQotLyogUGFja2VkIHN0cnVjdHVyZSBmcm9tIDQ5LjAzMSBzcGVjIChSR0EgPSBSZXF1ZXN0IEdQUyBBc3Npc3RhbmNlKSAqLwotCi0jZGVmaW5lIFJSTFBfUkdBMF9BTE1BTkFDCSgxPDwwKQotI2RlZmluZSBSUkxQX1JHQTBfVVRDX01PREVMCSgxPDwxKQotI2RlZmluZSBSUkxQX1JHQTBfSU9OT19NT0RFTAkoMTw8MikKLSNkZWZpbmUgUlJMUF9SR0EwX05BVl9NT0RFTAkoMTw8MykKLSNkZWZpbmUgUlJMUF9SR0EwX0RHUFMJCSgxPDw0KQotI2RlZmluZSBSUkxQX1JHQTBfUkVGX0xPQwkoMTw8NSkKLSNkZWZpbmUgUlJMUF9SR0EwX1JFRl9USU1FCSgxPDw2KQotI2RlZmluZSBSUkxQX1JHQTBfQUNRX0FTU0lTVAkoMTw8NykKLQotI2RlZmluZSBSUkxQX1JHQTFfUkVBTFRJTUVfSU5UCSgxPDwwKQotI2RlZmluZSBSUkxQX1JHQTFfRVBIX0VYVAkoMTw8MSkKLSNkZWZpbmUgUlJMUF9SR0ExX0VQSF9FWFRfQ0hFQ0sJKDE8PDIpCi0KLXN0cnVjdCBycmxwX3JnYV9oZHIgewotCXVpbnQ4X3QgaXRlbXMwOwotCXVpbnQ4X3QgaXRlbXMxOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHJybHBfcmdhX2VwaF9zdiB7Ci0JdWludDhfdCBzdl9pZDsJCS8qIFs3OjZdIHJlc2VydmVkLCBbNTowXSBzdl9pZCAqLwotCXVpbnQ4X3QgaW9kZTsJCS8qIGxhdGVzdCBlcGggaW4gdGhlIE1TIG1lbW9yeSBpbiBob3VycyAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHJybHBfcmdhX2VwaCB7Ci0JdWludDhfdCB3bl9oaTsJCS8qIFs3OjZdID0gd25bOTo4XSAqLwotCXVpbnQ4X3Qgd25fbG87CQkvKiB3bls3OjBdICovCi0JdWludDhfdCB0b2U7CQkvKiBsYXRlc3QgZXBoIGluIHRoZSBNUyBtZW1vcnkgaW4gaG91cnMgKi8KLQl1aW50OF90IG5zYXRfdG10b2U7CS8qIFs3OjRdIG5zdGF0LCBbMzowXSBULVRvZSBsaW1pdCAqLwotCXN0cnVjdCBycmxwX3JnYV9lcGhfc3Ygc3ZzWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHJybHBfcmdhX2VwaF9leHQgewotCXVpbnQ4X3QgdmFsaWRpdHk7CS8qIGluIDQgaG91cnMgdW5pdHMgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBycmxwX3JnYV9lcGhfZXh0X2NoZWNrIHsKLQkJLyogd2Vla3MgYXJlIGluIGdwcyB3ZWVrIG1vZHVsbyA0ICovCi0JdWludDhfdCB3bl9iZWdpbl9lbmQ7CS8qIFs3OjRdIGJlZ2luLCBbMzowXSBlbmQgKi8KLQl1aW50OF90IHRvd19iZWdpbjsKLQl1aW50OF90IHRvd19lbmQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLS8qIFBhcnNpbmcgZnVuY3Rpb24gKi8KLQotaW50Ci1ycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3QoCi0Jc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqYXIsCi0Jdm9pZCAqcmVxLCBpbnQgcmVxX2xlbikKLXsKLQlzdHJ1Y3QgcnJscF9yZ2FfaGRyICpoZHIgPSBOVUxMOwotCXN0cnVjdCBycmxwX3JnYV9lcGggKmVwaCA9IE5VTEw7Ci0Jc3RydWN0IHJybHBfcmdhX2VwaF9leHQgKmVwaF9leHQgPSBOVUxMOwotCXN0cnVjdCBycmxwX3JnYV9lcGhfZXh0X2NoZWNrICplcGhfZXh0X2NoZWNrID0gTlVMTDsKLQlpbnQgcCA9IDA7Ci0KLQkvKiBSZXNldCAqLwotCWFyLT5yZXFfZWxlbXMgPSAwOwotCWFyLT5lcGhfc3ZzID0gMDsKLQotCS8qIFBhcnNlIG1lc3NhZ2UgKi8KLQloZHIgPSByZXE7Ci0JcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2hkcik7Ci0JaWYgKHAgPiByZXFfbGVuKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfTkFWX01PREVMKSB7Ci0JCWVwaCA9IHJlcSArIHA7Ci0JCXAgKz0gc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGgpOwotCQlpZiAocCA+IHJlcV9sZW4pCi0JCQlyZXR1cm4gLTE7Ci0JCXAgKz0gKGVwaC0+bnNhdF90bXRvZSA+PiA0KSAqIHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX3N2KTsKLQkJaWYgKHAgPiByZXFfbGVuKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9FUEhfRVhUKSB7Ci0JCWVwaF9leHQgPSByZXEgKyBwOwotCQlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCk7Ci0JCWlmIChwID4gcmVxX2xlbikKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoaGRyLT5pdGVtczEgJiBSUkxQX1JHQTFfRVBIX0VYVF9DSEVDSykgewotCQllcGhfZXh0X2NoZWNrID0gcmVxICsgcDsKLQkJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2spOwotCQlpZiAocCA+IHJlcV9sZW4pCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKHAgIT0gcmVxX2xlbikKLQkJcmV0dXJuIC0yOyAvKiBub3QgYWxsIGJ5dGVzIGNvbnN1bWVkID8/PyAqLwotCi0JLyogUHJpbnQgYSB3YXJuaW5nIGZvciB1bnN1cHBvcnRlZCByZXF1ZXN0cyAqLwotCWlmICgoZXBoX2V4dCAhPSBOVUxMKSB8fAotCSAgICAoZXBoX2V4dF9jaGVjayAhPSBOVUxMKSB8fAotCSAgICAoaGRyLT5pdGVtczAgJiAoUlJMUF9SR0EwX0RHUFMgfCBSUkxQX1JHQTBfQUNRX0FTU0lTVCkpIHx8Ci0JICAgIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9SRUFMVElNRV9JTlQpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiW3ddIFVuc3VwcG9ydGVkIGFzc2lzdGFuY2UgZGF0YSByZXF1ZXN0ZWQsIGlnbm9yZWQgLi4uXG4iKTsKLQl9Ci0KLQkvKiBDb3B5IHRoZSByZXF1ZXN0ICovCi0JaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX0FMTUFOQUMpCi0JCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9BTE1BTkFDOwotCi0JaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1VUQ19NT0RFTCkKLQkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX1VUQ19NT0RFTDsKLQotCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9JT05PX01PREVMKQotCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfSU9OT19NT0RFTDsKLQotCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9SRUZfTE9DKQotCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfUkVGX0xPQzsKLQotCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9SRUZfVElNRSkKLQkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX1JFRl9USU1FOwotCi0JaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX05BVl9NT0RFTCkgewotCQlpbnQgaSwgbl9zdnMgPSBlcGgtPm5zYXRfdG10b2UgPj4gNDsKLQkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX0VQSEVNRVJJUzsKLQkJZm9yIChpPTA7IGk8bl9zdnM7IGkrKykKLQkJCWFyLT5lcGhfc3ZzIHw9ICgxVUxMIDw8IChlcGgtPnN2c1tpXS5zdl9pZCAtIDEpKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogfX19ICovCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBSUkxQIGVsZW1lbnRzIGZpbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXt7eyAqLwotCi0JLyogSGVscGVycyAqLwotCi1zdGF0aWMgdm9pZAotX3RzXzIzXzAzMl9zdG9yZV9sYXRpdHVkZShkb3VibGUgbGF0LCB1aW50OF90ICpiKQotewotCXVpbnQzMl90IHg7Ci0JeCA9ICh1aW50MzJfdCkgZmxvb3IoZmFicyhsYXQvOTAuMCkgKiAoKGRvdWJsZSkoMTw8MjMpKSk7Ci0JaWYgKHggPj0gKDE8PDIzKSkKLQkJeCA9ICgxPDwyMykgLSAxOwotCWlmIChsYXQgPCAwLjApCi0JCXggfD0gKDE8PDIzKTsKLQliWzBdID0gKHggPj4gMTYpICYgMHhmZjsKLQliWzFdID0gKHggPj4gIDgpICYgMHhmZjsKLQliWzJdID0gIHggICAgICAgICYgMHhmZjsKLX0KLQotc3RhdGljIHZvaWQKLV90c18yM18wMzJfc3RvcmVfbG9uZ2l0dWRlKGRvdWJsZSBsb24sIHVpbnQ4X3QgKmIpCi17Ci0JaW50MzJfdCB4OwotCXggPSBmbG9vcigobG9uLzM2MC4wKSAqICgoZG91YmxlKSgxPDwyNCkpKTsKLQlpZiAoeCA+PSAoMTw8MjMpKQotCQl4ID0gMHgwMDdmZmZmZjsKLQllbHNlIGlmICh4IDwgLSgxPDwyMykpCi0JCXggPSAweDAwODAwMDAwOwotCWJbMF0gPSAoeCA+PiAxNikgJiAweGZmOwotCWJbMV0gPSAoeCA+PiAgOCkgJiAweGZmOwotCWJbMl0gPSAgeCAgICAgICAgJiAweGZmOwotfQotCi1zdGF0aWMgdm9pZAotX3RzXzIzXzAzMl9zdG9yZV9hbHRpdHVkZShkb3VibGUgYWx0LCB1aW50OF90ICpiKQotewotCWludCBhbHRfaSA9IChpbnQpZmFicyhhbHQpOwotCWJbMF0gPSAoKGFsdF9pID4+IDgpICYgMHg3ZikgfCAoYWx0PDAuMCA/IDB4ODAgOiAweDAwKTsKLQliWzFdID0gYWx0X2kgJiAweGZmOwotfQotCi0KLQkvKiBGaWxsIG1ldGhvZHMgKi8KLQotc3RhdGljIHZvaWQKLV9ycmxwX2ZpbGxfbmF2aWdhdGlvbl9tb2RlbF9lbGVtZW50KAotCXN0cnVjdCBOYXZNb2RlbEVsZW1lbnQgKnJybHBfbm1lLAotCXN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICpncHNfZXBoX3N2KQotewotCXN0cnVjdCBVbmNvbXByZXNzZWRFcGhlbWVyaXMgKnJybHBfZXBoOwotCi0JcnJscF9ubWUtPnNhdFN0YXR1cy5wcmVzZW50ID0gU2F0U3RhdHVzX1BSX25ld1NhdGVsbGl0ZUFuZE1vZGVsVUM7Ci0JcnJscF9ubWUtPnNhdGVsbGl0ZUlEID0gZ3BzX2VwaF9zdi0+c3ZfaWQ7Ci0KLQlycmxwX2VwaCA9ICZycmxwX25tZS0+c2F0U3RhdHVzLmNob2ljZS5uZXdTYXRlbGxpdGVBbmRNb2RlbFVDOwotCi0JcnJscF9lcGgtPmVwaGVtQ29kZU9uTDIgICA9IGdwc19lcGhfc3YtPmNvZGVfb25fbDI7Ci0JcnJscF9lcGgtPmVwaGVtVVJBICAgICAgICA9IGdwc19lcGhfc3YtPnN2X3VyYTsKLQlycmxwX2VwaC0+ZXBoZW1TVmhlYWx0aCAgID0gZ3BzX2VwaF9zdi0+c3ZfaGVhbHRoOwotCXJybHBfZXBoLT5lcGhlbUlPREMgICAgICAgPSBncHNfZXBoX3N2LT5pb2RjOwotCXJybHBfZXBoLT5lcGhlbUwyUGZsYWcgICAgPSBncHNfZXBoX3N2LT5sMl9wX2ZsYWc7Ci0JcnJscF9lcGgtPmVwaGVtVGdkICAgICAgICA9IGdwc19lcGhfc3YtPnRfZ2Q7Ci0JcnJscF9lcGgtPmVwaGVtVG9jICAgICAgICA9IGdwc19lcGhfc3YtPnRfb2M7Ci0JcnJscF9lcGgtPmVwaGVtQUYyICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjI7Ci0JcnJscF9lcGgtPmVwaGVtQUYxICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjE7Ci0JcnJscF9lcGgtPmVwaGVtQUYwICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjA7Ci0JcnJscF9lcGgtPmVwaGVtQ3JzICAgICAgICA9IGdwc19lcGhfc3YtPmNfcnM7Ci0JcnJscF9lcGgtPmVwaGVtRGVsdGFOICAgICA9IGdwc19lcGhfc3YtPmRlbHRhX247Ci0JcnJscF9lcGgtPmVwaGVtTTAgICAgICAgICA9IGdwc19lcGhfc3YtPm1fMDsKLQlycmxwX2VwaC0+ZXBoZW1DdWMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y191YzsKLQlycmxwX2VwaC0+ZXBoZW1FICAgICAgICAgID0gZ3BzX2VwaF9zdi0+ZTsKLQlycmxwX2VwaC0+ZXBoZW1DdXMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y191czsKLQlycmxwX2VwaC0+ZXBoZW1BUG93ZXJIYWxmID0gZ3BzX2VwaF9zdi0+YV9wb3doYWxmOwotCXJybHBfZXBoLT5lcGhlbVRvZSAgICAgICAgPSBncHNfZXBoX3N2LT50X29lOwotCXJybHBfZXBoLT5lcGhlbUZpdEZsYWcgICAgPSBncHNfZXBoX3N2LT5maXRfZmxhZzsKLQlycmxwX2VwaC0+ZXBoZW1BT0RBICAgICAgID0gZ3BzX2VwaF9zdi0+YW9kbzsKLQlycmxwX2VwaC0+ZXBoZW1DaWMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19pYzsKLQlycmxwX2VwaC0+ZXBoZW1PbWVnYUEwICAgID0gZ3BzX2VwaF9zdi0+b21lZ2FfMDsKLQlycmxwX2VwaC0+ZXBoZW1DaXMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19pczsKLQlycmxwX2VwaC0+ZXBoZW1JMCAgICAgICAgID0gZ3BzX2VwaF9zdi0+aV8wOwotCXJybHBfZXBoLT5lcGhlbUNyYyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3JjOwotCXJybHBfZXBoLT5lcGhlbVcgICAgICAgICAgPSBncHNfZXBoX3N2LT53OwotCXJybHBfZXBoLT5lcGhlbU9tZWdhQURvdCAgPSBncHNfZXBoX3N2LT5vbWVnYV9kb3Q7Ci0JcnJscF9lcGgtPmVwaGVtSURvdCAgICAgICA9IGdwc19lcGhfc3YtPmlkb3Q7Ci0KLQlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMSA9IGdwc19lcGhfc3YtPl9yc3ZkMTsKLQlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMiA9IGdwc19lcGhfc3YtPl9yc3ZkMjsKLQlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMyA9IGdwc19lcGhfc3YtPl9yc3ZkMzsKLQlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkNCA9IGdwc19lcGhfc3YtPl9yc3ZkNDsKLX0KLQotc3RhdGljIHZvaWQKLV9ycmxwX2ZpbGxfYWxtYW5hY19lbGVtZW50KAotCXN0cnVjdCBBbG1hbmFjRWxlbWVudCAqcnJscF9hZSwKLQlzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3YgKmdwc19hbG1fc3YpCi17Ci0JcnJscF9hZS0+c2F0ZWxsaXRlSUQgPSBncHNfYWxtX3N2LT5zdl9pZDsKLQotCXJybHBfYWUtPmFsbWFuYWNFICAgICAgICAgID0gZ3BzX2FsbV9zdi0+ZTsKLQlycmxwX2FlLT5hbGFtYW5hY1RvYSAgICAgICA9IGdwc19hbG1fc3YtPnRfb2E7Ci0JcnJscF9hZS0+YWxtYW5hY0tzaWkgICAgICAgPSBncHNfYWxtX3N2LT5rc2lpOwotCXJybHBfYWUtPmFsbWFuYWNPbWVnYURvdCAgID0gZ3BzX2FsbV9zdi0+b21lZ2FfZG90OwotCXJybHBfYWUtPmFsbWFuYWNTVmhlYWx0aCAgID0gZ3BzX2FsbV9zdi0+c3ZfaGVhbHRoOwotCXJybHBfYWUtPmFsbWFuYWNBUG93ZXJIYWxmID0gZ3BzX2FsbV9zdi0+YV9wb3doYWxmOwotCXJybHBfYWUtPmFsbWFuYWNPbWVnYTAgICAgID0gZ3BzX2FsbV9zdi0+b21lZ2FfMDsKLQlycmxwX2FlLT5hbG1hbmFjVyAgICAgICAgICA9IGdwc19hbG1fc3YtPnc7Ci0JcnJscF9hZS0+YWxtYW5hY00wICAgICAgICAgPSBncHNfYWxtX3N2LT5tXzA7Ci0JcnJscF9hZS0+YWxtYW5hY0FGMCAgICAgICAgPSBncHNfYWxtX3N2LT5hX2YwOwotCXJybHBfYWUtPmFsbWFuYWNBRjEgICAgICAgID0gZ3BzX2FsbV9zdi0+YV9mMTsKLQotfQotCi1zdGF0aWMgdm9pZAotX3JybHBfZmlsbF9pb25vc3BoZXJpY19tb2RlbCgKLQlzdHJ1Y3QgSW9ub3NwaGVyaWNNb2RlbCAqcnJscF9pb25vLAotCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCAqZ3BzX2lvbm8pCi17Ci0JcnJscF9pb25vLT5hbGZhMCA9IGdwc19pb25vLT5hbHBoYV8wOwotCXJybHBfaW9uby0+YWxmYTEgPSBncHNfaW9uby0+YWxwaGFfMTsKLQlycmxwX2lvbm8tPmFsZmEyID0gZ3BzX2lvbm8tPmFscGhhXzI7Ci0JcnJscF9pb25vLT5hbGZhMyA9IGdwc19pb25vLT5hbHBoYV8zOwotCXJybHBfaW9uby0+YmV0YTAgPSBncHNfaW9uby0+YmV0YV8wOwotCXJybHBfaW9uby0+YmV0YTEgPSBncHNfaW9uby0+YmV0YV8xOwotCXJybHBfaW9uby0+YmV0YTIgPSBncHNfaW9uby0+YmV0YV8yOwotCXJybHBfaW9uby0+YmV0YTMgPSBncHNfaW9uby0+YmV0YV8zOwotfQotCi1zdGF0aWMgdm9pZAotX3JybHBfZmlsbF91dGNfbW9kZWwoCi0Jc3RydWN0IFVUQ01vZGVsICpycmxwX3V0YywKLQlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCAqZ3BzX3V0YykKLXsKLQlycmxwX3V0Yy0+dXRjQTEgICAgICAgID0gZ3BzX3V0Yy0+YTE7Ci0JcnJscF91dGMtPnV0Y0EwICAgICAgICA9IGdwc191dGMtPmEwOwotCXJybHBfdXRjLT51dGNUb3QgICAgICAgPSBncHNfdXRjLT50X290OwotCXJybHBfdXRjLT51dGNXTnQgICAgICAgPSBncHNfdXRjLT53bl90ICYgMHhmZjsKLQlycmxwX3V0Yy0+dXRjRGVsdGFUbHMgID0gZ3BzX3V0Yy0+ZGVsdGFfdF9sczsKLQlycmxwX3V0Yy0+dXRjV05sc2YgICAgID0gZ3BzX3V0Yy0+d25fbHNmICYgMHhmZjsKLQlycmxwX3V0Yy0+dXRjRE4gICAgICAgID0gZ3BzX3V0Yy0+ZG47Ci0JcnJscF91dGMtPnV0Y0RlbHRhVGxzZiA9IGdwc191dGMtPmRlbHRhX3RfbHNmOwotfQotCi0vKiB9fX0gKi8KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIFJSTFAgQXNzaXN0YW5jZSBQRFUgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCi0KLXN0cnVjdCBQRFUgKgotX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KGludCByZWZudW0sIHN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqKm9fZ3BzX2FkKQotewotCXN0cnVjdCBQRFUgKnBkdTsKLQlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKmdwc19hZDsKLQotCXBkdSA9IGNhbGxvYygxLCBzaXplb2YoKnBkdSkpOwotCWlmICghcGR1KQotCQlyZXR1cm4gTlVMTDsKLQotCWdwc19hZCA9IGNhbGxvYygxLCBzaXplb2YoKmdwc19hZCkpOwotCWlmICghZ3BzX2FkKSB7Ci0JCWZyZWUocGR1KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKG9fZ3BzX2FkKQotCQkqb19ncHNfYWQgPSBncHNfYWQ7Ci0KLQlwZHUtPnJlZmVyZW5jZU51bWJlciA9IHJlZm51bTsKLQlwZHUtPmNvbXBvbmVudC5wcmVzZW50ID0gUlJMUF9Db21wb25lbnRfUFJfYXNzaXN0YW5jZURhdGE7Ci0JcGR1LT5jb21wb25lbnQuY2hvaWNlLmFzc2lzdGFuY2VEYXRhLmdwc19Bc3Npc3REYXRhID0gZ3BzX2FkOwotCi0JcmV0dXJuIHBkdTsKLX0KLQotc3RhdGljIGludAotX3JybHBfYWRkX2lvbm9zcGhlcmljX21vZGVsKAotCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCi0Jc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQotewotCXN0cnVjdCBJb25vc3BoZXJpY01vZGVsICpycmxwX2lvbm87Ci0KLQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9JT05PU1BIRVJFKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlycmxwX2lvbm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX2lvbm8pKTsKLQlpZiAoIXJybHBfaW9ubykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIuaW9ub3NwaGVyaWNNb2RlbCA9IHJybHBfaW9ubzsKLQotCV9ycmxwX2ZpbGxfaW9ub3NwaGVyaWNfbW9kZWwocnJscF9pb25vLCAmZ3BzX2FkLT5pb25vc3BoZXJlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1fcnJscF9hZGRfdXRjX21vZGVsKAotCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCi0Jc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQotewotCXN0cnVjdCBVVENNb2RlbCAqcnJscF91dGM7Ci0KLQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9VVEMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJybHBfdXRjID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF91dGMpKTsKLQlpZiAoIXJybHBfdXRjKQotCQlyZXR1cm4gLUVOT01FTTsKLQlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci51dGNNb2RlbCA9IHJybHBfdXRjOwotCi0JX3JybHBfZmlsbF91dGNfbW9kZWwocnJscF91dGMsICZncHNfYWQtPnV0Yyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotX3JybHBfYWRkX3JlZmVyZW5jZV9sb2NhdGlvbigKLQlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAotCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCkKLXsKLQlzdHJ1Y3QgUmVmTG9jYXRpb24gKnJybHBfcmVmbG9jOwotCXVpbnQ4X3QgKmI7Ci0KLQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9SRUZQT1MpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJybHBfcmVmbG9jID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9yZWZsb2MpKTsKLQlpZiAoIXJybHBfcmVmbG9jKQotCQlyZXR1cm4gLUVOT01FTTsKLQlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5yZWZMb2NhdGlvbiA9IHJybHBfcmVmbG9jOwotCi0JYiA9IG1hbGxvYyg5KTsKLQotCWJbMF0gPSAweDgwOyAvKiBFbGxpcHNvaWQgUG9pbnQgd2l0aCBhbHRpdHVkZSAqLwotCV90c18yM18wMzJfc3RvcmVfbGF0aXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmxhdGl0dWRlLCAmYlsxXSk7Ci0JX3RzXzIzXzAzMl9zdG9yZV9sb25naXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmxvbmdpdHVkZSwgJmJbNF0pOwotCV90c18yM18wMzJfc3RvcmVfYWx0aXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmFsdGl0dWRlLCAmYls3XSk7Ci0KLQlycmxwX3JlZmxvYy0+dGhyZWVETG9jYXRpb24uYnVmID0gYjsKLQlycmxwX3JlZmxvYy0+dGhyZWVETG9jYXRpb24uc2l6ZSA9IDk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotX3JybHBfYWRkX3JlZmVyZW5jZV90aW1lKAotCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCi0Jc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQotewotCXN0cnVjdCBSZWZlcmVuY2VUaW1lICpycmxwX3JlZnRpbWU7Ci0KLQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9SRUZUSU1FKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlycmxwX3JlZnRpbWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3JlZnRpbWUpKTsKLQlpZiAoIXJybHBfcmVmdGltZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIucmVmZXJlbmNlVGltZSA9IHJybHBfcmVmdGltZTsKLQotCXJybHBfcmVmdGltZS0+Z3BzVGltZS5ncHNXZWVrICAgPSBncHNfYWQtPnJlZl90aW1lLnduICYgMHgzZmY7IC8qIDEwYiAqLwotCXJybHBfcmVmdGltZS0+Z3BzVGltZS5ncHNUT1cyM2IgPQotCQkoKGludClmbG9vcihncHNfYWQtPnJlZl90aW1lLnRvdyAvIDAuMDgpKSAmIDB4N2ZmZmZmOyAgLyogMjNiICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotX3JybHBfYWRkX2FsbWFuYWMoCi0Jc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKLQlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIGludCAqc3RhcnQsIGludCBjb3VudCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgQWxtYW5hYyAqcnJscF9hbG07Ci0Jc3RydWN0IGdwc19hbG1hbmFjICpncHNfYWxtID0gJmdwc19hZC0+YWxtYW5hYzsKLQotCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0FMTUFOQUMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJybHBfYWxtID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9hbG0pKTsKLQlpZiAoIXJybHBfYWxtKQotCQlyZXR1cm4gLUVOT01FTTsKLQlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5hbG1hbmFjID0gcnJscF9hbG07Ci0KLQlycmxwX2FsbS0+YWxhbWFuYWNXTmEgPSBncHNfYWxtLT53bmE7Ci0JaWYgKGNvdW50ID09IC0xKQotCQljb3VudCA9IGdwc19hbG0tPm5fc3YgLSAqc3RhcnQ7Ci0JZm9yIChpPSpzdGFydDsgKGk8KnN0YXJ0K2NvdW50KSAmJiAoaTxncHNfYWxtLT5uX3N2KTsgaSsrKSB7Ci0JCXN0cnVjdCBBbG1hbmFjRWxlbWVudCAqYWU7Ci0JCWFlID0gY2FsbG9jKDEsIHNpemVvZigqYWUpKTsKLQkJaWYgKCFhZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlfcnJscF9maWxsX2FsbWFuYWNfZWxlbWVudChhZSwgJmdwc19hbG0tPnN2c1tpXSk7Ci0JCUFTTl9TRVFVRU5DRV9BREQoJnJybHBfYWxtLT5hbG1hbmFjTGlzdC5saXN0LCBhZSk7Ci0JfQotCi0JKnN0YXJ0ID0gaTsKLQotCXJldHVybiBpIDwgZ3BzX2FsbS0+bl9zdjsKLX0KLQotc3RhdGljIGludAotX3JybHBfYWRkX2VwaGVtZXJpcygKLQlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAotCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgaW50ICpzdGFydCwgaW50IGNvdW50LCB1aW50NjRfdCBtYXNrKQotewotCWludCBpLCBqOwotCXN0cnVjdCBOYXZpZ2F0aW9uTW9kZWwgKnJybHBfbmF2OwotCXN0cnVjdCBncHNfZXBoZW1lcmlzICpncHNfZXBoID0gJmdwc19hZC0+ZXBoZW1lcmlzOwotCi0JaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfRVBIRU1FUklTKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlycmxwX25hdiA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfbmF2KSk7Ci0JaWYgKCFycmxwX25hdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIubmF2aWdhdGlvbk1vZGVsID0gcnJscF9uYXY7Ci0KLQlpZiAoY291bnQgPT0gLTEpCi0JCWNvdW50ID0gZ3BzX2VwaC0+bl9zdiAtICpzdGFydDsKLQlmb3IgKGk9KnN0YXJ0LGo9MDsgKGo8Y291bnQpICYmIChpPGdwc19lcGgtPm5fc3YpOyBpKyspIHsKLQkJaWYgKCEobWFzayAmICgxVUxMPDwoZ3BzX2VwaC0+c3ZzW2ldLnN2X2lkLTEpKSkpCi0JCQljb250aW51ZTsKLQkJc3RydWN0IE5hdk1vZGVsRWxlbWVudCAqbm1lOwotCQlubWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpubWUpKTsKLQkJaWYgKCFubWUpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJX3JybHBfZmlsbF9uYXZpZ2F0aW9uX21vZGVsX2VsZW1lbnQobm1lLCAmZ3BzX2VwaC0+c3ZzW2ldKTsKLQkJQVNOX1NFUVVFTkNFX0FERCgmcnJscF9uYXYtPm5hdk1vZGVsTGlzdC5saXN0LCBubWUpOwotCQlqKys7Ci0JfQotCi0JKnN0YXJ0ID0gaTsKLQotCXJldHVybiBpIDwgZ3BzX2VwaC0+bl9zdjsKLX0KLQotCi0jZGVmaW5lIE1BWF9QRFVTIDY0Ci0KLWludAotcnJscF9ncHNfYXNzaXN0X3BkdXMoCi0Jc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICpyZXEsCi0Jdm9pZCAqKm9fcGR1LCBpbnQgKm9fbGVuLCBpbnQgb19tYXhfcGR1cykKLXsKLQlzdHJ1Y3QgUERVICpsc3RfcGR1W01BWF9QRFVTXTsKLQlpbnQgbHN0X2NudCA9IDA7Ci0KLQlzdHJ1Y3QgUERVICpycmxwX3BkdSA9IE5VTEw7Ci0Jc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCA9IE5VTEw7Ci0JdWludDMyX3QgcmUgPSByZXEtPnJlcV9lbGVtczsKLQlpbnQgaSwgcnYgPSAwOwotCi0JLyogSW9ub3NwaGVyaWNNb2RlbCwgVVRDTW9kZWwsIFJlZkxvY2F0aW9uLCBSZWZlcmVuY2VUaW1lICovCi0JaWYgKHJlICYgKFJSTFBfQVJfSU9OT19NT0RFTCB8Ci0JICAgICAgICAgIFJSTFBfQVJfVVRDX01PREVMIHwKLQkgICAgICAgICAgUlJMUF9BUl9SRUZfVElNRSB8Ci0JICAgICAgICAgIFJSTFBfQVJfUkVGX0xPQykpCi0JewotCQlpbnQgcGR1X2hhc19kYXRhID0gMDsKLQotCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOwotCQlpZiAoIXJybHBfcGR1KSB7Ci0JCQlydiA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0KLQkJaWYgKHJlICYgUlJMUF9BUl9JT05PX01PREVMKQotCQkJaWYgKCFfcnJscF9hZGRfaW9ub3NwaGVyaWNfbW9kZWwocnJscF9ncHNfYWQsIGdwc19hZCkpCi0JCQkJcGR1X2hhc19kYXRhID0gMTsKLQotCQlpZiAocmUgJiBSUkxQX0FSX1VUQ19NT0RFTCkKLQkJCWlmICghX3JybHBfYWRkX3V0Y19tb2RlbChycmxwX2dwc19hZCwgZ3BzX2FkKSkKLQkJCQlwZHVfaGFzX2RhdGEgPSAxOwotCi0JCWlmIChyZSAmIFJSTFBfQVJfUkVGX1RJTUUpCi0JCQlpZiAoIV9ycmxwX2FkZF9yZWZlcmVuY2VfdGltZShycmxwX2dwc19hZCwgZ3BzX2FkKSkKLQkJCQlwZHVfaGFzX2RhdGEgPSAxOwotCi0JCWlmIChyZSAmIFJSTFBfQVJfUkVGX0xPQykKLQkJCWlmICghX3JybHBfYWRkX3JlZmVyZW5jZV9sb2NhdGlvbihycmxwX2dwc19hZCwgZ3BzX2FkKSkKLQkJCQlwZHVfaGFzX2RhdGEgPSAxOwotCi0JCWlmIChwZHVfaGFzX2RhdGEpIHsKLQkJCWxzdF9wZHVbbHN0X2NudCsrXSA9IHJybHBfcGR1OwotCQkJcnJscF9wZHUgPSBOVUxMOwotCQl9Ci0JfQotCi0JLyogQWxtYW5hYyAqLwotCWlmIChyZSAmIFJSTFBfQVJfQUxNQU5BQykgewotCQlpID0gMDsKLQkJZG8gewotCQkJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfQUxNQU5BQykpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmICghcnJscF9wZHUpIHsKLQkJCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOwotCQkJCWlmICghcnJscF9wZHUpIHsKLQkJCQkJcnYgPSAtRU5PTUVNOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCX0KLQotCQkJcnYgPSBfcnJscF9hZGRfYWxtYW5hYyhycmxwX2dwc19hZCwgZ3BzX2FkLCAmaSwgMTApOwotCQkJaWYgKHJ2IDwgMCkKLQkJCQlnb3RvIGVycm9yOwotCi0JCQlsc3RfcGR1W2xzdF9jbnQrK10gPSBycmxwX3BkdTsKLQkJCXJybHBfcGR1ID0gTlVMTDsKLQkJfSB3aGlsZSAocnYpOwotCX0KLQotCS8qIEVwaGVtZXJpcyAqLwotCWlmIChyZSAmIFJSTFBfQVJfRVBIRU1FUklTKSB7Ci0JCWkgPSAwOwotCQlkbyB7Ci0JCQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9FUEhFTUVSSVMpKQotCQkJCWJyZWFrOwotCi0JCQlpZiAoIXJybHBfcGR1KSB7Ci0JCQkJcnJscF9wZHUgPSBfcnJscF9jcmVhdGVfZ3BzX2Fzc2lzdF9wZHUoMSwgJnJybHBfZ3BzX2FkKTsKLQkJCQlpZiAoIXJybHBfcGR1KSB7Ci0JCQkJCXJ2ID0gLUVOT01FTTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJ2ID0gX3JybHBfYWRkX2VwaGVtZXJpcyhycmxwX2dwc19hZCwgZ3BzX2FkLCAmaSwgMiwgcmVxLT5lcGhfc3ZzKTsKLQotCQkJbHN0X3BkdVtsc3RfY250KytdID0gcnJscF9wZHU7Ci0JCQlycmxwX3BkdSA9IE5VTEw7Ci0KLQkJfSB3aGlsZSAocnYpOwotCX0KLQotCS8qIFNlcmlhbGl6ZSAmIFJlbGVhc2UgYWxsIFBEVXMgKi8KLQlmb3IgKGk9MDsgaTxsc3RfY250ICYmIGk8b19tYXhfcGR1czsgaSsrKSB7Ci0JCS8qIFBzZXVkbyBzZWdtZW50YXRpb24gZmxhZ3MgKi8KLQkJTW9yZUFzc0RhdGFUb0JlU2VudF90ICptYWQgPSBjYWxsb2MoMSwgc2l6ZW9mKCptYWQpKTsKLQkJKm1hZCA9IChpID09IChsc3RfY250LTEpKSA/Ci0JCQkJTW9yZUFzc0RhdGFUb0JlU2VudF9ub01vcmVNZXNzYWdlcyA6Ci0JCQkJTW9yZUFzc0RhdGFUb0JlU2VudF9tb3JlTWVzc2FnZXNPblRoZVdheTsKLQkJbHN0X3BkdVtpXS0+Y29tcG9uZW50LmNob2ljZS5hc3Npc3RhbmNlRGF0YS5tb3JlQXNzRGF0YVRvQmVTZW50ID0gbWFkOwotCi0JCS8qIFNlcmlhbGl6YXRpb24gKi8KLQkJLy8gYXNuX2ZwcmludChzdGRvdXQsICZhc25fREVGX1BEVSwgbHN0X3BkdVtpXSk7Ci0JCXJ2ID0gdXBlcl9lbmNvZGVfdG9fbmV3X2J1ZmZlcigmYXNuX0RFRl9QRFUsIE5VTEwsIGxzdF9wZHVbaV0sICZvX3BkdVtpXSk7Ci0JCWlmIChydiA8IDApCi0JCQlnb3RvIGVycm9yOwotCQlvX2xlbltpXSA9IHJ2OwotCX0KLQotCXJ2ID0gbHN0X2NudDsKLQotCS8qIFJlbGVhc2UgQVNOLjEgb2JqZWN0cyAqLwotZXJyb3I6Ci0JaWYgKHJybHBfcGR1KQotCQlhc25fREVGX1BEVS5mcmVlX3N0cnVjdCgmYXNuX0RFRl9QRFUsICh2b2lkKilycmxwX3BkdSwgMCk7Ci0KLQlmb3IgKGk9MDsgaTxsc3RfY250OyBpKyspCi0JCWFzbl9ERUZfUERVLmZyZWVfc3RydWN0KCZhc25fREVGX1BEVSwgbHN0X3BkdVtpXSwgMCk7Ci0KLQlyZXR1cm4gcnY7Ci19Ci0KLS8qIH19fSAqLwotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ycmxwLmggYi9ycmxwLWVwaGVtZXJpcy9ycmxwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTQzNDQuLjAwMDAwMDAKLS0tIGEvcnJscC1lcGhlbWVyaXMvcnJscC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIHJybHAuaAotICoKLSAqIFJSTFAgSGVhZGVyCi0gKgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0gKi8KLQotI2lmbmRlZiBfX1JSTFBfSF9fCi0jZGVmaW5lIF9fUlJMUF9IX18KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiZ3BzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiBPdXIgaW50ZXJuYWwgc2ltcGxpZmllZCBzdHJ1Y3R1cmUgZm9yIHJlcXVlc3RzICovCi0KLSNkZWZpbmUgUlJMUF9BUl9SRUZfTE9DCQkoMTw8MCkKLSNkZWZpbmUgUlJMUF9BUl9SRUZfVElNRQkoMTw8MSkKLSNkZWZpbmUgUlJMUF9BUl9VVENfTU9ERUwJKDE8PDIpCi0jZGVmaW5lIFJSTFBfQVJfSU9OT19NT0RFTAkoMTw8MykKLSNkZWZpbmUgUlJMUF9BUl9BTE1BTkFDCQkoMTw8NCkKLSNkZWZpbmUgUlJMUF9BUl9FUEhFTUVSSVMJKDE8PDUpCi0KLXN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgewotCXVpbnQzMl90IHJlcV9lbGVtczsKLQl1aW50NjRfdCBlcGhfc3ZzOwotfTsKLQotCi0vKiBNZXRob2RzICovCi1pbnQgcnJscF9kZWNvZGVfYXNzaXN0YW5jZV9yZXF1ZXN0KHN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgKmFyLAotCXZvaWQgKnJlcSwgaW50IHJlcV9sZW4pOwotCi1pbnQgcnJscF9ncHNfYXNzaXN0X3BkdXMoCi0Jc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICpyZXEsCi0Jdm9pZCAqKm9fcGR1LCBpbnQgKm9fbGVuLCBpbnQgb19tYXhfcGR1cyk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fUlJMUF9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmMgYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkMGY3MC4uMDAwMDAwMAotLS0gYS9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogdWJ4LXBhcnNlLmMKLSAqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBwYXJzaW5nIGNvZGUgY29udmVydGluZyBVQlggbWVzc2FnZXMgdG8gR1BTIGFzc2lzdAotICogZGF0YQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiZ3BzLmgiCi0jaW5jbHVkZSAidWJ4LmgiCi0jaW5jbHVkZSAidWJ4LXBhcnNlLmgiCi0KLQotLyogSGVscGVycyAqLwotCi1zdGF0aWMgaW50Ci1mbG9hdF90b19maXhlZHBvaW50KGZsb2F0IGYsIGludCBzZikKLXsKLQlpZiAoc2YgPCAwKSB7Ci0JCXdoaWxlIChzZisrIDwgMCkKLQkJCWYgKj0gMi4wZjsKLQl9IGVsc2UgewotCQl3aGlsZSAoc2YtLSA+IDApCi0JCQlmICo9IDAuNWY7Ci0JfQotCi0JcmV0dXJuIChpbnQpZjsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWRvdWJsZV90b19maXhlZHBvaW50KGRvdWJsZSBkLCBpbnQgc2YpCi17Ci0JaWYgKHNmIDwgMCkgewotCQl3aGlsZSAoc2YrKyA8IDApCi0JCQlkICo9IDIuMDsKLQl9IGVsc2UgewotCQl3aGlsZSAoc2YtLSA+IDApCi0JCQlkICo9IDAuNTsKLQl9Ci0KLQlyZXR1cm4gKGludClkOwotfQotCi0KLS8qIFVCWCBtZXNzYWdlIHBhcnNpbmcgdG8gZmlsbCBncHMgYXNzaXN0IGRhdGEgKi8KLQotc3RhdGljIHZvaWQKLV91YnhfbXNnX3BhcnNlX25hdl9wb3NsbGgoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQotewotCXN0cnVjdCB1YnhfbmF2X3Bvc2xsaCAqbmF2X3Bvc2xsaCA9IHBsOwotCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOwotCi0JLy9wcmludGYoIlsuXSBOQVZfUE9TTExIXG4iKTsKLQotCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9SRUZQT1M7Ci0KLQlncHMtPnJlZl9wb3MubGF0aXR1ZGUgID0gKGRvdWJsZSkobmF2X3Bvc2xsaC0+bGF0KSAqIDFlLTc7Ci0JZ3BzLT5yZWZfcG9zLmxvbmdpdHVkZSA9IChkb3VibGUpKG5hdl9wb3NsbGgtPmxvbikgKiAxZS03OwotCWdwcy0+cmVmX3Bvcy5hbHRpdHVkZSAgPSAoZG91YmxlKShuYXZfcG9zbGxoLT5oZWlnaHQpICogMWUtMzsKLX0KLQotc3RhdGljIHZvaWQKLV91YnhfbXNnX3BhcnNlX2FpZF9pbmkoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQotewotCXN0cnVjdCB1YnhfYWlkX2luaSAqYWlkX2luaSA9IHBsOwotCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOwotCi0JLy9wcmludGYoIlsuXSBBSURfSU5JXG4iKTsKLQotCS8qIEV4dHJhY3QgaW5mbyBmb3IgIlJlZmVyZW5jZSBUaW1lIiAqLwotCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9SRUZUSU1FOwotCi0JZ3BzLT5yZWZfdGltZS53biA9IGFpZF9pbmktPnduOwotCWdwcy0+cmVmX3RpbWUudG93ID0gKGRvdWJsZSlhaWRfaW5pLT50b3cgKiAxZS0zOwotCi0JLy8gRklYTUU6IFdlIGNvdWxkIGV4dHJhY3QgcmVmIHBvc2l0aW9uIGFzIHdlbGwgYnV0IHdlIG5lZWQgaXQgaW4KLQkvLyAgICAgICAgV0dTODQgZ2VvZGV0aWMgY29vcmRpbmF0ZXMgYW5kIGl0J3MgcHJvdmlkZWQgYXMgZWNlZiwgc28KLQkvLyAgICAgICAgd2UgbmVlZCBhIGxvdCBvZiBtYXRoIC4uLgotfQotCi1zdGF0aWMgdm9pZAotX3VieF9tc2dfcGFyc2VfYWlkX2h1aShzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCi17Ci0Jc3RydWN0IHVieF9haWRfaHVpICphaWRfaHVpID0gcGw7Ci0Jc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7Ci0KLQkvL3ByaW50ZigiWy5dIEFJRF9IVUlcbiIpOwotCi0JaWYgKGFpZF9odWktPmZsYWdzICYgMHgyKSB7IC8qIFVUQyBwYXJhbWV0ZXJzIHZhbGlkICovCi0JCXN0cnVjdCBncHNfdXRjX21vZGVsICp1dGMgPSAmZ3BzLT51dGM7Ci0KLQkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX1VUQzsKLQotCQl1dGMtPmEwICAgICAgICAgID0gZG91YmxlX3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+dXRjX2EwLCAtMzApOwotCQl1dGMtPmExICAgICAgICAgID0gZG91YmxlX3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+dXRjX2ExLCAtNTApOwotCQl1dGMtPmRlbHRhX3RfbHMgID0gYWlkX2h1aS0+dXRjX2xzOwotCQl1dGMtPnRfb3QgICAgICAgID0gYWlkX2h1aS0+dXRjX3RvdCA+PiAxMjsKLQkJdXRjLT53bl90ICAgICAgICA9IGFpZF9odWktPnV0Y193bnQ7Ci0JCXV0Yy0+d25fbHNmICAgICAgPSBhaWRfaHVpLT51dGNfd25mOwotCQl1dGMtPmRuICAgICAgICAgID0gYWlkX2h1aS0+dXRjX2RuOwotCQl1dGMtPmRlbHRhX3RfbHNmID0gYWlkX2h1aS0+dXRjX2xzZjsKLQl9Ci0KLQlpZiAoYWlkX2h1aS0+ZmxhZ3MgJiAweDA0KSB7IC8qIEtsb2J1Y2hhciBwYXJhbWV0ZXJzIHZhbGlkICovCi0JCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCAqaW9ubyA9ICZncHMtPmlvbm9zcGhlcmU7Ci0KLQkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0lPTk9TUEhFUkU7Ci0KLQkJaW9uby0+YWxwaGFfMCA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMCwgLTMwKTsKLQkJaW9uby0+YWxwaGFfMSA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMSwgLTI3KTsKLQkJaW9uby0+YWxwaGFfMiA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMiwgLTI0KTsKLQkJaW9uby0+YWxwaGFfMyA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMywgLTI0KTsKLQkJaW9uby0+YmV0YV8wID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IwLCAxMSk7Ci0JCWlvbm8tPmJldGFfMSA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMSwgMTQpOwotCQlpb25vLT5iZXRhXzIgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYjIsIDE2KTsKLQkJaW9uby0+YmV0YV8zID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IzLCAxNik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotX3VieF9tc2dfcGFyc2VfYWlkX2FsbShzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCi17Ci0Jc3RydWN0IHVieF9haWRfYWxtICphaWRfYWxtID0gcGw7Ci0Jc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7Ci0KLQkvL3ByaW50ZigiWy5dIEFJRF9BTE0gJWQgLSAlZFxuIiwgYWlkX2FsbS0+c3ZfaWQsIGFpZF9hbG0tPmdwc193ZWVrKTsKLQotCWlmIChhaWRfYWxtLT5ncHNfd2VlaykgewotCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfQUxNQU5BQzsKLQkJZ3BzLT5hbG1hbmFjLnduYSA9IGFpZF9hbG0tPmdwc193ZWVrICYgMHhmZjsKLQkJZ3BzX3VucGFja19zZjQ1X2FsbWFuYWMoYWlkX2FsbS0+YWxtX3dvcmRzLCAmZ3BzLT5hbG1hbmFjLnN2c1tncHMtPmFsbWFuYWMubl9zdisrXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotX3VieF9tc2dfcGFyc2VfYWlkX2VwaChzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCi17Ci0Jc3RydWN0IHVieF9haWRfZXBoICphaWRfZXBoID0gcGw7Ci0Jc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7Ci0KLQkvL3ByaW50ZigiWy5dIEFJRF9FUEggJWQgLSAlc1xuIiwgYWlkX2VwaC0+c3ZfaWQsIGFpZF9lcGgtPnByZXNlbnQgPyAicHJlc2VudCIgOiAibm90IHByZXNlbnQiKTsKLQotCWlmIChhaWRfZXBoLT5wcmVzZW50KSB7Ci0JCWludCBpID0gZ3BzLT5lcGhlbWVyaXMubl9zdisrOwotCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfRVBIRU1FUklTOwotCQlncHMtPmVwaGVtZXJpcy5zdnNbaV0uc3ZfaWQgPSBhaWRfZXBoLT5zdl9pZDsKLQkJZ3BzX3VucGFja19zZjEyMyhhaWRfZXBoLT5lcGhfd29yZHMsICZncHMtPmVwaGVtZXJpcy5zdnNbaV0pOwotCX0KLX0KLQotCi0vKiBEaXNwYXRjaCB0YWJsZSAqLwotc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSB1YnhfcGFyc2VfZHRbXSA9IHsKLQlVQlhfRElTUEFUQ0goTkFWLCBQT1NMTEgsIF91YnhfbXNnX3BhcnNlX25hdl9wb3NsbGgpLAotCVVCWF9ESVNQQVRDSChBSUQsIElOSSwgX3VieF9tc2dfcGFyc2VfYWlkX2luaSksCi0JVUJYX0RJU1BBVENIKEFJRCwgSFVJLCBfdWJ4X21zZ19wYXJzZV9haWRfaHVpKSwKLQlVQlhfRElTUEFUQ0goQUlELCBBTE0sIF91YnhfbXNnX3BhcnNlX2FpZF9hbG0pLAotCVVCWF9ESVNQQVRDSChBSUQsIEVQSCwgX3VieF9tc2dfcGFyc2VfYWlkX2VwaCksCi19OwotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaCBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE0NzVkLi4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIHVieC1wYXJzZS5oCi0gKgotICogSGVhZGVyIGZvciBwYXJzaW5nIGNvZGUgY29udmVydGluZyBVQlggbWVzc2FnZXMgdG8gR1BTIGFzc2lzdCBkYXRhCi0gKgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0gKi8KLQotI2lmbmRlZiBfX1VCWF9QQVJTRV9IX18KLSNkZWZpbmUgX19VQlhfUEFSU0VfSF9fCi0KLQotI2luY2x1ZGUgImdwcy5oIgotI2luY2x1ZGUgInVieC5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiBEaXNwYXRjaCB0YWJsZSAqLwotZXh0ZXJuIHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgdWJ4X3BhcnNlX2R0W107Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fVUJYX1BBUlNFX0hfXyAqLwotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YnguYyBiL3JybHAtZXBoZW1lcmlzL3VieC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2RkMWYwLi4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL3VieC5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIHVieC5jCi0gKgotICogSW1wbGVtZW50YXRpb24gb2YgZ2VuZXJpYyBVQlggaGVscGVycwotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAidWJ4LmgiCi0KLQotc3RhdGljIHZvaWQKLXVieF9jaGVja3N1bSh1aW50OF90ICpkYXRhLCBpbnQgbGVuLCB1aW50OF90ICpja3N1bSkKLXsKLQlpbnQgaTsKLQl1aW50OF90IGNrMCA9IDAsIGNrMSA9IDA7Ci0JZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKLQkJY2swICs9IGRhdGFbaV07Ci0JCWNrMSArPSBjazA7Ci0JfQotCWNrc3VtWzBdID0gY2swOwotCWNrc3VtWzFdID0gY2sxOwotfQotCi0KLXN0YXRpYyB1YnhfbXNnX2hhbmRsZXJfdAotdWJ4X2ZpbmRfaGFuZGxlcihzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5ICpkdCwgdWludDhfdCBtc2dfY2xhc3MsIHVpbnQ4X3QgbXNnX2lkKQotewotCXdoaWxlIChkdC0+aGFuZGxlcikgewotCQlpZiAoKGR0LT5tc2dfY2xhc3MgPT0gbXNnX2NsYXNzKSAmJiAoZHQtPm1zZ19pZCA9PSBtc2dfaWQpKQotCQkJcmV0dXJuIGR0LT5oYW5kbGVyOwotCQlkdCsrOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi1pbnQKLXVieF9tc2dfZGlzcGF0Y2goc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSAqZHQsCi0gICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgaW50IGxlbiwgdm9pZCAqdXNlcmRhdGEpCi17Ci0Jc3RydWN0IHVieF9oZHIgKmhkciA9IG1zZzsKLQl1aW50OF90IGNrc3VtWzJdLCAqY2tzdW1fcHRyOwotCXVieF9tc2dfaGFuZGxlcl90IGg7Ci0KLQlpZiAoKGhkci0+c3luY1swXSAhPSBVQlhfU1lOQzApIHx8IChoZHItPnN5bmNbMV0gIT0gVUJYX1NZTkMxKSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlshXSBJbnZhbGlkIHN5bmMgYnl0ZXNcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JdWJ4X2NoZWNrc3VtKG1zZyArIDIsIHNpemVvZihzdHJ1Y3QgdWJ4X2hkcikgKyBoZHItPnBheWxvYWRfbGVuIC0gMiwgY2tzdW0pOwotCWNrc3VtX3B0ciA9IG1zZyArIChzaXplb2Yoc3RydWN0IHVieF9oZHIpICsgaGRyLT5wYXlsb2FkX2xlbik7Ci0JaWYgKChja3N1bV9wdHJbMF0gIT0gY2tzdW1bMF0pIHx8IChja3N1bV9wdHJbMV0gIT0gY2tzdW1bMV0pKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiWyFdIEludmFsaWQgY2hlY2tzdW1cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaCA9IHVieF9maW5kX2hhbmRsZXIoZHQsIGhkci0+bXNnX2NsYXNzLCBoZHItPm1zZ19pZCk7Ci0JaWYgKGgpCi0JCWgoaGRyLCBtc2cgKyBzaXplb2Yoc3RydWN0IHVieF9oZHIpLCBoZHItPnBheWxvYWRfbGVuLCB1c2VyZGF0YSk7Ci0KLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSArIGhkci0+cGF5bG9hZF9sZW4gKyAyOwotfQotCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YnguaCBiL3JybHAtZXBoZW1lcmlzL3VieC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjY0Mzg2Li4wMDAwMDAwCi0tLSBhL3JybHAtZXBoZW1lcmlzL3VieC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qCi0gKiB1YnguaAotICoKLSAqIEhlYWRlciBmb3IgVUJYIHJlbGF0ZWQgc3R1ZmYKLSAqCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqLwotCi0jaWZuZGVmIF9fVUJYX0hfXwotI2RlZmluZSBfX1VCWF9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8qIENvbnN0YW50cyB1c2VkIGluIFVCWCAqLwotCi0JLyogU3luYyBieXRlcyAodHdvIGZpcnN0IGJ5dGVzIG9mIGVhY2ggbWVzc2FnZSkgKi8KLSNkZWZpbmUgVUJYX1NZTkMwCQkweGI1Ci0jZGVmaW5lIFVCWF9TWU5DMQkJMHg2MgotCi0JLyogVUJYIG1lc3NhZ2VzIGNsYXNzZXMgKi8KLSNkZWZpbmUgVUJYX0NMQVNTX05BVgkJMHgwMQotI2RlZmluZSBVQlhfQ0xBU1NfUlhNCQkweDAyCi0jZGVmaW5lIFVCWF9DTEFTU19JTkYJCTB4MDQKLSNkZWZpbmUgVUJYX0NMQVNTX0FDSwkJMHgwNQotI2RlZmluZSBVQlhfQ0xBU1NfQ0ZHCQkweDA2Ci0jZGVmaW5lIFVCWF9DTEFTU19VUEQJCTB4MDkKLSNkZWZpbmUgVUJYX0NMQVNTX01PTgkJMHgwYQotI2RlZmluZSBVQlhfQ0xBU1NfQUlECQkweDBiCi0jZGVmaW5lIFVCWF9DTEFTU19USU0JCTB4MGQKLQotCS8qIFVCWCBtZXNzYWdlcyB0eXBlIElEIChieSBjbGFzcykgKi8KLSNkZWZpbmUgVUJYX05BVl9QT1NFQ0VGCQkweDAxCi0jZGVmaW5lIFVCWF9OQVZfUE9TTExICQkweDAyCi0jZGVmaW5lIFVCWF9OQVZfU1RBVFVTCQkweDAzCi0jZGVmaW5lIFVCWF9OQVZfRE9QCQkweDA0Ci0jZGVmaW5lIFVCWF9OQVZfU09MCQkweDA2Ci0jZGVmaW5lIFVCWF9OQVZfUE9TVVRNCQkweDA4Ci0jZGVmaW5lIFVCWF9OQVZfVkVMRUNFRgkJMHgxMQotI2RlZmluZSBVQlhfTkFWX1ZFTE5FRAkJMHgxMgotI2RlZmluZSBVQlhfTkFWX1RJTUVHUFMJCTB4MjAKLSNkZWZpbmUgVUJYX05BVl9USU1FVVRDCQkweDIxCi0jZGVmaW5lIFVCWF9OQVZfQ0xPQ0sJCTB4MjIKLSNkZWZpbmUgVUJYX05BVl9TVklORk8JCTB4MzAKLSNkZWZpbmUgVUJYX05BVl9ER1BTCQkweDMxCi0jZGVmaW5lIFVCWF9OQVZfU0JBUwkJMHgzMgotI2RlZmluZSBVQlhfTkFWX0VLRlNUQVRVUwkweDQwCi0KLSNkZWZpbmUgVUJYX1JYTV9SQVcJCTB4MTAKLSNkZWZpbmUgVUJYX1JYTV9TRlJCCQkweDExCi0jZGVmaW5lIFVCWF9SWE1fU1ZTSQkJMHgyMAotI2RlZmluZSBVQlhfUlhNX1NWU0lfR1BTCTB4MjAKLSNkZWZpbmUgVUJYX1JYTV9BTE0JCTB4MzAKLSNkZWZpbmUgVUJYX1JYTV9FUEgJCTB4MzEKLSNkZWZpbmUgVUJYX1JYTV9QT1NSRVEJCTB4NDAKLQotI2RlZmluZSBVQlhfSU5GX0VSUk9SCQkweDAwCi0jZGVmaW5lIFVCWF9JTkZfV0FSTklORwkJMHgwMQotI2RlZmluZSBVQlhfSU5GX05PVElDRQkJMHgwMgotI2RlZmluZSBVQlhfSU5GX1RFU1QJCTB4MDMKLSNkZWZpbmUgVUJYX0lORl9ERUJVRwkJMHgwNAotI2RlZmluZSBVQlhfSU5GX1VTRVIJCTB4MDcKLQotI2RlZmluZSBVQlhfQUNLX05BSwkJMHgwMAotI2RlZmluZSBVQlhfQUNLX0FDSwkJMHgwMQotCi0jZGVmaW5lIFVCWF9DRkdfUFJUCQkweDAwCi0jZGVmaW5lIFVCWF9DRkdfVVNCCQkweDFiCi0jZGVmaW5lIFVCWF9DRkdfTVNHCQkweDAxCi0jZGVmaW5lIFVCWF9DRkdfTk1FQQkJMHgxNwotI2RlZmluZSBVQlhfQ0ZHX1JBVEUJCTB4MDgKLSNkZWZpbmUgVUJYX0NGR19DRkcJCTB4MDkKLSNkZWZpbmUgVUJYX0NGR19UUAkJMHgwNwotI2RlZmluZSBVQlhfQ0ZHX05BVjIJCTB4MWEKLSNkZWZpbmUgVUJYX0NGR19EQVQJCTB4MDYKLSNkZWZpbmUgVUJYX0NGR19JTkYJCTB4MDIKLSNkZWZpbmUgVUJYX0NGR19SU1QJCTB4MDQKLSNkZWZpbmUgVUJYX0NGR19SWE0JCTB4MTEKLSNkZWZpbmUgVUJYX0NGR19BTlQJCTB4MTMKLSNkZWZpbmUgVUJYX0NGR19GWE4JCTB4MGUKLSNkZWZpbmUgVUJYX0NGR19TQkFTCQkweDE2Ci0jZGVmaW5lIFVCWF9DRkdfTElDCQkweDgwCi0jZGVmaW5lIFVCWF9DRkdfVE0JCTB4MTAKLSNkZWZpbmUgVUJYX0NGR19UTTIJCTB4MTkKLSNkZWZpbmUgVUJYX0NGR19UTU9ERQkJMHgxZAotI2RlZmluZSBVQlhfQ0ZHX0VLRgkJMHgxMgotCi0jZGVmaW5lIFVCWF9VUERfRE9XTkwJCTB4MDEKLSNkZWZpbmUgVUJYX1VQRF9VUExPQUQJCTB4MDIKLSNkZWZpbmUgVUJYX1VQRF9FWEVDCQkweDAzCi0jZGVmaW5lIFVCWF9VUERfTUVNQ1BZCQkweDA0Ci0KLSNkZWZpbmUgVUJYX01PTl9TQ0hECQkweDAxCi0jZGVmaW5lIFVCWF9NT05fSU8JCTB4MDIKLSNkZWZpbmUgVUJYX01PTl9JUEMJCTB4MDMKLSNkZWZpbmUgVUJYX01PTl9WRVIJCTB4MDQKLSNkZWZpbmUgVUJYX01PTl9FWENFUFQJCTB4MDUKLSNkZWZpbmUgVUJYX01PTl9NU0dQUAkJMHgwNgotI2RlZmluZSBVQlhfTU9OX1JYQlVGCQkweDA3Ci0jZGVmaW5lIFVCWF9NT05fVFhCVUYJCTB4MDgKLSNkZWZpbmUgVUJYX01PTl9IVwkJMHgwOQotI2RlZmluZSBVQlhfTU9OX1VTQgkJMHgwYQotCi0jZGVmaW5lIFVCWF9BSURfUkVRCQkweDAwCi0jZGVmaW5lIFVCWF9BSURfSU5JCQkweDAxCi0jZGVmaW5lIFVCWF9BSURfSFVJCQkweDAyCi0jZGVmaW5lIFVCWF9BSURfREFUQQkJMHgxMAotI2RlZmluZSBVQlhfQUlEX0FMTQkJMHgzMAotI2RlZmluZSBVQlhfQUlEX0VQSAkJMHgzMQotCi0jZGVmaW5lIFVCWF9USU1fVFAJCTB4MDEKLSNkZWZpbmUgVUJYX1RJTV9UTQkJMHgwMgotI2RlZmluZSBVQlhfVElNX1RNMgkJMHgwMwotI2RlZmluZSBVQlhfVElNX1NWSU4JCTB4MDQKLQotCi0vKiBIZWFkZXIgKi8KLXN0cnVjdCB1YnhfaGRyIHsKLSAgICAgICAgdWludDhfdCAgc3luY1syXTsKLSAgICAgICAgdWludDhfdCAgbXNnX2NsYXNzOwotICAgICAgICB1aW50OF90ICBtc2dfaWQ7Ci0gICAgICAgIHVpbnQxNl90IHBheWxvYWRfbGVuOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotCi0vKiBQYXlsb2FkIGZvcm1hdHMgKHNvbWUgb2YgdGhlbSkgKi8KLXN0cnVjdCB1YnhfbmF2X3Bvc2xsaCB7Ci0JdWludDMyX3QgaXRvdzsKLQlpbnQzMl90ICBsb247CS8qIHNjYWxpbmcgMWUtNyAqLwotCWludDMyX3QgIGxhdDsJLyogc2NhbGluZyAxZS03ICovCi0JaW50MzJfdCAgaGVpZ2h0Oy8qIG1tICovCi0JaW50MzJfdCAgaHNsOwkvKiBtbSAqLwotCXVpbnQzMl90IGhhY2M7CS8qIG1tICovCi0JdWludDMyX3QgdmFjYzsJLyogbW0gKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCB1YnhfYWlkX2luaSB7Ci0JaW50MzJfdCAgeDsKLQlpbnQzMl90ICB5OwotCWludDMyX3QgIHo7Ci0JdWludDMyX3QgcG9zYWNjOwotCXVpbnQxNl90IHRtX2NmZzsKLQl1aW50MTZfdCB3bjsKLQl1aW50MzJfdCB0b3c7Ci0JaW50MzJfdCAgdG93X25zOwotCXVpbnQzMl90IHRhY2NfbXM7Ci0JdWludDMyX3QgdGFjY19uczsKLQlpbnQzMl90ICBjbGtkOwotCXVpbnQzMl90IGNsa2RhY2M7Ci0JdWludDMyX3QgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgdWJ4X2FpZF9odWkgewotCXVpbnQzMl90IGhlYWx0aDsKLQlkb3VibGUgICB1dGNfYTE7Ci0JZG91YmxlICAgdXRjX2EwOwotCWludDMyX3QgIHV0Y190b3Q7Ci0JaW50MTZfdCAgdXRjX3dudDsKLQlpbnQxNl90ICB1dGNfbHM7Ci0JaW50MTZfdCAgdXRjX3duZjsKLQlpbnQxNl90ICB1dGNfZG47Ci0JaW50MTZfdCAgdXRjX2xzZjsKLQlpbnQxNl90ICB1dGNfc3BhcmU7Ci0JZmxvYXQgICAga2xvYl9hMDsKLQlmbG9hdCAgICBrbG9iX2ExOwotCWZsb2F0ICAgIGtsb2JfYTI7Ci0JZmxvYXQgICAga2xvYl9hMzsKLQlmbG9hdCAgICBrbG9iX2IwOwotCWZsb2F0ICAgIGtsb2JfYjE7Ci0JZmxvYXQgICAga2xvYl9iMjsKLQlmbG9hdCAgICBrbG9iX2IzOwotCXVpbnQzMl90IGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHVieF9haWRfYWxtIHsKLQl1aW50MzJfdCBzdl9pZDsKLQl1aW50MzJfdCBncHNfd2VlazsKLQl1aW50MzJfdCBhbG1fd29yZHNbOF07CS8qIFByZXNlbnQgb25seSBpZiAnZ3BzX3dlZWsnICE9IDAgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCB1YnhfYWlkX2VwaCB7Ci0JdWludDMyX3Qgc3ZfaWQ7Ci0JdWludDMyX3QgcHJlc2VudDsKLQl1aW50MzJfdCBlcGhfd29yZHNbMjRdOwkvKiBQcmVzZW50IG9ubHkgaWYgJ3ByZXNlbnQnICE9IDAgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLQotLyogTWVzc2FnZSBoYW5kbGVyICovCi10eXBlZGVmIHZvaWQgKCp1YnhfbXNnX2hhbmRsZXJfdCkoCi0Jc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGF5bG9hZCwgaW50IHBheWxvYWRfbGVuLCB2b2lkICp1c2VyZGF0YSk7Ci0KLXN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgewotCXVpbnQ4X3QgbXNnX2NsYXNzOwotCXVpbnQ4X3QgbXNnX2lkOwotCXVieF9tc2dfaGFuZGxlcl90IGhhbmRsZXI7Ci19OwotCi0jZGVmaW5lIFVCWF9ESVNQQVRDSChrbHMsaWQsaGRsKSB7CQlcCi0JLm1zZ19jbGFzcyA9IFVCWF9DTEFTU18gIyMga2xzICwJXAotCS5tc2dfaWQgPSBVQlhfICMjIGtscyAjIyBfICMjIGlkLAlcCi0JLmhhbmRsZXIgPSAoaGRsKSwJCQlcCi19Ci0KLQotLyogTWV0aG9kcyAqLwotaW50IHVieF9tc2dfZGlzcGF0Y2goc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSAqZHQsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIGludCBsZW4sIHZvaWQgKnVzZXJkYXRhKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19VQlhfSF9fICovCi0KZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaCBiL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaAppbmRleCA5ZjA2YjRkLi5iOTI0OGRjIDEwMDY0NAotLS0gYS93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2gKKysrIGIvd2lyZXNoYXJrL2FiaXNfb21sLnBhdGNoCkBAIC0xLDggKzEsMjEgQEAKLUluZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KLSsrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgotQEAgLTQ3NCw2ICs0NzQsNyBAQAorRnJvbSBiNjU5MjgwZmY2NDUzNTRiYjU1NTI5YjA1MTE0NDE5YjlmMGVmZDZmIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorRGF0ZTogTW9uLCAxOSBBcHIgMjAxMCAxMzoyMzo1MSArMDgwMAorU3ViamVjdDogW1BBVENIIDEvMl0gQWRkIHRoZSBBYmlzIE9NTCBwYXRjaC4KKworLS0tCisgZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbiAgICAgICB8ICAgIDEgKworIGVwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMgfCAxNDA1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIGVwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmggfCAgODAwICsrKysrKysrKysrKysrKysrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDIyMDYgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYworIGNyZWF0ZSBtb2RlIDEwMDY0NCBlcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCisKK2RpZmYgLS1naXQgYS9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uIGIvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgoraW5kZXggYjE4ZjQyZS4uMTE1ZmEwOSAxMDA2NDQKKy0tLSBhL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KKysrKyBiL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KK0BAIC00ODUsNiArNDg1LDcgQEAgRElTU0VDVE9SX1NSQyA9IFwKICAJcGFja2V0LWdzbV9hX2dtLmMJCVwKICAJcGFja2V0LWdzbV9hX3JwLmMJCVwKICAJcGFja2V0LWdzbV9hX3JyLmMJXApAQCAtMTIsMTAgKzI1LDEwIEBACiAgCXBhY2tldC1nc21fYnNzbWFwX2xlLmMJXAogZGlmZiAtLWdpdCBhL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jCiBuZXcgZmlsZSBtb2RlIDEwMDY0NAotaW5kZXggMDAwMDAwMC4uMmRlOWRjYQoraW5kZXggMDAwMDAwMC4uMGYxNmYxOAogLS0tIC9kZXYvbnVsbAogKysrIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYwotQEAgLTAsMCArMSwxMzgyIEBACitAQCAtMCwwICsxLDE0MDUgQEAKICsvKiBwYWNrZXQtYWJpc19vbWwuYwogKyAqIFJvdXRpbmVzIGZvciBwYWNrZXQgZGlzc2VjdGlvbiBvZiBHU00gQS1iaXMgb3ZlciBJUCAoM0dQUCBUUyAxMi4yMSkKICsgKiBDb3B5cmlnaHQgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgpAQCAtNTcsNiArNzAsOCBAQAogKyNpbmNsdWRlICJwYWNrZXQtZ3NtX2FiaXNfb21sLmgiCiArI2luY2x1ZGUgInBhY2tldC1nc21fYV9jb21tb24uaCIKICsKKysjaW5jbHVkZSA8c3RkaW8uaD4KKysKICsvKiBpbml0aWFsaXplIHRoZSBwcm90b2NvbCBhbmQgcmVnaXN0ZXJlZCBmaWVsZHMgKi8KICtzdGF0aWMgaW50IHByb3RvX2FiaXNfb21sID0gLTE7CiArCkBAIC0xMzIsNyArMTQ3LDcgQEAKICtzdGF0aWMgaW50IGV0dF9vbWxfZm9tX2F0dCA9IC0xOwogKwogKy8qIERlY29kZSB0aGluZ3MgYXMgbmFub0JUUyB0cmFjZXMgKi8KLStzdGF0aWMgZ2Jvb2xlYW4gZ2xvYmFsX29tbF91c2VfbmFub19idHMgPSBGQUxTRTsKKytzdGF0aWMgZ2Jvb2xlYW4gZ2xvYmFsX29tbF91c2VfbmFub19idHMgPSBUUlVFOwogKwogK3N0YXRpYyBwcm90b190cmVlICp0b3BfdHJlZTsKICsKQEAgLTU5OCw2ICs2MTMsMjIgQEAKICsJeyBOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUiwJIkZyZXF1ZW5jeSBFcnJvciIgfSwKICt9OwogKworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZiAqCisrZmluZF90bHZfdGFnKGd1aW50OCB0YWcpCisreworKwljb25zdCBzdHJ1Y3QgdGx2X2RlZiAqc3BlY2lmaWM7CisrCisrCWlmIChnbG9iYWxfb21sX3VzZV9uYW5vX2J0cykKKysJCXNwZWNpZmljID0gJm5tX2F0dF90bHZkZWZfaXBhLmRlZlt0YWddOworKwllbHNlCisrCQlzcGVjaWZpYyA9ICZubV9hdHRfdGx2ZGV2X2JzMTEuZGVmW3RhZ107CisrCisrCWlmIChzcGVjaWZpYy0+dHlwZSAhPSBUTFZfVFlQRV9VTktOT1dOKQorKwkJcmV0dXJuIHNwZWNpZmljOworKworKwlyZXR1cm4gJm5tX2F0dF90bHZkZWZfYmFzZS5kZWZbdGFnXTsKKyt9CisrCiArLyogUGFyc2UgdGhlIGlwLmFjY2VzcyBzcGVjaWZpYyBCQ0NIIEluZm9ybWF0aW9uIElFIGVtYmVkZGVkIGludG8gdGhlIFRlc3QKICsgKiBSZXBvcnQgSUUgKi8KICtzdGF0aWMgZ2ludApAQCAtNjgyLDcgKzcxMyw5IEBACiAraXBhY2NfdHJfaWVfY2hhbl91c2FnZSh0dmJ1ZmZfdCAqdHZiLCBwcm90b190cmVlICphdHRfdHJlZSwgaW50IG9mZnNldCkKICt7CiArCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgewotKwkJZ3VpbnQxNiByZXN1bHQgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCWd1aW50MTYgcmVzdWx0OworKworKwkJcmVzdWx0ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CiArCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9hcmZjbiwKICsJCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCByZXN1bHQpOwogKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfcnhsZXYsCkBAIC03MDIsMTEgKzczNSwxMyBAQAogKwkJCSAgICAxLCBGQUxTRSk7CiArCiArCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgewotKwkJZ3VpbnQ4IGllID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOwotKwkJZ3VpbnQxNiBsZW4gPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzEpOworKwkJZ3VpbnQ4IGllOworKwkJZ3VpbnQxNiBsZW47CiArCQlwcm90b19pdGVtICp0aTsKICsJCXByb3RvX3RyZWUgKmF0dF90cmVlOwogKworKwkJaWUgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQlsZW4gPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzEpOwogKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX29tbF9pcGFfdHJlc19hdHRyX3RhZywgdHZiLAogKwkJCQkJIG9mZnNldCsrLCAxLCBGQUxTRSk7CiArCQlhdHRfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWxfZm9tX2F0dCk7CkBAIC03NDksNyArNzg0LDcgQEAKICsJCXR2YnVmZl90ICpzdWJfdHZiOwogKwogKwkJdGFnID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOwotKwkJdGRlZiA9ICZubV9hdHRfdGx2ZGVmLmRlZlt0YWddOworKwkJdGRlZiA9IGZpbmRfdGx2X3RhZyh0YWcpOwogKwogKwkJc3dpdGNoICh0ZGVmLT50eXBlKSB7CiArCQljYXNlIFRMVl9UWVBFX0ZJWEVEOgpAQCAtNzc4LDYgKzgxMyw3IEBACiArCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSkgPDwgOCB8CiArCQkJCQkJdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMik7CiArCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1VOS05PV046IC8qIGZhbGwgdGhyb3VnaCAqLwogKwkJZGVmYXVsdDoKICsJCQlobGVuID0gbGVuX2xlbiA9IGxlbiA9IDA7CiArCQkJRElTU0VDVE9SX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwpAQCAtMTM5OCwxMSArMTQzNCwxMiBAQAogKwlhYmlzX29tbF9oYW5kbGUgPSBjcmVhdGVfZGlzc2VjdG9yX2hhbmRsZShkaXNzZWN0X2FiaXNfb21sLCBwcm90b19hYmlzX29tbCk7CiArCWRpc3NlY3Rvcl9hZGQoImxhcGQuZ3NtLnNhcGkiLCBMQVBEX0dTTV9TQVBJX09NX1BST0MsIGFiaXNfb21sX2hhbmRsZSk7CiArfQotSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkaWZmIC0tZ2l0IGEvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaCBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmgKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iZGM0MTRkCiAtLS0gL2Rldi9udWxsCi0rKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmgKLUBAIC0wLDAgKzEsNzg2IEBACisrKysgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCitAQCAtMCwwICsxLDgwMCBAQAogKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQogKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCiArCkBAIC0yMDEzLDYgKzIwNTAsNyBAQAogKwogKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGx2LmggKi8KICtlbnVtIHRsdl90eXBlIHsKKysJVExWX1RZUEVfVU5LTk9XTiwKICsJVExWX1RZUEVfRklYRUQsCiArCVRMVl9UWVBFX1QsCiArCVRMVl9UWVBFX1RWLApAQCAtMjA2MSw3ICsyMDk5LDcgQEAKICt9OwogKwogKy8qIEZyb20gb3BlbmJzYy9zcmMvYWJpc19ubS5jICovCi0rc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmID0geworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZl9iYXNlID0gewogKwkuZGVmID0gewogKwkJW05NX0FUVF9BQklTX0NIQU5ORUxdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKICsJCVtOTV9BVFRfQUREX0lORk9dID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKQEAgLTIwODQsNyArMjEyMiw2IEBACiArCQlbTk1fQVRUX0dTTV9USU1FXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCiArCQlbTk1fQVRUX0hTTl0gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKICsJCVtOTV9BVFRfSFdfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCi0rCQkvL0JTMTEgW05NX0FUVF9IV19ERVNDXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCiArCQlbTk1fQVRUX0hXX0RFU0NdID0JCXsgVExWX1RZUEVfVExWLCAwIH0sCiArCQlbTk1fQVRUX0lOVEFWRV9QQVJBTV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAogKwkJW05NX0FUVF9JTlRFUkZfQk9VTkRdID0JCXsgVExWX1RZUEVfRklYRUQsIDYgfSwKQEAgLTIxMjgsOCArMjE2NSwxNSBAQAogKwkJW05NX0FUVF9PVVRTVF9BTEFSTV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAogKwkJW05NX0FUVF9GSUxFX0RBVEFdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKICsJCVtOTV9BVFRfTUVBU19SRVNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKLSsjaWYgMAotKwkJLyogQlMxMSBzcGVjaWZpY3MgKi8KKysKKysJfSwKKyt9OworKworKy8qIEJTMTEgc3BlY2lmaWNzICovCisrc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGV2X2JzMTEgPSB7CisrCS5kZWYgPSB7CisrCQkvKiBhIGRpZmZlcmVuY2UuLiAqLworKwkJW05NX0FUVF9IV19ERVNDXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCiArCQlbTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKICsJCVtOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAogKwkJW05NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCkBAIC0yMTU0LDggKzIxOTgsMTIgQEAKICsJCVtOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKICsJCVtOTV9BVFRfQlMxMV9DQ0xLX1RZUEVdID0JeyBUTFZfVFlQRV9UViwgMCB9LAogKwkJWzB4OTVdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCi0rI2VuZGlmCi0rCQkvKiBpcC5hY2Nlc3Mgc3BlY2lmaWNzICovCisrCX0sCisrfTsKKysKKysvKiBpcC5hY2Nlc3Mgc3BlY2lmaWNzICovCisrc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmX2lwYSA9IHsKKysJLmRlZiA9IHsKICsJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCiArCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKICsJCVtOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKQEAgLTIxODUsOCArMjIzMywxMyBAQAogKwkJW05NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FU10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCiArCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfMl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCiArCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfM10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1BBR0lOR19DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAogKwkJW05NX0FUVF9JUEFDQ19GSUxFX0RBVEFdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19DR0ldID0gCQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCiArCX0sCiArfTsKICsKICsjZW5kaWYgLyogX05NX0ggKi8KKy0tIAorMS43LjAuMQorCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvcnNsLWlwYWNjZXNzLnBhdGNoIGIvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaAppbmRleCAzNmMwOWM1Li4yOTIyMGI4IDEwMDY0NAotLS0gYS93aXJlc2hhcmsvcnNsLWlwYWNjZXNzLnBhdGNoCisrKyBiL3dpcmVzaGFyay9yc2wtaXBhY2Nlc3MucGF0Y2gKQEAgLTEsMTYgKzEsMjUgQEAKLUluZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMJMjAwOS0xMC0yMSAyMzowMzo0MS4wMDAwMDAwMDAgKzAyMDAKLSsrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYwkyMDA5LTEwLTIyIDEwOjAyOjUxLjAwMDAwMDAwMCArMDIwMAorRnJvbSA4ZjM1ZDYyMzY0MWRiYmE5MGU2MTg2NjA0YzExZTg5MmJmNTE1ZWNjIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorRGF0ZTogTW9uLCAxOSBBcHIgMjAxMCAxMzozMjo1OCArMDgwMAorU3ViamVjdDogW1BBVENIIDIvMl0gUlNMIHBhdGNoCisKKy0tLQorIGVwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMgfCAgNTIyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQorIDEgZmlsZXMgY2hhbmdlZCwgNTE1IGluc2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworaW5kZXggYjEwYTY3MS4uYTQ1NWNmMyAxMDA2NDQKKy0tLSBhL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKKysrKyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKIEBAIC0yLDYgKzIsNyBAQAogICAqIFJvdXRpbmVzIGZvciBSYWRpbyBTaWduYWxsaW5nIExpbmsgKFJTTCkgZGlzc2VjdGlvbi4KICAgKgogICAqIENvcHlyaWdodCAyMDA3LCBBbmRlcnMgQnJvbWFuIDxhbmRlcnMuYnJvbWFuQGVyaWNzc29uLmNvbT4KICsgKiBDb3B5cmlnaHQgMjAwOSwgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KICAgKgotICAqICRJZDogcGFja2V0LXJzbC5jIDI5OTQ0IDIwMDktMDktMTYgMTM6Mzk6MzdaIG1vcnJpc3MgJAorICAqICRJZCQKICAgKgotQEAgLTQ0LDYgKzQ1LDggQEAKK0BAIC00Miw2ICs0Myw4IEBACiAgI2luY2x1ZGUgPGVwYW4vbGFwZF9zYXBpLmg+CiAgCiAgI2luY2x1ZGUgInBhY2tldC1nc21fYV9jb21tb24uaCIKQEAgLTE5LDcgKzI4LDcgQEAKICAKICAvKiBJbml0aWFsaXplIHRoZSBwcm90b2NvbCBhbmQgcmVnaXN0ZXJlZCBmaWVsZHMgKi8KICBzdGF0aWMgaW50IHByb3RvX3JzbAkJPSAtMTsKLUBAIC0xMTcsNiArMTIwLDI0IEBACitAQCAtMTE1LDYgKzExOCwyNCBAQCBzdGF0aWMgaW50IGhmX3JzbF9lbWxwcF9wcmlvCQk9IC0xOwogIHN0YXRpYyBpbnQgaGZfcnNsX3J0ZAkJCQk9IC0xOwogIHN0YXRpYyBpbnQgaGZfcnNsX2RlbGF5X2luZAkJCT0gLTE7CiAgc3RhdGljIGludCBoZl9yc2xfdGZvCQkJCT0gLTE7CkBAIC00NCw3ICs1Myw3IEBACiAgCiAgLyogSW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLwogIHN0YXRpYyBpbnQgZXR0X3JzbCA9IC0xOwotQEAgLTE3NCw2ICsxOTUsMTUgQEAKK0BAIC0xNzIsNiArMTkzLDE1IEBAIHN0YXRpYyBpbnQgZXR0X2llX2NhdXNlID0gLTE7CiAgc3RhdGljIGludCBldHRfaWVfbWVhc19yZXNfbm8gPSAtMTsKICBzdGF0aWMgaW50IGV0dF9pZV9tZXNzYWdlX2lkID0gLTE7CiAgc3RhdGljIGludCBldHRfaWVfc3lzX2luZm9fdHlwZSA9IC0xOwpAQCAtNjAsNyArNjksNyBAQAogIAogIHByb3RvX3RyZWUgKnRvcF90cmVlOwogIGRpc3NlY3Rvcl9oYW5kbGVfdCBnc21fYV9jY2NoX2hhbmRsZTsKLUBAIC0yMDksOCArMjM5LDExIEBACitAQCAtMjA3LDggKzIzNywxMSBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfZGlzY192YWxzW10gPSB7CiAgCXsgIDB4MDYsCQkiQ29tbW9uIENoYW5uZWwgTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKICAJeyAgMHgwOCwJCSJUUlggTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKICAJeyAgMHgxNiwJCSJMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlcyIgfSwKQEAgLTcyLDcgKzgxLDcgQEAKICAvKgogICAqIDkuMiBNRVNTQUdFIFRZUEUKICAgKi8KLUBAIC0yNzcsNiArMzEwLDQ5IEBACitAQCAtMjc1LDYgKzMwOCw0OSBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfZGlzY192YWxzW10gPSB7CiAgCS8qIAkwIDEgLSAtIC0gLSAtIC0gTG9jYXRpb24gU2VydmljZXMgbWVzc2FnZXM6ICovCiAgI2RlZmluZSBSU0xfTVNHX0xPQ19JTkYJCQkJCTY1CS8qIDguNy4xICovCiAgCkBAIC05MCwxNiArOTksMTYgQEAKICsjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfQUNLIDB4NGMKICsjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfTkFDSyAweDRkCiArCi0rI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5ECQkweDcwCi0rI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX0FDSwkweDcxCi0rI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX05BQ0sJMHg3MgotKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVAkweDczCi0rI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX0FDSwkweDc0Ci0rI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX05BQ0sJMHg3NQotKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQ19JTkQJMHg3NgotKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQwkJMHg3NwotKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQ19BQ0sJMHg3OAotKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQ19OQUNLCTB4NzkKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1gJCTB4NzAKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfQUNLCTB4NzEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfTkFDSwkweDcyCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYCQkweDczCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYX0FDSwkweDc0CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYX05BQ0sJMHg3NQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWF9JTkQJMHg3NgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWAkJMHg3NworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWF9BQ0sJMHg3OAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWF9OQUNLCTB4NzkKICsKICsjZGVmaW5lIFJTTF9JRV9JUEFDX1NSVFBfQ09ORklHCQkweGUwCiArI2RlZmluZSBSU0xfSUVfSVBBQ19QUk9YWV9VRFAJCTB4ZTEKQEAgLTEyMiw3ICsxMzEsNyBAQAogIAogIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ190eXBlX3ZhbHNbXSA9IHsKICAJICAvKiAJMCAwIDAgMCAtIC0gLSAtIFJhZGlvIExpbmsgTGF5ZXIgTWFuYWdlbWVudCBtZXNzYWdlczogKi8KLUBAIC0zMzksNiArNDE1LDI2IEBACitAQCAtMzM3LDYgKzQxMywyNiBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfdHlwZV92YWxzW10gPSB7CiAgCXsgIDB4M2YsCSJURk8gTU9EaWZpY2F0aW9uIFJFUXVlc3QiIH0sCQkJCQkvKiA4LjQuMzEgKi8KICAJLyogCTAgMSAtIC0gLSAtIC0gLSBMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlczogKi8KICAJeyAgMHg0MSwJIkxvY2F0aW9uIEluZm9ybWF0aW9uIiB9LAkJCQkJCS8qIDguNy4xICovCkBAIC0xNDksNyArMTU4LDcgQEAKICAJeyAwLAkJTlVMTCB9CiAgfTsKICAKLUBAIC0zNzIsMTAgKzQ2OCwxMCBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfdHlwZV92YWxzW10gPSB7CitAQCAtMzcwLDEwICs0NjYsMTAgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX3R5cGVfdmFsc1tdID0gewogICNkZWZpbmUgUlNMX0lFX01FU1NBR0VfSUQJCTI4CiAgCiAgI2RlZmluZSBSU0xfSUVfU1lTX0lORk9fVFlQRQkzMApAQCAtMTY0LDcgKzE3Myw3IEBACiAgI2RlZmluZSBSU0xfSUVfRlVMTF9JTU1fQVNTX0lORgkJCTM1CiAgI2RlZmluZSBSU0xfSUVfU01TQ0JfSU5GCQkJCTM2CiAgI2RlZmluZSBSU0xfSUVfRlVMTF9NU19USU1JTkdfT0ZGU0VUCTM3Ci1AQCAtNDc4LDYgKzU3NCwyNCBAQAorQEAgLTQ3Niw2ICs1NzIsMjQgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaWVfdHlwZV92YWxzW10gPSB7CiAgCQkJTm90IHVzZWQKICAKICAJKi8KQEAgLTE4OSw3ICsxOTgsNyBAQAogIAl7IDAsCQkJTlVMTCB9CiAgfTsKICAKLUBAIC01MTQsNiArNjI4LDk2IEBACitAQCAtNTEyLDYgKzYyNiw5NiBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9jaF9ub19DYml0c192YWxzW10gPSB7CiAgCXsgMCwJCQlOVUxMIH0KICB9OwogIApAQCAtMjg2LDcgKzI5NSw3IEBACiAgLyogOS4zLjEgQ2hhbm5lbCBudW1iZXIJCQk5LjMuMQlNIFRWIDIgKi8KICBzdGF0aWMgaW50CiAgZGlzc2VjdF9yc2xfaWVfY2hfbm8odHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvIF9VXywgcHJvdG9fdHJlZSAqdHJlZSwgaW50IG9mZnNldCwgZ2Jvb2xlYW4gaXNfbWFuZGF0b3J5KQotQEAgLTIwNDQsNyArMjI0OCw2IEBACitAQCAtMjA0Miw3ICsyMjQ2LDYgQEAgZGlzc2VjdF9yc2xfaWVfZXJyX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsIGludAogIAlwcm90b19pdGVtX3NldF9sZW4odGksIGxlbmd0aCsyKTsKICAKICAJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfaWVfbGVuZ3RoLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOwpAQCAtMjk0LDcgKzMwMyw3IEBACiAgCiAgCS8qIFJlY2VpdmVkIE1lc3NhZ2UgKi8KICAJb2Zmc2V0ID0gZGlzc2N0X3JzbF9tc2codHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0KTsKLUBAIC0yOTA5LDEyICszMTEyLDE4MyBAQAorQEAgLTI5MDcsMTIgKzMxMTAsMTg0IEBAIGRpc3NlY3RfcnNsX2llX3Rmb190cmFuc3BfY29udCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8gX1VfLCBwcm90b190cmVlCiAgfQogIAogIHN0YXRpYyBpbnQKQEAgLTMxMCwxNiArMzE5LDE2IEBACiArCiArI2lmIDAKICsJc3dpdGNoIChtc2dfdHlwZSkgewotKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkQ6Ci0rCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORF9BQ0s6Ci0rCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORF9OQUNLOgotKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NPTk5FQ1Q6Ci0rCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVF9BQ0s6Ci0rCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVF9OQUNLOgotKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RJU0NfSU5EOgotKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RJU0M6Ci0rCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQ19BQ0s6Ci0rCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQ19OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1g6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ1JDWF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ1JDWF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX01EQ1g6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfTURDWF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfTURDWF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1hfSU5EOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1g6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRExDWF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRExDWF9OQUNLOgogKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUOgogKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSzoKICsJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLOgpAQCAtNDQ5LDcgKzQ1OCw3IEBACiArCX0KICsKICsJc3dpdGNoIChtc2dfdHlwZSkgewotKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkRfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfQUNLOgogKwkJLyogTm90aWZ5IHRoZSBSVFAgYW5kIFJUQ1AgZGlzc2VjdG9ycyBhYm91dCBhIG5ldyBSVFAgc3RyZWFtICovCiArCQlzcmNfYWRkci50eXBlID0gQVRfSVB2NDsKICsJCXNyY19hZGRyLmxlbiA9IDQ7CkBAIC00ODAsNyArNDg5LDcgQEAKICAJb2Zmc2V0Kys7CiAgCiAgCXN3aXRjaCAobXNnX3R5cGUpewotQEAgLTM0ODIsNiArMzg1NiwxOCBAQAorQEAgLTM0ODAsNiArMzg1NSwxOCBAQCBkaXNzY3RfcnNsX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQpCiAgCQkvKiBMTFAgQVBEVSA5LjMuNTggTSBMViAyLU4gKi8KICAJCW9mZnNldCA9IGRpc3NlY3RfcnNsX2llX2xscF9hcGR1KHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgVFJVRSk7CiAgCQlicmVhazsKQEAgLTQ5OSw3ICs1MDgsNyBAQAogIAlkZWZhdWx0OgogIAkJYnJlYWs7CiAgCX0KLUBAIC0zNDg5LDYgKzM4NzUsNDAgQEAKK0BAIC0zNDg3LDYgKzM4NzQsNDAgQEAgZGlzc2N0X3JzbF9tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0KQogIAlyZXR1cm4gb2Zmc2V0OwogIAogIH0KQEAgLTU0MCw3ICs1NDksNyBAQAogIHN0YXRpYyB2b2lkCiAgZGlzc2VjdF9yc2wodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlKQogIHsKLUBAIC0zNTE2LDcgKzM5MzYsNiBAQAorQEAgLTM1MTQsNyArMzkzNSw2IEBAIGRpc3NlY3RfcnNsKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKICAJCS8qIDkuMSBNZXNzYWdlIGRpc2NyaW1pbmF0b3IgKi8KICAJCXByb3RvX3RyZWVfYWRkX2l0ZW0ocnNsX3RyZWUsIGhmX3JzbF9tc2dfZHNjLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOwogIAkJcHJvdG9fdHJlZV9hZGRfaXRlbShyc2xfdHJlZSwgaGZfcnNsX1RfYml0LCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOwpAQCAtNTQ4LDcgKzU1Nyw3IEBACiAgCiAgCQlvZmZzZXQgPSBkaXNzY3RfcnNsX21zZyh0dmIsIHBpbmZvLCByc2xfdHJlZSwgb2Zmc2V0KTsKICAKLUBAIC0zODg2LDYgKzQzMDUsODYgQEAKK0BAIC0zODg0LDYgKzQzMDQsODYgQEAgdm9pZCBwcm90b19yZWdpc3Rlcl9yc2wodm9pZCkKICAJCQlGVF9VSU5UOCwgQkFTRV9ERUMsIFZBTFMocnNsX2VtbHBwX3ByaW9fdmFscyksIDB4MDMsCiAgCQkJTlVMTCwgSEZJTEwgfQogIAkJfSwKQEAgLTYzNSw3ICs2NDQsNyBAQAogIAl9OwogIAlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CiAgCQkmZXR0X3JzbCwKLUBAIC0zOTQzLDYgKzQ0NDIsMTQgQEAKK0BAIC0zOTQxLDYgKzQ0NDEsMTQgQEAgdm9pZCBwcm90b19yZWdpc3Rlcl9yc2wodm9pZCkKICAJCSZldHRfaWVfbWVhc19yZXNfbm8sCiAgCQkmZXR0X2llX21lc3NhZ2VfaWQsCiAgCQkmZXR0X2llX3N5c19pbmZvX3R5cGUsCkBAIC02NTAsMyArNjU5LDYgQEAKICAJfTsKICAKICAJLyogUmVnaXN0ZXIgdGhlIHByb3RvY29sIG5hbWUgYW5kIGRlc2NyaXB0aW9uICovCistLSAKKzEuNy4wLjEKKwo=